diff --git a/.browserslistrc b/.browserslistrc index f5543dc88..16cce2fc9 100644 --- a/.browserslistrc +++ b/.browserslistrc @@ -6,7 +6,17 @@ last 2 versions > 0.5% Firefox ESR not dead +not and_qq 14.9 +not and_uc 15.5 +not android 142 not kaios 2.5 +not kaios 3.0-3.1 not op_mini all +not op_mob 80 +not opera 122 +not opera 121 +not samsung 28 +not samsung 29 +not samsung 27 # For IE 9-11 support, please uncomment the next line and adjust as needed # IE 9-11 diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d52582a2d..181ca043b 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -27,7 +27,7 @@ jobs: # no support for lts as of now with github actions. # issue link : https://github.com/actions/setup-node/issues/26 # lts/gallium node v19.7.0 (npm v9.5.0) - node-version: '22.9.0' + node-version: '22.12.0' - name: Remove node_modules run: rm -rf node_modules diff --git a/.htmlhintrc b/.htmlhintrc index 007af1f90..764020221 100644 --- a/.htmlhintrc +++ b/.htmlhintrc @@ -3,7 +3,7 @@ "attr-lowercase": false, "attr-value-double-quotes": true, "tag-pair": true, - "spec-char-escape": true, + "spec-char-escape": false, "id-unique": true, "src-not-empty": true, "attr-no-duplication": true, diff --git a/angular.json b/angular.json index e46f8a7dd..2f4082a47 100644 --- a/angular.json +++ b/angular.json @@ -231,6 +231,30 @@ }, "@angular-eslint/schematics:library": { "setParserOptionsProject": true + }, + "@schematics/angular:component": { + "type": "component" + }, + "@schematics/angular:directive": { + "type": "directive" + }, + "@schematics/angular:service": { + "type": "service" + }, + "@schematics/angular:guard": { + "typeSeparator": "." + }, + "@schematics/angular:interceptor": { + "typeSeparator": "." + }, + "@schematics/angular:module": { + "typeSeparator": "." + }, + "@schematics/angular:pipe": { + "typeSeparator": "." + }, + "@schematics/angular:resolver": { + "typeSeparator": "." } } } diff --git a/eslint.config.js b/eslint.config.js index 92742d671..706b3d7fc 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -7,7 +7,10 @@ const tsParser = require('@typescript-eslint/parser'); module.exports = [ { - ignores: ['projects/**/*'] + ignores: [ + 'projects/**/*', + 'dist/**/*' + ] }, // TS files configuration diff --git a/package-lock.json b/package-lock.json index f135664cb..ebde9e34f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,26 +10,25 @@ "hasInstallScript": true, "license": "MPL-2.0", "dependencies": { - "@angular-devkit/schematics": "19.2.15", - "@angular/animations": "19.2.14", - "@angular/cdk": "^19.2.18", - "@angular/common": "19.2.14", - "@angular/compiler": "19.2.14", - "@angular/core": "19.2.14", - "@angular/forms": "19.2.14", - "@angular/localize": "19.2.14", - "@angular/material": "^19.2.18", - "@angular/platform-browser": "19.2.14", - "@angular/platform-browser-dynamic": "19.2.14", - "@angular/router": "19.2.14", - "@fortawesome/angular-fontawesome": "^1.0.0", + "@angular/animations": "20.3.15", + "@angular/cdk": "^20.2.14", + "@angular/common": "20.3.15", + "@angular/compiler": "20.3.15", + "@angular/core": "20.3.15", + "@angular/forms": "20.3.15", + "@angular/localize": "20.3.15", + "@angular/material": "^20.2.14", + "@angular/platform-browser": "20.3.15", + "@angular/platform-browser-dynamic": "20.3.15", + "@angular/router": "20.3.15", + "@fortawesome/angular-fontawesome": "^3.0.0", "@fortawesome/fontawesome-free": "^6.7.2", - "@fortawesome/fontawesome-svg-core": "6.2.1", - "@fortawesome/free-brands-svg-icons": "6.7.2", - "@fortawesome/free-solid-svg-icons": "6.2.1", + "@fortawesome/fontawesome-svg-core": "^6.7.2", + "@fortawesome/free-brands-svg-icons": "^6.7.2", + "@fortawesome/free-solid-svg-icons": "^6.7.2", "@ngx-translate/core": "^16.0.4", "@ngx-translate/http-loader": "^16.0.1", - "@swimlane/ngx-graph": "^10.0.0", + "@swimlane/ngx-graph": "^11.0.0", "@tailwindcss/forms": "^0.5.4", "@tinymce/tinymce-angular": "^9.1.1", "chart.js": "^4.5.1", @@ -41,24 +40,24 @@ "lightgallery": "^2.9.0", "lodash": "4.17.21", "moment": "^2.29.4", - "ngx-mat-select-search": "^7.0.10", - "rxjs": "7.8.1", + "ngx-mat-select-search": "^8.0.2", + "rxjs": "^7.8.2", "tinymce": "^8.2.2", - "tslib": "^2.0.0", + "tslib": "^2.8.1", "vkbeautify": "^0.99.3", "zone.js": "0.15.1" }, "devDependencies": { - "@angular-builders/jest": "^19.0.1", - "@angular-eslint/builder": "^19.7.0", - "@angular-eslint/eslint-plugin": "^19.7.0", - "@angular-eslint/eslint-plugin-template": "^19.7.0", - "@angular-eslint/schematics": "^19.7.0", - "@angular-eslint/template-parser": "^19.7.0", - "@angular/build": "^19.2.15", - "@angular/cli": "19.2.15", - "@angular/compiler-cli": "19.2.14", - "@angular/language-service": "19.2.14", + "@angular-builders/jest": "^20.0.0", + "@angular-eslint/builder": "^20.7.0", + "@angular-eslint/eslint-plugin": "^20.7.0", + "@angular-eslint/eslint-plugin-template": "^20.7.0", + "@angular-eslint/schematics": "^20.7.0", + "@angular-eslint/template-parser": "^20.7.0", + "@angular/build": "^20.3.13", + "@angular/cli": "20.3.13", + "@angular/compiler-cli": "20.3.15", + "@angular/language-service": "20.3.15", "@cypress/schematic": "^2.5.2", "@types/d3-dispatch": "^3.0.1", "@types/d3-drag": "^3.0.1", @@ -70,11 +69,11 @@ "@types/lodash": "4.14.132", "@types/node": "22.15.29", "@types/vkbeautify": "^0.99.2", - "@typescript-eslint/eslint-plugin": "^8.26.1", - "@typescript-eslint/parser": "^8.26.1", + "@typescript-eslint/eslint-plugin": "^8.48.1", + "@typescript-eslint/parser": "^8.48.1", "@vendure/ngx-translate-extract": "^9.4.0", "cypress": "^13.17.0", - "eslint": "^8.57.0", + "eslint": "^9.39.1", "git-describe": "^4.1.1", "htmlhint": "1.1.4", "https-proxy-agent": "7.0.2", @@ -82,10 +81,10 @@ "jasmine-core": "^4.2.0", "jasmine-spec-reporter": "~5.0.0", "jest": "^29.7.0", - "jest-preset-angular": "^14.6.0", + "jest-preset-angular": "^14.6.2", "lint-staged": "^15.2.10", - "prettier": "^3.3.3", - "prettier-plugin-multiline-arrays": "^3.0.6", + "prettier": "^3.6.2", + "prettier-plugin-multiline-arrays": "^4.0.5", "puppeteer": "^24.4.0", "stylelint": "^16.10.0", "stylelint-config-recommended-scss": "^14.1.0", @@ -93,13 +92,222 @@ "stylelint-scss": "^6.8.1", "tailwindcss": "^3.3.3", "ts-node": "^10.9.2", - "typescript": "^5.4.5" + "typescript": "^5.9.3" }, "engines": { - "node": ">= 16.15.1", + "node": ">= 20.19.0", "npm": ">= 8.11.0" } }, + "node_modules/@algolia/abtesting": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.1.0.tgz", + "integrity": "sha512-sEyWjw28a/9iluA37KLGu8vjxEIlb60uxznfTUmXImy7H5NvbpSO6yYgmgH5KiD7j+zTUUihiST0jEP12IoXow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-abtesting": { + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.35.0.tgz", + "integrity": "sha512-uUdHxbfHdoppDVflCHMxRlj49/IllPwwQ2cQ8DLC4LXr3kY96AHBpW0dMyi6ygkn2MtFCc6BxXCzr668ZRhLBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-analytics": { + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.35.0.tgz", + "integrity": "sha512-SunAgwa9CamLcRCPnPHx1V2uxdQwJGqb1crYrRWktWUdld0+B2KyakNEeVn5lln4VyeNtW17Ia7V7qBWyM/Skw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-common": { + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.35.0.tgz", + "integrity": "sha512-ipE0IuvHu/bg7TjT2s+187kz/E3h5ssfTtjpg1LbWMgxlgiaZIgTTbyynM7NfpSJSKsgQvCQxWjGUO51WSCu7w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-insights": { + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.35.0.tgz", + "integrity": "sha512-UNbCXcBpqtzUucxExwTSfAe8gknAJ485NfPN6o1ziHm6nnxx97piIbcBQ3edw823Tej2Wxu1C0xBY06KgeZ7gA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-personalization": { + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.35.0.tgz", + "integrity": "sha512-/KWjttZ6UCStt4QnWoDAJ12cKlQ+fkpMtyPmBgSS2WThJQdSV/4UWcqCUqGH7YLbwlj3JjNirCu3Y7uRTClxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-query-suggestions": { + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.35.0.tgz", + "integrity": "sha512-8oCuJCFf/71IYyvQQC+iu4kgViTODbXDk3m7yMctEncRSRV+u2RtDVlpGGfPlJQOrAY7OONwJlSHkmbbm2Kp/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-search": { + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.35.0.tgz", + "integrity": "sha512-FfmdHTrXhIduWyyuko1YTcGLuicVbhUyRjO3HbXE4aP655yKZgdTIfMhZ/V5VY9bHuxv/fGEh3Od1Lvv2ODNTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/ingestion": { + "version": "1.35.0", + "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.35.0.tgz", + "integrity": "sha512-gPzACem9IL1Co8mM1LKMhzn1aSJmp+Vp434An4C0OBY4uEJRcqsLN3uLBlY+bYvFg8C8ImwM9YRiKczJXRk0XA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/monitoring": { + "version": "1.35.0", + "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.35.0.tgz", + "integrity": "sha512-w9MGFLB6ashI8BGcQoVt7iLgDIJNCn4OIu0Q0giE3M2ItNrssvb8C0xuwJQyTy1OFZnemG0EB1OvXhIHOvQwWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/recommend": { + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.35.0.tgz", + "integrity": "sha512-AhrVgaaXAb8Ue0u2nuRWwugt0dL5UmRgS9LXe0Hhz493a8KFeZVUE56RGIV3hAa6tHzmAV7eIoqcWTQvxzlJeQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-browser-xhr": { + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.35.0.tgz", + "integrity": "sha512-diY415KLJZ6x1Kbwl9u96Jsz0OstE3asjXtJ9pmk1d+5gPuQ5jQyEsgC+WmEXzlec3iuVszm8AzNYYaqw6B+Zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-fetch": { + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.35.0.tgz", + "integrity": "sha512-uydqnSmpAjrgo8bqhE9N1wgcB98psTRRQXcjc4izwMB7yRl9C8uuAQ/5YqRj04U0mMQ+fdu2fcNF6m9+Z1BzDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-node-http": { + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.35.0.tgz", + "integrity": "sha512-RgLX78ojYOrThJHrIiPzT4HW3yfQa0D7K+MQ81rhxqaNyNBu4F1r+72LNHYH/Z+y9I1Mrjrd/c/Ue5zfDgAEjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, "node_modules/@alloc/quick-lru": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", @@ -126,48 +334,48 @@ } }, "node_modules/@angular-builders/common": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@angular-builders/common/-/common-3.0.1.tgz", - "integrity": "sha512-AIIqWtlr3sc2+CTEOqbDsrpVvkT6ijfYzvzPk1HLFrcP9Y2tYLXVFc+gGThlE+e1Om0pKminXcINEqm3J/yY5g==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@angular-builders/common/-/common-4.0.0.tgz", + "integrity": "sha512-bepZI1KdXUVhDGqHOudZQJwucSbZWxfWzM+EHFXUoExUO0u7XEuHTF5bhtQZ+YU+ZK2Ayl26QbI/26Yj72vcFQ==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "^19.0.0", + "@angular-devkit/core": "^20.0.0", "ts-node": "^10.0.0", - "tsconfig-paths": "^4.1.0" + "tsconfig-paths": "^4.2.0" }, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" } }, "node_modules/@angular-builders/jest": { - "version": "19.0.1", - "resolved": "https://registry.npmjs.org/@angular-builders/jest/-/jest-19.0.1.tgz", - "integrity": "sha512-mi4HMQkyb1Z+pPRIKt70Uk/EBoDUirPqhv3xlz1/WpPqpxXz8y+Y3ffutot4JJDmzJw2p4h3x2hh6D3Kbocraw==", + "version": "20.0.0", + "resolved": "https://registry.npmjs.org/@angular-builders/jest/-/jest-20.0.0.tgz", + "integrity": "sha512-3rnobnIdErtjyM3yAAAOdod79lgbkf1QWMFHiRDHW4tw4f+DLFiM2HMFircCoO5WIe/ILEJE9GNxs/vvYa3gvw==", "dev": true, "license": "MIT", "dependencies": { - "@angular-builders/common": "3.0.1", - "@angular-devkit/architect": ">=0.1900.0 < 0.2000.0", - "@angular-devkit/core": "^19.0.0", - "jest-preset-angular": "14.5.4", + "@angular-builders/common": "4.0.0", + "@angular-devkit/architect": ">=0.2000.0 < 0.2100.0", + "@angular-devkit/core": "^20.0.0", + "jest-preset-angular": "14.6.0", "lodash": "^4.17.15" }, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular-devkit/build-angular": "^19.0.0", - "@angular/compiler-cli": "^19.0.0", - "@angular/core": "^19.0.0", - "@angular/platform-browser-dynamic": "^19.0.0", + "@angular-devkit/build-angular": "^20.0.0", + "@angular/compiler-cli": "^20.0.0", + "@angular/core": "^20.0.0", + "@angular/platform-browser-dynamic": "^20.0.0", "jest": ">=29" } }, "node_modules/@angular-builders/jest/node_modules/jest-preset-angular": { - "version": "14.5.4", - "resolved": "https://registry.npmjs.org/jest-preset-angular/-/jest-preset-angular-14.5.4.tgz", - "integrity": "sha512-vbil9qTrZljzVJNsDIxEhWVb4r6BQumXEgIHCAVkHJjpF1fYkIB4bczPAe58lBZH2gKeRHBSj8/IoGpGBI1qiQ==", + "version": "14.6.0", + "resolved": "https://registry.npmjs.org/jest-preset-angular/-/jest-preset-angular-14.6.0.tgz", + "integrity": "sha512-LGSKLCsUhtrs2dw6f7ega/HOS8/Ni/1gV+oXmxPHmJDLHFpM6cI78Monmz8Z1P87a/A4OwnKilxgPRr+6Pzmgg==", "dev": true, "license": "MIT", "dependencies": { @@ -185,9 +393,9 @@ "esbuild": ">=0.15.13" }, "peerDependencies": { - "@angular/compiler-cli": ">=15.0.0 <20.0.0", - "@angular/core": ">=15.0.0 <20.0.0", - "@angular/platform-browser-dynamic": ">=15.0.0 <20.0.0", + "@angular/compiler-cli": ">=15.0.0 <21.0.0", + "@angular/core": ">=15.0.0 <21.0.0", + "@angular/platform-browser-dynamic": ">=15.0.0 <21.0.0", "jest": "^29.0.0", "jsdom": ">=20.0.0", "typescript": ">=4.8" @@ -199,113 +407,120 @@ } }, "node_modules/@angular-devkit/architect": { - "version": "0.1902.17", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1902.17.tgz", - "integrity": "sha512-/LV8lXi6/SqevyI9ZAk2uAqlnN/pUwNwD6SyjotCqU55FBhBW8vM3/GucFXawJqTOzNmBXuMx1YVvQN5H0v5LQ==", + "version": "0.2003.13", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2003.13.tgz", + "integrity": "sha512-JyH6Af6PNC1IHJToColFk1RaXDU87mpPjz7M5sWDfn8bC+KBipw6dSdRkCEuw0D9HY1lZkC9EBV9k9GhpvHjCQ==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.2.17", - "rxjs": "7.8.1" + "@angular-devkit/core": "20.3.13", + "rxjs": "7.8.2" }, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" } }, "node_modules/@angular-devkit/build-angular": { - "version": "19.2.17", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-19.2.17.tgz", - "integrity": "sha512-lbvzNoSjHlhP6bcHtFMlEQHG/Zxc1tTdwoelm4+AWPuQH4rGfoty4SXH4rr50SXVBUg9Zb4xZuChOYZmYKpGLQ==", + "version": "20.3.13", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-20.3.13.tgz", + "integrity": "sha512-wEM5UHc37XGtH9FFVXZPwlZooccveL1VnFUbd2ArECGi4ylW+YgjeVSe0m6uJDvWOXULNVAoHlabXTXvmqV09A==", "dev": true, "license": "MIT", "peer": true, "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.1902.17", - "@angular-devkit/build-webpack": "0.1902.17", - "@angular-devkit/core": "19.2.17", - "@angular/build": "19.2.17", - "@babel/core": "7.26.10", - "@babel/generator": "7.26.10", - "@babel/helper-annotate-as-pure": "7.25.9", + "@angular-devkit/architect": "0.2003.13", + "@angular-devkit/build-webpack": "0.2003.13", + "@angular-devkit/core": "20.3.13", + "@angular/build": "20.3.13", + "@babel/core": "7.28.3", + "@babel/generator": "7.28.3", + "@babel/helper-annotate-as-pure": "7.27.3", "@babel/helper-split-export-declaration": "7.24.7", - "@babel/plugin-transform-async-generator-functions": "7.26.8", - "@babel/plugin-transform-async-to-generator": "7.25.9", - "@babel/plugin-transform-runtime": "7.26.10", - "@babel/preset-env": "7.26.9", - "@babel/runtime": "7.26.10", + "@babel/plugin-transform-async-generator-functions": "7.28.0", + "@babel/plugin-transform-async-to-generator": "7.27.1", + "@babel/plugin-transform-runtime": "7.28.3", + "@babel/preset-env": "7.28.3", + "@babel/runtime": "7.28.3", "@discoveryjs/json-ext": "0.6.3", - "@ngtools/webpack": "19.2.17", - "@vitejs/plugin-basic-ssl": "1.2.0", + "@ngtools/webpack": "20.3.13", "ansi-colors": "4.1.3", - "autoprefixer": "10.4.20", - "babel-loader": "9.2.1", + "autoprefixer": "10.4.21", + "babel-loader": "10.0.0", "browserslist": "^4.21.5", - "copy-webpack-plugin": "12.0.2", + "copy-webpack-plugin": "13.0.1", "css-loader": "7.1.2", - "esbuild-wasm": "0.25.4", + "esbuild-wasm": "0.25.9", "fast-glob": "3.3.3", "http-proxy-middleware": "3.0.5", "istanbul-lib-instrument": "6.0.3", "jsonc-parser": "3.3.1", "karma-source-map-support": "1.4.0", - "less": "4.2.2", - "less-loader": "12.2.0", + "less": "4.4.0", + "less-loader": "12.3.0", "license-webpack-plugin": "4.0.2", "loader-utils": "3.3.1", - "mini-css-extract-plugin": "2.9.2", - "open": "10.1.0", - "ora": "5.4.1", - "picomatch": "4.0.2", - "piscina": "4.8.0", - "postcss": "8.5.2", + "mini-css-extract-plugin": "2.9.4", + "open": "10.2.0", + "ora": "8.2.0", + "picomatch": "4.0.3", + "piscina": "5.1.3", + "postcss": "8.5.6", "postcss-loader": "8.1.1", "resolve-url-loader": "5.0.0", - "rxjs": "7.8.1", - "sass": "1.85.0", + "rxjs": "7.8.2", + "sass": "1.90.0", "sass-loader": "16.0.5", - "semver": "7.7.1", + "semver": "7.7.2", "source-map-loader": "5.0.0", "source-map-support": "0.5.21", - "terser": "5.39.0", + "terser": "5.43.1", "tree-kill": "1.2.2", "tslib": "2.8.1", - "webpack": "5.98.0", + "webpack": "5.101.2", "webpack-dev-middleware": "7.4.2", "webpack-dev-server": "5.2.2", "webpack-merge": "6.0.1", "webpack-subresource-integrity": "5.1.0" }, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" }, "optionalDependencies": { - "esbuild": "0.25.4" + "esbuild": "0.25.9" }, "peerDependencies": { - "@angular/compiler-cli": "^19.0.0 || ^19.2.0-next.0", - "@angular/localize": "^19.0.0 || ^19.2.0-next.0", - "@angular/platform-server": "^19.0.0 || ^19.2.0-next.0", - "@angular/service-worker": "^19.0.0 || ^19.2.0-next.0", - "@angular/ssr": "^19.2.17", + "@angular/compiler-cli": "^20.0.0", + "@angular/core": "^20.0.0", + "@angular/localize": "^20.0.0", + "@angular/platform-browser": "^20.0.0", + "@angular/platform-server": "^20.0.0", + "@angular/service-worker": "^20.0.0", + "@angular/ssr": "^20.3.13", "@web/test-runner": "^0.20.0", "browser-sync": "^3.0.2", - "jest": "^29.5.0", - "jest-environment-jsdom": "^29.5.0", + "jest": "^29.5.0 || ^30.2.0", + "jest-environment-jsdom": "^29.5.0 || ^30.2.0", "karma": "^6.3.0", - "ng-packagr": "^19.0.0 || ^19.2.0-next.0", + "ng-packagr": "^20.0.0", "protractor": "^7.0.0", "tailwindcss": "^2.0.0 || ^3.0.0 || ^4.0.0", - "typescript": ">=5.5 <5.9" + "typescript": ">=5.8 <6.0" }, "peerDependenciesMeta": { + "@angular/core": { + "optional": true + }, "@angular/localize": { "optional": true }, + "@angular/platform-browser": { + "optional": true + }, "@angular/platform-server": { "optional": true }, @@ -341,19 +556,242 @@ } } }, - "node_modules/@angular-devkit/build-webpack": { - "version": "0.1902.17", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1902.17.tgz", - "integrity": "sha512-8NVJL7ujeTYKR1LgErkc5UN3EEoGYasqtu5AACXraFf9NLOw2p9N0+QY4cfjIwip1nyBp0RRzlBS4omGEymJCw==", + "node_modules/@angular-devkit/build-angular/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@angular-devkit/architect": "0.1902.17", - "rxjs": "7.8.1" + "restore-cursor": "^5.0.0" }, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@angular-devkit/build-angular/node_modules/is-interactive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", + "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/is-unicode-supported": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/log-symbols": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", + "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "chalk": "^5.3.0", + "is-unicode-supported": "^1.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/log-symbols/node_modules/is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/ora": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-8.2.0.tgz", + "integrity": "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "chalk": "^5.3.0", + "cli-cursor": "^5.0.0", + "cli-spinners": "^2.9.2", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^2.0.0", + "log-symbols": "^6.0.0", + "stdin-discarder": "^0.2.2", + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular-devkit/build-angular/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", + "peer": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "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", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@angular-devkit/build-webpack": { + "version": "0.2003.13", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.2003.13.tgz", + "integrity": "sha512-k57PdWOB64/u2MQYPylQNCKDSAHGsV0T2bvvZid2wfPJ7anvSUCU15OQMCMU1JMR0JENZEyIsLw9teShAO9w0Q==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@angular-devkit/architect": "0.2003.13", + "rxjs": "7.8.2" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" }, @@ -363,21 +801,21 @@ } }, "node_modules/@angular-devkit/core": { - "version": "19.2.17", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.2.17.tgz", - "integrity": "sha512-Ah008x2RJkd0F+NLKqIpA34/vUGwjlprRCkvddjDopAWRzYn6xCkz1Tqwuhn0nR1Dy47wTLKYD999TYl5ONOAQ==", + "version": "20.3.13", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-20.3.13.tgz", + "integrity": "sha512-/D84T1Caxll3I2sRihPDR9UaWBhF50M+tAX15PdP6uSh/TxwAlLl9p7Rm1bD0mPjPercqaEKA+h9a9qLP16hug==", "dev": true, "license": "MIT", "dependencies": { "ajv": "8.17.1", "ajv-formats": "3.0.1", "jsonc-parser": "3.3.1", - "picomatch": "4.0.2", - "rxjs": "7.8.1", - "source-map": "0.7.4" + "picomatch": "4.0.3", + "rxjs": "7.8.2", + "source-map": "0.7.6" }, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" }, @@ -391,59 +829,229 @@ } }, "node_modules/@angular-devkit/schematics": { - "version": "19.2.15", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.2.15.tgz", - "integrity": "sha512-kNOJ+3vekJJCQKWihNmxBkarJzNW09kP5a9E1SRNiQVNOUEeSwcRR0qYotM65nx821gNzjjhJXnAZ8OazWldrg==", - "license": "MIT", - "dependencies": { - "@angular-devkit/core": "19.2.15", - "jsonc-parser": "3.3.1", - "magic-string": "0.30.17", - "ora": "5.4.1", - "rxjs": "7.8.1" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - } - }, - "node_modules/@angular-devkit/schematics/node_modules/@angular-devkit/core": { - "version": "19.2.15", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.2.15.tgz", - "integrity": "sha512-pU2RZYX6vhd7uLSdLwPnuBcr0mXJSjp3EgOXKsrlQFQZevc+Qs+2JdXgIElnOT/aDqtRtriDmLlSbtdE8n3ZbA==", - "license": "MIT", - "dependencies": { - "ajv": "8.17.1", - "ajv-formats": "3.0.1", - "jsonc-parser": "3.3.1", - "picomatch": "4.0.2", - "rxjs": "7.8.1", - "source-map": "0.7.4" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "chokidar": "^4.0.0" - }, - "peerDependenciesMeta": { - "chokidar": { - "optional": true - } - } - }, - "node_modules/@angular-eslint/builder": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-19.8.1.tgz", - "integrity": "sha512-NOMkw0xgDoDVCLkL5nkkvdd3ouDYkOGqtEmabTR7N4/kQnk1R4coOTWGCqAgMXCFdxlyjuxquDwuJ+yni81pRg==", + "version": "20.3.13", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-20.3.13.tgz", + "integrity": "sha512-hdMKY4rUTko8xqeWYGnwwDYDomkeOoLsYsP6SdaHWK7hpGvzWsT6Q/aIv8J8NrCYkLu+M+5nLiKOooweUZu3GQ==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/architect": ">= 0.1900.0 < 0.2000.0", - "@angular-devkit/core": ">= 19.0.0 < 20.0.0" + "@angular-devkit/core": "20.3.13", + "jsonc-parser": "3.3.1", + "magic-string": "0.30.17", + "ora": "8.2.0", + "rxjs": "7.8.2" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-devkit/schematics/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@angular-devkit/schematics/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@angular-devkit/schematics/node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular-devkit/schematics/node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "dev": true, + "license": "MIT" + }, + "node_modules/@angular-devkit/schematics/node_modules/is-interactive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", + "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular-devkit/schematics/node_modules/is-unicode-supported": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular-devkit/schematics/node_modules/log-symbols": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", + "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^5.3.0", + "is-unicode-supported": "^1.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular-devkit/schematics/node_modules/log-symbols/node_modules/is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular-devkit/schematics/node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular-devkit/schematics/node_modules/ora": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-8.2.0.tgz", + "integrity": "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^5.3.0", + "cli-cursor": "^5.0.0", + "cli-spinners": "^2.9.2", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^2.0.0", + "log-symbols": "^6.0.0", + "stdin-discarder": "^0.2.2", + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular-devkit/schematics/node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular-devkit/schematics/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular-devkit/schematics/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@angular-eslint/builder": { + "version": "20.7.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-20.7.0.tgz", + "integrity": "sha512-qgf4Cfs1z0VsVpzF/OnxDRvBp60OIzeCsp4mzlckWYVniKo19EPIN6kFDol5eTAIOMPgiBQlMIwgQMHgocXEig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/architect": ">= 0.2000.0 < 0.2100.0", + "@angular-devkit/core": ">= 20.0.0 < 21.0.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", @@ -451,21 +1059,22 @@ } }, "node_modules/@angular-eslint/bundled-angular-compiler": { - "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==", + "version": "20.7.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-20.7.0.tgz", + "integrity": "sha512-9KPz24YoiL0SvTtTX6sd1zmysU5cKOCcmpEiXkCoO3L2oYZGlVxmMT4hfSaHMt8qmfvV2KzQMoR6DZM84BwRzQ==", "dev": true, "license": "MIT" }, "node_modules/@angular-eslint/eslint-plugin": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-19.8.1.tgz", - "integrity": "sha512-wZEBMPwD2TRhifG751hcj137EMIEaFmsxRB2EI+vfINCgPnFGSGGOHXqi8aInn9fXqHs7VbXkAzXYdBsvy1m4Q==", + "version": "20.7.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-20.7.0.tgz", + "integrity": "sha512-aHH2YTiaonojsKN+y2z4IMugCwdsH/dYIjYBig6kfoSPyf9rGK4zx+gnNGq/pGRjF3bOYrmFgIviYpQVb80inQ==", "dev": true, "license": "MIT", "dependencies": { - "@angular-eslint/bundled-angular-compiler": "19.8.1", - "@angular-eslint/utils": "19.8.1" + "@angular-eslint/bundled-angular-compiler": "20.7.0", + "@angular-eslint/utils": "20.7.0", + "ts-api-utils": "^2.1.0" }, "peerDependencies": { "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", @@ -474,19 +1083,19 @@ } }, "node_modules/@angular-eslint/eslint-plugin-template": { - "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==", + "version": "20.7.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-20.7.0.tgz", + "integrity": "sha512-WFmvW2vBR6ExsSKEaActQTteyw6ikWyuJau9XmWEPFd+2eusEt/+wO21ybjDn3uc5FTp1IcdhfYy+U5OdDjH5w==", "dev": true, "license": "MIT", "dependencies": { - "@angular-eslint/bundled-angular-compiler": "19.8.1", - "@angular-eslint/utils": "19.8.1", + "@angular-eslint/bundled-angular-compiler": "20.7.0", + "@angular-eslint/utils": "20.7.0", "aria-query": "5.3.2", "axobject-query": "4.1.0" }, "peerDependencies": { - "@angular-eslint/template-parser": "19.8.1", + "@angular-eslint/template-parser": "20.7.0", "@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", @@ -494,43 +1103,30 @@ } }, "node_modules/@angular-eslint/schematics": { - "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==", + "version": "20.7.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-20.7.0.tgz", + "integrity": "sha512-S0onfRipDUIL6gFGTFjiWwUDhi42XYrBoi3kJ3wBbKBeIgYv9SP1ppTKDD4ZoDaDU9cQE8nToX7iPn9ifMw6eQ==", "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.8.1", - "@angular-eslint/eslint-plugin-template": "19.8.1", + "@angular-devkit/core": ">= 20.0.0 < 21.0.0", + "@angular-devkit/schematics": ">= 20.0.0 < 21.0.0", + "@angular-eslint/eslint-plugin": "20.7.0", + "@angular-eslint/eslint-plugin-template": "20.7.0", "ignore": "7.0.5", - "semver": "7.7.2", + "semver": "7.7.3", "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.8.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-19.8.1.tgz", - "integrity": "sha512-pQiOg+se1AU/ncMlnJ9V6xYnMQ84qI1BGWuJpbU6A99VTXJg90scg0+T7DWmKssR1YjP5qmmBtrZfKsHEcLW/A==", + "version": "20.7.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-20.7.0.tgz", + "integrity": "sha512-CVskZnF38IIxVVlKWi1VCz7YH/gHMJu2IY9bD1AVoBBGIe0xA4FRXJkW2Y+EDs9vQqZTkZZljhK5gL65Ro1PeQ==", "dev": true, "license": "MIT", "dependencies": { - "@angular-eslint/bundled-angular-compiler": "19.8.1", - "eslint-scope": "^8.0.2" + "@angular-eslint/bundled-angular-compiler": "20.7.0", + "eslint-scope": "^9.0.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", @@ -538,13 +1134,13 @@ } }, "node_modules/@angular-eslint/utils": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-19.8.1.tgz", - "integrity": "sha512-gVDKYWmAjeTPtaYmddT/HS03fCebXJtrk8G1MouQIviZbHqLjap6TbVlzlkBigRzaF0WnFnrDduQslkJzEdceA==", + "version": "20.7.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-20.7.0.tgz", + "integrity": "sha512-B6EJHbsk2W/lnS3kS/gm56VGvX735419z/DzgbRDcOvqMGMLwD1ILzv5OTEcL1rzpnB0AHW+IxOu6y/aCzSNUA==", "dev": true, "license": "MIT", "dependencies": { - "@angular-eslint/bundled-angular-compiler": "19.8.1" + "@angular-eslint/bundled-angular-compiler": "20.7.0" }, "peerDependencies": { "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", @@ -553,81 +1149,90 @@ } }, "node_modules/@angular/animations": { - "version": "19.2.14", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-19.2.14.tgz", - "integrity": "sha512-xhl8fLto5HHJdVj8Nb6EoBEiTAcXuWDYn1q5uHcGxyVH3kiwENWy/2OQXgCr2CuWo2e6hNUGzSLf/cjbsMNqEA==", + "version": "20.3.15", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-20.3.15.tgz", + "integrity": "sha512-ikyKfhkxoqQA6JcBN0B9RaN6369sM1XYX81Id0lI58dmWCe7gYfrTp8ejqxxKftl514psQO3pkW8Gn1nJ131Gw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/common": "19.2.14", - "@angular/core": "19.2.14" + "@angular/core": "20.3.15" } }, "node_modules/@angular/build": { - "version": "19.2.17", - "resolved": "https://registry.npmjs.org/@angular/build/-/build-19.2.17.tgz", - "integrity": "sha512-JrF9dSrsMip2xJzSz3zNoozBXu/OYg0bHuKfuPA/usPhz5AomJ2SQ2unvl6sDF00pTlgJohJMQ6SUHjylybn2g==", + "version": "20.3.13", + "resolved": "https://registry.npmjs.org/@angular/build/-/build-20.3.13.tgz", + "integrity": "sha512-/5pM3ZS+lLkZgA+n6TMmNV8I6t9Ow1C6Vkj6bXqWeOgFDH5LwnIEZFAKzEDBkCGos0m2gPKPcREcDD5tfp9h4g==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.1902.17", - "@babel/core": "7.26.10", - "@babel/helper-annotate-as-pure": "7.25.9", + "@angular-devkit/architect": "0.2003.13", + "@babel/core": "7.28.3", + "@babel/helper-annotate-as-pure": "7.27.3", "@babel/helper-split-export-declaration": "7.24.7", - "@babel/plugin-syntax-import-attributes": "7.26.0", - "@inquirer/confirm": "5.1.6", - "@vitejs/plugin-basic-ssl": "1.2.0", - "beasties": "0.3.2", + "@inquirer/confirm": "5.1.14", + "@vitejs/plugin-basic-ssl": "2.1.0", + "beasties": "0.3.5", "browserslist": "^4.23.0", - "esbuild": "0.25.4", - "fast-glob": "3.3.3", + "esbuild": "0.25.9", "https-proxy-agent": "7.0.6", "istanbul-lib-instrument": "6.0.3", - "listr2": "8.2.5", + "jsonc-parser": "3.3.1", + "listr2": "9.0.1", "magic-string": "0.30.17", "mrmime": "2.0.1", - "parse5-html-rewriting-stream": "7.0.0", - "picomatch": "4.0.2", - "piscina": "4.8.0", - "rollup": "4.34.8", - "sass": "1.85.0", - "semver": "7.7.1", + "parse5-html-rewriting-stream": "8.0.0", + "picomatch": "4.0.3", + "piscina": "5.1.3", + "rollup": "4.52.3", + "sass": "1.90.0", + "semver": "7.7.2", "source-map-support": "0.5.21", - "vite": "6.3.6", - "watchpack": "2.4.2" + "tinyglobby": "0.2.14", + "vite": "7.1.11", + "watchpack": "2.4.4" }, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" }, "optionalDependencies": { - "lmdb": "3.2.6" + "lmdb": "3.4.2" }, "peerDependencies": { - "@angular/compiler": "^19.0.0 || ^19.2.0-next.0", - "@angular/compiler-cli": "^19.0.0 || ^19.2.0-next.0", - "@angular/localize": "^19.0.0 || ^19.2.0-next.0", - "@angular/platform-server": "^19.0.0 || ^19.2.0-next.0", - "@angular/service-worker": "^19.0.0 || ^19.2.0-next.0", - "@angular/ssr": "^19.2.17", + "@angular/compiler": "^20.0.0", + "@angular/compiler-cli": "^20.0.0", + "@angular/core": "^20.0.0", + "@angular/localize": "^20.0.0", + "@angular/platform-browser": "^20.0.0", + "@angular/platform-server": "^20.0.0", + "@angular/service-worker": "^20.0.0", + "@angular/ssr": "^20.3.13", "karma": "^6.4.0", "less": "^4.2.0", - "ng-packagr": "^19.0.0 || ^19.2.0-next.0", + "ng-packagr": "^20.0.0", "postcss": "^8.4.0", "tailwindcss": "^2.0.0 || ^3.0.0 || ^4.0.0", - "typescript": ">=5.5 <5.9" + "tslib": "^2.3.0", + "typescript": ">=5.8 <6.0", + "vitest": "^3.1.1" }, "peerDependenciesMeta": { + "@angular/core": { + "optional": true + }, "@angular/localize": { "optional": true }, + "@angular/platform-browser": { + "optional": true + }, "@angular/platform-server": { "optional": true }, @@ -651,9 +1256,65 @@ }, "tailwindcss": { "optional": true + }, + "vitest": { + "optional": true } } }, + "node_modules/@angular/build/node_modules/@vitejs/plugin-basic-ssl": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-2.1.0.tgz", + "integrity": "sha512-dOxxrhgyDIEUADhb/8OlV9JIqYLgos03YorAueTIeOUskLJSEsfwCByjbu98ctXitUN3znXKp0bYD/WHSudCeA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "peerDependencies": { + "vite": "^6.0.0 || ^7.0.0" + } + }, + "node_modules/@angular/build/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@angular/build/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@angular/build/node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "dev": true, + "license": "MIT" + }, + "node_modules/@angular/build/node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "dev": true, + "license": "MIT" + }, "node_modules/@angular/build/node_modules/https-proxy-agent": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", @@ -668,254 +1329,707 @@ "node": ">= 14" } }, - "node_modules/@angular/cdk": { - "version": "19.2.19", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-19.2.19.tgz", - "integrity": "sha512-PCpJagurPBqciqcq4Z8+3OtKLb7rSl4w/qBJoIMua8CgnrjvA1i+SWawhdtfI1zlY8FSwhzLwXV0CmWWfFzQPg==", - "license": "MIT", - "dependencies": { - "parse5": "^7.1.2", - "tslib": "^2.3.0" - }, - "peerDependencies": { - "@angular/common": "^19.0.0 || ^20.0.0", - "@angular/core": "^19.0.0 || ^20.0.0", - "rxjs": "^6.5.3 || ^7.4.0" - } - }, - "node_modules/@angular/cli": { - "version": "19.2.15", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-19.2.15.tgz", - "integrity": "sha512-YRIpARHWSOnWkHusUWTQgeUrPWMjWvtQrOkjWc6stF36z2KUzKMEng6EzUvH6sZolNSwVwOFpODEP0ut4aBkvQ==", + "node_modules/@angular/build/node_modules/listr2": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-9.0.1.tgz", + "integrity": "sha512-SL0JY3DaxylDuo/MecFeiC+7pedM0zia33zl0vcjgwcq1q1FWWF1To9EIauPbl8GbMCU0R2e0uJ8bZunhYKD2g==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/architect": "0.1902.15", - "@angular-devkit/core": "19.2.15", - "@angular-devkit/schematics": "19.2.15", - "@inquirer/prompts": "7.3.2", - "@listr2/prompt-adapter-inquirer": "2.0.18", - "@schematics/angular": "19.2.15", + "cli-truncate": "^4.0.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^6.1.0", + "rfdc": "^1.4.1", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@angular/build/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/build/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular/build/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@angular/build/node_modules/tinyglobby": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", + "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.4.4", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/@angular/build/node_modules/vite": { + "version": "7.1.11", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.11.tgz", + "integrity": "sha512-uzcxnSDVjAopEUjljkWh8EIrg6tlzrjFUfMcR1EVsRDGwf/ccef0qQPRyOrROwhrTDaApueq+ja+KLPlzR/zdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/@angular/build/node_modules/vite/node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/@angular/build/node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@angular/cdk": { + "version": "20.2.14", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-20.2.14.tgz", + "integrity": "sha512-7bZxc01URbiPiIBWThQ69XwOxVduqEKN4PhpbF2AAyfMc/W8Hcr4VoIJOwL0O1Nkq5beS8pCAqoOeIgFyXd/kg==", + "license": "MIT", + "dependencies": { + "parse5": "^8.0.0", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "@angular/common": "^20.0.0 || ^21.0.0", + "@angular/core": "^20.0.0 || ^21.0.0", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/cdk/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/@angular/cdk/node_modules/parse5": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.0.tgz", + "integrity": "sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA==", + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/@angular/cli": { + "version": "20.3.13", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-20.3.13.tgz", + "integrity": "sha512-G78I/HDJULloS2LSqfUfbmBlhDCbcWujIRWfuMnGsRf82TyGA2OEPe3IA/F8MrJfeOzPQim2fMyn24MqHL40Vg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/architect": "0.2003.13", + "@angular-devkit/core": "20.3.13", + "@angular-devkit/schematics": "20.3.13", + "@inquirer/prompts": "7.8.2", + "@listr2/prompt-adapter-inquirer": "3.0.1", + "@modelcontextprotocol/sdk": "1.24.0", + "@schematics/angular": "20.3.13", "@yarnpkg/lockfile": "1.1.0", + "algoliasearch": "5.35.0", "ini": "5.0.0", "jsonc-parser": "3.3.1", - "listr2": "8.2.5", - "npm-package-arg": "12.0.2", - "npm-pick-manifest": "10.0.0", - "pacote": "20.0.0", + "listr2": "9.0.1", + "npm-package-arg": "13.0.0", + "pacote": "21.0.0", "resolve": "1.22.10", - "semver": "7.7.1", - "symbol-observable": "4.0.0", - "yargs": "17.7.2" + "semver": "7.7.2", + "yargs": "18.0.0", + "zod": "4.1.13" }, "bin": { "ng": "bin/ng.js" }, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" } }, - "node_modules/@angular/cli/node_modules/@angular-devkit/architect": { - "version": "0.1902.15", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1902.15.tgz", - "integrity": "sha512-RbqhStc6ZoRv57ZqLB36VOkBkAdU3nNezCvIs0AJV5V4+vLPMrb0hpIB0sF+9yMlMjWsolnRsj0/Fil+zQG3bw==", + "node_modules/@angular/cli/node_modules/@listr2/prompt-adapter-inquirer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@listr2/prompt-adapter-inquirer/-/prompt-adapter-inquirer-3.0.1.tgz", + "integrity": "sha512-3XFmGwm3u6ioREG+ynAQB7FoxfajgQnMhIu8wC5eo/Lsih4aKDg0VuIMGaOsYn7hJSJagSeaD4K8yfpkEoDEmA==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.2.15", - "rxjs": "7.8.1" + "@inquirer/type": "^3.0.7" }, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - } - }, - "node_modules/@angular/cli/node_modules/@angular-devkit/core": { - "version": "19.2.15", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.2.15.tgz", - "integrity": "sha512-pU2RZYX6vhd7uLSdLwPnuBcr0mXJSjp3EgOXKsrlQFQZevc+Qs+2JdXgIElnOT/aDqtRtriDmLlSbtdE8n3ZbA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "8.17.1", - "ajv-formats": "3.0.1", - "jsonc-parser": "3.3.1", - "picomatch": "4.0.2", - "rxjs": "7.8.1", - "source-map": "0.7.4" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" + "node": ">=20.0.0" }, "peerDependencies": { - "chokidar": "^4.0.0" + "@inquirer/prompts": ">= 3 < 8", + "listr2": "9.0.1" + } + }, + "node_modules/@angular/cli/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" }, - "peerDependenciesMeta": { - "chokidar": { - "optional": true - } + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@angular/cli/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@angular/cli/node_modules/cliui": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", + "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@angular/cli/node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "dev": true, + "license": "MIT" + }, + "node_modules/@angular/cli/node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@angular/cli/node_modules/listr2": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-9.0.1.tgz", + "integrity": "sha512-SL0JY3DaxylDuo/MecFeiC+7pedM0zia33zl0vcjgwcq1q1FWWF1To9EIauPbl8GbMCU0R2e0uJ8bZunhYKD2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "cli-truncate": "^4.0.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^6.1.0", + "rfdc": "^1.4.1", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@angular/cli/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/cli/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular/cli/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@angular/cli/node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@angular/cli/node_modules/yargs": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz", + "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^9.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "string-width": "^7.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^22.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" + } + }, + "node_modules/@angular/cli/node_modules/yargs-parser": { + "version": "22.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", + "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" + } + }, + "node_modules/@angular/cli/node_modules/zod": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.13.tgz", + "integrity": "sha512-AvvthqfqrAhNH9dnfmrfKzX5upOdjUVJYFqNSlkmGf64gRaTzlPwz99IHYnVs28qYAybvAlBV+H7pn0saFY4Ig==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" } }, "node_modules/@angular/common": { - "version": "19.2.14", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-19.2.14.tgz", - "integrity": "sha512-NcNklcuyqaTjOVGf7aru8APX9mjsnZ01gFZrn47BxHozhaR0EMRrotYQTdi8YdVjPkeYFYanVntSLfhyobq/jg==", + "version": "20.3.15", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-20.3.15.tgz", + "integrity": "sha512-k4mCXWRFiOHK3bUKfWkRQQ8KBPxW8TAJuKLYCsSHPCpMz6u0eA1F0VlrnOkZVKWPI792fOaEAWH2Y4PTaXlUHw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/core": "19.2.14", + "@angular/core": "20.3.15", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "19.2.14", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-19.2.14.tgz", - "integrity": "sha512-ZqJDYOdhgKpVGNq3+n/Gbxma8DVYElDsoRe0tvNtjkWBVdaOxdZZUqmJ3kdCBsqD/aqTRvRBu0KGo9s2fCChkA==", + "version": "20.3.15", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-20.3.15.tgz", + "integrity": "sha512-lMicIAFAKZXa+BCZWs3soTjNQPZZXrF/WMVDinm8dQcggNarnDj4UmXgKSyXkkyqK5SLfnLsXVzrX6ndVT6z7A==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" } }, "node_modules/@angular/compiler-cli": { - "version": "19.2.14", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-19.2.14.tgz", - "integrity": "sha512-e9/h86ETjoIK2yTLE9aUeMCKujdg/du2pq7run/aINjop4RtnNOw+ZlSTUa6R65lP5CVwDup1kPytpAoifw8cA==", + "version": "20.3.15", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-20.3.15.tgz", + "integrity": "sha512-8sJoxodxsfyZ8eJ5r6Bx7BCbazXYgsZ1+dE8t5u5rTQ6jNggwNtYEzkyReoD5xvP+MMtRkos3xpwq4rtFnpI6A==", "license": "MIT", "dependencies": { - "@babel/core": "7.26.9", + "@babel/core": "7.28.3", "@jridgewell/sourcemap-codec": "^1.4.14", "chokidar": "^4.0.0", "convert-source-map": "^1.5.1", "reflect-metadata": "^0.2.0", "semver": "^7.0.0", "tslib": "^2.3.0", - "yargs": "^17.2.1" + "yargs": "^18.0.0" }, "bin": { "ng-xi18n": "bundles/src/bin/ng_xi18n.js", - "ngc": "bundles/src/bin/ngc.js", - "ngcc": "bundles/ngcc/index.js" + "ngc": "bundles/src/bin/ngc.js" }, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/compiler": "19.2.14", - "typescript": ">=5.5 <5.9" + "@angular/compiler": "20.3.15", + "typescript": ">=5.8 <6.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@angular/compiler-cli/node_modules/@babel/core": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.9.tgz", - "integrity": "sha512-lWBYIrF7qK5+GjY5Uy+/hEgp8OJWOD/rpy74GplYRhEauvbHDeFB8t5hPOZxCZ0Oxf4Cc36tK51/l3ymJysrKw==", + "node_modules/@angular/compiler-cli/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "license": "MIT", - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.9", - "@babel/helper-compilation-targets": "^7.26.5", - "@babel/helper-module-transforms": "^7.26.0", - "@babel/helpers": "^7.26.9", - "@babel/parser": "^7.26.9", - "@babel/template": "^7.26.9", - "@babel/traverse": "^7.26.9", - "@babel/types": "^7.26.9", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, "engines": { - "node": ">=6.9.0" + "node": ">=12" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/@angular/compiler-cli/node_modules/@babel/core/node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "node_modules/@angular/compiler-cli/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@angular/compiler-cli/node_modules/cliui": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", + "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", + "license": "ISC", + "dependencies": { + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@angular/compiler-cli/node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", "license": "MIT" }, - "node_modules/@angular/compiler-cli/node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "node_modules/@angular/compiler-cli/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular/compiler-cli/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@angular/compiler-cli/node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@angular/compiler-cli/node_modules/yargs": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz", + "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==", + "license": "MIT", + "dependencies": { + "cliui": "^9.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "string-width": "^7.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^22.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" + } + }, + "node_modules/@angular/compiler-cli/node_modules/yargs-parser": { + "version": "22.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", + "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" } }, "node_modules/@angular/core": { - "version": "19.2.14", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-19.2.14.tgz", - "integrity": "sha512-EVErpW9tGqJ/wNcAN3G/ErH8pHCJ8mM1E6bsJ8UJIpDTZkpqqYjBMtZS9YWH5n3KwUd1tAkAB2w8FK125AjDUQ==", + "version": "20.3.15", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-20.3.15.tgz", + "integrity": "sha512-NMbX71SlTZIY9+rh/SPhRYFJU0pMJYW7z/TBD4lqiO+b0DTOIg1k7Pg9ydJGqSjFO1Z4dQaA6TteNuF99TJCNw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { + "@angular/compiler": "20.3.15", "rxjs": "^6.5.3 || ^7.4.0", "zone.js": "~0.15.0" + }, + "peerDependenciesMeta": { + "@angular/compiler": { + "optional": true + }, + "zone.js": { + "optional": true + } } }, "node_modules/@angular/forms": { - "version": "19.2.14", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-19.2.14.tgz", - "integrity": "sha512-hWtDOj2B0AuRTf+nkMJeodnFpDpmEK9OIhIv1YxcRe73ooaxrIdjgugkElO8I9Tj0E4/7m117ezhWDUkbqm1zA==", + "version": "20.3.15", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-20.3.15.tgz", + "integrity": "sha512-gS5hQkinq52pm/7mxz4yHPCzEcmRWjtUkOVddPH0V1BW/HMni/p4Y6k2KqKBeGb9p8S5EAp6PDxDVLOPukp3mg==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/common": "19.2.14", - "@angular/core": "19.2.14", - "@angular/platform-browser": "19.2.14", + "@angular/common": "20.3.15", + "@angular/core": "20.3.15", + "@angular/platform-browser": "20.3.15", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/language-service": { - "version": "19.2.14", - "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-19.2.14.tgz", - "integrity": "sha512-XgzZdBCe/obCrck5I6GIG4qSI9UGaOtbrvNuw0QAK0DySKaW5inRm6/QwCMPRmPkJBY0wLeYUVz//rtHpEjeTQ==", + "version": "20.3.15", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-20.3.15.tgz", + "integrity": "sha512-oD5rvAsZYzNqdJqMTYYp6T9yITG6axTI/j64v3qxHe+Y/PlHKfNHXcjENpA+LcR5wq0wtIE+s96APykCq9ouEQ==", "dev": true, "license": "MIT", "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" } }, "node_modules/@angular/localize": { - "version": "19.2.14", - "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-19.2.14.tgz", - "integrity": "sha512-T2qPVE5N4qe1rQnx9tkxqUzXV+gUgAwSpVG+vHHRJe//jxCIVfk5zyPd2Z9nFzwGarHP61hvnEzbdbZHtCmbcQ==", + "version": "20.3.15", + "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-20.3.15.tgz", + "integrity": "sha512-vJDLXzQgLE+zpzwT2n85yWmWHuk9BsnPByOHyF63K178GFs0TG49UqZOFKohGbq5Vlo1GI9NIvXkcegkoMJCMQ==", "license": "MIT", "dependencies": { - "@babel/core": "7.26.9", + "@babel/core": "7.28.3", "@types/babel__core": "7.20.5", - "fast-glob": "3.3.3", - "yargs": "^17.2.1" + "tinyglobby": "^0.2.12", + "yargs": "^18.0.0" }, "bin": { "localize-extract": "tools/bundles/src/extract/cli.js", @@ -923,90 +2037,164 @@ "localize-translate": "tools/bundles/src/translate/cli.js" }, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/compiler": "19.2.14", - "@angular/compiler-cli": "19.2.14" + "@angular/compiler": "20.3.15", + "@angular/compiler-cli": "20.3.15" } }, - "node_modules/@angular/localize/node_modules/@babel/core": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.9.tgz", - "integrity": "sha512-lWBYIrF7qK5+GjY5Uy+/hEgp8OJWOD/rpy74GplYRhEauvbHDeFB8t5hPOZxCZ0Oxf4Cc36tK51/l3ymJysrKw==", + "node_modules/@angular/localize/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "license": "MIT", - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.9", - "@babel/helper-compilation-targets": "^7.26.5", - "@babel/helper-module-transforms": "^7.26.0", - "@babel/helpers": "^7.26.9", - "@babel/parser": "^7.26.9", - "@babel/template": "^7.26.9", - "@babel/traverse": "^7.26.9", - "@babel/types": "^7.26.9", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, "engines": { - "node": ">=6.9.0" + "node": ">=12" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/@angular/localize/node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "node_modules/@angular/localize/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@angular/localize/node_modules/cliui": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", + "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", + "license": "ISC", + "dependencies": { + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@angular/localize/node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", "license": "MIT" }, - "node_modules/@angular/localize/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "node_modules/@angular/localize/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular/localize/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@angular/localize/node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@angular/localize/node_modules/yargs": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz", + "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==", + "license": "MIT", + "dependencies": { + "cliui": "^9.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "string-width": "^7.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^22.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" + } + }, + "node_modules/@angular/localize/node_modules/yargs-parser": { + "version": "22.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", + "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" } }, "node_modules/@angular/material": { - "version": "19.2.19", - "resolved": "https://registry.npmjs.org/@angular/material/-/material-19.2.19.tgz", - "integrity": "sha512-auIE6JUzTIA3LyYklh9J/T7u64crmphxUBgAa0zcOMDog6SYfwbNe9YeLQqua5ek4OUAOdK/BHHfVl5W5iaUoQ==", + "version": "20.2.14", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-20.2.14.tgz", + "integrity": "sha512-IbAgV6XLsvmHiJzxycVhcNC1PA4M30qi+ERCOir6cT333Bxm8vDV32gsOjfL52uzG5YRARroPC+8s1XqR2oxeA==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, "peerDependencies": { - "@angular/cdk": "19.2.19", - "@angular/common": "^19.0.0 || ^20.0.0", - "@angular/core": "^19.0.0 || ^20.0.0", - "@angular/forms": "^19.0.0 || ^20.0.0", - "@angular/platform-browser": "^19.0.0 || ^20.0.0", + "@angular/cdk": "20.2.14", + "@angular/common": "^20.0.0 || ^21.0.0", + "@angular/core": "^20.0.0 || ^21.0.0", + "@angular/forms": "^20.0.0 || ^21.0.0", + "@angular/platform-browser": "^20.0.0 || ^21.0.0", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/platform-browser": { - "version": "19.2.14", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-19.2.14.tgz", - "integrity": "sha512-hzkT5nmA64oVBQl6PRjdL4dIFT1n7lfM9rm5cAoS+6LUUKRgiE2d421Kpn/Hz3jaCJfo+calMIdtSMIfUJBmww==", + "version": "20.3.15", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-20.3.15.tgz", + "integrity": "sha512-TxRM/wTW/oGXv/3/Iohn58yWoiYXOaeEnxSasiGNS1qhbkcKtR70xzxW6NjChBUYAixz2ERkLURkpx3pI8Q6Dw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/animations": "19.2.14", - "@angular/common": "19.2.14", - "@angular/core": "19.2.14" + "@angular/animations": "20.3.15", + "@angular/common": "20.3.15", + "@angular/core": "20.3.15" }, "peerDependenciesMeta": { "@angular/animations": { @@ -1015,64 +2203,116 @@ } }, "node_modules/@angular/platform-browser-dynamic": { - "version": "19.2.14", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-19.2.14.tgz", - "integrity": "sha512-Hfz0z1KDQmIdnFXVFCwCPykuIsHPkr1uW2aY396eARwZ6PK8i0Aadcm1ZOnpd3MR1bMyDrJo30VRS5kx89QWvA==", + "version": "20.3.15", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-20.3.15.tgz", + "integrity": "sha512-RizuRdBt0d6ongQ2y8cr8YsXFyjF8f91vFfpSNw+cFj+oiEmRC1txcWUlH5bPLD9qSDied8qazUi0Tb8VPQDGw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/common": "19.2.14", - "@angular/compiler": "19.2.14", - "@angular/core": "19.2.14", - "@angular/platform-browser": "19.2.14" + "@angular/common": "20.3.15", + "@angular/compiler": "20.3.15", + "@angular/core": "20.3.15", + "@angular/platform-browser": "20.3.15" } }, "node_modules/@angular/router": { - "version": "19.2.14", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-19.2.14.tgz", - "integrity": "sha512-cBTWY9Jx7YhbmDYDb7Hqz4Q7UNIMlKTkdKToJd2pbhIXyoS+kHVQrySmyca+jgvYMjWnIjsAEa3dpje12D4mFw==", + "version": "20.3.15", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-20.3.15.tgz", + "integrity": "sha512-6+qgk8swGSoAu7ISSY//GatAyCP36hEvvUgvjbZgkXLLH9yUQxdo77ij05aJ5s0OyB25q/JkqS8VTY0z1yE9NQ==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/common": "19.2.14", - "@angular/core": "19.2.14", - "@angular/platform-browser": "19.2.14", + "@angular/common": "20.3.15", + "@angular/core": "20.3.15", + "@angular/platform-browser": "20.3.15", "rxjs": "^6.5.3 || ^7.4.0" } }, - "node_modules/@augment-vir/common": { - "version": "28.2.4", - "resolved": "https://registry.npmjs.org/@augment-vir/common/-/common-28.2.4.tgz", - "integrity": "sha512-5Ib0OX7YlxAuFrG+MAoTsz6RlKMcbdMdoNGcEEKH/ezc/ZKMy/IHZ9Z/ZcCHYopZ4ocGXzVY4KUOiJ8+CXXvTA==", + "node_modules/@augment-vir/assert": { + "version": "31.54.3", + "resolved": "https://registry.npmjs.org/@augment-vir/assert/-/assert-31.54.3.tgz", + "integrity": "sha512-tcjk7P6j6BADIX6iHF6L2FeAzCiqyo0VbUgNtncfSfh9YUZiyvkTVe8CmoTXu9iqpykYPkETvJ086SHQY66AtQ==", "dev": true, - "license": "MIT", + "license": "(MIT or CC0 1.0)", "dependencies": { - "browser-or-node": "^3.0.0", - "run-time-assertions": "^1.5.1", - "type-fest": "^4.20.1" + "@augment-vir/core": "^31.54.3", + "@date-vir/duration": "^8.0.0", + "deep-eql": "^5.0.2", + "expect-type": "^1.2.2", + "type-fest": "^5.2.0" + }, + "engines": { + "node": ">=22" } }, - "node_modules/@augment-vir/common/node_modules/type-fest": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", - "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "node_modules/@augment-vir/common": { + "version": "31.54.3", + "resolved": "https://registry.npmjs.org/@augment-vir/common/-/common-31.54.3.tgz", + "integrity": "sha512-n5/nRP9aLmu+z/0A39vqv9UtFYiKwLj12ifa0TUMZMgDLn0tPQCog/hmamZB7UT5ripy6mTfYtvQ1hXQzBNbpg==", "dev": true, - "license": "(MIT OR CC0-1.0)", + "license": "(MIT or CC0 1.0)", + "dependencies": { + "@augment-vir/assert": "^31.54.3", + "@augment-vir/core": "^31.54.3", + "@date-vir/duration": "^8.0.0", + "ansi-styles": "^6.2.3", + "deepcopy-esm": "^2.1.1", + "json5": "^2.2.3", + "type-fest": "^5.2.0", + "typed-event-target": "^4.1.0" + }, "engines": { - "node": ">=16" + "node": ">=22" + } + }, + "node_modules/@augment-vir/common/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@augment-vir/core": { + "version": "31.54.3", + "resolved": "https://registry.npmjs.org/@augment-vir/core/-/core-31.54.3.tgz", + "integrity": "sha512-2UI29eMrdo+f+IdmQtHsJ1AakKqk+axmd1lXn5GjFCjziPtxn9DZXOrJpwRJcZPug0duRwqHGWlnj8g9BG+MKw==", + "dev": true, + "license": "(MIT or CC0 1.0)", + "dependencies": { + "@date-vir/duration": "^8.0.0", + "browser-or-node": "^3.0.0", + "diff": "^8.0.2", + "json5": "^2.2.3", + "type-fest": "^5.2.0" + }, + "engines": { + "node": ">=22" + } + }, + "node_modules/@augment-vir/core/node_modules/diff": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.2.tgz", + "integrity": "sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" } }, "node_modules/@babel/code-frame": { @@ -1090,30 +2330,30 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.4.tgz", - "integrity": "sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", + "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz", - "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.3.tgz", + "integrity": "sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ==", "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.10", - "@babel/helper-compilation-targets": "^7.26.5", - "@babel/helper-module-transforms": "^7.26.0", - "@babel/helpers": "^7.26.10", - "@babel/parser": "^7.26.10", - "@babel/template": "^7.26.9", - "@babel/traverse": "^7.26.10", - "@babel/types": "^7.26.10", + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.3", + "@babel/parser": "^7.28.3", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.3", + "@babel/types": "^7.28.2", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -1144,15 +2384,15 @@ } }, "node_modules/@babel/generator": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.10.tgz", - "integrity": "sha512-rRHT8siFIXQrAYOYqZQVsAr8vJ+cBNqcVAY6m5V8/4QqzaPl+zDBe6cLEPRDuNOUf3ww8RfJVlOyQMoSI+5Ang==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz", + "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.26.10", - "@babel/types": "^7.26.10", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", + "@babel/parser": "^7.28.3", + "@babel/types": "^7.28.2", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" }, "engines": { @@ -1160,13 +2400,13 @@ } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", - "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.25.9" + "@babel/types": "^7.27.3" }, "engines": { "node": ">=6.9.0" @@ -1198,19 +2438,19 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.3.tgz", - "integrity": "sha512-V9f6ZFIYSLNEbuGA/92uOvYsGCJNsuA8ESZ4ldc09bWk/j8H8TKiPw8Mk1eG6olpnO0ALHJmYfZvF4MEE4gajg==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.5.tgz", + "integrity": "sha512-q3WC4JfdODypvxArsJQROfupPBq9+lMwjKq7C33GhbFYJsufD0yd/ziwD+hJucLeWsnFPWZjsU2DNFqBPE7jwQ==", "dev": true, "license": "MIT", "peer": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-member-expression-to-functions": "^7.28.5", "@babel/helper-optimise-call-expression": "^7.27.1", "@babel/helper-replace-supers": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/traverse": "^7.28.3", + "@babel/traverse": "^7.28.5", "semver": "^6.3.1" }, "engines": { @@ -1220,20 +2460,6 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/helper-annotate-as-pure": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", - "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/types": "^7.27.3" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -1246,15 +2472,15 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.27.1.tgz", - "integrity": "sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.28.5.tgz", + "integrity": "sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "regexpu-core": "^6.2.0", + "@babel/helper-annotate-as-pure": "^7.27.3", + "regexpu-core": "^6.3.1", "semver": "^6.3.1" }, "engines": { @@ -1264,20 +2490,6 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/@babel/helper-annotate-as-pure": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", - "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/types": "^7.27.3" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -1317,15 +2529,15 @@ } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz", - "integrity": "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz", + "integrity": "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -1404,20 +2616,6 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-remap-async-to-generator/node_modules/@babel/helper-annotate-as-pure": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", - "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/types": "^7.27.3" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-replace-supers": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz", @@ -1475,9 +2673,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", - "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -1522,12 +2720,12 @@ } }, "node_modules/@babel/parser": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz", - "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", "license": "MIT", "dependencies": { - "@babel/types": "^7.28.4" + "@babel/types": "^7.28.5" }, "bin": { "parser": "bin/babel-parser.js" @@ -1537,15 +2735,15 @@ } }, "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.27.1.tgz", - "integrity": "sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.28.5.tgz", + "integrity": "sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q==", "dev": true, "license": "MIT", "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.27.1" + "@babel/traverse": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -1712,13 +2910,13 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", - "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", + "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1931,16 +3129,16 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.26.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.26.8.tgz", - "integrity": "sha512-He9Ej2X7tNf2zdKMAGOsmg2MrFc+hfoAhd3po4cWfo/NWjzEAKa0oQruj1ROVUdl0e6fb6/kE/G3SSxE0lRJOg==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.28.0.tgz", + "integrity": "sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.26.5", - "@babel/helper-remap-async-to-generator": "^7.25.9", - "@babel/traverse": "^7.26.8" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-remap-async-to-generator": "^7.27.1", + "@babel/traverse": "^7.28.0" }, "engines": { "node": ">=6.9.0" @@ -1950,16 +3148,16 @@ } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz", - "integrity": "sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.27.1.tgz", + "integrity": "sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-remap-async-to-generator": "^7.25.9" + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-remap-async-to-generator": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1986,9 +3184,9 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.4.tgz", - "integrity": "sha512-1yxmvN0MJHOhPVmAsmoW5liWwoILobu/d/ShymZmj867bAdxGbehIrew1DuLpw2Ukv+qDSSPQdYW1dLNE7t11A==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.5.tgz", + "integrity": "sha512-45DmULpySVvmq9Pj3X9B+62Xe+DJGov27QravQJU1LLcapR6/10i+gYVAucGGJpHBp5mYxIMK4nDAT/QDLr47g==", "dev": true, "license": "MIT", "peer": true, @@ -2060,20 +3258,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-classes/node_modules/@babel/helper-annotate-as-pure": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", - "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/types": "^7.27.3" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-computed-properties": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz", @@ -2093,15 +3277,15 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.0.tgz", - "integrity": "sha512-v1nrSMBiKcodhsyJ4Gf+Z0U/yawmJDBOTpEB3mcQY52r9RIyPneGyAS/yM6seP/8I+mWI3elOMtT5dB8GJVs+A==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.5.tgz", + "integrity": "sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==", "dev": true, "license": "MIT", "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.28.0" + "@babel/traverse": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -2180,10 +3364,28 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-explicit-resource-management": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.0.tgz", + "integrity": "sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.27.1.tgz", - "integrity": "sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.28.5.tgz", + "integrity": "sha512-D4WIMaFtwa2NizOp+dnoFjRez/ClKiC2BqqImwKd1X28nqBtZEyCYJ2ozQrrzlxAFrcrjxo39S6khe9RNDlGzw==", "dev": true, "license": "MIT", "peer": true, @@ -2286,9 +3488,9 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.27.1.tgz", - "integrity": "sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.28.5.tgz", + "integrity": "sha512-axUuqnUTBuXyHGcJEVVh9pORaN6wC5bYfE7FGzPiaWa3syib9m7g+/IT/4VgCOe2Upef43PHzeAvcrVek6QuuA==", "dev": true, "license": "MIT", "peer": true, @@ -2356,17 +3558,17 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.27.1.tgz", - "integrity": "sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.28.5.tgz", + "integrity": "sha512-vn5Jma98LCOeBy/KpeQhXcV2WZgaRUtjwQmjoBuLNlOmkg0fB5pdvYVeWRYI69wWKwK2cD1QbMiUQnoujWvrew==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-module-transforms": "^7.28.3", "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.27.1" + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -2519,9 +3721,9 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.27.1.tgz", - "integrity": "sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.28.5.tgz", + "integrity": "sha512-N6fut9IZlPnjPwgiQkXNhb+cT8wQKFlJNqcZkWlcTqkcqx6/kU4ynGmLFoa4LViBSirn05YAwk+sQBbPfxtYzQ==", "dev": true, "license": "MIT", "peer": true, @@ -2590,20 +3792,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-private-property-in-object/node_modules/@babel/helper-annotate-as-pure": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", - "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/types": "^7.27.3" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-property-literals": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz", @@ -2674,18 +3862,18 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.26.10.tgz", - "integrity": "sha512-NWaL2qG6HRpONTnj4JvDU6th4jYeZOJgu3QhmFTCihib0ermtOJqktA5BduGm3suhhVe9EMP9c9+mfJ/I9slqw==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.28.3.tgz", + "integrity": "sha512-Y6ab1kGqZ0u42Zv/4a7l0l72n9DKP/MKoKWaUSBylrhNZO2prYuqFOLbn5aW5SIFXwSH93yfjbgllL8lxuGKLg==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-plugin-utils": "^7.26.5", - "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.11.0", - "babel-plugin-polyfill-regenerator": "^0.6.1", + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "babel-plugin-polyfill-corejs2": "^0.4.14", + "babel-plugin-polyfill-corejs3": "^0.13.0", + "babel-plugin-polyfill-regenerator": "^0.6.5", "semver": "^6.3.1" }, "engines": { @@ -2864,81 +4052,82 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.9.tgz", - "integrity": "sha512-vX3qPGE8sEKEAZCWk05k3cpTAE3/nOYca++JA+Rd0z2NCNzabmYvEiSShKzm10zdquOIAVXsy2Ei/DTW34KlKQ==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.3.tgz", + "integrity": "sha512-ROiDcM+GbYVPYBOeCR6uBXKkQpBExLl8k9HO1ygXEyds39j+vCCsjmj7S8GOniZQlEs81QlkdJZe76IpLSiqpg==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/compat-data": "^7.26.8", - "@babel/helper-compilation-targets": "^7.26.5", - "@babel/helper-plugin-utils": "^7.26.5", - "@babel/helper-validator-option": "^7.25.9", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.9", - "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.9", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.9", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.9", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.9", + "@babel/compat-data": "^7.28.0", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.27.1", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.3", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-import-assertions": "^7.26.0", - "@babel/plugin-syntax-import-attributes": "^7.26.0", + "@babel/plugin-syntax-import-assertions": "^7.27.1", + "@babel/plugin-syntax-import-attributes": "^7.27.1", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.25.9", - "@babel/plugin-transform-async-generator-functions": "^7.26.8", - "@babel/plugin-transform-async-to-generator": "^7.25.9", - "@babel/plugin-transform-block-scoped-functions": "^7.26.5", - "@babel/plugin-transform-block-scoping": "^7.25.9", - "@babel/plugin-transform-class-properties": "^7.25.9", - "@babel/plugin-transform-class-static-block": "^7.26.0", - "@babel/plugin-transform-classes": "^7.25.9", - "@babel/plugin-transform-computed-properties": "^7.25.9", - "@babel/plugin-transform-destructuring": "^7.25.9", - "@babel/plugin-transform-dotall-regex": "^7.25.9", - "@babel/plugin-transform-duplicate-keys": "^7.25.9", - "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.9", - "@babel/plugin-transform-dynamic-import": "^7.25.9", - "@babel/plugin-transform-exponentiation-operator": "^7.26.3", - "@babel/plugin-transform-export-namespace-from": "^7.25.9", - "@babel/plugin-transform-for-of": "^7.26.9", - "@babel/plugin-transform-function-name": "^7.25.9", - "@babel/plugin-transform-json-strings": "^7.25.9", - "@babel/plugin-transform-literals": "^7.25.9", - "@babel/plugin-transform-logical-assignment-operators": "^7.25.9", - "@babel/plugin-transform-member-expression-literals": "^7.25.9", - "@babel/plugin-transform-modules-amd": "^7.25.9", - "@babel/plugin-transform-modules-commonjs": "^7.26.3", - "@babel/plugin-transform-modules-systemjs": "^7.25.9", - "@babel/plugin-transform-modules-umd": "^7.25.9", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.9", - "@babel/plugin-transform-new-target": "^7.25.9", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.26.6", - "@babel/plugin-transform-numeric-separator": "^7.25.9", - "@babel/plugin-transform-object-rest-spread": "^7.25.9", - "@babel/plugin-transform-object-super": "^7.25.9", - "@babel/plugin-transform-optional-catch-binding": "^7.25.9", - "@babel/plugin-transform-optional-chaining": "^7.25.9", - "@babel/plugin-transform-parameters": "^7.25.9", - "@babel/plugin-transform-private-methods": "^7.25.9", - "@babel/plugin-transform-private-property-in-object": "^7.25.9", - "@babel/plugin-transform-property-literals": "^7.25.9", - "@babel/plugin-transform-regenerator": "^7.25.9", - "@babel/plugin-transform-regexp-modifiers": "^7.26.0", - "@babel/plugin-transform-reserved-words": "^7.25.9", - "@babel/plugin-transform-shorthand-properties": "^7.25.9", - "@babel/plugin-transform-spread": "^7.25.9", - "@babel/plugin-transform-sticky-regex": "^7.25.9", - "@babel/plugin-transform-template-literals": "^7.26.8", - "@babel/plugin-transform-typeof-symbol": "^7.26.7", - "@babel/plugin-transform-unicode-escapes": "^7.25.9", - "@babel/plugin-transform-unicode-property-regex": "^7.25.9", - "@babel/plugin-transform-unicode-regex": "^7.25.9", - "@babel/plugin-transform-unicode-sets-regex": "^7.25.9", + "@babel/plugin-transform-arrow-functions": "^7.27.1", + "@babel/plugin-transform-async-generator-functions": "^7.28.0", + "@babel/plugin-transform-async-to-generator": "^7.27.1", + "@babel/plugin-transform-block-scoped-functions": "^7.27.1", + "@babel/plugin-transform-block-scoping": "^7.28.0", + "@babel/plugin-transform-class-properties": "^7.27.1", + "@babel/plugin-transform-class-static-block": "^7.28.3", + "@babel/plugin-transform-classes": "^7.28.3", + "@babel/plugin-transform-computed-properties": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0", + "@babel/plugin-transform-dotall-regex": "^7.27.1", + "@babel/plugin-transform-duplicate-keys": "^7.27.1", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-dynamic-import": "^7.27.1", + "@babel/plugin-transform-explicit-resource-management": "^7.28.0", + "@babel/plugin-transform-exponentiation-operator": "^7.27.1", + "@babel/plugin-transform-export-namespace-from": "^7.27.1", + "@babel/plugin-transform-for-of": "^7.27.1", + "@babel/plugin-transform-function-name": "^7.27.1", + "@babel/plugin-transform-json-strings": "^7.27.1", + "@babel/plugin-transform-literals": "^7.27.1", + "@babel/plugin-transform-logical-assignment-operators": "^7.27.1", + "@babel/plugin-transform-member-expression-literals": "^7.27.1", + "@babel/plugin-transform-modules-amd": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-modules-systemjs": "^7.27.1", + "@babel/plugin-transform-modules-umd": "^7.27.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-new-target": "^7.27.1", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1", + "@babel/plugin-transform-numeric-separator": "^7.27.1", + "@babel/plugin-transform-object-rest-spread": "^7.28.0", + "@babel/plugin-transform-object-super": "^7.27.1", + "@babel/plugin-transform-optional-catch-binding": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/plugin-transform-private-methods": "^7.27.1", + "@babel/plugin-transform-private-property-in-object": "^7.27.1", + "@babel/plugin-transform-property-literals": "^7.27.1", + "@babel/plugin-transform-regenerator": "^7.28.3", + "@babel/plugin-transform-regexp-modifiers": "^7.27.1", + "@babel/plugin-transform-reserved-words": "^7.27.1", + "@babel/plugin-transform-shorthand-properties": "^7.27.1", + "@babel/plugin-transform-spread": "^7.27.1", + "@babel/plugin-transform-sticky-regex": "^7.27.1", + "@babel/plugin-transform-template-literals": "^7.27.1", + "@babel/plugin-transform-typeof-symbol": "^7.27.1", + "@babel/plugin-transform-unicode-escapes": "^7.27.1", + "@babel/plugin-transform-unicode-property-regex": "^7.27.1", + "@babel/plugin-transform-unicode-regex": "^7.27.1", + "@babel/plugin-transform-unicode-sets-regex": "^7.27.1", "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.11.0", - "babel-plugin-polyfill-regenerator": "^0.6.1", - "core-js-compat": "^3.40.0", + "babel-plugin-polyfill-corejs2": "^0.4.14", + "babel-plugin-polyfill-corejs3": "^0.13.0", + "babel-plugin-polyfill-regenerator": "^0.6.5", + "core-js-compat": "^3.43.0", "semver": "^6.3.1" }, "engines": { @@ -2976,13 +4165,11 @@ } }, "node_modules/@babel/runtime": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.10.tgz", - "integrity": "sha512-2WJMeRQPHKSPemqk/awGrAiuFfzBmOIPXKizAsVhWH9YJqLZ0H+HS4c8loHGgW6utJ3E/ejXQUsiGaQy2NZ9Fw==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.3.tgz", + "integrity": "sha512-9uIQ10o0WGdpP6GDhXcdOJPJuDgFtIDtN/9+ArJQ2NAfAmiuhTQdzkaTGR33v43GYS2UrSA0eX2pPPHoFVvpxA==", + "devOptional": true, "license": "MIT", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, "engines": { "node": ">=6.9.0" } @@ -3002,17 +4189,17 @@ } }, "node_modules/@babel/traverse": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.4.tgz", - "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", + "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.3", + "@babel/generator": "^7.28.5", "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.4", + "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", - "@babel/types": "^7.28.4", + "@babel/types": "^7.28.5", "debug": "^4.3.1" }, "engines": { @@ -3020,13 +4207,13 @@ } }, "node_modules/@babel/traverse/node_modules/@babel/generator": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz", - "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", + "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.28.3", - "@babel/types": "^7.28.2", + "@babel/parser": "^7.28.5", + "@babel/types": "^7.28.5", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" @@ -3036,13 +4223,13 @@ } }, "node_modules/@babel/types": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz", - "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1" + "@babel/helper-validator-identifier": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -3055,34 +4242,40 @@ "dev": true, "license": "MIT" }, - "node_modules/@cacheable/memoize": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@cacheable/memoize/-/memoize-2.0.3.tgz", - "integrity": "sha512-hl9wfQgpiydhQEIv7fkjEzTGE+tcosCXLKFDO707wYJ/78FVOlowb36djex5GdbSyeHnG62pomYLMuV/OT8Pbw==", + "node_modules/@cacheable/memory": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@cacheable/memory/-/memory-2.0.6.tgz", + "integrity": "sha512-7e8SScMocHxcAb8YhtkbMhGG+EKLRIficb1F5sjvhSYsWTZGxvg4KIDp8kgxnV2PUJ3ddPe6J9QESjKvBWRDkg==", "dev": true, "license": "MIT", "dependencies": { - "@cacheable/utils": "^2.0.3" + "@cacheable/utils": "^2.3.2", + "@keyv/bigmap": "^1.3.0", + "hookified": "^1.13.0", + "keyv": "^5.5.4" } }, - "node_modules/@cacheable/memory": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@cacheable/memory/-/memory-2.0.3.tgz", - "integrity": "sha512-R3UKy/CKOyb1LZG/VRCTMcpiMDyLH7SH3JrraRdK6kf3GweWCOU3sgvE13W3TiDRbxnDKylzKJvhUAvWl9LQOA==", + "node_modules/@cacheable/memory/node_modules/@keyv/bigmap": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@keyv/bigmap/-/bigmap-1.3.0.tgz", + "integrity": "sha512-KT01GjzV6AQD5+IYrcpoYLkCu1Jod3nau1Z7EsEuViO3TZGRacSbO9MfHmbJ1WaOXFtWLxPVj169cn2WNKPkIg==", "dev": true, "license": "MIT", "dependencies": { - "@cacheable/memoize": "^2.0.3", - "@cacheable/utils": "^2.0.3", - "@keyv/bigmap": "^1.0.2", - "hookified": "^1.12.1", - "keyv": "^5.5.3" + "hashery": "^1.2.0", + "hookified": "^1.13.0" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "keyv": "^5.5.4" } }, "node_modules/@cacheable/memory/node_modules/keyv": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.5.3.tgz", - "integrity": "sha512-h0Un1ieD+HUrzBH6dJXhod3ifSghk5Hw/2Y4/KHBziPlZecrFyE9YOTPU6eOs0V9pYl8gOs86fkr/KN8lUX39A==", + "version": "5.5.5", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.5.5.tgz", + "integrity": "sha512-FA5LmZVF1VziNc0bIdCSA1IoSVnDCqE8HJIZZv2/W8YmoAM50+tnUgJR/gQZwEeIMleuIOnRnHA/UaZRNeV4iQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3090,11 +4283,25 @@ } }, "node_modules/@cacheable/utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@cacheable/utils/-/utils-2.0.3.tgz", - "integrity": "sha512-m7Rce68cMHlAUjvWBy9Ru1Nmw5gU0SjGGtQDdhpe6E0xnbcvrIY0Epy//JU1VYYBUTzrG9jvgmTauULGKzOkWA==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@cacheable/utils/-/utils-2.3.2.tgz", + "integrity": "sha512-8kGE2P+HjfY8FglaOiW+y8qxcaQAfAhVML+i66XJR3YX5FtyDqn6Txctr3K2FrbxLKixRRYYBWMbuGciOhYNDg==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "hashery": "^1.2.0", + "keyv": "^5.5.4" + } + }, + "node_modules/@cacheable/utils/node_modules/keyv": { + "version": "5.5.5", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.5.5.tgz", + "integrity": "sha512-FA5LmZVF1VziNc0bIdCSA1IoSVnDCqE8HJIZZv2/W8YmoAM50+tnUgJR/gQZwEeIMleuIOnRnHA/UaZRNeV4iQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@keyv/serialize": "^1.1.1" + } }, "node_modules/@colors/colors": { "version": "1.5.0", @@ -3154,6 +4361,26 @@ "@csstools/css-tokenizer": "^3.0.4" } }, + "node_modules/@csstools/css-syntax-patches-for-csstree": { + "version": "1.0.20", + "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.0.20.tgz", + "integrity": "sha512-8BHsjXfSciZxjmHQOuVdW2b8WLUPts9a+mfL13/PzEviufUEW2xnvQuOlKs9dRBHgRqJ53SF/DUoK9+MZk72oQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + } + }, "node_modules/@csstools/css-tokenizer": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", @@ -3307,6 +4534,21 @@ "ms": "^2.1.1" } }, + "node_modules/@date-vir/duration": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@date-vir/duration/-/duration-8.0.0.tgz", + "integrity": "sha512-zuliBiCkSdmTTZZAYrKXB70X6SbY0iN3xaO+E0pA2tVp+zyDCdOJfhY4XSkUyIBhp7aF2HC/C2xVOIJ3n/5h8A==", + "dev": true, + "license": "(MIT or CC0 1.0)", + "dependencies": { + "@types/luxon": "^3.7.1", + "luxon": "^3.7.2", + "type-fest": "^5.0.1" + }, + "engines": { + "node": ">=22" + } + }, "node_modules/@discoveryjs/json-ext": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.6.3.tgz", @@ -3330,9 +4572,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.4.tgz", - "integrity": "sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.9.tgz", + "integrity": "sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==", "cpu": [ "ppc64" ], @@ -3347,9 +4589,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.4.tgz", - "integrity": "sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.9.tgz", + "integrity": "sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==", "cpu": [ "arm" ], @@ -3364,9 +4606,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.4.tgz", - "integrity": "sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.9.tgz", + "integrity": "sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==", "cpu": [ "arm64" ], @@ -3381,9 +4623,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.4.tgz", - "integrity": "sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.9.tgz", + "integrity": "sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==", "cpu": [ "x64" ], @@ -3398,9 +4640,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.4.tgz", - "integrity": "sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.9.tgz", + "integrity": "sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==", "cpu": [ "arm64" ], @@ -3415,9 +4657,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.4.tgz", - "integrity": "sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.9.tgz", + "integrity": "sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==", "cpu": [ "x64" ], @@ -3432,9 +4674,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.4.tgz", - "integrity": "sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.9.tgz", + "integrity": "sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==", "cpu": [ "arm64" ], @@ -3449,9 +4691,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.4.tgz", - "integrity": "sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.9.tgz", + "integrity": "sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==", "cpu": [ "x64" ], @@ -3466,9 +4708,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.4.tgz", - "integrity": "sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.9.tgz", + "integrity": "sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==", "cpu": [ "arm" ], @@ -3483,9 +4725,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.4.tgz", - "integrity": "sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.9.tgz", + "integrity": "sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==", "cpu": [ "arm64" ], @@ -3500,9 +4742,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.4.tgz", - "integrity": "sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.9.tgz", + "integrity": "sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==", "cpu": [ "ia32" ], @@ -3517,9 +4759,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.4.tgz", - "integrity": "sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.9.tgz", + "integrity": "sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==", "cpu": [ "loong64" ], @@ -3534,9 +4776,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.4.tgz", - "integrity": "sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.9.tgz", + "integrity": "sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==", "cpu": [ "mips64el" ], @@ -3551,9 +4793,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.4.tgz", - "integrity": "sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.9.tgz", + "integrity": "sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==", "cpu": [ "ppc64" ], @@ -3568,9 +4810,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.4.tgz", - "integrity": "sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.9.tgz", + "integrity": "sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==", "cpu": [ "riscv64" ], @@ -3585,9 +4827,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.4.tgz", - "integrity": "sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.9.tgz", + "integrity": "sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==", "cpu": [ "s390x" ], @@ -3602,9 +4844,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.4.tgz", - "integrity": "sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.9.tgz", + "integrity": "sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==", "cpu": [ "x64" ], @@ -3619,9 +4861,9 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.4.tgz", - "integrity": "sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.9.tgz", + "integrity": "sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==", "cpu": [ "arm64" ], @@ -3636,9 +4878,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.4.tgz", - "integrity": "sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.9.tgz", + "integrity": "sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==", "cpu": [ "x64" ], @@ -3653,9 +4895,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.4.tgz", - "integrity": "sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.9.tgz", + "integrity": "sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==", "cpu": [ "arm64" ], @@ -3670,9 +4912,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.4.tgz", - "integrity": "sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.9.tgz", + "integrity": "sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==", "cpu": [ "x64" ], @@ -3686,10 +4928,27 @@ "node": ">=18" } }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.9.tgz", + "integrity": "sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@esbuild/sunos-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.4.tgz", - "integrity": "sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.9.tgz", + "integrity": "sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==", "cpu": [ "x64" ], @@ -3704,9 +4963,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.4.tgz", - "integrity": "sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.9.tgz", + "integrity": "sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==", "cpu": [ "arm64" ], @@ -3721,9 +4980,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.4.tgz", - "integrity": "sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.9.tgz", + "integrity": "sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==", "cpu": [ "ia32" ], @@ -3738,9 +4997,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.4.tgz", - "integrity": "sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.9.tgz", + "integrity": "sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==", "cpu": [ "x64" ], @@ -3774,34 +5033,99 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", - "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "dev": true, "license": "MIT", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, + "node_modules/@eslint/config-array": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", + "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.7", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-array/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.3.tgz", + "integrity": "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==", "dev": true, "license": "MIT", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", + "espree": "^10.0.1", + "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", + "js-yaml": "^4.1.1", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -3866,13 +5190,40 @@ } }, "node_modules/@eslint/js": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", - "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "version": "9.39.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.1.tgz", + "integrity": "sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==", "dev": true, "license": "MIT", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/@fast-csv/format": { @@ -3917,44 +5268,43 @@ "license": "MIT" }, "node_modules/@fortawesome/angular-fontawesome": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@fortawesome/angular-fontawesome/-/angular-fontawesome-1.0.0.tgz", - "integrity": "sha512-EC2fYuXIuw2ld1kzJi+zysWus6OeGGfLQtbh0hW9zyyq5aBo8ZJkcJKBsVQ8E6Mg7nHyTWaXn+sdcXTPDWz+UQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@fortawesome/angular-fontawesome/-/angular-fontawesome-3.0.0.tgz", + "integrity": "sha512-+8Dd6DoJnqArfrZ5NvjHyRL64IIkTigXclbOOcFdYQ8/WFERQUDaEU6SAV8Q0JBpJhMS1McED7YCOCAE6SIVyA==", "license": "MIT", "dependencies": { - "@fortawesome/fontawesome-svg-core": "^6.7.1", + "@fortawesome/fontawesome-svg-core": "^7.0.0", "tslib": "^2.8.1" }, "peerDependencies": { - "@angular/core": "^19.0.0" + "@angular/core": "^20.0.0" } }, "node_modules/@fortawesome/angular-fontawesome/node_modules/@fortawesome/fontawesome-common-types": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.7.2.tgz", - "integrity": "sha512-Zs+YeHUC5fkt7Mg1l6XTniei3k4bwG/yo3iFUtZWd/pMx9g3fdvkSK9E0FOC+++phXOka78uJcYb8JaFkW52Xg==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-7.1.0.tgz", + "integrity": "sha512-l/BQM7fYntsCI//du+6sEnHOP6a74UixFyOYUyz2DLMXKx+6DEhfR3F2NYGE45XH1JJuIamacb4IZs9S0ZOWLA==", "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/@fortawesome/angular-fontawesome/node_modules/@fortawesome/fontawesome-svg-core": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.7.2.tgz", - "integrity": "sha512-yxtOBWDrdi5DD5o1pmVdq3WMCvnobT0LU6R8RyyVXPvFRd2o79/0NCuQoCjNTeZz9EzA9xS3JxNWfv54RIHFEA==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-7.1.0.tgz", + "integrity": "sha512-fNxRUk1KhjSbnbuBxlWSnBLKLBNun52ZBTcs22H/xEEzM6Ap81ZFTQ4bZBxVQGQgVY0xugKGoRcCbaKjLQ3XZA==", "license": "MIT", "dependencies": { - "@fortawesome/fontawesome-common-types": "6.7.2" + "@fortawesome/fontawesome-common-types": "7.1.0" }, "engines": { "node": ">=6" } }, "node_modules/@fortawesome/fontawesome-common-types": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.2.1.tgz", - "integrity": "sha512-Sz07mnQrTekFWLz5BMjOzHl/+NooTdW8F8kDQxjWwbpOJcnoSg4vUDng8d/WR1wOxM0O+CY9Zw0nR054riNYtQ==", - "hasInstallScript": true, + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.7.2.tgz", + "integrity": "sha512-Zs+YeHUC5fkt7Mg1l6XTniei3k4bwG/yo3iFUtZWd/pMx9g3fdvkSK9E0FOC+++phXOka78uJcYb8JaFkW52Xg==", "license": "MIT", "engines": { "node": ">=6" @@ -3970,13 +5320,12 @@ } }, "node_modules/@fortawesome/fontawesome-svg-core": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.2.1.tgz", - "integrity": "sha512-HELwwbCz6C1XEcjzyT1Jugmz2NNklMrSPjZOWMlc+ZsHIVk+XOvOXLGGQtFBwSyqfJDNgRq4xBCwWOaZ/d9DEA==", - "hasInstallScript": true, + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.7.2.tgz", + "integrity": "sha512-yxtOBWDrdi5DD5o1pmVdq3WMCvnobT0LU6R8RyyVXPvFRd2o79/0NCuQoCjNTeZz9EzA9xS3JxNWfv54RIHFEA==", "license": "MIT", "dependencies": { - "@fortawesome/fontawesome-common-types": "6.2.1" + "@fortawesome/fontawesome-common-types": "6.7.2" }, "engines": { "node": ">=6" @@ -3994,66 +5343,40 @@ "node": ">=6" } }, - "node_modules/@fortawesome/free-brands-svg-icons/node_modules/@fortawesome/fontawesome-common-types": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.7.2.tgz", - "integrity": "sha512-Zs+YeHUC5fkt7Mg1l6XTniei3k4bwG/yo3iFUtZWd/pMx9g3fdvkSK9E0FOC+++phXOka78uJcYb8JaFkW52Xg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/@fortawesome/free-solid-svg-icons": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.2.1.tgz", - "integrity": "sha512-oKuqrP5jbfEPJWTij4sM+/RvgX+RMFwx3QZCZcK9PrBDgxC35zuc7AOFsyMjMd/PIFPeB2JxyqDr5zs/DZFPPw==", - "hasInstallScript": true, + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.7.2.tgz", + "integrity": "sha512-GsBrnOzU8uj0LECDfD5zomZJIjrPhIlWU82AHwa2s40FKH+kcxQaBvBo3Z4TxyZHIyX8XTDxsyA33/Vx9eFuQA==", "license": "(CC-BY-4.0 AND MIT)", "dependencies": { - "@fortawesome/fontawesome-common-types": "6.2.1" + "@fortawesome/fontawesome-common-types": "6.7.2" }, "engines": { "node": ">=6" } }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", - "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", - "deprecated": "Use @eslint/config-array instead", + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@humanwhocodes/object-schema": "^2.0.3", - "debug": "^4.3.1", - "minimatch": "^3.0.5" + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.0" }, "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" + "node": ">=18.18.0" } }, "node_modules/@humanwhocodes/module-importer": { @@ -4070,18 +5393,24 @@ "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "deprecated": "Use @eslint/object-schema instead", + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", "dev": true, - "license": "BSD-3-Clause" + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } }, "node_modules/@inquirer/ansi": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.0.tgz", - "integrity": "sha512-JWaTfCxI1eTmJ1BIv86vUfjVatOdxwD0DAVKYevY8SazeUUZtW+tNbsdejVO1GYE0GXJW1N1ahmiC3TFd+7wZA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.2.tgz", + "integrity": "sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==", "dev": true, "license": "MIT", "engines": { @@ -4089,17 +5418,17 @@ } }, "node_modules/@inquirer/checkbox": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.2.4.tgz", - "integrity": "sha512-2n9Vgf4HSciFq8ttKXk+qy+GsyTXPV1An6QAwe/8bkbbqvG4VW1I/ZY1pNu2rf+h9bdzMLPbRSfcNxkHBy/Ydw==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.3.2.tgz", + "integrity": "sha512-VXukHf0RR1doGe6Sm4F0Em7SWYLTHSsbGfJdS9Ja2bX5/D5uwVOEjr07cncLROdBvmnvCATYEWlHqYmXv2IlQA==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/ansi": "^1.0.0", - "@inquirer/core": "^10.2.2", - "@inquirer/figures": "^1.0.13", - "@inquirer/type": "^3.0.8", - "yoctocolors-cjs": "^2.1.2" + "@inquirer/ansi": "^1.0.2", + "@inquirer/core": "^10.3.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" }, "engines": { "node": ">=18" @@ -4114,64 +5443,13 @@ } }, "node_modules/@inquirer/confirm": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.6.tgz", - "integrity": "sha512-6ZXYK3M1XmaVBZX6FCfChgtponnL0R6I7k8Nu+kaoNkT828FVZTcca1MqmWQipaW2oNREQl5AaPCUOOCVNdRMw==", + "version": "5.1.14", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.14.tgz", + "integrity": "sha512-5yR4IBfe0kXe59r1YCTG8WXkUbl7Z35HK87Sw+WUyGD8wNUx7JvY7laahzeytyE1oLn74bQnL7hstctQxisQ8Q==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.7", - "@inquirer/type": "^3.0.4" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/core": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.2.2.tgz", - "integrity": "sha512-yXq/4QUnk4sHMtmbd7irwiepjB8jXU0kkFRL4nr/aDBA2mDz13cMakEWdDwX3eSCTkk03kwcndD1zfRAIlELxA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/ansi": "^1.0.0", - "@inquirer/figures": "^1.0.13", - "@inquirer/type": "^3.0.8", - "cli-width": "^4.1.0", - "mute-stream": "^2.0.0", - "signal-exit": "^4.1.0", - "wrap-ansi": "^6.2.0", - "yoctocolors-cjs": "^2.1.2" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/editor": { - "version": "4.2.20", - "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.20.tgz", - "integrity": "sha512-7omh5y5bK672Q+Brk4HBbnHNowOZwrb/78IFXdrEB9PfdxL3GudQyDk8O9vQ188wj3xrEebS2M9n18BjJoI83g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.2.2", - "@inquirer/external-editor": "^1.0.2", + "@inquirer/core": "^10.1.15", "@inquirer/type": "^3.0.8" }, "engines": { @@ -4186,16 +5464,67 @@ } } }, - "node_modules/@inquirer/expand": { - "version": "4.0.20", - "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.20.tgz", - "integrity": "sha512-Dt9S+6qUg94fEvgn54F2Syf0Z3U8xmnBI9ATq2f5h9xt09fs2IJXSCIXyyVHwvggKWFXEY/7jATRo2K6Dkn6Ow==", + "node_modules/@inquirer/core": { + "version": "10.3.2", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.2.tgz", + "integrity": "sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.2.2", - "@inquirer/type": "^3.0.8", - "yoctocolors-cjs": "^2.1.2" + "@inquirer/ansi": "^1.0.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "cli-width": "^4.1.0", + "mute-stream": "^2.0.0", + "signal-exit": "^4.1.0", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/editor": { + "version": "4.2.23", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.23.tgz", + "integrity": "sha512-aLSROkEwirotxZ1pBaP8tugXRFCxW94gwrQLxXfrZsKkfjOYC1aRvAZuhpJOb5cu4IBTJdsCigUlf2iCOu4ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/external-editor": "^1.0.3", + "@inquirer/type": "^3.0.10" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/expand": { + "version": "4.0.23", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.23.tgz", + "integrity": "sha512-nRzdOyFYnpeYTTR2qFwEVmIWypzdAx/sIkCMeTNTcflFOovfqUk+HcFhQQVBftAh9gmGrpFj6QcGEqrDMDOiew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" }, "engines": { "node": ">=18" @@ -4210,13 +5539,13 @@ } }, "node_modules/@inquirer/external-editor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.2.tgz", - "integrity": "sha512-yy9cOoBnx58TlsPrIxauKIFQTiyH+0MK4e97y4sV9ERbI+zDxw7i2hxHLCIEGIE/8PPvDxGhgzIOTSOWcs6/MQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.3.tgz", + "integrity": "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==", "dev": true, "license": "MIT", "dependencies": { - "chardet": "^2.1.0", + "chardet": "^2.1.1", "iconv-lite": "^0.7.0" }, "engines": { @@ -4232,9 +5561,9 @@ } }, "node_modules/@inquirer/figures": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.13.tgz", - "integrity": "sha512-lGPVU3yO9ZNqA7vTYz26jny41lE7yoQansmqdMLBEfqaGsmdg7V3W9mK9Pvb5IL4EVZ9GnSDGMO/cJXud5dMaw==", + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.15.tgz", + "integrity": "sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==", "dev": true, "license": "MIT", "engines": { @@ -4242,14 +5571,14 @@ } }, "node_modules/@inquirer/input": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.2.4.tgz", - "integrity": "sha512-cwSGpLBMwpwcZZsc6s1gThm0J+it/KIJ+1qFL2euLmSKUMGumJ5TcbMgxEjMjNHRGadouIYbiIgruKoDZk7klw==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.3.1.tgz", + "integrity": "sha512-kN0pAM4yPrLjJ1XJBjDxyfDduXOuQHrBB8aLDMueuwUGn+vNpF7Gq7TvyVxx8u4SHlFFj4trmj+a2cbpG4Jn1g==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.2.2", - "@inquirer/type": "^3.0.8" + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" }, "engines": { "node": ">=18" @@ -4264,14 +5593,14 @@ } }, "node_modules/@inquirer/number": { - "version": "3.0.20", - "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.20.tgz", - "integrity": "sha512-bbooay64VD1Z6uMfNehED2A2YOPHSJnQLs9/4WNiV/EK+vXczf/R988itL2XLDGTgmhMF2KkiWZo+iEZmc4jqg==", + "version": "3.0.23", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.23.tgz", + "integrity": "sha512-5Smv0OK7K0KUzUfYUXDXQc9jrf8OHo4ktlEayFlelCjwMXz0299Y8OrI+lj7i4gCBY15UObk76q0QtxjzFcFcg==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.2.2", - "@inquirer/type": "^3.0.8" + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" }, "engines": { "node": ">=18" @@ -4286,15 +5615,15 @@ } }, "node_modules/@inquirer/password": { - "version": "4.0.20", - "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.20.tgz", - "integrity": "sha512-nxSaPV2cPvvoOmRygQR+h0B+Av73B01cqYLcr7NXcGXhbmsYfUb8fDdw2Us1bI2YsX+VvY7I7upgFYsyf8+Nug==", + "version": "4.0.23", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.23.tgz", + "integrity": "sha512-zREJHjhT5vJBMZX/IUbyI9zVtVfOLiTO66MrF/3GFZYZ7T4YILW5MSkEYHceSii/KtRk+4i3RE7E1CUXA2jHcA==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/ansi": "^1.0.0", - "@inquirer/core": "^10.2.2", - "@inquirer/type": "^3.0.8" + "@inquirer/ansi": "^1.0.2", + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" }, "engines": { "node": ">=18" @@ -4309,22 +5638,22 @@ } }, "node_modules/@inquirer/prompts": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.3.2.tgz", - "integrity": "sha512-G1ytyOoHh5BphmEBxSwALin3n1KGNYB6yImbICcRQdzXfOGbuJ9Jske/Of5Sebk339NSGGNfUshnzK8YWkTPsQ==", + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.8.2.tgz", + "integrity": "sha512-nqhDw2ZcAUrKNPwhjinJny903bRhI0rQhiDz1LksjeRxqa36i3l75+4iXbOy0rlDpLJGxqtgoPavQjmmyS5UJw==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/checkbox": "^4.1.2", - "@inquirer/confirm": "^5.1.6", - "@inquirer/editor": "^4.2.7", - "@inquirer/expand": "^4.0.9", - "@inquirer/input": "^4.1.6", - "@inquirer/number": "^3.0.9", - "@inquirer/password": "^4.0.9", - "@inquirer/rawlist": "^4.0.9", - "@inquirer/search": "^3.0.9", - "@inquirer/select": "^4.0.9" + "@inquirer/checkbox": "^4.2.1", + "@inquirer/confirm": "^5.1.14", + "@inquirer/editor": "^4.2.17", + "@inquirer/expand": "^4.0.17", + "@inquirer/input": "^4.2.1", + "@inquirer/number": "^3.0.17", + "@inquirer/password": "^4.0.17", + "@inquirer/rawlist": "^4.1.5", + "@inquirer/search": "^3.1.0", + "@inquirer/select": "^4.3.1" }, "engines": { "node": ">=18" @@ -4339,15 +5668,15 @@ } }, "node_modules/@inquirer/rawlist": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.8.tgz", - "integrity": "sha512-CQ2VkIASbgI2PxdzlkeeieLRmniaUU1Aoi5ggEdm6BIyqopE9GuDXdDOj9XiwOqK5qm72oI2i6J+Gnjaa26ejg==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.11.tgz", + "integrity": "sha512-+LLQB8XGr3I5LZN/GuAHo+GpDJegQwuPARLChlMICNdwW7OwV2izlCSCxN6cqpL0sMXmbKbFcItJgdQq5EBXTw==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.2.2", - "@inquirer/type": "^3.0.8", - "yoctocolors-cjs": "^2.1.2" + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" }, "engines": { "node": ">=18" @@ -4362,16 +5691,16 @@ } }, "node_modules/@inquirer/search": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.1.3.tgz", - "integrity": "sha512-D5T6ioybJJH0IiSUK/JXcoRrrm8sXwzrVMjibuPs+AgxmogKslaafy1oxFiorNI4s3ElSkeQZbhYQgLqiL8h6Q==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.2.2.tgz", + "integrity": "sha512-p2bvRfENXCZdWF/U2BXvnSI9h+tuA8iNqtUKb9UWbmLYCRQxd8WkvwWvYn+3NgYaNwdUkHytJMGG4MMLucI1kA==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.2.2", - "@inquirer/figures": "^1.0.13", - "@inquirer/type": "^3.0.8", - "yoctocolors-cjs": "^2.1.2" + "@inquirer/core": "^10.3.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" }, "engines": { "node": ">=18" @@ -4386,17 +5715,17 @@ } }, "node_modules/@inquirer/select": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.3.4.tgz", - "integrity": "sha512-Qp20nySRmfbuJBBsgPU7E/cL62Hf250vMZRzYDcBHty2zdD1kKCnoDFWRr0WO2ZzaXp3R7a4esaVGJUx0E6zvA==", + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.4.2.tgz", + "integrity": "sha512-l4xMuJo55MAe+N7Qr4rX90vypFwCajSakx59qe/tMaC1aEHWLyw68wF4o0A4SLAY4E0nd+Vt+EyskeDIqu1M6w==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/ansi": "^1.0.0", - "@inquirer/core": "^10.2.2", - "@inquirer/figures": "^1.0.13", - "@inquirer/type": "^3.0.8", - "yoctocolors-cjs": "^2.1.2" + "@inquirer/ansi": "^1.0.2", + "@inquirer/core": "^10.3.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" }, "engines": { "node": ">=18" @@ -4411,9 +5740,9 @@ } }, "node_modules/@inquirer/type": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.8.tgz", - "integrity": "sha512-lg9Whz8onIHRthWaN1Q9EGLa/0LFJjyM8mEUbL1eTi6yMGvBf8gvyDLtxSXztQsxMvhxxNpJYrwa1YHdq+w4Jw==", + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.10.tgz", + "integrity": "sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==", "dev": true, "license": "MIT", "engines": { @@ -4428,6 +5757,29 @@ } } }, + "node_modules/@isaacs/balanced-match": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", + "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@isaacs/brace-expansion": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", + "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@isaacs/balanced-match": "^4.0.1" + }, + "engines": { + "node": "20 || >=22" + } + }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -4579,9 +5931,9 @@ } }, "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", "dev": true, "license": "MIT", "dependencies": { @@ -5131,9 +6483,9 @@ } }, "node_modules/@jsonjoy.com/buffers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-1.0.0.tgz", - "integrity": "sha512-NDigYR3PHqCnQLXYyoLbnEdzMMvzeiCWo1KOut7Q0CoIqg9tUAPKJ1iq/2nFhc5kZtexzutNY0LFjdwWL3Dw3Q==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-1.2.1.tgz", + "integrity": "sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==", "dev": true, "license": "Apache-2.0", "peer": true, @@ -5167,20 +6519,21 @@ } }, "node_modules/@jsonjoy.com/json-pack": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.14.0.tgz", - "integrity": "sha512-LpWbYgVnKzphN5S6uss4M25jJ/9+m6q6UJoeN6zTkK4xAGhKsiBRPVeF7OYMWonn5repMQbE5vieRXcMUrKDKw==", + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.21.0.tgz", + "integrity": "sha512-+AKG+R2cfZMShzrF2uQw34v3zbeDYUqnQ+jg7ORic3BGtfw9p/+N6RJbq/kkV8JmYZaINknaEQ2m0/f693ZPpg==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { "@jsonjoy.com/base64": "^1.1.2", - "@jsonjoy.com/buffers": "^1.0.0", + "@jsonjoy.com/buffers": "^1.2.0", "@jsonjoy.com/codegen": "^1.0.0", - "@jsonjoy.com/json-pointer": "^1.0.1", + "@jsonjoy.com/json-pointer": "^1.0.2", "@jsonjoy.com/util": "^1.9.0", "hyperdyperid": "^1.2.0", - "thingies": "^2.5.0" + "thingies": "^2.5.0", + "tree-dump": "^1.1.0" }, "engines": { "node": ">=10.0" @@ -5237,19 +6590,6 @@ "tslib": "2" } }, - "node_modules/@keyv/bigmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@keyv/bigmap/-/bigmap-1.0.2.tgz", - "integrity": "sha512-KR03xkEZlAZNF4IxXgVXb+uNIVNvwdh8UwI0cnc7WI6a+aQcDp8GL80qVfeB4E5NpsKJzou5jU0r6yLSSbMOtA==", - "dev": true, - "license": "MIT", - "dependencies": { - "hookified": "^1.12.1" - }, - "engines": { - "node": ">= 18" - } - }, "node_modules/@keyv/serialize": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@keyv/serialize/-/serialize-1.1.1.tgz", @@ -5271,49 +6611,10 @@ "license": "MIT", "peer": true }, - "node_modules/@listr2/prompt-adapter-inquirer": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/@listr2/prompt-adapter-inquirer/-/prompt-adapter-inquirer-2.0.18.tgz", - "integrity": "sha512-0hz44rAcrphyXcA8IS7EJ2SCoaBZD2u5goE8S/e+q/DL+dOGpqpcLidVOFeLG3VgML62SXmfRLAhWt0zL1oW4Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/type": "^1.5.5" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "@inquirer/prompts": ">= 3 < 8" - } - }, - "node_modules/@listr2/prompt-adapter-inquirer/node_modules/@inquirer/type": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-1.5.5.tgz", - "integrity": "sha512-MzICLu4yS7V8AA61sANROZ9vT1H3ooca5dSmI1FjZkzq7o/koMsRfQSzRtFo+F3Ao4Sf1C0bpLKejpKB/+j6MA==", - "dev": true, - "license": "MIT", - "dependencies": { - "mute-stream": "^1.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@listr2/prompt-adapter-inquirer/node_modules/mute-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", - "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, "node_modules/@lmdb/lmdb-darwin-arm64": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.2.6.tgz", - "integrity": "sha512-yF/ih9EJJZc72psFQbwnn8mExIWfTnzWJg+N02hnpXtDPETYLmQswIMBn7+V88lfCaFrMozJsUvcEQIkEPU0Gg==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.4.2.tgz", + "integrity": "sha512-NK80WwDoODyPaSazKbzd3NEJ3ygePrkERilZshxBViBARNz21rmediktGHExoj9n5t9+ChlgLlxecdFKLCuCKg==", "cpu": [ "arm64" ], @@ -5325,9 +6626,9 @@ ] }, "node_modules/@lmdb/lmdb-darwin-x64": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.2.6.tgz", - "integrity": "sha512-5BbCumsFLbCi586Bb1lTWQFkekdQUw8/t8cy++Uq251cl3hbDIGEwD9HAwh8H6IS2F6QA9KdKmO136LmipRNkg==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.4.2.tgz", + "integrity": "sha512-zevaowQNmrp3U7Fz1s9pls5aIgpKRsKb3dZWDINtLiozh3jZI9fBrI19lYYBxqdyiIyNdlyiidPnwPShj4aK+w==", "cpu": [ "x64" ], @@ -5339,9 +6640,9 @@ ] }, "node_modules/@lmdb/lmdb-linux-arm": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.2.6.tgz", - "integrity": "sha512-+6XgLpMb7HBoWxXj+bLbiiB4s0mRRcDPElnRS3LpWRzdYSe+gFk5MT/4RrVNqd2MESUDmb53NUXw1+BP69bjiQ==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.4.2.tgz", + "integrity": "sha512-OmHCULY17rkx/RoCoXlzU7LyR8xqrksgdYWwtYa14l/sseezZ8seKWXcogHcjulBddER5NnEFV4L/Jtr2nyxeg==", "cpu": [ "arm" ], @@ -5353,9 +6654,9 @@ ] }, "node_modules/@lmdb/lmdb-linux-arm64": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.2.6.tgz", - "integrity": "sha512-l5VmJamJ3nyMmeD1ANBQCQqy7do1ESaJQfKPSm2IG9/ADZryptTyCj8N6QaYgIWewqNUrcbdMkJajRQAt5Qjfg==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.4.2.tgz", + "integrity": "sha512-ZBEfbNZdkneebvZs98Lq30jMY8V9IJzckVeigGivV7nTHJc+89Ctomp1kAIWKlwIG0ovCDrFI448GzFPORANYg==", "cpu": [ "arm64" ], @@ -5367,9 +6668,9 @@ ] }, "node_modules/@lmdb/lmdb-linux-x64": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.2.6.tgz", - "integrity": "sha512-nDYT8qN9si5+onHYYaI4DiauDMx24OAiuZAUsEqrDy+ja/3EbpXPX/VAkMV8AEaQhy3xc4dRC+KcYIvOFefJ4Q==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.4.2.tgz", + "integrity": "sha512-vL9nM17C77lohPYE4YaAQvfZCSVJSryE4fXdi8M7uWPBnU+9DJabgKVAeyDb84ZM2vcFseoBE4/AagVtJeRE7g==", "cpu": [ "x64" ], @@ -5380,10 +6681,24 @@ "linux" ] }, + "node_modules/@lmdb/lmdb-win32-arm64": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-arm64/-/lmdb-win32-arm64-3.4.2.tgz", + "integrity": "sha512-SXWjdBfNDze4ZPeLtYIzsIeDJDJ/SdsA0pEXcUBayUIMO0FQBHfVZZyHXQjjHr4cvOAzANBgIiqaXRwfMhzmLw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@lmdb/lmdb-win32-x64": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.2.6.tgz", - "integrity": "sha512-XlqVtILonQnG+9fH2N3Aytria7P/1fwDgDhl29rde96uH2sLB8CHORIf2PfuLVzFQJ7Uqp8py9AYwr3ZUCFfWg==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.4.2.tgz", + "integrity": "sha512-IY+r3bxKW6Q6sIPiMC0L533DEfRJSXibjSI3Ft/w9Q8KQBNqEIvUFXt+09wV8S5BRk0a8uSF19YWxuRwEfI90g==", "cpu": [ "x64" ], @@ -5394,6 +6709,303 @@ "win32" ] }, + "node_modules/@modelcontextprotocol/sdk": { + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.24.0.tgz", + "integrity": "sha512-D8h5KXY2vHFW8zTuxn2vuZGN0HGrQ5No6LkHwlEA9trVgNdPL3TF1dSqKA7Dny6BbBYKSW/rOBDXdC8KJAjUCg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.17.1", + "ajv-formats": "^3.0.1", + "content-type": "^1.0.5", + "cors": "^2.8.5", + "cross-spawn": "^7.0.5", + "eventsource": "^3.0.2", + "eventsource-parser": "^3.0.0", + "express": "^5.0.1", + "express-rate-limit": "^7.5.0", + "jose": "^6.1.1", + "pkce-challenge": "^5.0.0", + "raw-body": "^3.0.0", + "zod": "^3.25 || ^4.0", + "zod-to-json-schema": "^3.25.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@cfworker/json-schema": "^4.1.1", + "zod": "^3.25 || ^4.0" + }, + "peerDependenciesMeta": { + "@cfworker/json-schema": { + "optional": true + }, + "zod": { + "optional": false + } + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/body-parser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.1.tgz", + "integrity": "sha512-nfDwkulwiZYQIGwxdy0RUmowMhKcFVcYXUU7m4QlKYim1rUtg83xm2yjZ40QjDuc291AJjjeSc9b++AWHSgSHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.3", + "http-errors": "^2.0.0", + "iconv-lite": "^0.7.0", + "on-finished": "^2.4.1", + "qs": "^6.14.0", + "raw-body": "^3.0.1", + "type-is": "^2.0.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/content-disposition": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", + "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/express": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", + "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.1", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "depd": "^2.0.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/finalhandler": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", + "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/raw-body": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", + "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.7.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/send": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", + "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.5", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "mime-types": "^3.0.1", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/serve-static": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", + "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/type-is": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "dev": true, + "license": "MIT", + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.3.tgz", @@ -5802,20 +7414,20 @@ } }, "node_modules/@ngtools/webpack": { - "version": "19.2.17", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-19.2.17.tgz", - "integrity": "sha512-HpbOLwS8tIW041UXcMqwfySqpZ9ztObH8U4NWKwjPBe0S5UDnF6doW2rS3GQm71hkiuB8sqbxOWz5I/NNvZFNQ==", + "version": "20.3.13", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-20.3.13.tgz", + "integrity": "sha512-7GyH55pOy8XUwo1lVWHzjZoAmSLtRT/vQbMn43x7WDl8pymAbi5zfwE/cnIX+5xgUOvkmT8sW9gJAD19rkASag==", "dev": true, "license": "MIT", "peer": true, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" }, "peerDependencies": { - "@angular/compiler-cli": "^19.0.0 || ^19.2.0-next.0", - "typescript": ">=5.5 <5.9", + "@angular/compiler-cli": "^20.0.0", + "typescript": ">=5.8 <6.0", "webpack": "^5.54.0" } }, @@ -6030,6 +7642,26 @@ "node": "^18.17.0 || >=20.5.0" } }, + "node_modules/@npmcli/package-json/node_modules/hosted-git-info": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-8.1.0.tgz", + "integrity": "sha512-Rw/B2DNQaPBICNXEm8balFz9a6WpZrkCGpcWFpy7nCj+NyhSdqXipmfvtmWt9xGfp0wZnBxB+iVpLmQMYt47Tw==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/package-json/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, "node_modules/@npmcli/promise-spawn": { "version": "8.0.3", "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-8.0.3.tgz", @@ -6480,9 +8112,9 @@ } }, "node_modules/@puppeteer/browsers": { - "version": "2.10.10", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.10.10.tgz", - "integrity": "sha512-3ZG500+ZeLql8rE0hjfhkycJjDj0pI/btEh3L9IkWUYcOrgP0xCNRq3HbtbqOPbvDhFaAWD88pDFtlLv8ns8gA==", + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.11.0.tgz", + "integrity": "sha512-n6oQX6mYkG8TRPuPXmbPidkUbsSRalhmaaVAQxvH1IkQy63cwsH+kOjB3e4cpCDHg0aSvsiX9bQ4s2VB6mGWUQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -6490,8 +8122,8 @@ "extract-zip": "^2.0.1", "progress": "^2.0.3", "proxy-agent": "^6.5.0", - "semver": "^7.7.2", - "tar-fs": "^3.1.0", + "semver": "^7.7.3", + "tar-fs": "^3.1.1", "yargs": "^17.7.2" }, "bin": { @@ -6501,23 +8133,10 @@ "node": ">=18" } }, - "node_modules/@puppeteer/browsers/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/@rollup/rollup-android-arm-eabi": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.34.8.tgz", - "integrity": "sha512-q217OSE8DTp8AFHuNHXo0Y86e1wtlfVrXiAlwkIvGRQv9zbc6mE3sjIVfwI8sYUyNxwOg0j/Vm1RKM04JcWLJw==", + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.3.tgz", + "integrity": "sha512-h6cqHGZ6VdnwliFG1NXvMPTy/9PS3h8oLh7ImwR+kl+oYnQizgjxsONmmPSb2C66RksfkfIxEVtDSEcJiO0tqw==", "cpu": [ "arm" ], @@ -6529,9 +8148,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.34.8.tgz", - "integrity": "sha512-Gigjz7mNWaOL9wCggvoK3jEIUUbGul656opstjaUSGC3eT0BM7PofdAJaBfPFWWkXNVAXbaQtC99OCg4sJv70Q==", + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.52.3.tgz", + "integrity": "sha512-wd+u7SLT/u6knklV/ifG7gr5Qy4GUbH2hMWcDauPFJzmCZUAJ8L2bTkVXC2niOIxp8lk3iH/QX8kSrUxVZrOVw==", "cpu": [ "arm64" ], @@ -6543,9 +8162,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.8.tgz", - "integrity": "sha512-02rVdZ5tgdUNRxIUrFdcMBZQoaPMrxtwSb+/hOfBdqkatYHR3lZ2A2EGyHq2sGOd0Owk80oV3snlDASC24He3Q==", + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.3.tgz", + "integrity": "sha512-lj9ViATR1SsqycwFkJCtYfQTheBdvlWJqzqxwc9f2qrcVrQaF/gCuBRTiTolkRWS6KvNxSk4KHZWG7tDktLgjg==", "cpu": [ "arm64" ], @@ -6557,9 +8176,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.8.tgz", - "integrity": "sha512-qIP/elwR/tq/dYRx3lgwK31jkZvMiD6qUtOycLhTzCvrjbZ3LjQnEM9rNhSGpbLXVJYQ3rq39A6Re0h9tU2ynw==", + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.52.3.tgz", + "integrity": "sha512-+Dyo7O1KUmIsbzx1l+4V4tvEVnVQqMOIYtrxK7ncLSknl1xnMHLgn7gddJVrYPNZfEB8CIi3hK8gq8bDhb3h5A==", "cpu": [ "x64" ], @@ -6571,9 +8190,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.34.8.tgz", - "integrity": "sha512-IQNVXL9iY6NniYbTaOKdrlVP3XIqazBgJOVkddzJlqnCpRi/yAeSOa8PLcECFSQochzqApIOE1GHNu3pCz+BDA==", + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.52.3.tgz", + "integrity": "sha512-u9Xg2FavYbD30g3DSfNhxgNrxhi6xVG4Y6i9Ur1C7xUuGDW3banRbXj+qgnIrwRN4KeJ396jchwy9bCIzbyBEQ==", "cpu": [ "arm64" ], @@ -6585,9 +8204,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.34.8.tgz", - "integrity": "sha512-TYXcHghgnCqYFiE3FT5QwXtOZqDj5GmaFNTNt3jNC+vh22dc/ukG2cG+pi75QO4kACohZzidsq7yKTKwq/Jq7Q==", + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.52.3.tgz", + "integrity": "sha512-5M8kyi/OX96wtD5qJR89a/3x5x8x5inXBZO04JWhkQb2JWavOWfjgkdvUqibGJeNNaz1/Z1PPza5/tAPXICI6A==", "cpu": [ "x64" ], @@ -6599,9 +8218,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.34.8.tgz", - "integrity": "sha512-A4iphFGNkWRd+5m3VIGuqHnG3MVnqKe7Al57u9mwgbyZ2/xF9Jio72MaY7xxh+Y87VAHmGQr73qoKL9HPbXj1g==", + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.52.3.tgz", + "integrity": "sha512-IoerZJ4l1wRMopEHRKOO16e04iXRDyZFZnNZKrWeNquh5d6bucjezgd+OxG03mOMTnS1x7hilzb3uURPkJ0OfA==", "cpu": [ "arm" ], @@ -6613,9 +8232,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.34.8.tgz", - "integrity": "sha512-S0lqKLfTm5u+QTxlFiAnb2J/2dgQqRy/XvziPtDd1rKZFXHTyYLoVL58M/XFwDI01AQCDIevGLbQrMAtdyanpA==", + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.52.3.tgz", + "integrity": "sha512-ZYdtqgHTDfvrJHSh3W22TvjWxwOgc3ThK/XjgcNGP2DIwFIPeAPNsQxrJO5XqleSlgDux2VAoWQ5iJrtaC1TbA==", "cpu": [ "arm" ], @@ -6627,9 +8246,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.8.tgz", - "integrity": "sha512-jpz9YOuPiSkL4G4pqKrus0pn9aYwpImGkosRKwNi+sJSkz+WU3anZe6hi73StLOQdfXYXC7hUfsQlTnjMd3s1A==", + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.52.3.tgz", + "integrity": "sha512-NcViG7A0YtuFDA6xWSgmFb6iPFzHlf5vcqb2p0lGEbT+gjrEEz8nC/EeDHvx6mnGXnGCC1SeVV+8u+smj0CeGQ==", "cpu": [ "arm64" ], @@ -6641,9 +8260,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.8.tgz", - "integrity": "sha512-KdSfaROOUJXgTVxJNAZ3KwkRc5nggDk+06P6lgi1HLv1hskgvxHUKZ4xtwHkVYJ1Rep4GNo+uEfycCRRxht7+Q==", + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.52.3.tgz", + "integrity": "sha512-d3pY7LWno6SYNXRm6Ebsq0DJGoiLXTb83AIPCXl9fmtIQs/rXoS8SJxxUNtFbJ5MiOvs+7y34np77+9l4nfFMw==", "cpu": [ "arm64" ], @@ -6654,80 +8273,10 @@ "linux" ] }, - "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.52.4.tgz", - "integrity": "sha512-0G2c2lpYtbTuXo8KEJkDkClE/+/2AFPdPAbmaHoE870foRFs4pBrDehilMcrSScrN/fB/1HTaWO4bqw+ewBzMQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.34.8.tgz", - "integrity": "sha512-NyF4gcxwkMFRjgXBM6g2lkT58OWztZvw5KkV2K0qqSnUEqCVcqdh2jN4gQrTn/YUpAcNKyFHfoOZEer9nwo6uQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.34.8.tgz", - "integrity": "sha512-LMJc999GkhGvktHU85zNTDImZVUCJ1z/MbAJTnviiWmmjyckP5aQsHtcujMjpNdMZPT2rQEDBlJfubhs3jsMfw==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.52.4.tgz", - "integrity": "sha512-teSACug1GyZHmPDv14VNbvZFX779UqWTsd7KtTM9JIZRDI5NUwYSIS30kzI8m06gOPB//jtpqlhmraQ68b5X2g==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.34.8.tgz", - "integrity": "sha512-xAQCAHPj8nJq1PI3z8CIZzXuXCstquz7cIOL73HHdXiRcKk8Ywwqtx2wrIy23EcTn4aZ2fLJNBB8d0tQENPCmw==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.52.4.tgz", - "integrity": "sha512-1HHmsRyh845QDpEWzOFtMCph5Ts+9+yllCrREuBR/vg2RogAQGGBRC8lDPrPOMnrdOJ+mt1WLMOC2Kao/UwcvA==", + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.52.3.tgz", + "integrity": "sha512-1makPhFFVBqZE+XFg3Dkq+IkQ7JvmUrwwqaYBL2CE+ZpxPaqkGaiWFEWVGyvTwZace6WLJHwjVh/+CXbKDGPmg==", "cpu": [ "riscv64" ], @@ -6739,9 +8288,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.34.8.tgz", - "integrity": "sha512-DdePVk1NDEuc3fOe3dPPTb+rjMtuFw89gw6gVWxQFAuEqqSdDKnrwzZHrUYdac7A7dXl9Q2Vflxpme15gUWQFA==", + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.52.3.tgz", + "integrity": "sha512-jMdsML2VI5l+V7cKfZx3ak+SLlJ8fKvLJ0Eoa4b9/vCUrzXKgoKxvHqvJ/mkWhFiyp88nCkM5S2v6nIwRtPcgg==", "cpu": [ "s390x" ], @@ -6753,9 +8302,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.8.tgz", - "integrity": "sha512-8y7ED8gjxITUltTUEJLQdgpbPh1sUQ0kMTmufRF/Ns5tI9TNMNlhWtmPKKHCU0SilX+3MJkZ0zERYYGIVBYHIA==", + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.3.tgz", + "integrity": "sha512-tPgGd6bY2M2LJTA1uGq8fkSPK8ZLYjDjY+ZLK9WHncCnfIz29LIXIqUgzCR0hIefzy6Hpbe8Th5WOSwTM8E7LA==", "cpu": [ "x64" ], @@ -6767,9 +8316,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.8.tgz", - "integrity": "sha512-SCXcP0ZpGFIe7Ge+McxY5zKxiEI5ra+GT3QRxL0pMMtxPfpyLAKleZODi1zdRHkz5/BhueUrYtYVgubqe9JBNQ==", + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.52.3.tgz", + "integrity": "sha512-BCFkJjgk+WFzP+tcSMXq77ymAPIxsX9lFJWs+2JzuZTLtksJ2o5hvgTdIcZ5+oKzUDMwI0PfWzRBYAydAHF2Mw==", "cpu": [ "x64" ], @@ -6780,24 +8329,10 @@ "linux" ] }, - "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.52.4.tgz", - "integrity": "sha512-1ox+GqgRWqaB1RnyZXL8PD6E5f7YyRUJYnCqKpNzxzP0TkaUh112NDrR9Tt+C8rJ4x5G9Mk8PQR3o7Ku2RKqKA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ] - }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.8.tgz", - "integrity": "sha512-YHYsgzZgFJzTRbth4h7Or0m5O74Yda+hLin0irAIobkLQFRQd1qWmnoVfwmKm9TXIZVAD0nZ+GEb2ICicLyCnQ==", + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.52.3.tgz", + "integrity": "sha512-+zteHZdoUYLkyYKObGHieibUFLbttX2r+58l27XZauq0tcWYYuKUwY2wjeCN9oK1Um2YgH2ibd6cnX/wFD7DuA==", "cpu": [ "arm64" ], @@ -6809,9 +8344,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.34.8.tgz", - "integrity": "sha512-r3NRQrXkHr4uWy5TOjTpTYojR9XmF0j/RYgKCef+Ag46FWUTltm5ziticv8LdNsDMehjJ543x/+TJAek/xBA2w==", + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.52.3.tgz", + "integrity": "sha512-of1iHkTQSo3kr6dTIRX6t81uj/c/b15HXVsPcEElN5sS859qHrOepM5p9G41Hah+CTqSh2r8Bm56dL2z9UQQ7g==", "cpu": [ "ia32" ], @@ -6822,24 +8357,10 @@ "win32" ] }, - "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.52.4.tgz", - "integrity": "sha512-UF9KfsH9yEam0UjTwAgdK0anlQ7c8/pWPU2yVjyWcF1I1thABt6WXE47cI71pGiZ8wGvxohBoLnxM04L/wj8mQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.8.tgz", - "integrity": "sha512-U0FaE5O1BCpZSeE6gBl3c5ObhePQSfk9vDRToMmTkbhCOgW4jqvtS5LGyQ76L1fH8sM0keRp4uDTsbjiUyjk0g==", + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.3.tgz", + "integrity": "sha512-zGIbEVVXVtauFgl3MRwGWEN36P5ZGenHRMgNw88X5wEhEBpq0XrMEZwOn07+ICrwM17XO5xfMZqh0OldCH5VTA==", "cpu": [ "x64" ], @@ -6851,50 +8372,22 @@ ] }, "node_modules/@schematics/angular": { - "version": "19.2.15", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-19.2.15.tgz", - "integrity": "sha512-dz/eoFQKG09POSygpEDdlCehFIMo35HUM2rVV8lx9PfQEibpbGwl1NNQYEbqwVjTyCyD/ILyIXCWPE+EfTnG4g==", + "version": "20.3.13", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-20.3.13.tgz", + "integrity": "sha512-ETJ1budKmrkdxojo5QP6TPr6zQZYGxtWWf8NrX1cBIS851zPCmFkKyhSFLZsoksariYF/LP8ljvm8tlcIzt/XA==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.2.15", - "@angular-devkit/schematics": "19.2.15", + "@angular-devkit/core": "20.3.13", + "@angular-devkit/schematics": "20.3.13", "jsonc-parser": "3.3.1" }, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" } }, - "node_modules/@schematics/angular/node_modules/@angular-devkit/core": { - "version": "19.2.15", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.2.15.tgz", - "integrity": "sha512-pU2RZYX6vhd7uLSdLwPnuBcr0mXJSjp3EgOXKsrlQFQZevc+Qs+2JdXgIElnOT/aDqtRtriDmLlSbtdE8n3ZbA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "8.17.1", - "ajv-formats": "3.0.1", - "jsonc-parser": "3.3.1", - "picomatch": "4.0.2", - "rxjs": "7.8.1", - "source-map": "0.7.4" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "chokidar": "^4.0.0" - }, - "peerDependenciesMeta": { - "chokidar": { - "optional": true - } - } - }, "node_modules/@sigstore/bundle": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-3.1.0.tgz", @@ -6982,20 +8475,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@sindresorhus/merge-streams": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", - "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@sinonjs/commons": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", @@ -7017,9 +8496,9 @@ } }, "node_modules/@swimlane/ngx-graph": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@swimlane/ngx-graph/-/ngx-graph-10.0.0.tgz", - "integrity": "sha512-9/ZvLgTv+Df1DhOn4AYOSkYbHVvTb5sz/A06H/tUvL3w67bBtBxERpv4T2eo8AX+wHV/g4qcGgZ6FTmfQcvkbg==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@swimlane/ngx-graph/-/ngx-graph-11.0.0.tgz", + "integrity": "sha512-QmJxh97KlC70eDWGCZcyl5vzNGaRo7rGcNeLAB2o0RKSnMPm/kdMzRKFeu40zvmpyWVw2oTEjhwdVQ/08GqIyQ==", "license": "MIT", "dependencies": { "d3-dispatch": "^3.0.1", @@ -7036,10 +8515,10 @@ "webcola": "^3.4.0" }, "peerDependencies": { - "@angular/animations": "15.x || 16.x || 17.x || 18.x || 19.x", - "@angular/cdk": "15.x || 16.x || 17.x || 18.x || 19.x", - "@angular/common": "15.x || 16.x || 17.x || 18.x || 19.x", - "@angular/core": "15.x || 16.x || 17.x || 18.x || 19.x", + "@angular/animations": "18.x || 19.x || 20.x", + "@angular/cdk": "18.x || 19.x || 20.x", + "@angular/common": "18.x || 19.x || 20.x", + "@angular/core": "18.x || 19.x || 20.x", "rxjs": "7.x" } }, @@ -7094,9 +8573,9 @@ "license": "MIT" }, "node_modules/@tsconfig/node10": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", - "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.12.tgz", + "integrity": "sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==", "dev": true, "license": "MIT" }, @@ -7339,9 +8818,9 @@ "license": "MIT" }, "node_modules/@types/express": { - "version": "4.17.23", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.23.tgz", - "integrity": "sha512-Crp6WY9aTYP3qPi2wGDo9iUe/rceX01UMhnF1jmwDcKCFM6cx7YhGP/Mpr3y9AASpfHixIG0E6azCcL5OcDHsQ==", + "version": "4.17.25", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.25.tgz", + "integrity": "sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==", "dev": true, "license": "MIT", "peer": true, @@ -7349,13 +8828,13 @@ "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.33", "@types/qs": "*", - "@types/serve-static": "*" + "@types/serve-static": "^1" } }, "node_modules/@types/express-serve-static-core": { - "version": "4.19.6", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz", - "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==", + "version": "4.19.7", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.7.tgz", + "integrity": "sha512-FvPtiIf1LfhzsaIXhv/PHan/2FeQBbtBDtfX2QfvPxdUelMDEckK08SM6nqo1MIZY3RUlfA+HV8+hFUSio78qg==", "dev": true, "license": "MIT", "peer": true, @@ -7385,9 +8864,9 @@ "peer": true }, "node_modules/@types/http-proxy": { - "version": "1.17.16", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.16.tgz", - "integrity": "sha512-sdWoUajOB1cd0A8cRRQ1cfyWNbmFKLAqBB89Y8x5iYyG/mkJHc0YUH8pdWBy2omi9qtCpiIgGjuwO0dQST2l5w==", + "version": "1.17.17", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.17.tgz", + "integrity": "sha512-ED6LB+Z1AVylNTu7hdzuBqOgMnvG/ld6wGCG8wFnAzKX5uyW2K3WD52v0gnLCTK/VLpXtKckgWuyScYK6cSPaw==", "dev": true, "license": "MIT", "peer": true, @@ -7423,9 +8902,9 @@ } }, "node_modules/@types/jasmine": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-5.1.9.tgz", - "integrity": "sha512-8t4HtkW4wxiPVedMpeZ63n3vlWxEIquo/zc1Tm8ElU+SqVV7+D3Na2PWaJUp179AzTragMWVwkMv7mvty0NfyQ==", + "version": "5.1.13", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-5.1.13.tgz", + "integrity": "sha512-MYCcDkruFc92LeYZux5BC0dmqo2jk+M5UIZ4/oFnAPCXN9mCcQhLyj7F3/Za7rocVyt5YRr1MmqJqFlvQ9LVcg==", "dev": true, "license": "MIT" }, @@ -7467,8 +8946,7 @@ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@types/lodash": { "version": "4.14.132", @@ -7477,6 +8955,13 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/luxon": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.7.1.tgz", + "integrity": "sha512-H3iskjFIAn5SlJU7OuxUmTEpebK6TKB8rxZShDslBMZJ5u9S//KM1sbdAisiSrqwLQncVjnpi2OK2J51h+4lsg==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/mime": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", @@ -7551,9 +9036,9 @@ "license": "MIT" }, "node_modules/@types/send": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.0.tgz", - "integrity": "sha512-zBF6vZJn1IaMpg3xUF25VK3gd3l8zwE0ZLRX7dsQyQi+jp4E8mMDJNGDYnYse+bQhYwWERTxVwHpi3dMOq7RKQ==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", + "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", "dev": true, "license": "MIT", "peer": true, @@ -7573,9 +9058,9 @@ } }, "node_modules/@types/serve-static": { - "version": "1.15.9", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.9.tgz", - "integrity": "sha512-dOTIuqpWLyl3BBXU3maNQsS4A3zuuoYRNIvYSxxhebPfXg2mzWQEPne/nlJ37yOse6uGgR386uTpdsx4D0QZWA==", + "version": "1.15.10", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.10.tgz", + "integrity": "sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==", "dev": true, "license": "MIT", "peer": true, @@ -7586,9 +9071,9 @@ } }, "node_modules/@types/serve-static/node_modules/@types/send": { - "version": "0.17.5", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.5.tgz", - "integrity": "sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==", + "version": "0.17.6", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.6.tgz", + "integrity": "sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==", "dev": true, "license": "MIT", "peer": true, @@ -7676,9 +9161,9 @@ } }, "node_modules/@types/yargs": { - "version": "17.0.33", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", - "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "version": "17.0.35", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", + "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", "dev": true, "license": "MIT", "dependencies": { @@ -7704,17 +9189,17 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.45.0.tgz", - "integrity": "sha512-HC3y9CVuevvWCl/oyZuI47dOeDF9ztdMEfMH8/DW/Mhwa9cCLnK1oD7JoTVGW/u7kFzNZUKUoyJEqkaJh5y3Wg==", + "version": "8.48.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.48.1.tgz", + "integrity": "sha512-X63hI1bxl5ohelzr0LY5coufyl0LJNthld+abwxpCoo6Gq+hSqhKwci7MUWkXo67mzgUK6YFByhmaHmUcuBJmA==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.45.0", - "@typescript-eslint/type-utils": "8.45.0", - "@typescript-eslint/utils": "8.45.0", - "@typescript-eslint/visitor-keys": "8.45.0", + "@typescript-eslint/scope-manager": "8.48.1", + "@typescript-eslint/type-utils": "8.48.1", + "@typescript-eslint/utils": "8.48.1", + "@typescript-eslint/visitor-keys": "8.48.1", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", @@ -7728,22 +9213,22 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.45.0", + "@typescript-eslint/parser": "^8.48.1", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/parser": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.45.0.tgz", - "integrity": "sha512-TGf22kon8KW+DeKaUmOibKWktRY8b2NSAZNdtWh798COm1NWx8+xJ6iFBtk3IvLdv6+LGLJLRlyhrhEDZWargQ==", + "version": "8.48.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.48.1.tgz", + "integrity": "sha512-PC0PDZfJg8sP7cmKe6L3QIL8GZwU5aRvUFedqSIpw3B+QjRSUZeeITC2M5XKeMXEzL6wccN196iy3JLwKNvDVA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.45.0", - "@typescript-eslint/types": "8.45.0", - "@typescript-eslint/typescript-estree": "8.45.0", - "@typescript-eslint/visitor-keys": "8.45.0", + "@typescript-eslint/scope-manager": "8.48.1", + "@typescript-eslint/types": "8.48.1", + "@typescript-eslint/typescript-estree": "8.48.1", + "@typescript-eslint/visitor-keys": "8.48.1", "debug": "^4.3.4" }, "engines": { @@ -7759,14 +9244,14 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.45.0.tgz", - "integrity": "sha512-3pcVHwMG/iA8afdGLMuTibGR7pDsn9RjDev6CCB+naRsSYs2pns5QbinF4Xqw6YC/Sj3lMrm/Im0eMfaa61WUg==", + "version": "8.48.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.48.1.tgz", + "integrity": "sha512-HQWSicah4s9z2/HifRPQ6b6R7G+SBx64JlFQpgSSHWPKdvCZX57XCbszg/bapbRsOEv42q5tayTYcEFpACcX1w==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.45.0", - "@typescript-eslint/types": "^8.45.0", + "@typescript-eslint/tsconfig-utils": "^8.48.1", + "@typescript-eslint/types": "^8.48.1", "debug": "^4.3.4" }, "engines": { @@ -7781,14 +9266,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.45.0.tgz", - "integrity": "sha512-clmm8XSNj/1dGvJeO6VGH7EUSeA0FMs+5au/u3lrA3KfG8iJ4u8ym9/j2tTEoacAffdW1TVUzXO30W1JTJS7dA==", + "version": "8.48.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.48.1.tgz", + "integrity": "sha512-rj4vWQsytQbLxC5Bf4XwZ0/CKd362DkWMUkviT7DCS057SK64D5lH74sSGzhI6PDD2HCEq02xAP9cX68dYyg1w==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.45.0", - "@typescript-eslint/visitor-keys": "8.45.0" + "@typescript-eslint/types": "8.48.1", + "@typescript-eslint/visitor-keys": "8.48.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -7799,9 +9284,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.45.0.tgz", - "integrity": "sha512-aFdr+c37sc+jqNMGhH+ajxPXwjv9UtFZk79k8pLoJ6p4y0snmYpPA52GuWHgt2ZF4gRRW6odsEj41uZLojDt5w==", + "version": "8.48.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.48.1.tgz", + "integrity": "sha512-k0Jhs4CpEffIBm6wPaCXBAD7jxBtrHjrSgtfCjUvPp9AZ78lXKdTR8fxyZO5y4vWNlOvYXRtngSZNSn+H53Jkw==", "dev": true, "license": "MIT", "engines": { @@ -7816,15 +9301,15 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.45.0.tgz", - "integrity": "sha512-bpjepLlHceKgyMEPglAeULX1vixJDgaKocp0RVJ5u4wLJIMNuKtUXIczpJCPcn2waII0yuvks/5m5/h3ZQKs0A==", + "version": "8.48.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.48.1.tgz", + "integrity": "sha512-1jEop81a3LrJQLTf/1VfPQdhIY4PlGDBc/i67EVWObrtvcziysbLN3oReexHOM6N3jyXgCrkBsZpqwH0hiDOQg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.45.0", - "@typescript-eslint/typescript-estree": "8.45.0", - "@typescript-eslint/utils": "8.45.0", + "@typescript-eslint/types": "8.48.1", + "@typescript-eslint/typescript-estree": "8.48.1", + "@typescript-eslint/utils": "8.48.1", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, @@ -7841,9 +9326,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.45.0.tgz", - "integrity": "sha512-WugXLuOIq67BMgQInIxxnsSyRLFxdkJEJu8r4ngLR56q/4Q5LrbfkFRH27vMTjxEK8Pyz7QfzuZe/G15qQnVRA==", + "version": "8.48.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.48.1.tgz", + "integrity": "sha512-+fZ3LZNeiELGmimrujsDCT4CRIbq5oXdHe7chLiW8qzqyPMnn1puNstCrMNVAqwcl2FdIxkuJ4tOs/RFDBVc/Q==", "dev": true, "license": "MIT", "engines": { @@ -7855,21 +9340,20 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.45.0.tgz", - "integrity": "sha512-GfE1NfVbLam6XQ0LcERKwdTTPlLvHvXXhOeUGC1OXi4eQBoyy1iVsW+uzJ/J9jtCz6/7GCQ9MtrQ0fml/jWCnA==", + "version": "8.48.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.48.1.tgz", + "integrity": "sha512-/9wQ4PqaefTK6POVTjJaYS0bynCgzh6ClJHGSBj06XEHjkfylzB+A3qvyaXnErEZSaxhIo4YdyBgq6j4RysxDg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.45.0", - "@typescript-eslint/tsconfig-utils": "8.45.0", - "@typescript-eslint/types": "8.45.0", - "@typescript-eslint/visitor-keys": "8.45.0", + "@typescript-eslint/project-service": "8.48.1", + "@typescript-eslint/tsconfig-utils": "8.48.1", + "@typescript-eslint/types": "8.48.1", + "@typescript-eslint/visitor-keys": "8.48.1", "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", + "tinyglobby": "^0.2.15", "ts-api-utils": "^2.1.0" }, "engines": { @@ -7884,16 +9368,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.45.0.tgz", - "integrity": "sha512-bxi1ht+tLYg4+XV2knz/F7RVhU0k6VrSMc9sb8DQ6fyCTrGQLHfo7lDtN0QJjZjKkLA2ThrKuCdHEvLReqtIGg==", + "version": "8.48.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.48.1.tgz", + "integrity": "sha512-fAnhLrDjiVfey5wwFRwrweyRlCmdz5ZxXz2G/4cLn0YDLjTapmN4gcCsTBR1N2rWnZSDeWpYtgLDsJt+FpmcwA==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.45.0", - "@typescript-eslint/types": "8.45.0", - "@typescript-eslint/typescript-estree": "8.45.0" + "@typescript-eslint/scope-manager": "8.48.1", + "@typescript-eslint/types": "8.48.1", + "@typescript-eslint/typescript-estree": "8.48.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -7908,13 +9392,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.45.0.tgz", - "integrity": "sha512-qsaFBA3e09MIDAGFUrTk+dzqtfv1XPVz8t8d1f0ybTzrCY7BKiMC5cjrl1O/P7UmHsNyW90EYSkU/ZWpmXelag==", + "version": "8.48.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.48.1.tgz", + "integrity": "sha512-BmxxndzEWhE4TIEEMBs8lP3MBWN3jFPs/p6gPm/wkv02o41hI6cq9AuSmGAaTTHPtA1FTi2jBre4A9rm5ZmX+Q==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.45.0", + "@typescript-eslint/types": "8.48.1", "eslint-visitor-keys": "^4.2.1" }, "engines": { @@ -7938,13 +9422,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/@ungap/structured-clone": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", - "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", - "dev": true, - "license": "ISC" - }, "node_modules/@vendure/ngx-translate-extract": { "version": "9.4.2", "resolved": "https://registry.npmjs.org/@vendure/ngx-translate-extract/-/ngx-translate-extract-9.4.2.tgz", @@ -7974,19 +9451,6 @@ "typescript": ">=5.2.0" } }, - "node_modules/@vitejs/plugin-basic-ssl": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.2.0.tgz", - "integrity": "sha512-mkQnxTkcldAzIsomk1UuLfAu9n+kpQ3JbHcpCp7d2Oo6ITtji8pHS3QToOWjhPFvNQSnhlkAjmGbhv2QvwO/7Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.21.3" - }, - "peerDependencies": { - "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" - } - }, "node_modules/@webassemblyjs/ast": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", @@ -8266,6 +9730,20 @@ "acorn-walk": "^8.0.2" } }, + "node_modules/acorn-import-phases": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", + "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "acorn": "^8.14.0" + } + }, "node_modules/acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", @@ -8348,6 +9826,7 @@ "version": "8.17.1", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", @@ -8364,6 +9843,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "dev": true, "license": "MIT", "dependencies": { "ajv": "^8.0.0" @@ -8391,6 +9871,32 @@ "ajv": "^8.8.2" } }, + "node_modules/algoliasearch": { + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.35.0.tgz", + "integrity": "sha512-Y+moNhsqgLmvJdgTsO4GZNgsaDWv8AOGAaPeIeHKlDn/XunoAqYbA+XNpBd1dW8GOXAUDyxC9Rxc7AV4kpFcIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/abtesting": "1.1.0", + "@algolia/client-abtesting": "5.35.0", + "@algolia/client-analytics": "5.35.0", + "@algolia/client-common": "5.35.0", + "@algolia/client-insights": "5.35.0", + "@algolia/client-personalization": "5.35.0", + "@algolia/client-query-suggestions": "5.35.0", + "@algolia/client-search": "5.35.0", + "@algolia/ingestion": "1.35.0", + "@algolia/monitoring": "1.35.0", + "@algolia/recommend": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, "node_modules/ansi-colors": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", @@ -8744,9 +10250,9 @@ } }, "node_modules/autoprefixer": { - "version": "10.4.20", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", - "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", + "version": "10.4.21", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", + "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", "dev": true, "funding": [ { @@ -8765,11 +10271,11 @@ "license": "MIT", "peer": true, "dependencies": { - "browserslist": "^4.23.3", - "caniuse-lite": "^1.0.30001646", + "browserslist": "^4.24.4", + "caniuse-lite": "^1.0.30001702", "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", - "picocolors": "^1.0.1", + "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" }, "bin": { @@ -8856,22 +10362,21 @@ } }, "node_modules/babel-loader": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.2.1.tgz", - "integrity": "sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-10.0.0.tgz", + "integrity": "sha512-z8jt+EdS61AMw22nSfoNJAZ0vrtmhPRVi6ghL3rCeRZI8cdNYFiV5xeV3HbE7rlZZNmGH8BVccwWt8/ED0QOHA==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "find-cache-dir": "^4.0.0", - "schema-utils": "^4.0.0" + "find-up": "^5.0.0" }, "engines": { - "node": ">= 14.15.0" + "node": "^18.20.0 || ^20.10.0 || >=22.0.0" }, "peerDependencies": { "@babel/core": "^7.12.0", - "webpack": ">=5" + "webpack": ">=5.61.0" } }, "node_modules/babel-plugin-istanbul": { @@ -8962,15 +10467,15 @@ } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.11.1.tgz", - "integrity": "sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz", + "integrity": "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.3", - "core-js-compat": "^3.40.0" + "@babel/helper-define-polyfill-provider": "^0.6.5", + "core-js-compat": "^3.43.0" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -9041,15 +10546,23 @@ "license": "MIT" }, "node_modules/bare-events": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.7.0.tgz", - "integrity": "sha512-b3N5eTW1g7vXkw+0CXh/HazGTcO5KYuu/RCNaJbDMPI6LHDi+7qe8EmxKUVe1sUbY2KZOVZFyj62x0OEz9qyAA==", - "license": "Apache-2.0" + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.8.2.tgz", + "integrity": "sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==", + "license": "Apache-2.0", + "peerDependencies": { + "bare-abort-controller": "*" + }, + "peerDependenciesMeta": { + "bare-abort-controller": { + "optional": true + } + } }, "node_modules/bare-fs": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.4.5.tgz", - "integrity": "sha512-TCtu93KGLu6/aiGWzMr12TmSRS6nKdfhAnzTQRbXoSWxkbb9eRd53jQ51jG7g1gYjjtto3hbBrrhzg6djcgiKg==", + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.5.2.tgz", + "integrity": "sha512-veTnRzkb6aPHOvSKIOy60KzURfBdUflr5VReI+NSaPL6xf+XLdONQgZgpYvUuZLVQ8dCqxpBAudaOM1+KpAUxw==", "dev": true, "license": "Apache-2.0", "optional": true, @@ -9118,9 +10631,9 @@ } }, "node_modules/bare-url": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.2.2.tgz", - "integrity": "sha512-g+ueNGKkrjMazDG3elZO1pNs3HY5+mMmOet1jtKyhOaCnkLzitxf26z7hoAEkDNgdNmnc1KIlt/dw6Po6xZMpA==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.3.2.tgz", + "integrity": "sha512-ZMq4gd9ngV5aTMa5p9+UfY0b3skwhHELaDkhEHetMdX0LRkW9kzaym4oo/Eh+Ghm0CCDuMTsRIGM/ytUc1ZYmw==", "dev": true, "license": "Apache-2.0", "optional": true, @@ -9158,9 +10671,9 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.8.12", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.12.tgz", - "integrity": "sha512-vAPMQdnyKCBtkmQA6FMCBvU9qFIppS3nzyXnEM+Lo2IAhG4Mpjv9cCxMudhgV3YdNNJv6TNqXy97dfRVL2LmaQ==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.0.tgz", + "integrity": "sha512-Mh++g+2LPfzZToywfE1BUzvZbfOY52Nil0rn9H1CPC5DJ7fX+Vir7nToBeoiSbB1zTNeGYbELEvJESujgGrzXw==", "license": "Apache-2.0", "bin": { "baseline-browser-mapping": "dist/cli.js" @@ -9195,14 +10708,14 @@ } }, "node_modules/beasties": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/beasties/-/beasties-0.3.2.tgz", - "integrity": "sha512-p4AF8uYzm9Fwu8m/hSVTCPXrRBPmB34hQpHsec2KOaR9CZmgoU8IOv4Cvwq4hgz2p4hLMNbsdNl5XeA6XbAQwA==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/beasties/-/beasties-0.3.5.tgz", + "integrity": "sha512-NaWu+f4YrJxEttJSm16AzMIFtVldCvaJ68b1L098KpqXmxt9xOLtKoLkKxb8ekhOrLqEJAbvT6n6SEvB/sac7A==", "dev": true, "license": "Apache-2.0", "dependencies": { - "css-select": "^5.1.0", - "css-what": "^6.1.0", + "css-select": "^6.0.0", + "css-what": "^7.0.0", "dom-serializer": "^2.0.0", "domhandler": "^5.0.3", "htmlparser2": "^10.0.0", @@ -9237,17 +10750,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "license": "MIT", - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, "node_modules/blob-util": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/blob-util/-/blob-util-2.0.2.tgz", @@ -9262,25 +10764,25 @@ "license": "MIT" }, "node_modules/body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz", + "integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "bytes": "3.1.2", + "bytes": "~3.1.2", "content-type": "~1.0.5", "debug": "2.6.9", "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", + "destroy": "~1.2.0", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "on-finished": "~2.4.1", + "qs": "~6.14.0", + "raw-body": "~2.5.3", "type-is": "~1.6.18", - "unpipe": "1.0.0" + "unpipe": "~1.0.0" }, "engines": { "node": ">= 0.8", @@ -9320,23 +10822,6 @@ "license": "MIT", "peer": true }, - "node_modules/body-parser/node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", - "dev": true, - "license": "BSD-3-Clause", - "peer": true, - "dependencies": { - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/bonjour-service": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.3.0.tgz", @@ -9385,9 +10870,9 @@ "license": "MIT" }, "node_modules/browserslist": { - "version": "4.26.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.26.3.tgz", - "integrity": "sha512-lAUU+02RFBuCKQPj/P6NgjlbCnLBMp4UtgTx7vNHd3XSIJF87s9a5rA3aH2yw3GS9DqZAUbOtZdCCiZeVRqt0w==", + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", "funding": [ { "type": "opencollective", @@ -9404,11 +10889,11 @@ ], "license": "MIT", "dependencies": { - "baseline-browser-mapping": "^2.8.9", - "caniuse-lite": "^1.0.30001746", - "electron-to-chromium": "^1.5.227", - "node-releases": "^2.0.21", - "update-browserslist-db": "^1.1.3" + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" }, "bin": { "browserslist": "cli.js" @@ -9444,6 +10929,7 @@ "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, "funding": [ { "type": "github", @@ -9503,7 +10989,6 @@ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -9550,11 +11035,11 @@ "license": "ISC" }, "node_modules/cacache/node_modules/tar": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.1.tgz", - "integrity": "sha512-nlGpxf+hv0v7GkWBK2V9spgactGOp0qvfWRxUMjqHyzrt3SgwE48DIv/FhqPHJYLHpgW1opq3nERbz5Anq7n1g==", + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.2.tgz", + "integrity": "sha512-7NyxrTE4Anh8km8iEy7o0QYPs+0JKBTj5ZaqHg6B39erLg0qYXN3BijtShwbsNSvQ+LN75+KV+C4QR/f6Gwnpg==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", @@ -9577,23 +11062,23 @@ } }, "node_modules/cacheable": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/cacheable/-/cacheable-2.0.3.tgz", - "integrity": "sha512-nZF80J3d8RMrroMSYm1E9pBllVDXWPuECZgEZxH+vusCY4MAXAJVrY0jutcHSgh3xYX3G2EUNnmtWGZVVjWCXw==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cacheable/-/cacheable-2.3.0.tgz", + "integrity": "sha512-HHiAvOBmlcR2f3SQ7kdlYD8+AUJG+wlFZ/Ze8tl1Vzvz0MdOh8IYA/EFU4ve8t1/sZ0j4MGi7ST5MoTwHessQA==", "dev": true, "license": "MIT", "dependencies": { - "@cacheable/memoize": "^2.0.3", - "@cacheable/memory": "^2.0.3", - "@cacheable/utils": "^2.0.3", - "hookified": "^1.12.1", - "keyv": "^5.5.3" + "@cacheable/memory": "^2.0.6", + "@cacheable/utils": "^2.3.2", + "hookified": "^1.13.0", + "keyv": "^5.5.4", + "qified": "^0.5.2" } }, "node_modules/cacheable/node_modules/keyv": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.5.3.tgz", - "integrity": "sha512-h0Un1ieD+HUrzBH6dJXhod3ifSghk5Hw/2Y4/KHBziPlZecrFyE9YOTPU6eOs0V9pYl8gOs86fkr/KN8lUX39A==", + "version": "5.5.5", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.5.5.tgz", + "integrity": "sha512-FA5LmZVF1VziNc0bIdCSA1IoSVnDCqE8HJIZZv2/W8YmoAM50+tnUgJR/gQZwEeIMleuIOnRnHA/UaZRNeV4iQ==", "dev": true, "license": "MIT", "dependencies": { @@ -9671,9 +11156,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001748", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001748.tgz", - "integrity": "sha512-5P5UgAr0+aBmNiplks08JLw+AW/XG/SurlgZLgB1dDLfAw7EfRGxIwzPHxdSCGY/BTKDqIVyJL87cCN6s0ZR0w==", + "version": "1.0.30001759", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001759.tgz", + "integrity": "sha512-Pzfx9fOKoKvevQf8oCXoyNRQ5QyxJj+3O0Rqx2V5oxT61KGx8+n6hV/IUyJeifUci2clnmmKVpvtiqRzgiWjSw==", "funding": [ { "type": "opencollective", @@ -9728,6 +11213,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -9744,6 +11230,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -9763,9 +11250,9 @@ } }, "node_modules/chardet": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.0.tgz", - "integrity": "sha512-bNFETTG/pM5ryzQ9Ad0lJOTa6HWD/YsScAR3EnCPZRPlQh77JocYktSHOUHelyhm8IARL+o4c4F1bP5KVOjiRA==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.1.tgz", + "integrity": "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==", "dev": true, "license": "MIT" }, @@ -9828,9 +11315,9 @@ } }, "node_modules/chromium-bidi": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-9.1.0.tgz", - "integrity": "sha512-rlUzQ4WzIAWdIbY/viPShhZU2n21CxDUgazXVbw4Hu1MwaeUSEksSeM6DqPgpRjCLXRk702AVRxJxoOz0dw4OA==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-11.0.0.tgz", + "integrity": "sha512-cM3DI+OOb89T3wO8cpPSro80Q9eKYJ7hGVXoGS3GkDPxnYSqiv+6xwpIf6XERyJ9Tdsl09hmNmY94BkgZdVekw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -9878,6 +11365,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, "license": "MIT", "dependencies": { "restore-cursor": "^3.1.0" @@ -9890,6 +11378,7 @@ "version": "2.9.2", "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -9945,9 +11434,9 @@ } }, "node_modules/cli-truncate/node_modules/emoji-regex": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.5.0.tgz", - "integrity": "sha512-lb49vf1Xzfx080OKA0o6l8DQQpV+6Vg95zyCJX9VB/BqKYlhG7N4wgROUUHRA+ZPUefLnteQOad7z1kT2bV7bg==", + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", "dev": true, "license": "MIT" }, @@ -9999,6 +11488,7 @@ "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, "license": "ISC", "dependencies": { "string-width": "^4.2.0", @@ -10013,6 +11503,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", @@ -10026,15 +11517,6 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, "node_modules/clone-deep": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", @@ -10077,9 +11559,9 @@ } }, "node_modules/collect-v8-coverage": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", - "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz", + "integrity": "sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==", "dev": true, "license": "MIT" }, @@ -10148,14 +11630,6 @@ "node": ">= 6" } }, - "node_modules/common-path-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", - "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", - "dev": true, - "license": "ISC", - "peer": true - }, "node_modules/common-tags": { "version": "1.8.2", "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", @@ -10335,20 +11809,19 @@ "license": "MIT" }, "node_modules/cookie": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", - "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } }, "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", + "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", "dev": true, "license": "MIT", "peer": true @@ -10368,19 +11841,18 @@ } }, "node_modules/copy-webpack-plugin": { - "version": "12.0.2", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-12.0.2.tgz", - "integrity": "sha512-SNwdBeHyII+rWvee/bTnAYyO8vfVdcSTud4EIb6jcZ8inLeWucJE0DnxXQBjlQ5zlteuuvooGQy3LIyGxhvlOA==", + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-13.0.1.tgz", + "integrity": "sha512-J+YV3WfhY6W/Xf9h+J1znYuqTye2xkBUIGyTPWuBAT27qajBa5mR4f8WBmfDY3YjRftT2kqZZiLi1qf0H+UOFw==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "fast-glob": "^3.3.2", "glob-parent": "^6.0.1", - "globby": "^14.0.0", "normalize-path": "^3.0.0", "schema-utils": "^4.2.0", - "serialize-javascript": "^6.0.2" + "serialize-javascript": "^6.0.2", + "tinyglobby": "^0.2.12" }, "engines": { "node": ">= 18.12.0" @@ -10394,9 +11866,9 @@ } }, "node_modules/core-js": { - "version": "3.45.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.45.1.tgz", - "integrity": "sha512-L4NPsJlCfZsPeXukyzHFlg/i7IIVwHSItR0wg0FLNqYClJ4MQYTYLbC7EkjKYRLZF2iof2MUgN0EGy7MdQFChg==", + "version": "3.47.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.47.0.tgz", + "integrity": "sha512-c3Q2VVkGAUyupsjRnaNX6u8Dq2vAdzm9iuPj5FW0fRxzlxgq9Q39MDq10IvmQSpLgHQNyQzQmOo6bgGHmH3NNg==", "hasInstallScript": true, "license": "MIT", "optional": true, @@ -10406,14 +11878,14 @@ } }, "node_modules/core-js-compat": { - "version": "3.45.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.45.1.tgz", - "integrity": "sha512-tqTt5T4PzsMIZ430XGviK4vzYSoeNJ6CXODi6c/voxOT6IZqBht5/EKaSNnYiEjjRYxjVz7DQIsOsY0XNi8PIA==", + "version": "3.47.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.47.0.tgz", + "integrity": "sha512-IGfuznZ/n7Kp9+nypamBhvwdwLsW6KC8IOaURw2doAK5e98AG3acVLdh0woOnEqCfUtS+Vu882JE4k/DAm3ItQ==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "browserslist": "^4.25.3" + "browserslist": "^4.28.0" }, "funding": { "type": "opencollective", @@ -10426,6 +11898,20 @@ "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", "license": "MIT" }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/cosmiconfig": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", @@ -10618,17 +12104,17 @@ } }, "node_modules/css-select": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", - "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-6.0.0.tgz", + "integrity": "sha512-rZZVSLle8v0+EY8QAkDWrKhpgt6SA5OtHsgBnsj6ZaLb5dmDVOWUDtQitd9ydxxvEjhewNudS6eTVU7uOyzvXw==", "dev": true, "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" + "css-what": "^7.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.2", + "nth-check": "^2.1.1" }, "funding": { "url": "https://github.com/sponsors/fb55" @@ -10649,9 +12135,9 @@ } }, "node_modules/css-what": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", - "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-7.0.0.tgz", + "integrity": "sha512-wD5oz5xibMOPHzy13CyGmogB3phdvcDaB5t0W/Nr5Z2O/agcB8YwOz6e2Lsp10pNDzBoDO9nVa3RGs/2BttpHQ==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -11371,9 +12857,9 @@ } }, "node_modules/dayjs": { - "version": "1.11.18", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.18.tgz", - "integrity": "sha512-zFBQ7WFRvVRhKcWoUh+ZA1g2HVgUbsZm9sbddh8EC5iv93sui8DVVz1Npvz+r6meo9VKfa8NyLWBsQK1VvIKPA==", + "version": "1.11.19", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.19.tgz", + "integrity": "sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==", "license": "MIT" }, "node_modules/debug": { @@ -11415,6 +12901,16 @@ } } }, + "node_modules/deep-eql": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -11422,6 +12918,16 @@ "dev": true, "license": "MIT" }, + "node_modules/deepcopy-esm": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/deepcopy-esm/-/deepcopy-esm-2.1.1.tgz", + "integrity": "sha512-0lopQd/gi3excE3sgBrjuR3gJv6ZElk027i30pUgdjtvSJl/OoZ8B6L42GUBm6C3G8hD1EB5ir2gTYnINzWx4g==", + "dev": true, + "license": "(MIT or CC0 1.0)", + "engines": { + "node": ">=22" + } + }, "node_modules/deepmerge": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", @@ -11433,9 +12939,9 @@ } }, "node_modules/default-browser": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", - "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.4.0.tgz", + "integrity": "sha512-XDuvSq38Hr1MdN47EDvYtx3U0MTqpCEn+F6ft8z2vYDzMrvQhVp0ui9oQdqW3MvK3vqUETglt1tVGgjLuJ5izg==", "dev": true, "license": "MIT", "peer": true, @@ -11451,9 +12957,9 @@ } }, "node_modules/default-browser-id": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", - "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz", + "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==", "dev": true, "license": "MIT", "peer": true, @@ -11464,18 +12970,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", - "license": "MIT", - "dependencies": { - "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/define-lazy-prop": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", @@ -11530,7 +13024,6 @@ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -11577,9 +13070,9 @@ "peer": true }, "node_modules/devtools-protocol": { - "version": "0.0.1508733", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1508733.tgz", - "integrity": "sha512-QJ1R5gtck6nDcdM+nlsaJXcelPEI7ZxSMw1ujHpO1c4+9l+Nue5qlebi9xO1Z2MGr92bFOQTW7/rrheh5hHxDg==", + "version": "0.0.1534754", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1534754.tgz", + "integrity": "sha512-26T91cV5dbOYnXdJi5qQHoTtUoNEqwkHcAyu/IKtjIAxiEqPMrDiRkDOPWVsGfNZGmlQVHQbZRSjD8sxagWVsQ==", "dev": true, "license": "BSD-3-Clause" }, @@ -11652,19 +13145,6 @@ "node": ">=6" } }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/dom-serializer": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", @@ -11724,9 +13204,9 @@ } }, "node_modules/dompurify": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.2.7.tgz", - "integrity": "sha512-WhL/YuveyGXJaerVlMYGWhvQswa7myDG17P7Vu65EWC05o8vfeNbvNf4d/BOvH99+ZW+LlQsc1GDKMa1vNK6dw==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.3.0.tgz", + "integrity": "sha512-r+f6MYR1gGN1eJv0TVQbhA7if/U7P87cdPl3HN5rikqaBSBxLiCb/b9O+2eG0cxz0ghyU+mU1QkbsOwERMYlWQ==", "license": "(MPL-2.0 OR Apache-2.0)", "optional": true, "optionalDependencies": { @@ -11824,13 +13304,12 @@ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.230", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.230.tgz", - "integrity": "sha512-A6A6Fd3+gMdaed9wX83CvHYJb4UuapPD5X5SLq72VZJzxHSY0/LUweGXRWmQlh2ln7KV7iw7jnwXK7dlPoOnHQ==", + "version": "1.5.264", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.264.tgz", + "integrity": "sha512-1tEf0nLgltC3iy9wtlYDlQDc5Rg9lEKVjEmIHJ21rI9OcqkvD45K1oyNIRA4rR1z3LgJ7KeGzEBojVcV6m4qjA==", "license": "ISC" }, "node_modules/emittery": { @@ -11869,7 +13348,6 @@ "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -12062,9 +13540,9 @@ } }, "node_modules/esbuild": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.4.tgz", - "integrity": "sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.9.tgz", + "integrity": "sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -12075,37 +13553,38 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.4", - "@esbuild/android-arm": "0.25.4", - "@esbuild/android-arm64": "0.25.4", - "@esbuild/android-x64": "0.25.4", - "@esbuild/darwin-arm64": "0.25.4", - "@esbuild/darwin-x64": "0.25.4", - "@esbuild/freebsd-arm64": "0.25.4", - "@esbuild/freebsd-x64": "0.25.4", - "@esbuild/linux-arm": "0.25.4", - "@esbuild/linux-arm64": "0.25.4", - "@esbuild/linux-ia32": "0.25.4", - "@esbuild/linux-loong64": "0.25.4", - "@esbuild/linux-mips64el": "0.25.4", - "@esbuild/linux-ppc64": "0.25.4", - "@esbuild/linux-riscv64": "0.25.4", - "@esbuild/linux-s390x": "0.25.4", - "@esbuild/linux-x64": "0.25.4", - "@esbuild/netbsd-arm64": "0.25.4", - "@esbuild/netbsd-x64": "0.25.4", - "@esbuild/openbsd-arm64": "0.25.4", - "@esbuild/openbsd-x64": "0.25.4", - "@esbuild/sunos-x64": "0.25.4", - "@esbuild/win32-arm64": "0.25.4", - "@esbuild/win32-ia32": "0.25.4", - "@esbuild/win32-x64": "0.25.4" + "@esbuild/aix-ppc64": "0.25.9", + "@esbuild/android-arm": "0.25.9", + "@esbuild/android-arm64": "0.25.9", + "@esbuild/android-x64": "0.25.9", + "@esbuild/darwin-arm64": "0.25.9", + "@esbuild/darwin-x64": "0.25.9", + "@esbuild/freebsd-arm64": "0.25.9", + "@esbuild/freebsd-x64": "0.25.9", + "@esbuild/linux-arm": "0.25.9", + "@esbuild/linux-arm64": "0.25.9", + "@esbuild/linux-ia32": "0.25.9", + "@esbuild/linux-loong64": "0.25.9", + "@esbuild/linux-mips64el": "0.25.9", + "@esbuild/linux-ppc64": "0.25.9", + "@esbuild/linux-riscv64": "0.25.9", + "@esbuild/linux-s390x": "0.25.9", + "@esbuild/linux-x64": "0.25.9", + "@esbuild/netbsd-arm64": "0.25.9", + "@esbuild/netbsd-x64": "0.25.9", + "@esbuild/openbsd-arm64": "0.25.9", + "@esbuild/openbsd-x64": "0.25.9", + "@esbuild/openharmony-arm64": "0.25.9", + "@esbuild/sunos-x64": "0.25.9", + "@esbuild/win32-arm64": "0.25.9", + "@esbuild/win32-ia32": "0.25.9", + "@esbuild/win32-x64": "0.25.9" } }, "node_modules/esbuild-wasm": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.25.4.tgz", - "integrity": "sha512-2HlCS6rNvKWaSKhWaG/YIyRsTsL3gUrMP2ToZMBIjw9LM7vVcIs+rz8kE2vExvTJgvM8OKPqNpcHawY/BQc/qQ==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.25.9.tgz", + "integrity": "sha512-Jpv5tCSwQg18aCqCRD3oHIX/prBhXMDapIoG//A+6+dV0e7KQMGFg85ihJ5T1EeMjbZjON3TqFy0VrGAnIHLDA==", "dev": true, "license": "MIT", "bin": { @@ -12129,8 +13608,7 @@ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/escape-string-regexp": { "version": "4.0.0", @@ -12179,66 +13657,69 @@ } }, "node_modules/eslint": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", - "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", - "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "version": "9.39.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.1.tgz", + "integrity": "sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.1", - "@humanwhocodes/config-array": "^0.13.0", + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.1", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.39.1", + "@eslint/plugin-kit": "^0.4.1", + "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", "ajv": "^6.12.4", "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", + "cross-spawn": "^7.0.6", "debug": "^4.3.2", - "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", + "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" + "optionator": "^0.9.3" }, "bin": { "eslint": "bin/eslint.js" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } } }, "node_modules/eslint-scope": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", - "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.0.0.tgz", + "integrity": "sha512-+Yh0LeQKq+mW/tQArNj67tljR3L1HajDTQPuZOEwC00oBdoIDQrr89yBgjAlzAwRrY/5zDkM3v99iGHwz9y0dw==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -12246,7 +13727,7 @@ "estraverse": "^5.2.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://opencollective.com/eslint" @@ -12294,9 +13775,9 @@ } }, "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -12304,7 +13785,20 @@ "estraverse": "^5.2.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -12341,18 +13835,31 @@ } }, "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "acorn": "^8.9.0", + "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" + "eslint-visitor-keys": "^4.2.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -12424,7 +13931,6 @@ "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -12471,6 +13977,29 @@ "bare-events": "^2.7.0" } }, + "node_modules/eventsource": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz", + "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eventsource-parser": "^3.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/eventsource-parser": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.6.tgz", + "integrity": "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/exceljs": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/exceljs/-/exceljs-4.4.0.tgz", @@ -12562,55 +14091,58 @@ } }, "node_modules/expect-type": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-0.15.0.tgz", - "integrity": "sha512-yWnriYB4e8G54M5/fAFj7rCIBiKs1HAACaY13kCz6Ku0dezjS9aMcfcdVK2X8Tv2tEV1BPz/wKfQ7WA4S/d8aA==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.2.2.tgz", + "integrity": "sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==", "dev": true, - "license": "Apache-2.0" + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } }, "node_modules/exponential-backoff": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.2.tgz", - "integrity": "sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", + "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==", "dev": true, "license": "Apache-2.0" }, "node_modules/express": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", - "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz", + "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==", "dev": true, "license": "MIT", "peer": true, "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.3", - "content-disposition": "0.5.4", + "body-parser": "~1.20.3", + "content-disposition": "~0.5.4", "content-type": "~1.0.4", - "cookie": "0.7.1", - "cookie-signature": "1.0.6", + "cookie": "~0.7.1", + "cookie-signature": "~1.0.6", "debug": "2.6.9", "depd": "2.0.0", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.3.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", + "finalhandler": "~1.3.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.0", "merge-descriptors": "1.0.3", "methods": "~1.1.2", - "on-finished": "2.4.1", + "on-finished": "~2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.12", + "path-to-regexp": "~0.1.12", "proxy-addr": "~2.0.7", - "qs": "6.13.0", + "qs": "~6.14.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.19.0", - "serve-static": "1.16.2", + "send": "~0.19.0", + "serve-static": "~1.16.2", "setprototypeof": "1.2.0", - "statuses": "2.0.1", + "statuses": "~2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" @@ -12623,6 +14155,22 @@ "url": "https://opencollective.com/express" } }, + "node_modules/express-rate-limit": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.5.1.tgz", + "integrity": "sha512-7iN8iPMDzOMHPUYllBEsQdWVB6fPDMPqwjBaFrgr4Jgr/+okjvzAy+UHlYYL/Vs0OsOrMkwS6PJDkFlJwoxUnw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/express-rate-limit" + }, + "peerDependencies": { + "express": ">= 4.11" + } + }, "node_modules/express/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -12642,23 +14190,6 @@ "license": "MIT", "peer": true }, - "node_modules/express/node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", - "dev": true, - "license": "BSD-3-Clause", - "peer": true, - "dependencies": { - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -12714,6 +14245,7 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, "license": "MIT" }, "node_modules/fast-fifo": { @@ -12779,6 +14311,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "dev": true, "funding": [ { "type": "github", @@ -12848,7 +14381,6 @@ "version": "6.5.0", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, "license": "MIT", "engines": { "node": ">=12.0.0" @@ -12895,16 +14427,16 @@ } }, "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dev": true, "license": "MIT", "dependencies": { - "flat-cache": "^3.0.4" + "flat-cache": "^4.0.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=16.0.0" } }, "node_modules/fill-range": { @@ -12920,9 +14452,9 @@ } }, "node_modules/finalhandler": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", - "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", + "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", "dev": true, "license": "MIT", "peer": true, @@ -12930,9 +14462,9 @@ "debug": "2.6.9", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", - "on-finished": "2.4.1", + "on-finished": "~2.4.1", "parseurl": "~1.3.3", - "statuses": "2.0.1", + "statuses": "~2.0.2", "unpipe": "~1.0.0" }, "engines": { @@ -12958,24 +14490,6 @@ "license": "MIT", "peer": true }, - "node_modules/find-cache-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", - "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "common-path-prefix": "^3.0.0", - "pkg-dir": "^7.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -13007,18 +14521,17 @@ } }, "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, "license": "MIT", "dependencies": { "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" + "keyv": "^4.5.4" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=16" } }, "node_modules/flatted": { @@ -13077,9 +14590,9 @@ } }, "node_modules/form-data": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", - "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", "dev": true, "license": "MIT", "dependencies": { @@ -13099,7 +14612,6 @@ "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -13211,7 +14723,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", - "dev": true, "license": "MIT", "engines": { "node": ">=18" @@ -13362,9 +14873,9 @@ } }, "node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", @@ -13493,36 +15004,11 @@ } }, "node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", "dev": true, "license": "MIT", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globby": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-14.1.0.tgz", - "integrity": "sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@sindresorhus/merge-streams": "^2.1.0", - "fast-glob": "^3.3.3", - "ignore": "^7.0.3", - "path-type": "^6.0.0", - "slash": "^5.1.0", - "unicorn-magic": "^0.3.0" - }, "engines": { "node": ">=18" }, @@ -13616,6 +15102,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -13650,6 +15137,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/hashery": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/hashery/-/hashery-1.3.0.tgz", + "integrity": "sha512-fWltioiy5zsSAs9ouEnvhsVJeAXRybGCNNv0lvzpzNOSDbULXRy7ivFWwCCv4I5Am6kSo75hmbsCduOoc2/K4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hookified": "^1.13.0" + }, + "engines": { + "node": ">=20" + } + }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", @@ -13663,31 +15163,34 @@ } }, "node_modules/hookified": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/hookified/-/hookified-1.12.1.tgz", - "integrity": "sha512-xnKGl+iMIlhrZmGHB729MqlmPoWBznctSQTYCpFKqNsCgimJQmithcW0xSQMMFzYnV2iKUh25alswn6epgxS0Q==", + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/hookified/-/hookified-1.13.0.tgz", + "integrity": "sha512-6sPYUY8olshgM/1LDNW4QZQN0IqgKhtl/1C8koNZBJrKLBk3AZl6chQtNwpNztvfiApHMEwMHek5rv993PRbWw==", "dev": true, "license": "MIT" }, "node_modules/hosted-git-info": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-8.1.0.tgz", - "integrity": "sha512-Rw/B2DNQaPBICNXEm8balFz9a6WpZrkCGpcWFpy7nCj+NyhSdqXipmfvtmWt9xGfp0wZnBxB+iVpLmQMYt47Tw==", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-9.0.2.tgz", + "integrity": "sha512-M422h7o/BR3rmCQ8UHi7cyyMqKltdP9Uo+J2fXK+RSAY+wTcKOIRyhTuKv4qn+DJf3g+PL890AzId5KZpX+CBg==", "dev": true, "license": "ISC", "dependencies": { - "lru-cache": "^10.0.1" + "lru-cache": "^11.1.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/hosted-git-info/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "version": "11.2.4", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", + "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", "dev": true, - "license": "ISC" + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } }, "node_modules/hpack.js": { "version": "2.1.6", @@ -13927,21 +15430,24 @@ "peer": true }, "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" }, "engines": { "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/http-parser-js": { @@ -14143,16 +15649,32 @@ } }, "node_modules/ignore-walk": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-7.0.0.tgz", - "integrity": "sha512-T4gbf83A4NH95zvhVYZc+qWocBBGlpzUXLPGurJggw/WIOwicfXJChLDP/iBZnN5WqROSu5Bm3hhle4z8a8YGQ==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-8.0.0.tgz", + "integrity": "sha512-FCeMZT4NiRQGh+YkeKMtWrOmBgWjHjMJ26WQWrRQyoyzqevdaGSakUaJW5xQYmjLlUVk2qUnCjYVBax9EKKg8A==", "dev": true, "license": "ISC", "dependencies": { - "minimatch": "^9.0.0" + "minimatch": "^10.0.3" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/ignore-walk/node_modules/minimatch": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", + "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/brace-expansion": "^5.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/image-size": { @@ -14177,9 +15699,9 @@ "license": "MIT" }, "node_modules/immutable": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.3.tgz", - "integrity": "sha512-+chQdDfvscSF1SJqv2gn4SRO2ZyS3xL3r7IW/wWEEzrzLisnOlKiQu5ytC/BVNcS15C39WT2Hg/bjKjDMcu+zg==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.4.tgz", + "integrity": "sha512-p6u1bG3YSnINT5RQmx/yRZBpenIl30kVxkTLDyHLIMk0gict704Q9n+thfDI7lTRm9vXdDYutVzXhzcThxTnXA==", "dev": true, "license": "MIT" }, @@ -14353,9 +15875,9 @@ "license": "MIT" }, "node_modules/ip-address": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.0.1.tgz", - "integrity": "sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz", + "integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==", "dev": true, "license": "MIT", "engines": { @@ -14363,9 +15885,9 @@ } }, "node_modules/ipaddr.js": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", - "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.3.0.tgz", + "integrity": "sha512-Zv/pA+ciVFbCSBBjGfaKUya/CcGmUHzTydLMaTwrUUEM2DIEO3iZvueGxmacvmN50fGpGVKeTXpb2LcYQxeVdg==", "dev": true, "license": "MIT", "peer": true, @@ -14505,15 +16027,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/is-network-error": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.3.0.tgz", @@ -14578,6 +16091,13 @@ "dev": true, "license": "MIT" }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "dev": true, + "license": "MIT" + }, "node_modules/is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", @@ -14601,6 +16121,7 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, "license": "MIT", "engines": { "node": ">=10" @@ -15303,9 +16824,9 @@ } }, "node_modules/jest-preset-angular": { - "version": "14.6.1", - "resolved": "https://registry.npmjs.org/jest-preset-angular/-/jest-preset-angular-14.6.1.tgz", - "integrity": "sha512-7q5x42wKrsF2ykOwGVzcXpr9p1X4FQJMU/DnH1tpvCmeOm5XqENdwD/xDZug+nP6G8SJPdioauwdsK/PMY/MpQ==", + "version": "14.6.2", + "resolved": "https://registry.npmjs.org/jest-preset-angular/-/jest-preset-angular-14.6.2.tgz", + "integrity": "sha512-QWnjfXrnYJX65D+iZXBrdQ0ABHSo6DGvcmL3dGYOdF+V2ZhDlqJwKTmt7nyiOcORPdCL+20P8y+Q1mmnjZTHKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -15690,6 +17211,16 @@ "jiti": "bin/jiti.js" } }, + "node_modules/jose": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/jose/-/jose-6.1.3.tgz", + "integrity": "sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -15697,9 +17228,9 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", "dev": true, "license": "MIT", "dependencies": { @@ -15868,6 +17399,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, "license": "MIT" }, "node_modules/json-stable-stringify-without-jsonify": { @@ -15900,6 +17432,7 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", + "dev": true, "license": "MIT" }, "node_modules/jsonfile": { @@ -15925,12 +17458,12 @@ "license": "MIT" }, "node_modules/jspdf": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/jspdf/-/jspdf-3.0.3.tgz", - "integrity": "sha512-eURjAyz5iX1H8BOYAfzvdPfIKK53V7mCpBTe7Kb16PaM8JSXEcUQNBQaiWMI8wY5RvNOPj4GccMjTlfwRBd+oQ==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/jspdf/-/jspdf-3.0.4.tgz", + "integrity": "sha512-dc6oQ8y37rRcHn316s4ngz/nOjayLF/FFxBF4V9zamQKRqXxyiH1zagkCdktdWhtoQId5K20xt1lB90XzkB+hQ==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.26.9", + "@babel/runtime": "^7.28.4", "fast-png": "^6.2.0", "fflate": "^0.8.1" }, @@ -15950,6 +17483,15 @@ "jspdf": "^2 || ^3" } }, + "node_modules/jspdf/node_modules/@babel/runtime": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz", + "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/jsprim": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz", @@ -16063,9 +17605,9 @@ "license": "MIT" }, "node_modules/launch-editor": { - "version": "2.11.1", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.11.1.tgz", - "integrity": "sha512-SEET7oNfgSaB6Ym0jufAdCeo3meJVeCaaDyzRygy0xsp2BFKCprcfHljTq4QkzTLUxEKkFK6OK4811YM2oSrRg==", + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.12.0.tgz", + "integrity": "sha512-giOHXoOtifjdHqUamwKq6c49GzBdLjvxrd2D+Q4V6uOHopJv7p9VJxikDsQ/CBXZbEITgUqSVHXLTG3VhPP1Dg==", "dev": true, "license": "MIT", "peer": true, @@ -16127,9 +17669,9 @@ } }, "node_modules/less": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/less/-/less-4.2.2.tgz", - "integrity": "sha512-tkuLHQlvWUTeQ3doAqnHbNn8T6WX1KA8yvbKG9x4VtKtIjHsVKQZCH11zRgAfbDAXC2UNIg/K9BYAAcEzUIrNg==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/less/-/less-4.4.0.tgz", + "integrity": "sha512-kdTwsyRuncDfjEs0DlRILWNvxhDG/Zij4YLO4TMJgDLW+8OzpfkdPnRgrsRuY1o+oaxJGWsps5f/RVBgGmmN0w==", "dev": true, "license": "Apache-2.0", "peer": true, @@ -16142,7 +17684,7 @@ "lessc": "bin/lessc" }, "engines": { - "node": ">=6" + "node": ">=14" }, "optionalDependencies": { "errno": "^0.1.1", @@ -16155,9 +17697,9 @@ } }, "node_modules/less-loader": { - "version": "12.2.0", - "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-12.2.0.tgz", - "integrity": "sha512-MYUxjSQSBUQmowc0l5nPieOYwMzGPUaTzB6inNW/bdPEG9zOL3eAAD1Qw5ZxSPk7we5dMojHwNODYMV1hq4EVg==", + "version": "12.3.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-12.3.0.tgz", + "integrity": "sha512-0M6+uYulvYIWs52y0LqN4+QM9TqWAohYSNTo4htE8Z7Cn3G/qQMEmktfHmyJT23k+20kU9zHH2wrfFXkxNLtVw==", "dev": true, "license": "MIT", "peer": true, @@ -16540,9 +18082,9 @@ } }, "node_modules/listr2/node_modules/emoji-regex": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.5.0.tgz", - "integrity": "sha512-lb49vf1Xzfx080OKA0o6l8DQQpV+6Vg95zyCJX9VB/BqKYlhG7N4wgROUUHRA+ZPUefLnteQOad7z1kT2bV7bg==", + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", "dev": true, "license": "MIT" }, @@ -16606,9 +18148,9 @@ } }, "node_modules/lmdb": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-3.2.6.tgz", - "integrity": "sha512-SuHqzPl7mYStna8WRotY8XX/EUZBjjv3QyKIByeCLFfC9uXT/OIHByEcA07PzbMfQAM0KYJtLgtpMRlIe5dErQ==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-3.4.2.tgz", + "integrity": "sha512-nwVGUfTBUwJKXd6lRV8pFNfnrCC1+l49ESJRM19t/tFb/97QfJEixe5DYRvug5JO7DSFKoKaVy7oGMt5rVqZvg==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -16624,23 +18166,28 @@ "download-lmdb-prebuilds": "bin/download-prebuilds.js" }, "optionalDependencies": { - "@lmdb/lmdb-darwin-arm64": "3.2.6", - "@lmdb/lmdb-darwin-x64": "3.2.6", - "@lmdb/lmdb-linux-arm": "3.2.6", - "@lmdb/lmdb-linux-arm64": "3.2.6", - "@lmdb/lmdb-linux-x64": "3.2.6", - "@lmdb/lmdb-win32-x64": "3.2.6" + "@lmdb/lmdb-darwin-arm64": "3.4.2", + "@lmdb/lmdb-darwin-x64": "3.4.2", + "@lmdb/lmdb-linux-arm": "3.4.2", + "@lmdb/lmdb-linux-arm64": "3.4.2", + "@lmdb/lmdb-linux-x64": "3.4.2", + "@lmdb/lmdb-win32-arm64": "3.4.2", + "@lmdb/lmdb-win32-x64": "3.4.2" } }, "node_modules/loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.1.tgz", + "integrity": "sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==", "dev": true, "license": "MIT", "peer": true, "engines": { "node": ">=6.11.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/loader-utils": { @@ -16765,6 +18312,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, "license": "MIT", "dependencies": { "chalk": "^4.1.0", @@ -16798,9 +18346,9 @@ } }, "node_modules/log-update/node_modules/ansi-escapes": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.1.1.tgz", - "integrity": "sha512-Zhl0ErHcSRUaVfGUeUdDuLgpkEo8KIFjB4Y9uAc46ScOpdDiU1Dbyplh7qWJeJ/ZHpbyMSM26+X3BySgnIz40Q==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.2.0.tgz", + "integrity": "sha512-g6LhBsl+GBPRWGWsBtutpzBYuIIdBkLEvad5C/va/74Db018+5TZiyA26cZJAr3Rft5lprVqOIPxf5Vid6tqAw==", "dev": true, "license": "MIT", "dependencies": { @@ -16856,9 +18404,9 @@ } }, "node_modules/log-update/node_modules/emoji-regex": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.5.0.tgz", - "integrity": "sha512-lb49vf1Xzfx080OKA0o6l8DQQpV+6Vg95zyCJX9VB/BqKYlhG7N4wgROUUHRA+ZPUefLnteQOad7z1kT2bV7bg==", + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", "dev": true, "license": "MIT" }, @@ -16989,10 +18537,21 @@ "yallist": "^3.0.2" } }, + "node_modules/luxon": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.7.2.tgz", + "integrity": "sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, "node_modules/magic-string": { "version": "0.30.17", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "dev": true, "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0" @@ -17094,9 +18653,9 @@ } }, "node_modules/memfs": { - "version": "4.48.1", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.48.1.tgz", - "integrity": "sha512-vWO+1ROkhOALF1UnT9aNOOflq5oFDlqwTXaPg6duo07fBLxSH0+bcF0TY1lbA1zTNKyGgDxgaDdKx5MaewLX5A==", + "version": "4.51.1", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.51.1.tgz", + "integrity": "sha512-Eyt3XrufitN2ZL9c/uIRMyDwXanLI88h/L3MoWqNY747ha3dMR9dWqp8cRT5ntjZ0U1TNuq4U91ZXK0sMBjYOQ==", "dev": true, "license": "Apache-2.0", "peer": true, @@ -17230,6 +18789,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -17249,9 +18809,9 @@ } }, "node_modules/mini-css-extract-plugin": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.2.tgz", - "integrity": "sha512-GJuACcS//jtq4kCtd5ii/M0SZf7OZRH+BxdqXZHaJfb8TJiVl+NgQRPwiYt2EuqeSkNydn/7vP+bcE27C5mb9w==", + "version": "2.9.4", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.4.tgz", + "integrity": "sha512-ZWYT7ln73Hptxqxk2DxPU9MmapXRhxkJD6tkSR04dnQxm8BGu2hzgKLugK5yySD97u/8yy7Ma7E76k9ZdvtjkQ==", "dev": true, "license": "MIT", "peer": true, @@ -17666,15 +19226,15 @@ } }, "node_modules/ngx-mat-select-search": { - "version": "7.0.10", - "resolved": "https://registry.npmjs.org/ngx-mat-select-search/-/ngx-mat-select-search-7.0.10.tgz", - "integrity": "sha512-aygVGuOVJKfY8cQuOinz36sROEMaj2KU0IXB1f8VvKjbRAet5y5RAojo3ElnHR2FPaMQ6IMbp563kNyv2I4XrQ==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/ngx-mat-select-search/-/ngx-mat-select-search-8.0.2.tgz", + "integrity": "sha512-Ke8wpcgrhgJeC2d1Qqc4Hec57OrqGVJURw5OW55xVgGIbgT+mqVIm6wiOOTwBSnwskb4x4v59zbtC+VGoyYIsA==", "license": "MIT", "dependencies": { "tslib": "^2.4.0" }, "peerDependencies": { - "@angular/material": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + "@angular/material": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0" } }, "node_modules/node-addon-api": { @@ -17732,9 +19292,9 @@ } }, "node_modules/node-forge": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.3.tgz", + "integrity": "sha512-rLvcdSyRCyouf6jcOIPe/BgwG/d7hKjzMKOas33/pHEr6gbq18IK9zV7DiPvzsz0oBJPme6qr6H6kGZuI9/DZg==", "dev": true, "license": "(BSD-3-Clause OR GPL-2.0)", "peer": true, @@ -17743,9 +19303,9 @@ } }, "node_modules/node-gyp": { - "version": "11.4.2", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-11.4.2.tgz", - "integrity": "sha512-3gD+6zsrLQH7DyYOUIutaauuXrcyxeTPyQuZQCQoNPZMHMMS5m4y0xclNpvYzoK3VNzuyxT6eF4mkIL4WSZ1eQ==", + "version": "11.5.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-11.5.0.tgz", + "integrity": "sha512-ra7Kvlhxn5V9Slyus0ygMa2h+UqExPqUIkfk7Pc8QTLT956JLSy51uWFwHtIYy0vI8cB4BDhc/S03+880My/LQ==", "dev": true, "license": "MIT", "dependencies": { @@ -17804,11 +19364,11 @@ } }, "node_modules/node-gyp/node_modules/tar": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.1.tgz", - "integrity": "sha512-nlGpxf+hv0v7GkWBK2V9spgactGOp0qvfWRxUMjqHyzrt3SgwE48DIv/FhqPHJYLHpgW1opq3nERbz5Anq7n1g==", + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.2.tgz", + "integrity": "sha512-7NyxrTE4Anh8km8iEy7o0QYPs+0JKBTj5ZaqHg6B39erLg0qYXN3BijtShwbsNSvQ+LN75+KV+C4QR/f6Gwnpg==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", @@ -17853,9 +19413,9 @@ "license": "MIT" }, "node_modules/node-releases": { - "version": "2.0.23", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.23.tgz", - "integrity": "sha512-cCmFDMSm26S6tQSDpBCg/NR8NENrVPhAJSf+XbxBG4rPFaaonlEoE9wHQmun+cls499TQGSb7ZyPBRlzgKfpeg==", + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", "license": "MIT" }, "node_modules/nopt": { @@ -17931,32 +19491,43 @@ } }, "node_modules/npm-package-arg": { - "version": "12.0.2", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-12.0.2.tgz", - "integrity": "sha512-f1NpFjNI9O4VbKMOlA5QoBq/vSQPORHcTZ2feJpFkTHJ9eQkdlmZEKSjcAhxTGInC7RlEyScT9ui67NaOsjFWA==", + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-13.0.0.tgz", + "integrity": "sha512-+t2etZAGcB7TbbLHfDwooV9ppB2LhhcT6A+L9cahsf9mEUAoQ6CktLEVvEnpD0N5CkX7zJqnPGaFtoQDy9EkHQ==", "dev": true, "license": "ISC", "dependencies": { - "hosted-git-info": "^8.0.0", + "hosted-git-info": "^9.0.0", "proc-log": "^5.0.0", "semver": "^7.3.5", "validate-npm-package-name": "^6.0.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm-packlist": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-9.0.0.tgz", - "integrity": "sha512-8qSayfmHJQTx3nJWYbbUmflpyarbLMBc6LCAjYsiGtXxDB68HaZpb8re6zeaLGxZzDuMdhsg70jryJe+RrItVQ==", + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-10.0.3.tgz", + "integrity": "sha512-zPukTwJMOu5X5uvm0fztwS5Zxyvmk38H/LfidkOMt3gbZVCyro2cD/ETzwzVPcWZA3JOyPznfUN/nkyFiyUbxg==", "dev": true, "license": "ISC", "dependencies": { - "ignore-walk": "^7.0.0" + "ignore-walk": "^8.0.0", + "proc-log": "^6.0.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm-packlist/node_modules/proc-log": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-6.1.0.tgz", + "integrity": "sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm-pick-manifest": { @@ -17975,6 +19546,42 @@ "node": "^18.17.0 || >=20.5.0" } }, + "node_modules/npm-pick-manifest/node_modules/hosted-git-info": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-8.1.0.tgz", + "integrity": "sha512-Rw/B2DNQaPBICNXEm8balFz9a6WpZrkCGpcWFpy7nCj+NyhSdqXipmfvtmWt9xGfp0wZnBxB+iVpLmQMYt47Tw==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm-pick-manifest/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/npm-pick-manifest/node_modules/npm-package-arg": { + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-12.0.2.tgz", + "integrity": "sha512-f1NpFjNI9O4VbKMOlA5QoBq/vSQPORHcTZ2feJpFkTHJ9eQkdlmZEKSjcAhxTGInC7RlEyScT9ui67NaOsjFWA==", + "dev": true, + "license": "ISC", + "dependencies": { + "hosted-git-info": "^8.0.0", + "proc-log": "^5.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^6.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, "node_modules/npm-registry-fetch": { "version": "18.0.2", "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-18.0.2.tgz", @@ -17995,6 +19602,42 @@ "node": "^18.17.0 || >=20.5.0" } }, + "node_modules/npm-registry-fetch/node_modules/hosted-git-info": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-8.1.0.tgz", + "integrity": "sha512-Rw/B2DNQaPBICNXEm8balFz9a6WpZrkCGpcWFpy7nCj+NyhSdqXipmfvtmWt9xGfp0wZnBxB+iVpLmQMYt47Tw==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm-registry-fetch/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/npm-registry-fetch/node_modules/npm-package-arg": { + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-12.0.2.tgz", + "integrity": "sha512-f1NpFjNI9O4VbKMOlA5QoBq/vSQPORHcTZ2feJpFkTHJ9eQkdlmZEKSjcAhxTGInC7RlEyScT9ui67NaOsjFWA==", + "dev": true, + "license": "ISC", + "dependencies": { + "hosted-git-info": "^8.0.0", + "proc-log": "^5.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^6.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, "node_modules/npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", @@ -18073,7 +19716,6 @@ "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ee-first": "1.1.1" }, @@ -18106,6 +19748,7 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, "license": "MIT", "dependencies": { "mimic-fn": "^2.1.0" @@ -18118,9 +19761,9 @@ } }, "node_modules/open": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/open/-/open-10.1.0.tgz", - "integrity": "sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz", + "integrity": "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==", "dev": true, "license": "MIT", "peer": true, @@ -18128,7 +19771,7 @@ "default-browser": "^5.2.1", "define-lazy-prop": "^3.0.0", "is-inside-container": "^1.0.0", - "is-wsl": "^3.1.0" + "wsl-utils": "^0.1.0" }, "engines": { "node": ">=18" @@ -18155,29 +19798,6 @@ "node": ">= 0.8.0" } }, - "node_modules/ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "license": "MIT", - "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/ordered-binary": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.6.0.tgz", @@ -18226,9 +19846,9 @@ } }, "node_modules/p-map": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.3.tgz", - "integrity": "sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.4.tgz", + "integrity": "sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==", "dev": true, "license": "MIT", "engines": { @@ -18347,9 +19967,9 @@ "license": "BlueOak-1.0.0" }, "node_modules/pacote": { - "version": "20.0.0", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-20.0.0.tgz", - "integrity": "sha512-pRjC5UFwZCgx9kUFDVM9YEahv4guZ1nSLqwmWiLUnDbGsjs+U5w7z6Uc8HNR1a6x8qnu5y9xtGE6D1uAuYz+0A==", + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-21.0.0.tgz", + "integrity": "sha512-lcqexq73AMv6QNLo7SOpz0JJoaGdS3rBFgF122NZVl1bApo2mfu+XzUBU/X/XsiJu+iUmKpekRayqQYAs+PhkA==", "dev": true, "license": "ISC", "dependencies": { @@ -18362,7 +19982,7 @@ "fs-minipass": "^3.0.0", "minipass": "^7.0.2", "npm-package-arg": "^12.0.0", - "npm-packlist": "^9.0.0", + "npm-packlist": "^10.0.0", "npm-pick-manifest": "^10.0.0", "npm-registry-fetch": "^18.0.0", "proc-log": "^5.0.0", @@ -18374,6 +19994,42 @@ "bin": { "pacote": "bin/index.js" }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/pacote/node_modules/hosted-git-info": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-8.1.0.tgz", + "integrity": "sha512-Rw/B2DNQaPBICNXEm8balFz9a6WpZrkCGpcWFpy7nCj+NyhSdqXipmfvtmWt9xGfp0wZnBxB+iVpLmQMYt47Tw==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/pacote/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/pacote/node_modules/npm-package-arg": { + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-12.0.2.tgz", + "integrity": "sha512-f1NpFjNI9O4VbKMOlA5QoBq/vSQPORHcTZ2feJpFkTHJ9eQkdlmZEKSjcAhxTGInC7RlEyScT9ui67NaOsjFWA==", + "dev": true, + "license": "ISC", + "dependencies": { + "hosted-git-info": "^8.0.0", + "proc-log": "^5.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^6.0.0" + }, "engines": { "node": "^18.17.0 || >=20.5.0" } @@ -18438,6 +20094,7 @@ "version": "7.3.0", "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "dev": true, "license": "MIT", "dependencies": { "entities": "^6.0.0" @@ -18447,28 +20104,80 @@ } }, "node_modules/parse5-html-rewriting-stream": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-7.0.0.tgz", - "integrity": "sha512-mazCyGWkmCRWDI15Zp+UiCqMp/0dgEmkZRvhlsqqKYr4SsVm/TvnSpD9fCvqCA2zoWJcfRym846ejWBBHRiYEg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-8.0.0.tgz", + "integrity": "sha512-wzh11mj8KKkno1pZEu+l2EVeWsuKDfR5KNWZOTsslfUX8lPDZx77m9T0kIoAVkFtD1nx6YF8oh4BnPHvxMtNMw==", "dev": true, "license": "MIT", "dependencies": { - "entities": "^4.3.0", - "parse5": "^7.0.0", - "parse5-sax-parser": "^7.0.0" + "entities": "^6.0.0", + "parse5": "^8.0.0", + "parse5-sax-parser": "^8.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-html-rewriting-stream/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/parse5-html-rewriting-stream/node_modules/parse5": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.0.tgz", + "integrity": "sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA==", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" }, "funding": { "url": "https://github.com/inikulin/parse5?sponsor=1" } }, "node_modules/parse5-sax-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-7.0.0.tgz", - "integrity": "sha512-5A+v2SNsq8T6/mG3ahcz8ZtQ0OUFTatxPbeidoMB7tkJSGDY3tdfl4MHovtLQHkEn5CGxijNWRQHhRQ6IRpXKg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-8.0.0.tgz", + "integrity": "sha512-/dQ8UzHZwnrzs3EvDj6IkKrD/jIZyTlB+8XrHJvcjNgRdmWruNdN9i9RK/JtxakmlUdPwKubKPTCqvbTgzGhrw==", "dev": true, "license": "MIT", "dependencies": { - "parse5": "^7.0.0" + "parse5": "^8.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-sax-parser/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/parse5-sax-parser/node_modules/parse5": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.0.tgz", + "integrity": "sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA==", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" }, "funding": { "url": "https://github.com/inikulin/parse5?sponsor=1" @@ -18478,6 +20187,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=0.12" @@ -18492,7 +20202,6 @@ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -18562,20 +20271,6 @@ "license": "MIT", "peer": true }, - "node_modules/path-type": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-6.0.0.tgz", - "integrity": "sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", @@ -18597,9 +20292,9 @@ "license": "ISC" }, "node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "license": "MIT", "engines": { "node": ">=12" @@ -18640,130 +20335,32 @@ } }, "node_modules/piscina": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.8.0.tgz", - "integrity": "sha512-EZJb+ZxDrQf3dihsUL7p42pjNyrNIFJCrRHPMgxu/svsj+P3xS3fuEWp7k2+rfsavfl1N0G29b1HGs7J0m8rZA==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-5.1.3.tgz", + "integrity": "sha512-0u3N7H4+hbr40KjuVn2uNhOcthu/9usKhnw5vT3J7ply79v3D3M8naI00el9Klcy16x557VsEkkUQaHCWFXC/g==", "dev": true, "license": "MIT", + "engines": { + "node": ">=20.x" + }, "optionalDependencies": { - "@napi-rs/nice": "^1.0.1" + "@napi-rs/nice": "^1.0.4" } }, - "node_modules/pkg-dir": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", - "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", + "node_modules/pkce-challenge": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.1.tgz", + "integrity": "sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==", "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "find-up": "^6.3.0" - }, "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", - "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", - "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "p-locate": "^6.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "p-limit": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/path-exists": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/pkg-dir/node_modules/yocto-queue": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.1.tgz", - "integrity": "sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=16.20.0" } }, "node_modules/postcss": { - "version": "8.5.2", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.2.tgz", - "integrity": "sha512-MjOadfU3Ys9KYoX0AdkBlFEF1Vx37uCCeN4ZHnmwm9FfpbsGWMZeBLMmmpY+6Ocqod7mkdZ0DT31OlbsFrLlkA==", + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", "funding": [ { "type": "opencollective", @@ -18780,7 +20377,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.8", + "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -19079,9 +20676,9 @@ } }, "node_modules/postcss-selector-parser": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", - "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "dev": true, "license": "MIT", "dependencies": { @@ -19125,17 +20722,20 @@ } }, "node_modules/prettier-plugin-multiline-arrays": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/prettier-plugin-multiline-arrays/-/prettier-plugin-multiline-arrays-3.0.6.tgz", - "integrity": "sha512-FrWVa7MoDQo9b5XoLPrqIDClb0k+O8wOIsIr1DutRXhcerLY8PfIe/yYeTVD/vpRISkSXCBEYmj5Voe0wb5dEQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/prettier-plugin-multiline-arrays/-/prettier-plugin-multiline-arrays-4.0.5.tgz", + "integrity": "sha512-P6S+yUWrGv7LHIL3p+sQVdeNdP2nTocyVTe0ta9UwmJGHTbDpQas8rAayxjIN61ujxPXydW6ObHPmSyv98gMdQ==", "dev": true, "license": "(MIT or CC0 1.0)", "dependencies": { - "@augment-vir/common": "^28.1.0", - "proxy-vir": "^1.0.0" + "@augment-vir/common": "^31.54.1", + "proxy-vir": "^2.0.1" + }, + "engines": { + "node": ">=20" }, "peerDependencies": { - "prettier": ">=3.0.0" + "prettier": ">=3.0.0 <3.7.0" } }, "node_modules/pretty-bytes": { @@ -19248,7 +20848,6 @@ "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" @@ -19263,7 +20862,6 @@ "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 0.10" } @@ -19341,45 +20939,17 @@ "license": "MIT" }, "node_modules/proxy-vir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/proxy-vir/-/proxy-vir-1.0.0.tgz", - "integrity": "sha512-WV1gkBxUOwLSz0Bn09tisIqLK7leAqtFm/474t3L0hQKJw7/gdrkGcWw0/OT1PhSy+TDS6swfq7Niuoq3XJhkQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/proxy-vir/-/proxy-vir-2.0.1.tgz", + "integrity": "sha512-hjy5mWzHZhgRGh0f90f0Bz3VrGUe0T+AlhwnETakzRdvaN9RtPYLQG1+ZuEzSDK95FAhPYd26nEi1xVrXqvBwg==", "dev": true, "license": "(MIT or CC0 1.0)", "dependencies": { - "@augment-vir/common": "^23.3.4" - } - }, - "node_modules/proxy-vir/node_modules/@augment-vir/common": { - "version": "23.4.0", - "resolved": "https://registry.npmjs.org/@augment-vir/common/-/common-23.4.0.tgz", - "integrity": "sha512-QIrJ1doD00TNbOzeVrk9KgPTzRlIjayxERnhtbQjK/AFPj5yElcB03GbnGdQZPzws/R+5gfMM5cZiH7QyBP+Kg==", - "dev": true, - "license": "MIT", - "dependencies": { - "browser-or-node": "^2.1.1", - "run-time-assertions": "^1.0.0", - "type-fest": "^4.10.2" - } - }, - "node_modules/proxy-vir/node_modules/browser-or-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/browser-or-node/-/browser-or-node-2.1.1.tgz", - "integrity": "sha512-8CVjaLJGuSKMVTxJ2DpBl5XnlNDiT4cQFeuCJJrvJmts9YrTZDizTX7PjC2s6W4x+MBGZeEY6dGMrF04/6Hgqg==", - "dev": true, - "license": "MIT" - }, - "node_modules/proxy-vir/node_modules/type-fest": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", - "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=16" + "@augment-vir/assert": "^31.1.0", + "@augment-vir/common": "^31.1.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=22" } }, "node_modules/prr": { @@ -19426,18 +20996,18 @@ } }, "node_modules/puppeteer": { - "version": "24.23.0", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.23.0.tgz", - "integrity": "sha512-BVR1Lg8sJGKXY79JARdIssFWK2F6e1j+RyuJP66w4CUmpaXjENicmA3nNpUXA8lcTdDjAndtP+oNdni3T/qQqA==", + "version": "24.32.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.32.0.tgz", + "integrity": "sha512-exyxHPV5DSsigIhM/pzLcyzl5XU4Dp5lNP+APwIeStDxAdYqpMnJ1qN0QHXghjJx+cQJczby+ySH5rgv/5GQLw==", "dev": true, "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "@puppeteer/browsers": "2.10.10", - "chromium-bidi": "9.1.0", + "@puppeteer/browsers": "2.11.0", + "chromium-bidi": "11.0.0", "cosmiconfig": "^9.0.0", - "devtools-protocol": "0.0.1508733", - "puppeteer-core": "24.23.0", + "devtools-protocol": "0.0.1534754", + "puppeteer-core": "24.32.0", "typed-query-selector": "^2.12.0" }, "bin": { @@ -19448,18 +21018,18 @@ } }, "node_modules/puppeteer-core": { - "version": "24.23.0", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.23.0.tgz", - "integrity": "sha512-yl25C59gb14sOdIiSnJ08XiPP+O2RjuyZmEG+RjYmCXO7au0jcLf7fRiyii96dXGUBW7Zwei/mVKfxMx/POeFw==", + "version": "24.32.0", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.32.0.tgz", + "integrity": "sha512-MqzLLeJjqjtHK9J44+KE3kjtXXhFpPvg+AvXl/oy/jB8MeeNH66/4MNotOTqGZ6MPaxWi51YJ1ASga6OIff6xw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@puppeteer/browsers": "2.10.10", - "chromium-bidi": "9.1.0", + "@puppeteer/browsers": "2.11.0", + "chromium-bidi": "11.0.0", "debug": "^4.4.3", - "devtools-protocol": "0.0.1508733", + "devtools-protocol": "0.0.1534754", "typed-query-selector": "^2.12.0", - "webdriver-bidi-protocol": "0.3.6", + "webdriver-bidi-protocol": "0.3.9", "ws": "^8.18.3" }, "engines": { @@ -19483,6 +21053,19 @@ ], "license": "MIT" }, + "node_modules/qified": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/qified/-/qified-0.5.2.tgz", + "integrity": "sha512-7gJ6mxcQb9vUBOtbKm5mDevbe2uRcOEVp1g4gb/Q+oLntB3HY8eBhOYRxFI2mlDFlY1e4DOSCptzxarXRvzxCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hookified": "^1.13.0" + }, + "engines": { + "node": ">=20" + } + }, "node_modules/qs": { "version": "6.14.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", @@ -19553,23 +21136,22 @@ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } }, "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", + "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.0.0" }, "engines": { "node": ">= 0.8" @@ -19681,12 +21263,6 @@ "node": ">=4" } }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", - "license": "MIT" - }, "node_modules/regex-parser": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.3.1.tgz", @@ -19750,6 +21326,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -19759,6 +21336,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -19883,6 +21461,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, "license": "MIT", "dependencies": { "onetime": "^5.1.0", @@ -19896,6 +21475,7 @@ "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, "license": "ISC" }, "node_modules/retry": { @@ -19935,69 +21515,6 @@ "node": ">= 0.8.15" } }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/rimraf/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/robust-predicates": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", @@ -20005,13 +21522,13 @@ "license": "Unlicense" }, "node_modules/rollup": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.34.8.tgz", - "integrity": "sha512-489gTVMzAYdiZHFVA/ig/iYFllCcWFHMvUHI1rpFmkoUtRlQxqh6/yiNqnYibjMZ2b/+FUQwldG+aLsEt6bglQ==", + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.52.3.tgz", + "integrity": "sha512-RIDh866U8agLgiIcdpB+COKnlCreHJLfIhWC3LVflku5YHfpnsIKigRZeFfMfCc4dVcqNVfQQ5gO/afOck064A==", "dev": true, "license": "MIT", "dependencies": { - "@types/estree": "1.0.6" + "@types/estree": "1.0.8" }, "bin": { "rollup": "dist/bin/rollup" @@ -20021,34 +21538,128 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.34.8", - "@rollup/rollup-android-arm64": "4.34.8", - "@rollup/rollup-darwin-arm64": "4.34.8", - "@rollup/rollup-darwin-x64": "4.34.8", - "@rollup/rollup-freebsd-arm64": "4.34.8", - "@rollup/rollup-freebsd-x64": "4.34.8", - "@rollup/rollup-linux-arm-gnueabihf": "4.34.8", - "@rollup/rollup-linux-arm-musleabihf": "4.34.8", - "@rollup/rollup-linux-arm64-gnu": "4.34.8", - "@rollup/rollup-linux-arm64-musl": "4.34.8", - "@rollup/rollup-linux-loongarch64-gnu": "4.34.8", - "@rollup/rollup-linux-powerpc64le-gnu": "4.34.8", - "@rollup/rollup-linux-riscv64-gnu": "4.34.8", - "@rollup/rollup-linux-s390x-gnu": "4.34.8", - "@rollup/rollup-linux-x64-gnu": "4.34.8", - "@rollup/rollup-linux-x64-musl": "4.34.8", - "@rollup/rollup-win32-arm64-msvc": "4.34.8", - "@rollup/rollup-win32-ia32-msvc": "4.34.8", - "@rollup/rollup-win32-x64-msvc": "4.34.8", + "@rollup/rollup-android-arm-eabi": "4.52.3", + "@rollup/rollup-android-arm64": "4.52.3", + "@rollup/rollup-darwin-arm64": "4.52.3", + "@rollup/rollup-darwin-x64": "4.52.3", + "@rollup/rollup-freebsd-arm64": "4.52.3", + "@rollup/rollup-freebsd-x64": "4.52.3", + "@rollup/rollup-linux-arm-gnueabihf": "4.52.3", + "@rollup/rollup-linux-arm-musleabihf": "4.52.3", + "@rollup/rollup-linux-arm64-gnu": "4.52.3", + "@rollup/rollup-linux-arm64-musl": "4.52.3", + "@rollup/rollup-linux-loong64-gnu": "4.52.3", + "@rollup/rollup-linux-ppc64-gnu": "4.52.3", + "@rollup/rollup-linux-riscv64-gnu": "4.52.3", + "@rollup/rollup-linux-riscv64-musl": "4.52.3", + "@rollup/rollup-linux-s390x-gnu": "4.52.3", + "@rollup/rollup-linux-x64-gnu": "4.52.3", + "@rollup/rollup-linux-x64-musl": "4.52.3", + "@rollup/rollup-openharmony-arm64": "4.52.3", + "@rollup/rollup-win32-arm64-msvc": "4.52.3", + "@rollup/rollup-win32-ia32-msvc": "4.52.3", + "@rollup/rollup-win32-x64-gnu": "4.52.3", + "@rollup/rollup-win32-x64-msvc": "4.52.3", "fsevents": "~2.3.2" } }, - "node_modules/rollup/node_modules/@types/estree": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "node_modules/rollup/node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.52.3.tgz", + "integrity": "sha512-3y5GA0JkBuirLqmjwAKwB0keDlI6JfGYduMlJD/Rl7fvb4Ni8iKdQs1eiunMZJhwDWdCvrcqXRY++VEBbvk6Eg==", + "cpu": [ + "loong64" + ], "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/rollup/node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.52.3.tgz", + "integrity": "sha512-AUUH65a0p3Q0Yfm5oD2KVgzTKgwPyp9DSXc3UA7DtxhEb/WSPfbG4wqXeSN62OG5gSo18em4xv6dbfcUGXcagw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/rollup/node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.52.3.tgz", + "integrity": "sha512-OOFJa28dxfl8kLOPMUOQBCO6z3X2SAfzIE276fwT52uXDWUS178KWq0pL7d6p1kz7pkzA0yQwtqL0dEPoVcRWg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/rollup/node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.52.3.tgz", + "integrity": "sha512-KTD/EqjZF3yvRaWUJdD1cW+IQBk4fbQaHYJUmP8N4XoKFZilVL8cobFSTDnjTtxWJQ3JYaMgF4nObY/+nYkumA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/rollup/node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.52.3.tgz", + "integrity": "sha512-s0hybmlHb56mWVZQj8ra9048/WZTPLILKxcvcq+8awSZmyiSUZjjem1AhU3Tf4ZKpYhK4mg36HtHDOe8QJS5PQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/router/node_modules/path-to-regexp": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", + "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } }, "node_modules/run-applescript": { "version": "7.1.0", @@ -20087,44 +21698,6 @@ "queue-microtask": "^1.2.2" } }, - "node_modules/run-time-assertions": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/run-time-assertions/-/run-time-assertions-1.5.2.tgz", - "integrity": "sha512-ccfwvjGuNU14cSSXLlmPRiqEgMfA7w3J2TViO79zMnzXGvE6FJ0dxnhIQGwe5r/vwySOJ4sqZksexo9wyAlA8g==", - "deprecated": "Use @augment-vir/assert instead.", - "dev": true, - "license": "(MIT or CC0 1.0)", - "dependencies": { - "@augment-vir/common": "^29.3.0", - "expect-type": "~0.15.0", - "type-fest": "^4.22.0" - } - }, - "node_modules/run-time-assertions/node_modules/@augment-vir/common": { - "version": "29.3.0", - "resolved": "https://registry.npmjs.org/@augment-vir/common/-/common-29.3.0.tgz", - "integrity": "sha512-k3OX35/576thmGUzQUBcCKGarb7ONBfiu07+iV2vxmjl7VoB1rOB0vu8WqgB1ceJq2EMLDPXY18hHpJ9WeTHXQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "browser-or-node": "^3.0.0", - "run-time-assertions": "^1.5.1", - "type-fest": "^4.21.0" - } - }, - "node_modules/run-time-assertions/node_modules/type-fest": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", - "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/rw": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", @@ -20132,9 +21705,9 @@ "license": "BSD-3-Clause" }, "node_modules/rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.1.0" @@ -20167,9 +21740,9 @@ "license": "MIT" }, "node_modules/sass": { - "version": "1.85.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.85.0.tgz", - "integrity": "sha512-3ToiC1xZ1Y8aU7+CkgCI/tqyuPXEmYGJXO7H4uqp0xkLXUqp88rQQ4j1HmP37xSJLbCJPaIiv+cT1y+grssrww==", + "version": "1.90.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.90.0.tgz", + "integrity": "sha512-9GUyuksjw70uNpb1MTYWsH9MQHOHY6kwfnkafC24+7aOMZn9+rVMBxRbLvw756mrBFbIsFg6Xw9IkR2Fnn3k+Q==", "dev": true, "license": "MIT", "dependencies": { @@ -20230,11 +21803,11 @@ } }, "node_modules/sax": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", - "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.3.tgz", + "integrity": "sha512-yqYn1JhPczigF94DMS+shiDMjDowYO6y9+wB/4WgO0Y19jWYk0lQ4tuG5KI7kj4FTp1wxPj5IFfcrz/s1c3jjQ==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "optional": true, "peer": true }, @@ -20314,9 +21887,9 @@ } }, "node_modules/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -20326,9 +21899,9 @@ } }, "node_modules/send": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", - "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.1.tgz", + "integrity": "sha512-p4rRk4f23ynFEfcD9LA0xRYngj+IyGiEYyqqOak8kaN0TvNmuxC2dcVeBn62GpCeR2CpWqyHCNScTP91QbAVFg==", "dev": true, "license": "MIT", "peer": true, @@ -20336,7 +21909,7 @@ "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", @@ -20370,10 +21943,28 @@ "license": "MIT", "peer": true }, - "node_modules/send/node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "node_modules/send/node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "dev": true, "license": "MIT", "peer": true, @@ -20503,6 +22094,91 @@ "node": ">= 0.8.0" } }, + "node_modules/serve-static/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-static/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/serve-static/node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/serve-static/node_modules/send": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-static/node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/serve-static/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", @@ -20514,8 +22190,7 @@ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", "dev": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/shallow-clone": { "version": "3.0.1", @@ -20679,20 +22354,6 @@ "dev": true, "license": "MIT" }, - "node_modules/slash": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", - "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/slice-ansi": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", @@ -20778,12 +22439,13 @@ } }, "node_modules/source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "dev": true, "license": "BSD-3-Clause", "engines": { - "node": ">= 8" + "node": ">= 12" } }, "node_modules/source-map-js": { @@ -21002,16 +22664,28 @@ } }, "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } }, + "node_modules/stdin-discarder": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", + "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/streamx": { "version": "2.23.0", "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.23.0.tgz", @@ -21162,9 +22836,9 @@ } }, "node_modules/stylelint": { - "version": "16.25.0", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.25.0.tgz", - "integrity": "sha512-Li0avYWV4nfv1zPbdnxLYBGq4z8DVZxbRgx4Kn6V+Uftz1rMoF1qiEI3oL4kgWqyYgCgs7gT5maHNZ82Gk03vQ==", + "version": "16.26.1", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.26.1.tgz", + "integrity": "sha512-v20V59/crfc8sVTAtge0mdafI3AdnzQ2KsWe6v523L4OA1bJO02S7MO2oyXDCS6iWb9ckIPnqAFVItqSBQr7jw==", "dev": true, "funding": [ { @@ -21179,6 +22853,7 @@ "license": "MIT", "dependencies": { "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-syntax-patches-for-csstree": "^1.0.19", "@csstools/css-tokenizer": "^3.0.4", "@csstools/media-query-list-parser": "^4.0.3", "@csstools/selector-specificity": "^5.0.0", @@ -21191,7 +22866,7 @@ "debug": "^4.4.3", "fast-glob": "^3.3.3", "fastest-levenshtein": "^1.0.16", - "file-entry-cache": "^10.1.4", + "file-entry-cache": "^11.1.1", "global-modules": "^2.0.0", "globby": "^11.1.0", "globjoin": "^0.1.4", @@ -21298,39 +22973,32 @@ } }, "node_modules/stylelint-scss": { - "version": "6.12.1", - "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-6.12.1.tgz", - "integrity": "sha512-UJUfBFIvXfly8WKIgmqfmkGKPilKB4L5j38JfsDd+OCg2GBdU0vGUV08Uw82tsRZzd4TbsUURVVNGeOhJVF7pA==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-6.13.0.tgz", + "integrity": "sha512-kZPwFUJkfup2gP1enlrS2h9U5+T5wFoqzJ1n/56AlpwSj28kmFe7ww/QFydvPsg5gLjWchAwWWBLtterynZrOw==", "dev": true, "license": "MIT", "dependencies": { "css-tree": "^3.0.1", "is-plain-object": "^5.0.0", - "known-css-properties": "^0.36.0", - "mdn-data": "^2.21.0", + "known-css-properties": "^0.37.0", + "mdn-data": "^2.25.0", "postcss-media-query-parser": "^0.2.3", "postcss-resolve-nested-selector": "^0.1.6", - "postcss-selector-parser": "^7.1.0", + "postcss-selector-parser": "^7.1.1", "postcss-value-parser": "^4.2.0" }, "engines": { "node": ">=18.12.0" }, "peerDependencies": { - "stylelint": "^16.0.2" + "stylelint": "^16.8.2" } }, - "node_modules/stylelint-scss/node_modules/known-css-properties": { - "version": "0.36.0", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.36.0.tgz", - "integrity": "sha512-A+9jP+IUmuQsNdsLdcg6Yt7voiMF/D4K83ew0OpJtpu+l34ef7LaohWV0Rc6KNvzw6ZDizkqfyB5JznZnzuKQA==", - "dev": true, - "license": "MIT" - }, "node_modules/stylelint-scss/node_modules/mdn-data": { - "version": "2.24.0", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.24.0.tgz", - "integrity": "sha512-i97fklrJl03tL1tdRVw0ZfLLvuDsdb6wxL+TrJ+PKkCbLrp2PCu2+OYdCKychIUm19nSM/35S6qz7pJpnXttoA==", + "version": "2.25.0", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.25.0.tgz", + "integrity": "sha512-T2LPsjgUE/tgMmRXREVmwsux89DwWfNjiynOeXuLd2mX6jphGQ2YE3Ukz7LQ2VOFKiVZU/Ee1GqzHiipZCjymw==", "dev": true, "license": "CC0-1.0" }, @@ -21342,25 +23010,25 @@ "license": "MIT" }, "node_modules/stylelint/node_modules/file-entry-cache": { - "version": "10.1.4", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-10.1.4.tgz", - "integrity": "sha512-5XRUFc0WTtUbjfGzEwXc42tiGxQHBmtbUG1h9L2apu4SulCGN3Hqm//9D6FAolf8MYNL7f/YlJl9vy08pj5JuA==", + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-11.1.1.tgz", + "integrity": "sha512-TPVFSDE7q91Dlk1xpFLvFllf8r0HyOMOlnWy7Z2HBku5H3KhIeOGInexrIeg2D64DosVB/JXkrrk6N/7Wriq4A==", "dev": true, "license": "MIT", "dependencies": { - "flat-cache": "^6.1.13" + "flat-cache": "^6.1.19" } }, "node_modules/stylelint/node_modules/flat-cache": { - "version": "6.1.17", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.17.tgz", - "integrity": "sha512-Jzse4YoiUJBVYTwz5Bwl4h/2VQM7e2KK3MVAMlXzX9uamIHAH/TXUlRKU1AQGQOryQhN0EsmufiiF40G057YXA==", + "version": "6.1.19", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.19.tgz", + "integrity": "sha512-l/K33newPTZMTGAnnzaiqSl6NnH7Namh8jBNjrgjprWxGmZUuxx/sJNIRaijOh3n7q7ESbhNZC+pvVZMFdeU4A==", "dev": true, "license": "MIT", "dependencies": { - "cacheable": "^2.0.3", + "cacheable": "^2.2.0", "flatted": "^3.3.3", - "hookified": "^1.12.0" + "hookified": "^1.13.0" } }, "node_modules/stylelint/node_modules/globby": { @@ -21394,35 +23062,6 @@ "node": ">= 4" } }, - "node_modules/stylelint/node_modules/postcss": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.11", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, "node_modules/stylelint/node_modules/resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", @@ -21458,17 +23097,17 @@ } }, "node_modules/sucrase": { - "version": "3.35.0", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", - "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "version": "3.35.1", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz", + "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==", "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", - "glob": "^10.3.10", "lines-and-columns": "^1.1.6", "mz": "^2.7.0", "pirates": "^4.0.1", + "tinyglobby": "^0.2.11", "ts-interface-checker": "^0.1.9" }, "bin": { @@ -21562,16 +23201,6 @@ "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==", "dev": true }, - "node_modules/symbol-observable": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", - "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10" - } - }, "node_modules/symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", @@ -21624,6 +23253,19 @@ "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, + "node_modules/tagged-tag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/tagged-tag/-/tagged-tag-1.0.0.tgz", + "integrity": "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/tailwindcss": { "version": "3.4.18", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.18.tgz", @@ -21864,15 +23506,15 @@ "license": "ISC" }, "node_modules/terser": { - "version": "5.39.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.39.0.tgz", - "integrity": "sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==", + "version": "5.43.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.43.1.tgz", + "integrity": "sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==", "dev": true, "license": "BSD-2-Clause", "peer": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", + "acorn": "^8.14.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, @@ -22022,13 +23664,6 @@ "utrie": "^1.0.2" } }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true, - "license": "MIT" - }, "node_modules/thenify": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", @@ -22097,7 +23732,6 @@ "version": "0.2.15", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", - "dev": true, "license": "MIT", "dependencies": { "fdir": "^6.5.0", @@ -22110,19 +23744,6 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/tinymce": { "version": "8.2.2", "resolved": "https://registry.npmjs.org/tinymce/-/tinymce-8.2.2.tgz", @@ -22183,7 +23804,6 @@ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.6" } @@ -22271,9 +23891,9 @@ "license": "Apache-2.0" }, "node_modules/ts-jest": { - "version": "29.4.4", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.4.4.tgz", - "integrity": "sha512-ccVcRABct5ZELCT5U0+DZwkXMCcOCLi2doHRrKy1nK/s7J7bch6TzJMsrY09WxgUUIP/ITfmcDS8D2yl63rnXw==", + "version": "29.4.6", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.4.6.tgz", + "integrity": "sha512-fSpWtOO/1AjSNQguk43hb/JCo16oJDnMJf3CdEGNkqsEX3t0KX96xvyX1D7PfLCpVoKu4MfVrqUkFyblYoY4lA==", "dev": true, "license": "MIT", "dependencies": { @@ -22283,7 +23903,7 @@ "json5": "^2.2.3", "lodash.memoize": "^4.1.2", "make-error": "^1.3.6", - "semver": "^7.7.2", + "semver": "^7.7.3", "type-fest": "^4.41.0", "yargs-parser": "^21.1.1" }, @@ -22323,19 +23943,6 @@ } } }, - "node_modules/ts-jest/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/ts-jest/node_modules/type-fest": { "version": "4.41.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", @@ -22523,13 +24130,16 @@ } }, "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.3.0.tgz", + "integrity": "sha512-d9CwU93nN0IA1QL+GSNDdwLAu1Ew5ZjTwupvedwg3WdfoH6pIDvYQ2hV0Uc2nKBLPq7NB5apCx57MLS5qlmO5g==", "dev": true, "license": "(MIT OR CC0-1.0)", + "dependencies": { + "tagged-tag": "^1.0.0" + }, "engines": { - "node": ">=10" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -22558,6 +24168,21 @@ "license": "MIT", "peer": true }, + "node_modules/typed-event-target": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/typed-event-target/-/typed-event-target-4.1.0.tgz", + "integrity": "sha512-fDFhZb7ofywLsVv8mYePD6ONfCpVHyM1t2dboEJx/XMsnflljnu3GQ5qH09hS1USuypGMR7wRbdWQPydgJ8nGQ==", + "dev": true, + "license": "(MIT or CC0 1.0)", + "dependencies": { + "@augment-vir/assert": "^31.19.1", + "@augment-vir/common": "^31.19.1", + "@augment-vir/core": "^31.19.1" + }, + "engines": { + "node": ">=22" + } + }, "node_modules/typed-query-selector": { "version": "2.12.0", "resolved": "https://registry.npmjs.org/typed-query-selector/-/typed-query-selector-2.12.0.tgz", @@ -22566,9 +24191,10 @@ "license": "MIT" }, "node_modules/typescript": { - "version": "5.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", - "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "devOptional": true, "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", @@ -22647,20 +24273,6 @@ "node": ">=4" } }, - "node_modules/unicorn-magic": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", - "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/unique-filename": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-4.0.0.tgz", @@ -22702,7 +24314,6 @@ "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -22745,9 +24356,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", - "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.1.tgz", + "integrity": "sha512-R9NcHbbZ45RoWfTdhn1J9SS7zxNvlddv4YRrHTUaFdtjbmfncfedB45EC9IaqJQ97iAR1GZgOfyRQO+ExIF6EQ==", "funding": [ { "type": "opencollective", @@ -22886,7 +24497,6 @@ "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -22906,390 +24516,6 @@ "extsprintf": "^1.2.0" } }, - "node_modules/vite": { - "version": "6.3.6", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.6.tgz", - "integrity": "sha512-0msEVHJEScQbhkbVTb/4iHZdJ6SXp/AvxL2sjwYQFfBqleHtnCqv1J3sa9zbWz/6kW1m9Tfzn92vW+kZ1WV6QA==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.25.0", - "fdir": "^6.4.4", - "picomatch": "^4.0.2", - "postcss": "^8.5.3", - "rollup": "^4.34.9", - "tinyglobby": "^0.2.13" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "jiti": ">=1.21.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "node_modules/vite/node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.4.tgz", - "integrity": "sha512-BTm2qKNnWIQ5auf4deoetINJm2JzvihvGb9R6K/ETwKLql/Bb3Eg2H1FBp1gUb4YGbydMA3jcmQTR73q7J+GAA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/vite/node_modules/@rollup/rollup-android-arm64": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.52.4.tgz", - "integrity": "sha512-P9LDQiC5vpgGFgz7GSM6dKPCiqR3XYN1WwJKA4/BUVDjHpYsf3iBEmVz62uyq20NGYbiGPR5cNHI7T1HqxNs2w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/vite/node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.4.tgz", - "integrity": "sha512-QRWSW+bVccAvZF6cbNZBJwAehmvG9NwfWHwMy4GbWi/BQIA/laTIktebT2ipVjNncqE6GLPxOok5hsECgAxGZg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/vite/node_modules/@rollup/rollup-darwin-x64": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.52.4.tgz", - "integrity": "sha512-hZgP05pResAkRJxL1b+7yxCnXPGsXU0fG9Yfd6dUaoGk+FhdPKCJ5L1Sumyxn8kvw8Qi5PvQ8ulenUbRjzeCTw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/vite/node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.52.4.tgz", - "integrity": "sha512-xmc30VshuBNUd58Xk4TKAEcRZHaXlV+tCxIXELiE9sQuK3kG8ZFgSPi57UBJt8/ogfhAF5Oz4ZSUBN77weM+mQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/vite/node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.52.4.tgz", - "integrity": "sha512-WdSLpZFjOEqNZGmHflxyifolwAiZmDQzuOzIq9L27ButpCVpD7KzTRtEG1I0wMPFyiyUdOO+4t8GvrnBLQSwpw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/vite/node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.52.4.tgz", - "integrity": "sha512-xRiOu9Of1FZ4SxVbB0iEDXc4ddIcjCv2aj03dmW8UrZIW7aIQ9jVJdLBIhxBI+MaTnGAKyvMwPwQnoOEvP7FgQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/vite/node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.52.4.tgz", - "integrity": "sha512-FbhM2p9TJAmEIEhIgzR4soUcsW49e9veAQCziwbR+XWB2zqJ12b4i/+hel9yLiD8pLncDH4fKIPIbt5238341Q==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/vite/node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.52.4.tgz", - "integrity": "sha512-4n4gVwhPHR9q/g8lKCyz0yuaD0MvDf7dV4f9tHt0C73Mp8h38UCtSCSE6R9iBlTbXlmA8CjpsZoujhszefqueg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/vite/node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.52.4.tgz", - "integrity": "sha512-u0n17nGA0nvi/11gcZKsjkLj1QIpAuPFQbR48Subo7SmZJnGxDpspyw2kbpuoQnyK+9pwf3pAoEXerJs/8Mi9g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/vite/node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.52.4.tgz", - "integrity": "sha512-/MOEW3aHjjs1p4Pw1Xk4+3egRevx8Ji9N6HUIA1Ifh8Q+cg9dremvFCUbOX2Zebz80BwJIgCBUemjqhU5XI5Eg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/vite/node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.52.4.tgz", - "integrity": "sha512-seoeZp4L/6D1MUyjWkOMRU6/iLmCU2EjbMTyAG4oIOs1/I82Y5lTeaxW0KBfkUdHAWN7j25bpkt0rjnOgAcQcA==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/vite/node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.4.tgz", - "integrity": "sha512-Wi6AXf0k0L7E2gteNsNHUs7UMwCIhsCTs6+tqQ5GPwVRWMaflqGec4Sd8n6+FNFDw9vGcReqk2KzBDhCa1DLYg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/vite/node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.52.4.tgz", - "integrity": "sha512-dtBZYjDmCQ9hW+WgEkaffvRRCKm767wWhxsFW3Lw86VXz/uJRuD438/XvbZT//B96Vs8oTA8Q4A0AfHbrxP9zw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/vite/node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.52.4.tgz", - "integrity": "sha512-8GKr640PdFNXwzIE0IrkMWUNUomILLkfeHjXBi/nUvFlpZP+FA8BKGKpacjW6OUUHaNI6sUURxR2U2g78FOHWQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/vite/node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.52.4.tgz", - "integrity": "sha512-AIy/jdJ7WtJ/F6EcfOb2GjR9UweO0n43jNObQMb6oGxkYTfLcnN7vYYpG+CN3lLxrQkzWnMOoNSHTW54pgbVxw==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/vite/node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.4.tgz", - "integrity": "sha512-bf9PtUa0u8IXDVxzRToFQKsNCRz9qLYfR/MpECxl4mRoWYjAeFjgxj1XdZr2M/GNVpT05p+LgQOHopYDlUu6/w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/vite/node_modules/postcss": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.11", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/vite/node_modules/rollup": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.52.4.tgz", - "integrity": "sha512-CLEVl+MnPAiKh5pl4dEWSyMTpuflgNQiLGhMv8ezD5W/qP8AKvmYpCOKRRNOh7oRKnauBZ4SyeYkMS+1VSyKwQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "1.0.8" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.52.4", - "@rollup/rollup-android-arm64": "4.52.4", - "@rollup/rollup-darwin-arm64": "4.52.4", - "@rollup/rollup-darwin-x64": "4.52.4", - "@rollup/rollup-freebsd-arm64": "4.52.4", - "@rollup/rollup-freebsd-x64": "4.52.4", - "@rollup/rollup-linux-arm-gnueabihf": "4.52.4", - "@rollup/rollup-linux-arm-musleabihf": "4.52.4", - "@rollup/rollup-linux-arm64-gnu": "4.52.4", - "@rollup/rollup-linux-arm64-musl": "4.52.4", - "@rollup/rollup-linux-loong64-gnu": "4.52.4", - "@rollup/rollup-linux-ppc64-gnu": "4.52.4", - "@rollup/rollup-linux-riscv64-gnu": "4.52.4", - "@rollup/rollup-linux-riscv64-musl": "4.52.4", - "@rollup/rollup-linux-s390x-gnu": "4.52.4", - "@rollup/rollup-linux-x64-gnu": "4.52.4", - "@rollup/rollup-linux-x64-musl": "4.52.4", - "@rollup/rollup-openharmony-arm64": "4.52.4", - "@rollup/rollup-win32-arm64-msvc": "4.52.4", - "@rollup/rollup-win32-ia32-msvc": "4.52.4", - "@rollup/rollup-win32-x64-gnu": "4.52.4", - "@rollup/rollup-win32-x64-msvc": "4.52.4", - "fsevents": "~2.3.2" - } - }, "node_modules/vkbeautify": { "version": "0.99.3", "resolved": "https://registry.npmjs.org/vkbeautify/-/vkbeautify-0.99.3.tgz", @@ -23320,9 +24546,9 @@ } }, "node_modules/watchpack": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", - "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz", + "integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==", "dev": true, "license": "MIT", "dependencies": { @@ -23344,15 +24570,6 @@ "minimalistic-assert": "^1.0.0" } }, - "node_modules/wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "license": "MIT", - "dependencies": { - "defaults": "^1.0.3" - } - }, "node_modules/weak-lru-cache": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/weak-lru-cache/-/weak-lru-cache-1.2.2.tgz", @@ -23417,9 +24634,9 @@ "license": "BSD-3-Clause" }, "node_modules/webdriver-bidi-protocol": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/webdriver-bidi-protocol/-/webdriver-bidi-protocol-0.3.6.tgz", - "integrity": "sha512-mlGndEOA9yK9YAbvtxaPTqdi/kaCWYYfwrZvGzcmkr/3lWM+tQj53BxtpVd6qbC6+E5OnHXgCcAhre6AkXzxjA==", + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/webdriver-bidi-protocol/-/webdriver-bidi-protocol-0.3.9.tgz", + "integrity": "sha512-uIYvlRQ0PwtZR1EzHlTMol1G0lAlmOe6wPykF9a77AK3bkpvZHzIVxRE2ThOx5vjy2zISe0zhwf5rzuUfbo1PQ==", "dev": true, "license": "Apache-2.0" }, @@ -23434,22 +24651,24 @@ } }, "node_modules/webpack": { - "version": "5.98.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.98.0.tgz", - "integrity": "sha512-UFynvx+gM44Gv9qFgj0acCQK2VE1CtdfwFdimkapco3hlPCJ/zeq73n2yVKimVbtm+TnApIugGhLJnkU6gjYXA==", + "version": "5.101.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.101.2.tgz", + "integrity": "sha512-4JLXU0tD6OZNVqlwzm3HGEhAHufSiyv+skb7q0d2367VDMzrU1Q/ZeepvkcHH0rZie6uqEtTQQe0OEOOluH3Mg==", "dev": true, "license": "MIT", "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.7", - "@types/estree": "^1.0.6", + "@types/estree": "^1.0.8", + "@types/json-schema": "^7.0.15", "@webassemblyjs/ast": "^1.14.1", "@webassemblyjs/wasm-edit": "^1.14.1", "@webassemblyjs/wasm-parser": "^1.14.1", - "acorn": "^8.14.0", + "acorn": "^8.15.0", + "acorn-import-phases": "^1.0.3", "browserslist": "^4.24.0", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.1", + "enhanced-resolve": "^5.17.3", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", @@ -23459,11 +24678,11 @@ "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^4.3.0", + "schema-utils": "^4.3.2", "tapable": "^2.1.1", "terser-webpack-plugin": "^5.3.11", "watchpack": "^2.4.1", - "webpack-sources": "^3.2.3" + "webpack-sources": "^3.3.3" }, "bin": { "webpack": "bin/webpack.js" @@ -23960,6 +25179,23 @@ } } }, + "node_modules/wsl-utils": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz", + "integrity": "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "is-wsl": "^3.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/xml": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", @@ -23999,9 +25235,9 @@ "license": "ISC" }, "node_modules/yaml": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", - "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", + "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", "devOptional": true, "license": "ISC", "bin": { @@ -24009,12 +25245,16 @@ }, "engines": { "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" } }, "node_modules/yargs": { "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, "license": "MIT", "dependencies": { "cliui": "^8.0.1", @@ -24033,6 +25273,7 @@ "version": "21.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, "license": "ISC", "engines": { "node": ">=12" @@ -24159,6 +25400,16 @@ "url": "https://github.com/sponsors/colinhacks" } }, + "node_modules/zod-to-json-schema": { + "version": "3.25.0", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.0.tgz", + "integrity": "sha512-HvWtU2UG41LALjajJrML6uQejQhNJx+JBO9IflpSja4R03iNWfKXrj6W2h7ljuLyc1nKS+9yDyL/9tD1U/yBnQ==", + "dev": true, + "license": "ISC", + "peerDependencies": { + "zod": "^3.25 || ^4" + } + }, "node_modules/zone.js": { "version": "0.15.1", "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.15.1.tgz", diff --git a/package.json b/package.json index 931360dd8..8b65122d4 100644 --- a/package.json +++ b/package.json @@ -31,26 +31,25 @@ "cypress:run": "cypress run" }, "dependencies": { - "@angular-devkit/schematics": "19.2.15", - "@angular/animations": "19.2.14", - "@angular/cdk": "^19.2.18", - "@angular/common": "19.2.14", - "@angular/compiler": "19.2.14", - "@angular/core": "19.2.14", - "@angular/forms": "19.2.14", - "@angular/localize": "19.2.14", - "@angular/material": "^19.2.18", - "@angular/platform-browser": "19.2.14", - "@angular/platform-browser-dynamic": "19.2.14", - "@angular/router": "19.2.14", - "@fortawesome/angular-fontawesome": "^1.0.0", + "@angular/animations": "20.3.15", + "@angular/cdk": "^20.2.14", + "@angular/common": "20.3.15", + "@angular/compiler": "20.3.15", + "@angular/core": "20.3.15", + "@angular/forms": "20.3.15", + "@angular/localize": "20.3.15", + "@angular/material": "^20.2.14", + "@angular/platform-browser": "20.3.15", + "@angular/platform-browser-dynamic": "20.3.15", + "@angular/router": "20.3.15", + "@fortawesome/angular-fontawesome": "^3.0.0", "@fortawesome/fontawesome-free": "^6.7.2", - "@fortawesome/fontawesome-svg-core": "6.2.1", - "@fortawesome/free-brands-svg-icons": "6.7.2", - "@fortawesome/free-solid-svg-icons": "6.2.1", + "@fortawesome/fontawesome-svg-core": "^6.7.2", + "@fortawesome/free-brands-svg-icons": "^6.7.2", + "@fortawesome/free-solid-svg-icons": "^6.7.2", "@ngx-translate/core": "^16.0.4", "@ngx-translate/http-loader": "^16.0.1", - "@swimlane/ngx-graph": "^10.0.0", + "@swimlane/ngx-graph": "^11.0.0", "@tailwindcss/forms": "^0.5.4", "@tinymce/tinymce-angular": "^9.1.1", "chart.js": "^4.5.1", @@ -62,24 +61,24 @@ "lightgallery": "^2.9.0", "lodash": "4.17.21", "moment": "^2.29.4", - "ngx-mat-select-search": "^7.0.10", - "rxjs": "7.8.1", + "ngx-mat-select-search": "^8.0.2", + "rxjs": "^7.8.2", "tinymce": "^8.2.2", - "tslib": "^2.0.0", + "tslib": "^2.8.1", "vkbeautify": "^0.99.3", "zone.js": "0.15.1" }, "devDependencies": { - "@angular-builders/jest": "^19.0.1", - "@angular-eslint/builder": "^19.7.0", - "@angular-eslint/eslint-plugin": "^19.7.0", - "@angular-eslint/eslint-plugin-template": "^19.7.0", - "@angular-eslint/schematics": "^19.7.0", - "@angular-eslint/template-parser": "^19.7.0", - "@angular/build": "^19.2.15", - "@angular/cli": "19.2.15", - "@angular/compiler-cli": "19.2.14", - "@angular/language-service": "19.2.14", + "@angular-builders/jest": "^20.0.0", + "@angular-eslint/builder": "^20.7.0", + "@angular-eslint/eslint-plugin": "^20.7.0", + "@angular-eslint/eslint-plugin-template": "^20.7.0", + "@angular-eslint/schematics": "^20.7.0", + "@angular-eslint/template-parser": "^20.7.0", + "@angular/build": "^20.3.13", + "@angular/cli": "20.3.13", + "@angular/compiler-cli": "20.3.15", + "@angular/language-service": "20.3.15", "@cypress/schematic": "^2.5.2", "@types/d3-dispatch": "^3.0.1", "@types/d3-drag": "^3.0.1", @@ -91,11 +90,11 @@ "@types/lodash": "4.14.132", "@types/node": "22.15.29", "@types/vkbeautify": "^0.99.2", - "@typescript-eslint/eslint-plugin": "^8.26.1", - "@typescript-eslint/parser": "^8.26.1", + "@typescript-eslint/eslint-plugin": "^8.48.1", + "@typescript-eslint/parser": "^8.48.1", "@vendure/ngx-translate-extract": "^9.4.0", "cypress": "^13.17.0", - "eslint": "^8.57.0", + "eslint": "^9.39.1", "git-describe": "^4.1.1", "htmlhint": "1.1.4", "https-proxy-agent": "7.0.2", @@ -103,10 +102,10 @@ "jasmine-core": "^4.2.0", "jasmine-spec-reporter": "~5.0.0", "jest": "^29.7.0", - "jest-preset-angular": "^14.6.0", + "jest-preset-angular": "^14.6.2", "lint-staged": "^15.2.10", - "prettier": "^3.3.3", - "prettier-plugin-multiline-arrays": "^3.0.6", + "prettier": "^3.6.2", + "prettier-plugin-multiline-arrays": "^4.0.5", "puppeteer": "^24.4.0", "stylelint": "^16.10.0", "stylelint-config-recommended-scss": "^14.1.0", @@ -114,7 +113,7 @@ "stylelint-scss": "^6.8.1", "tailwindcss": "^3.3.3", "ts-node": "^10.9.2", - "typescript": "^5.4.5" + "typescript": "^5.9.3" }, "repository": { "type": "git", @@ -124,7 +123,7 @@ "url": "https://mifosforge.jira.com/jira/software/c/projects/WEB/boards/62" }, "engines": { - "node": ">= 16.15.1", + "node": ">= 20.19.0", "npm": ">= 8.11.0" }, "lint-staged": { diff --git a/src/app/account-transfers/account-transfers.service.ts b/src/app/account-transfers/account-transfers.service.ts index 01d42fcb3..bac4ffa3d 100644 --- a/src/app/account-transfers/account-transfers.service.ts +++ b/src/app/account-transfers/account-transfers.service.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http'; /** rxjs Imports */ @@ -16,7 +16,7 @@ import { switchMap } from 'rxjs/operators'; providedIn: 'root' }) export class AccountTransfersService { - constructor(private http: HttpClient) {} + private http = inject(HttpClient); /** * @params standingInstructionsId diff --git a/src/app/account-transfers/common-resolvers/list-transactions.resolver.ts b/src/app/account-transfers/common-resolvers/list-transactions.resolver.ts index 7cae7bfe8..b8d64d1e9 100644 --- a/src/app/account-transfers/common-resolvers/list-transactions.resolver.ts +++ b/src/app/account-transfers/common-resolvers/list-transactions.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -14,14 +14,8 @@ import { SettingsService } from 'app/settings/settings.service'; */ @Injectable() export class ListTransactionsResolver { - /** - * @param {AccountTransfersService} accountTransfersService Account Transfers service. - * @param {SettingsService} settingsService Settings Service. - */ - constructor( - private accountTransfersService: AccountTransfersService, - private settingsService: SettingsService - ) {} + private accountTransfersService = inject(AccountTransfersService); + private settingsService = inject(SettingsService); /** * Returns the Standing Instructions Data. diff --git a/src/app/account-transfers/common-resolvers/make-account-transfer-template.resolver.ts b/src/app/account-transfers/common-resolvers/make-account-transfer-template.resolver.ts index 0809f478b..8631d765b 100644 --- a/src/app/account-transfers/common-resolvers/make-account-transfer-template.resolver.ts +++ b/src/app/account-transfers/common-resolvers/make-account-transfer-template.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,12 +13,10 @@ import { AccountTransfersService } from '../account-transfers.service'; */ @Injectable() export class MakeAccountTransferTemplateResolver { + private accountTransfersService = inject(AccountTransfersService); + accountTypeId: string; id: any; - /** - * @param {accountTransfersService} AccountTransfersService Account Transfers service. - */ - constructor(private accountTransfersService: AccountTransfersService) {} /** * Returns the Standing Instructions Data. diff --git a/src/app/account-transfers/common-resolvers/standing-instructions-data-and-template.resolver.ts b/src/app/account-transfers/common-resolvers/standing-instructions-data-and-template.resolver.ts index f801c80b3..e09842bbf 100644 --- a/src/app/account-transfers/common-resolvers/standing-instructions-data-and-template.resolver.ts +++ b/src/app/account-transfers/common-resolvers/standing-instructions-data-and-template.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { AccountTransfersService } from '../account-transfers.service'; */ @Injectable() export class StandingInstructionsDataAndTemplateResolver { - /** - * @param {accountTransfersService} AccountTransfersService Account Transfers service. - */ - constructor(private accountTransfersService: AccountTransfersService) {} + private accountTransfersService = inject(AccountTransfersService); /** * Returns the Standing Instructions Data. diff --git a/src/app/account-transfers/common-resolvers/standing-instructions-template.resolver.ts b/src/app/account-transfers/common-resolvers/standing-instructions-template.resolver.ts index 205a0e8e6..a9d25b053 100644 --- a/src/app/account-transfers/common-resolvers/standing-instructions-template.resolver.ts +++ b/src/app/account-transfers/common-resolvers/standing-instructions-template.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,12 +13,9 @@ import { AccountTransfersService } from '../account-transfers.service'; */ @Injectable() export class StandingInstructionsTemplateResolver { - accountTypeId: string; + private accountTransfersService = inject(AccountTransfersService); - /** - * @param {accountTransfersService} AccountTransfersService Account Transfers service. - */ - constructor(private accountTransfersService: AccountTransfersService) {} + accountTypeId: string; /** * Returns the Standing Instructions Data. diff --git a/src/app/account-transfers/common-resolvers/view-account-transfer.resolver.ts b/src/app/account-transfers/common-resolvers/view-account-transfer.resolver.ts index fd9e74f53..842cf755c 100644 --- a/src/app/account-transfers/common-resolvers/view-account-transfer.resolver.ts +++ b/src/app/account-transfers/common-resolvers/view-account-transfer.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { AccountTransfersService } from '../account-transfers.service'; */ @Injectable() export class ViewAccountTransferResolver { - /** - * @param {AccountTransfersService} AccountTransfersService Savings service. - */ - constructor(private accountTransfersService: AccountTransfersService) {} + private accountTransfersService = inject(AccountTransfersService); /** * Returns the View Account Transfer data. diff --git a/src/app/account-transfers/common-resolvers/view-standing-instructions.resolver.ts b/src/app/account-transfers/common-resolvers/view-standing-instructions.resolver.ts index 2031cb691..ff9c93368 100644 --- a/src/app/account-transfers/common-resolvers/view-standing-instructions.resolver.ts +++ b/src/app/account-transfers/common-resolvers/view-standing-instructions.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { AccountTransfersService } from '../account-transfers.service'; */ @Injectable() export class ViewStandingInstructionsResolver { - /** - * @param {accountTransfersService} AccountTransfersService Account Transfers service. - */ - constructor(private accountTransfersService: AccountTransfersService) {} + private accountTransfersService = inject(AccountTransfersService); /** * Returns the Standing Instructions Data. diff --git a/src/app/account-transfers/create-standing-instructions/create-standing-instructions.component.html b/src/app/account-transfers/create-standing-instructions/create-standing-instructions.component.html index 9a31e028e..2373d4f5d 100644 --- a/src/app/account-transfers/create-standing-instructions/create-standing-instructions.component.html +++ b/src/app/account-transfers/create-standing-instructions/create-standing-instructions.component.html @@ -6,10 +6,12 @@ {{ 'labels.inputs.name' | translate }} - - {{ 'labels.inputs.name' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.inputs.required' | translate }} - + @if (createStandingInstructionsForm.controls.name.hasError('required')) { + + {{ 'labels.inputs.name' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.inputs.required' | translate }} + + } @@ -20,153 +22,199 @@ {{ 'labels.inputs.Type' | translate }} - - {{ transferType.value }} - + @for (transferType of transferTypeData; track transferType) { + + {{ transferType.value }} + + } - - {{ 'labels.inputs.Transfer Type' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.inputs.required' | translate }} - + @if (createStandingInstructionsForm.controls.transferType.hasError('required')) { + + {{ 'labels.inputs.Transfer Type' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.inputs.required' | translate }} + + } {{ 'labels.inputs.Priority' | translate }} - - {{ priorityType.value }} - + @for (priorityType of priorityTypeData; track priorityType) { + + {{ priorityType.value }} + + } - - {{ 'labels.inputs.Priority' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (createStandingInstructionsForm.controls.priority.hasError('required')) { + + {{ 'labels.inputs.Priority' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Status' | translate }} - - {{ statusType.value }} - + @for (statusType of statusTypeData; track statusType) { + + {{ statusType.value }} + + } - - {{ 'labels.inputs.Status' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (createStandingInstructionsForm.controls.status.hasError('required')) { + + {{ 'labels.inputs.Status' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.From Account Type' | translate }} - - {{ fromAccountType.value }} - + @for (fromAccountType of fromAccountTypeData; track fromAccountType) { + + {{ fromAccountType.value }} + + } - - {{ 'labels.inputs.From Account Type' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (createStandingInstructionsForm.controls.fromAccountType.hasError('required')) { + + {{ 'labels.inputs.From Account Type' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.From Account' | translate }} - - {{ fromAccount.productName }} - {{ fromAccount.accountNo }} - + @for (fromAccount of fromAccountData; track fromAccount) { + + {{ fromAccount.productName }} - {{ fromAccount.accountNo }} + + } - - {{ 'labels.inputs.From Account' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (createStandingInstructionsForm.controls.fromAccountId.hasError('required')) { + + {{ 'labels.inputs.From Account' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Destination' | translate }} - - {{ destinationType.value }} - + @for (destinationType of destinationTypeData; track destinationType) { + + {{ destinationType.value }} + + } - - {{ 'labels.inputs.Destination' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (createStandingInstructionsForm.controls.destination.hasError('required')) { + + {{ 'labels.inputs.Destination' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.To Office' | translate }} - - {{ toOfficeType.name }} - + @for (toOfficeType of toOfficeTypeData; track toOfficeType) { + + {{ toOfficeType.name }} + + } - - {{ 'labels.inputs.To Office' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (createStandingInstructionsForm.controls.toOfficeId.hasError('required')) { + + {{ 'labels.inputs.To Office' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Beneficiary' | translate }} - - {{ toClientType.displayName }} - + @for (toClientType of toClientTypeData; track toClientType) { + + {{ toClientType.displayName }} + + } - - {{ 'labels.inputs.Beneficiary' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (createStandingInstructionsForm.controls.toClientId.hasError('required')) { + + {{ 'labels.inputs.Beneficiary' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.To Account Type' | translate }} - - {{ toAccountType.value }} - + @for (toAccountType of toAccountTypeData; track toAccountType) { + + {{ toAccountType.value }} + + } - - {{ 'labels.inputs.To Account Type' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (createStandingInstructionsForm.controls.toAccountType.hasError('required')) { + + {{ 'labels.inputs.To Account Type' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.To Account' | translate }} - - {{ toAccount.productName }} - {{ toAccount.accountNo }} - + @for (toAccount of toAccountData; track toAccount) { + + {{ toAccount.productName }} - {{ toAccount.accountNo }} + + } - - {{ 'labels.inputs.To Account' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (createStandingInstructionsForm.controls.toAccountId.hasError('required')) { + + {{ 'labels.inputs.To Account' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Standing Instruction Type' | translate }} - - {{ instructionsType.value }} - + @for (instructionsType of instructionTypeData; track instructionsType) { + + {{ instructionsType.value }} + + } - - {{ 'labels.inputs.Standing Instruction Type' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (createStandingInstructionsForm.controls.instructionType.hasError('required')) { + + {{ 'labels.inputs.Standing Instruction Type' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Amount' | translate }} - - {{ 'labels.inputs.Amount' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (createStandingInstructionsForm.controls.amount.hasError('required')) { + + {{ 'labels.inputs.Amount' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } @@ -181,10 +229,12 @@ /> - - {{ 'labels.inputs.Valid From Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (createStandingInstructionsForm.controls.validFrom.hasError('required')) { + + {{ 'labels.inputs.Valid From Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } @@ -199,48 +249,57 @@ /> - - {{ 'labels.inputs.Valid Till Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (createStandingInstructionsForm.controls.validTill.hasError('required')) { + + {{ 'labels.inputs.Valid Till Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Recurrence Type' | translate }} - - {{ recurrenceType.value }} - + @for (recurrenceType of recurrenceTypeData; track recurrenceType) { + + {{ recurrenceType.value }} + + } - - {{ 'labels.inputs.Recurrence Type' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (createStandingInstructionsForm.controls.recurrenceType.hasError('required')) { + + {{ 'labels.inputs.Recurrence Type' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Interval' | translate }} - - {{ 'labels.inputs.Recurrence Interval' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (createStandingInstructionsForm.controls.recurrenceInterval.hasError('required')) { + + {{ 'labels.inputs.Recurrence Interval' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Recurrence Frequency' | translate }} - - {{ recurrenceFrequencyType.value }} - + @for (recurrenceFrequencyType of recurrenceFrequencyTypeData; track recurrenceFrequencyType) { + + {{ recurrenceFrequencyType.value }} + + } - - {{ 'labels.inputs.Recurrence Frequency' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (createStandingInstructionsForm.controls.recurrenceFrequency.hasError('required')) { + + {{ 'labels.inputs.Recurrence Frequency' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } @@ -255,10 +314,12 @@ /> - - {{ 'labels.inputs.On Month Day' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (createStandingInstructionsForm.controls.recurrenceOnMonthDay.hasError('required')) { + + {{ 'labels.inputs.On Month Day' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } diff --git a/src/app/account-transfers/create-standing-instructions/create-standing-instructions.component.ts b/src/app/account-transfers/create-standing-instructions/create-standing-instructions.component.ts index 0cc50bb7f..c0577e7b9 100644 --- a/src/app/account-transfers/create-standing-instructions/create-standing-instructions.component.ts +++ b/src/app/account-transfers/create-standing-instructions/create-standing-instructions.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; import { UntypedFormBuilder, UntypedFormGroup, Validators, FormControl, ReactiveFormsModule } from '@angular/forms'; @@ -21,6 +21,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class CreateStandingInstructionsComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private route = inject(ActivatedRoute); + private router = inject(Router); + private accountTransfersService = inject(AccountTransfersService); + private settingsService = inject(SettingsService); + private dateUtils = inject(Dates); + /** Standing Instructions Data */ standingIntructionsTemplate: any; /** Minimum date allowed. */ @@ -79,14 +86,7 @@ export class CreateStandingInstructionsComponent implements OnInit { * @param {SettingsService} settingsService Settings Service * @param {Dates} dateUtils Date Utils */ - constructor( - private formBuilder: UntypedFormBuilder, - private route: ActivatedRoute, - private router: Router, - private accountTransfersService: AccountTransfersService, - private settingsService: SettingsService, - private dateUtils: Dates - ) { + constructor() { this.route.data.subscribe((data: { standingIntructionsTemplate: any }) => { this.standingIntructionsTemplate = data.standingIntructionsTemplate; this.setParams(); diff --git a/src/app/account-transfers/edit-standing-instructions/edit-standing-instructions.component.html b/src/app/account-transfers/edit-standing-instructions/edit-standing-instructions.component.html index 8e6d14a0b..6a82394ef 100644 --- a/src/app/account-transfers/edit-standing-instructions/edit-standing-instructions.component.html +++ b/src/app/account-transfers/edit-standing-instructions/edit-standing-instructions.component.html @@ -26,27 +26,35 @@ {{ 'labels.inputs.Priority' | translate }} - - {{ priorityType.value }} - + @for (priorityType of priorityTypeData; track priorityType) { + + {{ priorityType.value }} + + } - - {{ 'labels.inputs.Priority' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (editStandingInstructionsForm.controls.priority.hasError('required')) { + + {{ 'labels.inputs.Priority' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Status' | translate }} - - {{ statusType.value }} - + @for (statusType of statusTypeData; track statusType) { + + {{ statusType.value }} + + } - - {{ 'labels.inputs.Status' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (editStandingInstructionsForm.controls.status.hasError('required')) { + + {{ 'labels.inputs.Status' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } @@ -82,9 +90,11 @@ {{ 'labels.inputs.Standing Instruction Type' | translate }} - - {{ instructionsType.value }} - + @for (instructionsType of instructionTypeData; track instructionsType) { + + {{ instructionsType.value }} + + } @@ -105,10 +115,12 @@ /> - - {{ 'labels.inputs.Valid From Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (editStandingInstructionsForm.controls.validFrom.hasError('required')) { + + {{ 'labels.inputs.Valid From Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } @@ -123,23 +135,29 @@ /> - - {{ 'labels.inputs.Valid Till Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (editStandingInstructionsForm.controls.validTill.hasError('required')) { + + {{ 'labels.inputs.Valid Till Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Recurrence Type' | translate }} - - {{ recurrenceType.value }} - + @for (recurrenceType of recurrenceTypeData; track recurrenceType) { + + {{ recurrenceType.value }} + + } - - {{ 'labels.inputs.Recurrence Type' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (editStandingInstructionsForm.controls.recurrenceType.hasError('required')) { + + {{ 'labels.inputs.Recurrence Type' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } @@ -150,12 +168,11 @@ {{ 'labels.inputs.Recurrence Frequency' | translate }} - - {{ recurrenceFrequencyType.value }} - + @for (recurrenceFrequencyType of recurrenceFrequencyTypeData; track recurrenceFrequencyType) { + + {{ recurrenceFrequencyType.value }} + + } diff --git a/src/app/account-transfers/edit-standing-instructions/edit-standing-instructions.component.ts b/src/app/account-transfers/edit-standing-instructions/edit-standing-instructions.component.ts index fd3ef0207..8a599c8e0 100644 --- a/src/app/account-transfers/edit-standing-instructions/edit-standing-instructions.component.ts +++ b/src/app/account-transfers/edit-standing-instructions/edit-standing-instructions.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; import { UntypedFormBuilder, UntypedFormGroup, Validators, FormControl, ReactiveFormsModule } from '@angular/forms'; @@ -21,6 +21,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class EditStandingInstructionsComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private route = inject(ActivatedRoute); + private router = inject(Router); + private accountTransfersService = inject(AccountTransfersService); + private settingsService = inject(SettingsService); + private dateUtils = inject(Dates); + /** Standing Instructions Data */ standingInstructionsData: any; /** Standing Instructions Id */ @@ -53,14 +60,7 @@ export class EditStandingInstructionsComponent implements OnInit { * @param {SettingsService} settingsService Settings Service * @param {Dates} dateUtils Date Utils */ - constructor( - private formBuilder: UntypedFormBuilder, - private route: ActivatedRoute, - private router: Router, - private accountTransfersService: AccountTransfersService, - private settingsService: SettingsService, - private dateUtils: Dates - ) { + constructor() { this.route.data.subscribe((data: { standingInstructionsDataAndTemplate: any }) => { this.standingInstructionsData = data.standingInstructionsDataAndTemplate; this.standingInstructionsId = data.standingInstructionsDataAndTemplate.id; diff --git a/src/app/account-transfers/list-standing-instructions/list-standing-instructions.component.html b/src/app/account-transfers/list-standing-instructions/list-standing-instructions.component.html index 3d07c885e..9f98e1c75 100644 --- a/src/app/account-transfers/list-standing-instructions/list-standing-instructions.component.html +++ b/src/app/account-transfers/list-standing-instructions/list-standing-instructions.component.html @@ -2,32 +2,38 @@
-
- -

{{ 'labels.heading.Client Type' | translate }}

-
- -

{{ clientName }}

-
-
+ @if (isFromClient) { +
+ +

{{ 'labels.heading.Client Type' | translate }}

+
+ +

{{ clientName }}

+
+
+ } -
- - - - - - -
+ @if (!isFromClient) { +
+ + + + + + +
+ } {{ 'labels.inputs.Type' | translate }} - - {{ transferTypeData.value }} - + @for (transferTypeData of transferTypeDatas; track transferTypeData) { + + {{ transferTypeData.value }} + + } @@ -88,30 +94,34 @@ {{ 'labels.inputs.Actions' | translate }} - - - - - - + @if (instruction.status.value !== 'Deleted') { + + + + } + @if (instruction.status.value !== 'Deleted') { + + + + }
diff --git a/src/app/account-transfers/make-account-transfers/make-account-transfers.component.html b/src/app/account-transfers/make-account-transfers/make-account-transfers.component.html index e5462f6c3..cfbc431dd 100644 --- a/src/app/account-transfers/make-account-transfers/make-account-transfers.component.html +++ b/src/app/account-transfers/make-account-transfers/make-account-transfers.component.html @@ -1,343 +1,364 @@
-
-
-
-
-
-
+ @if (isLoading) { +
+
+
+
+
+
+ } - - - -
-

{{ 'labels.heading.Transferring From Details' | translate }}

- - - -
-
-
{{ 'labels.inputs.Applicant' | translate }}
-
{{ accountTransferTemplateData.fromClient.displayName }}
-
- -
-
{{ 'labels.inputs.Office' | translate }}
-
{{ accountTransferTemplateData.fromOffice.name }}
-
- -
-
{{ 'labels.inputs.From Account' | translate }}
-
- {{ accountTransferTemplateData.fromAccount.productName }} - #{{ - accountTransferTemplateData.fromAccount.accountNo - }} + @if (!isLoading) { + + + +
+

{{ 'labels.heading.Transferring From Details' | translate }}

+ +
+
+
{{ 'labels.inputs.Applicant' | translate }}
+
{{ accountTransferTemplateData.fromClient.displayName }}
+
+
+
{{ 'labels.inputs.Office' | translate }}
+
{{ accountTransferTemplateData.fromOffice.name }}
+
+
+
{{ 'labels.inputs.From Account' | translate }}
+
+ {{ accountTransferTemplateData.fromAccount.productName }} - #{{ + accountTransferTemplateData.fromAccount.accountNo + }} +
+
+
+
{{ 'labels.inputs.From Account Type' | translate }}
+
{{ accountTransferTemplateData.fromAccountType.value }}
+
+
+
{{ 'labels.inputs.Currency' | translate }}
+
{{ accountTransferTemplateData.currency.name }}
- -
-
{{ 'labels.inputs.From Account Type' | translate }}
-
{{ accountTransferTemplateData.fromAccountType.value }}
-
- -
-
{{ 'labels.inputs.Currency' | translate }}
-
{{ accountTransferTemplateData.currency.name }}
-
-
- - -
-
-

{{ 'labels.heading.Transferred To' | translate }}

- - {{ 'labels.inputs.Phone Number' | translate }} - - {{ phoneAccount.length || 0 }}/10 - -
- - - + + @if (interbank) { +
+
+

{{ 'labels.heading.Transferred To' | translate }}

+ + {{ 'labels.inputs.Phone Number' | translate }} + + {{ phoneAccount.length || 0 }}/10 + +
+ + @if (!interbankTransferForm) { + + + + + + } +
+ } + @if (!interbank) { + + } + + @if (!interbank && makeAccountTransferForm) { +
+

{{ 'labels.heading.Transfer Details' | translate }}

+
+ + {{ 'labels.inputs.Transaction Date' | translate }} + + + + @if (makeAccountTransferForm.controls.transferDate.hasError('required')) { + + {{ 'labels.inputs.Transaction Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + + {{ 'labels.inputs.Office' | translate }} + + @for (toOfficeType of toOfficeTypeData; track toOfficeType) { + + {{ toOfficeType.name }} + + } + + @if (makeAccountTransferForm.controls.toOfficeId.hasError('required')) { + + {{ 'labels.inputs.Office' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + + {{ 'labels.inputs.Client' | translate }} + + @if (makeAccountTransferForm.controls.toClientId.hasError('required')) { + + {{ 'labels.inputs.Client' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + + @for (client of clientsData; track client) { + {{ client.id }} - {{ client.displayName }} + } + + + {{ 'labels.inputs.Account Type' | translate }} + + @for (toAccountType of toAccountTypeData; track toAccountType) { + + {{ toAccountType.value }} + + } + + @if (makeAccountTransferForm.controls.toAccountType.hasError('required')) { + + {{ 'labels.inputs.Account Type' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + + {{ 'labels.inputs.Account' | translate }} + + @for (toAccount of toAccountData; track toAccount) { + + {{ toAccount.productName }} - {{ toAccount.accountNo }} + + } + + @if (makeAccountTransferForm.controls.toAccountId.hasError('required')) { + + {{ 'labels.inputs.Account' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + + {{ 'labels.inputs.Amount' | translate }} + + @if (makeAccountTransferForm.controls.transferAmount.hasError('required')) { + + {{ 'labels.inputs.Amount' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + @if (makeAccountTransferForm.get('transferAmount')?.hasError('amountExceedsBalance')) { + + + {{ 'errors.validation.msg.savingsproduct.insufficient.balance' | translate: { balance } }} + + } + + + {{ 'labels.inputs.Description' | translate }} + + @if (makeAccountTransferForm.controls.transferDescription.hasError('required')) { + + {{ 'labels.inputs.Transfer Description' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + +
+
+ } + + @if (interbank && interbankTransferForm && makeAccountTransferForm) { +
+

{{ 'labels.heading.Transfer Details' | translate }}

+
+ + {{ 'labels.inputs.Transaction Date' | translate }} + + + + @if (makeAccountTransferForm.controls.transferDate.hasError('required')) { + + {{ 'labels.inputs.Transaction Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + + {{ 'labels.inputs.Bank' | translate }} + + + + {{ 'labels.inputs.Client' | translate }} + + + + {{ 'labels.inputs.Account Type' | translate }} + + + + {{ 'labels.inputs.Account' | translate }} + + + + {{ 'labels.inputs.Amount' | translate }} + + @if (makeAccountTransferForm.controls.transferAmount.hasError('required')) { + + {{ 'labels.inputs.Amount' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + @if (makeAccountTransferForm.controls.transferAmount.hasError('min')) { + + {{ 'labels.inputs.Amount' | translate }} {{ 'labels.commons.mustBeAtLeast' | translate }} 0.01 + + } + @if (makeAccountTransferForm.get('transferAmount')?.hasError('amountExceedsBalance')) { + + + {{ 'errors.validation.msg.savingsproduct.insufficient.balance' | translate: { balance } }} + + } + + + {{ 'labels.inputs.Description' | translate }} + + @if (makeAccountTransferForm.controls.transferDescription.hasError('required')) { + + {{ 'labels.inputs.Transfer Description' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + +
+
+ } + + @if (!isLoading && makeAccountTransferForm) { + + - + @if (interbank && interbankTransferForm) { + + } + @if (!interbank) { + + } -
- - - - -
-

{{ 'labels.heading.Transfer Details' | translate }}

- -
- - {{ 'labels.inputs.Transaction Date' | translate }} - - - - - {{ 'labels.inputs.Transaction Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - - - {{ 'labels.inputs.Office' | translate }} - - - {{ toOfficeType.name }} - - - - {{ 'labels.inputs.Office' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - - - {{ 'labels.inputs.Client' | translate }} - - - {{ 'labels.inputs.Client' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - - - - {{ client.id }} - {{ client.displayName }} - - - - - {{ 'labels.inputs.Account Type' | translate }} - - - {{ toAccountType.value }} - - - - {{ 'labels.inputs.Account Type' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - - - {{ 'labels.inputs.Account' | translate }} - - - {{ toAccount.productName }} - {{ toAccount.accountNo }} - - - - {{ 'labels.inputs.Account' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - - - {{ 'labels.inputs.Amount' | translate }} - - - {{ 'labels.inputs.Amount' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - - {{ 'errors.validation.msg.savingsproduct.insufficient.balance' | translate: { balance } }} - - - - - {{ 'labels.inputs.Description' | translate }} - - - {{ 'labels.inputs.Transfer Description' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - -
-
- - -
-

{{ 'labels.heading.Transfer Details' | translate }}

- -
- - {{ 'labels.inputs.Transaction Date' | translate }} - - - - - {{ 'labels.inputs.Transaction Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - - - {{ 'labels.inputs.Bank' | translate }} - - - - - {{ 'labels.inputs.Client' | translate }} - - - - - {{ 'labels.inputs.Account Type' | translate }} - - - - - {{ 'labels.inputs.Account' | translate }} - - - - - {{ 'labels.inputs.Amount' | translate }} - - - {{ 'labels.inputs.Amount' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - {{ 'labels.inputs.Amount' | translate }} {{ 'labels.commons.mustBeAtLeast' | translate }} 0.01 - - - - {{ 'errors.validation.msg.savingsproduct.insufficient.balance' | translate: { balance } }} - - - - - {{ 'labels.inputs.Description' | translate }} - - - {{ 'labels.inputs.Transfer Description' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - -
-
- - - - - - - - - - - - + } + + }
diff --git a/src/app/account-transfers/make-account-transfers/make-account-transfers.component.ts b/src/app/account-transfers/make-account-transfers/make-account-transfers.component.ts index 47411809d..050ba90d1 100644 --- a/src/app/account-transfers/make-account-transfers/make-account-transfers.component.ts +++ b/src/app/account-transfers/make-account-transfers/make-account-transfers.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, AfterViewInit } from '@angular/core'; +import { Component, OnInit, AfterViewInit, inject } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; import { AbstractControl, @@ -44,6 +44,14 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class MakeAccountTransfersComponent implements OnInit, AfterViewInit { + private formBuilder = inject(UntypedFormBuilder); + private route = inject(ActivatedRoute); + private router = inject(Router); + private accountTransfersService = inject(AccountTransfersService); + private dateUtils = inject(Dates); + private settingsService = inject(SettingsService); + private clientsService = inject(ClientsService); + /** Standing Instructions Data */ accountTransferTemplateData: any; /** Minimum date allowed. */ @@ -87,15 +95,7 @@ export class MakeAccountTransfersComponent implements OnInit, AfterViewInit { * @param {SettingsService} settingsService Settings Service * @param {ClientsService} clientsService Clients Service */ - constructor( - private formBuilder: UntypedFormBuilder, - private route: ActivatedRoute, - private router: Router, - private accountTransfersService: AccountTransfersService, - private dateUtils: Dates, - private settingsService: SettingsService, - private clientsService: ClientsService - ) { + constructor() { this.route.data.subscribe((data: { accountTransferTemplate: any }) => { this.accountTransferTemplateData = data.accountTransferTemplate; this.setParams(); @@ -117,7 +117,7 @@ export class MakeAccountTransfersComponent implements OnInit, AfterViewInit { this.accountTypeId = '2'; this.id = this.route.snapshot.queryParams['savingsId']; this.interbank = this.route.snapshot.queryParams['interbank'] === 'true'; - const navigationBalance = this.router.getCurrentNavigation()?.extras?.state?.balance; + const navigationBalance = this.router.currentNavigation()?.extras?.state?.balance; const templateBalance = this.accountTransferTemplateData?.fromAccount?.availableBalance ?? this.accountTransferTemplateData?.fromAccount?.summary?.accountBalance ?? @@ -168,7 +168,8 @@ export class MakeAccountTransfersComponent implements OnInit, AfterViewInit { [ Validators.required, Validators.min(0.01), - this.amountExceedsBalanceValidator.bind(this)] + this.amountExceedsBalanceValidator.bind(this) + ] ], transferDate: [ this.settingsService.businessDate, @@ -207,7 +208,8 @@ export class MakeAccountTransfersComponent implements OnInit, AfterViewInit { [ Validators.required, Validators.min(0.01), - this.amountExceedsBalanceValidator.bind(this)] + this.amountExceedsBalanceValidator.bind(this) + ] ], transferDate: [ this.settingsService.businessDate, @@ -252,7 +254,8 @@ export class MakeAccountTransfersComponent implements OnInit, AfterViewInit { [ Validators.required, Validators.min(0.01), - this.amountExceedsBalanceValidator.bind(this)] + this.amountExceedsBalanceValidator.bind(this) + ] ], transferDate: [ this.settingsService.businessDate, diff --git a/src/app/account-transfers/view-account-transfer/view-account-transfer.component.html b/src/app/account-transfers/view-account-transfer/view-account-transfer.component.html index c3e05f7b7..f81869acd 100644 --- a/src/app/account-transfers/view-account-transfer/view-account-transfer.component.html +++ b/src/app/account-transfers/view-account-transfer/view-account-transfer.component.html @@ -1,10 +1,12 @@
- - - + @if (!viewAccountTransferData.reversed) { + + + + }
diff --git a/src/app/account-transfers/view-account-transfer/view-account-transfer.component.ts b/src/app/account-transfers/view-account-transfer/view-account-transfer.component.ts index c4a670e40..660d7e153 100644 --- a/src/app/account-transfers/view-account-transfer/view-account-transfer.component.ts +++ b/src/app/account-transfers/view-account-transfer/view-account-transfer.component.ts @@ -1,6 +1,6 @@ /** Angular Imports */ import { Location, NgIf, NgClass } from '@angular/common'; -import { Component } from '@angular/core'; +import { Component, inject } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; import { FaIconComponent } from '@fortawesome/angular-fontawesome'; import { MatDivider } from '@angular/material/divider'; @@ -22,16 +22,16 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ViewAccountTransferComponent { + private route = inject(ActivatedRoute); + private location = inject(Location); + viewAccountTransferData: any; /** * Retrieves the view account transfer data from `resolve`. * @param {ActivatedRoute} route Activated Route. * @param {Location} location Location. */ - constructor( - private route: ActivatedRoute, - private location: Location - ) { + constructor() { this.route.data.subscribe((data: { viewAccountTransferData: any }) => { this.viewAccountTransferData = data.viewAccountTransferData; }); diff --git a/src/app/account-transfers/view-standing-instructions/view-standing-instructions.component.html b/src/app/account-transfers/view-standing-instructions/view-standing-instructions.component.html index ca2efa8fd..144cb0547 100644 --- a/src/app/account-transfers/view-standing-instructions/view-standing-instructions.component.html +++ b/src/app/account-transfers/view-standing-instructions/view-standing-instructions.component.html @@ -57,8 +57,12 @@
{{ 'labels.inputs.Destination' | translate }}: - {{ 'labels.inputs.Within Bank' | translate }} - {{ 'labels.inputs.Own Account' | translate }} + @if (allowclientedit) { + {{ 'labels.inputs.Within Bank' | translate }} + } + @if (!allowclientedit) { + {{ 'labels.inputs.Own Account' | translate }} + }
diff --git a/src/app/account-transfers/view-standing-instructions/view-standing-instructions.component.ts b/src/app/account-transfers/view-standing-instructions/view-standing-instructions.component.ts index 5fe9c768a..eef9b3278 100644 --- a/src/app/account-transfers/view-standing-instructions/view-standing-instructions.component.ts +++ b/src/app/account-transfers/view-standing-instructions/view-standing-instructions.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component } from '@angular/core'; +import { Component, inject } from '@angular/core'; import { ActivatedRoute, RouterLink } from '@angular/router'; import { FaIconComponent } from '@fortawesome/angular-fontawesome'; import { MatDivider } from '@angular/material/divider'; @@ -18,6 +18,8 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ViewStandingInstructionsComponent { + private route = inject(ActivatedRoute); + /** Standing Instructions Data */ standingInstructionsData: any; /** Allow Client Edit */ @@ -27,7 +29,7 @@ export class ViewStandingInstructionsComponent { * Retrieves the standing instructions data from `resolve`. * @param {ActivatedRoute} route Activated Route. */ - constructor(private route: ActivatedRoute) { + constructor() { this.route.data.subscribe((data: { standingInstructionsData: any }) => { this.standingInstructionsData = data.standingInstructionsData; if (this.standingInstructionsData.fromClient.id === this.standingInstructionsData.toClient.id) { diff --git a/src/app/accounting/accounting-routing.module.ts b/src/app/accounting/accounting-routing.module.ts index 171796946..1161219a3 100644 --- a/src/app/accounting/accounting-routing.module.ts +++ b/src/app/accounting/accounting-routing.module.ts @@ -386,7 +386,6 @@ const routes: Routes = [ ] } ]) - ]; /** diff --git a/src/app/accounting/accounting-rules/accounting-rule.resolver.ts b/src/app/accounting/accounting-rules/accounting-rule.resolver.ts index fc618ab69..a841fb331 100644 --- a/src/app/accounting/accounting-rules/accounting-rule.resolver.ts +++ b/src/app/accounting/accounting-rules/accounting-rule.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { AccountingService } from '../accounting.service'; */ @Injectable() export class AccountingRuleResolver { - /** - * @param {AccountingService} accountingService Accounting service. - */ - constructor(private accountingService: AccountingService) {} + private accountingService = inject(AccountingService); /** * Returns the accounting rule data. diff --git a/src/app/accounting/accounting-rules/accounting-rules-template.resolver.ts b/src/app/accounting/accounting-rules/accounting-rules-template.resolver.ts index 4aaa54398..7345bfeb1 100644 --- a/src/app/accounting/accounting-rules/accounting-rules-template.resolver.ts +++ b/src/app/accounting/accounting-rules/accounting-rules-template.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; /** rxjs Imports */ import { Observable } from 'rxjs'; @@ -12,10 +12,7 @@ import { AccountingService } from '../accounting.service'; */ @Injectable() export class AccountingRulesTemplateResolver { - /** - * @param {AccountingService} accountingService Accounting service. - */ - constructor(private accountingService: AccountingService) {} + private accountingService = inject(AccountingService); /** * Returns the accounting rules template data. diff --git a/src/app/accounting/accounting-rules/accounting-rules.component.ts b/src/app/accounting/accounting-rules/accounting-rules.component.ts index adcdb6be9..07b837ac0 100644 --- a/src/app/accounting/accounting-rules/accounting-rules.component.ts +++ b/src/app/accounting/accounting-rules/accounting-rules.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, ViewChild } from '@angular/core'; +import { Component, OnInit, ViewChild, inject } from '@angular/core'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort, MatSortHeader } from '@angular/material/sort'; import { @@ -45,6 +45,8 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class AccountingRulesComponent implements OnInit { + private route = inject(ActivatedRoute); + /** Accounting rule data. */ accountingRuleData: any; /** Columns to be displayed in accounting rules table. */ @@ -68,7 +70,7 @@ export class AccountingRulesComponent implements OnInit { * Retrieves the accounting rules data from `resolve`. * @param {ActivatedRoute} route Activated Route. */ - constructor(private route: ActivatedRoute) { + constructor() { this.route.data.subscribe((data: { accountingRules: any }) => { this.accountingRuleData = data.accountingRules; }); diff --git a/src/app/accounting/accounting-rules/accounting-rules.resolver.ts b/src/app/accounting/accounting-rules/accounting-rules.resolver.ts index fb459c151..173fcaedb 100644 --- a/src/app/accounting/accounting-rules/accounting-rules.resolver.ts +++ b/src/app/accounting/accounting-rules/accounting-rules.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; /** rxjs Imports */ import { Observable } from 'rxjs'; @@ -12,10 +12,7 @@ import { AccountingService } from '../accounting.service'; */ @Injectable() export class AccountingRulesResolver { - /** - * @param {AccountingService} accountingService Accounting service. - */ - constructor(private accountingService: AccountingService) {} + private accountingService = inject(AccountingService); /** * Returns the accounting rules data. diff --git a/src/app/accounting/accounting-rules/create-rule/create-rule.component.html b/src/app/accounting/accounting-rules/create-rule/create-rule.component.html index e7e9947ef..65706bbfe 100644 --- a/src/app/accounting/accounting-rules/create-rule/create-rule.component.html +++ b/src/app/accounting/accounting-rules/create-rule/create-rule.component.html @@ -6,23 +6,29 @@ {{ 'labels.inputs.Accounting Rule Name' | translate }} - - {{ 'labels.inputs.Accounting Rule Name' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (accountingRuleForm.controls.name.hasError('required')) { + + {{ 'labels.inputs.Accounting Rule Name' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Office' | translate }} - - {{ office.name }} - + @for (office of officeData; track office) { + + {{ office.name }} + + } - - {{ 'labels.inputs.Office' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (accountingRuleForm.controls.officeId.hasError('required')) { + + {{ 'labels.inputs.Office' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + }
@@ -40,34 +46,38 @@
- - {{ 'labels.inputs.Account to Debit' | translate }} - - - {{ glAccount.name }} - - - - -
- - {{ 'labels.inputs.Debit Tags' | translate }} - - - {{ debitTag.name }} - + @if (accountingRuleForm.controls.debitRuleType.value === 'fixedAccount') { + + {{ 'labels.inputs.Account to Debit' | translate }} + + @for (glAccount of glAccountData; track glAccount) { + + {{ glAccount.name }} + + } + } -
- - {{ 'labels.inputs.Multiple Debit Entries Allowed' | translate }} - + @if (accountingRuleForm.controls.debitRuleType.value === 'listOfAccounts') { +
+ + {{ 'labels.inputs.Debit Tags' | translate }} + + @for (debitTag of debitTagData; track debitTag) { + + {{ debitTag.name }} + + } + + +
+ + {{ 'labels.inputs.Multiple Debit Entries Allowed' | translate }} + +
-
+ }
- - {{ 'labels.inputs.Account to Credit' | translate }} - - - {{ glAccount.name }} - - - - -
- - {{ 'labels.inputs.Credit Tags' | translate }} - - - {{ creditTag.name }} - + @if (accountingRuleForm.controls.creditRuleType.value === 'fixedAccount') { + + {{ 'labels.inputs.Account to Credit' | translate }} + + @for (glAccount of glAccountData; track glAccount) { + + {{ glAccount.name }} + + } + } -
- - {{ 'labels.inputs.Multiple Credit Entries Allowed' | translate }} - + @if (accountingRuleForm.controls.creditRuleType.value === 'listOfAccounts') { +
+ + {{ 'labels.inputs.Credit Tags' | translate }} + + @for (creditTag of creditTagData; track creditTag) { + + {{ creditTag.name }} + + } + + +
+ + {{ 'labels.inputs.Multiple Credit Entries Allowed' | translate }} + +
-
+ } {{ 'labels.inputs.Description' | translate }} diff --git a/src/app/accounting/accounting-rules/create-rule/create-rule.component.ts b/src/app/accounting/accounting-rules/create-rule/create-rule.component.ts index 0141d5dbb..7fa91fa9b 100644 --- a/src/app/accounting/accounting-rules/create-rule/create-rule.component.ts +++ b/src/app/accounting/accounting-rules/create-rule/create-rule.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, Validators, ReactiveFormsModule } from '@angular/forms'; import { Router, ActivatedRoute, RouterLink } from '@angular/router'; @@ -29,6 +29,11 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class CreateRuleComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private accountingService = inject(AccountingService); + private route = inject(ActivatedRoute); + private router = inject(Router); + /** Accounting rule form. */ accountingRuleForm: UntypedFormGroup; /** Office data. */ @@ -47,12 +52,7 @@ export class CreateRuleComponent implements OnInit { * @param {ActivatedRoute} route Activated Route. * @param {Router} router Router for navigation. */ - constructor( - private formBuilder: UntypedFormBuilder, - private accountingService: AccountingService, - private route: ActivatedRoute, - private router: Router - ) { + constructor() { this.route.data.subscribe((data: { accountingRulesTemplate: any }) => { this.officeData = data.accountingRulesTemplate.allowedOffices; this.glAccountData = data.accountingRulesTemplate.allowedAccounts; diff --git a/src/app/accounting/accounting-rules/edit-rule/edit-rule.component.html b/src/app/accounting/accounting-rules/edit-rule/edit-rule.component.html index e4fdf84ad..1d2d6a763 100644 --- a/src/app/accounting/accounting-rules/edit-rule/edit-rule.component.html +++ b/src/app/accounting/accounting-rules/edit-rule/edit-rule.component.html @@ -6,23 +6,29 @@ {{ 'labels.inputs.Accounting Rule Name' | translate }} - - {{ 'labels.inputs.Accounting Rule Name' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (accountingRuleForm.controls.name.hasError('required')) { + + {{ 'labels.inputs.Accounting Rule Name' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Office' | translate }} - - {{ office.name }} - + @for (office of officeData; track office) { + + {{ office.name }} + + } - - {{ 'labels.inputs.Office' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (accountingRuleForm.controls.officeId.hasError('required')) { + + {{ 'labels.inputs.Office' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + }
@@ -40,34 +46,38 @@
- - {{ 'labels.inputs.Account to Debit' | translate }} - - - {{ glAccount.name }} - - - - -
- - {{ 'labels.inputs.Debit Tags' | translate }} - - - {{ debitTag.name }} - + @if (accountingRuleForm.controls.debitRuleType.value === 'fixedAccount') { + + {{ 'labels.inputs.Account to Debit' | translate }} + + @for (glAccount of glAccountData; track glAccount) { + + {{ glAccount.name }} + + } + } -
- - {{ 'labels.inputs.Multiple Debit Entries Allowed' | translate }} - + @if (accountingRuleForm.controls.debitRuleType.value === 'listOfAccounts') { +
+ + {{ 'labels.inputs.Debit Tags' | translate }} + + @for (debitTag of debitTagData; track debitTag) { + + {{ debitTag.name }} + + } + + +
+ + {{ 'labels.inputs.Multiple Debit Entries Allowed' | translate }} + +
-
+ }
- - {{ 'labels.inputs.Account to Credit' | translate }} - - - {{ glAccount.name }} - - - - -
- - {{ 'labels.inputs.Credit Tags' | translate }} - - - {{ creditTag.name }} - + @if (accountingRuleForm.controls.creditRuleType.value === 'fixedAccount') { + + {{ 'labels.inputs.Account to Credit' | translate }} + + @for (glAccount of glAccountData; track glAccount) { + + {{ glAccount.name }} + + } + } -
- - {{ 'labels.inputs.Multiple Credit Entries Allowed' | translate }} - + @if (accountingRuleForm.controls.creditRuleType.value === 'listOfAccounts') { +
+ + {{ 'labels.inputs.Credit Tags' | translate }} + + @for (creditTag of creditTagData; track creditTag) { + + {{ creditTag.name }} + + } + + +
+ + {{ 'labels.inputs.Multiple Credit Entries Allowed' | translate }} + +
-
+ } {{ 'labels.inputs.Description' | translate }} diff --git a/src/app/accounting/accounting-rules/edit-rule/edit-rule.component.ts b/src/app/accounting/accounting-rules/edit-rule/edit-rule.component.ts index ee1a51d36..4154ea541 100644 --- a/src/app/accounting/accounting-rules/edit-rule/edit-rule.component.ts +++ b/src/app/accounting/accounting-rules/edit-rule/edit-rule.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, Validators, ReactiveFormsModule } from '@angular/forms'; import { Router, ActivatedRoute, RouterLink } from '@angular/router'; @@ -29,6 +29,11 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class EditRuleComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private accountingService = inject(AccountingService); + private route = inject(ActivatedRoute); + private router = inject(Router); + /** Accounting rule form. */ accountingRuleForm: UntypedFormGroup; /** Accounting rule. */ @@ -49,12 +54,7 @@ export class EditRuleComponent implements OnInit { * @param {ActivatedRoute} route Activated Route. * @param {Router} router Router for navigation. */ - constructor( - private formBuilder: UntypedFormBuilder, - private accountingService: AccountingService, - private route: ActivatedRoute, - private router: Router - ) { + constructor() { this.route.data.subscribe((data: { accountingRulesTemplate: any; accountingRule: any }) => { this.officeData = data.accountingRulesTemplate.allowedOffices; this.glAccountData = data.accountingRulesTemplate.allowedAccounts; diff --git a/src/app/accounting/accounting-rules/view-rule/view-rule.component.html b/src/app/accounting/accounting-rules/view-rule/view-rule.component.html index 5fe5cd77e..ce22cde49 100644 --- a/src/app/accounting/accounting-rules/view-rule/view-rule.component.html +++ b/src/app/accounting/accounting-rules/view-rule/view-rule.component.html @@ -22,10 +22,12 @@
{{ accountingRule.officeName }}
-
-
{{ 'labels.inputs.Description' | translate }}
-
{{ accountingRule.description }}
-
+ @if (accountingRule.description) { +
+
{{ 'labels.inputs.Description' | translate }}
+
{{ accountingRule.description }}
+
+ }
{{ 'labels.inputs.Multiple Debit Entries Allowed' | translate }}
@@ -41,37 +43,49 @@ -
-
{{ 'labels.inputs.Debit Tags' | translate }}
-
- {{ debitTag.tag.name }} + @if (accountingRule.debitTags?.length) { +
+
{{ 'labels.inputs.Debit Tags' | translate }}
+
+ @for (debitTag of accountingRule.debitTags; track debitTag) { + {{ debitTag.tag.name }} + } +
-
+ } -
-
{{ 'labels.inputs.Debit Account Name' | translate }}
-
- {{ - debitAccount.name + ' (' + debitAccount.glCode + ')' - }} + @if (accountingRule.debitAccounts?.length) { +
+
{{ 'labels.inputs.Debit Account Name' | translate }}
+
+ @for (debitAccount of accountingRule.debitAccounts; track debitAccount) { + {{ debitAccount.name + ' (' + debitAccount.glCode + ')' }} + } +
-
+ } -
-
{{ 'labels.inputs.Credit Tags' | translate }}
-
- {{ creditTag.tag.name }} + @if (accountingRule.creditTags?.length) { +
+
{{ 'labels.inputs.Credit Tags' | translate }}
+
+ @for (creditTag of accountingRule.creditTags; track creditTag) { + {{ creditTag.tag.name }} + } +
-
+ } -
-
{{ 'labels.inputs.Credit Account Name' | translate }}
-
- {{ - creditAccount.name + ' (' + creditAccount.glCode + ')' - }} + @if (accountingRule.creditAccounts?.length) { +
+
{{ 'labels.inputs.Credit Account Name' | translate }}
+
+ @for (creditAccount of accountingRule.creditAccounts; track creditAccount) { + {{ creditAccount.name + ' (' + creditAccount.glCode + ')' }} + } +
-
+ }
diff --git a/src/app/accounting/accounting-rules/view-rule/view-rule.component.ts b/src/app/accounting/accounting-rules/view-rule/view-rule.component.ts index 4bcbf669d..e0e974c3b 100644 --- a/src/app/accounting/accounting-rules/view-rule/view-rule.component.ts +++ b/src/app/accounting/accounting-rules/view-rule/view-rule.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component } from '@angular/core'; +import { Component, inject } from '@angular/core'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; import { MatDialog } from '@angular/material/dialog'; @@ -24,6 +24,11 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ViewRuleComponent { + private accountingService = inject(AccountingService); + private route = inject(ActivatedRoute); + private router = inject(Router); + dialog = inject(MatDialog); + /** Accounting rule. */ accountingRule: any; @@ -34,12 +39,7 @@ export class ViewRuleComponent { * @param {Router} router Router for navigation. * @param {MatDialog} dialog Dialog reference. */ - constructor( - private accountingService: AccountingService, - private route: ActivatedRoute, - private router: Router, - public dialog: MatDialog - ) { + constructor() { this.route.data.subscribe((data: { accountingRule: any }) => { this.accountingRule = data.accountingRule; }); diff --git a/src/app/accounting/accounting.component.html b/src/app/accounting/accounting.component.html index f1c8eae41..9023e50d0 100644 --- a/src/app/accounting/accounting.component.html +++ b/src/app/accounting/accounting.component.html @@ -11,24 +11,20 @@
{{ 'labels.heading.Frequent Postings' | translate }} - + @if (arrowBooleans[0]) { + + }
@@ -42,29 +38,20 @@
{{ 'labels.heading.Create Journal Entries' | translate }} - + @if (arrowBooleans[1]) { + + }
@@ -78,19 +65,20 @@
{{ 'labels.heading.Search Journal Entries' | translate }} - + @if (arrowBooleans[2]) { + + }
@@ -104,29 +92,20 @@
{{ 'labels.heading.Accounts Linked to Financial Activities' | translate }} - + @if (arrowBooleans[3]) { + + }
@@ -141,29 +120,20 @@
{{ 'labels.heading.Migrate Opening Balances (Office-wise)' | translate }} - + @if (arrowBooleans[4]) { + + }
@@ -182,24 +152,20 @@
{{ 'labels.heading.Chart of Accounts' | translate }} - + @if (arrowBooleans[5]) { + + }
@@ -214,24 +180,20 @@
{{ 'labels.heading.Closing Entries' | translate }} - + @if (arrowBooleans[6]) { + + }
@@ -245,19 +207,20 @@
{{ 'labels.heading.Accounting Rules' | translate }} - + @if (arrowBooleans[7]) { + + }
@@ -270,19 +233,20 @@
{{ 'labels.heading.Accruals' | translate }} - + @if (arrowBooleans[8]) { + + }
@@ -295,19 +259,20 @@
{{ 'labels.heading.Provisioning Entries' | translate }} - + @if (arrowBooleans[9]) { + + }
diff --git a/src/app/accounting/accounting.component.ts b/src/app/accounting/accounting.component.ts index cd922d737..5a5f191f7 100644 --- a/src/app/accounting/accounting.component.ts +++ b/src/app/accounting/accounting.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { AfterViewInit, Component, ElementRef, TemplateRef, ViewChild } from '@angular/core'; +import { AfterViewInit, Component, ElementRef, TemplateRef, ViewChild, inject } from '@angular/core'; import { Router, RouterLink } from '@angular/router'; /** Custom Services */ @@ -28,6 +28,10 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class AccountingComponent implements AfterViewInit { + private router = inject(Router); + private configurationWizardService = inject(ConfigurationWizardService); + private popoverService = inject(PopoverService); + /* Reference of Chart of Accounts */ @ViewChild('chartofAccounts') chartofAccounts: ElementRef; /* Template for popover on Chart of Accounts */ @@ -51,17 +55,6 @@ export class AccountingComponent implements AfterViewInit { // Initialize an array of 10 boolean values, all set to false arrowBooleans: boolean[] = new Array(10).fill(false); - /** - * @param {Router} router Router. - * @param {ConfigurationWizardService} configurationWizardService ConfigurationWizard Service. - * @param {PopoverService} popoverService PopoverService. - */ - constructor( - private router: Router, - private configurationWizardService: ConfigurationWizardService, - private popoverService: PopoverService - ) {} - /** * Popover function * @param template TemplateRef. diff --git a/src/app/accounting/accounting.service.ts b/src/app/accounting/accounting.service.ts index 474298232..0e62df1d6 100644 --- a/src/app/accounting/accounting.service.ts +++ b/src/app/accounting/accounting.service.ts @@ -1,7 +1,7 @@ /** TODO: Separate services for feature modules for cleaner accounting service. */ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { HttpClient, HttpParams } from '@angular/common/http'; /** rxjs Imports */ @@ -14,10 +14,7 @@ import { Observable } from 'rxjs'; providedIn: 'root' }) export class AccountingService { - /** - * @param {HttpClient} http Http Client to send requests. - */ - constructor(private http: HttpClient) {} + private http = inject(HttpClient); /** * @returns {Observable} Offices data ordered by id. diff --git a/src/app/accounting/chart-of-accounts/chart-of-accounts.component.html b/src/app/accounting/chart-of-accounts/chart-of-accounts.component.html index fbfbd42f1..88b4386ec 100644 --- a/src/app/accounting/chart-of-accounts/chart-of-accounts.component.html +++ b/src/app/accounting/chart-of-accounts/chart-of-accounts.component.html @@ -70,22 +70,24 @@ {{ 'labels.inputs.Manual Entries Allowed' | translate }} - - + @if (glAccount.manualEntriesAllowed) { + + } + @if (!glAccount.manualEntriesAllowed) { + + } @@ -123,7 +125,9 @@
  • - {{ '(' + node.glCode + ')' }} + @if (node.glCode) { + {{ '(' + node.glCode + ')' }} + } {{ node.name }}
  • @@ -139,7 +143,9 @@ > - {{ '(' + node.glCode + ')' }} + @if (node.glCode) { + {{ '(' + node.glCode + ')' }} + } {{ node.name }} @@ -151,61 +157,52 @@ -
    - - -
    -
    - {{ 'labels.inputs.Account Name' | translate }} + @if (glAccount) { +
    + + +
    +
    + {{ 'labels.inputs.Account Name' | translate }} +
    +
    + {{ glAccount.name }} +
    +
    + {{ 'labels.inputs.GL Code' | translate }} +
    +
    + {{ glAccount.glCode }} +
    +
    + {{ 'labels.inputs.Account Type' | translate }} +
    +
    + {{ 'labels.inputs.accounting.' + glAccount.type | translate }} +
    +
    + {{ 'labels.inputs.Account Usage' | translate }} +
    +
    + {{ glAccount.usage }} +
    +
    + {{ 'labels.inputs.Manual Entries Allowed' | translate }} +
    +
    + {{ glAccount.manualEntriesAllowed }} +
    +
    + {{ 'labels.inputs.Description' | translate }} +
    +
    + {{ glAccount.description }} +
    - -
    - {{ glAccount.name }} -
    - -
    - {{ 'labels.inputs.GL Code' | translate }} -
    - -
    - {{ glAccount.glCode }} -
    - -
    - {{ 'labels.inputs.Account Type' | translate }} -
    - -
    - {{ 'labels.inputs.accounting.' + glAccount.type | translate }} -
    - -
    - {{ 'labels.inputs.Account Usage' | translate }} -
    - -
    - {{ glAccount.usage }} -
    - -
    - {{ 'labels.inputs.Manual Entries Allowed' | translate }} -
    - -
    - {{ glAccount.manualEntriesAllowed }} -
    - -
    - {{ 'labels.inputs.Description' | translate }} -
    - -
    - {{ glAccount.description }} -
    -
    - - -
    + + +
    + }
    diff --git a/src/app/accounting/chart-of-accounts/chart-of-accounts.component.ts b/src/app/accounting/chart-of-accounts/chart-of-accounts.component.ts index 54ff0b44f..398b69cef 100644 --- a/src/app/accounting/chart-of-accounts/chart-of-accounts.component.ts +++ b/src/app/accounting/chart-of-accounts/chart-of-accounts.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, TemplateRef, ElementRef, ViewChild, AfterViewInit } from '@angular/core'; +import { Component, OnInit, TemplateRef, ElementRef, ViewChild, AfterViewInit, inject } from '@angular/core'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort, MatSortHeader } from '@angular/material/sort'; import { @@ -81,6 +81,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ChartOfAccountsComponent implements AfterViewInit, OnInit { + private glAccountTreeService = inject(GlAccountTreeService); + private route = inject(ActivatedRoute); + private router = inject(Router); + private treeControlService = inject(TreeControlService); + private configurationWizardService = inject(ConfigurationWizardService); + private popoverService = inject(PopoverService); + /** Button toggle group form control for type of view. (list/tree) */ viewGroup = new UntypedFormControl('listView'); /** GL Account data. */ @@ -127,14 +134,9 @@ export class ChartOfAccountsComponent implements AfterViewInit, OnInit { * @param {ConfigurationWizardService} configurationWizardService ConfigurationWizard Service. * @param {PopoverService} popoverService PopoverService. */ - constructor( - private glAccountTreeService: GlAccountTreeService, - private route: ActivatedRoute, - private router: Router, - private treeControlService: TreeControlService, - private configurationWizardService: ConfigurationWizardService, - private popoverService: PopoverService - ) { + constructor() { + const glAccountTreeService = this.glAccountTreeService; + this.route.data.subscribe((data: { chartOfAccounts: any }) => { this.glAccountData = data.chartOfAccounts; glAccountTreeService.initialize(this.glAccountData); diff --git a/src/app/accounting/chart-of-accounts/chart-of-accounts.resolver.ts b/src/app/accounting/chart-of-accounts/chart-of-accounts.resolver.ts index a5a54860f..ff398d45e 100644 --- a/src/app/accounting/chart-of-accounts/chart-of-accounts.resolver.ts +++ b/src/app/accounting/chart-of-accounts/chart-of-accounts.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; /** rxjs Imports */ import { Observable } from 'rxjs'; @@ -12,10 +12,7 @@ import { AccountingService } from '../accounting.service'; */ @Injectable() export class ChartOfAccountsResolver { - /** - * @param {AccountingService} accountingService Accounting service. - */ - constructor(private accountingService: AccountingService) {} + private accountingService = inject(AccountingService); /** * Returns the chart of accounts data. diff --git a/src/app/accounting/chart-of-accounts/create-gl-account/chart-of-accounts-template.resolver.ts b/src/app/accounting/chart-of-accounts/create-gl-account/chart-of-accounts-template.resolver.ts index 199ca4c97..771227e78 100644 --- a/src/app/accounting/chart-of-accounts/create-gl-account/chart-of-accounts-template.resolver.ts +++ b/src/app/accounting/chart-of-accounts/create-gl-account/chart-of-accounts-template.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; /** rxjs Imports */ import { Observable } from 'rxjs'; @@ -12,10 +12,7 @@ import { AccountingService } from '../../accounting.service'; */ @Injectable() export class ChartOfAccountsTemplateResolver { - /** - * @param {AccountingService} accountingService Accounting service. - */ - constructor(private accountingService: AccountingService) {} + private accountingService = inject(AccountingService); /** * Returns the chart of accounts template data. diff --git a/src/app/accounting/chart-of-accounts/create-gl-account/create-gl-account.component.html b/src/app/accounting/chart-of-accounts/create-gl-account/create-gl-account.component.html index a485041cf..c99682f2d 100644 --- a/src/app/accounting/chart-of-accounts/create-gl-account/create-gl-account.component.html +++ b/src/app/accounting/chart-of-accounts/create-gl-account/create-gl-account.component.html @@ -6,65 +6,69 @@ {{ 'labels.inputs.Account Type' | translate }} - - {{ 'labels.inputs.accounting.' + accountType.value | translate }} - + @for (accountType of accountTypeData; track accountType) { + + {{ 'labels.inputs.accounting.' + accountType.value | translate }} + + } - - {{ 'labels.inputs.Account Type' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if ( + glAccountForm.controls.type.hasError('required') && + (glAccountForm.controls.type.touched || glAccountForm.controls.type.dirty) + ) { + + {{ 'labels.inputs.Account Type' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Account Name' | translate }} - - {{ 'labels.inputs.Account Name' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if ( + glAccountForm.controls.name.hasError('required') && + (glAccountForm.controls.name.touched || glAccountForm.controls.name.dirty) + ) { + + {{ 'labels.inputs.Account Name' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Account Usage' | translate }} - - {{ accountUsage.value }} - + @for (accountUsage of accountUsageData; track accountUsage) { + + {{ accountUsage.value }} + + } - - {{ 'labels.inputs.Account Usage' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if ( + glAccountForm.controls.usage.hasError('required') && + (glAccountForm.controls.usage.touched || glAccountForm.controls.usage.dirty) + ) { + + {{ 'labels.inputs.Account Usage' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.GL Code' | translate }} - - {{ 'labels.inputs.GL Code' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if ( + glAccountForm.controls.glCode.hasError('required') && + (glAccountForm.controls.glCode.touched || glAccountForm.controls.glCode.dirty) + ) { + + {{ 'labels.inputs.GL Code' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Tag' | translate }} - - {{ tag.name }} - + @for (tag of tagData; track tag) { + + {{ tag.name }} + + }
    diff --git a/src/app/accounting/chart-of-accounts/create-gl-account/create-gl-account.component.ts b/src/app/accounting/chart-of-accounts/create-gl-account/create-gl-account.component.ts index 764085681..088579e3d 100644 --- a/src/app/accounting/chart-of-accounts/create-gl-account/create-gl-account.component.ts +++ b/src/app/accounting/chart-of-accounts/create-gl-account/create-gl-account.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, TemplateRef, ElementRef, ViewChild, AfterViewInit } from '@angular/core'; +import { Component, OnInit, TemplateRef, ElementRef, ViewChild, AfterViewInit, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, Validators, ReactiveFormsModule } from '@angular/forms'; import { Router, ActivatedRoute, RouterLink } from '@angular/router'; import { MatDialog } from '@angular/material/dialog'; @@ -32,6 +32,14 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class CreateGlAccountComponent implements OnInit, AfterViewInit { + private formBuilder = inject(UntypedFormBuilder); + private accountingService = inject(AccountingService); + private route = inject(ActivatedRoute); + private router = inject(Router); + private configurationWizardService = inject(ConfigurationWizardService); + private popoverService = inject(PopoverService); + dialog = inject(MatDialog); + /** GL account form. */ glAccountForm: UntypedFormGroup; /** Chart of accounts data. */ @@ -66,15 +74,7 @@ export class CreateGlAccountComponent implements OnInit, AfterViewInit { * @param {PopoverService} popoverService PopoverService. * @param {Matdialog} dialog Matdialog. */ - constructor( - private formBuilder: UntypedFormBuilder, - private accountingService: AccountingService, - private route: ActivatedRoute, - private router: Router, - private configurationWizardService: ConfigurationWizardService, - private popoverService: PopoverService, - public dialog: MatDialog - ) { + constructor() { this.route.queryParamMap.subscribe((params) => { this.accountTypeId = Number(params.get('accountType')); this.parentId = Number(params.get('parent')); diff --git a/src/app/accounting/chart-of-accounts/edit-gl-account/edit-gl-account.component.html b/src/app/accounting/chart-of-accounts/edit-gl-account/edit-gl-account.component.html index fecc2cb5b..587d2a2f5 100644 --- a/src/app/accounting/chart-of-accounts/edit-gl-account/edit-gl-account.component.html +++ b/src/app/accounting/chart-of-accounts/edit-gl-account/edit-gl-account.component.html @@ -6,45 +6,57 @@ {{ 'labels.inputs.Account Type' | translate }} - - {{ accountType.value }} - + @for (accountType of accountTypeData; track accountType) { + + {{ accountType.value }} + + } - - {{ 'labels.inputs.Account Type' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (glAccountForm.controls.type.hasError('required')) { + + {{ 'labels.inputs.Account Type' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Account Name' | translate }} - - {{ 'labels.inputs.Account Name' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (glAccountForm.controls.name.hasError('required')) { + + {{ 'labels.inputs.Account Name' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Account Usage' | translate }} - - {{ accountUsage.value }} - + @for (accountUsage of accountUsageData; track accountUsage) { + + {{ accountUsage.value }} + + } - - {{ 'labels.inputs.Account Usage' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (glAccountForm.controls.usage.hasError('required')) { + + {{ 'labels.inputs.Account Usage' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.GL Code' | translate }} - - {{ 'labels.inputs.GL Code' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (glAccountForm.controls.glCode.hasError('required')) { + + {{ 'labels.inputs.GL Code' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Tag' | translate }} - - {{ tag.name }} - + @for (tag of tagData; track tag) { + + {{ tag.name }} + + }
    diff --git a/src/app/accounting/chart-of-accounts/edit-gl-account/edit-gl-account.component.ts b/src/app/accounting/chart-of-accounts/edit-gl-account/edit-gl-account.component.ts index 7ddf8cd71..ed02eca1f 100644 --- a/src/app/accounting/chart-of-accounts/edit-gl-account/edit-gl-account.component.ts +++ b/src/app/accounting/chart-of-accounts/edit-gl-account/edit-gl-account.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; import { UntypedFormGroup, UntypedFormBuilder, Validators, ReactiveFormsModule } from '@angular/forms'; @@ -25,6 +25,11 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class EditGlAccountComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private accountingService = inject(AccountingService); + private route = inject(ActivatedRoute); + private router = inject(Router); + /** GL account form. */ glAccountForm: UntypedFormGroup; /** GL account and chart of accounts data. */ @@ -45,12 +50,7 @@ export class EditGlAccountComponent implements OnInit { * @param {ActivatedRoute} route Activated Route. * @param {Router} router Router for navigation. */ - constructor( - private formBuilder: UntypedFormBuilder, - private accountingService: AccountingService, - private route: ActivatedRoute, - private router: Router - ) { + constructor() { this.route.data.subscribe((data: { glAccountAndChartOfAccountsTemplate: any }) => { this.glAccount = data.glAccountAndChartOfAccountsTemplate; }); diff --git a/src/app/accounting/chart-of-accounts/gl-account-and-chart-of-accounts-template.resolver.ts b/src/app/accounting/chart-of-accounts/gl-account-and-chart-of-accounts-template.resolver.ts index 7c37a5093..cbd1e7391 100644 --- a/src/app/accounting/chart-of-accounts/gl-account-and-chart-of-accounts-template.resolver.ts +++ b/src/app/accounting/chart-of-accounts/gl-account-and-chart-of-accounts-template.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -14,10 +14,7 @@ import { AccountingService } from '../accounting.service'; */ @Injectable() export class GlAccountAndChartOfAccountsTemplateResolver { - /** - * @param {AccountingService} accountingService Accounting service. - */ - constructor(private accountingService: AccountingService) {} + private accountingService = inject(AccountingService); /** * Returns the gl account and chart of accounts template data. diff --git a/src/app/accounting/chart-of-accounts/gl-account-tree.service.ts b/src/app/accounting/chart-of-accounts/gl-account-tree.service.ts index f71ec0c59..4afb14ff9 100644 --- a/src/app/accounting/chart-of-accounts/gl-account-tree.service.ts +++ b/src/app/accounting/chart-of-accounts/gl-account-tree.service.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; /** rxjs Imports */ import { BehaviorSubject } from 'rxjs'; @@ -16,6 +16,8 @@ import { GLAccount } from 'app/shared/models/general.model'; providedIn: 'root' }) export class GlAccountTreeService { + private translateService = inject(TranslateService); + /** GL Account data. */ glAccountData: any; /** Chart of accounts tree data behavior subject to represent chart of accounts tree nodes. */ @@ -28,8 +30,6 @@ export class GlAccountTreeService { return this.treeDataChange.value; } - constructor(private translateService: TranslateService) {} - /** * Builds the chart of accounts tree and emits the value. * @param {any} glAccountData Chart of accounts data. diff --git a/src/app/accounting/chart-of-accounts/view-gl-account/view-gl-account.component.html b/src/app/accounting/chart-of-accounts/view-gl-account/view-gl-account.component.html index 19320b8bd..94d3f9b92 100644 --- a/src/app/accounting/chart-of-accounts/view-gl-account/view-gl-account.component.html +++ b/src/app/accounting/chart-of-accounts/view-gl-account/view-gl-account.component.html @@ -1,15 +1,16 @@
    - + @if (glAccount.usage.value === 'HEADER') { + + } @@ -20,17 +21,21 @@ - + @if (!glAccount.disabled) { + + } - + @if (glAccount.disabled) { + + }
    -
    -
    {{ 'labels.inputs.Parent Account Name' | translate }}
    -
    - - - + @if (glAccount.parent) { +
    +
    {{ 'labels.inputs.Parent Account Name' | translate }}
    +
    + + + +
    -
    + } -
    -
    {{ 'labels.inputs.Tag' | translate }}
    -
    {{ glAccount.tagId.name }}
    -
    + @if (glAccount.tagId.id) { +
    +
    {{ 'labels.inputs.Tag' | translate }}
    +
    {{ glAccount.tagId.name }}
    +
    + }
    {{ 'labels.inputs.Account Usage' | translate }}
    @@ -81,10 +90,12 @@
    {{ glAccount.manualEntriesAllowed | yesNo }}
    -
    -
    {{ 'labels.inputs.Description' | translate }}
    -
    {{ glAccount.description }}
    -
    + @if (glAccount.description) { +
    +
    {{ 'labels.inputs.Description' | translate }}
    +
    {{ glAccount.description }}
    +
    + }
    diff --git a/src/app/accounting/chart-of-accounts/view-gl-account/view-gl-account.component.ts b/src/app/accounting/chart-of-accounts/view-gl-account/view-gl-account.component.ts index eb66055a8..d7654fd28 100644 --- a/src/app/accounting/chart-of-accounts/view-gl-account/view-gl-account.component.ts +++ b/src/app/accounting/chart-of-accounts/view-gl-account/view-gl-account.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component } from '@angular/core'; +import { Component, inject } from '@angular/core'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; import { MatDialog } from '@angular/material/dialog'; @@ -8,7 +8,7 @@ import { DeleteDialogComponent } from '../../../shared/delete-dialog/delete-dial /** Custom Services */ import { AccountingService } from '../../accounting.service'; -import { Location, NgIf } from '@angular/common'; +import { Location } from '@angular/common'; import { FaIconComponent } from '@fortawesome/angular-fontawesome'; import { GlAccountDisplayComponent } from '../../../shared/accounting/gl-account-display/gl-account-display.component'; import { YesnoPipe } from '../../../pipes/yesno.pipe'; @@ -29,6 +29,12 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ViewGlAccountComponent { + private accountingService = inject(AccountingService); + private route = inject(ActivatedRoute); + private router = inject(Router); + private dialog = inject(MatDialog); + private location = inject(Location); + /** GL Account. */ glAccount: any; @@ -39,13 +45,7 @@ export class ViewGlAccountComponent { * @param {Router} router Router for navigation. * @param {MatDialog} dialog Dialog reference. */ - constructor( - private accountingService: AccountingService, - private route: ActivatedRoute, - private router: Router, - private dialog: MatDialog, - private location: Location - ) { + constructor() { this.route.data.subscribe((data: { glAccountAndChartOfAccountsTemplate: any }) => { this.glAccount = data.glAccountAndChartOfAccountsTemplate; }); diff --git a/src/app/accounting/closing-entries/closing-entries.component.html b/src/app/accounting/closing-entries/closing-entries.component.html index 24de5a07b..842d8af93 100644 --- a/src/app/accounting/closing-entries/closing-entries.component.html +++ b/src/app/accounting/closing-entries/closing-entries.component.html @@ -16,9 +16,11 @@ - - {{ office.name }} - + @for (office of filteredOfficeData | async; track office) { + + {{ office.name }} + + }
    diff --git a/src/app/accounting/closing-entries/closing-entries.component.ts b/src/app/accounting/closing-entries/closing-entries.component.ts index 9da5f54e9..a06d25722 100644 --- a/src/app/accounting/closing-entries/closing-entries.component.ts +++ b/src/app/accounting/closing-entries/closing-entries.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, TemplateRef, ElementRef, ViewChild, AfterViewInit } from '@angular/core'; +import { Component, OnInit, TemplateRef, ElementRef, ViewChild, AfterViewInit, inject } from '@angular/core'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort, MatSortHeader } from '@angular/material/sort'; import { @@ -26,7 +26,7 @@ import { PopoverService } from '../../configuration-wizard/popover/popover.servi import { ConfigurationWizardService } from '../../configuration-wizard/configuration-wizard.service'; import { FaIconComponent } from '@fortawesome/angular-fontawesome'; import { MatAutocompleteTrigger, MatAutocomplete, MatOption } from '@angular/material/autocomplete'; -import { NgFor, AsyncPipe } from '@angular/common'; +import { AsyncPipe } from '@angular/common'; import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; /** @@ -58,6 +58,11 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ClosingEntriesComponent implements OnInit, AfterViewInit { + private route = inject(ActivatedRoute); + private router = inject(Router); + private configurationWizardService = inject(ConfigurationWizardService); + private popoverService = inject(PopoverService); + /** Columns to be displayed in closing entries table. */ displayedColumns: string[] = [ 'officeName', @@ -97,12 +102,7 @@ export class ClosingEntriesComponent implements OnInit, AfterViewInit { * @param {ConfigurationWizardService} configurationWizardService ConfigurationWizard Service. * @param {PopoverService} popoverService PopoverService. */ - constructor( - private route: ActivatedRoute, - private router: Router, - private configurationWizardService: ConfigurationWizardService, - private popoverService: PopoverService - ) { + constructor() { this.route.data.subscribe((data: { offices: any; glAccountClosures: any }) => { this.officeData = data.offices; this.glAccountClosureData = data.glAccountClosures; diff --git a/src/app/accounting/closing-entries/closing-entries.resolver.ts b/src/app/accounting/closing-entries/closing-entries.resolver.ts index e01d59e4d..846b51e08 100644 --- a/src/app/accounting/closing-entries/closing-entries.resolver.ts +++ b/src/app/accounting/closing-entries/closing-entries.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; /** rxjs Imports */ import { Observable } from 'rxjs'; @@ -12,10 +12,7 @@ import { AccountingService } from '../accounting.service'; */ @Injectable() export class ClosingEntriesResolver { - /** - * @param {AccountingService} accountingService Accounting service. - */ - constructor(private accountingService: AccountingService) {} + private accountingService = inject(AccountingService); /** * Returns the gl account closures data. diff --git a/src/app/accounting/closing-entries/closing-entry.resolver.ts b/src/app/accounting/closing-entries/closing-entry.resolver.ts index 067e018c3..4d118309d 100644 --- a/src/app/accounting/closing-entries/closing-entry.resolver.ts +++ b/src/app/accounting/closing-entries/closing-entry.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { AccountingService } from '../accounting.service'; */ @Injectable() export class ClosingEntryResolver { - /** - * @param {AccountingService} accountingService Accounting service. - */ - constructor(private accountingService: AccountingService) {} + private accountingService = inject(AccountingService); /** * Returns the gl account closure data. diff --git a/src/app/accounting/closing-entries/create-closure/create-closure.component.html b/src/app/accounting/closing-entries/create-closure/create-closure.component.html index f4d56713c..00614c50d 100644 --- a/src/app/accounting/closing-entries/create-closure/create-closure.component.html +++ b/src/app/accounting/closing-entries/create-closure/create-closure.component.html @@ -6,14 +6,18 @@ {{ 'labels.inputs.Office' | translate }} - - {{ office.name }} - + @for (office of officeData; track office) { + + {{ office.name }} + + } - - {{ 'labels.inputs.Office' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (accountingClosureForm.controls.officeId.hasError('required')) { + + {{ 'labels.inputs.Office' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } @@ -28,10 +32,12 @@ /> - - {{ 'labels.inputs.Closing Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (accountingClosureForm.controls.closingDate.hasError('required')) { + + {{ 'labels.inputs.Closing Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } diff --git a/src/app/accounting/closing-entries/create-closure/create-closure.component.ts b/src/app/accounting/closing-entries/create-closure/create-closure.component.ts index 89473ad92..8ad18d116 100644 --- a/src/app/accounting/closing-entries/create-closure/create-closure.component.ts +++ b/src/app/accounting/closing-entries/create-closure/create-closure.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormBuilder, UntypedFormGroup, Validators, ReactiveFormsModule } from '@angular/forms'; import { Router, ActivatedRoute, RouterLink } from '@angular/router'; @@ -22,6 +22,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class CreateClosureComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private accountingService = inject(AccountingService); + private settingsService = inject(SettingsService); + private dateUtils = inject(Dates); + private route = inject(ActivatedRoute); + private router = inject(Router); + /** Minimum closing date allowed. */ minDate = new Date(2000, 0, 1); /** Maximum closing date allowed. */ @@ -39,14 +46,7 @@ export class CreateClosureComponent implements OnInit { * @param {ActivatedRoute} route Activated Route. * @param {Router} router Router for navigation. */ - constructor( - private formBuilder: UntypedFormBuilder, - private accountingService: AccountingService, - private settingsService: SettingsService, - private dateUtils: Dates, - private route: ActivatedRoute, - private router: Router - ) { + constructor() { this.route.data.subscribe((data: { offices: any }) => { this.officeData = data.offices; }); diff --git a/src/app/accounting/closing-entries/edit-closure/edit-closure.component.html b/src/app/accounting/closing-entries/edit-closure/edit-closure.component.html index 2ffdca36d..3c96ff892 100644 --- a/src/app/accounting/closing-entries/edit-closure/edit-closure.component.html +++ b/src/app/accounting/closing-entries/edit-closure/edit-closure.component.html @@ -6,9 +6,11 @@ {{ 'labels.inputs.Office' | translate }} - - {{ office.name }} - + @for (office of officeData; track office) { + + {{ office.name }} + + } diff --git a/src/app/accounting/closing-entries/edit-closure/edit-closure.component.ts b/src/app/accounting/closing-entries/edit-closure/edit-closure.component.ts index ebe3d3460..065ffab1c 100644 --- a/src/app/accounting/closing-entries/edit-closure/edit-closure.component.ts +++ b/src/app/accounting/closing-entries/edit-closure/edit-closure.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormBuilder, UntypedFormGroup, Validators, ReactiveFormsModule } from '@angular/forms'; import { Router, ActivatedRoute, RouterLink } from '@angular/router'; @@ -21,6 +21,11 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class EditClosureComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private accountingService = inject(AccountingService); + private route = inject(ActivatedRoute); + private router = inject(Router); + /** Accounting closure form. */ accountingClosureForm: UntypedFormGroup; /** GL Account closure. */ @@ -35,12 +40,7 @@ export class EditClosureComponent implements OnInit { * @param {ActivatedRoute} route Activated Route. * @param {Router} router Router for navigation. */ - constructor( - private formBuilder: UntypedFormBuilder, - private accountingService: AccountingService, - private route: ActivatedRoute, - private router: Router - ) { + constructor() { this.route.data.subscribe((data: { glAccountClosure: any }) => { this.glAccountClosure = data.glAccountClosure; }); diff --git a/src/app/accounting/closing-entries/view-closure/view-closure.component.html b/src/app/accounting/closing-entries/view-closure/view-closure.component.html index 05bc54cfd..29452752d 100644 --- a/src/app/accounting/closing-entries/view-closure/view-closure.component.html +++ b/src/app/accounting/closing-entries/view-closure/view-closure.component.html @@ -9,66 +9,55 @@
    -
    - - -
    -
    - {{ 'labels.inputs.Office' | translate }} +@if (glAccountClosure) { +
    + + +
    +
    + {{ 'labels.inputs.Office' | translate }} +
    +
    + {{ glAccountClosure.officeName }} +
    +
    + {{ 'labels.inputs.Closure Date' | translate }} +
    +
    + {{ glAccountClosure.closingDate }} +
    +
    + {{ 'labels.inputs.Closed By' | translate }} +
    +
    + {{ glAccountClosure.createdByUsername }} +
    +
    + {{ 'labels.inputs.Updated By' | translate }} +
    +
    + {{ glAccountClosure.lastUpdatedByUsername }} +
    +
    + {{ 'labels.inputs.Updated On' | translate }} +
    +
    + {{ glAccountClosure.lastUpdatedDate }} +
    +
    + {{ 'labels.inputs.Closure Creation Date' | translate }} +
    +
    + {{ glAccountClosure.createdDate }} +
    +
    + {{ 'labels.inputs.Comments' | translate }} +
    +
    + {{ glAccountClosure.comments }} +
    - -
    - {{ glAccountClosure.officeName }} -
    - -
    - {{ 'labels.inputs.Closure Date' | translate }} -
    - -
    - {{ glAccountClosure.closingDate }} -
    - -
    - {{ 'labels.inputs.Closed By' | translate }} -
    - -
    - {{ glAccountClosure.createdByUsername }} -
    - -
    - {{ 'labels.inputs.Updated By' | translate }} -
    - -
    - {{ glAccountClosure.lastUpdatedByUsername }} -
    - -
    - {{ 'labels.inputs.Updated On' | translate }} -
    - -
    - {{ glAccountClosure.lastUpdatedDate }} -
    - -
    - {{ 'labels.inputs.Closure Creation Date' | translate }} -
    - -
    - {{ glAccountClosure.createdDate }} -
    - -
    - {{ 'labels.inputs.Comments' | translate }} -
    - -
    - {{ glAccountClosure.comments }} -
    -
    - - -
    + + +
    +} diff --git a/src/app/accounting/closing-entries/view-closure/view-closure.component.ts b/src/app/accounting/closing-entries/view-closure/view-closure.component.ts index 292eb8b61..fdbf34db7 100644 --- a/src/app/accounting/closing-entries/view-closure/view-closure.component.ts +++ b/src/app/accounting/closing-entries/view-closure/view-closure.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component } from '@angular/core'; +import { Component, inject } from '@angular/core'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; import { MatDialog } from '@angular/material/dialog'; @@ -24,6 +24,11 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ViewClosureComponent { + private accountingService = inject(AccountingService); + private route = inject(ActivatedRoute); + private router = inject(Router); + dialog = inject(MatDialog); + /** GL Account closure. */ glAccountClosure: any; @@ -34,12 +39,7 @@ export class ViewClosureComponent { * @param {Router} router Router for navigation. * @param {MatDialog} dialog Dialog reference. */ - constructor( - private accountingService: AccountingService, - private route: ActivatedRoute, - private router: Router, - public dialog: MatDialog - ) { + constructor() { this.route.data.subscribe((data: { glAccountClosure: any }) => { this.glAccountClosure = data.glAccountClosure; }); diff --git a/src/app/accounting/common-resolvers/accounting-rules-associations.resolver.ts b/src/app/accounting/common-resolvers/accounting-rules-associations.resolver.ts index 88ba896dd..bd29675f8 100644 --- a/src/app/accounting/common-resolvers/accounting-rules-associations.resolver.ts +++ b/src/app/accounting/common-resolvers/accounting-rules-associations.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; /** rxjs Imports */ import { Observable } from 'rxjs'; @@ -12,10 +12,7 @@ import { AccountingService } from '../accounting.service'; */ @Injectable() export class AccountingRulesAssociationsResolver { - /** - * @param {AccountingService} accountingService Accounting service. - */ - constructor(private accountingService: AccountingService) {} + private accountingService = inject(AccountingService); /** * Returns the accounting rules associations data. diff --git a/src/app/accounting/common-resolvers/currencies.resolver.ts b/src/app/accounting/common-resolvers/currencies.resolver.ts index 7fa158089..c7091d49c 100644 --- a/src/app/accounting/common-resolvers/currencies.resolver.ts +++ b/src/app/accounting/common-resolvers/currencies.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; /** rxjs Imports */ import { Observable } from 'rxjs'; @@ -12,10 +12,7 @@ import { AccountingService } from '../accounting.service'; */ @Injectable() export class CurrenciesResolver { - /** - * @param {AccountingService} accountingService Accounting service. - */ - constructor(private accountingService: AccountingService) {} + private accountingService = inject(AccountingService); /** * Returns the currencies data. diff --git a/src/app/accounting/common-resolvers/external-asset-configuration.resolver.ts b/src/app/accounting/common-resolvers/external-asset-configuration.resolver.ts index 8d395e137..a571102c0 100644 --- a/src/app/accounting/common-resolvers/external-asset-configuration.resolver.ts +++ b/src/app/accounting/common-resolvers/external-asset-configuration.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; /** rxjs Imports */ import { Observable } from 'rxjs'; @@ -12,10 +12,7 @@ import { SystemService } from 'app/system/system.service'; */ @Injectable() export class ExternalAssetConfigurationResolver { - /** - * @param {AccountingService} accountingService Accounting service. - */ - constructor(private systemService: SystemService) {} + private systemService = inject(SystemService); /** * Returns the offices data. diff --git a/src/app/accounting/common-resolvers/gl-accounts.resolver.ts b/src/app/accounting/common-resolvers/gl-accounts.resolver.ts index df09f7a42..ed3194aa3 100644 --- a/src/app/accounting/common-resolvers/gl-accounts.resolver.ts +++ b/src/app/accounting/common-resolvers/gl-accounts.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; /** rxjs Imports */ import { Observable } from 'rxjs'; @@ -12,10 +12,7 @@ import { AccountingService } from '../accounting.service'; */ @Injectable() export class GlAccountsResolver { - /** - * @param {AccountingService} accountingService Accounting service. - */ - constructor(private accountingService: AccountingService) {} + private accountingService = inject(AccountingService); /** * Returns the gl accounts data. diff --git a/src/app/accounting/common-resolvers/journal-entry-transaction.resolver.ts b/src/app/accounting/common-resolvers/journal-entry-transaction.resolver.ts index d87eb28ff..1a2ab07bc 100644 --- a/src/app/accounting/common-resolvers/journal-entry-transaction.resolver.ts +++ b/src/app/accounting/common-resolvers/journal-entry-transaction.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { AccountingService } from '../accounting.service'; */ @Injectable() export class JournalEntryTransactionResolver { - /** - * @param {AccountingService} accountingService Accounting service. - */ - constructor(private accountingService: AccountingService) {} + private accountingService = inject(AccountingService); /** * Returns the transaction data. diff --git a/src/app/accounting/common-resolvers/loan-products.resolver.ts b/src/app/accounting/common-resolvers/loan-products.resolver.ts index 29ef058ce..e18057c14 100644 --- a/src/app/accounting/common-resolvers/loan-products.resolver.ts +++ b/src/app/accounting/common-resolvers/loan-products.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; /** rxjs Imports */ import { Observable } from 'rxjs'; @@ -12,10 +12,7 @@ import { AccountingService } from '../accounting.service'; */ @Injectable() export class LoanProductsResolver { - /** - * @param {AccountingService} accountingService Accounting service. - */ - constructor(private accountingService: AccountingService) {} + private accountingService = inject(AccountingService); /** * Returns the loan products data. diff --git a/src/app/accounting/common-resolvers/offices.resolver.ts b/src/app/accounting/common-resolvers/offices.resolver.ts index dc084de44..de89fdbda 100644 --- a/src/app/accounting/common-resolvers/offices.resolver.ts +++ b/src/app/accounting/common-resolvers/offices.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; /** rxjs Imports */ import { Observable } from 'rxjs'; @@ -12,10 +12,7 @@ import { AccountingService } from '../accounting.service'; */ @Injectable() export class OfficesResolver { - /** - * @param {AccountingService} accountingService Accounting service. - */ - constructor(private accountingService: AccountingService) {} + private accountingService = inject(AccountingService); /** * Returns the offices data. diff --git a/src/app/accounting/common-resolvers/payment-types.resolver.ts b/src/app/accounting/common-resolvers/payment-types.resolver.ts index 930935781..638bb95c5 100644 --- a/src/app/accounting/common-resolvers/payment-types.resolver.ts +++ b/src/app/accounting/common-resolvers/payment-types.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; /** rxjs Imports */ import { Observable } from 'rxjs'; @@ -12,10 +12,7 @@ import { AccountingService } from '../accounting.service'; */ @Injectable() export class PaymentTypesResolver { - /** - * @param {AccountingService} accountingService Accounting service. - */ - constructor(private accountingService: AccountingService) {} + private accountingService = inject(AccountingService); /** * Returns the payment types data. diff --git a/src/app/accounting/common-resolvers/provisioning-categories.resolver.ts b/src/app/accounting/common-resolvers/provisioning-categories.resolver.ts index 629c057e7..b25466235 100644 --- a/src/app/accounting/common-resolvers/provisioning-categories.resolver.ts +++ b/src/app/accounting/common-resolvers/provisioning-categories.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; /** rxjs Imports */ import { Observable } from 'rxjs'; @@ -12,10 +12,7 @@ import { AccountingService } from '../accounting.service'; */ @Injectable() export class ProvisioningCategoriesResolver { - /** - * @param {AccountingService} accountingService Accounting service. - */ - constructor(private accountingService: AccountingService) {} + private accountingService = inject(AccountingService); /** * Returns the Provisioning categories data. diff --git a/src/app/accounting/create-journal-entry/create-journal-entry.component.html b/src/app/accounting/create-journal-entry/create-journal-entry.component.html index c96cbefbc..a4e219e67 100644 --- a/src/app/accounting/create-journal-entry/create-journal-entry.component.html +++ b/src/app/accounting/create-journal-entry/create-journal-entry.component.html @@ -6,129 +6,131 @@ {{ 'labels.inputs.Office' | translate }} - - {{ office.name }} - + @for (office of officeData; track office) { + + {{ office.name }} + + } - - {{ 'labels.inputs.Office' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (journalEntryForm.controls.officeId.hasError('required')) { + + {{ 'labels.inputs.Office' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Currency' | translate }} - - {{ currency.displayLabel }} - + @for (currency of currencyData; track currency) { + + {{ currency.displayLabel }} + + } - - {{ 'labels.inputs.Currency' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (journalEntryForm.controls.currencyCode.hasError('required')) { + + {{ 'labels.inputs.Currency' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } - - {{ 'labels.inputs.External Asset Owner' | translate }} - - + @if (assetExternalizationEnabled) { + + {{ 'labels.inputs.External Asset Owner' | translate }} + + + } -
    -
    - - - - - {{ 'labels.inputs.Debit Amount' | translate }} - - - {{ 'labels.inputs.Debit Amount' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - - - - - + + + {{ 'labels.inputs.Debit Amount' | translate }} + + @if (debits.at(i).controls.amount.hasError('required')) { + + {{ 'labels.inputs.Debit Amount' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + + @if (i !== 0) { + + } + @if (i === 0) { + + } + +
    -
    + } -
    -
    - - - - - {{ 'labels.inputs.Credit Amount' | translate }} - - - {{ 'labels.inputs.Credit Amount' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - - - - - + + + {{ 'labels.inputs.Credit Amount' | translate }} + + @if (credits.at(i).controls.amount.hasError('required')) { + + {{ 'labels.inputs.Credit Amount' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + + @if (i !== 0) { + + } + @if (i === 0) { + + } + +
    - + } {{ 'labels.inputs.Reference Number' | translate }} @@ -147,18 +149,22 @@ /> - - {{ 'labels.inputs.Transaction Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (journalEntryForm.controls.transactionDate.hasError('required')) { + + {{ 'labels.inputs.Transaction Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Payment Type' | translate }} - - {{ paymentType.name }} - + @for (paymentType of paymentTypeData; track paymentType) { + + {{ paymentType.name }} + + } diff --git a/src/app/accounting/create-journal-entry/create-journal-entry.component.ts b/src/app/accounting/create-journal-entry/create-journal-entry.component.ts index f7f9ae35f..675b1b940 100644 --- a/src/app/accounting/create-journal-entry/create-journal-entry.component.ts +++ b/src/app/accounting/create-journal-entry/create-journal-entry.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, TemplateRef, ElementRef, ViewChild, AfterViewInit } from '@angular/core'; +import { Component, OnInit, TemplateRef, ElementRef, ViewChild, AfterViewInit, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, Validators, UntypedFormArray, UntypedFormControl } from '@angular/forms'; import { Router, ActivatedRoute } from '@angular/router'; import { MatDialog } from '@angular/material/dialog'; @@ -34,6 +34,16 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class CreateJournalEntryComponent implements OnInit, AfterViewInit { + private formBuilder = inject(UntypedFormBuilder); + private accountingService = inject(AccountingService); + private settingsService = inject(SettingsService); + private dateUtils = inject(Dates); + private route = inject(ActivatedRoute); + private router = inject(Router); + private dialog = inject(MatDialog); + private configurationWizardService = inject(ConfigurationWizardService); + private popoverService = inject(PopoverService); + onCreditAmountInput(event: any) { if (event.target.value < 1) { event.target.value = 1; @@ -72,17 +82,7 @@ export class CreateJournalEntryComponent implements OnInit, AfterViewInit { * @param {ConfigurationWizardService} configurationWizardService ConfigurationWizard Service. * @param {PopoverService} popoverService PopoverService. */ - constructor( - private formBuilder: UntypedFormBuilder, - private accountingService: AccountingService, - private settingsService: SettingsService, - private dateUtils: Dates, - private route: ActivatedRoute, - private router: Router, - private dialog: MatDialog, - private configurationWizardService: ConfigurationWizardService, - private popoverService: PopoverService - ) { + constructor() { this.assetExternalizationEnabled = false; this.route.data.subscribe( (data: { offices: any; currencies: any; paymentTypes: any; glAccounts: any; globalConfig: any }) => { @@ -147,7 +147,8 @@ export class CreateJournalEntryComponent implements OnInit, AfterViewInit { '', [ Validators.required, - Validators.min(1)] + Validators.min(1) + ] ] }); } diff --git a/src/app/accounting/financial-activity-mappings/create-financial-activity-mapping/create-financial-activity-mapping.component.html b/src/app/accounting/financial-activity-mappings/create-financial-activity-mapping/create-financial-activity-mapping.component.html index bd780cede..16b310fc1 100644 --- a/src/app/accounting/financial-activity-mappings/create-financial-activity-mapping/create-financial-activity-mapping.component.html +++ b/src/app/accounting/financial-activity-mappings/create-financial-activity-mapping/create-financial-activity-mapping.component.html @@ -6,15 +6,19 @@ {{ 'labels.inputs.Financial Activity' | translate }} - - ({{ financialActivity.id }}) - {{ 'labels.accounting.financialActivity.' + financialActivity.name | translate }} - + @for (financialActivity of financialActivityData; track financialActivity) { + + ({{ financialActivity.id }}) + {{ 'labels.accounting.financialActivity.' + financialActivity.name | translate }} + + } - - {{ 'labels.inputs.Financial Activity' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (financialActivityMappingForm.controls.financialActivityId.hasError('required')) { + + {{ 'labels.inputs.Financial Activity' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } { this.glAccountOptions = data.financialActivityAccountsTemplate.glAccountOptions; this.financialActivityData = data.financialActivityAccountsTemplate.financialActivityOptions; diff --git a/src/app/accounting/financial-activity-mappings/create-financial-activity-mapping/financial-activity-mappings-template.resolver.ts b/src/app/accounting/financial-activity-mappings/create-financial-activity-mapping/financial-activity-mappings-template.resolver.ts index 176e331a6..18eafc94e 100644 --- a/src/app/accounting/financial-activity-mappings/create-financial-activity-mapping/financial-activity-mappings-template.resolver.ts +++ b/src/app/accounting/financial-activity-mappings/create-financial-activity-mapping/financial-activity-mappings-template.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; /** rxjs Imports */ import { Observable } from 'rxjs'; @@ -12,10 +12,7 @@ import { AccountingService } from '../../accounting.service'; */ @Injectable() export class FinancialActivityMappingsTemplateResolver { - /** - * @param {AccountingService} accountingService Accounting service. - */ - constructor(private accountingService: AccountingService) {} + private accountingService = inject(AccountingService); /** * Returns the financial activity mappings template data. diff --git a/src/app/accounting/financial-activity-mappings/edit-financial-activity-mapping/edit-financial-activity-mapping.component.html b/src/app/accounting/financial-activity-mappings/edit-financial-activity-mapping/edit-financial-activity-mapping.component.html index 675ac89e3..e911e3747 100644 --- a/src/app/accounting/financial-activity-mappings/edit-financial-activity-mapping/edit-financial-activity-mapping.component.html +++ b/src/app/accounting/financial-activity-mappings/edit-financial-activity-mapping/edit-financial-activity-mapping.component.html @@ -6,10 +6,12 @@ {{ 'labels.inputs.Financial Activity' | translate }} - - ({{ financialActivity.id }}) - {{ 'labels.accounting.financialActivity.' + financialActivity.name | translate }} - + @for (financialActivity of financialActivityData; track financialActivity) { + + ({{ financialActivity.id }}) + {{ 'labels.accounting.financialActivity.' + financialActivity.name | translate }} + + } diff --git a/src/app/accounting/financial-activity-mappings/edit-financial-activity-mapping/edit-financial-activity-mapping.component.ts b/src/app/accounting/financial-activity-mappings/edit-financial-activity-mapping/edit-financial-activity-mapping.component.ts index febef2e15..263b6ce03 100644 --- a/src/app/accounting/financial-activity-mappings/edit-financial-activity-mapping/edit-financial-activity-mapping.component.ts +++ b/src/app/accounting/financial-activity-mappings/edit-financial-activity-mapping/edit-financial-activity-mapping.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormBuilder, UntypedFormGroup, Validators, ReactiveFormsModule } from '@angular/forms'; import { Router, ActivatedRoute, RouterLink } from '@angular/router'; @@ -22,6 +22,11 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class EditFinancialActivityMappingComponent implements OnInit { + private formBuider = inject(UntypedFormBuilder); + private accountingService = inject(AccountingService); + private route = inject(ActivatedRoute); + private router = inject(Router); + /** Financial activity mapping form. */ financialActivityMappingForm: UntypedFormGroup; /** GL Account options. */ @@ -44,12 +49,7 @@ export class EditFinancialActivityMappingComponent implements OnInit { * @param {ActivatedRoute} route Activated Route. * @param {Router} router Router for navigation. */ - constructor( - private formBuider: UntypedFormBuilder, - private accountingService: AccountingService, - private route: ActivatedRoute, - private router: Router - ) { + constructor() { this.route.data.subscribe((data: { financialActivityAccountAndTemplate: any }) => { this.financialActivityAccountId = data.financialActivityAccountAndTemplate.id; this.financialActivityId = data.financialActivityAccountAndTemplate.financialActivityData.id; diff --git a/src/app/accounting/financial-activity-mappings/edit-financial-activity-mapping/financial-activity-mapping-and-template.resolver.ts b/src/app/accounting/financial-activity-mappings/edit-financial-activity-mapping/financial-activity-mapping-and-template.resolver.ts index 0e3df98ab..9b9b80632 100644 --- a/src/app/accounting/financial-activity-mappings/edit-financial-activity-mapping/financial-activity-mapping-and-template.resolver.ts +++ b/src/app/accounting/financial-activity-mappings/edit-financial-activity-mapping/financial-activity-mapping-and-template.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { AccountingService } from '../../accounting.service'; */ @Injectable() export class FinancialActivityMappingAndTemplateResolver { - /** - * @param {AccountingService} accountingService Accounting service. - */ - constructor(private accountingService: AccountingService) {} + private accountingService = inject(AccountingService); /** * Returns the financial activity mapping and template data. diff --git a/src/app/accounting/financial-activity-mappings/financial-activity-mappings.component.ts b/src/app/accounting/financial-activity-mappings/financial-activity-mappings.component.ts index a45d6aec3..228067e01 100644 --- a/src/app/accounting/financial-activity-mappings/financial-activity-mappings.component.ts +++ b/src/app/accounting/financial-activity-mappings/financial-activity-mappings.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, TemplateRef, ElementRef, ViewChild, AfterViewInit } from '@angular/core'; +import { Component, OnInit, TemplateRef, ElementRef, ViewChild, AfterViewInit, inject } from '@angular/core'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort, MatSortHeader } from '@angular/material/sort'; import { @@ -49,6 +49,11 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class FinancialActivityMappingsComponent implements OnInit, AfterViewInit { + private route = inject(ActivatedRoute); + private router = inject(Router); + private configurationWizardService = inject(ConfigurationWizardService); + private popoverService = inject(PopoverService); + /** Financial activity account data. */ financialActivityAccountData: any; /** Columns to be displayed in financial activity mappings table. */ @@ -82,12 +87,7 @@ export class FinancialActivityMappingsComponent implements OnInit, AfterViewInit * @param {ConfigurationWizardService} configurationWizardService ConfigurationWizard Service. * @param {PopoverService} popoverService PopoverService. */ - constructor( - private route: ActivatedRoute, - private router: Router, - private configurationWizardService: ConfigurationWizardService, - private popoverService: PopoverService - ) { + constructor() { this.route.data.subscribe((data: { financialActivityAccounts: any }) => { this.financialActivityAccountData = data.financialActivityAccounts; }); diff --git a/src/app/accounting/financial-activity-mappings/financial-activity-mappings.resolver.ts b/src/app/accounting/financial-activity-mappings/financial-activity-mappings.resolver.ts index 732d47aa2..124fe2247 100644 --- a/src/app/accounting/financial-activity-mappings/financial-activity-mappings.resolver.ts +++ b/src/app/accounting/financial-activity-mappings/financial-activity-mappings.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; /** rxjs Imports */ import { Observable } from 'rxjs'; @@ -12,10 +12,7 @@ import { AccountingService } from '../accounting.service'; */ @Injectable() export class FinancialActivityMappingsResolver { - /** - * @param {AccountingService} accountingService Accounting service. - */ - constructor(private accountingService: AccountingService) {} + private accountingService = inject(AccountingService); /** * Returns the financial activity mappings data. diff --git a/src/app/accounting/financial-activity-mappings/view-financial-activity-mapping/financial-activity-mapping.resolver.ts b/src/app/accounting/financial-activity-mappings/view-financial-activity-mapping/financial-activity-mapping.resolver.ts index c5675cd7f..7612b7a68 100644 --- a/src/app/accounting/financial-activity-mappings/view-financial-activity-mapping/financial-activity-mapping.resolver.ts +++ b/src/app/accounting/financial-activity-mappings/view-financial-activity-mapping/financial-activity-mapping.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { AccountingService } from '../../accounting.service'; */ @Injectable() export class FinancialActivityMappingResolver { - /** - * @param {AccountingService} accountingService Accounting service. - */ - constructor(private accountingService: AccountingService) {} + private accountingService = inject(AccountingService); /** * Returns the financial activity mapping data. diff --git a/src/app/accounting/financial-activity-mappings/view-financial-activity-mapping/view-financial-activity-mapping.component.ts b/src/app/accounting/financial-activity-mappings/view-financial-activity-mapping/view-financial-activity-mapping.component.ts index c49638380..d55f90978 100644 --- a/src/app/accounting/financial-activity-mappings/view-financial-activity-mapping/view-financial-activity-mapping.component.ts +++ b/src/app/accounting/financial-activity-mappings/view-financial-activity-mapping/view-financial-activity-mapping.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component } from '@angular/core'; +import { Component, inject } from '@angular/core'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; import { MatDialog } from '@angular/material/dialog'; @@ -27,6 +27,12 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ViewFinancialActivityMappingComponent { + private accountingService = inject(AccountingService); + private route = inject(ActivatedRoute); + private router = inject(Router); + private dialog = inject(MatDialog); + private location = inject(Location); + /** Financial activity account ID. */ financialActivityAccountId: any; /** Financial activity account data. */ @@ -39,13 +45,7 @@ export class ViewFinancialActivityMappingComponent { * @param {Router} router Router for navigation. * @param {MatDialog} dialog Dialog reference. */ - constructor( - private accountingService: AccountingService, - private route: ActivatedRoute, - private router: Router, - private dialog: MatDialog, - private location: Location - ) { + constructor() { this.route.data.subscribe((data: { financialActivityAccount: any }) => { this.financialActivityAccount = data.financialActivityAccount; this.financialActivityAccountId = data.financialActivityAccount.id; diff --git a/src/app/accounting/frequent-postings/frequent-postings.component.html b/src/app/accounting/frequent-postings/frequent-postings.component.html index 82aceee00..ea240bb23 100644 --- a/src/app/accounting/frequent-postings/frequent-postings.component.html +++ b/src/app/accounting/frequent-postings/frequent-postings.component.html @@ -6,136 +6,145 @@ {{ 'labels.inputs.Office' | translate }} - - {{ office.name }} - + @for (office of officeData; track office) { + + {{ office.name }} + + } - - {{ 'labels.inputs.Office' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (frequentPostingsForm.controls.officeId.hasError('required')) { + + {{ 'labels.inputs.Office' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Accounting Rule' | translate }} - - {{ accountingRule.name }} - + @for (accountingRule of accountingRuleData; track accountingRule) { + + {{ accountingRule.name }} + + } - - {{ 'labels.inputs.Accounting Rule' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (frequentPostingsForm.controls.accountingRule.hasError('required')) { + + {{ 'labels.inputs.Accounting Rule' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Currency' | translate }} - - {{ currency.displayLabel }} - + @for (currency of currencyData; track currency) { + + {{ currency.displayLabel }} + + } - - {{ 'labels.inputs.Currency' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (frequentPostingsForm.controls.currencyCode.hasError('required')) { + + {{ 'labels.inputs.Currency' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } -
    -
    - - {{ 'labels.inputs.Affected GL Entry (Debit)' | translate }} - - - {{ affectedGLEntryDebit.name }} - - - - {{ 'labels.inputs.Affected GL Entry (Debit)' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - - - {{ 'labels.inputs.Debit Amount' | translate }} - - - {{ 'labels.inputs.Debit Amount' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - - - - - + @for (debit of debits.controls; track debit; let i = $index) { +
    +
    + + {{ 'labels.inputs.Affected GL Entry (Debit)' | translate }} + + @for (affectedGLEntryDebit of debitAccountData; track affectedGLEntryDebit) { + + {{ affectedGLEntryDebit.name }} + + } + + @if (debits.at(i).controls.glAccountId.hasError('required')) { + + {{ 'labels.inputs.Affected GL Entry (Debit)' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + + {{ 'labels.inputs.Debit Amount' | translate }} + + @if (debits.at(i).controls.amount.hasError('required')) { + + {{ 'labels.inputs.Debit Amount' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + + @if (i !== 0) { + + } + @if (i === 0 && allowMultipleDebitEntries) { + + } + +
    -
    + } -
    -
    - - {{ 'labels.inputs.Affected GL Entry (Credit)' | translate }} - - - {{ affectedGLEntryCredit.name }} - - - - {{ 'labels.inputs.Affected GL Entry (Credit)' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - - - {{ 'labels.inputs.Credit Amount' | translate }} - - - {{ 'labels.inputs.Credit Amount' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - - - - - + @for (credit of credits.controls; track credit; let i = $index) { +
    +
    + + {{ 'labels.inputs.Affected GL Entry (Credit)' | translate }} + + @for (affectedGLEntryCredit of creditAccountData; track affectedGLEntryCredit) { + + {{ affectedGLEntryCredit.name }} + + } + + @if (credits.at(i).controls.glAccountId.hasError('required')) { + + {{ 'labels.inputs.Affected GL Entry (Credit)' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + + {{ 'labels.inputs.Credit Amount' | translate }} + + @if (credits.at(i).controls.amount.hasError('required')) { + + {{ 'labels.inputs.Credit Amount' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + + @if (i !== 0) { + + } + @if (i === 0 && allowMultipleCreditEntries) { + + } + +
    -
    + } {{ 'labels.inputs.Reference Number' | translate }} @@ -154,18 +163,22 @@ /> - - {{ 'labels.inputs.Transaction Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (frequentPostingsForm.controls.transactionDate.hasError('required')) { + + {{ 'labels.inputs.Transaction Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Payment Type' | translate }} - - {{ paymentType.name }} - + @for (paymentType of paymentTypeData; track paymentType) { + + {{ paymentType.name }} + + } diff --git a/src/app/accounting/frequent-postings/frequent-postings.component.ts b/src/app/accounting/frequent-postings/frequent-postings.component.ts index 9264b04b7..50b1149bb 100644 --- a/src/app/accounting/frequent-postings/frequent-postings.component.ts +++ b/src/app/accounting/frequent-postings/frequent-postings.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, @@ -32,6 +32,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class FrequentPostingsComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private accountingService = inject(AccountingService); + private settingsService = inject(SettingsService); + private dateUtils = inject(Dates); + private route = inject(ActivatedRoute); + private router = inject(Router); + /** Minimum transaction date allowed. */ minDate = new Date(2000, 0, 1); /** Maximum transaction date allowed. */ @@ -63,14 +70,7 @@ export class FrequentPostingsComponent implements OnInit { * @param {ActivatedRoute} route Activated Route. * @param {Router} router Router for navigation. */ - constructor( - private formBuilder: UntypedFormBuilder, - private accountingService: AccountingService, - private settingsService: SettingsService, - private dateUtils: Dates, - private route: ActivatedRoute, - private router: Router - ) { + constructor() { this.route.data.subscribe((data: { offices: any; accountingRules: any; currencies: any; paymentTypes: any }) => { this.officeData = data.offices; this.accountingRuleData = data.accountingRules; diff --git a/src/app/accounting/migrate-opening-balances/migrate-opening-balances.component.html b/src/app/accounting/migrate-opening-balances/migrate-opening-balances.component.html index 75a428f63..bca4a216d 100644 --- a/src/app/accounting/migrate-opening-balances/migrate-opening-balances.component.html +++ b/src/app/accounting/migrate-opening-balances/migrate-opening-balances.component.html @@ -8,14 +8,18 @@ {{ 'labels.inputs.Office' | translate }} - - {{ office.name }} - + @for (office of officeData; track office) { + + {{ office.name }} + + } - - {{ 'labels.inputs.Office' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (openingBalancesForm.controls.officeId.hasError('required')) { + + {{ 'labels.inputs.Office' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + }
    @@ -26,125 +30,121 @@
    -
    - - - - - {{ 'labels.inputs.Currency' | translate }} - - - {{ currency.displayLabel }} - - - - {{ 'labels.inputs.Currency' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - - - {{ 'labels.inputs.Opening Balances Date' | translate }} - - - - - {{ 'labels.inputs.Opening Balances Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - -
    -
    - {{ 'labels.inputs.Type' | translate }} -
    - -
    - {{ 'labels.inputs.GL Code' | translate }} -
    - -
    - {{ 'labels.inputs.GL Name' | translate }} - {{ 'labels.inputs.Account' | translate }} -
    - -
    - {{ 'labels.inputs.Total Debit' | translate }}: - {{ debitsSum | currency: currencyCode : 'symbol-narrow' : '1.2-2' }} -
    - -
    - {{ 'labels.inputs.Total Credit' | translate }}: - {{ creditsSum | currency: currencyCode : 'symbol-narrow' : '1.2-2' }} + @if (openingBalancesData) { +
    + + + + {{ 'labels.inputs.Currency' | translate }} + + @for (currency of currencyData; track currency) { + + {{ currency.displayLabel }} + + } + + @if (openingBalancesForm.controls.currencyCode.hasError('required')) { + + {{ 'labels.inputs.Currency' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + + {{ 'labels.inputs.Opening Balances Date' | translate }} + + + + @if (openingBalancesForm.controls.transactionDate.hasError('required')) { + + {{ 'labels.inputs.Opening Balances Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + +
    +
    + {{ 'labels.inputs.Type' | translate }} +
    +
    + {{ 'labels.inputs.GL Code' | translate }} +
    +
    + {{ 'labels.inputs.GL Name' | translate }} + {{ 'labels.inputs.Account' | translate }} +
    +
    + {{ 'labels.inputs.Total Debit' | translate }}: + {{ debitsSum | currency: currencyCode : 'symbol-narrow' : '1.2-2' }} +
    +
    + {{ 'labels.inputs.Total Credit' | translate }}: + {{ creditsSum | currency: currencyCode : 'symbol-narrow' : '1.2-2' }} +
    + @for (credit of glAccountEntries.controls; track credit; let i = $index) { +
    +
    +
    + {{ + openingBalancesData.glAccounts[i].glAccountType.value !== + openingBalancesData.glAccounts[i - 1]?.glAccountType.value + ? glAccountTypeLabel(openingBalancesData.glAccounts[i].glAccountType.value) + : '' + }} +
    +
    + {{ openingBalancesData.glAccounts[i].glAccountCode }} +
    +
    + {{ openingBalancesData.glAccounts[i].glAccountName }} +
    +
    + + {{ 'labels.inputs.Debit' | translate }} + + +
    +
    + + {{ 'labels.inputs.Credit' | translate }} + + +
    +
    +
    + }
    - -
    -
    -
    - {{ - openingBalancesData.glAccounts[i].glAccountType.value !== - openingBalancesData.glAccounts[i - 1]?.glAccountType.value - ? glAccountTypeLabel(openingBalancesData.glAccounts[i].glAccountType.value) - : '' - }} -
    - -
    - {{ openingBalancesData.glAccounts[i].glAccountCode }} -
    - -
    - {{ openingBalancesData.glAccounts[i].glAccountName }} -
    - -
    - - {{ 'labels.inputs.Debit' | translate }} - - -
    - -
    - - {{ 'labels.inputs.Credit' | translate }} - - -
    -
    -
    -
    + } - - - - + @if (openingBalancesData) { + + + + + }
    diff --git a/src/app/accounting/migrate-opening-balances/migrate-opening-balances.component.ts b/src/app/accounting/migrate-opening-balances/migrate-opening-balances.component.ts index 6f7e20c30..e3761176d 100644 --- a/src/app/accounting/migrate-opening-balances/migrate-opening-balances.component.ts +++ b/src/app/accounting/migrate-opening-balances/migrate-opening-balances.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, TemplateRef, ElementRef, ViewChild, AfterViewInit } from '@angular/core'; +import { Component, OnInit, TemplateRef, ElementRef, ViewChild, AfterViewInit, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, @@ -19,7 +19,7 @@ import { ConfigurationWizardService } from '../../configuration-wizard/configura import { onlyOneOfTheFieldsIsRequiredValidator } from './only-one-of-the-fields-is-required.validator'; import { Dates } from 'app/core/utils/dates'; import { TranslateService } from '@ngx-translate/core'; -import { NgFor, NgIf, CurrencyPipe } from '@angular/common'; +import { CurrencyPipe } from '@angular/common'; import { GlAccountDisplayComponent } from '../../shared/accounting/gl-account-display/gl-account-display.component'; import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; @@ -37,6 +37,16 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class MigrateOpeningBalancesComponent implements OnInit, AfterViewInit { + private formBuilder = inject(UntypedFormBuilder); + private accountingService = inject(AccountingService); + private settingsService = inject(SettingsService); + private dateUtils = inject(Dates); + private route = inject(ActivatedRoute); + private router = inject(Router); + private configurationWizardService = inject(ConfigurationWizardService); + private popoverService = inject(PopoverService); + private translateService = inject(TranslateService); + /** Minimum opening balances date allowed. */ minDate = new Date(2000, 0, 1); /** Maximum opening balances date allowed. */ @@ -70,17 +80,7 @@ export class MigrateOpeningBalancesComponent implements OnInit, AfterViewInit { * @param {ConfigurationWizardService} configurationWizardService ConfigurationWizard Service. * @param {PopoverService} popoverService PopoverService. */ - constructor( - private formBuilder: UntypedFormBuilder, - private accountingService: AccountingService, - private settingsService: SettingsService, - private dateUtils: Dates, - private route: ActivatedRoute, - private router: Router, - private configurationWizardService: ConfigurationWizardService, - private popoverService: PopoverService, - private translateService: TranslateService - ) { + constructor() { this.route.data.subscribe((data: { offices: any; currencies: any }) => { this.officeData = data.offices; this.currencyData = data.currencies.selectedCurrencyOptions; diff --git a/src/app/accounting/periodic-accruals/periodic-accruals.component.html b/src/app/accounting/periodic-accruals/periodic-accruals.component.html index 1cb0119c6..fff1f1f63 100644 --- a/src/app/accounting/periodic-accruals/periodic-accruals.component.html +++ b/src/app/accounting/periodic-accruals/periodic-accruals.component.html @@ -15,10 +15,12 @@ /> - - {{ 'labels.inputs.Accrue Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (periodicAccrualsForm.controls.tillDate.hasError('required')) { + + {{ 'labels.inputs.Accrue Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + }
    diff --git a/src/app/accounting/periodic-accruals/periodic-accruals.component.ts b/src/app/accounting/periodic-accruals/periodic-accruals.component.ts index c54637123..55d5ec4fb 100644 --- a/src/app/accounting/periodic-accruals/periodic-accruals.component.ts +++ b/src/app/accounting/periodic-accruals/periodic-accruals.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, Validators, ReactiveFormsModule } from '@angular/forms'; import { Router, ActivatedRoute, RouterLink } from '@angular/router'; @@ -22,6 +22,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class PeriodicAccrualsComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private accountingService = inject(AccountingService); + private settingsService = inject(SettingsService); + private dateUtils = inject(Dates); + private route = inject(ActivatedRoute); + private router = inject(Router); + /** Minimum accrue date allowed. */ minDate = new Date(2000, 0, 1); /** Maximum accrue date allowed. */ @@ -29,22 +36,6 @@ export class PeriodicAccrualsComponent implements OnInit { /** Periodic accruals form. */ periodicAccrualsForm: UntypedFormGroup; - /** - * @param {FormBuilder} formBuilder Form Builder. - * @param {AccountingService} accountingService Accounting Service. - * @param {SettingsService} settingsService Settings Service. - * @param {ActivatedRoute} route Activated Route. - * @param {Router} router Router for navigation. - */ - constructor( - private formBuilder: UntypedFormBuilder, - private accountingService: AccountingService, - private settingsService: SettingsService, - private dateUtils: Dates, - private route: ActivatedRoute, - private router: Router - ) {} - /** * Creates periodic accruals form. */ diff --git a/src/app/accounting/provisioning-entries/create-provisioning-entry/create-provisioning-entry.component.html b/src/app/accounting/provisioning-entries/create-provisioning-entry/create-provisioning-entry.component.html index 58d8393e2..bc92cb74c 100644 --- a/src/app/accounting/provisioning-entries/create-provisioning-entry/create-provisioning-entry.component.html +++ b/src/app/accounting/provisioning-entries/create-provisioning-entry/create-provisioning-entry.component.html @@ -15,10 +15,12 @@ /> - - {{ 'labels.inputs.Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (provisioningEntryForm.controls.date.hasError('required')) { + + {{ 'labels.inputs.Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + }
    diff --git a/src/app/accounting/provisioning-entries/create-provisioning-entry/create-provisioning-entry.component.ts b/src/app/accounting/provisioning-entries/create-provisioning-entry/create-provisioning-entry.component.ts index b51ff8379..8d52929a4 100644 --- a/src/app/accounting/provisioning-entries/create-provisioning-entry/create-provisioning-entry.component.ts +++ b/src/app/accounting/provisioning-entries/create-provisioning-entry/create-provisioning-entry.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, Validators, ReactiveFormsModule } from '@angular/forms'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; @@ -22,6 +22,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class CreateProvisioningEntryComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private accountingService = inject(AccountingService); + private settingsService = inject(SettingsService); + private dateUtils = inject(Dates); + private route = inject(ActivatedRoute); + private router = inject(Router); + /** Minimum provisioning date allowed. */ minDate = new Date(2000, 0, 1); /** Maximum provisioning date allowed. */ @@ -29,22 +36,6 @@ export class CreateProvisioningEntryComponent implements OnInit { /** Provisioning entry form. */ provisioningEntryForm: UntypedFormGroup; - /** - * @param {FormBuilder} formBuilder Form Builder. - * @param {AccountingService} accountingService Accounting Service. - * @param {SettingsService} settingsService Settings Service. - * @param {ActivatedRoute} route Activated Route. - * @param {Router} router Router for navigation. - */ - constructor( - private formBuilder: UntypedFormBuilder, - private accountingService: AccountingService, - private settingsService: SettingsService, - private dateUtils: Dates, - private route: ActivatedRoute, - private router: Router - ) {} - /** * Creates the provisioning entry form. */ diff --git a/src/app/accounting/provisioning-entries/provisioning-entries.component.ts b/src/app/accounting/provisioning-entries/provisioning-entries.component.ts index 6aee9844b..a7519428e 100644 --- a/src/app/accounting/provisioning-entries/provisioning-entries.component.ts +++ b/src/app/accounting/provisioning-entries/provisioning-entries.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, ViewChild } from '@angular/core'; +import { Component, OnInit, ViewChild, inject } from '@angular/core'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort, MatSortHeader } from '@angular/material/sort'; import { @@ -50,6 +50,10 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ProvisioningEntriesComponent implements OnInit { + private accountingService = inject(AccountingService); + private route = inject(ActivatedRoute); + private router = inject(Router); + /** Provisioning entry data. */ provisioningEntryData: any; /** Columns to be displayed in provisioning entries table. */ @@ -75,11 +79,7 @@ export class ProvisioningEntriesComponent implements OnInit { * @param {ActivatedRoute} route Activated Route. * @param {Router} router Router for navigation. */ - constructor( - private accountingService: AccountingService, - private route: ActivatedRoute, - private router: Router - ) { + constructor() { this.route.data.subscribe((data: { provisioningEntries: any }) => { this.provisioningEntryData = data.provisioningEntries.pageItems; }); diff --git a/src/app/accounting/provisioning-entries/provisioning-entries.resolver.ts b/src/app/accounting/provisioning-entries/provisioning-entries.resolver.ts index 68a1eaf59..089747ebc 100644 --- a/src/app/accounting/provisioning-entries/provisioning-entries.resolver.ts +++ b/src/app/accounting/provisioning-entries/provisioning-entries.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; /** rxjs Imports */ import { Observable } from 'rxjs'; @@ -12,10 +12,7 @@ import { AccountingService } from '../accounting.service'; */ @Injectable() export class ProvisioningEntriesResolver { - /** - * @param {AccountingService} accountingService Accounting service. - */ - constructor(private accountingService: AccountingService) {} + private accountingService = inject(AccountingService); /** * Returns the provisioning entries data. diff --git a/src/app/accounting/provisioning-entries/view-provisioning-entry/provisioning-entry-entries.resolver.ts b/src/app/accounting/provisioning-entries/view-provisioning-entry/provisioning-entry-entries.resolver.ts index d7cb4b627..41a1df6d6 100644 --- a/src/app/accounting/provisioning-entries/view-provisioning-entry/provisioning-entry-entries.resolver.ts +++ b/src/app/accounting/provisioning-entries/view-provisioning-entry/provisioning-entry-entries.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { AccountingService } from '../../accounting.service'; */ @Injectable() export class ProvisioningEntryEntriesResolver { - /** - * @param {AccountingService} accountingService Accounting service. - */ - constructor(private accountingService: AccountingService) {} + private accountingService = inject(AccountingService); /** * Returns the provisioning entry entries data. diff --git a/src/app/accounting/provisioning-entries/view-provisioning-entry/provisioning-entry.resolver.ts b/src/app/accounting/provisioning-entries/view-provisioning-entry/provisioning-entry.resolver.ts index 302e835e5..6bc6fe5e3 100644 --- a/src/app/accounting/provisioning-entries/view-provisioning-entry/provisioning-entry.resolver.ts +++ b/src/app/accounting/provisioning-entries/view-provisioning-entry/provisioning-entry.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { AccountingService } from '../../accounting.service'; */ @Injectable() export class ProvisioningEntryResolver { - /** - * @param {AccountingService} accountingService Accounting service. - */ - constructor(private accountingService: AccountingService) {} + private accountingService = inject(AccountingService); /** * Returns the provisioning entry data. diff --git a/src/app/accounting/provisioning-entries/view-provisioning-entry/view-provisioning-entry.component.html b/src/app/accounting/provisioning-entries/view-provisioning-entry/view-provisioning-entry.component.html index a846afda8..1fd45aa3c 100644 --- a/src/app/accounting/provisioning-entries/view-provisioning-entry/view-provisioning-entry.component.html +++ b/src/app/accounting/provisioning-entries/view-provisioning-entry/view-provisioning-entry.component.html @@ -1,46 +1,43 @@ -
    -
    - +@if (provisioningEntry) { +
    +
    + +
    + + +
    +
    + {{ 'labels.inputs.Created By' | translate }} +
    +
    + {{ provisioningEntry.createdUser }} +
    +
    + {{ 'labels.inputs.Created On' | translate }} +
    +
    + {{ provisioningEntry.createdDate }} +
    +
    + {{ 'labels.inputs.Amount to be Reserved' | translate }} +
    +
    + {{ provisioningEntry.reservedAmount }} +
    +
    +
    +
    - - - -
    -
    - {{ 'labels.inputs.Created By' | translate }} -
    -
    - {{ provisioningEntry.createdUser }} -
    - -
    - {{ 'labels.inputs.Created On' | translate }} -
    - -
    - {{ provisioningEntry.createdDate }} -
    - -
    - {{ 'labels.inputs.Amount to be Reserved' | translate }} -
    - -
    - {{ provisioningEntry.reservedAmount }} -
    -
    -
    -
    -
    +}
    @@ -62,24 +59,27 @@ - - {{ office.name }} - + @for (office of filteredOfficeData | async; track office) { + + {{ office.name }} + + } - - {{ loanProduct.name }} - + @for (loanProduct of filteredLoanProductData | async; track loanProduct) { + + {{ loanProduct.name }} + + } - - {{ provisioningCategory.categoryName }} - + @for (provisioningCategory of filteredProvisioningCategoryData | async; track provisioningCategory) { + + {{ provisioningCategory.categoryName }} + + } diff --git a/src/app/accounting/provisioning-entries/view-provisioning-entry/view-provisioning-entry.component.ts b/src/app/accounting/provisioning-entries/view-provisioning-entry/view-provisioning-entry.component.ts index ea6f19261..d3a48c216 100644 --- a/src/app/accounting/provisioning-entries/view-provisioning-entry/view-provisioning-entry.component.ts +++ b/src/app/accounting/provisioning-entries/view-provisioning-entry/view-provisioning-entry.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, ViewChild, AfterViewInit } from '@angular/core'; +import { Component, OnInit, ViewChild, AfterViewInit, inject } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; import { UntypedFormControl, ReactiveFormsModule } from '@angular/forms'; import { MatPaginator } from '@angular/material/paginator'; @@ -23,7 +23,7 @@ import { startWith, map, debounceTime, distinctUntilChanged, tap } from 'rxjs/op /** Custom Services */ import { AccountingService } from '../../accounting.service'; -import { NgIf, NgFor, AsyncPipe } from '@angular/common'; +import { AsyncPipe } from '@angular/common'; import { FaIconComponent } from '@fortawesome/angular-fontawesome'; import { MatAutocompleteTrigger, MatAutocomplete, MatOption } from '@angular/material/autocomplete'; import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; @@ -57,6 +57,10 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ViewProvisioningEntryComponent implements OnInit, AfterViewInit { + private accountingService = inject(AccountingService); + private route = inject(ActivatedRoute); + private router = inject(Router); + /** Provisioning entry id. */ provisioningEntryId: string; /** Provisioning entry. */ @@ -112,11 +116,7 @@ export class ViewProvisioningEntryComponent implements OnInit, AfterViewInit { * @param {ActivatedRoute} route Activated Route. * @param {Router} router Router for navigation. */ - constructor( - private accountingService: AccountingService, - private route: ActivatedRoute, - private router: Router - ) { + constructor() { this.route.data.subscribe( (data: { provisioningEntry: any; diff --git a/src/app/accounting/provisioning-entries/view-provisioning-journal-entries/provisioning-journal-entries.resolver.ts b/src/app/accounting/provisioning-entries/view-provisioning-journal-entries/provisioning-journal-entries.resolver.ts index 27aa23cb5..2af5f36ad 100644 --- a/src/app/accounting/provisioning-entries/view-provisioning-journal-entries/provisioning-journal-entries.resolver.ts +++ b/src/app/accounting/provisioning-entries/view-provisioning-journal-entries/provisioning-journal-entries.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { AccountingService } from '../../accounting.service'; */ @Injectable() export class ProvisioningJournalEntriesResolver { - /** - * @param {AccountingService} accountingService Accounting service. - */ - constructor(private accountingService: AccountingService) {} + private accountingService = inject(AccountingService); /** * Returns the provisioning journal entries data. diff --git a/src/app/accounting/provisioning-entries/view-provisioning-journal-entries/view-provisioning-journal-entries.component.html b/src/app/accounting/provisioning-entries/view-provisioning-journal-entries/view-provisioning-journal-entries.component.html index aed4c56a2..f08883efb 100644 --- a/src/app/accounting/provisioning-entries/view-provisioning-journal-entries/view-provisioning-journal-entries.component.html +++ b/src/app/accounting/provisioning-entries/view-provisioning-journal-entries/view-provisioning-journal-entries.component.html @@ -51,26 +51,30 @@ {{ 'labels.inputs.Debit' | translate }} - - {{ - (provisioningJournalEntry.currency.displaySymbol || provisioningJournalEntry.currency.code) + - ' ' + - provisioningJournalEntry.amount - }} - + @if (provisioningJournalEntry.entryType.value === 'DEBIT') { + + {{ + (provisioningJournalEntry.currency.displaySymbol || provisioningJournalEntry.currency.code) + + ' ' + + provisioningJournalEntry.amount + }} + + } {{ 'labels.inputs.Credit' | translate }} - - {{ - (provisioningJournalEntry.currency.displaySymbol || provisioningJournalEntry.currency.code) + - ' ' + - provisioningJournalEntry.amount - }} - + @if (provisioningJournalEntry.entryType.value === 'CREDIT') { + + {{ + (provisioningJournalEntry.currency.displaySymbol || provisioningJournalEntry.currency.code) + + ' ' + + provisioningJournalEntry.amount + }} + + } diff --git a/src/app/accounting/provisioning-entries/view-provisioning-journal-entries/view-provisioning-journal-entries.component.ts b/src/app/accounting/provisioning-entries/view-provisioning-journal-entries/view-provisioning-journal-entries.component.ts index e5f616d91..7524277ee 100644 --- a/src/app/accounting/provisioning-entries/view-provisioning-journal-entries/view-provisioning-journal-entries.component.ts +++ b/src/app/accounting/provisioning-entries/view-provisioning-journal-entries/view-provisioning-journal-entries.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, ViewChild } from '@angular/core'; +import { Component, OnInit, ViewChild, inject } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort, MatSortHeader } from '@angular/material/sort'; @@ -43,6 +43,8 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ViewProvisioningJournalEntriesComponent implements OnInit { + private route = inject(ActivatedRoute); + /** Provisioning journal entry data. */ provisioningJournalEntryData: any; /** Columns to be displayed in provisioning journal entries table. */ @@ -70,7 +72,7 @@ export class ViewProvisioningJournalEntriesComponent implements OnInit { * Retrieves the provisioning journal entries data from `resolve`. * @param {ActivatedRoute} route Activated Route. */ - constructor(private route: ActivatedRoute) { + constructor() { this.route.data.subscribe((data: { provisioningJournalEntry: any }) => { this.provisioningJournalEntryData = data.provisioningJournalEntry.pageItems; }); diff --git a/src/app/accounting/revert-transaction/revert-transaction.component.html b/src/app/accounting/revert-transaction/revert-transaction.component.html index 85e3d969a..7ac530bf7 100644 --- a/src/app/accounting/revert-transaction/revert-transaction.component.html +++ b/src/app/accounting/revert-transaction/revert-transaction.component.html @@ -1,21 +1,21 @@ -
    -

    {{ 'labels.heading.Revert Transaction' | translate }}

    -
    -

    {{ 'labels.text.Revert this transaction?' | translate }}

    - - {{ 'labels.inputs.Comments' | translate }} - - +@if (!data.reverted) { +
    +

    {{ 'labels.heading.Revert Transaction' | translate }}

    +
    +

    {{ 'labels.text.Revert this transaction?' | translate }}

    + + {{ 'labels.inputs.Comments' | translate }} + + +
    + + + +
    - - - - -
    - - +} @else {

    {{ 'labels.heading.Transaction Reverted' | translate }}

    {{ 'labels.heading.Success!' | translate }}

    @@ -28,4 +28,4 @@ {{ 'labels.buttons.Redirect to New Transaction' | translate }} - +} diff --git a/src/app/accounting/revert-transaction/revert-transaction.component.ts b/src/app/accounting/revert-transaction/revert-transaction.component.ts index 40b778e7d..800b959bc 100644 --- a/src/app/accounting/revert-transaction/revert-transaction.component.ts +++ b/src/app/accounting/revert-transaction/revert-transaction.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, Inject } from '@angular/core'; +import { Component, inject } from '@angular/core'; import { MatDialogRef, MAT_DIALOG_DATA, @@ -29,15 +29,9 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class RevertTransactionComponent { + dialogRef = inject>(MatDialogRef); + data = inject(MAT_DIALOG_DATA); + /** Comments input form control. */ comments = new UntypedFormControl(''); - - /** - * @param {MatDialogRef} dialogRef Component reference to dialog. - * @param {any} data Provides comments or reverted transaction ID. - */ - constructor( - public dialogRef: MatDialogRef, - @Inject(MAT_DIALOG_DATA) public data: any - ) {} } diff --git a/src/app/accounting/search-journal-entry/search-journal-entry.component.html b/src/app/accounting/search-journal-entry/search-journal-entry.component.html index 2b83a7af6..b601a0723 100644 --- a/src/app/accounting/search-journal-entry/search-journal-entry.component.html +++ b/src/app/accounting/search-journal-entry/search-journal-entry.component.html @@ -16,9 +16,11 @@ {{ 'labels.inputs.Filter' | translate }} - - {{ filter.option }} - + @for (filter of entryTypeFilterData; track filter) { + + {{ filter.option }} + + } @@ -80,9 +82,11 @@ - - {{ office.name }} - + @for (office of filteredOfficeData | async; track office) { + + {{ office.name }} + + }
    @@ -139,14 +143,18 @@ {{ 'labels.inputs.Debit' | translate }} - {{ journalEntry.amount | formatNumber }} + @if (journalEntry.entryType.value === 'DEBIT') { + {{ journalEntry.amount | formatNumber }} + } {{ 'labels.inputs.Credit' | translate }} - {{ journalEntry.amount | formatNumber }} + @if (journalEntry.entryType.value === 'CREDIT') { + {{ journalEntry.amount | formatNumber }} + } diff --git a/src/app/accounting/search-journal-entry/search-journal-entry.component.ts b/src/app/accounting/search-journal-entry/search-journal-entry.component.ts index dde72a9b9..fea104883 100644 --- a/src/app/accounting/search-journal-entry/search-journal-entry.component.ts +++ b/src/app/accounting/search-journal-entry/search-journal-entry.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, ViewChild, AfterViewInit } from '@angular/core'; +import { Component, OnInit, ViewChild, AfterViewInit, inject } from '@angular/core'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort, MatSortHeader } from '@angular/material/sort'; import { UntypedFormControl, ReactiveFormsModule } from '@angular/forms'; @@ -17,7 +17,7 @@ import { JournalEntriesDataSource } from './journal-entry.datasource'; import { Dates } from 'app/core/utils/dates'; import { MatAutocompleteTrigger, MatOption, MatAutocomplete } from '@angular/material/autocomplete'; import { GlAccountSelectorComponent } from '../../shared/accounting/gl-account-selector/gl-account-selector.component'; -import { NgFor, NgIf, AsyncPipe } from '@angular/common'; +import { AsyncPipe } from '@angular/common'; import { MatTable, MatColumnDef, @@ -67,6 +67,11 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class SearchJournalEntryComponent implements OnInit, AfterViewInit { + private accountingService = inject(AccountingService); + private settingsService = inject(SettingsService); + private dateUtils = inject(Dates); + private route = inject(ActivatedRoute); + /** Minimum transaction date allowed. */ minDate = new Date(2000, 0, 1); /** Maximum transaction date allowed. */ @@ -185,12 +190,7 @@ export class SearchJournalEntryComponent implements OnInit, AfterViewInit { * @param {ActivatedRoute} route Activated Route. * @param {SettingsService} settingsService Settings Service. */ - constructor( - private accountingService: AccountingService, - private settingsService: SettingsService, - private dateUtils: Dates, - private route: ActivatedRoute - ) { + constructor() { this.route.data.subscribe((data: { offices: any; glAccounts: any }) => { this.officeData = data.offices; this.glAccountData = data.glAccounts; diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 90c6d8aef..1f0e7868e 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -121,7 +121,6 @@ export function HttpLoaderFactory(http: HttpClient) { AppRoutingModule, NotFoundComponent, CallbackComponent - ], providers: [ DatePipe, diff --git a/src/app/centers/centers-routing.module.ts b/src/app/centers/centers-routing.module.ts index b4ca7cda3..64fd6f611 100644 --- a/src/app/centers/centers-routing.module.ts +++ b/src/app/centers/centers-routing.module.ts @@ -112,7 +112,6 @@ const routes: Routes = [ ] } ]) - ]; @NgModule({ diff --git a/src/app/centers/centers-view/center-actions/activate-center/activate-center.component.html b/src/app/centers/centers-view/center-actions/activate-center/activate-center.component.html index 2c33f92c1..8a89bb8c7 100644 --- a/src/app/centers/centers-view/center-actions/activate-center/activate-center.component.html +++ b/src/app/centers/centers-view/center-actions/activate-center/activate-center.component.html @@ -14,10 +14,12 @@ /> - - {{ 'labels.inputs.Activated On Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (activateCenterForm.controls.activationDate.hasError('required')) { + + {{ 'labels.inputs.Activated On Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } diff --git a/src/app/centers/centers-view/center-actions/activate-center/activate-center.component.ts b/src/app/centers/centers-view/center-actions/activate-center/activate-center.component.ts index 7858952e6..9ec6430ec 100644 --- a/src/app/centers/centers-view/center-actions/activate-center/activate-center.component.ts +++ b/src/app/centers/centers-view/center-actions/activate-center/activate-center.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, Validators, ReactiveFormsModule } from '@angular/forms'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; @@ -21,6 +21,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ActivateCenterComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private centersService = inject(CentersService); + private settingsService = inject(SettingsService); + private dateUtils = inject(Dates); + private route = inject(ActivatedRoute); + private router = inject(Router); + /** Minimum date allowed. */ minDate = new Date(2000, 0, 1); /** Maximum date allowed. */ @@ -38,14 +45,7 @@ export class ActivateCenterComponent implements OnInit { * @param {ActivatedRoute} route Activated Route * @param {Router} router Router */ - constructor( - private formBuilder: UntypedFormBuilder, - private centersService: CentersService, - private settingsService: SettingsService, - private dateUtils: Dates, - private route: ActivatedRoute, - private router: Router - ) { + constructor() { this.centerId = this.route.parent.snapshot.params['centerId']; } diff --git a/src/app/centers/centers-view/center-actions/attach-center-meeting/attach-center-meeting.component.html b/src/app/centers/centers-view/center-actions/attach-center-meeting/attach-center-meeting.component.html index 385d93ce0..e297e840a 100644 --- a/src/app/centers/centers-view/center-actions/attach-center-meeting/attach-center-meeting.component.html +++ b/src/app/centers/centers-view/center-actions/attach-center-meeting/attach-center-meeting.component.html @@ -15,54 +15,74 @@ /> - - {{ 'labels.inputs.Start Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (centerMeetingForm.controls.startDate.hasError('required')) { + + {{ 'labels.inputs.Start Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Repeats?' | translate }} - - {{ 'labels.inputs.Repetition Frequency' | translate }} - - - {{ option.value }} - - - - {{ 'labels.inputs.Repetition Frequency' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - + @if (centerMeetingForm.contains('frequency')) { + + {{ 'labels.inputs.Repetition Frequency' | translate }} + + @for (option of frequencyOptions; track option) { + + {{ option.value }} + + } + + @if (centerMeetingForm.controls.frequency.hasError('repeatsOnDay')) { + + {{ 'labels.inputs.Repetition Frequency' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + } - - {{ 'labels.inputs.Repetition Interval' | translate }} - - - {{ interval }} - - - - {{ 'labels.inputs.Repetition Interval' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - + @if (centerMeetingForm.contains('interval')) { + + {{ 'labels.inputs.Repetition Interval' | translate }} + + @for (interval of repetitionIntervals; track interval) { + + {{ interval }} + + } + + @if (centerMeetingForm.controls.interval.hasError('repeatsOnDay')) { + + {{ 'labels.inputs.Repetition Interval' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + } - - {{ 'labels.inputs.Repeats on Day' | translate }} - - - {{ day.value }} - - - - {{ 'labels.inputs.At least' | translate }} {{ 'labels.inputs.one' | translate }} - {{ 'labels.inputs.day must be selected' | translate }} - - + @if (centerMeetingForm.contains('repeatsOnDay')) { + + {{ 'labels.inputs.Repeats on Day' | translate }} + + @for (day of repeatsOnDays; track day) { + + {{ day.value }} + + } + + @if (centerMeetingForm.controls.repeatsOnDay.hasError('repeatsOnDay')) { + + {{ 'labels.inputs.At least' | translate }} {{ 'labels.inputs.one' | translate }} + {{ 'labels.inputs.day must be selected' | translate }} + + } + + }
    diff --git a/src/app/centers/centers-view/center-actions/attach-center-meeting/attach-center-meeting.component.ts b/src/app/centers/centers-view/center-actions/attach-center-meeting/attach-center-meeting.component.ts index d8f26f9b0..a8cc8d4f7 100644 --- a/src/app/centers/centers-view/center-actions/attach-center-meeting/attach-center-meeting.component.ts +++ b/src/app/centers/centers-view/center-actions/attach-center-meeting/attach-center-meeting.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, @@ -29,6 +29,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class AttachCenterMeetingComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private centersService = inject(CentersService); + private settingsService = inject(SettingsService); + private dateUtils = inject(Dates); + private route = inject(ActivatedRoute); + private router = inject(Router); + /** Minimum date allowed. */ minDate = new Date(2000, 0, 1); /** Maximum date allowed. */ @@ -55,14 +62,7 @@ export class AttachCenterMeetingComponent implements OnInit { * @param {ActivatedRoute} route Activated Route * @param {Router} router Router */ - constructor( - private formBuilder: UntypedFormBuilder, - private centersService: CentersService, - private settingsService: SettingsService, - private dateUtils: Dates, - private route: ActivatedRoute, - private router: Router - ) { + constructor() { this.route.data.subscribe((data: { centersActionData: any }) => { this.calendarTemplate = data.centersActionData; this.frequencyOptions = this.calendarTemplate.frequencyOptions; diff --git a/src/app/centers/centers-view/center-actions/center-actions.component.html b/src/app/centers/centers-view/center-actions/center-actions.component.html index 87578b19e..106a30087 100644 --- a/src/app/centers/centers-view/center-actions/center-actions.component.html +++ b/src/app/centers/centers-view/center-actions/center-actions.component.html @@ -1,9 +1,27 @@ - - - - - - - - - +@if (actions['Activate']) { + +} +@if (actions['Assign Staff']) { + +} +@if (actions['Close']) { + +} +@if (actions['Attendance']) { + +} +@if (actions['Attach Meeting']) { + +} +@if (actions['Edit Meeting']) { + +} +@if (actions['Edit Meeting Schedule']) { + +} +@if (actions['Manage Groups']) { + +} +@if (actions['Staff Assignment History']) { + +} diff --git a/src/app/centers/centers-view/center-actions/center-actions.component.ts b/src/app/centers/centers-view/center-actions/center-actions.component.ts index da6f40738..0671e221d 100644 --- a/src/app/centers/centers-view/center-actions/center-actions.component.ts +++ b/src/app/centers/centers-view/center-actions/center-actions.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component } from '@angular/core'; +import { Component, inject } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; import { ActivateCenterComponent } from './activate-center/activate-center.component'; import { CenterAssignStaffComponent } from './center-assign-staff/center-assign-staff.component'; @@ -33,6 +33,9 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class CenterActionsComponent { + private route = inject(ActivatedRoute); + private router = inject(Router); + /** Flag object to store possible actions and render appropriate UI to the user */ actions: { Activate: boolean; @@ -59,10 +62,7 @@ export class CenterActionsComponent { /** * @param {ActivatedRoute} route Activated Route */ - constructor( - private route: ActivatedRoute, - private router: Router - ) { + constructor() { this.router.routeReuseStrategy.shouldReuseRoute = () => false; const name = this.route.snapshot.params['action']; diff --git a/src/app/centers/centers-view/center-actions/center-assign-staff/center-assign-staff.component.html b/src/app/centers/centers-view/center-actions/center-assign-staff/center-assign-staff.component.html index 6803d7de3..5f5b17fab 100644 --- a/src/app/centers/centers-view/center-actions/center-assign-staff/center-assign-staff.component.html +++ b/src/app/centers/centers-view/center-actions/center-assign-staff/center-assign-staff.component.html @@ -6,14 +6,18 @@ {{ 'labels.inputs.Staff' | translate }} - - {{ staff.displayName }} - + @for (staff of staffData; track staff) { + + {{ staff.displayName }} + + } - - {{ 'labels.inputs.Staff' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (centerAssignStaffForm.controls.staffId.hasError('required')) { + + {{ 'labels.inputs.Staff' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + }
    diff --git a/src/app/centers/centers-view/center-actions/center-assign-staff/center-assign-staff.component.ts b/src/app/centers/centers-view/center-actions/center-assign-staff/center-assign-staff.component.ts index 97050f081..73f36342b 100644 --- a/src/app/centers/centers-view/center-actions/center-assign-staff/center-assign-staff.component.ts +++ b/src/app/centers/centers-view/center-actions/center-assign-staff/center-assign-staff.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, ReactiveFormsModule } from '@angular/forms'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; @@ -19,6 +19,11 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class CenterAssignStaffComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private centersService = inject(CentersService); + private route = inject(ActivatedRoute); + private router = inject(Router); + /** Center Assign Staff form. */ centerAssignStaffForm: UntypedFormGroup; /** Field Officer Data */ @@ -33,12 +38,7 @@ export class CenterAssignStaffComponent implements OnInit { * @param {ActivatedRoute} route Activated Route * @param {Router} router Router */ - constructor( - private formBuilder: UntypedFormBuilder, - private centersService: CentersService, - private route: ActivatedRoute, - private router: Router - ) { + constructor() { this.route.data.subscribe((data: { centersActionData: any }) => { this.centerData = data.centersActionData; }); diff --git a/src/app/centers/centers-view/center-actions/center-attendance/center-attendance.component.ts b/src/app/centers/centers-view/center-actions/center-attendance/center-attendance.component.ts index 8c3dbd690..75e5e7eac 100644 --- a/src/app/centers/centers-view/center-actions/center-attendance/center-attendance.component.ts +++ b/src/app/centers/centers-view/center-actions/center-attendance/center-attendance.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormControl, ReactiveFormsModule } from '@angular/forms'; import { MatDialog } from '@angular/material/dialog'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; @@ -65,6 +65,14 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class CenterAttendanceComponent implements OnInit { + private route = inject(ActivatedRoute); + private dateUtils = inject(Dates); + private router = inject(Router); + private centersService = inject(CentersService); + private settingsService = inject(SettingsService); + dialog = inject(MatDialog); + private translateService = inject(TranslateService); + /** Members data. */ membersData: any; /** Center Data */ @@ -96,15 +104,7 @@ export class CenterAttendanceComponent implements OnInit { * @param {SettingsService} settingsService Settings Service. * @param {MatDialog} dialog Mat Dialog */ - constructor( - private route: ActivatedRoute, - private dateUtils: Dates, - private router: Router, - private centersService: CentersService, - private settingsService: SettingsService, - public dialog: MatDialog, - private translateService: TranslateService - ) { + constructor() { this.route.data.subscribe((data: { centersActionData: any }) => { this.centerData = data.centersActionData; this.membersData = data.centersActionData.clients; @@ -149,7 +149,6 @@ export class CenterAttendanceComponent implements OnInit { options: { label: 'value', value: 'id', data: this.attendanceTypeOptions }, required: false }) - ]; const data = { title: diff --git a/src/app/centers/centers-view/center-actions/close-center/close-center.component.html b/src/app/centers/centers-view/center-actions/close-center/close-center.component.html index 052ac1d53..2c8d75685 100644 --- a/src/app/centers/centers-view/center-actions/close-center/close-center.component.html +++ b/src/app/centers/centers-view/center-actions/close-center/close-center.component.html @@ -15,23 +15,29 @@ /> - - {{ 'labels.inputs.Closed On Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (closeCenterForm.controls.closureDate.hasError('required')) { + + {{ 'labels.inputs.Closed On Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Closure Reason' | translate }} - - {{ reason.name }} - + @for (reason of closureData; track reason) { + + {{ reason.name }} + + } - - {{ 'labels.inputs.Closure Reason' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (closeCenterForm.controls.closureReasonId.hasError('required')) { + + {{ 'labels.inputs.Closure Reason' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + }
    diff --git a/src/app/centers/centers-view/center-actions/close-center/close-center.component.ts b/src/app/centers/centers-view/center-actions/close-center/close-center.component.ts index d1d060eeb..0d8d4fda3 100644 --- a/src/app/centers/centers-view/center-actions/close-center/close-center.component.ts +++ b/src/app/centers/centers-view/center-actions/close-center/close-center.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, Validators, ReactiveFormsModule } from '@angular/forms'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; @@ -21,6 +21,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class CloseCenterComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private centersService = inject(CentersService); + private settingsService = inject(SettingsService); + private dateUtils = inject(Dates); + private route = inject(ActivatedRoute); + private router = inject(Router); + /** Minimum date allowed. */ minDate = new Date(2000, 0, 1); /** Maximum date allowed. */ @@ -40,14 +47,7 @@ export class CloseCenterComponent implements OnInit { * @param {ActivatedRoute} route Activated Route * @param {Router} router Router */ - constructor( - private formBuilder: UntypedFormBuilder, - private centersService: CentersService, - private settingsService: SettingsService, - private dateUtils: Dates, - private route: ActivatedRoute, - private router: Router - ) { + constructor() { this.route.data.subscribe((data: { centeractionData: any }) => { this.closureData = data.centeractionData.closureReasons; }); diff --git a/src/app/centers/centers-view/center-actions/edit-center-meeting-schedule/edit-center-meeting-schedule.component.html b/src/app/centers/centers-view/center-actions/edit-center-meeting-schedule/edit-center-meeting-schedule.component.html index a6eafece8..1271c6b02 100644 --- a/src/app/centers/centers-view/center-actions/edit-center-meeting-schedule/edit-center-meeting-schedule.component.html +++ b/src/app/centers/centers-view/center-actions/edit-center-meeting-schedule/edit-center-meeting-schedule.component.html @@ -6,14 +6,18 @@ {{ 'labels.inputs.Existing Meeting Date' | translate }} - - {{ date | dateFormat }} - + @for (date of nextMeetingDates; track date) { + + {{ date | dateFormat }} + + } - - {{ 'labels.inputs.Existing Meeting Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (centerEditMeetingScheduleForm.controls.presentMeetingDate.hasError('repeatsOnDay')) { + + {{ 'labels.inputs.Existing Meeting Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } @@ -28,10 +32,12 @@ /> - - {{ 'labels.inputs.Revised Meeting Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (centerEditMeetingScheduleForm.controls.newMeetingDate.hasError('required')) { + + {{ 'labels.inputs.Revised Meeting Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + }
    diff --git a/src/app/centers/centers-view/center-actions/edit-center-meeting-schedule/edit-center-meeting-schedule.component.ts b/src/app/centers/centers-view/center-actions/edit-center-meeting-schedule/edit-center-meeting-schedule.component.ts index 693f6abfe..21c57a002 100644 --- a/src/app/centers/centers-view/center-actions/edit-center-meeting-schedule/edit-center-meeting-schedule.component.ts +++ b/src/app/centers/centers-view/center-actions/edit-center-meeting-schedule/edit-center-meeting-schedule.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, Validators, FormControl, ReactiveFormsModule } from '@angular/forms'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; @@ -23,6 +23,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class EditCenterMeetingScheduleComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private centersService = inject(CentersService); + private settingsService = inject(SettingsService); + private dateUtils = inject(Dates); + private route = inject(ActivatedRoute); + private router = inject(Router); + /** Minimum date allowed. */ minDate = new Date(2000, 0, 1); /** Maximum date allowed. */ @@ -47,14 +54,7 @@ export class EditCenterMeetingScheduleComponent implements OnInit { * @param {ActivatedRoute} route Activated Route * @param {Router} router Router */ - constructor( - private formBuilder: UntypedFormBuilder, - private centersService: CentersService, - private settingsService: SettingsService, - private dateUtils: Dates, - private route: ActivatedRoute, - private router: Router - ) { + constructor() { this.route.data.subscribe((data: { centersActionData: any }) => { this.calendarTemplate = data.centersActionData; this.nextMeetingDates = this.calendarTemplate.nextTenRecurringDates; diff --git a/src/app/centers/centers-view/center-actions/edit-center-meeting/edit-center-meeting.component.html b/src/app/centers/centers-view/center-actions/edit-center-meeting/edit-center-meeting.component.html index b3162741c..1779b2807 100644 --- a/src/app/centers/centers-view/center-actions/edit-center-meeting/edit-center-meeting.component.html +++ b/src/app/centers/centers-view/center-actions/edit-center-meeting/edit-center-meeting.component.html @@ -13,41 +13,55 @@ {{ 'labels.inputs.Repetition Frequency' | translate }} - - {{ option.value }} - + @for (option of frequencyOptions; track option) { + + {{ option.value }} + + } - - {{ 'labels.inputs.Repetition Frequency' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (centerEditMeetingForm.controls.frequency.hasError('repeatsOnDay')) { + + {{ 'labels.inputs.Repetition Frequency' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Repetition Interval' | translate }} - - {{ interval }} - + @for (interval of repetitionIntervals; track interval) { + + {{ interval }} + + } - - {{ 'labels.inputs.Repetition Interval' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (centerEditMeetingForm.controls.interval.hasError('repeatsOnDay')) { + + {{ 'labels.inputs.Repetition Interval' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } - - {{ 'labels.inputs.Repeats on Day' | translate }} - - - {{ day.value }} - - - - {{ 'labels.inputs.At least' | translate }} {{ 'labels.inputs.one' | translate }} - {{ 'labels.inputs.day must be selected' | translate }} - - + @if (centerEditMeetingForm.contains('repeatsOnDay')) { + + {{ 'labels.inputs.Repeats on Day' | translate }} + + @for (day of repeatsOnDays; track day) { + + {{ day.value }} + + } + + @if (centerEditMeetingForm.controls.repeatsOnDay.hasError('repeatsOnDay')) { + + {{ 'labels.inputs.At least' | translate }} {{ 'labels.inputs.one' | translate }} + {{ 'labels.inputs.day must be selected' | translate }} + + } + + } {{ 'labels.inputs.Above Changes are Effective from' | translate }} @@ -61,10 +75,12 @@ /> - - {{ 'labels.inputs.Changes Affection Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (centerEditMeetingForm.controls.startDate.hasError('required')) { + + {{ 'labels.inputs.Changes Affection Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ "labels.text.Repeats' and 'Repeats every" | translate }} diff --git a/src/app/centers/centers-view/center-actions/edit-center-meeting/edit-center-meeting.component.ts b/src/app/centers/centers-view/center-actions/edit-center-meeting/edit-center-meeting.component.ts index 3fc7fed97..a029ca87e 100644 --- a/src/app/centers/centers-view/center-actions/edit-center-meeting/edit-center-meeting.component.ts +++ b/src/app/centers/centers-view/center-actions/edit-center-meeting/edit-center-meeting.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, @@ -31,6 +31,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class EditCenterMeetingComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private centersService = inject(CentersService); + private settingsService = inject(SettingsService); + private dateUtils = inject(Dates); + private route = inject(ActivatedRoute); + private router = inject(Router); + /** Minimum date allowed. */ minDate = new Date(2000, 0, 1); /** Maximum date allowed. */ @@ -59,14 +66,7 @@ export class EditCenterMeetingComponent implements OnInit { * @param {ActivatedRoute} route Activated Route * @param {Router} router Router */ - constructor( - private formBuilder: UntypedFormBuilder, - private centersService: CentersService, - private settingsService: SettingsService, - private dateUtils: Dates, - private route: ActivatedRoute, - private router: Router - ) { + constructor() { this.route.data.subscribe((data: { centersActionData: any }) => { this.calendarTemplate = data.centersActionData; this.frequencyOptions = this.calendarTemplate.frequencyOptions; diff --git a/src/app/centers/centers-view/center-actions/manage-groups/manage-groups.component.html b/src/app/centers/centers-view/center-actions/manage-groups/manage-groups.component.html index 45c43c133..5edc2613e 100644 --- a/src/app/centers/centers-view/center-actions/manage-groups/manage-groups.component.html +++ b/src/app/centers/centers-view/center-actions/manage-groups/manage-groups.component.html @@ -6,9 +6,11 @@ - - {{ group.name }} - + @for (group of groupsData; track group) { + + {{ group.name }} + + }
    @@ -36,19 +38,23 @@

    {{ 'labels.heading.Group Members' | translate }}

    - -
    - {{ group.name }} - -
    -
    + @if (groupMembers?.length) { + + @for (group of groupMembers; track group; let i = $index) { +
    + {{ group.name }} + +
    + } +
    + }
    diff --git a/src/app/centers/centers-view/center-actions/manage-groups/manage-groups.component.ts b/src/app/centers/centers-view/center-actions/manage-groups/manage-groups.component.ts index e4a8b3de9..afe16f6f6 100644 --- a/src/app/centers/centers-view/center-actions/manage-groups/manage-groups.component.ts +++ b/src/app/centers/centers-view/center-actions/manage-groups/manage-groups.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, AfterViewInit } from '@angular/core'; +import { Component, AfterViewInit, inject } from '@angular/core'; import { UntypedFormControl, ReactiveFormsModule } from '@angular/forms'; import { ActivatedRoute } from '@angular/router'; @@ -33,6 +33,11 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ManageGroupsComponent implements AfterViewInit { + private route = inject(ActivatedRoute); + private centersService = inject(CentersService); + private groupsService = inject(GroupsService); + dialog = inject(MatDialog); + /** Center Data */ centerData: any; /** Group data. */ @@ -49,12 +54,7 @@ export class ManageGroupsComponent implements AfterViewInit { * @param {GroupsService} groupsService Groups Service * @param {MatDialog} dialog Mat Dialog */ - constructor( - private route: ActivatedRoute, - private centersService: CentersService, - private groupsService: GroupsService, - public dialog: MatDialog - ) { + constructor() { this.route.data.subscribe((data: { centersActionData: any }) => { this.centerData = data.centersActionData; this.groupMembers = data.centersActionData.groupMembers; diff --git a/src/app/centers/centers-view/center-actions/staff-assignment-history/staff-assignment-history.component.ts b/src/app/centers/centers-view/center-actions/staff-assignment-history/staff-assignment-history.component.ts index b7ae59e12..c0a05d404 100644 --- a/src/app/centers/centers-view/center-actions/staff-assignment-history/staff-assignment-history.component.ts +++ b/src/app/centers/centers-view/center-actions/staff-assignment-history/staff-assignment-history.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, Input } from '@angular/core'; +import { Component, OnInit, Input, inject } from '@angular/core'; import { DomSanitizer } from '@angular/platform-browser'; import { ActivatedRoute, RouterLink } from '@angular/router'; @@ -21,6 +21,9 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class StaffAssignmentHistoryComponent implements OnInit { + private sanitizer = inject(DomSanitizer); + private route = inject(ActivatedRoute); + /** Staff Assignment History Data */ staffAssignmentHistoryData: any; /** trusted resource url for pentaho output */ @@ -29,10 +32,7 @@ export class StaffAssignmentHistoryComponent implements OnInit { /** * @param {DomSanitizer} sanitizer DOM Sanitizer */ - constructor( - private sanitizer: DomSanitizer, - private route: ActivatedRoute - ) { + constructor() { this.route.data.subscribe((data: { centersActionData: any }) => { this.staffAssignmentHistoryData = data.centersActionData; }); diff --git a/src/app/centers/centers-view/centers-view.component.html b/src/app/centers/centers-view/centers-view.component.html index a0400d0c7..94712cf9f 100644 --- a/src/app/centers/centers-view/centers-view.component.html +++ b/src/app/centers/centers-view/centers-view.component.html @@ -17,13 +17,15 @@ > {{ 'labels.heading.Center Name' | translate }} : {{ centerViewData.name }} -
    - -
    + @if (!(centerViewData.status.value === 'Closed')) { +
    + +
    + }
    @@ -31,33 +33,44 @@

    {{ 'labels.inputs.Account' | translate }} #:{{ centerViewData.accountNo }}
    {{ 'labels.inputs.Office' | translate }}: {{ centerViewData.officeName }}
    - - {{ 'labels.inputs.External Id' | translate }}: -
    -
    - - {{ 'labels.inputs.Staff' | translate }}: {{ centerViewData.staffName }}
    -
    + @if (centerViewData.externalId) { + + {{ 'labels.inputs.External Id' | translate }}: +
    +
    + } + @if (centerViewData.staffName) { + {{ 'labels.inputs.Staff' | translate }}: {{ centerViewData.staffName }}
    + } {{ 'labels.inputs.Activation Date' | translate }} : {{ centerViewData.activationDate ? (centerViewData.activationDate | dateFormat) : 'Not Activated' }}

    -
    -

    - {{ 'labels.inputs.Next Meeting on' | translate }}: - {{ centerViewData.collectionMeetingCalendar?.nextTenRecurringDates[0] | dateFormat }} - -
    -
    - {{ 'labels.inputs.Meeting Frequency' | translate }}: - {{ centerViewData.collectionMeetingCalendar?.frequency.value | lowercase }} -

    -
    - + @if (centerViewData.collectionMeetingCalendar) { +
    +

    + {{ 'labels.inputs.Next Meeting on' | translate }}: + {{ centerViewData.collectionMeetingCalendar?.nextTenRecurringDates[0] | dateFormat }} + @if (editMeeting) { + +
    +
    + } + {{ 'labels.inputs.Meeting Frequency' | translate }}: + {{ centerViewData.collectionMeetingCalendar?.frequency.value | lowercase }} +

    +
    + } @else {

    {{ 'labels.inputs.Next Meeting on' | translate }}: {{ 'labels.text.Unassigned' | translate }} @@ -65,21 +78,23 @@ {{ 'labels.inputs.Meeting Frequency' | translate }}: {{ 'labels.text.N/A' | translate }}

    -
    + }
    - - - + @if (!(centerViewData.status.value === 'Active')) { + + + + } - - - + @if (centerViewData.active) { + + + + } - - - - - - - - - - - - + @if (centerViewData.collectionMeetingCalendar) { + + + + } + @if (!centerViewData.staffId) { + + + + } + @if (centerViewData.staffId) { + + + + } + @if (centerViewData.status.value === 'Active') { + + + + } - - - + @if (centerViewData.status.value === 'Active' && !centerViewData.collectionMeetingCalendar) { + + + + } - - - + @for (centerNote of centerNotes; track centerNote; let i = $index) { + + +

    {{ centerNote.note }}

    +

    + {{ 'labels.inputs.Created By' | translate }}: {{ centerNote.createdByUsername }}
    + {{ 'labels.inputs.Date' | translate }}: {{ centerNote.createdOn | dateFormat }} +

    +
    + + +
    +
    + } diff --git a/src/app/centers/centers-view/notes-tab/notes-tab.component.ts b/src/app/centers/centers-view/notes-tab/notes-tab.component.ts index 654c03035..bae6e5fbe 100644 --- a/src/app/centers/centers-view/notes-tab/notes-tab.component.ts +++ b/src/app/centers/centers-view/notes-tab/notes-tab.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit, ViewChild } from '@angular/core'; +import { Component, OnInit, ViewChild, inject } from '@angular/core'; import { UntypedFormBuilder, UntypedFormGroup, Validators, ReactiveFormsModule } from '@angular/forms'; import { MatDialog } from '@angular/material/dialog'; import { ActivatedRoute } from '@angular/router'; @@ -31,20 +31,20 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class NotesTabComponent implements OnInit { + private route = inject(ActivatedRoute); + private formBuilder = inject(UntypedFormBuilder); + private centersService = inject(CentersService); + private authenticationService = inject(AuthenticationService); + private dialog = inject(MatDialog); + private translateService = inject(TranslateService); + centerId: string; username: string; centerNotes: any; noteForm: UntypedFormGroup; @ViewChild('formRef', { static: true }) formRef: any; - constructor( - private route: ActivatedRoute, - private formBuilder: UntypedFormBuilder, - private centersService: CentersService, - private authenticationService: AuthenticationService, - private dialog: MatDialog, - private translateService: TranslateService - ) { + constructor() { const savedCredentials = this.authenticationService.getCredentials(); this.username = savedCredentials.username; this.centerId = this.route.parent.snapshot.params['centerId']; diff --git a/src/app/centers/centers.component.ts b/src/app/centers/centers.component.ts index 34db3d5e4..c741ef6a0 100644 --- a/src/app/centers/centers.component.ts +++ b/src/app/centers/centers.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, ViewChild, AfterViewInit } from '@angular/core'; +import { Component, OnInit, ViewChild, AfterViewInit, inject } from '@angular/core'; import { MatCheckbox } from '@angular/material/checkbox'; import { MatPaginator } from '@angular/material/paginator'; @@ -63,6 +63,8 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class CentersComponent implements OnInit, AfterViewInit { + private centersService = inject(CentersService); + @ViewChild('showClosedCenters', { static: true }) showClosedCenters: MatCheckbox; /** Name form control. */ @@ -96,8 +98,6 @@ export class CentersComponent implements OnInit, AfterViewInit { /** Sorter for centers table. */ @ViewChild(MatSort, { static: true }) sort: MatSort; - constructor(private centersService: CentersService) {} - ngOnInit() { this.getCenters(); } diff --git a/src/app/centers/centers.service.ts b/src/app/centers/centers.service.ts index a728d51e2..48805a3da 100644 --- a/src/app/centers/centers.service.ts +++ b/src/app/centers/centers.service.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { HttpClient, HttpParams } from '@angular/common/http'; /** rxjs Imports */ @@ -12,10 +12,7 @@ import { Observable } from 'rxjs'; providedIn: 'root' }) export class CentersService { - /** - * @param {HttpClient} http Http Client to send requests. - */ - constructor(private http: HttpClient) {} + private http = inject(HttpClient); /** * @param {any} filterBy Properties by which entries should be filtered. diff --git a/src/app/centers/common-resolvers/center-actions.resolver.ts b/src/app/centers/common-resolvers/center-actions.resolver.ts index bf11d698f..3aa5ccf59 100644 --- a/src/app/centers/common-resolvers/center-actions.resolver.ts +++ b/src/app/centers/common-resolvers/center-actions.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { CentersService } from '../centers.service'; */ @Injectable() export class CenterActionsResolver { - /** - * @param {CentersService} centersService Savings service. - */ - constructor(private centersService: CentersService) {} + private centersService = inject(CentersService); /** * Returns the Centers account actions data. diff --git a/src/app/centers/common-resolvers/center-data-and-template.resolver.ts b/src/app/centers/common-resolvers/center-data-and-template.resolver.ts index 9f54b0eb2..c186ed244 100644 --- a/src/app/centers/common-resolvers/center-data-and-template.resolver.ts +++ b/src/app/centers/common-resolvers/center-data-and-template.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { CentersService } from '../centers.service'; */ @Injectable() export class CenterDataAndTemplateResolver { - /** - * @param {CentersService} CentersService Centers service. - */ - constructor(private centersService: CentersService) {} + private centersService = inject(CentersService); /** * Returns the Centers and template data. diff --git a/src/app/centers/common-resolvers/center-datatable.resolver.ts b/src/app/centers/common-resolvers/center-datatable.resolver.ts index 1d6ffce06..c216b5801 100644 --- a/src/app/centers/common-resolvers/center-datatable.resolver.ts +++ b/src/app/centers/common-resolvers/center-datatable.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { CentersService } from '../centers.service'; */ @Injectable() export class CenterDatatableResolver { - /** - * @param {CentersService} CentersService Centers service. - */ - constructor(private centersService: CentersService) {} + private centersService = inject(CentersService); /** * Returns the Centers Notes Data. diff --git a/src/app/centers/common-resolvers/center-datatables.resolver.ts b/src/app/centers/common-resolvers/center-datatables.resolver.ts index 315a4cde5..8fff88a36 100644 --- a/src/app/centers/common-resolvers/center-datatables.resolver.ts +++ b/src/app/centers/common-resolvers/center-datatables.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; /** rxjs Imports */ import { Observable } from 'rxjs'; @@ -12,10 +12,7 @@ import { CentersService } from '../centers.service'; */ @Injectable() export class CenterDatatablesResolver { - /** - * @param {centersService} centersService centers service. - */ - constructor(private centersService: CentersService) {} + private centersService = inject(CentersService); /** * Returns the center datatables. diff --git a/src/app/centers/common-resolvers/center-notes.resolver.ts b/src/app/centers/common-resolvers/center-notes.resolver.ts index a3b74fd09..54e0a7fba 100644 --- a/src/app/centers/common-resolvers/center-notes.resolver.ts +++ b/src/app/centers/common-resolvers/center-notes.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { CentersService } from '../centers.service'; */ @Injectable() export class CenterNotesResolver { - /** - * @param {CentersService} CentersService Centers service. - */ - constructor(private centersService: CentersService) {} + private centersService = inject(CentersService); /** * Returns the Centers Notes Data. diff --git a/src/app/centers/common-resolvers/center-resource.resolver.ts b/src/app/centers/common-resolvers/center-resource.resolver.ts index fd076ad2e..213965ca5 100644 --- a/src/app/centers/common-resolvers/center-resource.resolver.ts +++ b/src/app/centers/common-resolvers/center-resource.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { CentersService } from '../centers.service'; */ @Injectable() export class CenterResourceResolver { - /** - * @param {CentersService} CentersService Centers service. - */ - constructor(private centersService: CentersService) {} + private centersService = inject(CentersService); /** * Returns the Centers data for General Tab. diff --git a/src/app/centers/common-resolvers/center-summary.resolver.ts b/src/app/centers/common-resolvers/center-summary.resolver.ts index b4f0945e7..886a4da8a 100644 --- a/src/app/centers/common-resolvers/center-summary.resolver.ts +++ b/src/app/centers/common-resolvers/center-summary.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { CentersService } from '../centers.service'; */ @Injectable() export class CenterSummaryResolver { - /** - * @param {CentersService} CentersService Centers service. - */ - constructor(private centersService: CentersService) {} + private centersService = inject(CentersService); /** * Returns the Centers Summary Data. diff --git a/src/app/centers/common-resolvers/center-view.resolver.ts b/src/app/centers/common-resolvers/center-view.resolver.ts index 07a355aaa..f744bb84e 100644 --- a/src/app/centers/common-resolvers/center-view.resolver.ts +++ b/src/app/centers/common-resolvers/center-view.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { CentersService } from '../centers.service'; */ @Injectable() export class CenterViewResolver { - /** - * @param {CentersService} CentersService Centers service. - */ - constructor(private centersService: CentersService) {} + private centersService = inject(CentersService); /** * Returns the Centers data. diff --git a/src/app/centers/common-resolvers/savings-account.resolver.ts b/src/app/centers/common-resolvers/savings-account.resolver.ts index b1093e6cf..ccbdd179d 100644 --- a/src/app/centers/common-resolvers/savings-account.resolver.ts +++ b/src/app/centers/common-resolvers/savings-account.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { CentersService } from '../centers.service'; */ @Injectable() export class SavingsAccountResolver { - /** - * @param {CentersService} CentersService Centers service. - */ - constructor(private centersService: CentersService) {} + private centersService = inject(CentersService); /** * Returns the Center Savings Account data. diff --git a/src/app/centers/create-center/create-center.component.html b/src/app/centers/create-center/create-center.component.html index 02d0f8062..9da5dbb87 100644 --- a/src/app/centers/create-center/create-center.component.html +++ b/src/app/centers/create-center/create-center.component.html @@ -6,35 +6,45 @@ {{ 'labels.inputs.name' | translate }} - - {{ 'labels.inputs.Center Name' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - {{ 'labels.inputs.Center Name' | translate }} {{ 'labels.inputs.cannot' | translate }} - {{ 'labels.inputs.begin with a special character or number' | translate }} - + @if (centerForm.controls.name.hasError('required')) { + + {{ 'labels.inputs.Center Name' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + @if (centerForm.controls.name.hasError('pattern')) { + + {{ 'labels.inputs.Center Name' | translate }} {{ 'labels.inputs.cannot' | translate }} + {{ 'labels.inputs.begin with a special character or number' | translate }} + + } {{ 'labels.inputs.Office' | translate }} - - {{ office.name }} - + @for (office of officeData; track office) { + + {{ office.name }} + + } - - {{ 'labels.inputs.Office' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (centerForm.controls.officeId.hasError('required')) { + + {{ 'labels.inputs.Office' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Staff' | translate }} - - {{ staff.displayName }} - + @for (staff of staffData; track staff) { + + {{ staff.displayName }} + + } @@ -42,23 +52,27 @@ {{ 'labels.inputs.Active' | translate }} - - {{ 'labels.inputs.Activation Date' | translate }} - - - - - {{ 'labels.inputs.Activation Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - + @if (this.centerForm.controls.active.value) { + + {{ 'labels.inputs.Activation Date' | translate }} + + + + @if (centerForm.controls.activationDate.hasError('required')) { + + {{ 'labels.inputs.Activation Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + } {{ 'labels.inputs.External Id' | translate }} @@ -77,53 +91,63 @@ /> - - {{ 'labels.inputs.Submission Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (centerForm.controls.submittedOnDate.hasError('required')) { + + {{ 'labels.inputs.Submission Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Select and Add groups' | translate }} - - {{ group.name }} - + @for (group of groupsData; track group) { + + {{ group.name }} + + }
    -
    -
    -
    {{ 'labels.inputs.Group Details' | translate }}
    - + @if (groupChoice.value) { +
    +
    +
    {{ 'labels.inputs.Group Details' | translate }}
    + +
    +
    +
    {{ 'labels.inputs.name' | translate }}
    +
    {{ groupChoice.value.name }}
    +
    +
    +
    {{ 'labels.inputs.Id' | translate }}
    +
    {{ groupChoice.value.id }}
    +
    +
    +
    {{ 'labels.inputs.Office' | translate }}
    +
    {{ groupChoice.value.officeName }}
    +
    -
    -
    {{ 'labels.inputs.name' | translate }}
    -
    {{ groupChoice.value.name }}
    -
    -
    -
    {{ 'labels.inputs.Id' | translate }}
    -
    {{ groupChoice.value.id }}
    -
    -
    -
    {{ 'labels.inputs.Office' | translate }}
    -
    {{ groupChoice.value.officeName }}
    -
    -
    + } - -

    {{ 'labels.heading.Selected Groups' | translate }}

    -
    - - {{ group.name }} -
    -
    + @if (groupMembers.length) { + +

    {{ 'labels.heading.Selected Groups' | translate }}

    + @for (group of groupMembers; track group; let i = $index) { +
    + + {{ group.name }} +
    + } +
    + }
    diff --git a/src/app/centers/create-center/create-center.component.ts b/src/app/centers/create-center/create-center.component.ts index 7b672455b..8d4ac04f3 100644 --- a/src/app/centers/create-center/create-center.component.ts +++ b/src/app/centers/create-center/create-center.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, @@ -39,6 +39,14 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class CreateCenterComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private route = inject(ActivatedRoute); + private router = inject(Router); + private centerService = inject(CentersService); + private settingsService = inject(SettingsService); + private groupService = inject(GroupsService); + private dateUtils = inject(Dates); + /** Minimum date allowed. */ minDate = new Date(2000, 0, 1); /** Maximum date allowed. */ @@ -66,15 +74,7 @@ export class CreateCenterComponent implements OnInit { * @param {GroupsService} groupService GroupsService. * @param {Dates} dateUtils Date Utils to format date. */ - constructor( - private formBuilder: UntypedFormBuilder, - private route: ActivatedRoute, - private router: Router, - private centerService: CentersService, - private settingsService: SettingsService, - private groupService: GroupsService, - private dateUtils: Dates - ) { + constructor() { this.route.data.subscribe((data: { offices: any }) => { this.officeData = data.offices; }); @@ -97,7 +97,8 @@ export class CreateCenterComponent implements OnInit { '', [ Validators.required, - Validators.pattern('(^[A-z]).*')] + Validators.pattern('(^[A-z]).*') + ] ], officeId: [ '', diff --git a/src/app/centers/edit-center/edit-center.component.html b/src/app/centers/edit-center/edit-center.component.html index bada6043d..5dc0a2a2b 100644 --- a/src/app/centers/edit-center/edit-center.component.html +++ b/src/app/centers/edit-center/edit-center.component.html @@ -6,22 +6,28 @@ {{ 'labels.inputs.name' | translate }} - - {{ 'labels.inputs.Center Name' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - {{ 'labels.inputs.Center Name' | translate }} {{ 'labels.inputs.cannot' | translate }} - {{ 'labels.inputs.begin with a special character or number' | translate }} - + @if (editCenterForm.controls.name.hasError('required')) { + + {{ 'labels.inputs.Center Name' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + @if (editCenterForm.controls.name.hasError('pattern')) { + + {{ 'labels.inputs.Center Name' | translate }} {{ 'labels.inputs.cannot' | translate }} + {{ 'labels.inputs.begin with a special character or number' | translate }} + + } {{ 'labels.inputs.Staff' | translate }} - - {{ staff.displayName }} - + @for (staff of staffs; track staff) { + + {{ staff.displayName }} + + } @@ -30,25 +36,29 @@ - - - {{ 'labels.inputs.Activation Date' | translate }} - - - - - {{ 'labels.inputs.Activation Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - + @if (centerData.status.value === 'Pending') { + + + {{ 'labels.inputs.Activation Date' | translate }} + + + + @if (editCenterForm.controls.activationDate.hasError('required')) { + + {{ 'labels.inputs.Activation Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + + }
    diff --git a/src/app/centers/edit-center/edit-center.component.ts b/src/app/centers/edit-center/edit-center.component.ts index 2d188b791..362540d27 100644 --- a/src/app/centers/edit-center/edit-center.component.ts +++ b/src/app/centers/edit-center/edit-center.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, @@ -27,6 +27,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class EditCenterComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private route = inject(ActivatedRoute); + private router = inject(Router); + private centersService = inject(CentersService); + private settingsService = inject(SettingsService); + private dateUtils = inject(Dates); + /** Center Data */ centerData: any; /** Staffs Data */ @@ -47,14 +54,7 @@ export class EditCenterComponent implements OnInit { * @param {GroupsService} groupService GroupsService. * @param {Dates} dateUtils Date Utils to format date. */ - constructor( - private formBuilder: UntypedFormBuilder, - private route: ActivatedRoute, - private router: Router, - private centersService: CentersService, - private settingsService: SettingsService, - private dateUtils: Dates - ) { + constructor() { this.route.data.subscribe((data: { centerData: any }) => { this.centerData = data.centerData; this.staffs = this.centerData.staffOptions; @@ -79,7 +79,8 @@ export class EditCenterComponent implements OnInit { this.centerData.name, [ Validators.required, - Validators.pattern('(^[A-z]).*')] + Validators.pattern('(^[A-z]).*') + ] ], staffId: [this.centerData.staffId], externalId: [this.centerData.externalId] diff --git a/src/app/clients/client-stepper/client-address-step/client-address-step.component.html b/src/app/clients/client-stepper/client-address-step/client-address-step.component.html index 424362ccd..e31a38366 100644 --- a/src/app/clients/client-stepper/client-address-step/client-address-step.component.html +++ b/src/app/clients/client-stepper/client-address-step/client-address-step.component.html @@ -7,64 +7,70 @@ - - - - - {{ getSelectedValue('addressTypeIdOptions', address.addressTypeId)?.name }} - - - - {{ address.relationship }} - - - - - -
    - - - -
    - -

    - {{ 'labels.inputs.Street' | translate }} : {{ address.street }}
    - {{ 'labels.inputs.Address Line' | translate }} 1 : {{ address.addressLine1 }}
    - {{ 'labels.inputs.Address Line' | translate }} 2 : {{ address.addressLine2 }}
    - {{ 'labels.inputs.Address Line' | translate }} 3 : {{ address.addressLine3 }}
    - {{ 'labels.inputs.Town / Village' | translate }} : {{ address.townVillage }}
    - {{ 'labels.inputs.City' | translate }} : {{ address.city }}
    - {{ 'labels.inputs.State / Province' | translate }} : - {{ getSelectedValue('stateProvinceIdOptions', address.stateProvinceId)?.name }}
    - {{ 'labels.inputs.Country' | translate }} : {{ getSelectedValue('countryIdOptions', address.countryId)?.name - }}
    - {{ 'labels.inputs.Postal Code' | translate }} : {{ address.postalCode }}
    - {{ 'labels.inputs.Active Status' | translate }} : {{ address.isActive }}
    -

    -
    -
    + @if (clientAddressData.length > 0) { + + @for (address of clientAddressData; track address; let i = $index) { + + + + {{ getSelectedValue('addressTypeIdOptions', address.addressTypeId)?.name }} + + + {{ address.relationship }} + + + +
    + + + +
    +

    + @if (isFieldEnabled('street')) { + {{ 'labels.inputs.Street' | translate }} : {{ address.street }}
    + } + @if (isFieldEnabled('addressLine1')) { + {{ 'labels.inputs.Address Line' | translate }} 1 : {{ address.addressLine1 }}
    + } + @if (isFieldEnabled('addressLine2')) { + {{ 'labels.inputs.Address Line' | translate }} 2 : {{ address.addressLine2 }}
    + } + @if (isFieldEnabled('addressLine3')) { + {{ 'labels.inputs.Address Line' | translate }} 3 : {{ address.addressLine3 }}
    + } + @if (isFieldEnabled('townVillage')) { + {{ 'labels.inputs.Town / Village' | translate }} : {{ address.townVillage }}
    + } + @if (isFieldEnabled('city')) { + {{ 'labels.inputs.City' | translate }} : {{ address.city }}
    + } + @if (isFieldEnabled('stateProvinceId')) { + {{ 'labels.inputs.State / Province' | translate }} : + {{ getSelectedValue('stateProvinceIdOptions', address.stateProvinceId)?.name }}
    + } + @if (isFieldEnabled('countryId')) { + {{ 'labels.inputs.Country' | translate }} : + {{ getSelectedValue('countryIdOptions', address.countryId)?.name }}
    + } + @if (isFieldEnabled('postalCode')) { + {{ 'labels.inputs.Postal Code' | translate }} : {{ address.postalCode }}
    + } + @if (isFieldEnabled('isActive')) { + {{ 'labels.inputs.Active Status' | translate }} : {{ address.isActive }}
    + } +

    +
    + } +
    + }
    - -
    - -

    - {{ 'labels.inputs.First Name' | translate }} : {{ member.firstName }}
    - {{ 'labels.inputs.Middle Name' | translate }} : {{ member.middleName }}
    - {{ 'labels.inputs.Last Name' | translate }} : {{ member.lastName }}
    - {{ 'labels.inputs.Qualification' | translate }} : {{ member.qualification }}
    - {{ 'labels.inputs.Relationship' | translate }} : - {{ member.relationshipId | find: clientTemplate.familyMemberOptions.relationshipIdOptions : 'id' : 'name' - }}
    - {{ 'labels.inputs.Age' | translate }} : {{ member.age }}
    - {{ 'labels.inputs.Is Dependent' | translate }} : {{ member.isDependent ? 'Yes' : 'No' }}
    - {{ 'labels.inputs.Marital Status' | translate }} : - {{ member.maritalStatusId | find: clientTemplate.familyMemberOptions.maritalStatusIdOptions : 'id' : 'name' - }}
    - {{ 'labels.inputs.Gender' | translate }} : - {{ member.genderId | find: clientTemplate.familyMemberOptions.genderIdOptions : 'id' : 'name' }}
    - {{ 'labels.inputs.Profession' | translate }} : - {{ member.professionId | find: clientTemplate.familyMemberOptions.professionIdOptions : 'id' : 'name' }}
    - {{ 'labels.inputs.Date Of Birth' | translate }} : {{ member.dateOfBirth | dateFormat }}
    -

    - + @for (member of clientFamilyMembers; track member; let i = $index) { + + + + {{ member.firstName }} {{ member.middleName ? member.middleName + ' ' + member.lastName : member.lastName }} + + + {{ member.relationship }} + + + +
    + + +
    +

    + {{ 'labels.inputs.First Name' | translate }} : {{ member.firstName }}
    + {{ 'labels.inputs.Middle Name' | translate }} : {{ member.middleName }}
    + {{ 'labels.inputs.Last Name' | translate }} : {{ member.lastName }}
    + {{ 'labels.inputs.Qualification' | translate }} : {{ member.qualification }}
    + {{ 'labels.inputs.Relationship' | translate }} : + {{ member.relationshipId | find: clientTemplate.familyMemberOptions.relationshipIdOptions : 'id' : 'name' + }}
    + {{ 'labels.inputs.Age' | translate }} : {{ member.age }}
    + {{ 'labels.inputs.Is Dependent' | translate }} : {{ member.isDependent ? 'Yes' : 'No' }}
    + {{ 'labels.inputs.Marital Status' | translate }} : + {{ member.maritalStatusId | find: clientTemplate.familyMemberOptions.maritalStatusIdOptions : 'id' : 'name' + }}
    + {{ 'labels.inputs.Gender' | translate }} : + {{ member.genderId | find: clientTemplate.familyMemberOptions.genderIdOptions : 'id' : 'name' }}
    + {{ 'labels.inputs.Profession' | translate }} : + {{ member.professionId | find: clientTemplate.familyMemberOptions.professionIdOptions : 'id' : 'name' }}
    + {{ 'labels.inputs.Date Of Birth' | translate }} : {{ member.dateOfBirth | dateFormat }}
    +

    +
    + }
    diff --git a/src/app/clients/client-stepper/client-family-members-step/client-family-members-step.component.ts b/src/app/clients/client-stepper/client-family-members-step/client-family-members-step.component.ts index e56bb090f..cbeeac1b0 100644 --- a/src/app/clients/client-stepper/client-family-members-step/client-family-members-step.component.ts +++ b/src/app/clients/client-stepper/client-family-members-step/client-family-members-step.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, Input } from '@angular/core'; +import { Component, Input, inject } from '@angular/core'; import { MatDialog } from '@angular/material/dialog'; /** Custom Components */ @@ -43,20 +43,14 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ClientFamilyMembersStepComponent { + dialog = inject(MatDialog); + private translateService = inject(TranslateService); + /** Cient Template */ @Input() clientTemplate: any; /** Client Family Members */ clientFamilyMembers: any[] = []; - /** - * @param {MatDialog} dialog Mat Dialog - * @param {TranslateService} translateService Translate Service. - */ - constructor( - public dialog: MatDialog, - private translateService: TranslateService - ) {} - /** * Adds a family member. */ diff --git a/src/app/clients/client-stepper/client-general-step/client-general-step.component.html b/src/app/clients/client-stepper/client-general-step/client-general-step.component.html index 2f8145421..3f08b804e 100644 --- a/src/app/clients/client-stepper/client-general-step/client-general-step.component.html +++ b/src/app/clients/client-stepper/client-general-step/client-general-step.component.html @@ -3,22 +3,28 @@ {{ 'labels.inputs.Office' | translate }} - - {{ office.name }} - + @for (office of officeOptions; track office) { + + {{ office.name }} + + } - - {{ 'labels.inputs.Office' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (createClientForm.controls.officeId.hasError('required')) { + + {{ 'labels.inputs.Office' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Legal Form' | translate }} - - {{ legalForm.value | translateKey: 'inputs' }} - + @for (legalForm of legalFormOptions; track legalForm) { + + {{ legalForm.value | translateKey: 'inputs' }} + + } @@ -27,64 +33,86 @@ - - - {{ 'labels.inputs.' + getDateLabel(createClientForm.value.legalFormId, ['Name', 'Entity Name']) | translate }} - - - - {{ 'labels.inputs.Client name' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - {{ 'labels.inputs.Client name' | translate }} {{ 'labels.inputs.cannot' | translate }} - {{ 'labels.commons.begin with a special character or number' | translate }} - - - -
    - - {{ 'labels.inputs.First Name' | translate }} - - - {{ 'labels.inputs.Client first name' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - {{ 'labels.inputs.Client first name' | translate }} {{ 'labels.inputs.cannot' | translate }} - {{ 'labels.commons.begin with a special character or number' | translate }} - + @if (createClientForm.contains('fullname')) { + + + {{ 'labels.inputs.' + getDateLabel(createClientForm.value.legalFormId, ['Name', 'Entity Name']) | translate }} + + + @if (createClientForm.controls.fullname.hasError('required')) { + + {{ 'labels.inputs.Client name' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + @if (createClientForm.controls.fullname.hasError('pattern')) { + + {{ 'labels.inputs.Client name' | translate }} {{ 'labels.inputs.cannot' | translate }} + {{ 'labels.commons.begin with a special character or number' | translate }} + + } + } - - {{ 'labels.inputs.Middle Name' | translate }} - - - {{ 'labels.inputs.Client middle name' | translate }} {{ 'labels.inputs.cannot' | translate }} - {{ 'labels.commons.begin with a special character or number' | translate }} - - - - - {{ 'labels.inputs.Last Name' | translate }} - - - {{ 'labels.inputs.Client last name' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - {{ 'labels.inputs.Client last name' | translate }} {{ 'labels.inputs.cannot' | translate }} - {{ 'labels.commons.begin with a special character or number' | translate }} - - -
    + @if ( + createClientForm.contains('firstname') || + createClientForm.contains('middlename') || + createClientForm.contains('lastname') + ) { +
    + @if (createClientForm.contains('firstname')) { + + {{ 'labels.inputs.First Name' | translate }} + + @if (createClientForm.controls.firstname.hasError('required')) { + + {{ 'labels.inputs.Client first name' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + @if (createClientForm.controls.firstname.hasError('pattern')) { + + {{ 'labels.inputs.Client first name' | translate }} + {{ 'labels.inputs.cannot' | translate }} + {{ 'labels.commons.begin with a special character or number' | translate }} + + } + + } + @if (createClientForm.contains('middlename')) { + + {{ 'labels.inputs.Middle Name' | translate }} + + @if (createClientForm.controls.middlename.hasError('pattern')) { + + {{ 'labels.inputs.Client middle name' | translate }} + {{ 'labels.inputs.cannot' | translate }} + {{ 'labels.commons.begin with a special character or number' | translate }} + + } + + } + @if (createClientForm.contains('lastname')) { + + {{ 'labels.inputs.Last Name' | translate }} + + @if (createClientForm.controls.lastname.hasError('required')) { + + {{ 'labels.inputs.Client last name' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + @if (createClientForm.controls.lastname.hasError('pattern')) { + + {{ 'labels.inputs.Client last name' | translate }} + {{ 'labels.inputs.cannot' | translate }} + {{ 'labels.commons.begin with a special character or number' | translate }} + + } + + } +
    + } @@ -100,79 +128,80 @@ -
    + @if (createClientForm.get('clientNonPersonDetails')) { +
    + + {{ 'labels.inputs.Constitution' | translate }} + + @for (constitution of constitutionOptions; track constitution) { + + {{ constitution.name }} + + } + + + + {{ 'labels.inputs.Main Business Line' | translate }} + + @for (business of businessLineOptions; track business) { + + {{ business.name }} + + } + + + + {{ 'labels.inputs.Incorporation Validity Till Date' | translate }} + + + + + + {{ 'labels.inputs.Incorporation Number' | translate }} + + + + {{ 'labels.inputs.Remarks' | translate }} + + +
    + } + + @if (createClientForm.value.legalFormId === 1) { - {{ 'labels.inputs.Constitution' | translate }} - - - {{ constitution.name }} - + {{ 'labels.inputs.Gender' | translate }} + + @for (gender of genderOptions; track gender) { + + {{ gender.name }} + + } - - - {{ 'labels.inputs.Main Business Line' | translate }} - - - {{ business.name }} - - - - - - {{ 'labels.inputs.Incorporation Validity Till Date' | translate }} - - - - - - - {{ 'labels.inputs.Incorporation Number' | translate }} - - - - - {{ 'labels.inputs.Remarks' | translate }} - - -
    - - - {{ 'labels.inputs.Gender' | translate }} - - - {{ gender.name }} - - - + } {{ 'labels.inputs.Staff' | translate }} - - {{ staff.displayName }} - + @for (staff of staffOptions; track staff) { + + {{ staff.displayName }} + + } - - {{ 'labels.inputs.Is staff' | translate }}? - + @if (createClientForm.value.legalFormId === 1) { + + {{ 'labels.inputs.Is staff' | translate }}? + + } @@ -184,29 +213,32 @@ {{ 'labels.inputs.Email Address' | translate }} - - {{ 'error.Email not valid' | translate }} - + @if (createClientForm.controls.emailAddress.errors?.email) { + + {{ 'error.Email not valid' | translate }} + + } {{ 'labels.inputs.Client Type' | translate }} - - {{ clientType.name }} - + @for (clientType of clientTypeOptions; track clientType) { + + {{ clientType.name }} + + } {{ 'labels.inputs.Client Classification' | translate }} - - {{ clientClassification.name }} - + @for (clientClassification of clientClassificationTypeOptions; track clientClassification) { + + {{ clientClassification.name }} + + } @@ -230,44 +262,50 @@ {{ 'labels.inputs.Active' | translate }}? - - {{ 'labels.inputs.Activation Date' | translate }} - - - - - {{ 'labels.inputs.Activation Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - + @if (createClientForm.contains('activationDate')) { + + {{ 'labels.inputs.Activation Date' | translate }} + + + + @if (createClientForm.controls.activationDate.hasError('required')) { + + {{ 'labels.inputs.Activation Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + } {{ 'labels.inputs.Open Savings Account' | translate }}? - - {{ 'labels.inputs.Savings Product' | translate }} - - - {{ product.name }} - - - - {{ 'labels.inputs.Savings Product' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - + @if (createClientForm.contains('savingsProductId')) { + + {{ 'labels.inputs.Savings Product' | translate }} + + @for (product of savingProductOptions; track product) { + + {{ product.name }} + + } + + @if (createClientForm.controls.savingsProductId.hasError('required')) { + + {{ 'labels.inputs.Savings Product' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + }
    diff --git a/src/app/clients/client-stepper/client-general-step/client-general-step.component.ts b/src/app/clients/client-stepper/client-general-step/client-general-step.component.ts index f093dc6a6..9c39a9d28 100644 --- a/src/app/clients/client-stepper/client-general-step/client-general-step.component.ts +++ b/src/app/clients/client-stepper/client-general-step/client-general-step.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core'; +import { Component, OnInit, Input, Output, EventEmitter, inject } from '@angular/core'; import { UntypedFormBuilder, UntypedFormGroup, @@ -37,6 +37,11 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ClientGeneralStepComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private dateUtils = inject(Dates); + private settingsService = inject(SettingsService); + private clientService = inject(ClientsService); + @Output() legalFormChangeEvent = new EventEmitter<{ legalForm: number }>(); /** Minimum date allowed. */ @@ -74,12 +79,7 @@ export class ClientGeneralStepComponent implements OnInit { * @param {SettingsService} settingsService Setting service * @param {ClientsService} clientService Client service */ - constructor( - private formBuilder: UntypedFormBuilder, - private dateUtils: Dates, - private settingsService: SettingsService, - private clientService: ClientsService - ) { + constructor() { this.setClientForm(); } @@ -152,14 +152,16 @@ export class ClientGeneralStepComponent implements OnInit { 'firstname', new UntypedFormControl('', [ Validators.required, - Validators.pattern('(^[A-z]).*')]) + Validators.pattern('(^[A-z]).*') + ]) ); this.createClientForm.addControl('middlename', new UntypedFormControl('', Validators.pattern('(^[A-z]).*'))); this.createClientForm.addControl( 'lastname', new UntypedFormControl('', [ Validators.required, - Validators.pattern('(^[A-z]).*')]) + Validators.pattern('(^[A-z]).*') + ]) ); } else { this.createClientForm.removeControl('firstname'); @@ -169,7 +171,8 @@ export class ClientGeneralStepComponent implements OnInit { 'fullname', new UntypedFormControl('', [ Validators.required, - Validators.pattern('(^[A-z]).*')]) + Validators.pattern('(^[A-z]).*') + ]) ); this.createClientForm.addControl( 'clientNonPersonDetails', diff --git a/src/app/clients/client-stepper/client-preview-step/client-preview-step.component.html b/src/app/clients/client-stepper/client-preview-step/client-preview-step.component.html index 00b1b410b..207522e80 100644 --- a/src/app/clients/client-stepper/client-preview-step/client-preview-step.component.html +++ b/src/app/clients/client-stepper/client-preview-step/client-preview-step.component.html @@ -5,11 +5,15 @@
    {{ 'labels.inputs.name' | translate }} - {{ client.fullname }} - {{ client.firstname }} - {{ client.middlename ? client.middlename + ' ' + client.lastname : client.lastname }} + @if (client.legalFormId === 2) { + {{ client.fullname }} + } + @if (client.legalFormId === 1) { + {{ client.firstname }} + {{ client.middlename ? client.middlename + ' ' + client.lastname : client.lastname }} + }
    @@ -22,209 +26,239 @@ {{ client.legalFormId | find: clientTemplate.clientLegalFormOptions : 'id' : 'value' }}
    -
    - {{ 'labels.inputs.Staff' | translate }} - {{ client.staffId | find: clientTemplate.staffOptions : 'id' : 'displayName' }} -
    + @if (client.staffId) { +
    + {{ 'labels.inputs.Staff' | translate }} + {{ client.staffId | find: clientTemplate.staffOptions : 'id' : 'displayName' }} +
    + } -
    - {{ client.legalFormId === 1 ? 'Date of Birth' : 'Incorporation Date' }} - {{ client.dateOfBirth | dateFormat }} -
    + @if (client.dateOfBirth) { +
    + {{ client.legalFormId === 1 ? 'Date of Birth' : 'Incorporation Date' }} + {{ client.dateOfBirth | dateFormat }} +
    + } -
    - {{ 'labels.inputs.External Id' | translate }} - - - -
    + @if (client.externalId) { +
    + {{ 'labels.inputs.External Id' | translate }} + + + +
    + } -
    - {{ 'labels.inputs.Mobile No' | translate }} - {{ client.mobileNo }} -
    + @if (client.mobileNo) { +
    + {{ 'labels.inputs.Mobile No' | translate }} + {{ client.mobileNo }} +
    + } -
    - {{ 'labels.inputs.Email Address' | translate }} - {{ client.emailAddress }} -
    + @if (client.emailAddress) { +
    + {{ 'labels.inputs.Email Address' | translate }} + {{ client.emailAddress }} +
    + } -
    - {{ 'labels.inputs.Client Type' | translate }} - {{ client.clientTypeId | find: clientTemplate.clientTypeOptions : 'id' : 'name' }} -
    + @if (client.clientTypeId) { +
    + {{ 'labels.inputs.Client Type' | translate }} + {{ client.clientTypeId | find: clientTemplate.clientTypeOptions : 'id' : 'name' }} +
    + } -
    - {{ 'labels.inputs.Client Classification' | translate }} - {{ - client.clientClassificationId | find: clientTemplate.clientClassificationOptions : 'id' : 'name' - }} -
    + @if (client.clientClassificationId) { +
    + {{ 'labels.inputs.Client Classification' | translate }} + {{ + client.clientClassificationId | find: clientTemplate.clientClassificationOptions : 'id' : 'name' + }} +
    + } -
    - {{ 'labels.inputs.Savings Product' | translate }} - {{ - client.savingsProductId | find: clientTemplate.savingProductOptions : 'id' : 'name' - }} -
    + @if (client.savingsProductId) { +
    + {{ 'labels.inputs.Savings Product' | translate }} + {{ + client.savingsProductId | find: clientTemplate.savingProductOptions : 'id' : 'name' + }} +
    + } -
    - {{ 'labels.inputs.Submitted On Date' | translate }} - {{ client.submittedOnDate | dateFormat }} -
    + @if (client.submittedOnDate) { +
    + {{ 'labels.inputs.Submitted On Date' | translate }} + {{ client.submittedOnDate | dateFormat }} +
    + }
    {{ 'labels.inputs.Active' | translate }}? {{ client.active | yesNo }}
    -
    - {{ 'labels.inputs.Activation Date' | translate }} - {{ client.activationDate | dateFormat }} -
    - - -
    - {{ 'labels.inputs.Gender' | translate }} - {{ client.genderId | find: clientTemplate.genderOptions : 'id' : 'name' }} + @if (client.activationDate) { +
    + {{ 'labels.inputs.Activation Date' | translate }} + {{ client.activationDate | dateFormat }}
    + } + @if (client.legalFormId === 1) { + @if (client.genderId) { +
    + {{ 'labels.inputs.Gender' | translate }} + {{ client.genderId | find: clientTemplate.genderOptions : 'id' : 'name' }} +
    + }
    {{ 'labels.inputs.Is staff' | translate }}? {{ client.isStaff | yesNo }}
    - - - -
    - {{ 'labels.inputs.Incorporation Validity Till Date' | translate }} - {{ client.clientNonPersonDetails.incorpValidityTillDate | dateFormat }} -
    + } + @if (client.legalFormId === 2) { + @if (client.clientNonPersonDetails.incorpValidityTillDate) { +
    + {{ 'labels.inputs.Incorporation Validity Till Date' | translate }} + {{ client.clientNonPersonDetails.incorpValidityTillDate | dateFormat }} +
    + }
    {{ 'labels.inputs.Incorportation Number' | translate }} {{ client.clientNonPersonDetails.incorpNumber || 'Not Provided' }}
    - -
    - {{ 'labels.inputs.Main Business Line' | translate }} - {{ - client.clientNonPersonDetails.mainBusinessLineId - | find: clientTemplate.clientNonPersonMainBusinessLineOptions : 'id' : 'name' - }} -
    - -
    - {{ 'labels.inputs.Constitution' | translate }} - {{ - client.clientNonPersonDetails.constitutionId - | find: clientTemplate.clientNonPersonConstitutionOptions : 'id' : 'name' - }} -
    - + @if (client.clientNonPersonDetails.mainBusinessLineId) { +
    + {{ 'labels.inputs.Main Business Line' | translate }} + {{ + client.clientNonPersonDetails.mainBusinessLineId + | find: clientTemplate.clientNonPersonMainBusinessLineOptions : 'id' : 'name' + }} +
    + } + @if (client.clientNonPersonDetails.constitutionId) { +
    + {{ 'labels.inputs.Constitution' | translate }} + {{ + client.clientNonPersonDetails.constitutionId + | find: clientTemplate.clientNonPersonConstitutionOptions : 'id' : 'name' + }} +
    + }
    {{ 'labels.inputs.Remarks' | translate }} {{ client.clientNonPersonDetails.remarks || 'N/A' }}
    -
    + } -
    -

    {{ 'labels.heading.Family Members' | translate }}

    + @if (client.familyMembers.length) { +
    +

    {{ 'labels.heading.Family Members' | translate }}

    + + + @for (member of client.familyMembers; track member) { + + + + {{ member.firstName }} + {{ member.middleName ? member.middleName + ' ' + member.lastName : member.lastName }} + + + {{ member.relationship }} + + + +

    + {{ 'labels.inputs.First Name' | translate }} : {{ member.firstName }}
    + {{ 'labels.inputs.Middle Name' | translate }} : {{ member.middleName }}
    + {{ 'labels.inputs.Last Name' | translate }} : {{ member.lastName }}
    + {{ 'labels.inputs.Qualification' | translate }} : {{ member.qualification }}
    + {{ 'labels.inputs.Relationship' | translate }} : + {{ member.relationshipId | find: clientTemplate.familyMemberOptions.relationshipIdOptions : 'id' : 'name' + }}
    + {{ 'labels.inputs.Age' | translate }} : {{ member.age }}
    + {{ 'labels.inputs.Is Dependent' | translate }} : {{ member.isDependent ? 'Yes' : 'No' }}
    + {{ 'labels.inputs.Marital Status' | translate }} : + {{ + member.maritalStatusId + | find: clientTemplate.familyMemberOptions.maritalStatusIdOptions : 'id' : 'name' + }}
    + {{ 'labels.inputs.Gender' | translate }} : + {{ member.genderId | find: clientTemplate.familyMemberOptions.genderIdOptions : 'id' : 'name' }}
    + {{ 'labels.inputs.Profession' | translate }} : + {{ member.professionId | find: clientTemplate.familyMemberOptions.professionIdOptions : 'id' : 'name' + }}
    + {{ 'labels.inputs.Date Of Birth' | translate }} : {{ member.dateOfBirth | dateFormat }}
    +

    +
    + } +
    +
    + } - - - - - - {{ member.firstName }} {{ member.middleName ? member.middleName + ' ' + member.lastName : member.lastName }} - - - - {{ member.relationship }} - - - - - -

    - {{ 'labels.inputs.First Name' | translate }} : {{ member.firstName }}
    - {{ 'labels.inputs.Middle Name' | translate }} : {{ member.middleName }}
    - {{ 'labels.inputs.Last Name' | translate }} : {{ member.lastName }}
    - {{ 'labels.inputs.Qualification' | translate }} : {{ member.qualification }}
    - {{ 'labels.inputs.Relationship' | translate }} : - {{ member.relationshipId | find: clientTemplate.familyMemberOptions.relationshipIdOptions : 'id' : 'name' - }}
    - {{ 'labels.inputs.Age' | translate }} : {{ member.age }}
    - {{ 'labels.inputs.Is Dependent' | translate }} : {{ member.isDependent ? 'Yes' : 'No' }}
    - {{ 'labels.inputs.Marital Status' | translate }} : - {{ member.maritalStatusId | find: clientTemplate.familyMemberOptions.maritalStatusIdOptions : 'id' : 'name' - }}
    - {{ 'labels.inputs.Gender' | translate }} : - {{ member.genderId | find: clientTemplate.familyMemberOptions.genderIdOptions : 'id' : 'name' }}
    - {{ 'labels.inputs.Profession' | translate }} : - {{ member.professionId | find: clientTemplate.familyMemberOptions.professionIdOptions : 'id' : 'name' }}
    - {{ 'labels.inputs.Date Of Birth' | translate }} : {{ member.dateOfBirth | dateFormat }}
    -

    -
    -
    -
    - -
    -

    {{ 'labels.heading.Address' | translate }}

    - - - - - - - {{ getSelectedValue('addressTypeIdOptions', address.addressTypeId)?.name }} - - - - {{ address.relationship }} - - - - - -

    - {{ 'labels.inputs.Street' | translate }} : {{ address.street }}
    - {{ 'labels.inputs.Address Line' | translate }} 1 : {{ address.addressLine1 }}
    - {{ 'labels.inputs.Address Line' | translate }} 2 : {{ address.addressLine2 }}
    - {{ 'labels.inputs.Address Line' | translate }} 3 : {{ address.addressLine3 }}
    - {{ 'labels.inputs.Town / Village' | translate }} : {{ address.townVillage }}
    - {{ 'labels.inputs.City' | translate }} : {{ address.city }}
    - {{ 'labels.inputs.State / Province' | translate }} : - {{ getSelectedValue('stateProvinceIdOptions', address.stateProvinceId)?.name }}
    - {{ 'labels.inputs.Country' | translate }} : - {{ getSelectedValue('countryIdOptions', address.countryId)?.name }}
    - {{ 'labels.inputs.Postal Code' | translate }} : {{ address.postalCode }}
    - {{ 'labels.inputs.Active Status' | translate }} : {{ address.isActive }}
    -

    -
    -
    -
    + @if (clientTemplate.isAddressEnabled && client.address && client.address.length) { +
    +

    {{ 'labels.heading.Address' | translate }}

    + + + @for (address of client.address; track address) { + + + + {{ getSelectedValue('addressTypeIdOptions', address.addressTypeId)?.name }} + + + {{ address.relationship }} + + + +

    + @if (isFieldEnabled('street')) { + {{ 'labels.inputs.Street' | translate }} : {{ address.street }}
    + } + @if (isFieldEnabled('addressLine1')) { + {{ 'labels.inputs.Address Line' | translate }} 1 : {{ address.addressLine1 }}
    + } + @if (isFieldEnabled('addressLine2')) { + {{ 'labels.inputs.Address Line' | translate }} 2 : {{ address.addressLine2 }}
    + } + @if (isFieldEnabled('addressLine3')) { + {{ 'labels.inputs.Address Line' | translate }} 3 : {{ address.addressLine3 }}
    + } + @if (isFieldEnabled('townVillage')) { + {{ 'labels.inputs.Town / Village' | translate }} : {{ address.townVillage }}
    + } + @if (isFieldEnabled('city')) { + {{ 'labels.inputs.City' | translate }} : {{ address.city }}
    + } + @if (isFieldEnabled('stateProvinceId')) { + {{ 'labels.inputs.State / Province' | translate }} : + {{ getSelectedValue('stateProvinceIdOptions', address.stateProvinceId)?.name }}
    + } + @if (isFieldEnabled('countryId')) { + {{ 'labels.inputs.Country' | translate }} : + {{ getSelectedValue('countryIdOptions', address.countryId)?.name }}
    + } + @if (isFieldEnabled('postalCode')) { + {{ 'labels.inputs.Postal Code' | translate }} : {{ address.postalCode }}
    + } + @if (isFieldEnabled('isActive')) { + {{ 'labels.inputs.Active Status' | translate }} : {{ address.isActive }}
    + } +

    +
    + } +
    +
    + }
    diff --git a/src/app/clients/clients-routing.module.ts b/src/app/clients/clients-routing.module.ts index 3a611f601..42eea8e2d 100644 --- a/src/app/clients/clients-routing.module.ts +++ b/src/app/clients/clients-routing.module.ts @@ -277,7 +277,6 @@ const routes: Routes = [ ] } ]) - ]; @NgModule({ diff --git a/src/app/clients/clients-view/address-tab/address-tab.component.html b/src/app/clients/clients-view/address-tab/address-tab.component.html index 288a2cce3..98ae04fe1 100644 --- a/src/app/clients/clients-view/address-tab/address-tab.component.html +++ b/src/app/clients/clients-view/address-tab/address-tab.component.html @@ -8,57 +8,62 @@
    - - - - {{ address.addressType }} - - - {{ address.relationship }} - - - - - -
    - - -
    - -

    - {{ 'labels.inputs.Street' | translate }} : {{ address.street }}
    - {{ 'labels.inputs.Address Line' | translate }} 1 : {{ address.addressLine1 }}
    - {{ 'labels.inputs.Address Line' | translate }} 2 : {{ address.addressLine2 }}
    - {{ 'labels.inputs.Address Line' | translate }} 3 : {{ address.addressLine3 }}
    - {{ 'labels.inputs.Town / Village' | translate }} : {{ address.townVillage }}
    - {{ 'labels.inputs.City' | translate }} : {{ address.city }}
    - {{ 'labels.inputs.State / Province' | translate }} : - {{ getSelectedValue('stateProvinceIdOptions', address.stateProvinceId)?.name }}
    - {{ 'labels.inputs.Country' | translate }} : {{ getSelectedValue('countryIdOptions', address.countryId)?.name - }}
    - {{ 'labels.inputs.Postal Code' | translate }} : {{ address.postalCode }}
    - {{ 'labels.inputs.Active Status' | translate }} : {{ address.isActive }}
    -

    -
    + @for (address of clientAddressData; track address; let i = $index) { + + + + {{ address.addressType }} + + + {{ address.relationship }} + + + +
    + + +
    +

    + @if (isFieldEnabled('street')) { + {{ 'labels.inputs.Street' | translate }} : {{ address.street }}
    + } + @if (isFieldEnabled('addressLine1')) { + {{ 'labels.inputs.Address Line' | translate }} 1 : {{ address.addressLine1 }}
    + } + @if (isFieldEnabled('addressLine2')) { + {{ 'labels.inputs.Address Line' | translate }} 2 : {{ address.addressLine2 }}
    + } + @if (isFieldEnabled('addressLine3')) { + {{ 'labels.inputs.Address Line' | translate }} 3 : {{ address.addressLine3 }}
    + } + @if (isFieldEnabled('townVillage')) { + {{ 'labels.inputs.Town / Village' | translate }} : {{ address.townVillage }}
    + } + @if (isFieldEnabled('city')) { + {{ 'labels.inputs.City' | translate }} : {{ address.city }}
    + } + @if (isFieldEnabled('stateProvinceId')) { + {{ 'labels.inputs.State / Province' | translate }} : + {{ getSelectedValue('stateProvinceIdOptions', address.stateProvinceId)?.name }}
    + } + @if (isFieldEnabled('countryId')) { + {{ 'labels.inputs.Country' | translate }} : + {{ getSelectedValue('countryIdOptions', address.countryId)?.name }}
    + } + @if (isFieldEnabled('postalCode')) { + {{ 'labels.inputs.Postal Code' | translate }} : {{ address.postalCode }}
    + } + @if (isFieldEnabled('isActive')) { + {{ 'labels.inputs.Active Status' | translate }} : {{ address.isActive }}
    + } +

    +
    + }
    diff --git a/src/app/clients/clients-view/address-tab/address-tab.component.ts b/src/app/clients/clients-view/address-tab/address-tab.component.ts index e66338a2a..11463b524 100644 --- a/src/app/clients/clients-view/address-tab/address-tab.component.ts +++ b/src/app/clients/clients-view/address-tab/address-tab.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component } from '@angular/core'; +import { Component, inject } from '@angular/core'; import { MatDialog } from '@angular/material/dialog'; import { ActivatedRoute } from '@angular/router'; import { FormfieldBase } from 'app/shared/form-dialog/formfield/model/formfield-base'; @@ -44,6 +44,11 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class AddressTabComponent { + private route = inject(ActivatedRoute); + private clientService = inject(ClientsService); + private dialog = inject(MatDialog); + private translateService = inject(TranslateService); + /** Client Address Data */ clientAddressData: any; /** Client Address Field Config */ @@ -59,12 +64,7 @@ export class AddressTabComponent { * @param {MatDialog} dialog Mat Dialog * @param {TranslateService} translateService Translate Service. */ - constructor( - private route: ActivatedRoute, - private clientService: ClientsService, - private dialog: MatDialog, - private translateService: TranslateService - ) { + constructor() { this.route.data.subscribe( (data: { clientAddressData: any; clientAddressFieldConfig: any; clientAddressTemplateData: any }) => { this.clientAddressData = data.clientAddressData; diff --git a/src/app/clients/clients-view/charges/charges-overview/charge-overview.resolver.ts b/src/app/clients/clients-view/charges/charges-overview/charge-overview.resolver.ts index 0d9e24324..89191c30c 100644 --- a/src/app/clients/clients-view/charges/charges-overview/charge-overview.resolver.ts +++ b/src/app/clients/clients-view/charges/charges-overview/charge-overview.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { ClientsService } from '../../../clients.service'; */ @Injectable() export class ClientChargeOverviewResolver { - /** - * @param {ClientsService} ClientsService Clients service. - */ - constructor(private clientsService: ClientsService) {} + private clientsService = inject(ClientsService); /** * Returns the Client Charge data. diff --git a/src/app/clients/clients-view/charges/charges-overview/charges-overview.component.ts b/src/app/clients/clients-view/charges/charges-overview/charges-overview.component.ts index cbc315f80..a32d7132e 100644 --- a/src/app/clients/clients-view/charges/charges-overview/charges-overview.component.ts +++ b/src/app/clients/clients-view/charges/charges-overview/charges-overview.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, ViewChild } from '@angular/core'; +import { Component, OnInit, ViewChild, inject } from '@angular/core'; import { MatDialog } from '@angular/material/dialog'; import { MatPaginator } from '@angular/material/paginator'; import { @@ -47,6 +47,9 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ChargesOverviewComponent implements OnInit { + private route = inject(ActivatedRoute); + dialog = inject(MatDialog); + /** Columns to be displayed in charge overview table. */ displayedColumns: string[] = [ 'name', @@ -69,10 +72,7 @@ export class ChargesOverviewComponent implements OnInit { * @param {ActivatedRoute} route Activated Route. * @param {MatDialog} dialog Dialog reference. */ - constructor( - private route: ActivatedRoute, - public dialog: MatDialog - ) { + constructor() { this.route.data.subscribe((data: { clientChargesData: any }) => { this.chargeOverviewData = data.clientChargesData; }); diff --git a/src/app/clients/clients-view/charges/client-pay-charges/client-pay-charges.component.html b/src/app/clients/clients-view/charges/client-pay-charges/client-pay-charges.component.html index 53beb39b2..863517db9 100644 --- a/src/app/clients/clients-view/charges/client-pay-charges/client-pay-charges.component.html +++ b/src/app/clients/clients-view/charges/client-pay-charges/client-pay-charges.component.html @@ -5,10 +5,12 @@ {{ 'labels.inputs.Amount' | translate }} - - {{ 'labels.inputs.Amount' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (transactionForm.controls.amount.hasError('required')) { + + {{ 'labels.inputs.Amount' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } @@ -22,10 +24,12 @@ /> - - {{ 'labels.inputs.Transaction date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (transactionForm.controls.transactionDate.hasError('required')) { + + {{ 'labels.inputs.Transaction date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } diff --git a/src/app/clients/clients-view/charges/client-pay-charges/client-pay-charges.component.ts b/src/app/clients/clients-view/charges/client-pay-charges/client-pay-charges.component.ts index 8589de642..a22ee7235 100644 --- a/src/app/clients/clients-view/charges/client-pay-charges/client-pay-charges.component.ts +++ b/src/app/clients/clients-view/charges/client-pay-charges/client-pay-charges.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormBuilder, Validators, ReactiveFormsModule } from '@angular/forms'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; @@ -21,6 +21,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ClientPayChargesComponent implements OnInit { + private clientsService = inject(ClientsService); + private formBuilder = inject(UntypedFormBuilder); + private route = inject(ActivatedRoute); + private router = inject(Router); + private dateUtils = inject(Dates); + private settingsService = inject(SettingsService); + /** Transaction Form. */ transactionForm: any; /** Transaction Data. */ @@ -36,14 +43,7 @@ export class ClientPayChargesComponent implements OnInit { * @param {Router} router Router for navigation. * @param {SettingsService} settingsService Setting service */ - constructor( - private clientsService: ClientsService, - private formBuilder: UntypedFormBuilder, - private route: ActivatedRoute, - private router: Router, - private dateUtils: Dates, - private settingsService: SettingsService - ) { + constructor() { this.route.data.subscribe((data: { transactionData: any }) => { this.transactionData = data.transactionData; }); diff --git a/src/app/clients/clients-view/charges/view-charge/view-charge.component.html b/src/app/clients/clients-view/charges/view-charge/view-charge.component.html index 46b36b430..eb8694960 100644 --- a/src/app/clients/clients-view/charges/view-charge/view-charge.component.html +++ b/src/app/clients/clients-view/charges/view-charge/view-charge.component.html @@ -74,51 +74,48 @@ {{ 'labels.heading.Transactions' | translate }} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    {{ 'labels.inputs.ID' | translate }}{{ element.id }}{{ 'labels.inputs.Office Name' | translate }} - {{ element.officeName }} - {{ 'labels.inputs.Type' | translate }} - {{ element.type.value }} - {{ 'labels.inputs.Transaction Date' | translate }} - {{ element.date | dateFormat }} - {{ 'labels.inputs.Amount' | translate }} - {{ element.amount | formatNumber }} - {{ 'labels.inputs.Actions' | translate }} - -
    + @if (chargeData.clientTransactionDatas) { + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {{ 'labels.inputs.ID' | translate }}{{ element.id }}{{ 'labels.inputs.Office Name' | translate }} + {{ element.officeName }} + {{ 'labels.inputs.Type' | translate }} + {{ element.type.value }} + {{ 'labels.inputs.Transaction Date' | translate }} + {{ element.date | dateFormat }} + {{ 'labels.inputs.Amount' | translate }} + {{ element.amount | formatNumber }} + {{ 'labels.inputs.Actions' | translate }} + +
    + } diff --git a/src/app/clients/clients-view/charges/view-charge/view-charge.component.ts b/src/app/clients/clients-view/charges/view-charge/view-charge.component.ts index 67313031b..6b546659f 100644 --- a/src/app/clients/clients-view/charges/view-charge/view-charge.component.ts +++ b/src/app/clients/clients-view/charges/view-charge/view-charge.component.ts @@ -1,10 +1,10 @@ /** Angular Imports */ -import { Component } from '@angular/core'; +import { Component, inject } from '@angular/core'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; import { ClientsService } from 'app/clients/clients.service'; import { FaIconComponent } from '@fortawesome/angular-fontawesome'; import { MatCard, MatCardTitle, MatCardContent, MatCardActions } from '@angular/material/card'; -import { NgClass, NgIf } from '@angular/common'; +import { NgClass } from '@angular/common'; import { MatDivider } from '@angular/material/divider'; import { MatTable, @@ -52,6 +52,10 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ViewChargeComponent { + private route = inject(ActivatedRoute); + private router = inject(Router); + private clientService = inject(ClientsService); + /** Charge Data. */ chargeData: any; /** Mat Table Column defs. */ @@ -69,11 +73,7 @@ export class ViewChargeComponent { * @param {ActivatedRoute} route Activated Route. * @param {Router} router Router for navigation. */ - constructor( - private route: ActivatedRoute, - private router: Router, - private clientService: ClientsService - ) { + constructor() { this.route.data.subscribe((data: { clientChargeData: any }) => { this.chargeData = data.clientChargeData; }); diff --git a/src/app/clients/clients-view/client-actions/accept-client-transfer/accept-client-transfer.component.ts b/src/app/clients/clients-view/client-actions/accept-client-transfer/accept-client-transfer.component.ts index 366cf431f..c2b3141a6 100644 --- a/src/app/clients/clients-view/client-actions/accept-client-transfer/accept-client-transfer.component.ts +++ b/src/app/clients/clients-view/client-actions/accept-client-transfer/accept-client-transfer.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, ReactiveFormsModule } from '@angular/forms'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; @@ -23,6 +23,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class AcceptClientTransferComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private clientsService = inject(ClientsService); + private settingsService = inject(SettingsService); + private dateUtils = inject(Dates); + private route = inject(ActivatedRoute); + private router = inject(Router); + /** Accept Client Transfer form. */ acceptClientTransferForm: UntypedFormGroup; /** Client Id */ @@ -38,14 +45,7 @@ export class AcceptClientTransferComponent implements OnInit { * @param {ActivatedRoute} route Activated Route * @param {Router} router Router */ - constructor( - private formBuilder: UntypedFormBuilder, - private clientsService: ClientsService, - private settingsService: SettingsService, - private dateUtils: Dates, - private route: ActivatedRoute, - private router: Router - ) { + constructor() { this.route.data.subscribe((data: { clientActionData: any }) => { this.transferDate = data.clientActionData; }); diff --git a/src/app/clients/clients-view/client-actions/activate-client/activate-client.component.html b/src/app/clients/clients-view/client-actions/activate-client/activate-client.component.html index 218cc3229..ab294299a 100644 --- a/src/app/clients/clients-view/client-actions/activate-client/activate-client.component.html +++ b/src/app/clients/clients-view/client-actions/activate-client/activate-client.component.html @@ -14,10 +14,12 @@ /> - - {{ 'labels.inputs.Activated On Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (activateClientForm.controls.activationDate.hasError('required')) { + + {{ 'labels.inputs.Activated On Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } diff --git a/src/app/clients/clients-view/client-actions/activate-client/activate-client.component.ts b/src/app/clients/clients-view/client-actions/activate-client/activate-client.component.ts index eb7e6e875..d9721f7f2 100644 --- a/src/app/clients/clients-view/client-actions/activate-client/activate-client.component.ts +++ b/src/app/clients/clients-view/client-actions/activate-client/activate-client.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, Validators, ReactiveFormsModule } from '@angular/forms'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; @@ -21,6 +21,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ActivateClientComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private clientsService = inject(ClientsService); + private dateUtils = inject(Dates); + private route = inject(ActivatedRoute); + private router = inject(Router); + private settingsService = inject(SettingsService); + /** Minimum date allowed. */ minDate = new Date(2000, 0, 1); /** Maximum date allowed. */ @@ -38,14 +45,7 @@ export class ActivateClientComponent implements OnInit { * @param {Router} router Router * @param {SettingsService} settingsService Settings Service */ - constructor( - private formBuilder: UntypedFormBuilder, - private clientsService: ClientsService, - private dateUtils: Dates, - private route: ActivatedRoute, - private router: Router, - private settingsService: SettingsService - ) { + constructor() { this.clientId = this.route.parent.snapshot.params['clientId']; } diff --git a/src/app/clients/clients-view/client-actions/add-client-charge/add-client-charge.component.html b/src/app/clients/clients-view/client-actions/add-client-charge/add-client-charge.component.html index 50e46999c..571120ff2 100644 --- a/src/app/clients/clients-view/client-actions/add-client-charge/add-client-charge.component.html +++ b/src/app/clients/clients-view/client-actions/add-client-charge/add-client-charge.component.html @@ -6,88 +6,102 @@ {{ 'labels.inputs.Charge' | translate }} - - {{ clientCharge.name + ' (' + clientCharge.currency.name + ')' }} - + @for (clientCharge of clientChargeOptions; track clientCharge) { + + {{ clientCharge.name + ' (' + clientCharge.currency.name + ')' }} + + } - - {{ 'labels.inputs.Charge' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (clientChargeForm.controls.chargeId.hasError('required')) { + + {{ 'labels.inputs.Charge' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } -
    - - {{ 'labels.inputs.Amount' | translate }} - - - {{ 'labels.inputs.Amount' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - - - {{ 'labels.inputs.Charge Calculation' | translate }} - - - {{ chargeCalculation.value }} - - - - - - {{ 'labels.inputs.Charge time type' | translate }} - - - {{ chargeTime.value }} - - - - - - {{ 'labels.inputs.Due for collection on' | translate }} - - - - - {{ 'labels.inputs.Due for collection on' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - - - {{ 'labels.inputs.Due On' | translate }} - - - - - {{ 'labels.inputs.Due Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - - - {{ 'labels.inputs.Repeats Every' | translate }} - - -
    + @if (chargeDetails) { +
    + + {{ 'labels.inputs.Amount' | translate }} + + @if (clientChargeForm.controls.amount.hasError('required')) { + + {{ 'labels.inputs.Amount' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + + {{ 'labels.inputs.Charge Calculation' | translate }} + + @for (chargeCalculation of chargeDetails.chargeCalculationTypeOptions; track chargeCalculation) { + + {{ chargeCalculation.value }} + + } + + + + {{ 'labels.inputs.Charge time type' | translate }} + + @for (chargeTime of chargeDetails.chargeTimeTypeOptions; track chargeTime) { + + {{ chargeTime.value }} + + } + + + @if (clientChargeForm.contains('dueDate')) { + + {{ 'labels.inputs.Due for collection on' | translate }} + + + + @if (clientChargeForm.controls.dueDate.hasError('required')) { + + {{ 'labels.inputs.Due for collection on' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + } + @if (clientChargeForm.contains('feeOnMonthDay')) { + + {{ 'labels.inputs.Due On' | translate }} + + + + @if (clientChargeForm.controls.feeOnMonthDay.hasError('required')) { + + {{ 'labels.inputs.Due Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + } + @if (clientChargeForm.contains('feeInterval')) { + + {{ 'labels.inputs.Repeats Every' | translate }} + + + } +
    + } diff --git a/src/app/clients/clients-view/client-actions/add-client-charge/add-client-charge.component.ts b/src/app/clients/clients-view/client-actions/add-client-charge/add-client-charge.component.ts index 94d8f29d8..ca89ef23c 100644 --- a/src/app/clients/clients-view/client-actions/add-client-charge/add-client-charge.component.ts +++ b/src/app/clients/clients-view/client-actions/add-client-charge/add-client-charge.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, @@ -27,6 +27,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class AddClientChargeComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private route = inject(ActivatedRoute); + private router = inject(Router); + private dateUtils = inject(Dates); + private clientsService = inject(ClientsService); + private settingsService = inject(SettingsService); + /** Minimum Due Date allowed. */ minDate = new Date(2000, 0, 1); /** Maximum Due Date allowed. */ @@ -49,14 +56,7 @@ export class AddClientChargeComponent implements OnInit { * @param {ClientsService} clientsService Clients Service * @param {SettingsService} settingsService Setting service */ - constructor( - private formBuilder: UntypedFormBuilder, - private route: ActivatedRoute, - private router: Router, - private dateUtils: Dates, - private clientsService: ClientsService, - private settingsService: SettingsService - ) { + constructor() { this.route.data.subscribe((data: { clientActionData: any }) => { this.clientChargeOptions = data.clientActionData.chargeOptions; }); diff --git a/src/app/clients/clients-view/client-actions/add-client-collateral/add-client-collateral.component.html b/src/app/clients/clients-view/client-actions/add-client-collateral/add-client-collateral.component.html index 99551cf09..c9e1a8729 100644 --- a/src/app/clients/clients-view/client-actions/add-client-collateral/add-client-collateral.component.html +++ b/src/app/clients/clients-view/client-actions/add-client-collateral/add-client-collateral.component.html @@ -6,61 +6,62 @@ {{ 'labels.inputs.Collateral' | translate }} - - {{ clientCollateral.name }} - + @for (clientCollateral of clientCollateralOptions; track clientCollateral) { + + {{ clientCollateral.name }} + + } - - {{ 'labels.inputs.Collateral' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - -
    - - {{ 'labels.inputs.name' | translate }} - - - - - {{ 'labels.inputs.Type/Quality' | translate }} - - - - - {{ 'labels.inputs.Unit Type' | translate }} - - - - - {{ 'labels.inputs.Base Price' | translate }} - - - - - {{ 'labels.inputs.Percentage To Base' | translate }} - - - - - {{ 'labels.inputs.Quantity' | translate }} - - - {{ 'labels.inputs.Quantity' | translate }} {{ 'labels.commons.is' | translate }} + @if (clientCollateralForm.controls.collateralId.hasError('required')) { + + {{ 'labels.inputs.Collateral' | translate }} {{ 'labels.commons.is' | translate }} {{ 'labels.commons.required' | translate }} - + } + - - {{ 'labels.inputs.Total' | translate }} - - - - - {{ 'labels.inputs.Total Collateral Value' | translate }} - - -
    + @if (collateralDetails) { +
    + + {{ 'labels.inputs.name' | translate }} + + + + {{ 'labels.inputs.Type/Quality' | translate }} + + + + {{ 'labels.inputs.Unit Type' | translate }} + + + + {{ 'labels.inputs.Base Price' | translate }} + + + + {{ 'labels.inputs.Percentage To Base' | translate }} + + + + {{ 'labels.inputs.Quantity' | translate }} + + @if (clientCollateralForm.controls.quantity.hasError('required')) { + + {{ 'labels.inputs.Quantity' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + + {{ 'labels.inputs.Total' | translate }} + + + + {{ 'labels.inputs.Total Collateral Value' | translate }} + + +
    + } diff --git a/src/app/clients/clients-view/client-actions/add-client-collateral/add-client-collateral.component.ts b/src/app/clients/clients-view/client-actions/add-client-collateral/add-client-collateral.component.ts index c008b5e63..7bdaab16e 100644 --- a/src/app/clients/clients-view/client-actions/add-client-collateral/add-client-collateral.component.ts +++ b/src/app/clients/clients-view/client-actions/add-client-collateral/add-client-collateral.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormBuilder, UntypedFormGroup, Validators, ReactiveFormsModule } from '@angular/forms'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; @@ -20,6 +20,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class AddClientCollateralComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private route = inject(ActivatedRoute); + private router = inject(Router); + private productsService = inject(ProductsService); + private clientsService = inject(ClientsService); + private settingsService = inject(SettingsService); + /** Client Collateral Form */ clientCollateralForm: UntypedFormGroup; /** Client Collateral Options */ @@ -36,14 +43,7 @@ export class AddClientCollateralComponent implements OnInit { * @param {Router} router Router. * @param {ProductsService} productsService Products Service */ - constructor( - private formBuilder: UntypedFormBuilder, - private route: ActivatedRoute, - private router: Router, - private productsService: ProductsService, - private clientsService: ClientsService, - private settingsService: SettingsService - ) { + constructor() { this.route.data.subscribe((data: { clientActionData: any }) => { this.clientCollateralOptions = data.clientActionData; }); diff --git a/src/app/clients/clients-view/client-actions/client-actions.component.html b/src/app/clients/clients-view/client-actions/client-actions.component.html index 4b04874d6..d9b42fd9e 100644 --- a/src/app/clients/clients-view/client-actions/client-actions.component.html +++ b/src/app/clients/clients-view/client-actions/client-actions.component.html @@ -1,17 +1,51 @@ - - - - - - - - - - - - - - - - - +@if (actions['Assign Staff']) { + +} +@if (actions['Close']) { + +} +@if (actions['Survey']) { + +} +@if (actions['Reject']) { + +} +@if (actions['Activate']) { + +} +@if (actions['Withdraw']) { + +} +@if (actions['Update Default Savings']) { + +} +@if (actions['Transfer Client']) { + +} +@if (actions['Undo Transfer']) { + +} +@if (actions['Reject Transfer']) { + +} +@if (actions['Accept Transfer']) { + +} +@if (actions['Reactivate']) { + +} +@if (actions['Undo Rejection']) { + +} +@if (actions['Add Charge']) { + +} +@if (actions['Take Survey']) { + +} +@if (actions['Client Screen Reports']) { + +} +@if (actions['Create Collateral']) { + +} diff --git a/src/app/clients/clients-view/client-actions/client-actions.component.ts b/src/app/clients/clients-view/client-actions/client-actions.component.ts index b397bf3ec..11b00b31b 100644 --- a/src/app/clients/clients-view/client-actions/client-actions.component.ts +++ b/src/app/clients/clients-view/client-actions/client-actions.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component } from '@angular/core'; +import { Component, inject } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; import { ClientAssignStaffComponent } from './client-assign-staff/client-assign-staff.component'; import { CloseClientComponent } from './close-client/close-client.component'; @@ -49,6 +49,9 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ClientActionsComponent { + private route = inject(ActivatedRoute); + private router = inject(Router); + /** Flag object to store possible actions and render appropriate UI to the user */ actions: { 'Assign Staff': boolean; @@ -92,10 +95,7 @@ export class ClientActionsComponent { * @param {ActivatedRoute} route Activated Route * @param {Router} router Router */ - constructor( - private route: ActivatedRoute, - private router: Router - ) { + constructor() { this.router.routeReuseStrategy.shouldReuseRoute = () => false; const name = this.route.snapshot.params['name'] as keyof typeof this.actions; this.actions[name] = true; diff --git a/src/app/clients/clients-view/client-actions/client-assign-staff/client-assign-staff.component.html b/src/app/clients/clients-view/client-actions/client-assign-staff/client-assign-staff.component.html index 62885d130..ee4e518d1 100644 --- a/src/app/clients/clients-view/client-actions/client-assign-staff/client-assign-staff.component.html +++ b/src/app/clients/clients-view/client-actions/client-assign-staff/client-assign-staff.component.html @@ -6,14 +6,18 @@ {{ 'labels.inputs.Staff' | translate }} - - {{ staff.displayName }} - + @for (staff of staffData; track staff) { + + {{ staff.displayName }} + + } - - {{ 'labels.inputs.Staff' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (clientAssignStaffForm.controls.staffId.hasError('required')) { + + {{ 'labels.inputs.Staff' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } diff --git a/src/app/clients/clients-view/client-actions/client-assign-staff/client-assign-staff.component.ts b/src/app/clients/clients-view/client-actions/client-assign-staff/client-assign-staff.component.ts index c2a917972..939abbeb5 100644 --- a/src/app/clients/clients-view/client-actions/client-assign-staff/client-assign-staff.component.ts +++ b/src/app/clients/clients-view/client-actions/client-assign-staff/client-assign-staff.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, ReactiveFormsModule } from '@angular/forms'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; @@ -19,6 +19,11 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ClientAssignStaffComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private clientsService = inject(ClientsService); + private route = inject(ActivatedRoute); + private router = inject(Router); + /** Client Assign Staff form. */ clientAssignStaffForm: UntypedFormGroup; /** Staff Data */ @@ -33,12 +38,7 @@ export class ClientAssignStaffComponent implements OnInit { * @param {ActivatedRoute} route Activated Route * @param {Router} router Router */ - constructor( - private formBuilder: UntypedFormBuilder, - private clientsService: ClientsService, - private route: ActivatedRoute, - private router: Router - ) { + constructor() { this.route.data.subscribe((data: { clientActionData: any }) => { this.clientData = data.clientActionData; }); diff --git a/src/app/clients/clients-view/client-actions/client-screen-reports/client-screen-reports.component.html b/src/app/clients/clients-view/client-actions/client-screen-reports/client-screen-reports.component.html index ab9c1a6cc..84058bc97 100644 --- a/src/app/clients/clients-view/client-actions/client-screen-reports/client-screen-reports.component.html +++ b/src/app/clients/clients-view/client-actions/client-screen-reports/client-screen-reports.component.html @@ -6,14 +6,18 @@ {{ 'labels.inputs.Client Screen Reports' | translate }} - - {{ template.name }} - + @for (template of templatesData; track template) { + + {{ template.name }} + + } - - {{ 'labels.inputs.Screen Report' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (clientScreenReportForm.controls.templateId.hasError('required')) { + + {{ 'labels.inputs.Screen Report' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } diff --git a/src/app/clients/clients-view/client-actions/client-screen-reports/client-screen-reports.component.ts b/src/app/clients/clients-view/client-actions/client-screen-reports/client-screen-reports.component.ts index 2d3dc1fb4..675e456b5 100644 --- a/src/app/clients/clients-view/client-actions/client-screen-reports/client-screen-reports.component.ts +++ b/src/app/clients/clients-view/client-actions/client-screen-reports/client-screen-reports.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, Renderer2, ViewChild, ElementRef, SecurityContext } from '@angular/core'; +import { Component, OnInit, Renderer2, ViewChild, ElementRef, SecurityContext, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, ReactiveFormsModule } from '@angular/forms'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; @@ -22,6 +22,12 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ClientScreenReportsComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private clientsService = inject(ClientsService); + private route = inject(ActivatedRoute); + private sanitizer = inject(DomSanitizer); + private renderer = inject(Renderer2); + /** Client Screen Reportform. */ clientScreenReportForm: UntypedFormGroup; /** Templates Data */ @@ -42,13 +48,7 @@ export class ClientScreenReportsComponent implements OnInit { * @param {DomSanitizer} sanitizer DOM Sanitizer * @param {Renderer2} renderer Renderer 2 */ - constructor( - private formBuilder: UntypedFormBuilder, - private clientsService: ClientsService, - private route: ActivatedRoute, - private sanitizer: DomSanitizer, - private renderer: Renderer2 - ) { + constructor() { this.route.data.subscribe((data: { clientActionData: any }) => { this.templatesData = data.clientActionData; }); diff --git a/src/app/clients/clients-view/client-actions/close-client/close-client.component.html b/src/app/clients/clients-view/client-actions/close-client/close-client.component.html index 98590f909..a89964062 100644 --- a/src/app/clients/clients-view/client-actions/close-client/close-client.component.html +++ b/src/app/clients/clients-view/client-actions/close-client/close-client.component.html @@ -15,23 +15,29 @@ /> - - {{ 'labels.inputs.Closed On Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (closeClientForm.controls.closureDate.hasError('required')) { + + {{ 'labels.inputs.Closed On Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Closure Reason' | translate }} - - {{ reason.name }} - + @for (reason of closureData; track reason) { + + {{ reason.name }} + + } - - {{ 'labels.inputs.Closure Reason' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (closeClientForm.controls.closureReasonId.hasError('required')) { + + {{ 'labels.inputs.Closure Reason' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } diff --git a/src/app/clients/clients-view/client-actions/close-client/close-client.component.ts b/src/app/clients/clients-view/client-actions/close-client/close-client.component.ts index 7b6c74437..a0040401a 100644 --- a/src/app/clients/clients-view/client-actions/close-client/close-client.component.ts +++ b/src/app/clients/clients-view/client-actions/close-client/close-client.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, Validators, ReactiveFormsModule } from '@angular/forms'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; @@ -21,6 +21,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class CloseClientComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private clientsService = inject(ClientsService); + private dateUtils = inject(Dates); + private route = inject(ActivatedRoute); + private router = inject(Router); + private settingsService = inject(SettingsService); + /** Minimum date allowed. */ minDate = new Date(2000, 0, 1); /** Maximum date allowed. */ @@ -40,14 +47,7 @@ export class CloseClientComponent implements OnInit { * @param {Router} router Router * @param {SettingsService} settingsService Setting service */ - constructor( - private formBuilder: UntypedFormBuilder, - private clientsService: ClientsService, - private dateUtils: Dates, - private route: ActivatedRoute, - private router: Router, - private settingsService: SettingsService - ) { + constructor() { this.route.data.subscribe((data: { clientActionData: any }) => { this.closureData = data.clientActionData.narrations; }); diff --git a/src/app/clients/clients-view/client-actions/reactivate-client/reactivate-client.component.html b/src/app/clients/clients-view/client-actions/reactivate-client/reactivate-client.component.html index 2c4efd633..c40ee0bf1 100644 --- a/src/app/clients/clients-view/client-actions/reactivate-client/reactivate-client.component.html +++ b/src/app/clients/clients-view/client-actions/reactivate-client/reactivate-client.component.html @@ -14,10 +14,12 @@ /> - - {{ 'labels.inputs.Reactivation Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (reactivateClientForm.controls.reactivationDate.hasError('required')) { + + {{ 'labels.inputs.Reactivation Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } diff --git a/src/app/clients/clients-view/client-actions/reactivate-client/reactivate-client.component.ts b/src/app/clients/clients-view/client-actions/reactivate-client/reactivate-client.component.ts index 096730339..f179f2514 100644 --- a/src/app/clients/clients-view/client-actions/reactivate-client/reactivate-client.component.ts +++ b/src/app/clients/clients-view/client-actions/reactivate-client/reactivate-client.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, Validators, ReactiveFormsModule } from '@angular/forms'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; @@ -21,6 +21,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ReactivateClientComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private clientsService = inject(ClientsService); + private dateUtils = inject(Dates); + private route = inject(ActivatedRoute); + private router = inject(Router); + private settingsService = inject(SettingsService); + /** Minimum date allowed. */ minDate = new Date(2000, 0, 1); /** Maximum date allowed. */ @@ -38,14 +45,7 @@ export class ReactivateClientComponent implements OnInit { * @param {Router} router Router * @param {SettingsService} settingsService Setting service */ - constructor( - private formBuilder: UntypedFormBuilder, - private clientsService: ClientsService, - private dateUtils: Dates, - private route: ActivatedRoute, - private router: Router, - private settingsService: SettingsService - ) { + constructor() { this.clientId = this.route.parent.snapshot.params['clientId']; } diff --git a/src/app/clients/clients-view/client-actions/reject-client-transfer/reject-client-transfer.component.ts b/src/app/clients/clients-view/client-actions/reject-client-transfer/reject-client-transfer.component.ts index eaa9d0214..bcaf554c7 100644 --- a/src/app/clients/clients-view/client-actions/reject-client-transfer/reject-client-transfer.component.ts +++ b/src/app/clients/clients-view/client-actions/reject-client-transfer/reject-client-transfer.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, ReactiveFormsModule } from '@angular/forms'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; @@ -23,6 +23,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class RejectClientTransferComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private clientsService = inject(ClientsService); + private settingsService = inject(SettingsService); + private dateUtils = inject(Dates); + private route = inject(ActivatedRoute); + private router = inject(Router); + /** Reject Client Transfer form. */ rejectClientTransferForm: UntypedFormGroup; /** Client Id */ @@ -36,14 +43,7 @@ export class RejectClientTransferComponent implements OnInit { * @param {ActivatedRoute} route Activated Route * @param {Router} router Router */ - constructor( - private formBuilder: UntypedFormBuilder, - private clientsService: ClientsService, - private settingsService: SettingsService, - private dateUtils: Dates, - private route: ActivatedRoute, - private router: Router - ) { + constructor() { this.route.data.subscribe((data: { clientActionData: any }) => { this.transferDate = data.clientActionData; }); diff --git a/src/app/clients/clients-view/client-actions/reject-client/reject-client.component.html b/src/app/clients/clients-view/client-actions/reject-client/reject-client.component.html index 71d989cc3..294c66a45 100644 --- a/src/app/clients/clients-view/client-actions/reject-client/reject-client.component.html +++ b/src/app/clients/clients-view/client-actions/reject-client/reject-client.component.html @@ -15,23 +15,29 @@ /> - - {{ 'labels.inputs.Rejection Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (rejectClientForm.controls.rejectionDate.hasError('required')) { + + {{ 'labels.inputs.Rejection Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Rejection Reason' | translate }} - - {{ reason.name }} - + @for (reason of rejectionData; track reason) { + + {{ reason.name }} + + } - - {{ 'labels.inputs.Rejection Reason' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (rejectClientForm.controls.rejectionReasonId.hasError('required')) { + + {{ 'labels.inputs.Rejection Reason' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } diff --git a/src/app/clients/clients-view/client-actions/reject-client/reject-client.component.ts b/src/app/clients/clients-view/client-actions/reject-client/reject-client.component.ts index 9c8ef234e..17987c0cb 100644 --- a/src/app/clients/clients-view/client-actions/reject-client/reject-client.component.ts +++ b/src/app/clients/clients-view/client-actions/reject-client/reject-client.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, Validators, ReactiveFormsModule } from '@angular/forms'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; @@ -21,6 +21,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class RejectClientComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private clientsService = inject(ClientsService); + private dateUtils = inject(Dates); + private route = inject(ActivatedRoute); + private router = inject(Router); + private settingsService = inject(SettingsService); + /** Minimum date allowed. */ minDate = new Date(2000, 0, 1); /** Maximum date allowed. */ @@ -40,14 +47,7 @@ export class RejectClientComponent implements OnInit { * @param {Router} router Router * @param {SettingsService} settingsService Setting service */ - constructor( - private formBuilder: UntypedFormBuilder, - private clientsService: ClientsService, - private dateUtils: Dates, - private route: ActivatedRoute, - private router: Router, - private settingsService: SettingsService - ) { + constructor() { this.route.data.subscribe((data: { clientActionData: any }) => { this.rejectionData = data.clientActionData.narrations; }); diff --git a/src/app/clients/clients-view/client-actions/take-survey/take-survey.component.html b/src/app/clients/clients-view/client-actions/take-survey/take-survey.component.html index 62513e075..d9248cbd0 100644 --- a/src/app/clients/clients-view/client-actions/take-survey/take-survey.component.html +++ b/src/app/clients/clients-view/client-actions/take-survey/take-survey.component.html @@ -3,42 +3,41 @@
    {{ 'labels.inputs.Survey Name' | translate }} - - {{ surveyData.name }} - + @for (surveyData of allSurveyData; track surveyData) { + + {{ surveyData.name }} + + }

    - -

    component[0].componentKey

    - + @for (component of componentGroups; track component) { + @if (component[0].componentKey) { +

    component[0].componentKey

    + }
    - + @for (question of component; track question) {
    {{ question.text }} - - - - {{ options.text }} - - + @for (options of question.responseDatas; track options) { + + + {{ options.text }} + + + }
    - -
    - {{ 'labels.text.Your answer is' | translate }}: {{ question.answer.text }} -
    -
    + @if (question.answer) { +
    {{ 'labels.text.Your answer is' | translate }}: {{ question.answer.text }}
    + } + }
    -
    + }
    - +
    - - + + +} + +
    + @if (isCollapsed) { +
    + +
    + +
    + @if (loansDataSource) { +

    {{ 'labels.heading.Due Collections' | translate }}

    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + {{ 'labels.inputs.Loan Account' | translate }} # + {{ loan.accountId }}{{ 'labels.inputs.Product Name' | translate }}{{ loan.productShortName }}({{ loan.productId }}){{ 'labels.inputs.Client Name' | translate }}{{ loan.clientName }}({{ loan.clientId }}){{ 'labels.inputs.Total Due' | translate }}{{ loan.totalDue }}{{ 'labels.inputs.Charges' | translate }}{{ loan.feeDue }}{{ 'labels.inputs.Actions' | translate }} + +
    + + } + @if (savingsDataSource) { +

    {{ 'labels.inputs.Due Savings Collections' | translate }}

    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + {{ 'labels.inputs.Deposit Account' | translate }} + {{ saving.depositAccountType }} + {{ 'labels.inputs.Savings Account' | translate }} # + {{ saving.accountId }}{{ 'labels.inputs.Product Name' | translate }}{{ saving.productName }}({{ saving.productId }}){{ 'labels.inputs.Client Name' | translate }}{{ saving.clientName }}({{ saving.clientId }}){{ 'labels.inputs.Total Due' | translate }}{{ saving.dueAmount }}{{ 'labels.inputs.Actions' | translate }} + +
    + + } + + + + +
    +
    + }
    diff --git a/src/app/collections/individual-collection-sheet/individual-collection-sheet.component.ts b/src/app/collections/individual-collection-sheet/individual-collection-sheet.component.ts index 7f06268af..855d4bcc0 100644 --- a/src/app/collections/individual-collection-sheet/individual-collection-sheet.component.ts +++ b/src/app/collections/individual-collection-sheet/individual-collection-sheet.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, ViewChild } from '@angular/core'; +import { Component, OnInit, ViewChild, inject } from '@angular/core'; import { MatDialog } from '@angular/material/dialog'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort, MatSortHeader } from '@angular/material/sort'; @@ -63,6 +63,15 @@ import { OrganizationService } from 'app/organization/organization.service'; ] }) export class IndividualCollectionSheetComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private collectionsService = inject(CollectionsService); + private organizationService = inject(OrganizationService); + private route = inject(ActivatedRoute); + private dateUtils = inject(Dates); + dialog = inject(MatDialog); + private router = inject(Router); + private settingsService = inject(SettingsService); + /** Offices Data */ officesData: any; /** Loan Officer Data */ @@ -134,16 +143,7 @@ export class IndividualCollectionSheetComponent implements OnInit { * @param {Router} router Router for navigation. * @param {SettingsService} settingsService Settings Service */ - constructor( - private formBuilder: UntypedFormBuilder, - private collectionsService: CollectionsService, - private organizationService: OrganizationService, - private route: ActivatedRoute, - private dateUtils: Dates, - public dialog: MatDialog, - private router: Router, - private settingsService: SettingsService - ) { + constructor() { this.route.data.subscribe((data: { officesData: any }) => { this.officesData = data.officesData; }); @@ -285,7 +285,6 @@ export class IndividualCollectionSheetComponent implements OnInit { type: 'number', required: false }) - ]; const data = { title: `Payment for ${type === 'loans' ? 'Loan' : 'Saving'} Id ${type === 'loans' ? selectedData.loanId : selectedData.savingsId}`, diff --git a/src/app/configuration-wizard/completion-dialog/completion-dialog.component.ts b/src/app/configuration-wizard/completion-dialog/completion-dialog.component.ts index 54e4e16b2..a797e710f 100644 --- a/src/app/configuration-wizard/completion-dialog/completion-dialog.component.ts +++ b/src/app/configuration-wizard/completion-dialog/completion-dialog.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, Inject } from '@angular/core'; +import { Component, inject } from '@angular/core'; import { MatDialogRef, MAT_DIALOG_DATA, @@ -30,8 +30,6 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class CompletionDialogComponent { - constructor( - public dialogRef: MatDialogRef, - @Inject(MAT_DIALOG_DATA) public data: any - ) {} + dialogRef = inject>(MatDialogRef); + data = inject(MAT_DIALOG_DATA); } diff --git a/src/app/configuration-wizard/configuration-wizard.component.ts b/src/app/configuration-wizard/configuration-wizard.component.ts index 5c40fd5ac..89dce0391 100644 --- a/src/app/configuration-wizard/configuration-wizard.component.ts +++ b/src/app/configuration-wizard/configuration-wizard.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, Inject } from '@angular/core'; +import { Component, inject } from '@angular/core'; import { MatDialogRef, MAT_DIALOG_DATA, @@ -31,12 +31,8 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ConfigurationWizardComponent { + dialogRef = inject>(MatDialogRef); + data = inject(MAT_DIALOG_DATA); + show: number; - /** - * @param {MatDialogRef} dialogRef MatDialogRef. - */ - constructor( - public dialogRef: MatDialogRef, - @Inject(MAT_DIALOG_DATA) public data: any - ) {} } diff --git a/src/app/configuration-wizard/continue-setup-dialog/continue-setup-dialog.component.ts b/src/app/configuration-wizard/continue-setup-dialog/continue-setup-dialog.component.ts index 6470d917e..6fb693275 100644 --- a/src/app/configuration-wizard/continue-setup-dialog/continue-setup-dialog.component.ts +++ b/src/app/configuration-wizard/continue-setup-dialog/continue-setup-dialog.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, Inject } from '@angular/core'; +import { Component, inject } from '@angular/core'; import { MatDialogRef, MAT_DIALOG_DATA, @@ -28,16 +28,18 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ContinueSetupDialogComponent { + dialogRef = inject>(MatDialogRef); + data = inject(MAT_DIALOG_DATA); + /* Current Step Name*/ stepName: number; /** * @param {MatDialogRef} dialogRef MatDialogRef. */ - constructor( - public dialogRef: MatDialogRef, - @Inject(MAT_DIALOG_DATA) public data: any - ) { + constructor() { + const data = this.data; + this.stepName = data.stepName; } } diff --git a/src/app/configuration-wizard/next-step-dialog/next-step-dialog.component.ts b/src/app/configuration-wizard/next-step-dialog/next-step-dialog.component.ts index 6776b6985..f3455ae99 100644 --- a/src/app/configuration-wizard/next-step-dialog/next-step-dialog.component.ts +++ b/src/app/configuration-wizard/next-step-dialog/next-step-dialog.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, Inject } from '@angular/core'; +import { Component, inject } from '@angular/core'; import { MatDialogRef, MAT_DIALOG_DATA, @@ -30,6 +30,9 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class NextStepDialogComponent { + dialogRef = inject>(MatDialogRef); + data = inject(MAT_DIALOG_DATA); + /* Step Percentage */ stepPercentage: number; /* Next Step Name */ @@ -40,10 +43,9 @@ export class NextStepDialogComponent { /** * @param {MatDialogRef} dialogRef MatDialogRef. */ - constructor( - public dialogRef: MatDialogRef, - @Inject(MAT_DIALOG_DATA) public data: any - ) { + constructor() { + const data = this.data; + this.stepPercentage = data.stepPercentage; this.nextStepName = data.nextStepName; this.previousStepName = data.previousStepName; diff --git a/src/app/configuration-wizard/popover/popover-arrow.directive.ts b/src/app/configuration-wizard/popover/popover-arrow.directive.ts index 59761a51a..d537dd6f0 100644 --- a/src/app/configuration-wizard/popover/popover-arrow.directive.ts +++ b/src/app/configuration-wizard/popover/popover-arrow.directive.ts @@ -1,5 +1,5 @@ /* Angular Imports */ -import { Directive, Renderer2, ElementRef, HostBinding, ChangeDetectorRef, OnDestroy } from '@angular/core'; +import { Directive, Renderer2, ElementRef, HostBinding, ChangeDetectorRef, OnDestroy, inject } from '@angular/core'; /* rxjs Imports */ import { Subscription } from 'rxjs'; @@ -13,6 +13,9 @@ import { PopoverRef } from './popover-ref'; */ @Directive({ selector: '[mifosxPopoverArrow]' }) export class PopoverArrowDirective implements OnDestroy { + private popoverRef = inject(PopoverRef); + private cd = inject(ChangeDetectorRef); + @HostBinding('style.width.px') @HostBinding('style.height.px') arrowSize: number; @@ -35,10 +38,9 @@ export class PopoverArrowDirective implements OnDestroy { * @param {PopoverRef} popoverRef PopoverRef. * @param {ChangeDetectorRef} cd ChangeDetectorRef */ - constructor( - private popoverRef: PopoverRef, - private cd: ChangeDetectorRef - ) { + constructor() { + const popoverRef = this.popoverRef; + this.arrowSize = popoverRef.config.arrowSize; this.subscription = popoverRef.positionChanges().subscribe((p) => { diff --git a/src/app/configuration-wizard/popover/popover-close.directive.ts b/src/app/configuration-wizard/popover/popover-close.directive.ts index 5247b6dc2..e3e475614 100644 --- a/src/app/configuration-wizard/popover/popover-close.directive.ts +++ b/src/app/configuration-wizard/popover/popover-close.directive.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Directive, HostListener, Input, Optional } from '@angular/core'; +import { Directive, HostListener, Input, inject } from '@angular/core'; /** Popover Ref */ import { PopoverRef } from './popover-ref'; @@ -9,12 +9,9 @@ import { PopoverRef } from './popover-ref'; */ @Directive({ selector: '[mifosxPopoverClose]' }) export class PopoverCloseDirective { - @Input('mifosxPopoverClose') popoverResult: T; + private popoverRef = inject>(PopoverRef, { optional: true }); - /** - * @param {PopoverRef} popoverRef PopoverRef. - */ - constructor(@Optional() private popoverRef: PopoverRef) {} + @Input('mifosxPopoverClose') popoverResult: T; @HostListener('click') onClick(): void { if (!this.popoverRef) { diff --git a/src/app/configuration-wizard/popover/popover.service.ts b/src/app/configuration-wizard/popover/popover.service.ts index 1426a57d1..09b3a5c7c 100644 --- a/src/app/configuration-wizard/popover/popover.service.ts +++ b/src/app/configuration-wizard/popover/popover.service.ts @@ -7,7 +7,7 @@ import { ConnectionPositionPair } from '@angular/cdk/overlay'; import { ComponentPortal, TemplatePortal } from '@angular/cdk/portal'; -import { Injectable, InjectionToken, Injector, TemplateRef, ElementRef } from '@angular/core'; +import { Injectable, InjectionToken, Injector, TemplateRef, ElementRef, inject } from '@angular/core'; /* Custom Imports */ import { PopoverConfig } from './popover-config'; @@ -35,14 +35,8 @@ const defaultConfig: PopoverConfig = { providedIn: 'root' }) export class PopoverService { - /** - * @param {Injector} injector Injector. - * @param {overlay} overlay Overlay. - */ - constructor( - private overlay: Overlay, - private injector: Injector - ) {} + private overlay = inject(Overlay); + private injector = inject(Injector); /** * Opens the popover at target element diff --git a/src/app/core/authentication/authentication.guard.ts b/src/app/core/authentication/authentication.guard.ts index b7dde8899..6f7f206f0 100644 --- a/src/app/core/authentication/authentication.guard.ts +++ b/src/app/core/authentication/authentication.guard.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { Router } from '@angular/router'; /** Custom Services */ @@ -14,14 +14,8 @@ const log = new Logger('AuthenticationGuard'); */ @Injectable() export class AuthenticationGuard { - /** - * @param {Router} router Router for navigation. - * @param {AuthenticationService} authenticationService Authentication Service. - */ - constructor( - private router: Router, - private authenticationService: AuthenticationService - ) {} + private router = inject(Router); + private authenticationService = inject(AuthenticationService); /** * Ensures route access is authorized only when user is authenticated, otherwise redirects to login. diff --git a/src/app/core/authentication/authentication.interceptor.ts b/src/app/core/authentication/authentication.interceptor.ts index 1204557ab..129ecc0e9 100644 --- a/src/app/core/authentication/authentication.interceptor.ts +++ b/src/app/core/authentication/authentication.interceptor.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { HttpEvent, HttpInterceptor, HttpHandler, HttpRequest } from '@angular/common/http'; /** rxjs Imports */ @@ -27,7 +27,7 @@ const twoFactorAccessTokenHeader = 'Fineract-Platform-TFA-Token'; */ @Injectable() export class AuthenticationInterceptor implements HttpInterceptor { - constructor(private settingsService: SettingsService) {} + private settingsService = inject(SettingsService); /** * Intercepts a Http request and sets the request headers. diff --git a/src/app/core/authentication/authentication.service.ts b/src/app/core/authentication/authentication.service.ts index 417b49cfe..ae3d2e557 100644 --- a/src/app/core/authentication/authentication.service.ts +++ b/src/app/core/authentication/authentication.service.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { HttpClient, HttpParams, HttpHeaders } from '@angular/common/http'; /** rxjs Imports */ @@ -25,6 +25,10 @@ import { OAuth2Token } from './o-auth2-token.model'; */ @Injectable() export class AuthenticationService { + private http = inject(HttpClient); + private alertService = inject(AlertService); + private authenticationInterceptor = inject(AuthenticationInterceptor); + changePassword(userId: string, passwordObj: any) { return this.http.put(`/users/${userId}`, passwordObj); } @@ -61,11 +65,9 @@ export class AuthenticationService { * @param {AlertService} alertService Alert Service. * @param {AuthenticationInterceptor} authenticationInterceptor Authentication Interceptor. */ - constructor( - private http: HttpClient, - private alertService: AlertService, - private authenticationInterceptor: AuthenticationInterceptor - ) { + constructor() { + const authenticationInterceptor = this.authenticationInterceptor; + this.userLoggedIn = false; this.rememberMe = false; this.storage = sessionStorage; diff --git a/src/app/core/core.module.ts b/src/app/core/core.module.ts index 3e26d95ae..313e458ae 100644 --- a/src/app/core/core.module.ts +++ b/src/app/core/core.module.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { NgModule, Optional, SkipSelf, Injector } from '@angular/core'; +import { NgModule, Optional, Injector, inject } from '@angular/core'; import { HTTP_INTERCEPTORS, HttpClient, @@ -49,7 +49,6 @@ import { ContentComponent } from './shell/content/content.component'; @NgModule({ exports: [ SharedModule // TO BE REMOVED: Once all components have replaced the core module import by shared module. - ], imports: [ SharedModule, @@ -112,7 +111,9 @@ import { ContentComponent } from './shell/content/content.component'; ] }) export class CoreModule { - constructor(@Optional() @SkipSelf() parentModule: CoreModule) { + constructor() { + const parentModule = inject(CoreModule, { optional: true, skipSelf: true }); + // Import guard if (parentModule) { throw new Error(`${parentModule} has already been loaded. Import Core module in the AppModule only.`); diff --git a/src/app/core/error-handler/error-handler.service.ts b/src/app/core/error-handler/error-handler.service.ts index 0b76b01c7..c3a2241a8 100644 --- a/src/app/core/error-handler/error-handler.service.ts +++ b/src/app/core/error-handler/error-handler.service.ts @@ -38,7 +38,9 @@ export interface ErrorMessage { }) export class ErrorHandlerService { constructor( + // eslint-disable-next-line @angular-eslint/prefer-inject private snackBar: MatSnackBar, + // eslint-disable-next-line @angular-eslint/prefer-inject private router: Router ) {} diff --git a/src/app/core/http/api-prefix.interceptor.ts b/src/app/core/http/api-prefix.interceptor.ts index 60ef891a8..ab2734683 100644 --- a/src/app/core/http/api-prefix.interceptor.ts +++ b/src/app/core/http/api-prefix.interceptor.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { HttpEvent, HttpInterceptor, HttpHandler, HttpRequest } from '@angular/common/http'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { SettingsService } from 'app/settings/settings.service'; */ @Injectable() export class ApiPrefixInterceptor implements HttpInterceptor { - /** - * @param {SettingsService} settingsService Settings Service - */ - constructor(private settingsService: SettingsService) {} + private settingsService = inject(SettingsService); /** * Intercepts a Http request and prefixes it with `serverUrl`. diff --git a/src/app/core/http/cache.interceptor.ts b/src/app/core/http/cache.interceptor.ts index 8898df688..4eef06424 100644 --- a/src/app/core/http/cache.interceptor.ts +++ b/src/app/core/http/cache.interceptor.ts @@ -17,6 +17,7 @@ import { environment } from '../../../environments/environment'; export class CacheInterceptor implements HttpInterceptor { private forceUpdate = false; + // eslint-disable-next-line @angular-eslint/prefer-inject constructor(private httpCacheService: HttpCacheService) {} /** diff --git a/src/app/core/http/error-handler.interceptor.ts b/src/app/core/http/error-handler.interceptor.ts index 40948faf6..00559f420 100644 --- a/src/app/core/http/error-handler.interceptor.ts +++ b/src/app/core/http/error-handler.interceptor.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { HttpEvent, HttpInterceptor, HttpHandler, HttpRequest, HttpErrorResponse } from '@angular/common/http'; /** rxjs Imports */ @@ -22,14 +22,8 @@ const log = new Logger('ErrorHandlerInterceptor'); */ @Injectable() export class ErrorHandlerInterceptor implements HttpInterceptor { - /** - * @param {AlertService} alertService Alert Service. - * @param {TranslateService} translate Translation Service. - */ - constructor( - private alertService: AlertService, - private translate: TranslateService // Added TranslateService - ) {} + private alertService = inject(AlertService); + private translate = inject(TranslateService); /** * Intercepts a Http request and adds a default error handler. diff --git a/src/app/core/http/http.service.ts b/src/app/core/http/http.service.ts index 90f5001b7..e1af47929 100644 --- a/src/app/core/http/http.service.ts +++ b/src/app/core/http/http.service.ts @@ -1,3 +1,4 @@ +/* eslint-disable @angular-eslint/prefer-inject */ /** Angular Imports */ import { Inject, Injectable, InjectionToken, Injector, Optional } from '@angular/core'; import { HttpClient, HttpEvent, HttpInterceptor, HttpHandler, HttpRequest } from '@angular/common/http'; @@ -81,7 +82,8 @@ export class HttpService extends HttpClient { // Configure default interceptors that can be disabled here this.interceptors = [ this.injector.get(ApiPrefixInterceptor), - this.injector.get(ErrorHandlerInterceptor)]; + this.injector.get(ErrorHandlerInterceptor) + ]; } } diff --git a/src/app/core/i18n/i18n.service.ts b/src/app/core/i18n/i18n.service.ts index 5190a5dd5..442fd9b6e 100644 --- a/src/app/core/i18n/i18n.service.ts +++ b/src/app/core/i18n/i18n.service.ts @@ -7,6 +7,7 @@ import { Observable } from 'rxjs'; @Injectable() export class I18nService { + // eslint-disable-next-line @angular-eslint/prefer-inject constructor(private translateService: TranslateService) {} public translate(key: string, params?: object): Observable { diff --git a/src/app/core/progress-bar/progress.interceptor.ts b/src/app/core/progress-bar/progress.interceptor.ts index 99bcebe3a..056809c05 100644 --- a/src/app/core/progress-bar/progress.interceptor.ts +++ b/src/app/core/progress-bar/progress.interceptor.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { HttpEvent, HttpHandler, HttpInterceptor, HttpRequest, HttpResponse } from '@angular/common/http'; /** rxjs Imports */ @@ -14,10 +14,7 @@ import { ProgressBarService } from './progress-bar.service'; */ @Injectable() export class ProgressInterceptor implements HttpInterceptor { - /** - * @param {ProgressBarService} progressBarService Progress Bar Service. - */ - constructor(private progressBarService: ProgressBarService) {} + private progressBarService = inject(ProgressBarService); /** * Intercepts a Http request to start loading the progress bar for a pending request diff --git a/src/app/core/shell/breadcrumb/breadcrumb.component.html b/src/app/core/shell/breadcrumb/breadcrumb.component.html index 5e5181676..5f04e57f1 100644 --- a/src/app/core/shell/breadcrumb/breadcrumb.component.html +++ b/src/app/core/shell/breadcrumb/breadcrumb.component.html @@ -1,15 +1,27 @@ diff --git a/src/app/core/shell/breadcrumb/breadcrumb.component.ts b/src/app/core/shell/breadcrumb/breadcrumb.component.ts index 68deadc12..16cd4c943 100644 --- a/src/app/core/shell/breadcrumb/breadcrumb.component.ts +++ b/src/app/core/shell/breadcrumb/breadcrumb.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, TemplateRef, ElementRef, ViewChild, AfterViewInit } from '@angular/core'; +import { Component, TemplateRef, ElementRef, ViewChild, AfterViewInit, inject } from '@angular/core'; import { ActivatedRoute, Router, NavigationEnd, Data, RouterLink } from '@angular/router'; /** rxjs Imports */ @@ -55,6 +55,12 @@ const routeAddBreadcrumbLink = 'addBreadcrumbLink'; ] }) export class BreadcrumbComponent implements AfterViewInit { + private activatedRoute = inject(ActivatedRoute); + private router = inject(Router); + private configurationWizardService = inject(ConfigurationWizardService); + private popoverService = inject(PopoverService); + private translateService = inject(TranslateService); + /** Array of breadcrumbs. */ breadcrumbs: Breadcrumb[]; /* Reference of breadcrumb */ @@ -69,13 +75,7 @@ export class BreadcrumbComponent implements AfterViewInit { * @param {ConfigurationWizardService} configurationWizardService ConfigurationWizard Service. * @param {PopoverService} popoverService PopoverService. */ - constructor( - private activatedRoute: ActivatedRoute, - private router: Router, - private configurationWizardService: ConfigurationWizardService, - private popoverService: PopoverService, - private translateService: TranslateService - ) { + constructor() { this.generateBreadcrumbs(); } diff --git a/src/app/core/shell/shell.component.html b/src/app/core/shell/shell.component.html index c0dd4571c..3fa8b7d94 100644 --- a/src/app/core/shell/shell.component.html +++ b/src/app/core/shell/shell.component.html @@ -20,9 +20,11 @@ -
    -
    -
    + @if (progressBarMode !== 'none') { +
    +
    +
    + } diff --git a/src/app/core/shell/shell.component.ts b/src/app/core/shell/shell.component.ts index 0a950b006..6638bdcd9 100644 --- a/src/app/core/shell/shell.component.ts +++ b/src/app/core/shell/shell.component.ts @@ -1,6 +1,6 @@ /** Angular Imports */ import { BreakpointObserver, Breakpoints } from '@angular/cdk/layout'; -import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; +import { ChangeDetectorRef, Component, OnDestroy, OnInit, inject } from '@angular/core'; /** rxjs Imports */ import { Observable, Subscription } from 'rxjs'; @@ -9,7 +9,7 @@ import { map } from 'rxjs/operators'; /** Custom Services */ import { ProgressBarService } from '../progress-bar/progress-bar.service'; import { MatSidenavContainer, MatSidenav, MatSidenavContent } from '@angular/material/sidenav'; -import { NgClass, NgIf, AsyncPipe } from '@angular/common'; +import { NgClass, AsyncPipe } from '@angular/common'; import { SidenavComponent } from './sidenav/sidenav.component'; import { ToolbarComponent } from './toolbar/toolbar.component'; import { BreadcrumbComponent } from './breadcrumb/breadcrumb.component'; @@ -39,6 +39,10 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ShellComponent implements OnInit, OnDestroy { + private breakpointObserver = inject(BreakpointObserver); + private progressBarService = inject(ProgressBarService); + private cdr = inject(ChangeDetectorRef); + /** Subscription to breakpoint observer for handset. */ isHandset$: Observable = this.breakpointObserver .observe(Breakpoints.Handset) @@ -50,17 +54,6 @@ export class ShellComponent implements OnInit, OnDestroy { /** Subscription to progress bar. */ progressBar$: Subscription; - /** - * @param {BreakpointObserver} breakpointObserver Breakpoint Observer to detect screen size. - * @param {ProgressBarService} progressBarService Progress Bar Service. - * @param {ChangeDetectorRef} cdr Change Detector Ref. - */ - constructor( - private breakpointObserver: BreakpointObserver, - private progressBarService: ProgressBarService, - private cdr: ChangeDetectorRef - ) {} - /** * Subscribes to progress bar to update its mode. */ diff --git a/src/app/core/shell/sidenav/sidenav.component.html b/src/app/core/shell/sidenav/sidenav.component.html index 1b24ee13f..55e668422 100644 --- a/src/app/core/shell/sidenav/sidenav.component.html +++ b/src/app/core/shell/sidenav/sidenav.component.html @@ -40,16 +40,18 @@
    -
    - -
    + @for (activity of mappedActivities; track activity) { +
    + +
    + }
    diff --git a/src/app/deposits/fixed-deposits/edit-fixed-deposit-account/edit-fixed-deposit-account.component.ts b/src/app/deposits/fixed-deposits/edit-fixed-deposit-account/edit-fixed-deposit-account.component.ts index 9382a8135..f1862890d 100644 --- a/src/app/deposits/fixed-deposits/edit-fixed-deposit-account/edit-fixed-deposit-account.component.ts +++ b/src/app/deposits/fixed-deposits/edit-fixed-deposit-account/edit-fixed-deposit-account.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, ViewChild } from '@angular/core'; +import { Component, ViewChild, inject } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; /** Custom Services */ @@ -42,6 +42,12 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class EditFixedDepositAccountComponent { + private route = inject(ActivatedRoute); + private router = inject(Router); + private dateUtils = inject(Dates); + private fixedDepositsService = inject(FixedDepositsService); + private settingsService = inject(SettingsService); + /** Fixed Deposits Account Details Step */ @ViewChild(FixedDepositAccountDetailsStepComponent, { static: true }) fixedDepositsAccountDetailsStep: FixedDepositAccountDetailsStepComponent; @@ -70,13 +76,7 @@ export class EditFixedDepositAccountComponent { * @param {FixedDepositsService} fixedDepositsService Fixed Deposits Service * @param {SettingsService} settingsService Settings Service */ - constructor( - private route: ActivatedRoute, - private router: Router, - private dateUtils: Dates, - private fixedDepositsService: FixedDepositsService, - private settingsService: SettingsService - ) { + constructor() { this.route.data.subscribe((data: { fixedDepositsAccountAndTemplate: any }) => { this.fixedDepositsAccountAndTemplate = data.fixedDepositsAccountAndTemplate; }); diff --git a/src/app/deposits/fixed-deposits/fixed-deposit-account-stepper/fixed-deposit-account-charges-step/fixed-deposit-account-charges-step.component.html b/src/app/deposits/fixed-deposits/fixed-deposit-account-stepper/fixed-deposit-account-charges-step/fixed-deposit-account-charges-step.component.html index b48e03fd8..22d5054a2 100644 --- a/src/app/deposits/fixed-deposits/fixed-deposit-account-stepper/fixed-deposit-account-charges-step/fixed-deposit-account-charges-step.component.html +++ b/src/app/deposits/fixed-deposits/fixed-deposit-account-stepper/fixed-deposit-account-charges-step/fixed-deposit-account-charges-step.component.html @@ -2,9 +2,11 @@ {{ 'labels.inputs.Charge' | translate }} - - {{ charge.name }} - + @for (charge of chargeData; track charge) { + + {{ charge.name }} + + } @@ -55,38 +57,37 @@ {{ 'labels.inputs.Date' | translate }} - - {{ (charge.dueDate | dateFormat) || 'Unassigned*' }} - - - {{ charge.feeOnMonthDay ? ([2000].concat(charge.feeOnMonthDay) | dateFormat: 'dd MMMM') : 'Unassigned' }} - - - {{ 'labels.inputs.N/A' | translate }} - - + charge.chargeTimeType.value === 'Specified due date' || + charge.chargeTimeType.value === 'Weekly Fee' + ) + ) { + + {{ 'labels.inputs.N/A' | translate }} + + } + @if ( + charge.chargeTimeType.value === 'Weekly Fee' || + charge.chargeTimeType.value === 'Annual Fee' || + charge.chargeTimeType.value === 'Specified due date' + ) { + + } @@ -94,14 +95,11 @@ {{ 'labels.inputs.Repayments Every' | translate }} {{ charge.feeInterval || 'Not Provided' }} - + @if (charge.chargeTimeType.value === 'Weekly Fee' || charge.chargeTimeType.value === 'Monthly Fee') { + + } diff --git a/src/app/deposits/fixed-deposits/fixed-deposit-account-stepper/fixed-deposit-account-charges-step/fixed-deposit-account-charges-step.component.ts b/src/app/deposits/fixed-deposits/fixed-deposit-account-stepper/fixed-deposit-account-charges-step/fixed-deposit-account-charges-step.component.ts index 1a2aa34fd..9e6c9d5ba 100644 --- a/src/app/deposits/fixed-deposits/fixed-deposit-account-stepper/fixed-deposit-account-charges-step/fixed-deposit-account-charges-step.component.ts +++ b/src/app/deposits/fixed-deposits/fixed-deposit-account-stepper/fixed-deposit-account-charges-step/fixed-deposit-account-charges-step.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, Input, OnChanges } from '@angular/core'; +import { Component, OnInit, Input, OnChanges, inject } from '@angular/core'; import { UntypedFormControl } from '@angular/forms'; import { MatDialog } from '@angular/material/dialog'; @@ -58,6 +58,10 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class FixedDepositAccountChargesStepComponent implements OnInit, OnChanges { + dialog = inject(MatDialog); + private dateUtils = inject(Dates); + private settingsService = inject(SettingsService); + /** Fixed deposits account template */ @Input() fixedDepositsAccountTemplate: any; /** Fixed deposits account and product template */ @@ -86,17 +90,6 @@ export class FixedDepositAccountChargesStepComponent implements OnInit, OnChange /** Component is pristine if there has been no changes by user interaction */ pristine = true; - /** - * @param {MatDialog} dialog Mat Dialog - * @param {Dates} dateUtils Date Utils - * @param {SettingsService} settingsService Settings Service - */ - constructor( - public dialog: MatDialog, - private dateUtils: Dates, - private settingsService: SettingsService - ) {} - ngOnInit() { this.chargesDataSource = []; if (this.fixedDepositsAccountTemplate.id && this.fixedDepositsAccountTemplate.charges) { @@ -142,7 +135,6 @@ export class FixedDepositAccountChargesStepComponent implements OnInit, OnChange type: 'number', required: false }) - ]; const data = { title: 'Edit Charge Amount', @@ -173,7 +165,6 @@ export class FixedDepositAccountChargesStepComponent implements OnInit, OnChange type: 'datetime-local', required: false }) - ]; const data = { title: 'Edit Charge Date', @@ -215,7 +206,6 @@ export class FixedDepositAccountChargesStepComponent implements OnInit, OnChange type: 'text', required: false }) - ]; const data = { title: 'Edit Charge Fee Interval', diff --git a/src/app/deposits/fixed-deposits/fixed-deposit-account-stepper/fixed-deposit-account-details-step/fixed-deposit-account-details-step.component.html b/src/app/deposits/fixed-deposits/fixed-deposit-account-stepper/fixed-deposit-account-details-step/fixed-deposit-account-details-step.component.html index 055889faf..7ca7a66e7 100644 --- a/src/app/deposits/fixed-deposits/fixed-deposit-account-stepper/fixed-deposit-account-details-step/fixed-deposit-account-details-step.component.html +++ b/src/app/deposits/fixed-deposits/fixed-deposit-account-stepper/fixed-deposit-account-details-step/fixed-deposit-account-details-step.component.html @@ -3,9 +3,11 @@ {{ 'labels.inputs.Product Name' | translate }} - - {{ product.name }} - + @for (product of productData; track product) { + + {{ product.name }} + + } {{ 'labels.inputs.Product Name' | translate }} {{ 'labels.commons.is' | translate }} @@ -13,37 +15,49 @@ - - {{ 'labels.inputs.Submitted On' | translate }} - - - - - {{ 'labels.inputs.Submission Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - + @if (isProductSelected) { + + {{ 'labels.inputs.Submitted On' | translate }} + + + + + {{ 'labels.inputs.Submission Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + + } - - {{ 'labels.inputs.Field Officer' | translate }} - - - {{ officer.displayName }} - - - + @if (isProductSelected) { + + {{ 'labels.inputs.Field Officer' | translate }} + + @for (officer of fieldOfficerData; track officer) { + + {{ officer.displayName }} + + } + + + } - - {{ 'labels.inputs.External id' | translate }} - - + @if (isProductSelected) { + + {{ 'labels.inputs.External id' | translate }} + + + }
    diff --git a/src/app/deposits/fixed-deposits/fixed-deposit-account-stepper/fixed-deposit-account-details-step/fixed-deposit-account-details-step.component.ts b/src/app/deposits/fixed-deposits/fixed-deposit-account-stepper/fixed-deposit-account-details-step/fixed-deposit-account-details-step.component.ts index 4db644840..2da67a7a7 100644 --- a/src/app/deposits/fixed-deposits/fixed-deposit-account-stepper/fixed-deposit-account-details-step/fixed-deposit-account-details-step.component.ts +++ b/src/app/deposits/fixed-deposits/fixed-deposit-account-stepper/fixed-deposit-account-details-step/fixed-deposit-account-details-step.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core'; +import { Component, OnInit, Input, Output, EventEmitter, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, Validators, ReactiveFormsModule } from '@angular/forms'; import { SettingsService } from 'app/settings/settings.service'; @@ -26,6 +26,10 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class FixedDepositAccountDetailsStepComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private fixedDepositsService = inject(FixedDepositsService); + private settingsService = inject(SettingsService); + /** Fixed Deposits Account Template */ @Input() fixedDepositsAccountTemplate: any; @@ -53,11 +57,7 @@ export class FixedDepositAccountDetailsStepComponent implements OnInit { * @param {FixedDepositsService} fixedDepositsService Fixed Deposits Service. * @param {SettingsService} settingsService Settings Service */ - constructor( - private formBuilder: UntypedFormBuilder, - private fixedDepositsService: FixedDepositsService, - private settingsService: SettingsService - ) { + constructor() { this.createFixedDepositsAccountDetailsForm(); } diff --git a/src/app/deposits/fixed-deposits/fixed-deposit-account-stepper/fixed-deposit-account-interest-rate-chart-step/fixed-deposit-account-interest-rate-chart-step.component.ts b/src/app/deposits/fixed-deposits/fixed-deposit-account-stepper/fixed-deposit-account-interest-rate-chart-step/fixed-deposit-account-interest-rate-chart-step.component.ts index 10c74ae72..6c8121f5c 100644 --- a/src/app/deposits/fixed-deposits/fixed-deposit-account-stepper/fixed-deposit-account-interest-rate-chart-step/fixed-deposit-account-interest-rate-chart-step.component.ts +++ b/src/app/deposits/fixed-deposits/fixed-deposit-account-stepper/fixed-deposit-account-interest-rate-chart-step/fixed-deposit-account-interest-rate-chart-step.component.ts @@ -31,8 +31,8 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; trigger('expandChartSlab', [ state('collapsed', style({ height: '0px', minHeight: '0' })), state('expanded', style({ height: '*' })), - transition('expanded <=> collapsed', animate('225ms cubic-bezier(0.4, 0.0, 0.2, 1)'))]) - + transition('expanded <=> collapsed', animate('225ms cubic-bezier(0.4, 0.0, 0.2, 1)')) + ]) ], imports: [ ...STANDALONE_SHARED_IMPORTS, diff --git a/src/app/deposits/fixed-deposits/fixed-deposit-account-stepper/fixed-deposit-account-preview-step/fixed-deposit-account-preview-step.component.ts b/src/app/deposits/fixed-deposits/fixed-deposit-account-stepper/fixed-deposit-account-preview-step/fixed-deposit-account-preview-step.component.ts index 23a271303..c7584720e 100644 --- a/src/app/deposits/fixed-deposits/fixed-deposit-account-stepper/fixed-deposit-account-preview-step/fixed-deposit-account-preview-step.component.ts +++ b/src/app/deposits/fixed-deposits/fixed-deposit-account-stepper/fixed-deposit-account-preview-step/fixed-deposit-account-preview-step.component.ts @@ -34,8 +34,8 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; trigger('expandChartSlab', [ state('collapsed', style({ height: '0px', minHeight: '0' })), state('expanded', style({ height: '*' })), - transition('expanded <=> collapsed', animate('225ms cubic-bezier(0.4, 0.0, 0.2, 1)'))]) - + transition('expanded <=> collapsed', animate('225ms cubic-bezier(0.4, 0.0, 0.2, 1)')) + ]) ], imports: [ ...STANDALONE_SHARED_IMPORTS, diff --git a/src/app/deposits/fixed-deposits/fixed-deposit-account-stepper/fixed-deposit-account-settings-step/fixed-deposit-account-settings-step.component.html b/src/app/deposits/fixed-deposits/fixed-deposit-account-stepper/fixed-deposit-account-settings-step/fixed-deposit-account-settings-step.component.html index 4681f17d5..79a9949d1 100644 --- a/src/app/deposits/fixed-deposits/fixed-deposit-account-stepper/fixed-deposit-account-settings-step/fixed-deposit-account-settings-step.component.html +++ b/src/app/deposits/fixed-deposits/fixed-deposit-account-stepper/fixed-deposit-account-settings-step/fixed-deposit-account-settings-step.component.html @@ -10,12 +10,11 @@ {{ 'labels.inputs.Type' | translate }} - - {{ lockinPeriodFrequencyType.value | translateKey: 'catalogs' }} - + @for (lockinPeriodFrequencyType of lockinPeriodFrequencyTypeData; track lockinPeriodFrequencyType) { + + {{ lockinPeriodFrequencyType.value | translateKey: 'catalogs' }} + + } @@ -33,9 +32,11 @@ {{ 'labels.inputs.Frequency Type' | translate }} - - {{ periodFrequencyType.value | translateKey: 'catalogs' }} - + @for (periodFrequencyType of periodFrequencyTypeData; track periodFrequencyType) { + + {{ periodFrequencyType.value | translateKey: 'catalogs' }} + + } {{ 'labels.inputs.Minimum Deposit Term Frequency Type' | translate }} {{ 'labels.commons.is' | translate }} @@ -53,9 +54,11 @@ {{ 'labels.inputs.Type' | translate }} - - {{ periodFrequencyType.value | translateKey: 'catalogs' }} - + @for (periodFrequencyType of periodFrequencyTypeData; track periodFrequencyType) { + + {{ periodFrequencyType.value | translateKey: 'catalogs' }} + + } @@ -69,9 +72,11 @@ {{ 'labels.inputs.Type' | translate }} - - {{ periodFrequencyType.value | translateKey: 'catalogs' }} - + @for (periodFrequencyType of periodFrequencyTypeData; track periodFrequencyType) { + + {{ periodFrequencyType.value | translateKey: 'catalogs' }} + + } @@ -83,42 +88,48 @@ {{ 'labels.inputs.Transfer Interest to Linked Savings Account' | translate }}? - - {{ 'labels.inputs.Linked Savings Account' | translate }} - - - ({{ account.accountNo }}) {{ account.savingsProductName }} - - - - {{ 'labels.inputs.Linked Savings Account' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - + @if (fixedDepositAccountSettingsForm.contains('linkAccountId')) { + + {{ 'labels.inputs.Linked Savings Account' | translate }} + + @for (account of savingsAccountsData; track account) { + ({{ account.accountNo }}) {{ account.savingsProductName }} + } + + + {{ 'labels.inputs.Linked Savings Account' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + + } {{ 'labels.inputs.Maturity Instructions' | translate }} - - {{ maturityInstruction.value | translateKey: 'catalogs' }} - + @for (maturityInstruction of maturityInstructionOptions; track maturityInstruction) { + + {{ maturityInstruction.value | translateKey: 'catalogs' }} + + } - - {{ 'labels.inputs.Transfer to savings account' | translate }} - - - ({{ account.accountNo }}) {{ account.savingsProductName }} - - - - {{ 'labels.inputs.Transfer to savings account' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - + @if (fixedDepositAccountSettingsForm.contains('transferToSavingsId')) { + + {{ 'labels.inputs.Transfer to savings account' | translate }} + + @for (account of savingsAccountsData; track account) { + ({{ account.accountNo }}) {{ account.savingsProductName }} + } + + + {{ 'labels.inputs.Transfer to savings account' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + + } @@ -136,27 +147,26 @@ {{ 'labels.inputs.Period' | translate }} - - {{ preClosurePenalInterestOnType.value | translateKey: 'catalogs' }} - + @for (preClosurePenalInterestOnType of preClosurePenalInterestOnTypeData; track preClosurePenalInterestOnType) { + + {{ preClosurePenalInterestOnType.value | translateKey: 'catalogs' }} + + } - + @if (fixedDepositAccountSettingsForm.controls.withHoldTax) { - {{ 'labels.inputs.Is Withhold Tax Applicable' | translate }}? - - - {{ 'labels.inputs.Tax Group' | translate }} - - - + @if (fixedDepositAccountSettingsForm.controls.taxGroupId) { + + {{ 'labels.inputs.Tax Group' | translate }} + + + } + }
    diff --git a/src/app/deposits/fixed-deposits/fixed-deposit-account-stepper/fixed-deposit-account-settings-step/fixed-deposit-account-settings-step.component.ts b/src/app/deposits/fixed-deposits/fixed-deposit-account-stepper/fixed-deposit-account-settings-step/fixed-deposit-account-settings-step.component.ts index dc8f4ca12..86c895417 100644 --- a/src/app/deposits/fixed-deposits/fixed-deposit-account-stepper/fixed-deposit-account-settings-step/fixed-deposit-account-settings-step.component.ts +++ b/src/app/deposits/fixed-deposits/fixed-deposit-account-stepper/fixed-deposit-account-settings-step/fixed-deposit-account-settings-step.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, Input, OnChanges } from '@angular/core'; +import { Component, OnInit, Input, OnChanges, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, @@ -32,6 +32,9 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class FixedDepositAccountSettingsStepComponent implements OnInit, OnChanges { + private formBuilder = inject(UntypedFormBuilder); + private settingsService = inject(SettingsService); + /** Fixed deposits account template */ @Input() fixedDepositsAccountTemplate: any; /** Fixed deposits account and product template */ @@ -52,16 +55,13 @@ export class FixedDepositAccountSettingsStepComponent implements OnInit, OnChang /** Savings Accounts Data */ savingsAccountsData: any; - maturityInstructionOptions: OptionData; + maturityInstructionOptions: OptionData[]; /** * @param {FormBuilder} formBuilder Form Builder * @param {SettingsService} settingsService Settings Service */ - constructor( - private formBuilder: UntypedFormBuilder, - private settingsService: SettingsService - ) { + constructor() { this.createFixedDepositAccountSettingsForm(); this.buildDependencies(); } diff --git a/src/app/deposits/fixed-deposits/fixed-deposit-account-stepper/fixed-deposit-account-terms-step/fixed-deposit-account-terms-step.component.html b/src/app/deposits/fixed-deposits/fixed-deposit-account-stepper/fixed-deposit-account-terms-step/fixed-deposit-account-terms-step.component.html index 2c9406484..41e673fbe 100644 --- a/src/app/deposits/fixed-deposits/fixed-deposit-account-stepper/fixed-deposit-account-terms-step/fixed-deposit-account-terms-step.component.html +++ b/src/app/deposits/fixed-deposits/fixed-deposit-account-stepper/fixed-deposit-account-terms-step/fixed-deposit-account-terms-step.component.html @@ -1,14 +1,15 @@
    - - + @if (currency) { + + + } @@ -24,9 +25,11 @@ {{ 'labels.inputs.Deposit Period Type' | translate }} - - {{ periodFrequencyType.value | translateKey: 'catalogs' }} - + @for (periodFrequencyType of periodFrequencyTypeData; track periodFrequencyType) { + + {{ periodFrequencyType.value | translateKey: 'catalogs' }} + + } {{ 'labels.inputs.Deposit Period Type' | translate }} {{ 'labels.commons.is' | translate }} @@ -39,12 +42,11 @@ {{ 'labels.inputs.Interest Compounding Period' | translate }} - - {{ interestCompoundingPeriodType.value | translateKey: 'catalogs' }} - + @for (interestCompoundingPeriodType of interestCompoundingPeriodTypeData; track interestCompoundingPeriodType) { + + {{ interestCompoundingPeriodType.value | translateKey: 'catalogs' }} + + } {{ 'labels.inputs.Interest Compounding Period' | translate }} {{ 'labels.commons.is' | translate }} @@ -55,12 +57,11 @@ {{ 'labels.inputs.Interest Posting Period' | translate }} - - {{ interestPostingPeriodType.value | translateKey: 'catalogs' }} - + @for (interestPostingPeriodType of interestPostingPeriodTypeData; track interestPostingPeriodType) { + + {{ interestPostingPeriodType.value | translateKey: 'catalogs' }} + + } {{ 'labels.inputs.Interest Posting Period' | translate }} {{ 'labels.commons.is' | translate }} @@ -71,12 +72,11 @@ {{ 'labels.inputs.Interest Calculated using' | translate }} - - {{ interestCalculationType.value | translateKey: 'catalogs' }} - + @for (interestCalculationType of interestCalculationTypeData; track interestCalculationType) { + + {{ interestCalculationType.value | translateKey: 'catalogs' }} + + } {{ 'labels.inputs.Interest Calculated using' | translate }} {{ 'labels.commons.is' | translate }} @@ -87,12 +87,14 @@ {{ 'labels.inputs.Days in Year' | translate }} - - {{ interestCalculationDaysInYearType.value | translateKey: 'catalogs' }} - + @for ( + interestCalculationDaysInYearType of interestCalculationDaysInYearTypeData; + track interestCalculationDaysInYearType + ) { + + {{ interestCalculationDaysInYearType.value | translateKey: 'catalogs' }} + + } {{ 'labels.inputs.Days in Year' | translate }} {{ 'labels.commons.is' | translate }} diff --git a/src/app/deposits/fixed-deposits/fixed-deposit-account-stepper/fixed-deposit-account-terms-step/fixed-deposit-account-terms-step.component.ts b/src/app/deposits/fixed-deposits/fixed-deposit-account-stepper/fixed-deposit-account-terms-step/fixed-deposit-account-terms-step.component.ts index ae63a2544..8301c2854 100644 --- a/src/app/deposits/fixed-deposits/fixed-deposit-account-stepper/fixed-deposit-account-terms-step/fixed-deposit-account-terms-step.component.ts +++ b/src/app/deposits/fixed-deposits/fixed-deposit-account-stepper/fixed-deposit-account-terms-step/fixed-deposit-account-terms-step.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, Input, OnChanges } from '@angular/core'; +import { Component, OnInit, Input, OnChanges, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, Validators, ReactiveFormsModule } from '@angular/forms'; import { SettingsService } from 'app/settings/settings.service'; import { Currency } from 'app/shared/models/general.model'; @@ -26,6 +26,9 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class FixedDepositAccountTermsStepComponent implements OnInit, OnChanges { + private formBuilder = inject(UntypedFormBuilder); + private settingsService = inject(SettingsService); + /** Fixed deposits account template */ @Input() fixedDepositsAccountTemplate: any; /** Fixed deposits account and product template */ @@ -53,10 +56,7 @@ export class FixedDepositAccountTermsStepComponent implements OnInit, OnChanges * @param {FormBuilder} formBuilder Form Builder * @param {SettingsService} settingsService Settings Service */ - constructor( - private formBuilder: UntypedFormBuilder, - private settingsService: SettingsService - ) { + constructor() { this.createFixedDepositsAccountTermsForm(); } diff --git a/src/app/deposits/fixed-deposits/fixed-deposit-account-view/charges-tab/charges-tab.component.html b/src/app/deposits/fixed-deposits/fixed-deposit-account-view/charges-tab/charges-tab.component.html index d77dbaed0..b4393c773 100644 --- a/src/app/deposits/fixed-deposits/fixed-deposit-account-view/charges-tab/charges-tab.component.html +++ b/src/app/deposits/fixed-deposits/fixed-deposit-account-view/charges-tab/charges-tab.component.html @@ -3,11 +3,13 @@

    {{ 'labels.heading.All Charges' | translate }}

    -
    - -
    + @if (this.chargesData) { +
    + +
    + }
    @@ -81,62 +83,66 @@ {{ 'labels.inputs.Actions' | translate }} - - - - - - - - + @if (fixedDepositsAccountData.status.value === 'Submitted and pending approval') { + - - + + + } + @if (fixedDepositsAccountData.status.value === 'Active' && charge.amountOutstanding !== 0) { + + + + @if (isRecurringCharge(charge)) { + + } + + } diff --git a/src/app/deposits/fixed-deposits/fixed-deposit-account-view/charges-tab/charges-tab.component.ts b/src/app/deposits/fixed-deposits/fixed-deposit-account-view/charges-tab/charges-tab.component.ts index 1ef8e2297..0e65c6c1f 100644 --- a/src/app/deposits/fixed-deposits/fixed-deposit-account-view/charges-tab/charges-tab.component.ts +++ b/src/app/deposits/fixed-deposits/fixed-deposit-account-view/charges-tab/charges-tab.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, ViewChild } from '@angular/core'; +import { Component, OnInit, ViewChild, inject } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; import { MatDialog } from '@angular/material/dialog'; import { @@ -62,6 +62,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ChargesTabComponent implements OnInit { + private savingsService = inject(SavingsService); + private route = inject(ActivatedRoute); + private dateUtils = inject(Dates); + private router = inject(Router); + dialog = inject(MatDialog); + private settingsService = inject(SettingsService); + /** Fixed Deposits Account Data */ fixedDepositsAccountData: any; /** Charges Data */ @@ -97,14 +104,7 @@ export class ChargesTabComponent implements OnInit { * @param {Dates} dateUtils Date Utils. * @param {SettingsService} settingsService Settings Service. */ - constructor( - private savingsService: SavingsService, - private route: ActivatedRoute, - private dateUtils: Dates, - private router: Router, - public dialog: MatDialog, - private settingsService: SettingsService - ) { + constructor() { this.route.parent.data.subscribe((data: { fixedDepositsAccountData: any }) => { this.fixedDepositsAccountData = data.fixedDepositsAccountData; this.chargesData = this.fixedDepositsAccountData.charges; @@ -151,7 +151,6 @@ export class ChargesTabComponent implements OnInit { type: 'date', required: true }) - ]; const data = { title: `Pay Charge ${chargeId}`, @@ -225,7 +224,6 @@ export class ChargesTabComponent implements OnInit { type: 'number', required: true }) - ]; const data = { title: `Edit Charge ${charge.id}`, diff --git a/src/app/deposits/fixed-deposits/fixed-deposit-account-view/custom-dialogs/calculate-interest-dialog/calculate-interest-dialog.component.ts b/src/app/deposits/fixed-deposits/fixed-deposit-account-view/custom-dialogs/calculate-interest-dialog/calculate-interest-dialog.component.ts index 3c269b931..f87980545 100644 --- a/src/app/deposits/fixed-deposits/fixed-deposit-account-view/custom-dialogs/calculate-interest-dialog/calculate-interest-dialog.component.ts +++ b/src/app/deposits/fixed-deposits/fixed-deposit-account-view/custom-dialogs/calculate-interest-dialog/calculate-interest-dialog.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component } from '@angular/core'; +import { Component, inject } from '@angular/core'; import { MatDialogRef, MatDialogTitle, @@ -27,8 +27,5 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class CalculateInterestDialogComponent { - /** - * @param {MatDialogRef} dialogRef Component reference to dialog. - */ - constructor(public dialogRef: MatDialogRef) {} + dialogRef = inject>(MatDialogRef); } diff --git a/src/app/deposits/fixed-deposits/fixed-deposit-account-view/custom-dialogs/inactivate-charge-dialog/inactivate-charge-dialog.component.ts b/src/app/deposits/fixed-deposits/fixed-deposit-account-view/custom-dialogs/inactivate-charge-dialog/inactivate-charge-dialog.component.ts index 289d1968d..b08730ba0 100644 --- a/src/app/deposits/fixed-deposits/fixed-deposit-account-view/custom-dialogs/inactivate-charge-dialog/inactivate-charge-dialog.component.ts +++ b/src/app/deposits/fixed-deposits/fixed-deposit-account-view/custom-dialogs/inactivate-charge-dialog/inactivate-charge-dialog.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, Inject } from '@angular/core'; +import { Component, inject } from '@angular/core'; import { MatDialogRef, MAT_DIALOG_DATA, @@ -28,11 +28,6 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class InactivateChargeDialogComponent { - /** - * @param {MatDialogRef} dialogRef Component reference to dialog. - */ - constructor( - public dialogRef: MatDialogRef, - @Inject(MAT_DIALOG_DATA) public data: any - ) {} + dialogRef = inject>(MatDialogRef); + data = inject(MAT_DIALOG_DATA); } diff --git a/src/app/deposits/fixed-deposits/fixed-deposit-account-view/custom-dialogs/post-interest-dialog/post-interest-dialog.component.ts b/src/app/deposits/fixed-deposits/fixed-deposit-account-view/custom-dialogs/post-interest-dialog/post-interest-dialog.component.ts index 894cf6df9..7b8d59a17 100644 --- a/src/app/deposits/fixed-deposits/fixed-deposit-account-view/custom-dialogs/post-interest-dialog/post-interest-dialog.component.ts +++ b/src/app/deposits/fixed-deposits/fixed-deposit-account-view/custom-dialogs/post-interest-dialog/post-interest-dialog.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component } from '@angular/core'; +import { Component, inject } from '@angular/core'; import { MatDialogRef, MatDialogTitle, @@ -27,8 +27,5 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class PostInterestDialogComponent { - /** - * @param {MatDialogRef} dialogRef Component reference to dialog. - */ - constructor(public dialogRef: MatDialogRef) {} + dialogRef = inject>(MatDialogRef); } diff --git a/src/app/deposits/fixed-deposits/fixed-deposit-account-view/custom-dialogs/toggle-withhold-tax-dialog/toggle-withhold-tax-dialog.component.ts b/src/app/deposits/fixed-deposits/fixed-deposit-account-view/custom-dialogs/toggle-withhold-tax-dialog/toggle-withhold-tax-dialog.component.ts index d53f653f1..4980fc0fb 100644 --- a/src/app/deposits/fixed-deposits/fixed-deposit-account-view/custom-dialogs/toggle-withhold-tax-dialog/toggle-withhold-tax-dialog.component.ts +++ b/src/app/deposits/fixed-deposits/fixed-deposit-account-view/custom-dialogs/toggle-withhold-tax-dialog/toggle-withhold-tax-dialog.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, Inject } from '@angular/core'; +import { Component, inject } from '@angular/core'; import { MatDialogRef, MAT_DIALOG_DATA, @@ -28,12 +28,6 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ToggleWithholdTaxDialogComponent { - /** - * @param {MatDialogRef} dialogRef Component reference to dialog. - * @param {any} data. - */ - constructor( - public dialogRef: MatDialogRef, - @Inject(MAT_DIALOG_DATA) public data: any - ) {} + dialogRef = inject>(MatDialogRef); + data = inject(MAT_DIALOG_DATA); } diff --git a/src/app/deposits/fixed-deposits/fixed-deposit-account-view/custom-dialogs/waive-charge-dialog/waive-charge-dialog.component.ts b/src/app/deposits/fixed-deposits/fixed-deposit-account-view/custom-dialogs/waive-charge-dialog/waive-charge-dialog.component.ts index df4e9b488..f920ad900 100644 --- a/src/app/deposits/fixed-deposits/fixed-deposit-account-view/custom-dialogs/waive-charge-dialog/waive-charge-dialog.component.ts +++ b/src/app/deposits/fixed-deposits/fixed-deposit-account-view/custom-dialogs/waive-charge-dialog/waive-charge-dialog.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, Inject } from '@angular/core'; +import { Component, inject } from '@angular/core'; import { MatDialogRef, MAT_DIALOG_DATA, @@ -28,12 +28,6 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class WaiveChargeDialogComponent { - /** - * @param {MatDialogRef} dialogRef Component reference to dialog. - * @param {any} data. - */ - constructor( - public dialogRef: MatDialogRef, - @Inject(MAT_DIALOG_DATA) public data: any - ) {} + dialogRef = inject>(MatDialogRef); + data = inject(MAT_DIALOG_DATA); } diff --git a/src/app/deposits/fixed-deposits/fixed-deposit-account-view/datatable-tabs/datatable-tabs.component.ts b/src/app/deposits/fixed-deposits/fixed-deposit-account-view/datatable-tabs/datatable-tabs.component.ts index b25abead1..8f241cb62 100644 --- a/src/app/deposits/fixed-deposits/fixed-deposit-account-view/datatable-tabs/datatable-tabs.component.ts +++ b/src/app/deposits/fixed-deposits/fixed-deposit-account-view/datatable-tabs/datatable-tabs.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component } from '@angular/core'; +import { Component, inject } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; import { EntityDatatableTabComponent } from '../../../../shared/tabs/entity-datatable-tab/entity-datatable-tab.component'; import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; @@ -17,6 +17,8 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class DatatableTabsComponent { + private route = inject(ActivatedRoute); + entityId: string; /** Savings Datatable */ entityDatatable: any; @@ -27,7 +29,7 @@ export class DatatableTabsComponent { * Fetches Savings and datatables data from `resolve` * @param {ActivatedRoute} route Activated Route. */ - constructor(private route: ActivatedRoute) { + constructor() { this.entityId = this.route.parent.parent.snapshot.paramMap.get('fixedDepositAccountId'); this.route.data.subscribe((data: { savingsDatatable: any }) => { diff --git a/src/app/deposits/fixed-deposits/fixed-deposit-account-view/fixed-deposit-account-view.component.html b/src/app/deposits/fixed-deposits/fixed-deposit-account-view/fixed-deposit-account-view.component.html index d0e86644c..dd64d7cdd 100644 --- a/src/app/deposits/fixed-deposits/fixed-deposit-account-view/fixed-deposit-account-view.component.html +++ b/src/app/deposits/fixed-deposits/fixed-deposit-account-view/fixed-deposit-account-view.component.html @@ -29,42 +29,44 @@
    -
    -

    {{ 'labels.heading.Account Overview' | translate }}

    - - - - - - - - - - - - -
    + @if ( + !fixedDepositsAccountData.status.rejected && !fixedDepositsAccountData.status.submittedAndPendingApproval + ) { +
    +

    {{ 'labels.heading.Account Overview' | translate }}

    + + + + + + + + + + + + +
    + }
    - + } - + @if (buttonConfig.options.length) { - - - + @for (option of buttonConfig.options; track option) { + + + + } - + } @@ -121,17 +125,19 @@ > {{ 'labels.inputs.Interest Rate Chart' | translate }} - - - {{ 'labels.inputs.Transactions' | translate }} - - + @if (showTransactions) { + + + {{ 'labels.inputs.Transactions' | translate }} + + + } {{ 'labels.inputs.Charges' | translate }} - - {{ 'labels.inputs.Standing Instructions' | translate }} - - + @if (fixedDepositsAccountData.clientId) { + + {{ 'labels.inputs.Standing Instructions' | translate }} + + } + @for (savingsDatatable of savingsDatatables; track savingsDatatable) { {{ savingsDatatable.registeredTableName }} - + } diff --git a/src/app/deposits/fixed-deposits/fixed-deposit-account-view/fixed-deposit-account-view.component.ts b/src/app/deposits/fixed-deposits/fixed-deposit-account-view/fixed-deposit-account-view.component.ts index efa82b7e0..151d52ceb 100644 --- a/src/app/deposits/fixed-deposits/fixed-deposit-account-view/fixed-deposit-account-view.component.ts +++ b/src/app/deposits/fixed-deposits/fixed-deposit-account-view/fixed-deposit-account-view.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { ActivatedRoute, Router, RouterLinkActive, RouterLink, RouterOutlet } from '@angular/router'; import { MatDialog } from '@angular/material/dialog'; @@ -25,7 +25,7 @@ import { MatCardContent } from '@angular/material/card'; import { MatTooltip } from '@angular/material/tooltip'; -import { NgClass, NgIf, NgFor, CurrencyPipe } from '@angular/common'; +import { NgClass, CurrencyPipe } from '@angular/common'; import { AccountNumberComponent } from '../../../shared/account-number/account-number.component'; import { MatIconButton } from '@angular/material/button'; import { MatMenuTrigger, MatMenu, MatMenuItem } from '@angular/material/menu'; @@ -67,6 +67,12 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class FixedDepositAccountViewComponent implements OnInit { + private route = inject(ActivatedRoute); + private router = inject(Router); + private fixedDepositsService = inject(FixedDepositsService); + private savingsService = inject(SavingsService); + dialog = inject(MatDialog); + /** Fixed Deposits Account Data */ fixedDepositsAccountData: any; /** Savings Data Tables */ @@ -86,13 +92,7 @@ export class FixedDepositAccountViewComponent implements OnInit { * @param {SavingsService} savingsService Savings Service * @param {MatDialog} dialog Mat Dialog */ - constructor( - private route: ActivatedRoute, - private router: Router, - private fixedDepositsService: FixedDepositsService, - private savingsService: SavingsService, - public dialog: MatDialog - ) { + constructor() { this.route.data.subscribe((data: { fixedDepositsAccountData: any; savingsDatatables: any }) => { this.fixedDepositsAccountData = data.fixedDepositsAccountData; this.savingsDatatables = data.savingsDatatables; diff --git a/src/app/deposits/fixed-deposits/fixed-deposit-account-view/general-tab/general-tab.component.html b/src/app/deposits/fixed-deposits/fixed-deposit-account-view/general-tab/general-tab.component.html index 79a6cc0f2..aaeaea70a 100644 --- a/src/app/deposits/fixed-deposits/fixed-deposit-account-view/general-tab/general-tab.component.html +++ b/src/app/deposits/fixed-deposits/fixed-deposit-account-view/general-tab/general-tab.component.html @@ -7,15 +7,19 @@ {{ 'labels.inputs.External Id' | translate }} - - - - - {{ 'labels.inputs.Not Available' | translate }} - + @if (fixedDepositsAccountData.externalId) { + + + + } + @if (!fixedDepositsAccountData.externalId) { + + {{ 'labels.inputs.Not Available' | translate }} + + } @@ -28,10 +32,12 @@ }} - - {{ 'labels.inputs.Closed On' | translate }} - {{ fixedDepositsAccountData.timeline.closedOnDate | dateFormat }} - + @if (fixedDepositsAccountData.timeline.closedOnDate) { + + {{ 'labels.inputs.Closed On' | translate }} + {{ fixedDepositsAccountData.timeline.closedOnDate | dateFormat }} + + } {{ 'labels.inputs.Field Officer' | translate }} @@ -56,14 +62,18 @@ }} - - {{ 'labels.inputs.Tax Group' | translate }} - {{ fixedDepositsAccountData.taxGroup.name }} - - - {{ 'labels.inputs.Maturity Instructions' | translate }} - {{ fixedDepositsAccountData.onAccountClosure.value | translateKey: 'catalogs' }} - + @if (fixedDepositsAccountData.withHoldTax) { + + {{ 'labels.inputs.Tax Group' | translate }} + {{ fixedDepositsAccountData.taxGroup.name }} + + } + @if (fixedDepositsAccountData.onAccountClosure) { + + {{ 'labels.inputs.Maturity Instructions' | translate }} + {{ fixedDepositsAccountData.onAccountClosure.value | translateKey: 'catalogs' }} + + }
    @@ -92,68 +102,74 @@ {{ 'labels.inputs.No. of Days in Year' | translate }} {{ fixedDepositsAccountData.interestCalculationDaysInYearType.value | translateKey: 'catalogs' }} - - {{ 'labels.inputs.Pre-cloure Penal' | translate }} - - {{ fixedDepositsAccountData.preClosurePenalInterest }} % on - {{ fixedDepositsAccountData.preClosurePenalInterestOnType.value | translateKey: 'catalogs' }} - - + @if (fixedDepositsAccountData.preClosurePenalApplicable) { + + {{ 'labels.inputs.Pre-cloure Penal' | translate }} + + {{ fixedDepositsAccountData.preClosurePenalInterest }} % on + {{ fixedDepositsAccountData.preClosurePenalInterestOnType.value | translateKey: 'catalogs' }} + + + }
    -
    -

    {{ 'labels.heading.Performance History' | translate }}

    - - - - - - - - - - - - - - - - - - - - - - - -
    {{ 'labels.inputs.Principal Amount' | translate }} - {{ fixedDepositsAccountData.depositAmount | currency: currency.code : 'symbol-narrow' : '1.2-2' }} -
    {{ 'labels.inputs.Maturity Amount' | translate }} - {{ fixedDepositsAccountData.maturityAmount | currency: currency.code : 'symbol-narrow' : '1.2-2' }} -
    {{ 'labels.inputs.Total Deposits' | translate }} - {{ fixedDepositsAccountData.summary.totalDeposits | currency: currency.code : 'symbol-narrow' : '1.2-2' }} -
    {{ 'labels.inputs.Total Withdrawals' | translate }} - {{ - fixedDepositsAccountData.summary.totalWithdrawals | currency: currency.code : 'symbol-narrow' : '1.2-2' - }} -
    {{ 'labels.inputs.Total Interest Earned' | translate }} - {{ - fixedDepositsAccountData.summary.totalInterestEarned - | currency: currency.code : 'symbol-narrow' : '1.2-2' - }} -
    -
    - - + @if (!fixedDepositsAccountData.status.rejected && !fixedDepositsAccountData.status.submittedAndPendingApproval) { +
    +

    {{ 'labels.heading.Performance History' | translate }}

    + + + + + + + + + + + @if (fixedDepositsAccountData.summary.totalDeposits) { + + + + + } + @if (fixedDepositsAccountData.summary.totalWithdrawals) { + + + + + } + @if (fixedDepositsAccountData.summary.totalInterestEarned >= 0) { + + + + + } + +
    {{ 'labels.inputs.Principal Amount' | translate }} + {{ fixedDepositsAccountData.depositAmount | currency: currency.code : 'symbol-narrow' : '1.2-2' }} +
    {{ 'labels.inputs.Maturity Amount' | translate }} + {{ fixedDepositsAccountData.maturityAmount | currency: currency.code : 'symbol-narrow' : '1.2-2' }} +
    {{ 'labels.inputs.Total Deposits' | translate }} + {{ + fixedDepositsAccountData.summary.totalDeposits | currency: currency.code : 'symbol-narrow' : '1.2-2' + }} +
    {{ 'labels.inputs.Total Withdrawals' | translate }} + {{ + fixedDepositsAccountData.summary.totalWithdrawals + | currency: currency.code : 'symbol-narrow' : '1.2-2' + }} +
    {{ 'labels.inputs.Total Interest Earned' | translate }} + {{ + fixedDepositsAccountData.summary.totalInterestEarned + | currency: currency.code : 'symbol-narrow' : '1.2-2' + }} +
    +
    + } @else {

    {{ 'labels.heading.Other Details' | translate }}

    @@ -173,6 +189,6 @@
    -
    + }
    diff --git a/src/app/deposits/fixed-deposits/fixed-deposit-account-view/general-tab/general-tab.component.ts b/src/app/deposits/fixed-deposits/fixed-deposit-account-view/general-tab/general-tab.component.ts index e099acfae..8dcb5a4e8 100644 --- a/src/app/deposits/fixed-deposits/fixed-deposit-account-view/general-tab/general-tab.component.ts +++ b/src/app/deposits/fixed-deposits/fixed-deposit-account-view/general-tab/general-tab.component.ts @@ -1,7 +1,7 @@ -import { Component } from '@angular/core'; +import { Component, inject } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; import { Currency } from 'app/shared/models/general.model'; -import { NgIf, CurrencyPipe } from '@angular/common'; +import { CurrencyPipe } from '@angular/common'; import { ExternalIdentifierComponent } from '../../../../shared/external-identifier/external-identifier.component'; import { DateFormatPipe } from '../../../../pipes/date-format.pipe'; import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; @@ -18,14 +18,14 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class GeneralTabComponent { + private route = inject(ActivatedRoute); + private router = inject(Router); + fixedDepositsAccountData: any; entityType: string; currency: Currency; - constructor( - private route: ActivatedRoute, - private router: Router - ) { + constructor() { this.route.parent.data.subscribe((data: { fixedDepositsAccountData: any }) => { this.fixedDepositsAccountData = data.fixedDepositsAccountData; this.currency = this.fixedDepositsAccountData.currency; diff --git a/src/app/deposits/fixed-deposits/fixed-deposit-account-view/interest-rate-chart-tab/interest-rate-chart-tab.component.ts b/src/app/deposits/fixed-deposits/fixed-deposit-account-view/interest-rate-chart-tab/interest-rate-chart-tab.component.ts index f17bfea1e..daff3ab57 100644 --- a/src/app/deposits/fixed-deposits/fixed-deposit-account-view/interest-rate-chart-tab/interest-rate-chart-tab.component.ts +++ b/src/app/deposits/fixed-deposits/fixed-deposit-account-view/interest-rate-chart-tab/interest-rate-chart-tab.component.ts @@ -1,5 +1,5 @@ // ** Angular Imports */ -import { Component } from '@angular/core'; +import { Component, inject } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; import { animate, state, style, transition, trigger } from '@angular/animations'; import { @@ -30,8 +30,8 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; trigger('expandChartSlab', [ state('collapsed', style({ height: '0px', minHeight: '0' })), state('expanded', style({ height: '*' })), - transition('expanded <=> collapsed', animate('225ms cubic-bezier(0.4, 0.0, 0.2, 1)'))]) - + transition('expanded <=> collapsed', animate('225ms cubic-bezier(0.4, 0.0, 0.2, 1)')) + ]) ], imports: [ ...STANDALONE_SHARED_IMPORTS, @@ -52,6 +52,8 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class InterestRateChartTabComponent { + private route = inject(ActivatedRoute); + /** Fixed Deposits Account Status */ status: any; /** Interest Rate Chart Data */ @@ -82,7 +84,7 @@ export class InterestRateChartTabComponent { * Retrieves fixed deposits account data from `resolve`. * @param {ActivatedRoute} route Activated Route. */ - constructor(private route: ActivatedRoute) { + constructor() { this.route.parent.data.subscribe((data: { fixedDepositsAccountData: any }) => { this.interestRateChartData = data.fixedDepositsAccountData.accountChart.chartSlabs; }); diff --git a/src/app/deposits/fixed-deposits/fixed-deposit-account-view/standing-instructions-tab/standing-instructions-tab.component.html b/src/app/deposits/fixed-deposits/fixed-deposit-account-view/standing-instructions-tab/standing-instructions-tab.component.html index c2ffe6141..53ed66d47 100644 --- a/src/app/deposits/fixed-deposits/fixed-deposit-account-view/standing-instructions-tab/standing-instructions-tab.component.html +++ b/src/app/deposits/fixed-deposits/fixed-deposit-account-view/standing-instructions-tab/standing-instructions-tab.component.html @@ -46,29 +46,33 @@ {{ 'labels.inputs.Actions' | translate }} - - - - - - + @if (instruction.status.value !== 'Deleted') { + + + + } + @if (instruction.status.value !== 'Deleted') { + + + + } - + } - + @if (buttonConfig.options.length) { - - - + @for (option of buttonConfig.options; track option) { + + + + } - + }
    @@ -129,7 +133,7 @@ > {{ 'labels.inputs.Interest Rate Chart' | translate }} - + @if (showTransactions) { {{ 'labels.inputs.Transactions' | translate }} - + } {{ 'labels.inputs.Charges' | translate }} - + @if (recurringDepositsAccountData.clientId) { {{ 'labels.inputs.Standing Instructions' | translate }} - - + } + @for (savingsDatatable of savingsDatatables; track savingsDatatable) { {{ savingsDatatable.registeredTableName }} - + } diff --git a/src/app/deposits/recurring-deposits/recurring-deposits-account-view/recurring-deposits-account-view.component.ts b/src/app/deposits/recurring-deposits/recurring-deposits-account-view/recurring-deposits-account-view.component.ts index 376662e62..6cc63b6f6 100644 --- a/src/app/deposits/recurring-deposits/recurring-deposits-account-view/recurring-deposits-account-view.component.ts +++ b/src/app/deposits/recurring-deposits/recurring-deposits-account-view/recurring-deposits-account-view.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { ActivatedRoute, Router, RouterLinkActive, RouterLink, RouterOutlet } from '@angular/router'; import { MatDialog } from '@angular/material/dialog'; @@ -24,7 +24,7 @@ import { MatCardContent } from '@angular/material/card'; import { MatTooltip } from '@angular/material/tooltip'; -import { NgClass, NgIf, NgFor, DecimalPipe, CurrencyPipe } from '@angular/common'; +import { NgClass, DecimalPipe, CurrencyPipe } from '@angular/common'; import { AccountNumberComponent } from '../../../shared/account-number/account-number.component'; import { MatIconButton } from '@angular/material/button'; import { MatMenuTrigger, MatMenu, MatMenuItem } from '@angular/material/menu'; @@ -67,6 +67,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class RecurringDepositsAccountViewComponent implements OnInit { + private route = inject(ActivatedRoute); + private router = inject(Router); + private recurringDepositsService = inject(RecurringDepositsService); + private savingsService = inject(SavingsService); + dialog = inject(MatDialog); + private translateService = inject(TranslateService); + /** RecurringDeposits Account Data */ recurringDepositsAccountData: any; /** Button Configuration */ @@ -86,14 +93,7 @@ export class RecurringDepositsAccountViewComponent implements OnInit { * @param {Router} router Router * @param {RecurringDepositsService} recurringDepositsService RecurringDeposits Service */ - constructor( - private route: ActivatedRoute, - private router: Router, - private recurringDepositsService: RecurringDepositsService, - private savingsService: SavingsService, - public dialog: MatDialog, - private translateService: TranslateService - ) { + constructor() { this.route.data.subscribe((data: { recurringDepositsAccountData: any; savingsDatatables: any }) => { this.recurringDepositsAccountData = data.recurringDepositsAccountData; this.charges = this.recurringDepositsAccountData.charges; diff --git a/src/app/deposits/recurring-deposits/recurring-deposits-account-view/standing-instructions-tab/standing-instructions-tab.component.html b/src/app/deposits/recurring-deposits/recurring-deposits-account-view/standing-instructions-tab/standing-instructions-tab.component.html index 5b109263a..30262fde0 100644 --- a/src/app/deposits/recurring-deposits/recurring-deposits-account-view/standing-instructions-tab/standing-instructions-tab.component.html +++ b/src/app/deposits/recurring-deposits/recurring-deposits-account-view/standing-instructions-tab/standing-instructions-tab.component.html @@ -46,30 +46,34 @@ {{ 'labels.inputs.Actions' | translate }} - - - - - - + @if (instruction.status.value !== 'Deleted') { + + + + } + @if (instruction.status.value !== 'Deleted') { + + + + } - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    {{ 'labels.inputs.Account No' | translate }}. - - {{ element.accountNo }} - {{ 'labels.inputs.Loan Account' | translate }}{{ element.productName }}{{ 'labels.inputs.Original Loan' | translate }}{{ element.originalLoan }}{{ 'labels.inputs.Loan Balance' | translate }}{{ element.loanBalance }}{{ 'labels.inputs.Amount Paid' | translate }}{{ element.amountPaid }}{{ 'labels.inputs.Type' | translate }} - - {{ 'labels.inputs.Actions' | translate }} - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    {{ 'labels.inputs.Account No' | translate }}. - - {{ element.accountNo }} - {{ 'labels.inputs.Loan Account' | translate }}{{ element.productName }}{{ 'labels.inputs.Original Loan' | translate }}{{ element.lastActiveTransactionDate | dateFormat }}{{ 'labels.inputs.Loan Balance' | translate }}{{ element.loanBalance }}{{ 'labels.inputs.Amount Paid' | translate }}{{ element.accountBalance }}{{ 'labels.inputs.Type' | translate }} - - {{ 'labels.inputs.Closed Date' | translate }}{{ element.timeline.closedOnDate | dateFormat }}
    - - -
    -
    -
    -

    {{ 'labels.heading.GSIM Account Overview' | translate }}

    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    {{ 'labels.inputs.GSIM Id' | translate }} - {{ element.gsimId }} - {{ 'labels.inputs.Account Number' | translate }}{{ element.accountNumber }}{{ 'labels.inputs.Product' | translate }}{{ element.childGSIMAccounts[0].productName }}{{ 'labels.inputs.Balance' | translate }}{{ element.parentBalance }}{{ 'labels.inputs.Status' | translate }}{{ element.savingsStatus }}
    -
    - -
    -
    -
    -

    {{ 'labels.heading.GLIM Loans Account Overview' | translate }}

    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    {{ 'labels.inputs.GLIM Id' | translate }} - {{ element.glimId }} - {{ 'labels.inputs.Account Number' | translate }}{{ element.accountNumber }}{{ 'labels.inputs.Product' | translate }}{{ element.childGLIMAccounts[0].productName }}{{ 'labels.inputs.Original Loan' | translate }}{{ element.parentPrincipalAmount }}{{ 'labels.inputs.Status' | translate }}{{ element.loanStatus }}
    -
    - -
    -
    -
    -

    {{ 'labels.heading.Saving Accounts' | translate }}

    -
    -
    -
    + } - - - - - - + @if (gsimAccounts) { +
    +
    +
    +

    {{ 'labels.heading.GSIM Account Overview' | translate }}

    +
    +
    + +
    {{ 'labels.inputs.Account No' | translate }}. - - {{ element.accountNo }} -
    + + + + + + + + + + + + + + + + + + + + + + +
    {{ 'labels.inputs.GSIM Id' | translate }} + {{ element.gsimId }} + {{ 'labels.inputs.Account Number' | translate }}{{ element.accountNumber }}{{ 'labels.inputs.Product' | translate }}{{ element.childGSIMAccounts[0].productName }}{{ 'labels.inputs.Balance' | translate }}{{ element.parentBalance }}{{ 'labels.inputs.Status' | translate }}{{ element.savingsStatus }}
    +
    + } - - {{ 'labels.inputs.Saving Account' | translate }} - {{ element.productName }} - + @if (glimAccounts) { +
    +
    +
    +

    {{ 'labels.heading.GLIM Loans Account Overview' | translate }}

    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    {{ 'labels.inputs.GLIM Id' | translate }} + {{ element.glimId }} + {{ 'labels.inputs.Account Number' | translate }}{{ element.accountNumber }}{{ 'labels.inputs.Product' | translate }}{{ element.childGLIMAccounts[0].productName }}{{ 'labels.inputs.Original Loan' | translate }}{{ element.parentPrincipalAmount }}{{ 'labels.inputs.Status' | translate }}{{ element.loanStatus }}
    +
    + } - - {{ 'labels.inputs.Last Active' | translate }} - {{ element.lastActiveTransactionDate | dateFormat }} - - - - {{ 'labels.inputs.Balance' | translate }} - {{ element.accountBalance }} - - - - {{ 'labels.inputs.Actions' | translate }} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    {{ 'labels.inputs.Account No' | translate }}. - - {{ element.accountNo }} - {{ 'labels.inputs.Saving Account' | translate }}{{ element.productName }}{{ 'labels.inputs.Closed Date' | translate }}{{ element.timeline.closedOnDate | dateFormat }}
    -
    + @if (savingAccounts) { +
    +
    +
    +

    {{ 'labels.heading.Saving Accounts' | translate }}

    +
    +
    + @if ((savingAccounts | accountsFilter: 'saving' : 'closed').length) { + + } +
    +
    + + @if (!showClosedSavingAccounts) { + + + + + + + + + + + + + + + + + + + + + + + +
    {{ 'labels.inputs.Account No' | translate }}. + + {{ element.accountNo }} + {{ 'labels.inputs.Saving Account' | translate }}{{ element.productName }}{{ 'labels.inputs.Last Active' | translate }}{{ element.lastActiveTransactionDate | dateFormat }}{{ 'labels.inputs.Balance' | translate }}{{ element.accountBalance }}{{ 'labels.inputs.Actions' | translate }} + @if (element.status.active) { + + } + @if (element.status.active) { + + } + @if (element.status.submittedAndPendingApproval) { + + } + @if (!element.status.submittedAndPendingApproval && !element.status.active) { + + } + @if (!element.status.submittedAndPendingApproval && !element.status.active) { + + } +
    + } + + @if (showClosedSavingAccounts) { + + + + + + + + + + + + + + + +
    {{ 'labels.inputs.Account No' | translate }}. + + {{ element.accountNo }} + {{ 'labels.inputs.Saving Account' | translate }}{{ element.productName }}{{ 'labels.inputs.Closed Date' | translate }}{{ element.timeline.closedOnDate | dateFormat }}
    + } +
    + } diff --git a/src/app/groups/groups-view/general-tab/general-tab.component.ts b/src/app/groups/groups-view/general-tab/general-tab.component.ts index 5177c01d1..5147e6932 100644 --- a/src/app/groups/groups-view/general-tab/general-tab.component.ts +++ b/src/app/groups/groups-view/general-tab/general-tab.component.ts @@ -1,7 +1,7 @@ /** Angular Imports */ -import { Component } from '@angular/core'; +import { Component, inject } from '@angular/core'; import { ActivatedRoute, RouterLink } from '@angular/router'; -import { NgIf, NgClass } from '@angular/common'; +import { NgClass } from '@angular/common'; import { MatTable, MatColumnDef, @@ -48,6 +48,9 @@ import { GroupsService } from '../../groups.service'; ] }) export class GeneralTabComponent { + private route = inject(ActivatedRoute); + private groupsService = inject(GroupsService); + /** Group's all accounts data */ groupAccountData: any; /** Group's loan accounts data */ @@ -124,10 +127,7 @@ export class GeneralTabComponent { /** Boolean for toggling savings accounts table */ showClosedSavingAccounts = false; - constructor( - private route: ActivatedRoute, - private groupsService: GroupsService - ) { + constructor() { this.route.data.subscribe( (data: { groupAccountsData: any; groupClientMembers: any; groupSummary: any; glimData: any; gsimData: any }) => { this.glimAccounts = data.glimData; diff --git a/src/app/groups/groups-view/group-actions/activate-group/activate-group.component.html b/src/app/groups/groups-view/group-actions/activate-group/activate-group.component.html index 1f2b0bf71..a8c8ff910 100644 --- a/src/app/groups/groups-view/group-actions/activate-group/activate-group.component.html +++ b/src/app/groups/groups-view/group-actions/activate-group/activate-group.component.html @@ -14,10 +14,12 @@ /> - - {{ 'labels.inputs.Activated On Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (activateGroupForm.controls.activationDate.hasError('required')) { + + {{ 'labels.inputs.Activated On Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } diff --git a/src/app/groups/groups-view/group-actions/activate-group/activate-group.component.ts b/src/app/groups/groups-view/group-actions/activate-group/activate-group.component.ts index 1b2859d81..4c17efe85 100644 --- a/src/app/groups/groups-view/group-actions/activate-group/activate-group.component.ts +++ b/src/app/groups/groups-view/group-actions/activate-group/activate-group.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, Validators, ReactiveFormsModule } from '@angular/forms'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; import { Dates } from 'app/core/utils/dates'; @@ -21,6 +21,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ActivateGroupComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private groupsService = inject(GroupsService); + private dateUtils = inject(Dates); + private route = inject(ActivatedRoute); + private router = inject(Router); + private settingsService = inject(SettingsService); + /** Minimum date allowed. */ minDate = new Date(2000, 0, 1); /** Maximum date allowed. */ @@ -38,14 +45,7 @@ export class ActivateGroupComponent implements OnInit { * @param {Router} router Router * @param {SettingsService} settingsService SettingsService */ - constructor( - private formBuilder: UntypedFormBuilder, - private groupsService: GroupsService, - private dateUtils: Dates, - private route: ActivatedRoute, - private router: Router, - private settingsService: SettingsService - ) { + constructor() { this.groupId = this.route.parent.snapshot.params['groupId']; } diff --git a/src/app/groups/groups-view/group-actions/attach-group-meeting/attach-group-meeting.component.html b/src/app/groups/groups-view/group-actions/attach-group-meeting/attach-group-meeting.component.html index f29856572..f22f6c594 100644 --- a/src/app/groups/groups-view/group-actions/attach-group-meeting/attach-group-meeting.component.html +++ b/src/app/groups/groups-view/group-actions/attach-group-meeting/attach-group-meeting.component.html @@ -15,54 +15,74 @@ /> - - {{ 'labels.inputs.Start Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (groupMeetingForm.controls.startDate.hasError('required')) { + + {{ 'labels.inputs.Start Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Repeats' | translate }}? - - {{ 'labels.inputs.Repetition Frequency' | translate }} - - - {{ option.value }} - - - - {{ 'labels.inputs.Repetition Frequency' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - + @if (groupMeetingForm.contains('frequency')) { + + {{ 'labels.inputs.Repetition Frequency' | translate }} + + @for (option of frequencyOptions; track option) { + + {{ option.value }} + + } + + @if (groupMeetingForm.controls.frequency.hasError('repeatsOnDay')) { + + {{ 'labels.inputs.Repetition Frequency' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + } - - {{ 'labels.inputs.Repetition Interval' | translate }} - - - {{ interval }} - - - - {{ 'labels.inputs.Repeition Interval' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - + @if (groupMeetingForm.contains('interval')) { + + {{ 'labels.inputs.Repetition Interval' | translate }} + + @for (interval of repetitionIntervals; track interval) { + + {{ interval }} + + } + + @if (groupMeetingForm.controls.interval.hasError('repeatsOnDay')) { + + {{ 'labels.inputs.Repeition Interval' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + } - - {{ 'labels.inputs.Repeats on Day' | translate }} - - - {{ day.value }} - - - - {{ 'labels.inputs.At least' | translate }} {{ 'labels.inputs.one' | translate }} - {{ 'labels.inputs.day must be selected' | translate }} - - + @if (groupMeetingForm.contains('repeatsOnDay')) { + + {{ 'labels.inputs.Repeats on Day' | translate }} + + @for (day of repeatsOnDays; track day) { + + {{ day.value }} + + } + + @if (groupMeetingForm.controls.repeatsOnDay.hasError('repeatsOnDay')) { + + {{ 'labels.inputs.At least' | translate }} {{ 'labels.inputs.one' | translate }} + {{ 'labels.inputs.day must be selected' | translate }} + + } + + } diff --git a/src/app/groups/groups-view/group-actions/attach-group-meeting/attach-group-meeting.component.ts b/src/app/groups/groups-view/group-actions/attach-group-meeting/attach-group-meeting.component.ts index 448d96549..861f21e0c 100644 --- a/src/app/groups/groups-view/group-actions/attach-group-meeting/attach-group-meeting.component.ts +++ b/src/app/groups/groups-view/group-actions/attach-group-meeting/attach-group-meeting.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, @@ -29,6 +29,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class AttachGroupMeetingComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private groupsService = inject(GroupsService); + private dateUtils = inject(Dates); + private route = inject(ActivatedRoute); + private router = inject(Router); + private settingsService = inject(SettingsService); + /** Minimum date allowed. */ minDate = new Date(2000, 0, 1); /** Maximum date allowed. */ @@ -55,14 +62,7 @@ export class AttachGroupMeetingComponent implements OnInit { * @param {Router} router Router * @param {SettingsService} settingsService SettingsService */ - constructor( - private formBuilder: UntypedFormBuilder, - private groupsService: GroupsService, - private dateUtils: Dates, - private route: ActivatedRoute, - private router: Router, - private settingsService: SettingsService - ) { + constructor() { this.route.data.subscribe((data: { groupActionData: any }) => { this.calendarTemplate = data.groupActionData; this.frequencyOptions = this.calendarTemplate.frequencyOptions; diff --git a/src/app/groups/groups-view/group-actions/close-group/close-group.component.html b/src/app/groups/groups-view/group-actions/close-group/close-group.component.html index 9094256ae..d700c3872 100644 --- a/src/app/groups/groups-view/group-actions/close-group/close-group.component.html +++ b/src/app/groups/groups-view/group-actions/close-group/close-group.component.html @@ -15,23 +15,29 @@ /> - - {{ 'labels.inputs.Closed On Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (closeGroupForm.controls.closureDate.hasError('required')) { + + {{ 'labels.inputs.Closed On Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Closure Reason' | translate }} - - {{ reason.name }} - + @for (reason of closureData; track reason) { + + {{ reason.name }} + + } - - {{ 'labels.inputs.Closure Reason' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (closeGroupForm.controls.closureReasonId.hasError('required')) { + + {{ 'labels.inputs.Closure Reason' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } diff --git a/src/app/groups/groups-view/group-actions/close-group/close-group.component.ts b/src/app/groups/groups-view/group-actions/close-group/close-group.component.ts index 2fe95c725..84d63d8e7 100644 --- a/src/app/groups/groups-view/group-actions/close-group/close-group.component.ts +++ b/src/app/groups/groups-view/group-actions/close-group/close-group.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, Validators, ReactiveFormsModule } from '@angular/forms'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; import { Dates } from 'app/core/utils/dates'; @@ -21,6 +21,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class CloseGroupComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private groupsService = inject(GroupsService); + private dateUtils = inject(Dates); + private route = inject(ActivatedRoute); + private router = inject(Router); + private settingsService = inject(SettingsService); + /** Minimum date allowed. */ minDate = new Date(2000, 0, 1); /** Maximum date allowed. */ @@ -40,14 +47,7 @@ export class CloseGroupComponent implements OnInit { * @param {Router} router Router * @param {SettingsService} settingsService SettingsService */ - constructor( - private formBuilder: UntypedFormBuilder, - private groupsService: GroupsService, - private dateUtils: Dates, - private route: ActivatedRoute, - private router: Router, - private settingsService: SettingsService - ) { + constructor() { this.route.data.subscribe((data: { groupActionData: any }) => { this.closureData = data.groupActionData.closureReasons; }); diff --git a/src/app/groups/groups-view/group-actions/edit-group-meeting-schedule/edit-group-meeting-schedule.component.html b/src/app/groups/groups-view/group-actions/edit-group-meeting-schedule/edit-group-meeting-schedule.component.html index 24820c657..2d3719841 100644 --- a/src/app/groups/groups-view/group-actions/edit-group-meeting-schedule/edit-group-meeting-schedule.component.html +++ b/src/app/groups/groups-view/group-actions/edit-group-meeting-schedule/edit-group-meeting-schedule.component.html @@ -6,14 +6,18 @@ {{ 'labels.inputs.Existing Meeting Date' | translate }} - - {{ date | dateFormat }} - + @for (date of nextMeetingDates; track date) { + + {{ date | dateFormat }} + + } - - {{ 'labels.inputs.Existing Meeting Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (groupEditMeetingScheduleForm.controls.presentMeetingDate.hasError('repeatsOnDay')) { + + {{ 'labels.inputs.Existing Meeting Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } @@ -28,10 +32,12 @@ /> - - {{ 'labels.inputs.Revised Meeting Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (groupEditMeetingScheduleForm.controls.newMeetingDate.hasError('required')) { + + {{ 'labels.inputs.Revised Meeting Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } diff --git a/src/app/groups/groups-view/group-actions/edit-group-meeting-schedule/edit-group-meeting-schedule.component.ts b/src/app/groups/groups-view/group-actions/edit-group-meeting-schedule/edit-group-meeting-schedule.component.ts index 9cd5d19a7..d01cdb810 100644 --- a/src/app/groups/groups-view/group-actions/edit-group-meeting-schedule/edit-group-meeting-schedule.component.ts +++ b/src/app/groups/groups-view/group-actions/edit-group-meeting-schedule/edit-group-meeting-schedule.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, Validators, FormControl, ReactiveFormsModule } from '@angular/forms'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; import { Dates } from 'app/core/utils/dates'; @@ -23,6 +23,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class EditGroupMeetingScheduleComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private groupsService = inject(GroupsService); + private dateUtils = inject(Dates); + private route = inject(ActivatedRoute); + private router = inject(Router); + private settingsService = inject(SettingsService); + /** Minimum date allowed. */ minDate = new Date(2000, 0, 1); /** Maximum date allowed. */ @@ -47,14 +54,7 @@ export class EditGroupMeetingScheduleComponent implements OnInit { * @param {Router} router Router * @param {SettingsService} settingsService SettingsService */ - constructor( - private formBuilder: UntypedFormBuilder, - private groupsService: GroupsService, - private dateUtils: Dates, - private route: ActivatedRoute, - private router: Router, - private settingsService: SettingsService - ) { + constructor() { this.route.data.subscribe((data: { groupActionData: any }) => { this.calendarTemplate = data.groupActionData; this.nextMeetingDates = this.calendarTemplate.nextTenRecurringDates; diff --git a/src/app/groups/groups-view/group-actions/edit-group-meeting/edit-group-meeting.component.html b/src/app/groups/groups-view/group-actions/edit-group-meeting/edit-group-meeting.component.html index 1059c5c3f..d3a057ce1 100644 --- a/src/app/groups/groups-view/group-actions/edit-group-meeting/edit-group-meeting.component.html +++ b/src/app/groups/groups-view/group-actions/edit-group-meeting/edit-group-meeting.component.html @@ -13,41 +13,55 @@ {{ 'labels.inputs.Repetition Frequency' | translate }} - - {{ option.value }} - + @for (option of frequencyOptions; track option) { + + {{ option.value }} + + } - - {{ 'labels.inputs.Repetition Frequency' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (groupEditMeetingForm.controls.frequency.hasError('repeatsOnDay')) { + + {{ 'labels.inputs.Repetition Frequency' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Repetition Interval' | translate }} - - {{ interval }} - + @for (interval of repetitionIntervals; track interval) { + + {{ interval }} + + } - - {{ 'labels.inputs.Repeition Interval' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (groupEditMeetingForm.controls.interval.hasError('repeatsOnDay')) { + + {{ 'labels.inputs.Repeition Interval' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } - - {{ 'labels.inputs.Repeats on Day' | translate }} - - - {{ day.value }} - - - - {{ 'labels.inputs.At least' | translate }} {{ 'labels.inputs.one' | translate }} - {{ 'labels.inputs.day must be selected' | translate }} - - + @if (groupEditMeetingForm.contains('repeatsOnDay')) { + + {{ 'labels.inputs.Repeats on Day' | translate }} + + @for (day of repeatsOnDays; track day) { + + {{ day.value }} + + } + + @if (groupEditMeetingForm.controls.repeatsOnDay.hasError('repeatsOnDay')) { + + {{ 'labels.inputs.At least' | translate }} {{ 'labels.inputs.one' | translate }} + {{ 'labels.inputs.day must be selected' | translate }} + + } + + } {{ 'labels.inputs.Above Changes are Effective from' | translate }} @@ -61,10 +75,12 @@ /> - - {{ 'labels.inputs.Changes Affection Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (groupEditMeetingForm.controls.startDate.hasError('required')) { + + {{ 'labels.inputs.Changes Affection Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ "labels.text.Repeats' and 'Repeats every" | translate }} diff --git a/src/app/groups/groups-view/group-actions/edit-group-meeting/edit-group-meeting.component.ts b/src/app/groups/groups-view/group-actions/edit-group-meeting/edit-group-meeting.component.ts index 0a19d79f7..bda97b43c 100644 --- a/src/app/groups/groups-view/group-actions/edit-group-meeting/edit-group-meeting.component.ts +++ b/src/app/groups/groups-view/group-actions/edit-group-meeting/edit-group-meeting.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, @@ -31,6 +31,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class EditGroupMeetingComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private groupsService = inject(GroupsService); + private dateUtils = inject(Dates); + private route = inject(ActivatedRoute); + private router = inject(Router); + private settingsService = inject(SettingsService); + /** Minimum date allowed. */ minDate = new Date(2000, 0, 1); /** Maximum date allowed. */ @@ -59,14 +66,7 @@ export class EditGroupMeetingComponent implements OnInit { * @param {Router} router Router * @param {SettingsService} settingsService SettingsService */ - constructor( - private formBuilder: UntypedFormBuilder, - private groupsService: GroupsService, - private dateUtils: Dates, - private route: ActivatedRoute, - private router: Router, - private settingsService: SettingsService - ) { + constructor() { this.route.data.subscribe((data: { groupActionData: any }) => { this.calendarTemplate = data.groupActionData; this.frequencyOptions = this.calendarTemplate.frequencyOptions; diff --git a/src/app/groups/groups-view/group-actions/group-actions.component.html b/src/app/groups/groups-view/group-actions/group-actions.component.html index 08ee40459..7f97c66f9 100644 --- a/src/app/groups/groups-view/group-actions/group-actions.component.html +++ b/src/app/groups/groups-view/group-actions/group-actions.component.html @@ -1,9 +1,27 @@ - - - - - - - - - +@if (actions['Assign Staff']) { + +} +@if (actions['Close']) { + +} +@if (actions['Activate']) { + +} +@if (actions['Attach Meeting']) { + +} +@if (actions['Attendance']) { + +} +@if (actions['Manage Members']) { + +} +@if (actions['Edit Meeting']) { + +} +@if (actions['Edit Meeting Schedule']) { + +} +@if (actions['Transfer Clients']) { + +} diff --git a/src/app/groups/groups-view/group-actions/group-actions.component.ts b/src/app/groups/groups-view/group-actions/group-actions.component.ts index a9e4a087f..4f1bd8042 100644 --- a/src/app/groups/groups-view/group-actions/group-actions.component.ts +++ b/src/app/groups/groups-view/group-actions/group-actions.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component } from '@angular/core'; +import { Component, inject } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; import { GroupAssignStaffComponent } from './group-assign-staff/group-assign-staff.component'; import { CloseGroupComponent } from './close-group/close-group.component'; @@ -33,6 +33,9 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class GroupActionsComponent { + private route = inject(ActivatedRoute); + private router = inject(Router); + /** Flag object to store possible actions and render appropriate UI to the user */ actions: { 'Assign Staff': boolean; @@ -60,10 +63,7 @@ export class GroupActionsComponent { * @param {ActivatedRoute} route Activated Route * @param {Router} router Router */ - constructor( - private route: ActivatedRoute, - private router: Router - ) { + constructor() { this.router.routeReuseStrategy.shouldReuseRoute = () => false; const action = this.route.snapshot.params['action']; if (action && action in this.actions) { diff --git a/src/app/groups/groups-view/group-actions/group-assign-staff/group-assign-staff.component.html b/src/app/groups/groups-view/group-actions/group-assign-staff/group-assign-staff.component.html index 6b3f7167a..cab8a4a62 100644 --- a/src/app/groups/groups-view/group-actions/group-assign-staff/group-assign-staff.component.html +++ b/src/app/groups/groups-view/group-actions/group-assign-staff/group-assign-staff.component.html @@ -6,14 +6,18 @@ {{ 'labels.inputs.Staff' | translate }} - - {{ staff.displayName }} - + @for (staff of staffData; track staff) { + + {{ staff.displayName }} + + } - - {{ 'labels.inputs.Staff' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (groupAssignStaffForm.controls.staffId.hasError('required')) { + + {{ 'labels.inputs.Staff' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } diff --git a/src/app/groups/groups-view/group-actions/group-assign-staff/group-assign-staff.component.ts b/src/app/groups/groups-view/group-actions/group-assign-staff/group-assign-staff.component.ts index 03049329c..e48d374f6 100644 --- a/src/app/groups/groups-view/group-actions/group-assign-staff/group-assign-staff.component.ts +++ b/src/app/groups/groups-view/group-actions/group-assign-staff/group-assign-staff.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, ReactiveFormsModule } from '@angular/forms'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; @@ -19,6 +19,11 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class GroupAssignStaffComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private groupsService = inject(GroupsService); + private route = inject(ActivatedRoute); + private router = inject(Router); + /** Group Assign Staff form. */ groupAssignStaffForm: UntypedFormGroup; /** Staff Data */ @@ -33,12 +38,7 @@ export class GroupAssignStaffComponent implements OnInit { * @param {ActivatedRoute} route Activated Route * @param {Router} router Router */ - constructor( - private formBuilder: UntypedFormBuilder, - private groupsService: GroupsService, - private route: ActivatedRoute, - private router: Router - ) { + constructor() { this.route.data.subscribe((data: { groupActionData: any }) => { this.groupData = data.groupActionData; }); diff --git a/src/app/groups/groups-view/group-actions/group-attendance/group-attendance.component.ts b/src/app/groups/groups-view/group-actions/group-attendance/group-attendance.component.ts index d64f0ec03..ba10632ba 100644 --- a/src/app/groups/groups-view/group-actions/group-attendance/group-attendance.component.ts +++ b/src/app/groups/groups-view/group-actions/group-attendance/group-attendance.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { MatDialog } from '@angular/material/dialog'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; import { UntypedFormControl, ReactiveFormsModule } from '@angular/forms'; @@ -64,6 +64,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class GroupAttendanceComponent implements OnInit { + private route = inject(ActivatedRoute); + private dateUtils = inject(Dates); + private router = inject(Router); + private groupsService = inject(GroupsService); + dialog = inject(MatDialog); + private settingsService = inject(SettingsService); + /** Members data. */ membersData: any; /** Group Data */ @@ -91,14 +98,7 @@ export class GroupAttendanceComponent implements OnInit { * @param {MatDialog} dialog Mat Dialog * @param {SettingsService} settingsService SettingsService */ - constructor( - private route: ActivatedRoute, - private dateUtils: Dates, - private router: Router, - private groupsService: GroupsService, - public dialog: MatDialog, - private settingsService: SettingsService - ) { + constructor() { this.route.data.subscribe((data: { groupActionData: any }) => { this.groupData = data.groupActionData; this.membersData = data.groupActionData.clientMembers; @@ -140,7 +140,6 @@ export class GroupAttendanceComponent implements OnInit { options: { label: 'value', value: 'id', data: this.attendanceTypeOptions }, required: false }) - ]; const data = { title: 'Assign Member Attendance', diff --git a/src/app/groups/groups-view/group-actions/group-transfer-clients/group-transfer-clients.component.html b/src/app/groups/groups-view/group-actions/group-transfer-clients/group-transfer-clients.component.html index be1ec2fce..d47f4184e 100644 --- a/src/app/groups/groups-view/group-actions/group-transfer-clients/group-transfer-clients.component.html +++ b/src/app/groups/groups-view/group-actions/group-transfer-clients/group-transfer-clients.component.html @@ -6,9 +6,11 @@ {{ 'labels.inputs.Select Client Members for Transfer' | translate }} - - {{ member.displayName }} - + @for (member of clientMembers; track member) { + + {{ member.displayName }} + + } @@ -23,50 +25,58 @@ {{ 'labels.inputs.Destination Group' | translate }} - - {{ 'labels.inputs.Destination Group' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (transferClientsForm.controls.destinationGroupId.hasError('required')) { + + {{ 'labels.inputs.Destination Group' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } - - {{ group.name }} - + @for (group of groupsData; track group) { + + {{ group.name }} + + } -
    -
    -
    {{ 'labels.inputs.Destination Group Details' | translate }}
    -
    -
    -
    {{ 'labels.inputs.name' | translate }}
    -
    {{ transferClientsForm.get('destinationGroupId').value.name }}
    -
    -
    -
    {{ 'labels.inputs.Id' | translate }}
    -
    {{ transferClientsForm.get('destinationGroupId').value.id }}
    -
    -
    -
    {{ 'labels.inputs.Activation Date' | translate }}
    -
    - {{ (transferClientsForm.get('destinationGroupId').value.activationDate | dateFormat) || 'Not Activated' }} + @if (transferClientsForm.get('destinationGroupId').value?.id) { +
    +
    +
    {{ 'labels.inputs.Destination Group Details' | translate }}
    +
    +
    +
    {{ 'labels.inputs.name' | translate }}
    +
    {{ transferClientsForm.get('destinationGroupId').value.name }}
    +
    +
    +
    {{ 'labels.inputs.Id' | translate }}
    +
    {{ transferClientsForm.get('destinationGroupId').value.id }}
    +
    +
    +
    {{ 'labels.inputs.Activation Date' | translate }}
    +
    + {{ + (transferClientsForm.get('destinationGroupId').value.activationDate | dateFormat) || 'Not Activated' + }} +
    +
    +
    +
    {{ 'labels.inputs.Staff' | translate }}
    +
    + {{ transferClientsForm.get('destinationGroupId').value.staffName || 'Unassigned' }} +
    +
    +
    +
    {{ 'labels.inputs.External Id' | translate }}
    +
    + {{ transferClientsForm.get('destinationGroupId').value.externalId || 'Unassigned' }} +
    -
    -
    {{ 'labels.inputs.Staff' | translate }}
    -
    - {{ transferClientsForm.get('destinationGroupId').value.staffName || 'Unassigned' }} -
    -
    -
    -
    {{ 'labels.inputs.External Id' | translate }}
    -
    - {{ transferClientsForm.get('destinationGroupId').value.externalId || 'Unassigned' }} -
    -
    -
    + } diff --git a/src/app/groups/groups-view/group-actions/group-transfer-clients/group-transfer-clients.component.ts b/src/app/groups/groups-view/group-actions/group-transfer-clients/group-transfer-clients.component.ts index 83fb81f33..0abc55982 100644 --- a/src/app/groups/groups-view/group-actions/group-transfer-clients/group-transfer-clients.component.ts +++ b/src/app/groups/groups-view/group-actions/group-transfer-clients/group-transfer-clients.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, AfterViewInit } from '@angular/core'; +import { Component, OnInit, AfterViewInit, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, FormControl, Validators, ReactiveFormsModule } from '@angular/forms'; import { Router, ActivatedRoute, RouterLink } from '@angular/router'; @@ -27,6 +27,12 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class GroupTransferClientsComponent implements OnInit, AfterViewInit { + private formBuilder = inject(UntypedFormBuilder); + private route = inject(ActivatedRoute); + private router = inject(Router); + private groupsService = inject(GroupsService); + private settingsService = inject(SettingsService); + /** Transfer Clients form. */ transferClientsForm: UntypedFormGroup; /** Group Data */ @@ -46,13 +52,7 @@ export class GroupTransferClientsComponent implements OnInit, AfterViewInit { * @param {GroupsService} groupsService GroupsService. * @param {SettingsService} settingsService SettingsService */ - constructor( - private formBuilder: UntypedFormBuilder, - private route: ActivatedRoute, - private router: Router, - private groupsService: GroupsService, - private settingsService: SettingsService - ) { + constructor() { this.route.data.subscribe((data: { groupActionData: any }) => { this.groupData = data.groupActionData; this.clientMembers = this.groupData.clientMembers; diff --git a/src/app/groups/groups-view/group-actions/manage-group-members/manage-group-members.component.html b/src/app/groups/groups-view/group-actions/manage-group-members/manage-group-members.component.html index 6f94525a1..4a79fa6ed 100644 --- a/src/app/groups/groups-view/group-actions/manage-group-members/manage-group-members.component.html +++ b/src/app/groups/groups-view/group-actions/manage-group-members/manage-group-members.component.html @@ -6,9 +6,11 @@ - - {{ client.displayName }} - + @for (client of clientsData; track client) { + + {{ client.displayName }} + + }
    @@ -36,20 +38,24 @@

    {{ 'labels.heading.Client Members' | translate }}

    - -
    - {{ client.displayName }} -
    - -
    -
    + @if (clientMembers?.length) { + + @for (client of clientMembers; track client; let i = $index) { +
    + {{ client.displayName }} +
    + +
    + } +
    + }
    diff --git a/src/app/groups/groups-view/group-actions/manage-group-members/manage-group-members.component.ts b/src/app/groups/groups-view/group-actions/manage-group-members/manage-group-members.component.ts index 5abfa5223..50cac182f 100644 --- a/src/app/groups/groups-view/group-actions/manage-group-members/manage-group-members.component.ts +++ b/src/app/groups/groups-view/group-actions/manage-group-members/manage-group-members.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, AfterViewInit } from '@angular/core'; +import { Component, OnInit, AfterViewInit, inject } from '@angular/core'; import { FormGroup, FormBuilder, UntypedFormControl, Validators, ReactiveFormsModule } from '@angular/forms'; import { Router, ActivatedRoute } from '@angular/router'; @@ -38,6 +38,11 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ManageGroupMembersComponent implements AfterViewInit { + private route = inject(ActivatedRoute); + private groupsService = inject(GroupsService); + private clientsService = inject(ClientsService); + dialog = inject(MatDialog); + /** Group Data */ groupData: any; /** Client data. */ @@ -54,12 +59,7 @@ export class ManageGroupMembersComponent implements AfterViewInit { * @param {ClientsService} clientsService Clients Service * @param {MatDialog} dialog Mat Dialog */ - constructor( - private route: ActivatedRoute, - private groupsService: GroupsService, - private clientsService: ClientsService, - public dialog: MatDialog - ) { + constructor() { this.route.data.subscribe((data: { groupActionData: any }) => { this.groupData = data.groupActionData; this.clientMembers = data.groupActionData.clientMembers || []; diff --git a/src/app/groups/groups-view/groups-view.component.html b/src/app/groups/groups-view/groups-view.component.html index 35183287c..80c92d9fb 100644 --- a/src/app/groups/groups-view/groups-view.component.html +++ b/src/app/groups/groups-view/groups-view.component.html @@ -35,22 +35,28 @@ {{ 'labels.inputs.Office Name' | translate }} : {{ groupViewData.officeName }}
    {{ 'labels.inputs.Activation Date' | translate }} : {{ groupViewData.activationDate ? (groupViewData.activationDate | dateFormat) : 'Not Activated' }}
    - - {{ 'labels.inputs.Closure Date' | translate }} : - {{ groupViewData.timeline.closedOnDate | dateFormat }} - + @if (!groupViewData.active) { + + {{ 'labels.inputs.Closure Date' | translate }} : + {{ groupViewData.timeline.closedOnDate | dateFormat }} + + }
    -
    -

    - {{ 'labels.inputs.Next Meeting on' | translate }}: - {{ groupViewData.collectionMeetingCalendar?.nextTenRecurringDates[0] | dateFormat }} -
    - {{ 'labels.inputs.Meeting Frequency' | translate }}: - {{ groupViewData.collectionMeetingCalendar?.frequency.value | lowercase }} -

    -
    - + @if (groupViewData.collectionMeetingCalendar) { +
    +

    + {{ 'labels.inputs.Next Meeting on' | translate }}: + {{ groupViewData.collectionMeetingCalendar?.nextTenRecurringDates[0] | dateFormat }} + @if (editMeeting) { + + } +
    + {{ 'labels.inputs.Meeting Frequency' | translate }}: + {{ groupViewData.collectionMeetingCalendar?.frequency.value | lowercase }} +

    +
    + } @else {

    {{ 'labels.inputs.Next Meeting on' | translate }}: {{ 'labels.inputs.Unassigned' | translate }} @@ -58,20 +64,22 @@ {{ 'labels.inputs.Meeting Frequency' | translate }}: {{ 'labels.inputs.N/A' | translate }}

    -
    + }
    - - - + @if (!(groupViewData.status.value === 'Active')) { + + + + } - + @if (groupViewData.active) { + + } - - + @if (groupViewData.clientMembers) { + + + } - - - - - - + @if (groupViewData.clientMembers) { + + + + } + @if (groupViewData.clientMembers) { + + + + } - - - {{ 'labels.buttons.Attendance' | translate }} - - - - - - - + } + @if (!groupViewData.staffId) { + + + } + @if (groupViewData.staffId) { + + + } + @if ( + !(groupViewData.centerId || groupViewData.collectionMeetingCalendar) && + groupViewData.status.value === 'Active' + ) { + + + } @@ -206,18 +228,20 @@ > {{ 'labels.inputs.Committee' | translate }} - - - {{ groupDatatable.registeredTableName }} - - + @for (groupDatatable of groupDatatables; track groupDatatable) { + + + {{ groupDatatable.registeredTableName }} + + + } diff --git a/src/app/groups/groups-view/groups-view.component.ts b/src/app/groups/groups-view/groups-view.component.ts index 10113c285..5a04e055c 100644 --- a/src/app/groups/groups-view/groups-view.component.ts +++ b/src/app/groups/groups-view/groups-view.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component } from '@angular/core'; +import { Component, inject } from '@angular/core'; import { ActivatedRoute, Router, RouterLink, RouterLinkActive, RouterOutlet } from '@angular/router'; import { MatDialog } from '@angular/material/dialog'; @@ -18,7 +18,7 @@ import { MatCardSubtitle, MatCardContent } from '@angular/material/card'; -import { NgClass, NgIf, NgFor, LowerCasePipe } from '@angular/common'; +import { NgClass, LowerCasePipe } from '@angular/common'; import { MatTooltip } from '@angular/material/tooltip'; import { MatIconButton } from '@angular/material/button'; import { MatMenuTrigger, MatMenu, MatMenuItem } from '@angular/material/menu'; @@ -62,6 +62,11 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class GroupsViewComponent { + private route = inject(ActivatedRoute); + private groupsService = inject(GroupsService); + private router = inject(Router); + dialog = inject(MatDialog); + /** Group view data */ groupViewData: any; /** Group datatables data */ @@ -74,12 +79,7 @@ export class GroupsViewComponent { * @param {Router} router Router * @param {MatDialog} dialog Dialog */ - constructor( - private route: ActivatedRoute, - private groupsService: GroupsService, - private router: Router, - public dialog: MatDialog - ) { + constructor() { this.route.data.subscribe((data: { groupViewData: any; groupDatatables: any }) => { this.groupViewData = data.groupViewData; this.groupDatatables = data.groupDatatables; diff --git a/src/app/groups/groups-view/notes-tab/notes-tab.component.ts b/src/app/groups/groups-view/notes-tab/notes-tab.component.ts index 69accdb06..2c58c6495 100644 --- a/src/app/groups/groups-view/notes-tab/notes-tab.component.ts +++ b/src/app/groups/groups-view/notes-tab/notes-tab.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; /** Custom Services */ @@ -23,6 +23,10 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class NotesTabComponent implements OnInit { + private route = inject(ActivatedRoute); + private authenticationService = inject(AuthenticationService); + private groupsService = inject(GroupsService); + /** Group ID */ entityId: string; /** Username */ @@ -36,11 +40,7 @@ export class NotesTabComponent implements OnInit { * @param {GroupsService} groupsService Groups Service * @param {AuthenticationService} authenticationService Authentication Service. */ - constructor( - private route: ActivatedRoute, - private authenticationService: AuthenticationService, - private groupsService: GroupsService - ) { + constructor() { this.entityId = this.route.parent.snapshot.params['groupId']; this.addNote = this.addNote.bind(this); } diff --git a/src/app/groups/groups.component.ts b/src/app/groups/groups.component.ts index e6779b49e..22add54ce 100644 --- a/src/app/groups/groups.component.ts +++ b/src/app/groups/groups.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, ViewChild, AfterViewInit } from '@angular/core'; +import { Component, OnInit, ViewChild, AfterViewInit, inject } from '@angular/core'; import { MatCheckbox } from '@angular/material/checkbox'; import { MatPaginator } from '@angular/material/paginator'; @@ -62,6 +62,8 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class GroupsComponent implements OnInit, AfterViewInit { + private groupsService = inject(GroupsService); + @ViewChild('showClosedGroups', { static: true }) showClosedGroups: MatCheckbox; /** Name form control. */ @@ -89,11 +91,6 @@ export class GroupsComponent implements OnInit, AfterViewInit { /** Sorter for groups table. */ @ViewChild(MatSort, { static: true }) sort: MatSort; - /** - * @param {GroupsService} groupsService Groups Service - */ - constructor(private groupsService: GroupsService) {} - ngOnInit() { this.getGroups(); } diff --git a/src/app/groups/groups.service.ts b/src/app/groups/groups.service.ts index 07ab6f148..5788befaa 100644 --- a/src/app/groups/groups.service.ts +++ b/src/app/groups/groups.service.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { HttpClient, HttpParams } from '@angular/common/http'; /** rxjs Imports */ @@ -12,10 +12,7 @@ import { Observable } from 'rxjs'; providedIn: 'root' }) export class GroupsService { - /** - * @param {HttpClient} http Http Client to send requests. - */ - constructor(private http: HttpClient) {} + private http = inject(HttpClient); /** * @param {any} filterBy Properties by which entries should be filtered. diff --git a/src/app/home/dashboard/amount-collected-pie/amount-collected-pie.component.html b/src/app/home/dashboard/amount-collected-pie/amount-collected-pie.component.html index b76a97a6f..1eac8d8cd 100644 --- a/src/app/home/dashboard/amount-collected-pie/amount-collected-pie.component.html +++ b/src/app/home/dashboard/amount-collected-pie/amount-collected-pie.component.html @@ -7,9 +7,11 @@ {{ 'labels.inputs.Office' | translate }} - - {{ office.name }} - + @for (office of officeData; track office) { + + {{ office.name }} + + } @@ -21,8 +23,10 @@
    -
    -

    {{ 'labels.text.No Data' | translate }}

    -
    + @if (showFallback) { +
    +

    {{ 'labels.text.No Data' | translate }}

    +
    + } diff --git a/src/app/home/dashboard/amount-collected-pie/amount-collected-pie.component.ts b/src/app/home/dashboard/amount-collected-pie/amount-collected-pie.component.ts index 444ff0775..e064920b4 100644 --- a/src/app/home/dashboard/amount-collected-pie/amount-collected-pie.component.ts +++ b/src/app/home/dashboard/amount-collected-pie/amount-collected-pie.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormControl, ReactiveFormsModule } from '@angular/forms'; import { ActivatedRoute } from '@angular/router'; @@ -10,7 +10,7 @@ import { HomeService } from '../../home.service'; import { Chart, registerables } from 'chart.js'; import { MatCard, MatCardHeader, MatCardContent } from '@angular/material/card'; import { FaIconComponent } from '@fortawesome/angular-fontawesome'; -import { NgFor, NgStyle, NgIf } from '@angular/common'; +import { NgStyle } from '@angular/common'; import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; // Register Chart.js components @@ -31,6 +31,9 @@ Chart.register(...registerables); ] }) export class AmountCollectedPieComponent implements OnInit { + private homeService = inject(HomeService); + private route = inject(ActivatedRoute); + /** Static Form control for office Id */ officeId = new UntypedFormControl(); /** Office Data */ @@ -47,10 +50,7 @@ export class AmountCollectedPieComponent implements OnInit { * @param {HomeService} homeService Home Service. * @param {ActivatedRoute} route Activated Route. */ - constructor( - private homeService: HomeService, - private route: ActivatedRoute - ) { + constructor() { this.route.data.subscribe((data: { offices: any }) => { this.officeData = data.offices; }); diff --git a/src/app/home/dashboard/amount-disbursed-pie/amount-disbursed-pie.component.html b/src/app/home/dashboard/amount-disbursed-pie/amount-disbursed-pie.component.html index 50a28f208..8cf27909c 100644 --- a/src/app/home/dashboard/amount-disbursed-pie/amount-disbursed-pie.component.html +++ b/src/app/home/dashboard/amount-disbursed-pie/amount-disbursed-pie.component.html @@ -7,9 +7,11 @@ {{ 'labels.inputs.Office' | translate }} - - {{ office.name }} - + @for (office of officeData; track office) { + + {{ office.name }} + + } @@ -21,8 +23,10 @@
    -
    -

    {{ 'labels.text.No Data' | translate }}

    -
    + @if (showFallback) { +
    +

    {{ 'labels.text.No Data' | translate }}

    +
    + } diff --git a/src/app/home/dashboard/amount-disbursed-pie/amount-disbursed-pie.component.ts b/src/app/home/dashboard/amount-disbursed-pie/amount-disbursed-pie.component.ts index 826d8eeda..43a0f5b08 100644 --- a/src/app/home/dashboard/amount-disbursed-pie/amount-disbursed-pie.component.ts +++ b/src/app/home/dashboard/amount-disbursed-pie/amount-disbursed-pie.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormControl, ReactiveFormsModule } from '@angular/forms'; import { ActivatedRoute } from '@angular/router'; @@ -10,7 +10,7 @@ import { HomeService } from '../../home.service'; import { Chart, registerables } from 'chart.js'; import { MatCard, MatCardHeader, MatCardContent } from '@angular/material/card'; import { FaIconComponent } from '@fortawesome/angular-fontawesome'; -import { NgFor, NgStyle, NgIf } from '@angular/common'; +import { NgStyle } from '@angular/common'; import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; // Register Chart.js components @@ -31,6 +31,9 @@ Chart.register(...registerables); ] }) export class AmountDisbursedPieComponent implements OnInit { + private homeService = inject(HomeService); + private route = inject(ActivatedRoute); + /** Static Form control for office Id */ officeId = new UntypedFormControl(); /** Office Data */ @@ -47,10 +50,7 @@ export class AmountDisbursedPieComponent implements OnInit { * @param {HomeService} homeService Home Service. * @param {ActivatedRoute} route Activated Route. */ - constructor( - private homeService: HomeService, - private route: ActivatedRoute - ) { + constructor() { this.route.data.subscribe((data: { offices: any }) => { this.officeData = data.offices; }); diff --git a/src/app/home/dashboard/client-trends-bar/client-trends-bar.component.html b/src/app/home/dashboard/client-trends-bar/client-trends-bar.component.html index f203a7bb3..3d7d6c60b 100644 --- a/src/app/home/dashboard/client-trends-bar/client-trends-bar.component.html +++ b/src/app/home/dashboard/client-trends-bar/client-trends-bar.component.html @@ -7,9 +7,11 @@ {{ 'labels.inputs.Office' | translate }} - - {{ office.name }} - + @for (office of officeData; track office) { + + {{ office.name }} + + } diff --git a/src/app/home/dashboard/client-trends-bar/client-trends-bar.component.ts b/src/app/home/dashboard/client-trends-bar/client-trends-bar.component.ts index 0fc628ffa..e323a1014 100644 --- a/src/app/home/dashboard/client-trends-bar/client-trends-bar.component.ts +++ b/src/app/home/dashboard/client-trends-bar/client-trends-bar.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormControl, ReactiveFormsModule } from '@angular/forms'; import { ActivatedRoute } from '@angular/router'; @@ -15,7 +15,7 @@ import { Dates } from 'app/core/utils/dates'; import { Chart, registerables } from 'chart.js'; import { MatCard, MatCardHeader, MatCardContent } from '@angular/material/card'; import { FaIconComponent } from '@fortawesome/angular-fontawesome'; -import { NgFor, NgStyle } from '@angular/common'; +import { NgStyle } from '@angular/common'; import { MatButtonToggleGroup, MatButtonToggle } from '@angular/material/button-toggle'; import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; @@ -39,6 +39,10 @@ Chart.register(...registerables); ] }) export class ClientTrendsBarComponent implements OnInit { + private homeService = inject(HomeService); + private route = inject(ActivatedRoute); + private dateUtils = inject(Dates); + /** Static Form control for office Id */ officeId = new UntypedFormControl(); /** Static Form control for time scale */ @@ -56,11 +60,7 @@ export class ClientTrendsBarComponent implements OnInit { * @param {ActivatedRoute} route Activated Route * @param {Dates} dateUtils Date Utils */ - constructor( - private homeService: HomeService, - private route: ActivatedRoute, - private dateUtils: Dates - ) { + constructor() { this.route.data.subscribe((data: { offices: any }) => { this.officeData = data.offices; }); diff --git a/src/app/home/dashboard/dashboard.component.html b/src/app/home/dashboard/dashboard.component.html index a52d25375..17f72d402 100644 --- a/src/app/home/dashboard/dashboard.component.html +++ b/src/app/home/dashboard/dashboard.component.html @@ -8,9 +8,11 @@
    - - {{ activity.activity }} - + @for (activity of filteredActivities | async; track activity) { + + {{ activity.activity }} + + } diff --git a/src/app/home/dashboard/dashboard.component.ts b/src/app/home/dashboard/dashboard.component.ts index 562a7583a..fe922b27f 100644 --- a/src/app/home/dashboard/dashboard.component.ts +++ b/src/app/home/dashboard/dashboard.component.ts @@ -1,12 +1,12 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormControl, ReactiveFormsModule } from '@angular/forms'; import { Router, RouterLink } from '@angular/router'; import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; import { activities } from '../activities'; import { MatAutocompleteTrigger, MatAutocomplete, MatOption } from '@angular/material/autocomplete'; -import { NgFor, AsyncPipe } from '@angular/common'; +import { AsyncPipe } from '@angular/common'; import { ClientTrendsBarComponent } from './client-trends-bar/client-trends-bar.component'; import { AmountDisbursedPieComponent } from './amount-disbursed-pie/amount-disbursed-pie.component'; import { AmountCollectedPieComponent } from './amount-collected-pie/amount-collected-pie.component'; @@ -29,6 +29,8 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class DashboardComponent implements OnInit { + private router = inject(Router); + /** Array of all user activities */ userActivity: string[]; /** Array of most recent user activities */ @@ -45,7 +47,7 @@ export class DashboardComponent implements OnInit { /** * Gets user activities from local storage. */ - constructor(private router: Router) { + constructor() { this.userActivity = JSON.parse(localStorage.getItem('mifosXLocation')); } diff --git a/src/app/home/home-routing.module.ts b/src/app/home/home-routing.module.ts index ccf5a3028..22fd76638 100644 --- a/src/app/home/home-routing.module.ts +++ b/src/app/home/home-routing.module.ts @@ -34,7 +34,6 @@ const routes: Routes = [ } } ]) - ]; /** diff --git a/src/app/home/home.component.html b/src/app/home/home.component.html index 4acbdf297..9f1fc3d9d 100644 --- a/src/app/home/home.component.html +++ b/src/app/home/home.component.html @@ -22,9 +22,11 @@ - - {{ activity.activity }} - + @for (activity of filteredActivities | async; track activity) { + + {{ activity.activity }} + + } @@ -37,22 +39,24 @@ - - + @if (prev) { + + } + @if (next) { + + } diff --git a/src/app/home/home.component.ts b/src/app/home/home.component.ts index 4537e1650..52b375000 100644 --- a/src/app/home/home.component.ts +++ b/src/app/home/home.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, TemplateRef, ElementRef, ViewChild, AfterViewInit } from '@angular/core'; +import { Component, OnInit, TemplateRef, ElementRef, ViewChild, AfterViewInit, inject } from '@angular/core'; import { ActivatedRoute, Router, NavigationEnd, RouterLink } from '@angular/router'; import { UntypedFormControl, ReactiveFormsModule } from '@angular/forms'; import { MatDialog } from '@angular/material/dialog'; @@ -22,7 +22,7 @@ import { NextStepDialogComponent } from '../configuration-wizard/next-step-dialo import { FaIconComponent } from '@fortawesome/angular-fontawesome'; import { MatCard, MatCardHeader, MatCardTitle, MatCardContent, MatCardImage } from '@angular/material/card'; import { MatAutocompleteTrigger, MatAutocomplete, MatOption } from '@angular/material/autocomplete'; -import { NgFor, NgIf, AsyncPipe } from '@angular/common'; +import { AsyncPipe } from '@angular/common'; import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; /** @@ -44,6 +44,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class HomeComponent implements OnInit, AfterViewInit { + private authenticationService = inject(AuthenticationService); + private activatedRoute = inject(ActivatedRoute); + private router = inject(Router); + private dialog = inject(MatDialog); + private configurationWizardService = inject(ConfigurationWizardService); + private popoverService = inject(PopoverService); + /** Username of authenticated user. */ username: string; /** Activity Form. */ @@ -64,23 +71,6 @@ export class HomeComponent implements OnInit, AfterViewInit { /* Template for popover on search activity */ @ViewChild('templateSearchActivity', { static: false }) templateSearchActivity: TemplateRef; - /** - * @param {AuthenticationService} authenticationService Authentication Service. - * @param {ActivatedRoute} activatedRoute ActivatedRoute. - * @param {Router} router Router. - * @param {MatDialog} dialog MatDialog. - * @param {ConfigurationWizardService} configurationWizardService ConfigurationWizard Service. - * @param {PopoverService} popoverService PopoverService. - */ - constructor( - private authenticationService: AuthenticationService, - private activatedRoute: ActivatedRoute, - private router: Router, - private dialog: MatDialog, - private configurationWizardService: ConfigurationWizardService, - private popoverService: PopoverService - ) {} - /** * Sets the username of the authenticated user. * Set Form. diff --git a/src/app/home/home.service.ts b/src/app/home/home.service.ts index 6c76862d7..3a94e0460 100644 --- a/src/app/home/home.service.ts +++ b/src/app/home/home.service.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { HttpClient, HttpParams } from '@angular/common/http'; /** rxjs Imports */ @@ -12,10 +12,7 @@ import { Observable } from 'rxjs'; providedIn: 'root' }) export class HomeService { - /** - * @param {HttpClient} http Http Client to send requests. - */ - constructor(private http: HttpClient) {} + private http = inject(HttpClient); /** * @param {number} officeId Office Id. diff --git a/src/app/home/timeout-dialog/session-timeout-dialog.component.ts b/src/app/home/timeout-dialog/session-timeout-dialog.component.ts index b7bc6c65e..530debf97 100644 --- a/src/app/home/timeout-dialog/session-timeout-dialog.component.ts +++ b/src/app/home/timeout-dialog/session-timeout-dialog.component.ts @@ -1,4 +1,4 @@ -import { Component } from '@angular/core'; +import { Component, inject } from '@angular/core'; import { MatDialogRef, MatDialogTitle, @@ -23,5 +23,5 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class SessionTimeoutDialogComponent { - constructor(public dialogRef: MatDialogRef) {} + dialogRef = inject>(MatDialogRef); } diff --git a/src/app/home/warning-dialog/warning-dialog.component.ts b/src/app/home/warning-dialog/warning-dialog.component.ts index d6754af54..5cfe988e2 100644 --- a/src/app/home/warning-dialog/warning-dialog.component.ts +++ b/src/app/home/warning-dialog/warning-dialog.component.ts @@ -1,4 +1,4 @@ -import { Component } from '@angular/core'; +import { Component, inject } from '@angular/core'; import { MatDialogRef, MatDialogTitle, @@ -24,11 +24,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class WarningDialogComponent { + dialogRef = inject>(MatDialogRef); + title: string; content: string; buttonText: string; - constructor(public dialogRef: MatDialogRef) { + constructor() { this.title = environment.warningDialog.title; this.content = environment.warningDialog.content; this.buttonText = environment.warningDialog.buttonText; diff --git a/src/app/loans/common-resolvers/external-asset-owner-active-transfer.resolver.ts b/src/app/loans/common-resolvers/external-asset-owner-active-transfer.resolver.ts index 50d22824e..9620c2396 100644 --- a/src/app/loans/common-resolvers/external-asset-owner-active-transfer.resolver.ts +++ b/src/app/loans/common-resolvers/external-asset-owner-active-transfer.resolver.ts @@ -1,4 +1,4 @@ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; import { Observable } from 'rxjs'; import { ExternalAssetOwnerService } from '../services/external-asset-owner.service'; @@ -7,10 +7,7 @@ import { ExternalAssetOwnerService } from '../services/external-asset-owner.serv providedIn: 'root' }) export class ExternalAssetOwnerActiveTransferResolver { - /** - * @param {ExternalAssetOwnerService} externalAssetOwnerService External Asset Owner service. - */ - constructor(private externalAssetOwnerService: ExternalAssetOwnerService) {} + private externalAssetOwnerService = inject(ExternalAssetOwnerService); /** * Returns the Loans with Association data. diff --git a/src/app/loans/common-resolvers/external-asset-owner-journal-entry.resolver.ts b/src/app/loans/common-resolvers/external-asset-owner-journal-entry.resolver.ts index 86ddd0173..f9fba656f 100644 --- a/src/app/loans/common-resolvers/external-asset-owner-journal-entry.resolver.ts +++ b/src/app/loans/common-resolvers/external-asset-owner-journal-entry.resolver.ts @@ -1,4 +1,4 @@ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; import { Observable, of } from 'rxjs'; import { ExternalAssetOwnerService } from '../services/external-asset-owner.service'; @@ -7,10 +7,7 @@ import { ExternalAssetOwnerService } from '../services/external-asset-owner.serv providedIn: 'root' }) export class ExternalAssetOwnerJournalEntryResolver { - /** - * @param {ExternalAssetOwnerService} externalAssetOwnerService External Asset Owner service. - */ - constructor(private externalAssetOwnerService: ExternalAssetOwnerService) {} + private externalAssetOwnerService = inject(ExternalAssetOwnerService); /** * Returns the Loans with Association data. diff --git a/src/app/loans/common-resolvers/external-asset-owner.resolver.ts b/src/app/loans/common-resolvers/external-asset-owner.resolver.ts index 76312f60a..b4cabc852 100644 --- a/src/app/loans/common-resolvers/external-asset-owner.resolver.ts +++ b/src/app/loans/common-resolvers/external-asset-owner.resolver.ts @@ -1,4 +1,4 @@ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; import { Observable } from 'rxjs'; import { ExternalAssetOwnerService } from '../services/external-asset-owner.service'; @@ -7,10 +7,7 @@ import { ExternalAssetOwnerService } from '../services/external-asset-owner.serv providedIn: 'root' }) export class ExternalAssetOwnerResolver { - /** - * @param {ExternalAssetOwnerService} externalAssetOwnerService External Asset Owner service. - */ - constructor(private externalAssetOwnerService: ExternalAssetOwnerService) {} + private externalAssetOwnerService = inject(ExternalAssetOwnerService); /** * Returns the Loans with Association data. diff --git a/src/app/loans/common-resolvers/glim-loan-template.resolver.ts b/src/app/loans/common-resolvers/glim-loan-template.resolver.ts index 09dd6ebcc..04d2e9bbd 100644 --- a/src/app/loans/common-resolvers/glim-loan-template.resolver.ts +++ b/src/app/loans/common-resolvers/glim-loan-template.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { LoansService } from '../loans.service'; */ @Injectable() export class GLIMLoanTemplateResolver { - /** - * @param {ProductsService} loansService Loan service. - */ - constructor(private loansService: LoansService) {} + private loansService = inject(LoansService); /** * Returns the loan account template data. diff --git a/src/app/loans/common-resolvers/loan-action-button.resolver.ts b/src/app/loans/common-resolvers/loan-action-button.resolver.ts index 56d19b919..65f68f6b2 100644 --- a/src/app/loans/common-resolvers/loan-action-button.resolver.ts +++ b/src/app/loans/common-resolvers/loan-action-button.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { LoansService } from '../loans.service'; */ @Injectable() export class LoanActionButtonResolver { - /** - * @param {LoansService} LoansService Loans service. - */ - constructor(private loansService: LoansService) {} + private loansService = inject(LoansService); /** * Returns the Loans Notes Data. diff --git a/src/app/loans/common-resolvers/loan-arrear-delinquency.resolver.ts b/src/app/loans/common-resolvers/loan-arrear-delinquency.resolver.ts index cb963ffb7..909d94a97 100644 --- a/src/app/loans/common-resolvers/loan-arrear-delinquency.resolver.ts +++ b/src/app/loans/common-resolvers/loan-arrear-delinquency.resolver.ts @@ -1,4 +1,4 @@ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; import { SystemService } from 'app/system/system.service'; import { Observable } from 'rxjs'; @@ -7,10 +7,7 @@ import { Observable } from 'rxjs'; providedIn: 'root' }) export class LoanArrearDelinquencyResolver { - /** - * @param {SystemService} systemService System service. - */ - constructor(private systemService: SystemService) {} + private systemService = inject(SystemService); /** * Returns the loan-arrears-delinquency-display-data configuration data. diff --git a/src/app/loans/common-resolvers/loan-buy-down-fees-data.resolver.ts b/src/app/loans/common-resolvers/loan-buy-down-fees-data.resolver.ts index 9b465096c..74abff6fb 100644 --- a/src/app/loans/common-resolvers/loan-buy-down-fees-data.resolver.ts +++ b/src/app/loans/common-resolvers/loan-buy-down-fees-data.resolver.ts @@ -1,11 +1,11 @@ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { Resolve, ActivatedRouteSnapshot } from '@angular/router'; import { Observable } from 'rxjs'; import { LoansService } from '../loans.service'; @Injectable() export class LoanBuyDownFeesDataResolver implements Resolve { - constructor(private loansService: LoansService) {} + private loansService = inject(LoansService); resolve(route: ActivatedRouteSnapshot): Observable { const loanId = route.paramMap.get('loanId') || route.parent.paramMap.get('loanId'); diff --git a/src/app/loans/common-resolvers/loan-collaterals.resolver.ts b/src/app/loans/common-resolvers/loan-collaterals.resolver.ts index de98818df..78672d837 100644 --- a/src/app/loans/common-resolvers/loan-collaterals.resolver.ts +++ b/src/app/loans/common-resolvers/loan-collaterals.resolver.ts @@ -1,4 +1,4 @@ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; import { Observable } from 'rxjs'; import { LoansService } from '../loans.service'; @@ -7,10 +7,7 @@ import { LoansService } from '../loans.service'; providedIn: 'root' }) export class LoanCollateralsResolver { - /** - * @param {LoansService} LoansService Loans service. - */ - constructor(private loansService: LoansService) {} + private loansService = inject(LoansService); /** * Returns the Loans data. diff --git a/src/app/loans/common-resolvers/loan-datatable.resolver.ts b/src/app/loans/common-resolvers/loan-datatable.resolver.ts index b9c528efe..ad0d0201f 100644 --- a/src/app/loans/common-resolvers/loan-datatable.resolver.ts +++ b/src/app/loans/common-resolvers/loan-datatable.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { LoansService } from '../loans.service'; */ @Injectable() export class LoanDatatableResolver { - /** - * @param {LoansService} LoansService Loans service. - */ - constructor(private loansService: LoansService) {} + private loansService = inject(LoansService); /** * Returns the Loans Notes Data. diff --git a/src/app/loans/common-resolvers/loan-datatables.resolver.ts b/src/app/loans/common-resolvers/loan-datatables.resolver.ts index 15e26dd62..06c9a77bf 100644 --- a/src/app/loans/common-resolvers/loan-datatables.resolver.ts +++ b/src/app/loans/common-resolvers/loan-datatables.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; /** rxjs Imports */ import { Observable } from 'rxjs'; @@ -12,10 +12,7 @@ import { LoansService } from '../loans.service'; */ @Injectable() export class LoanDatatablesResolver { - /** - * @param {loansService} loansService loans service. - */ - constructor(private loansService: LoansService) {} + private loansService = inject(LoansService); /** * Returns the loan datatables. diff --git a/src/app/loans/common-resolvers/loan-deferred-income-data.resolver.ts b/src/app/loans/common-resolvers/loan-deferred-income-data.resolver.ts index 9076d49a5..f01d9cd1e 100644 --- a/src/app/loans/common-resolvers/loan-deferred-income-data.resolver.ts +++ b/src/app/loans/common-resolvers/loan-deferred-income-data.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { LoansService } from '../loans.service'; */ @Injectable() export class LoanDeferredIncomeDataResolver { - /** - * @param {LoansService} LoansService Loans service. - */ - constructor(private loansService: LoansService) {} + private loansService = inject(LoansService); /** * Returns the Loans with Association data. diff --git a/src/app/loans/common-resolvers/loan-delinquency-actions.resolver.ts b/src/app/loans/common-resolvers/loan-delinquency-actions.resolver.ts index a9db3afa8..f4e396db3 100644 --- a/src/app/loans/common-resolvers/loan-delinquency-actions.resolver.ts +++ b/src/app/loans/common-resolvers/loan-delinquency-actions.resolver.ts @@ -1,4 +1,4 @@ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; import { Observable } from 'rxjs'; import { LoansService } from '../loans.service'; @@ -7,10 +7,7 @@ import { LoansService } from '../loans.service'; providedIn: 'root' }) export class LoanDelinquencyActionsResolver { - /** - * @param {LoansService} LoansService Loans service. - */ - constructor(private loansService: LoansService) {} + private loansService = inject(LoansService); /** * Returns the Loans with Association data. diff --git a/src/app/loans/common-resolvers/loan-delinquency-data.resolver.ts b/src/app/loans/common-resolvers/loan-delinquency-data.resolver.ts index 6d9e15d7f..5a425733e 100644 --- a/src/app/loans/common-resolvers/loan-delinquency-data.resolver.ts +++ b/src/app/loans/common-resolvers/loan-delinquency-data.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { LoansService } from '../loans.service'; */ @Injectable() export class LoanDelinquencyDataResolver { - /** - * @param {LoansService} LoansService Loans service. - */ - constructor(private loansService: LoansService) {} + private loansService = inject(LoansService); /** * Returns the Loans with Association data. diff --git a/src/app/loans/common-resolvers/loan-delinquency-tags.resolver.ts b/src/app/loans/common-resolvers/loan-delinquency-tags.resolver.ts index 602f54ec4..7e2c5522f 100644 --- a/src/app/loans/common-resolvers/loan-delinquency-tags.resolver.ts +++ b/src/app/loans/common-resolvers/loan-delinquency-tags.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { LoansService } from '../loans.service'; */ @Injectable() export class LoanDelinquencyTagsResolver { - /** - * @param {LoansService} LoansService Loans service. - */ - constructor(private loansService: LoansService) {} + private loansService = inject(LoansService); /** * Returns the Loans with Association data. diff --git a/src/app/loans/common-resolvers/loan-details-charges.resolver.ts b/src/app/loans/common-resolvers/loan-details-charges.resolver.ts index be4dae88c..2f2f191e2 100644 --- a/src/app/loans/common-resolvers/loan-details-charges.resolver.ts +++ b/src/app/loans/common-resolvers/loan-details-charges.resolver.ts @@ -16,6 +16,7 @@ export class LoanDetailsChargesResolver implements Resolve { /** * @param {LoansService} LoansService Loans service. */ + // eslint-disable-next-line @angular-eslint/prefer-inject constructor(private loansService: LoansService) {} /** diff --git a/src/app/loans/common-resolvers/loan-details.resolver.ts b/src/app/loans/common-resolvers/loan-details.resolver.ts index eb21bed56..56e645a76 100644 --- a/src/app/loans/common-resolvers/loan-details.resolver.ts +++ b/src/app/loans/common-resolvers/loan-details.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { LoansService } from '../loans.service'; */ @Injectable() export class LoanDetailsResolver { - /** - * @param {LoansService} LoansService Loans service. - */ - constructor(private loansService: LoansService) {} + private loansService = inject(LoansService); /** * Returns the Loans with Association data. diff --git a/src/app/loans/common-resolvers/loan-documents.resolver.ts b/src/app/loans/common-resolvers/loan-documents.resolver.ts index b403cfd3b..f2406bd68 100644 --- a/src/app/loans/common-resolvers/loan-documents.resolver.ts +++ b/src/app/loans/common-resolvers/loan-documents.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { LoansService } from '../loans.service'; */ @Injectable() export class LoanDocumentsResolver { - /** - * @param {LoansService} LoansService Loans service. - */ - constructor(private loansService: LoansService) {} + private loansService = inject(LoansService); /** * Returns the Loans data. diff --git a/src/app/loans/common-resolvers/loan-notes.resolver.ts b/src/app/loans/common-resolvers/loan-notes.resolver.ts index 867e22f78..04f0a024e 100644 --- a/src/app/loans/common-resolvers/loan-notes.resolver.ts +++ b/src/app/loans/common-resolvers/loan-notes.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { LoansService } from '../loans.service'; */ @Injectable() export class LoanNotesResolver { - /** - * @param {LoansService} LoansService Loans service. - */ - constructor(private loansService: LoansService) {} + private loansService = inject(LoansService); /** * Returns the Loans data. diff --git a/src/app/loans/common-resolvers/loan-reschedules.resolver.ts b/src/app/loans/common-resolvers/loan-reschedules.resolver.ts index 90eb685bc..da6ce0855 100644 --- a/src/app/loans/common-resolvers/loan-reschedules.resolver.ts +++ b/src/app/loans/common-resolvers/loan-reschedules.resolver.ts @@ -1,4 +1,4 @@ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { Router, RouterStateSnapshot, ActivatedRouteSnapshot } from '@angular/router'; import { Observable, of } from 'rxjs'; import { LoansService } from '../loans.service'; @@ -7,10 +7,7 @@ import { LoansService } from '../loans.service'; providedIn: 'root' }) export class LoanReschedulesResolver { - /** - * @param {LoansService} LoansService Loans service. - */ - constructor(private loansService: LoansService) {} + private loansService = inject(LoansService); /** * Returns the Loans data. diff --git a/src/app/loans/common-resolvers/loan-term-variations.resolver.ts b/src/app/loans/common-resolvers/loan-term-variations.resolver.ts index 6eda3ca32..9beac628b 100644 --- a/src/app/loans/common-resolvers/loan-term-variations.resolver.ts +++ b/src/app/loans/common-resolvers/loan-term-variations.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { LoansService } from '../loans.service'; */ @Injectable() export class LoanTermVariationsResolver { - /** - * @param {LoansService} LoansService Loans service. - */ - constructor(private loansService: LoansService) {} + private loansService = inject(LoansService); /** * Returns the Loans with Association data. diff --git a/src/app/loans/common-resolvers/loans-account-and-template.resolver.ts b/src/app/loans/common-resolvers/loans-account-and-template.resolver.ts index 8eadecf13..9be4701e0 100644 --- a/src/app/loans/common-resolvers/loans-account-and-template.resolver.ts +++ b/src/app/loans/common-resolvers/loans-account-and-template.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { LoansService } from '../loans.service'; */ @Injectable() export class LoansAccountAndTemplateResolver { - /** - * @param {ProductsService} productsService Products service. - */ - constructor(private loansService: LoansService) {} + private loansService = inject(LoansService); /** * Returns the loan account template data. diff --git a/src/app/loans/common-resolvers/loans-account-charge.resolver.ts b/src/app/loans/common-resolvers/loans-account-charge.resolver.ts index 4e9e5abbe..cf6b00c43 100644 --- a/src/app/loans/common-resolvers/loans-account-charge.resolver.ts +++ b/src/app/loans/common-resolvers/loans-account-charge.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { LoansService } from '../loans.service'; */ @Injectable() export class LoansAccountChargeResolver { - /** - * @param {LoansService} LoansService Loans service. - */ - constructor(private loansService: LoansService) {} + private loansService = inject(LoansService); /** * Returns the Loans Account Charge data. diff --git a/src/app/loans/common-resolvers/loans-account-template.resolver.ts b/src/app/loans/common-resolvers/loans-account-template.resolver.ts index 0c1f0efb2..1de6cf7a6 100644 --- a/src/app/loans/common-resolvers/loans-account-template.resolver.ts +++ b/src/app/loans/common-resolvers/loans-account-template.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { LoansService } from '../loans.service'; */ @Injectable() export class LoansAccountTemplateResolver { - /** - * @param {ProductsService} productsService Products service. - */ - constructor(private loansService: LoansService) {} + private loansService = inject(LoansService); /** * Returns the loan account template data. diff --git a/src/app/loans/common-resolvers/loans-account-transaction-template.resolver.ts b/src/app/loans/common-resolvers/loans-account-transaction-template.resolver.ts index 98fe83a63..a95b558f7 100644 --- a/src/app/loans/common-resolvers/loans-account-transaction-template.resolver.ts +++ b/src/app/loans/common-resolvers/loans-account-transaction-template.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { LoansService } from '../loans.service'; */ @Injectable() export class LoansAccountTransactionTemplateResolver { - /** - * @param {LoansService} LoansService Loans service. - */ - constructor(private loansService: LoansService) {} + private loansService = inject(LoansService); /** * Returns the Loans Account Transaction Template data. diff --git a/src/app/loans/common-resolvers/loans-account-transaction.resolver.ts b/src/app/loans/common-resolvers/loans-account-transaction.resolver.ts index e5cfb4166..562abf8fc 100644 --- a/src/app/loans/common-resolvers/loans-account-transaction.resolver.ts +++ b/src/app/loans/common-resolvers/loans-account-transaction.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { LoansService } from '../loans.service'; */ @Injectable() export class LoansAccountTransactionResolver { - /** - * @param {LoansService} LoansService Loans service. - */ - constructor(private loansService: LoansService) {} + private loansService = inject(LoansService); /** * Returns the Loans Account Transaction data. diff --git a/src/app/loans/common-resolvers/loans-transaction-reciept.resolver.ts b/src/app/loans/common-resolvers/loans-transaction-reciept.resolver.ts index 2dc6a4105..ad5b3ceec 100644 --- a/src/app/loans/common-resolvers/loans-transaction-reciept.resolver.ts +++ b/src/app/loans/common-resolvers/loans-transaction-reciept.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { ReportsService } from 'app/reports/reports.service'; */ @Injectable() export class LoansTransactionRecieptResolver { - /** - * @param {ReportsService} reportsService Reports service. - */ - constructor(private reportsService: ReportsService) {} + private reportsService = inject(ReportsService); /** * Returns the Loans Transaction Reciept diff --git a/src/app/loans/create-loans-account/create-loans-account.component.html b/src/app/loans/create-loans-account/create-loans-account.component.html index 782a87d86..e7ff8c859 100644 --- a/src/app/loans/create-loans-account/create-loans-account.component.html +++ b/src/app/loans/create-loans-account/create-loans-account.component.html @@ -64,35 +64,38 @@ - - {{ 'labels.inputs.REPAYMENT SCHEDULE' | translate }} + @if (loansAccountFormValid) { + + {{ 'labels.inputs.REPAYMENT SCHEDULE' | translate }} + + + + } - - - + @for (datatable of datatables; track datatable) { + + {{ datatable.registeredTableName }} + + + } - - {{ datatable.registeredTableName }} - - - - - - {{ 'labels.inputs.PREVIEW' | translate }} - - - - + @if (loansAccountFormValid) { + + {{ 'labels.inputs.PREVIEW' | translate }} + + + + } diff --git a/src/app/loans/create-loans-account/create-loans-account.component.ts b/src/app/loans/create-loans-account/create-loans-account.component.ts index ebbb4abe7..cf4924559 100644 --- a/src/app/loans/create-loans-account/create-loans-account.component.ts +++ b/src/app/loans/create-loans-account/create-loans-account.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, QueryList, ViewChild, ViewChildren } from '@angular/core'; +import { Component, QueryList, ViewChild, ViewChildren, inject } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; /** Custom Services */ @@ -41,6 +41,12 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class CreateLoansAccountComponent { + private route = inject(ActivatedRoute); + private router = inject(Router); + private loansService = inject(LoansService); + private settingsService = inject(SettingsService); + private clientService = inject(ClientsService); + /** Imports all the step component */ @ViewChild(LoansAccountDetailsStepComponent, { static: true }) loansAccountDetailsStep: LoansAccountDetailsStepComponent; @@ -72,13 +78,7 @@ export class CreateLoansAccountComponent { * @param {SettingsService} settingsService Settings Service * @param {ClientsService} clientService Client Service */ - constructor( - private route: ActivatedRoute, - private router: Router, - private loansService: LoansService, - private settingsService: SettingsService, - private clientService: ClientsService - ) { + constructor() { this.route.data.subscribe((data: { loansAccountTemplate: any }) => { this.loansAccountTemplate = data.loansAccountTemplate; }); diff --git a/src/app/loans/custom-dialog/loan-delinquency-action-dialog/loan-delinquency-action-dialog.component.html b/src/app/loans/custom-dialog/loan-delinquency-action-dialog/loan-delinquency-action-dialog.component.html index c21e736bd..cfbdb1466 100644 --- a/src/app/loans/custom-dialog/loan-delinquency-action-dialog/loan-delinquency-action-dialog.component.html +++ b/src/app/loans/custom-dialog/loan-delinquency-action-dialog/loan-delinquency-action-dialog.component.html @@ -13,10 +13,12 @@ /> - - {{ 'labels.inputs.Start Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (delinquencyActionForm.controls.startDate.hasError('required')) { + + {{ 'labels.inputs.Start Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } @@ -31,10 +33,12 @@ /> - - {{ 'labels.inputs.End Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (delinquencyActionForm.controls.endDate.hasError('required')) { + + {{ 'labels.inputs.End Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } diff --git a/src/app/loans/custom-dialog/loan-delinquency-action-dialog/loan-delinquency-action-dialog.component.ts b/src/app/loans/custom-dialog/loan-delinquency-action-dialog/loan-delinquency-action-dialog.component.ts index 67800d176..70bd2e805 100644 --- a/src/app/loans/custom-dialog/loan-delinquency-action-dialog/loan-delinquency-action-dialog.component.ts +++ b/src/app/loans/custom-dialog/loan-delinquency-action-dialog/loan-delinquency-action-dialog.component.ts @@ -1,4 +1,4 @@ -import { Component, Inject } from '@angular/core'; +import { Component, inject } from '@angular/core'; import { UntypedFormBuilder, UntypedFormGroup, Validators, ReactiveFormsModule } from '@angular/forms'; import { MAT_DIALOG_DATA, @@ -25,17 +25,17 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class LoanDelinquencyActionDialogComponent { + dialogRef = inject>(MatDialogRef); + data = inject(MAT_DIALOG_DATA); + private formBuilder = inject(UntypedFormBuilder); + delinquencyActionForm: UntypedFormGroup; /** Minimum date allowed. */ minDate = new Date(2000, 0, 1); /** Maximum date allowed. */ maxDate = new Date(2100, 0, 1); - constructor( - public dialogRef: MatDialogRef, - @Inject(MAT_DIALOG_DATA) public data: any, - private formBuilder: UntypedFormBuilder - ) { + constructor() { this.createDelinquencyActionForm(); } diff --git a/src/app/loans/custom-dialog/loans-account-add-collateral-dialog/loans-account-add-collateral-dialog.component.html b/src/app/loans/custom-dialog/loans-account-add-collateral-dialog/loans-account-add-collateral-dialog.component.html index fbbd6ad23..6cc85b22e 100644 --- a/src/app/loans/custom-dialog/loans-account-add-collateral-dialog/loans-account-add-collateral-dialog.component.html +++ b/src/app/loans/custom-dialog/loans-account-add-collateral-dialog/loans-account-add-collateral-dialog.component.html @@ -4,9 +4,11 @@ {{ 'labels.inputs.Collateral' | translate }} - - {{ collateralType.name }} - + @for (collateralType of collateralTypeData; track collateralType) { + + {{ collateralType.name }} + + } {{ 'labels.inputs.Collateral' | translate }} {{ 'labels.commons.is' | translate }} @@ -17,13 +19,17 @@ {{ 'labels.inputs.Quantity' | translate }} - - {{ 'labels.inputs.Quantity' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - {{ 'labels.inputs.Quantity can not be more than' | translate }} {{ maxQuantity }} - + @if (addCollateralForm.controls.quantity.hasError('required')) { + + {{ 'labels.inputs.Quantity' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + @if (addCollateralForm.controls.quantity.hasError('max')) { + + {{ 'labels.inputs.Quantity can not be more than' | translate }} {{ maxQuantity }} + + } diff --git a/src/app/loans/custom-dialog/loans-account-add-collateral-dialog/loans-account-add-collateral-dialog.component.ts b/src/app/loans/custom-dialog/loans-account-add-collateral-dialog/loans-account-add-collateral-dialog.component.ts index 280b73c62..00dcdae62 100644 --- a/src/app/loans/custom-dialog/loans-account-add-collateral-dialog/loans-account-add-collateral-dialog.component.ts +++ b/src/app/loans/custom-dialog/loans-account-add-collateral-dialog/loans-account-add-collateral-dialog.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit, Inject } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { MatDialogRef, MAT_DIALOG_DATA, @@ -25,6 +25,10 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class LoansAccountAddCollateralDialogComponent implements OnInit { + dialogRef = inject>(MatDialogRef); + data = inject(MAT_DIALOG_DATA); + private formBuilder = inject(UntypedFormBuilder); + layout: { addButtonText?: string; } = { @@ -39,11 +43,7 @@ export class LoansAccountAddCollateralDialogComponent implements OnInit { /** Maximum ALlowed Quantity of selected collateral */ maxQuantity: any = 0; - constructor( - public dialogRef: MatDialogRef, - @Inject(MAT_DIALOG_DATA) public data: any, - private formBuilder: UntypedFormBuilder - ) { + constructor() { this.createAddCollateralForm(); } diff --git a/src/app/loans/custom-dialog/loans-account-view-guarantor-details-dialog/loans-account-view-guarantor-details-dialog.component.html b/src/app/loans/custom-dialog/loans-account-view-guarantor-details-dialog/loans-account-view-guarantor-details-dialog.component.html index 35e863778..61ab8c66f 100644 --- a/src/app/loans/custom-dialog/loans-account-view-guarantor-details-dialog/loans-account-view-guarantor-details-dialog.component.html +++ b/src/app/loans/custom-dialog/loans-account-view-guarantor-details-dialog/loans-account-view-guarantor-details-dialog.component.html @@ -25,20 +25,28 @@
    {{ 'labels.inputs.Status' | translate }}: - - {{ 'labels.inputs.Active' | translate }} - - - {{ 'labels.inputs.Deleted' | translate }} - -
    -
    - {{ 'labels.inputs.Available Disbursement Amount (with Over Applied)' | translate }}: - {{ - data.loanData.delinquent.availableDisbursementAmountWithOverApplied | formatNumber - }} + @if (data.guarantorData.status) { + + {{ 'labels.inputs.Active' | translate }} + + } + @if (!data.guarantorData.status) { + + {{ 'labels.inputs.Deleted' | translate }} + + } +
    + @if (data.loanData?.delinquent?.availableDisbursementAmountWithOverApplied !== undefined) { +
    + {{ 'labels.inputs.Available Disbursement Amount (with Over Applied)' | translate }}: + {{ + data.loanData.delinquent.availableDisbursementAmountWithOverApplied | formatNumber + }} +
    + } diff --git a/src/app/loans/custom-dialog/loans-account-view-guarantor-details-dialog/loans-account-view-guarantor-details-dialog.component.ts b/src/app/loans/custom-dialog/loans-account-view-guarantor-details-dialog/loans-account-view-guarantor-details-dialog.component.ts index 0adb0a1c3..5bbf7df0e 100644 --- a/src/app/loans/custom-dialog/loans-account-view-guarantor-details-dialog/loans-account-view-guarantor-details-dialog.component.ts +++ b/src/app/loans/custom-dialog/loans-account-view-guarantor-details-dialog/loans-account-view-guarantor-details-dialog.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit, Inject } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { MatDialogRef, MAT_DIALOG_DATA, @@ -24,10 +24,8 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class LoansAccountViewGuarantorDetailsDialogComponent implements OnInit { - constructor( - public dialogRef: MatDialogRef, - @Inject(MAT_DIALOG_DATA) public data: any - ) {} + dialogRef = inject>(MatDialogRef); + data = inject(MAT_DIALOG_DATA); ngOnInit() { this.dialogRef.updateSize('400px'); diff --git a/src/app/loans/edit-loans-account/edit-loans-account.component.html b/src/app/loans/edit-loans-account/edit-loans-account.component.html index 2ab2eb89d..0fc6116b8 100644 --- a/src/app/loans/edit-loans-account/edit-loans-account.component.html +++ b/src/app/loans/edit-loans-account/edit-loans-account.component.html @@ -70,16 +70,17 @@ - - {{ 'labels.inputs.PREVIEW' | translate }} - - - - + @if (loansAccountFormValidAndNotPristine) { + + {{ 'labels.inputs.PREVIEW' | translate }} + + + + } diff --git a/src/app/loans/edit-loans-account/edit-loans-account.component.ts b/src/app/loans/edit-loans-account/edit-loans-account.component.ts index 5d105b932..bfe685152 100644 --- a/src/app/loans/edit-loans-account/edit-loans-account.component.ts +++ b/src/app/loans/edit-loans-account/edit-loans-account.component.ts @@ -1,4 +1,4 @@ -import { Component, ViewChild } from '@angular/core'; +import { Component, ViewChild, inject } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; import { LoansService } from '../loans.service'; import { LoansAccountDetailsStepComponent } from '../loans-account-stepper/loans-account-details-step/loans-account-details-step.component'; @@ -36,6 +36,12 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class EditLoansAccountComponent { + private route = inject(ActivatedRoute); + private router = inject(Router); + private dateUtils = inject(Dates); + private loansService = inject(LoansService); + private settingsService = inject(SettingsService); + @ViewChild(LoansAccountDetailsStepComponent, { static: true }) loansAccountDetailsStep: LoansAccountDetailsStepComponent; @ViewChild(LoansAccountTermsStepComponent, { static: true }) loansAccountTermsStep: LoansAccountTermsStepComponent; @@ -60,13 +66,7 @@ export class EditLoansAccountComponent { * @param {loansService} LoansService Loans Service * @param {SettingsService} settingsService Settings Service */ - constructor( - private route: ActivatedRoute, - private router: Router, - private dateUtils: Dates, - private loansService: LoansService, - private settingsService: SettingsService - ) { + constructor() { this.route.data.subscribe((data: { loansAccountAndTemplate: any }) => { this.loansAccountAndTemplate = data.loansAccountAndTemplate; }); diff --git a/src/app/loans/glim-account/create-glim-account/create-glim-account.component.html b/src/app/loans/glim-account/create-glim-account/create-glim-account.component.html index d33f57f06..4c02a7573 100644 --- a/src/app/loans/glim-account/create-glim-account/create-glim-account.component.html +++ b/src/app/loans/glim-account/create-glim-account/create-glim-account.component.html @@ -71,36 +71,39 @@ - - {{ 'labels.inputs.REPAYMENT SCHEDULE' | translate }} + @if (loansAccountFormValid) { + + {{ 'labels.inputs.REPAYMENT SCHEDULE' | translate }} + + + + } - - - + @for (datatable of datatables; track datatable) { + + {{ datatable.registeredTableName }} + + + } - - {{ datatable.registeredTableName }} - - - - - - {{ 'labels.inputs.PREVIEW' | translate }} - - - - + @if (loansAccountFormValid) { + + {{ 'labels.inputs.PREVIEW' | translate }} + + + + } diff --git a/src/app/loans/glim-account/create-glim-account/create-glim-account.component.ts b/src/app/loans/glim-account/create-glim-account/create-glim-account.component.ts index cce31c63b..f4f943e86 100644 --- a/src/app/loans/glim-account/create-glim-account/create-glim-account.component.ts +++ b/src/app/loans/glim-account/create-glim-account/create-glim-account.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, QueryList, ViewChild, ViewChildren } from '@angular/core'; +import { Component, QueryList, ViewChild, ViewChildren, inject } from '@angular/core'; import { I18nService } from 'app/core/i18n/i18n.service'; import { ActivatedRoute, Router } from '@angular/router'; @@ -42,6 +42,14 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class CreateGlimAccountComponent { + private route = inject(ActivatedRoute); + private router = inject(Router); + private loansService = inject(LoansService); + private settingsService = inject(SettingsService); + private clientService = inject(ClientsService); + private dateUtils = inject(Dates); + private i18nService = inject(I18nService); + /** Imports all the step component */ @ViewChild(LoansAccountDetailsStepComponent, { static: true }) loansAccountDetailsStep: LoansAccountDetailsStepComponent; @@ -79,15 +87,7 @@ export class CreateGlimAccountComponent { * @param {SettingsService} settingsService Settings Service * @param {ClientsService} clientService Client Service */ - constructor( - private route: ActivatedRoute, - private router: Router, - private loansService: LoansService, - private settingsService: SettingsService, - private clientService: ClientsService, - private dateUtils: Dates, - private i18nService: I18nService - ) { + constructor() { this.route.data.subscribe((data: { loansAccountTemplate: any; groupsData: any }) => { this.loansAccountTemplate = data.loansAccountTemplate; this.dataSource = data.groupsData.activeClientMembers; diff --git a/src/app/loans/glim-account/glim-account-view.resolver.ts b/src/app/loans/glim-account/glim-account-view.resolver.ts index 656cedb5a..0852e04c0 100644 --- a/src/app/loans/glim-account/glim-account-view.resolver.ts +++ b/src/app/loans/glim-account/glim-account-view.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { LoansService } from '../loans.service'; */ @Injectable() export class GLIMViewResolver { - /** - * @param {LoansService} loansService Loans service. - */ - constructor(private loansService: LoansService) {} + private loansService = inject(LoansService); /** * Returns the Savings Account data. diff --git a/src/app/loans/glim-account/glim-account.component.ts b/src/app/loans/glim-account/glim-account.component.ts index 4ac356bd0..c315be30a 100644 --- a/src/app/loans/glim-account/glim-account.component.ts +++ b/src/app/loans/glim-account/glim-account.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit, ViewChild } from '@angular/core'; +import { Component, OnInit, ViewChild, inject } from '@angular/core'; import { MatDialog } from '@angular/material/dialog'; import { MatPaginator } from '@angular/material/paginator'; import { @@ -40,6 +40,9 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class GlimAccountComponent implements OnInit { + private route = inject(ActivatedRoute); + dialog = inject(MatDialog); + /** Columns to be displayed in GLIM overview table. */ displayedColumns: string[] = [ 'loanId', @@ -62,10 +65,7 @@ export class GlimAccountComponent implements OnInit { * @param {ActivatedRoute} route Activated Route. * @param {MatDialog} dialog Dialog reference. */ - constructor( - private route: ActivatedRoute, - public dialog: MatDialog - ) { + constructor() { this.route.data.subscribe((data: { glimData: any }) => { this.glimOverviewData = data.glimData; }); diff --git a/src/app/loans/loans-account-stepper/loans-account-charges-step/loans-account-charges-step.component.html b/src/app/loans/loans-account-stepper/loans-account-charges-step/loans-account-charges-step.component.html index d257c71b8..eb7e364c8 100644 --- a/src/app/loans/loans-account-stepper/loans-account-charges-step/loans-account-charges-step.component.html +++ b/src/app/loans/loans-account-stepper/loans-account-charges-step/loans-account-charges-step.component.html @@ -2,9 +2,11 @@ {{ 'labels.inputs.Charge' | translate }} - - {{ charge.name }} - + @for (charge of chargeData; track charge) { + + {{ charge.name }} + + } @@ -55,38 +57,37 @@ {{ 'labels.inputs.Date' | translate }} - - {{ (charge.dueDate | dateFormat) || 'Unassigned' }} - - - {{ (charge.feeOnMonthDay | dateFormat) || 'Unassigned' }} - - - {{ 'labels.inputs.N/A' | translate }} - - + charge.chargeTimeType.value === 'Specified due date' || + charge.chargeTimeType.value === 'Weekly Fee' + ) + ) { + + {{ 'labels.inputs.N/A' | translate }} + + } + @if ( + charge.chargeTimeType.value === 'Weekly Fee' || + charge.chargeTimeType.value === 'Annual Fee' || + charge.chargeTimeType.value === 'Specified due date' + ) { + + } @@ -142,7 +143,9 @@ {{ 'labels.buttons.Next' | translate }} - + @if (loanId) { + + } diff --git a/src/app/loans/loans-account-stepper/loans-account-charges-step/loans-account-charges-step.component.ts b/src/app/loans/loans-account-stepper/loans-account-charges-step/loans-account-charges-step.component.ts index 95a13bc45..321ae8c52 100644 --- a/src/app/loans/loans-account-stepper/loans-account-charges-step/loans-account-charges-step.component.ts +++ b/src/app/loans/loans-account-stepper/loans-account-charges-step/loans-account-charges-step.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, Input, OnChanges } from '@angular/core'; +import { Component, OnInit, Input, OnChanges, inject } from '@angular/core'; // import { FormControl } from '@angular/forms'; import { MatDialog } from '@angular/material/dialog'; import { @@ -65,6 +65,11 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class LoansAccountChargesStepComponent implements OnInit, OnChanges { + dialog = inject(MatDialog); + private dateUtils = inject(Dates); + private route = inject(ActivatedRoute); + private settingsService = inject(SettingsService); + // @Input loansAccountProductTemplate: LoansAccountProductTemplate @Input() loansAccountProductTemplate: any; // @Imput loansAccountTemplate: LoansAccountTemplate @@ -128,12 +133,7 @@ export class LoansAccountChargesStepComponent implements OnInit, OnChanges { * @param {Dates} dateUtils Date Utils * @param {SettingsService} settingsService Settings Service */ - constructor( - public dialog: MatDialog, - private dateUtils: Dates, - private route: ActivatedRoute, - private settingsService: SettingsService - ) { + constructor() { this.loanId = this.route.snapshot.params['loanId']; } @@ -218,7 +218,6 @@ export class LoansAccountChargesStepComponent implements OnInit, OnChanges { type: 'number', required: false }) - ]; const data = { title: 'Edit Charge Amount', @@ -249,7 +248,6 @@ export class LoansAccountChargesStepComponent implements OnInit, OnChanges { type: 'datetime-local', required: false }) - ]; const data = { title: 'Edit Charge Date', @@ -291,7 +289,6 @@ export class LoansAccountChargesStepComponent implements OnInit, OnChanges { type: 'text', required: false }) - ]; const data = { title: 'Edit Charge Fee Interval', diff --git a/src/app/loans/loans-account-stepper/loans-account-datatable-step/loans-account-datatable-step.component.html b/src/app/loans/loans-account-stepper/loans-account-datatable-step/loans-account-datatable-step.component.html index 56a31c068..6a2bd6c5f 100644 --- a/src/app/loans/loans-account-stepper/loans-account-datatable-step/loans-account-datatable-step.component.html +++ b/src/app/loans/loans-account-stepper/loans-account-datatable-step/loans-account-datatable-step.component.html @@ -1,58 +1,49 @@
    -
    - - {{ getInputName(datatableInput) }} - - - - {{ code.value }} - - - - - - - - - - - - - - - - - - {{ getInputName(datatableInput) }} - -
    + @for (datatableInput of datatableInputs; track datatableInput) { +
    + @if (!isBoolean(datatableInput.columnDisplayType)) { + + {{ getInputName(datatableInput) }} + @if (isDropdown(datatableInput.columnDisplayType)) { + + @for (code of datatableInput.columnValues; track code) { + + {{ code.value }} + + } + + } + @if (isNumeric(datatableInput.columnDisplayType)) { + + } + @if (isString(datatableInput.columnDisplayType)) { + + } + @if (isText(datatableInput.columnDisplayType)) { + + } + @if (isDate(datatableInput.columnDisplayType)) { + + + + + + } + + } + @if (isBoolean(datatableInput.columnDisplayType)) { + + {{ getInputName(datatableInput) }} + + } +
    + }
    diff --git a/src/app/loans/loans-account-stepper/loans-account-datatable-step/loans-account-datatable-step.component.ts b/src/app/loans/loans-account-stepper/loans-account-datatable-step/loans-account-datatable-step.component.ts index c530cfe0d..70577b8f7 100644 --- a/src/app/loans/loans-account-stepper/loans-account-datatable-step/loans-account-datatable-step.component.ts +++ b/src/app/loans/loans-account-stepper/loans-account-datatable-step/loans-account-datatable-step.component.ts @@ -1,4 +1,4 @@ -import { Component, Input, OnInit } from '@angular/core'; +import { Component, Input, OnInit, inject } from '@angular/core'; import { UntypedFormBuilder, UntypedFormControl, @@ -26,6 +26,10 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class LoansAccountDatatableStepComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private settingsService = inject(SettingsService); + private dateUtils = inject(Dates); + /** Input Fields Data */ @Input() datatableData: any; /** Create Input Form */ @@ -33,12 +37,6 @@ export class LoansAccountDatatableStepComponent implements OnInit { datatableInputs: any = []; - constructor( - private formBuilder: UntypedFormBuilder, - private settingsService: SettingsService, - private dateUtils: Dates - ) {} - ngOnInit(): void { this.datatableInputs = this.datatableData.columnHeaderData.filter((column: any) => { return ( diff --git a/src/app/loans/loans-account-stepper/loans-account-details-step/loans-account-details-step.component.html b/src/app/loans/loans-account-stepper/loans-account-details-step/loans-account-details-step.component.html index b1b156769..2b9fdf9b1 100644 --- a/src/app/loans/loans-account-stepper/loans-account-details-step/loans-account-details-step.component.html +++ b/src/app/loans/loans-account-stepper/loans-account-details-step/loans-account-details-step.component.html @@ -14,9 +14,11 @@ [formControl]="filterFormCtrl" > - - {{ product.name }} - + @for (product of productData | async; track product) { + + {{ product.name }} + + } {{ 'labels.inputs.Product Name' | translate }} {{ 'labels.commons.is' | translate }} @@ -25,97 +27,108 @@
    -
    - - {{ 'labels.inputs.External id' | translate }} - - - - - {{ 'labels.inputs.Loan officer' | translate }} - - - {{ loanOfficer.displayName }} - - - - - - {{ 'labels.inputs.Loan Purpose' | translate }} - - - {{ loanPurpose.name }} - - - - - - {{ 'labels.inputs.Fund' | translate }} - - - {{ fund.name }} - - - - - - {{ 'labels.inputs.Submitted on' | translate }} - - - - - {{ 'labels.inputs.Submitted on' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - - - {{ 'labels.inputs.Disbursement on' | translate }} - - - - - {{ 'labels.inputs.Disbursement on' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - - - -

    {{ 'labels.heading.Savings Linkage' | translate }}

    - - - {{ 'labels.inputs.Link savings' | translate }} - - - ({{ savingaccount.accountNo }}) {{ savingaccount.productName }} - - - - - -

    {{ 'labels.inputs.Create standing instructions at disbursement' | translate }}

    -
    -
    + @if (loanProductSelected) { +
    + + {{ 'labels.inputs.External id' | translate }} + + + @if (loanProductSelected) { + + {{ 'labels.inputs.Loan officer' | translate }} + + @for (loanOfficer of loanOfficerOptions; track loanOfficer) { + + {{ loanOfficer.displayName }} + + } + + + } + + {{ 'labels.inputs.Loan Purpose' | translate }} + + @for (loanPurpose of loanPurposeOptions; track loanPurpose) { + + {{ loanPurpose.name }} + + } + + + + {{ 'labels.inputs.Fund' | translate }} + + @for (fund of fundOptions; track fund) { + + {{ fund.name }} + + } + + + + {{ 'labels.inputs.Submitted on' | translate }} + + + + @if (loansAccountDetailsForm.controls.submittedOnDate?.hasError('required')) { + + {{ 'labels.inputs.Submitted on' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + + {{ 'labels.inputs.Disbursement on' | translate }} + + + + @if (loansAccountDetailsForm.controls.submittedOnDate?.hasError('required')) { + + {{ 'labels.inputs.Disbursement on' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + +

    {{ 'labels.heading.Savings Linkage' | translate }}

    + + {{ 'labels.inputs.Link savings' | translate }} + + @for (savingaccount of accountLinkingOptions; track savingaccount) { + + ({{ savingaccount.accountNo }}) {{ savingaccount.productName }} + + } + + + +

    {{ 'labels.inputs.Create standing instructions at disbursement' | translate }}

    +
    +
    + }
    - + @if (loanId) { + + }
    diff --git a/src/app/loans/loans-account-stepper/loans-account-details-step/loans-account-details-step.component.ts b/src/app/loans/loans-account-stepper/loans-account-details-step/loans-account-details-step.component.ts index f632d17be..52ddc50ff 100644 --- a/src/app/loans/loans-account-stepper/loans-account-details-step/loans-account-details-step.component.ts +++ b/src/app/loans/loans-account-stepper/loans-account-details-step/loans-account-details-step.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, Input, Output, EventEmitter, OnDestroy } from '@angular/core'; +import { Component, OnInit, Input, Output, EventEmitter, OnDestroy, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, @@ -18,7 +18,7 @@ import { takeUntil } from 'rxjs/operators'; import { ReplaySubject, Subject } from 'rxjs'; import { MatTooltip } from '@angular/material/tooltip'; import { NgxMatSelectSearchModule } from 'ngx-mat-select-search'; -import { NgFor, NgIf, AsyncPipe } from '@angular/common'; +import { AsyncPipe } from '@angular/common'; import { MatDivider } from '@angular/material/divider'; import { MatCheckbox } from '@angular/material/checkbox'; import { MatStepperPrevious, MatStepperNext } from '@angular/material/stepper'; @@ -45,6 +45,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class LoansAccountDetailsStepComponent implements OnInit, OnDestroy { + private formBuilder = inject(UntypedFormBuilder); + private loansService = inject(LoansService); + private route = inject(ActivatedRoute); + private translateService = inject(TranslateService); + private settingsService = inject(SettingsService); + private commons = inject(Commons); + //** Defining PlaceHolders for the search bar */ placeHolderLabel = ''; noEntriesFoundLabel = ''; @@ -89,14 +96,7 @@ export class LoansAccountDetailsStepComponent implements OnInit, OnDestroy { * @param {LoansService} loansService Loans Service. * @param {SettingsService} settingsService SettingsService */ - constructor( - private formBuilder: UntypedFormBuilder, - private loansService: LoansService, - private route: ActivatedRoute, - private translateService: TranslateService, - private settingsService: SettingsService, - private commons: Commons - ) { + constructor() { this.loanId = this.route.snapshot.params['loanId']; } diff --git a/src/app/loans/loans-account-stepper/loans-account-preview-step/loans-account-preview-step.component.html b/src/app/loans/loans-account-stepper/loans-account-preview-step/loans-account-preview-step.component.html index 13c8ad7f1..c673c8411 100644 --- a/src/app/loans/loans-account-stepper/loans-account-preview-step/loans-account-preview-step.component.html +++ b/src/app/loans/loans-account-stepper/loans-account-preview-step/loans-account-preview-step.component.html @@ -13,26 +13,32 @@ > -
    - {{ 'labels.inputs.Loan officer' | translate }}: - {{ - loansAccount.loanOfficerId | find: loansAccountProductTemplate.loanOfficerOptions : 'id' : 'displayName' - }} -
    + @if (loansAccount.loanOfficerId) { +
    + {{ 'labels.inputs.Loan officer' | translate }}: + {{ + loansAccount.loanOfficerId | find: loansAccountProductTemplate.loanOfficerOptions : 'id' : 'displayName' + }} +
    + } -
    - {{ 'labels.inputs.Loan purpose' | translate }}: - {{ - loansAccount.loanPurposeId | find: loansAccountProductTemplate.loanPurposeOptions : 'id' : 'name' - }} -
    + @if (loansAccount.loanPurposeId) { +
    + {{ 'labels.inputs.Loan purpose' | translate }}: + {{ + loansAccount.loanPurposeId | find: loansAccountProductTemplate.loanPurposeOptions : 'id' : 'name' + }} +
    + } -
    - {{ 'labels.inputs.Fund' | translate }}: - {{ - loansAccount.fundId | find: loansAccountProductTemplate.fundOptions : 'id' : 'name' - }} -
    + @if (loansAccount.fundId) { +
    + {{ 'labels.inputs.Fund' | translate }}: + {{ + loansAccount.fundId | find: loansAccountProductTemplate.fundOptions : 'id' : 'name' + }} +
    + }
    {{ 'labels.inputs.Submitted on' | translate }}: @@ -44,14 +50,16 @@ {{ loansAccount.expectedDisbursementDate | dateFormat }}
    -
    - {{ 'labels.inputs.External id' | translate }}: - - - -
    + @if (loansAccount.externalId) { +
    + {{ 'labels.inputs.External id' | translate }}: + + + +
    + } - + @if (activeClientMembers) {

    {{ 'labels.heading.Client Members' | translate }}

    @@ -61,19 +69,16 @@ {{ 'labels.inputs.Client ID' | translate }} {{ element.id }} - {{ 'labels.inputs.Client Name' | translate }} {{ element.displayName }} - {{ 'labels.inputs.Loan Purpose' | translate }} {{ element.purpose }} - {{ 'labels.inputs.Original Loan' | translate }} @@ -81,12 +86,11 @@ {{ element.principal | currency: loansAccountProductTemplate.currency.code : 'symbol-narrow' : '1.2-2' }} -
    -
    + }

    {{ 'labels.heading.Terms' | translate }}

    @@ -134,39 +138,51 @@ > -
    - {{ 'labels.inputs.Enable Down Payments' | translate }}: - {{ loansAccount.enableDownPayment | yesNo }} -
    + @if (productEnableDownPayment) { +
    + {{ 'labels.inputs.Enable Down Payments' | translate }}: + {{ loansAccount.enableDownPayment | yesNo }} +
    + } -
    - {{ 'labels.inputs.First repayment on' | translate }}: - {{ loansAccount.repaymentsStartingFromDate | dateFormat }} -
    + @if (loansAccount.repaymentsStartingFromDate) { +
    + {{ 'labels.inputs.First repayment on' | translate }}: + {{ loansAccount.repaymentsStartingFromDate | dateFormat }} +
    + } -
    - {{ 'labels.inputs.Interest charged from' | translate }}: - {{ loansAccount.interestChargedFromDate | dateFormat }} -
    + @if (loansAccount.interestChargedFromDate) { +
    + {{ 'labels.inputs.Interest charged from' | translate }}: + {{ loansAccount.interestChargedFromDate | dateFormat }} +
    + } -
    - {{ 'labels.inputs.Nominal interest rate' | translate }}: - {{ loansAccount.interestRatePerPeriod }}  {{ - loansAccountProductTemplate.interestRateFrequencyType.value - }} -
    + @if (loansAccount.interestRatePerPeriod) { +
    + {{ 'labels.inputs.Nominal interest rate' | translate }}: + {{ loansAccount.interestRatePerPeriod }}  {{ + loansAccountProductTemplate.interestRateFrequencyType.value + }} +
    + } -
    - {{ 'labels.inputs.Interest method' | translate }}: - {{ loansAccount.interestType }} -
    + @if (loansAccount.interestType) { +
    + {{ 'labels.inputs.Interest method' | translate }}: + {{ loansAccount.interestType }} +
    + } -
    - {{ 'labels.inputs.Is Equal Amortization' | translate }}: - {{ loansAccount.isEqualAmortization }} -
    + @if (loansAccount.isEqualAmortization) { +
    + {{ 'labels.inputs.Is Equal Amortization' | translate }}: + {{ loansAccount.isEqualAmortization }} +
    + }
    {{ 'labels.inputs.Amortization' | translate }} @@ -183,20 +199,28 @@ }}
    -
    - {{ 'labels.inputs.Calculate interest for exact days in partial period' | translate }}: - {{ loansAccount.allowPartialPeriodInterestCalculation }} -
    + @if (loansAccount.allowPartialPeriodInterestCalculation) { +
    + {{ 'labels.inputs.Calculate interest for exact days in partial period' | translate }}: + {{ loansAccount.allowPartialPeriodInterestCalculation }} +
    + } -
    - {{ 'labels.inputs.Arrears tolerance' | translate }}: - {{ loansAccount.inArrearsTolerance }} -
    + @if (loansAccount.inArrearsTolerance) { +
    + {{ 'labels.inputs.Arrears tolerance' | translate }}: + {{ loansAccount.inArrearsTolerance }} +
    + } -
    - {{ 'labels.inputs.Interest free period' | translate }}: - {{ loansAccount.graceOnInterestCharged }} -
    + @if (loansAccount.graceOnInterestCharged) { +
    + {{ 'labels.inputs.Interest free period' | translate }}: + {{ loansAccount.graceOnInterestCharged }} +
    + }
    {{ 'labels.inputs.Repayment strategy' | translate }}: @@ -219,138 +243,139 @@

    {{ 'labels.heading.Moratorium' | translate }}

    -
    - {{ 'labels.inputs.On principal payment' | translate }}: - {{ loansAccount.graceOnPrincipalPayment }} -
    + @if (loansAccount.graceOnPrincipalPayment) { +
    + {{ 'labels.inputs.On principal payment' | translate }}: + {{ loansAccount.graceOnPrincipalPayment }} +
    + } -
    - {{ 'labels.inputs.On interest payment' | translate }}: - {{ loansAccount.graceOnInterestPayment }} -
    + @if (loansAccount.graceOnInterestPayment) { +
    + {{ 'labels.inputs.On interest payment' | translate }}: + {{ loansAccount.graceOnInterestPayment }} +
    + } -
    - {{ 'labels.inputs.On Arrears Aging' | translate }}: - {{ loansAccount.graceOnArrearsAgeing }} -
    + @if (loansAccount.graceOnArrearsAgeing) { +
    + {{ 'labels.inputs.On Arrears Aging' | translate }}: + {{ loansAccount.graceOnArrearsAgeing }} +
    + }
    {{ 'labels.inputs.Enable installment level Delinquency' | translate }} {{ loansAccount.enableInstallmentLevelDelinquency | yesNo }}
    -
    - {{ 'labels.inputs.Is Topup Loan' | translate }}? - {{ loansAccount.isTopup }} -
    + @if (loansAccount.isTopup) { +
    + {{ 'labels.inputs.Is Topup Loan' | translate }}? + {{ loansAccount.isTopup }} +
    + }
    {{ 'labels.inputs.Recalculate Interest' | translate }}: {{ loansAccountProductTemplate?.isInterestRecalculationEnabled | yesNo }}
    -
    - {{ 'labels.inputs.Days in month' | translate }}: - {{ loansAccountProductTemplate?.daysInMonthType.value }} -
    + @if (loansAccountProductTemplate?.daysInMonthType) { +
    + {{ 'labels.inputs.Days in month' | translate }}: + {{ loansAccountProductTemplate?.daysInMonthType.value }} +
    + } -
    -

    {{ 'labels.heading.Charges' | translate }}

    - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    {{ 'labels.inputs.name' | translate }} - {{ charge.name + ', ' + (charge.currency?.displaySymbol || '') }} - {{ 'labels.inputs.Type' | translate }} - {{ charge.chargeCalculationType.value }} - {{ 'labels.inputs.Amount' | translate }} - {{ charge.amount }} - {{ 'labels.inputs.Collected On' | translate }} - {{ charge.chargeTimeType.value }} - {{ 'labels.inputs.Date' | translate }} - - {{ (charge.dueDate | dateFormat) || 'Unassigned' }} - - - {{ (charge.feeOnMonthDay | dateFormat) || 'Unassigned' }} - - +

    {{ 'labels.heading.Charges' | translate }}

    + + + + + + + + + + + + + + + + + + + + + - + ) { + + {{ 'labels.inputs.N/A' | translate }} + + } + + + + +
    {{ 'labels.inputs.name' | translate }} + {{ charge.name + ', ' + (charge.currency?.displaySymbol || '') }} + {{ 'labels.inputs.Type' | translate }} + {{ charge.chargeCalculationType.value }} + {{ 'labels.inputs.Amount' | translate }} + {{ charge.amount }} + {{ 'labels.inputs.Collected On' | translate }} + {{ charge.chargeTimeType.value }} + {{ 'labels.inputs.Date' | translate }} + @if (charge.chargeTimeType.value === 'Specified due date' || charge.chargeTimeType.value === 'Weekly Fee') { + + {{ (charge.dueDate | dateFormat) || 'Unassigned' }} + + } + @if (charge.chargeTimeType.value === 'Monthly Fee' || charge.chargeTimeType.value === 'Annual Fee') { + + {{ (charge.feeOnMonthDay | dateFormat) || 'Unassigned' }} + + } + @if ( !( charge.chargeTimeType.value === 'Monthly Fee' || charge.chargeTimeType.value === 'Annual Fee' || charge.chargeTimeType.value === 'Specified due date' || charge.chargeTimeType.value === 'Weekly Fee' ) - " - > - {{ 'labels.inputs.N/A' | translate }} - -
    + + } -
    -
    - -
    -

    {{ 'labels.heading.Overdue Charges' | translate }}

    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    {{ 'labels.inputs.name' | translate }}{{ charge.name + ', ' + (charge.currency?.displaySymbol || '') }}{{ 'labels.inputs.Type' | translate }}{{ charge.chargeCalculationType.value }}{{ 'labels.inputs.Amount' | translate }}{{ charge.amount | formatNumber }}{{ 'labels.inputs.Collected On' | translate }}{{ charge.chargeTimeType.value }}
    -
    + @if (loansAccountProductTemplate.overdueCharges.length) { +
    +

    {{ 'labels.heading.Overdue Charges' | translate }}

    + + + + + + + + + + + + + + + + + + + + +
    {{ 'labels.inputs.name' | translate }}{{ charge.name + ', ' + (charge.currency?.displaySymbol || '') }}{{ 'labels.inputs.Type' | translate }}{{ charge.chargeCalculationType.value }}{{ 'labels.inputs.Amount' | translate }}{{ charge.amount | formatNumber }}{{ 'labels.inputs.Collected On' | translate }}{{ charge.chargeTimeType.value }}
    +
    + }
    diff --git a/src/app/loans/loans-account-stepper/loans-account-preview-step/loans-account-preview-step.component.ts b/src/app/loans/loans-account-stepper/loans-account-preview-step/loans-account-preview-step.component.ts index df45d78e9..7f145674a 100644 --- a/src/app/loans/loans-account-stepper/loans-account-preview-step/loans-account-preview-step.component.ts +++ b/src/app/loans/loans-account-stepper/loans-account-preview-step/loans-account-preview-step.component.ts @@ -14,7 +14,7 @@ import { MatRow } from '@angular/material/table'; import { LongTextComponent } from '../../../shared/long-text/long-text.component'; -import { NgIf, CurrencyPipe } from '@angular/common'; +import { CurrencyPipe } from '@angular/common'; import { ExternalIdentifierComponent } from '../../../shared/external-identifier/external-identifier.component'; import { MatDivider } from '@angular/material/divider'; import { MatStepperPrevious } from '@angular/material/stepper'; diff --git a/src/app/loans/loans-account-stepper/loans-account-schedule-step/loans-account-schedule-step.component.html b/src/app/loans/loans-account-stepper/loans-account-schedule-step/loans-account-schedule-step.component.html index 7f5c1d750..8eaf5b48a 100644 --- a/src/app/loans/loans-account-stepper/loans-account-schedule-step/loans-account-schedule-step.component.html +++ b/src/app/loans/loans-account-stepper/loans-account-schedule-step/loans-account-schedule-step.component.html @@ -20,7 +20,9 @@ {{ 'labels.buttons.Next' | translate }} - + @if (loanId) { + + }
    diff --git a/src/app/loans/loans-account-stepper/loans-account-schedule-step/loans-account-schedule-step.component.ts b/src/app/loans/loans-account-stepper/loans-account-schedule-step/loans-account-schedule-step.component.ts index b40d3a838..f67ca1b40 100644 --- a/src/app/loans/loans-account-stepper/loans-account-schedule-step/loans-account-schedule-step.component.ts +++ b/src/app/loans/loans-account-stepper/loans-account-schedule-step/loans-account-schedule-step.component.ts @@ -1,4 +1,4 @@ -import { Component, Input } from '@angular/core'; +import { Component, Input, inject } from '@angular/core'; import { ActivatedRoute, RouterLink } from '@angular/router'; import { LoansService } from 'app/loans/loans.service'; import { RepaymentSchedule } from 'app/loans/models/loan-account.model'; @@ -21,6 +21,10 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class LoansAccountScheduleStepComponent { + private loansService = inject(LoansService); + private settingsService = inject(SettingsService); + private route = inject(ActivatedRoute); + /** Currency Code */ @Input() currencyCode: string; /** Loans Account Template */ @@ -34,11 +38,7 @@ export class LoansAccountScheduleStepComponent { loanId: string | null = null; - constructor( - private loansService: LoansService, - private settingsService: SettingsService, - private route: ActivatedRoute - ) { + constructor() { this.loanId = this.route.snapshot.params['loanId']; } diff --git a/src/app/loans/loans-account-stepper/loans-account-terms-step/loans-account-terms-step.component.html b/src/app/loans/loans-account-stepper/loans-account-terms-step/loans-account-terms-step.component.html index cb50a65bc..d9bab5f2d 100644 --- a/src/app/loans/loans-account-stepper/loans-account-terms-step/loans-account-terms-step.component.html +++ b/src/app/loans/loans-account-stepper/loans-account-terms-step/loans-account-terms-step.component.html @@ -1,14 +1,15 @@
    - - + @if (currency) { + + + }

    {{ 'labels.heading.Term Options' | translate }} @@ -18,32 +19,42 @@ {{ 'labels.inputs.Loan Term' | translate }} - - {{ 'labels.inputs.Loan Term' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (loansAccountTermsForm.controls.loanTermFrequency.hasError('required')) { + + {{ 'labels.inputs.Loan Term' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Frequency' | translate }} - - {{ type.value | translateKey: 'catalogs' }} - + @for (type of termFrequencyTypeData; track type) { + + {{ type.value | translateKey: 'catalogs' }} + + } - - {{ 'labels.inputs.Frequency' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (loansAccountTermsForm.controls.loanTermFrequencyType.hasError('required')) { + + {{ 'labels.inputs.Frequency' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } - - {{ 'labels.inputs.Fixed Length' | translate }} - - - {{ - loansAccountTermsForm.value.loanTermFrequencyType | find: termFrequencyTypeData : 'id' : 'value' - }} + @if (hasFixedLength()) { + + {{ 'labels.inputs.Fixed Length' | translate }} + + + } + @if (hasFixedLength()) { + {{ + loansAccountTermsForm.value.loanTermFrequencyType | find: termFrequencyTypeData : 'id' : 'value' + }} + }

    {{ 'labels.inputs.Repayments' | translate }}

    @@ -55,16 +66,20 @@ formControlName="numberOfRepayments" matTooltip="{{ 'tooltips.Enter the total count of repayments' | translate }}" /> - - {{ 'labels.inputs.Number of repayments' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (loansAccountTermsForm.controls.numberOfRepayments.hasError('required')) { + + {{ 'labels.inputs.Number of repayments' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } - - {{ 'labels.inputs.Installment Amount' | translate }} - - + @if (loansAccountTermsData?.canDefineInstallmentAmount) { + + {{ 'labels.inputs.Installment Amount' | translate }} + + + } {{ 'labels.inputs.First repayment on' | translate }} @@ -111,88 +126,96 @@ formControlName="repaymentEvery" matTooltip="{{ 'tooltips.Fields are input to calculating the repayment schedule' | translate }}" /> - - {{ 'labels.inputs.Repaid every' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (loansAccountTermsForm.controls.repaymentEvery.hasError('required')) { + + {{ 'labels.inputs.Repaid every' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Frequency' | translate }} - - {{ repaymentFrequencyType.value | translateKey: 'catalogs' }} - + @for (repaymentFrequencyType of termFrequencyTypeData; track repaymentFrequencyType) { + + {{ repaymentFrequencyType.value | translateKey: 'catalogs' }} + + } - - {{ 'labels.inputs.Select On' | translate }} - - - {{ repaymentFrequencyNthDayType.value | translateKey: 'catalogs' }} - - - + @if (loansAccountTermsForm.controls.repaymentFrequencyType.value === 2) { + + {{ 'labels.inputs.Select On' | translate }} + + @for (repaymentFrequencyNthDayType of repaymentFrequencyNthDayTypeData; track repaymentFrequencyNthDayType) { + + {{ repaymentFrequencyNthDayType.value | translateKey: 'catalogs' }} + + } + + + } - - {{ 'labels.inputs.Select Day' | translate }} - - - {{ repaymentFrequencyDayOfWeekType.value | translateKey: 'catalogs' }} - - - + @if (loansAccountTermsForm.controls.repaymentFrequencyType.value === 2) { + + {{ 'labels.inputs.Select Day' | translate }} + + @for ( + repaymentFrequencyDayOfWeekType of repaymentFrequencyDaysOfWeekTypeData; + track repaymentFrequencyDayOfWeekType + ) { + + {{ repaymentFrequencyDayOfWeekType.value | translateKey: 'catalogs' }} + + } + + + } - - {{ 'labels.inputs.Enable Down Payment' | translate }} - + @if (productEnableDownPayment) { + + {{ 'labels.inputs.Enable Down Payment' | translate }} + + }

    {{ 'labels.inputs.Nominal interest rate' | translate }}

    - + @if (!loansAccountTermsData?.isLoanProductLinkedToFloatingRate) { {{ 'labels.inputs.Nominal interest rate' | translate }} % - {{ 'labels.inputs.Frequency' | translate }} - - {{ interestRateFrequencyType.value | translateKey: 'catalogs' }} - + @for (interestRateFrequencyType of interestRateFrequencyTypeData; track interestRateFrequencyType) { + + {{ interestRateFrequencyType.value | translateKey: 'catalogs' }} + + } {{ 'labels.inputs.Nominal interest rate frequency' | translate }} {{ 'labels.commons.is' | translate }} {{ 'labels.commons.required' | translate }} - {{ 'labels.inputs.Interest method' | translate }} - - {{ interestType.value | translateKey: 'catalogs' }} - + @for (interestType of interestTypeData; track interestType) { + + {{ interestType.value | translateKey: 'catalogs' }} + + } - {{ 'labels.inputs.Amortization' | translate }} - - {{ amortizationType.value | translateKey: 'catalogs' }} - + @for (amortizationType of amortizationTypeData; track amortizationType) { + + {{ amortizationType.value | translateKey: 'catalogs' }} + + } - - {{ 'labels.inputs.Amortization Type' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (loansAccountTermsForm.controls.amortizationType.hasError('required')) { + + {{ 'labels.inputs.Amortization Type' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } - - - {{ 'labels.inputs.Principal Percentage Per Installment' | translate }} - - - + @if (isEqualPrincipalPayments()) { + + {{ 'labels.inputs.Principal Percentage Per Installment' | translate }} + + + }

    {{ 'labels.inputs.Is Equal Amortization' | translate }}

    -
    + } - + @if (loansAccountTermsData?.isLoanProductLinkedToFloatingRate) {
    {{ 'labels.inputs.Interest Method' | translate }} - - {{ interestType.value | translateKey: 'catalogs' }} - + @for (interestType of interestTypeData; track interestType) { + + {{ interestType.value | translateKey: 'catalogs' }} + + } - {{ 'labels.inputs.Amortization' | translate }} - - {{ amortizationType.value | translateKey: 'catalogs' }} - + @for (amortizationType of amortizationTypeData; track amortizationType) { + + {{ amortizationType.value | translateKey: 'catalogs' }} + + } - - {{ 'labels.inputs.Amortization Type' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (loansAccountTermsForm.controls.amortizationType.hasError('required')) { + + {{ 'labels.inputs.Amortization Type' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } -

    {{ 'labels.inputs.Is Floating Rate' | translate }}?

    -
    + }

    {{ 'labels.inputs.Loan Schedule' | translate }}

    -
    -
    -

    {{ 'labels.inputs.Loan Schedule Type' | translate }}

    -

    {{ loanScheduleType.value | translateKey: 'catalogs' }}

    + @if (loanScheduleType) { +
    +
    +

    {{ 'labels.inputs.Loan Schedule Type' | translate }}

    +

    {{ loanScheduleType.value | translateKey: 'catalogs' }}

    +
    -
    + } {{ 'labels.inputs.Repayment Strategy' | translate }} @@ -278,17 +311,21 @@ matTooltip="{{ 'tooltips.The repayment strategy' | translate }}" [disabled]="repaymentStrategyDisabled" > - - {{ transactionProcessingStrategy.name | translateKey: 'catalogs' }} - + @for ( + transactionProcessingStrategy of transactionProcessingStrategyOptions; + track transactionProcessingStrategy + ) { + + {{ transactionProcessingStrategy.name | translateKey: 'catalogs' }} + + } - - {{ 'labels.inputs.Repayment Strategy' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (loansAccountTermsForm.controls.transactionProcessingStrategyCode.hasError('required')) { + + {{ 'labels.inputs.Repayment Strategy' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + }

    {{ 'labels.heading.Interest Calculations' | translate }}

    @@ -299,12 +336,11 @@ formControlName="interestCalculationPeriodType" matTooltip="{{ 'tooltips.Daily - Will Calculate the interest' | translate }}" > - - {{ interestCalculationPeriodType.value | translateKey: 'catalogs' }} - + @for (interestCalculationPeriodType of interestCalculationPeriodTypeData; track interestCalculationPeriodType) { + + {{ interestCalculationPeriodType.value | translateKey: 'catalogs' }} + + } @@ -316,11 +352,13 @@

    {{ 'labels.inputs.Calculate interest for exact days in partial period' | translate }}

    - - -

    {{ 'labels.inputs.Is interest recognition on disbursement date?' | translate }}

    -
    -
    + @if (isProgressive) { + + +

    {{ 'labels.inputs.Is interest recognition on disbursement date?' | translate }}

    +
    +
    + } {{ 'labels.inputs.Arrears tolerance' | translate }} @@ -361,35 +399,44 @@ -
    -

    - {{ 'labels.inputs.Delinquency Bucket' | translate }} - {{ loanProduct?.delinquencyBucket.name }} -

    -
    + @if (isDelinquencyEnabled()) { +
    +

    + {{ 'labels.inputs.Delinquency Bucket' | translate }} + {{ loanProduct?.delinquencyBucket.name }} +

    +
    + } -
    - -

    {{ 'labels.inputs.Enable installment level Delinquency' | translate }}

    -
    -
    + @if (isDelinquencyEnabled()) { +
    + +

    {{ 'labels.inputs.Enable installment level Delinquency' | translate }}

    +
    +
    + } - - -

    {{ 'labels.inputs.Is Topup Loan' | translate }}?

    -
    - - - {{ 'labels.inputs.Loan closed with Topup' | translate }} - - - {{ clientActiveLoan.accountNo }} - - - -
    + @if (loansAccountTermsData?.isTopup) { + + +

    {{ 'labels.inputs.Is Topup Loan' | translate }}?

    +
    + @if (loansAccountTermsForm.controls.isTopup.value) { + + {{ 'labels.inputs.Loan closed with Topup' | translate }} + + @for (clientActiveLoan of clientActiveLoanData; track clientActiveLoan) { + + {{ clientActiveLoan.accountNo }} + + } + + + } +
    + } @@ -400,20 +447,26 @@ {{ loansAccountTermsData?.isInterestRecalculationEnabled | yesNo }}
    -
    - {{ 'labels.inputs.Days in year' | translate }} - {{ loansAccountTermsData.daysInYearType.value | translateKey: 'catalogs' }} -
    -
    - {{ 'labels.inputs.Days in month' | translate }} - {{ loansAccountTermsData.daysInMonthType.value | translateKey: 'catalogs' }} -
    -
    - {{ 'labels.inputs.Advance payments adjustment type' | translate }} - {{ loansAccountTermsData.interestRecalculationData.rescheduleStrategyType.value }} -
    + @if (loansAccountTermsData?.isInterestRecalculationEnabled) { +
    + {{ 'labels.inputs.Days in year' | translate }} + {{ loansAccountTermsData.daysInYearType.value | translateKey: 'catalogs' }} +
    + } + @if (loansAccountTermsData?.isInterestRecalculationEnabled) { +
    + {{ 'labels.inputs.Days in month' | translate }} + {{ loansAccountTermsData.daysInMonthType.value | translateKey: 'catalogs' }} +
    + } + @if (loansAccountTermsData?.isInterestRecalculationEnabled) { +
    + {{ 'labels.inputs.Advance payments adjustment type' | translate }} + {{ loansAccountTermsData.interestRecalculationData.rescheduleStrategyType.value }} +
    + } - + @if (loansAccountTermsData?.isInterestRecalculationEnabled) {
    {{ 'labels.inputs.Interest recalculation compounding on' | translate }} {{ @@ -421,52 +474,50 @@ | translateKey: 'catalogs' }}
    -
    {{ 'labels.inputs.Frequency Interval for recalculation' | translate }} {{ loansAccountTermsData.interestRecalculationData.recalculationRestFrequencyType.value }} - - on {{ loansAccountTermsData.interestRecalculationData.recalculationRestFrequencyWeekday.value }} - on day {{ loansAccountTermsData.interestRecalculationData.recalculationRestFrequencyOnDay }} - on - {{ loansAccountTermsData.interestRecalculationData.recalculationRestFrequencyNthDay.value }} - {{ loansAccountTermsData.interestRecalculationData.recalculationRestFrequencyWeekday.value }} + @if ( + loansAccountTermsData.interestRecalculationData.recalculationRestFrequencyType.id === 3 && + loansAccountTermsData.interestRecalculationData.recalculationRestFrequencyWeekday + ) { + + on {{ loansAccountTermsData.interestRecalculationData.recalculationRestFrequencyWeekday.value }} + } + @if ( + loansAccountTermsData.interestRecalculationData.recalculationRestFrequencyType.id === 4 && + loansAccountTermsData.interestRecalculationData.recalculationRestFrequencyOnDay + ) { + on day {{ loansAccountTermsData.interestRecalculationData.recalculationRestFrequencyOnDay }} + } + @if ( + loansAccountTermsData.interestRecalculationData.recalculationRestFrequencyType.id === 4 && + !loansAccountTermsData.interestRecalculationData.recalculationRestFrequencyOnDay && + loansAccountTermsData.interestRecalculationData.recalculationRestFrequencyNthDay + ) { + on + {{ loansAccountTermsData.interestRecalculationData.recalculationRestFrequencyNthDay.value }} + {{ loansAccountTermsData.interestRecalculationData.recalculationRestFrequencyWeekday.value }} + }
    -
    + } -
    - {{ 'labels.inputs.Frequency Interval for recalculation' | translate }} - {{ - loansAccountTermsData.interestRecalculationData.recalculationRestFrequencyInterval - }} -
    + @if ( + loansAccountTermsData?.isInterestRecalculationEnabled && + loansAccountTermsData.interestRecalculationData.recalculationRestFrequencyType.id !== 1 + ) { +
    + {{ 'labels.inputs.Frequency Interval for recalculation' | translate }} + {{ + loansAccountTermsData.interestRecalculationData.recalculationRestFrequencyInterval + }} +
    + }
    {{ enableBuyDownFee | yesNo }}
    - + @if (multiDisburseLoan) { -
    -

    {{ 'labels.heading.Loan Tranche Details' | translate }}

    -
    - - {{ 'labels.inputs.Allow full term for each tranche' | translate }} - + @if (allowAddDisbursementDetails()) { +
    +

    {{ 'labels.heading.Loan Tranche Details' | translate }}

    +
    + } + @if (isFullTermTrancheEditable()) { + + {{ 'labels.inputs.Allow full term for each tranche' | translate }} + + }
    {{ 'labels.inputs.Maximum allowed outstanding balance' | translate }} - - {{ 'labels.inputs.Maximum allowed outstanding balance' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (loansAccountTermsForm.controls.maxOutstandingLoanBalance.hasError('required')) { + + {{ 'labels.inputs.Maximum allowed outstanding balance' | translate }} + {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + }
    -
    -

    - {{ 'labels.heading.Loan Tranche Details are not allowed for this Loan Product' | translate }} -

    -
    - + @if (!allowAddDisbursementDetails()) { +
    +

    + {{ 'labels.heading.Loan Tranche Details are not allowed for this Loan Product' | translate }} +

    +
    + } @@ -531,14 +589,12 @@ {{ row.expectedDisbursementDate | dateFormat }} - - -
    {{ 'labels.inputs.Expected Disbursement Date' | translate }} {{ 'labels.inputs.Principal' | translate }} {{ row.principal }} {{ 'labels.inputs.Actions' | translate }} @@ -554,65 +610,63 @@
    -
    + } - + @if ( + loansAccountTermsData?.isInterestRecalculationEnabled && + loansAccountTermsData.interestRecalculationData.interestRecalculationCompoundingType.id !== 0 + ) {
    {{ 'labels.inputs.Frequency for compounding' | translate }} {{ loansAccountTermsData.interestRecalculationData.recalculationCompoundingFrequencyType.value }} - - on {{ loansAccountTermsData.interestRecalculationData.recalculationCompoundingFrequencyWeekday.value }} - - on day - {{ loansAccountTermsData.interestRecalculationData.recalculationCompoundingFrequencyOnDay }} - - on - {{ loansAccountTermsData.interestRecalculationData.recalculationCompoundingFrequencyNthDay.value }} - {{ loansAccountTermsData.interestRecalculationData.recalculationCompoundingFrequencyWeekday.value }} - + @if ( + loansAccountTermsData.interestRecalculationData.recalculationCompoundingFrequencyType.id === 3 && + loansAccountTermsData.interestRecalculationData.recalculationCompoundingFrequencyWeekday + ) { + + on {{ loansAccountTermsData.interestRecalculationData.recalculationCompoundingFrequencyWeekday.value }} + + } + @if ( + loansAccountTermsData.interestRecalculationData.recalculationCompoundingFrequencyType.id === 4 && + loansAccountTermsData.interestRecalculationData.recalculationCompoundingFrequencyOnDay + ) { + on day + {{ loansAccountTermsData.interestRecalculationData.recalculationCompoundingFrequencyOnDay }} + + } + @if ( + loansAccountTermsData.interestRecalculationData.recalculationCompoundingFrequencyType.id === 4 && + !loansAccountTermsData.interestRecalculationData.recalculationCompoundingFrequencyOnDay && + loansAccountTermsData.interestRecalculationData.recalculationCompoundingFrequencyNthDay + ) { + on + {{ loansAccountTermsData.interestRecalculationData.recalculationCompoundingFrequencyNthDay.value }} + {{ loansAccountTermsData.interestRecalculationData.recalculationCompoundingFrequencyWeekday.value }} + + }
    -
    + } -
    - {{ 'labels.inputs.Frequency Interval for compounding' | translate }} - {{ - loansAccountTermsData.interestRecalculationData.recalculationCompoundingFrequencyInterval - }} -
    + @if ( + loansAccountTermsData?.isInterestRecalculationEnabled && + loansAccountTermsData.interestRecalculationData.interestRecalculationCompoundingType.id !== 0 && + loansAccountTermsData.interestRecalculationData.recalculationCompoundingFrequencyType.id !== 1 + ) { +
    + {{ 'labels.inputs.Frequency Interval for compounding' | translate }} + {{ + loansAccountTermsData.interestRecalculationData.recalculationCompoundingFrequencyInterval + }} +
    + } @@ -673,8 +727,10 @@ {{ 'labels.buttons.Next' | translate }} - + @if (loanId) { + + }
    diff --git a/src/app/loans/loans-account-stepper/loans-account-terms-step/loans-account-terms-step.component.ts b/src/app/loans/loans-account-stepper/loans-account-terms-step/loans-account-terms-step.component.ts index 479c20c4a..cf5ffab06 100644 --- a/src/app/loans/loans-account-stepper/loans-account-terms-step/loans-account-terms-step.component.ts +++ b/src/app/loans/loans-account-stepper/loans-account-terms-step/loans-account-terms-step.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, Input, OnChanges } from '@angular/core'; +import { Component, OnInit, Input, OnChanges, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, Validators, UntypedFormControl } from '@angular/forms'; import { MatDialog } from '@angular/material/dialog'; import { ActivatedRoute } from '@angular/router'; @@ -77,6 +77,11 @@ interface DisbursementData { ] }) export class LoansAccountTermsStepComponent implements OnInit, OnChanges { + private formBuilder = inject(UntypedFormBuilder); + private settingsService = inject(SettingsService); + private route = inject(ActivatedRoute); + dialog = inject(MatDialog); + /** Loans Product Options */ @Input() loansProductOptions: any; /** Loans Account Product Template */ @@ -162,12 +167,7 @@ export class LoansAccountTermsStepComponent implements OnInit, OnChanges { * @param formBuilder FormBuilder * @param {SettingsService} settingsService SettingsService */ - constructor( - private formBuilder: UntypedFormBuilder, - private settingsService: SettingsService, - private route: ActivatedRoute, - public dialog: MatDialog - ) { + constructor() { this.loanId = this.route.snapshot.params['loanId']; this.createloansAccountTermsForm(); } @@ -567,7 +567,6 @@ export class LoansAccountTermsStepComponent implements OnInit, OnChanges { required: true, order: 2 }) - ]; const data = { title: 'Add Disbursement Details', diff --git a/src/app/loans/loans-account-stepper/loans-active-client-members/loans-active-client-members.component.html b/src/app/loans/loans-account-stepper/loans-active-client-members/loans-active-client-members.component.html index 5756e75de..f475fdf9a 100644 --- a/src/app/loans/loans-account-stepper/loans-active-client-members/loans-active-client-members.component.html +++ b/src/app/loans/loans-account-stepper/loans-active-client-members/loans-active-client-members.component.html @@ -1,56 +1,55 @@ -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - - - {{ 'labels.inputs.Client ID' | translate }}{{ element.id }}{{ 'labels.inputs.Client Name' | translate }}{{ element.displayName }}{{ 'labels.inputs.Loan Purpose' | translate }} - - {{ 'labels.inputs.Select Purpose' | translate }} - - - {{ purpose.name }} - - - - {{ 'labels.inputs.Original Loan' | translate }} - - - -
    -
    +@if (activeClientMembers) { +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + {{ 'labels.inputs.Client ID' | translate }}{{ element.id }}{{ 'labels.inputs.Client Name' | translate }}{{ element.displayName }}{{ 'labels.inputs.Loan Purpose' | translate }} + + {{ 'labels.inputs.Select Purpose' | translate }} + + @for (purpose of loanPurposeOptions; track purpose) { + + {{ purpose.name }} + + } + + + {{ 'labels.inputs.Original Loan' | translate }} + + + +
    +
    +}
    - + @if (loanId) { + + }
    diff --git a/src/app/loans/loans-account-stepper/loans-active-client-members/loans-active-client-members.component.ts b/src/app/loans/loans-account-stepper/loans-active-client-members/loans-active-client-members.component.ts index a18738432..1ea98f916 100644 --- a/src/app/loans/loans-account-stepper/loans-active-client-members/loans-active-client-members.component.ts +++ b/src/app/loans/loans-account-stepper/loans-active-client-members/loans-active-client-members.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit, Input } from '@angular/core'; +import { Component, OnInit, Input, inject } from '@angular/core'; import { MatTableDataSource, MatTable, @@ -43,11 +43,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class LoansActiveClientMembersComponent implements OnInit { + private route = inject(ActivatedRoute); + loanId: any = null; @Input() activeClientMembers?: any; @Input() loansAccountFormValid: boolean; - constructor(private route: ActivatedRoute) { + constructor() { this.loanId = this.route.snapshot.params['loanId']; } dataSource: any; diff --git a/src/app/loans/loans-view/account-details/account-details.component.html b/src/app/loans/loans-view/account-details/account-details.component.html index e52d8f8ad..c347ff35b 100644 --- a/src/app/loans/loans-view/account-details/account-details.component.html +++ b/src/app/loans/loans-view/account-details/account-details.component.html @@ -13,41 +13,46 @@ >{{ loanDetails.numberOfRepayments }} every {{ loanDetails.repaymentEvery }} {{ loanDetails.repaymentFrequencyType.value | translateKey: 'catalogs' }} - - - {{ 'labels.commons.on' | translate }}{{ loanDetails.repaymentFrequencyNthDayType?.value }} - {{ - loanDetails.repaymentFrequencyDayOfWeekType?.value | translateKey: 'catalogs' - }} + @if ( + loanDetails.repaymentFrequencyType?.id === 2 && + loanDetails.repaymentFrequencyNthDayType?.id !== 0 && + loanDetails.repaymentFrequencyDayOfWeekType?.id !== 0 + ) { + + @if (loanDetails.repaymentFrequencyDayOfWeekType) { + + {{ 'labels.commons.on' | translate }}{{ loanDetails.repaymentFrequencyNthDayType?.value }} + {{ + loanDetails.repaymentFrequencyDayOfWeekType?.value | translateKey: 'catalogs' + }} + + } - + } -
    - {{ 'labels.inputs.Fixed Length' | translate }} - - {{ loanDetails.fixedLength }} {{ loanDetails.repaymentFrequencyType.value | translateKey: 'catalogs' }} -
    + @if (loanDetails.fixedLength) { +
    + {{ 'labels.inputs.Fixed Length' | translate }} + + {{ loanDetails.fixedLength }} {{ loanDetails.repaymentFrequencyType.value | translateKey: 'catalogs' }} +
    + }
    {{ 'labels.inputs.Amortization' | translate }} {{ loanDetails.amortizationType.value | translateKey: 'catalogs' }}
    -
    - {{ 'labels.inputs.Principal Percentage Per Installment' | translate }} - {{ loanDetails.fixedPrincipalPercentagePerInstallment | formatNumber }} % -
    + @if (loanDetails.fixedPrincipalPercentagePerInstallment) { +
    + {{ 'labels.inputs.Principal Percentage Per Installment' | translate }} + {{ loanDetails.fixedPrincipalPercentagePerInstallment | formatNumber }} % +
    + }
    {{ 'labels.inputs.Equal Amortization' | translate }} @@ -84,49 +89,63 @@ {{ loanDetails.enableIncomeCapitalization | yesNo }}
    -
    - {{ 'labels.inputs.Income capitalization calculation type' | translate }} - - {{ loanDetails.capitalizedIncomeCalculationType?.value | translateKey: 'catalogs' }} - -
    + @if (loanDetails.enableIncomeCapitalization) { +
    + {{ 'labels.inputs.Income capitalization calculation type' | translate }} + + {{ loanDetails.capitalizedIncomeCalculationType?.value | translateKey: 'catalogs' }} + +
    + } -
    - {{ 'labels.inputs.Income capitalization strategy' | translate }} - {{ loanDetails.capitalizedIncomeStrategy?.value | translateKey: 'catalogs' }} -
    + @if (loanDetails.enableIncomeCapitalization) { +
    + {{ 'labels.inputs.Income capitalization strategy' | translate }} + {{ loanDetails.capitalizedIncomeStrategy?.value | translateKey: 'catalogs' }} +
    + } -
    - {{ 'labels.inputs.Income capitalization type' | translate }} - {{ loanDetails.capitalizedIncomeType?.value | translateKey: 'catalogs' }} -
    + @if (loanDetails.enableIncomeCapitalization) { +
    + {{ 'labels.inputs.Income capitalization type' | translate }} + {{ loanDetails.capitalizedIncomeType?.value | translateKey: 'catalogs' }} +
    + }
    {{ 'labels.inputs.Enable Buy down fee' | translate }} {{ loanDetails.enableBuyDownFee | yesNo }}
    -
    - {{ 'labels.inputs.Buy down fee calculation type' | translate }} - - {{ loanDetails.buyDownFeeCalculationType?.value | translateKey: 'catalogs' }} - -
    + @if (loanDetails.enableBuyDownFee) { +
    + {{ 'labels.inputs.Buy down fee calculation type' | translate }} + + {{ loanDetails.buyDownFeeCalculationType?.value | translateKey: 'catalogs' }} + +
    + } -
    - {{ 'labels.inputs.Buy down fee strategy' | translate }} - {{ loanDetails.buyDownFeeStrategy?.value | translateKey: 'catalogs' }} -
    + @if (loanDetails.enableBuyDownFee) { +
    + {{ 'labels.inputs.Buy down fee strategy' | translate }} + {{ loanDetails.buyDownFeeStrategy?.value | translateKey: 'catalogs' }} +
    + } -
    - {{ 'labels.inputs.Buy down fee income type' | translate }} - {{ loanDetails.buyDownFeeIncomeType?.value | translateKey: 'catalogs' }} -
    + @if (loanDetails.enableBuyDownFee) { +
    + {{ 'labels.inputs.Buy down fee income type' | translate }} + {{ loanDetails.buyDownFeeIncomeType?.value | translateKey: 'catalogs' }} +
    + } -
    - {{ 'labels.inputs.Merchant Buy down fee' | translate }} - {{ loanDetails.merchantBuyDownFee | yesNo }} -
    + @if (loanDetails.enableBuyDownFee) { +
    + {{ 'labels.inputs.Merchant Buy down fee' | translate }} + {{ loanDetails.merchantBuyDownFee | yesNo }} +
    + }
    {{ 'labels.inputs.Grace: On Principal Payment' | translate }} @@ -150,8 +169,12 @@
    {{ 'labels.inputs.Fund Source' | translate }} - {{ loanDetails.fundName }} - {{ 'labels.inputs.Unassigned' | translate }} + @if (loanDetails.fundName) { + {{ loanDetails.fundName }} + } + @if (!loanDetails.fundName) { + {{ 'labels.inputs.Unassigned' | translate }} + }
    @@ -196,27 +219,35 @@ {{ loanDetails.timeline.expectedMaturityDate | dateFormat }}
    -
    - {{ 'labels.inputs.Fixed EMI amount' | translate }} - {{ loanDetails.fixedEmiAmount | formatNumber }} -
    + @if (loanDetails.canDefineInstallmentAmount) { +
    + {{ 'labels.inputs.Fixed EMI amount' | translate }} + {{ loanDetails.fixedEmiAmount | formatNumber }} +
    + } -
    - {{ 'labels.inputs.Is Topup Loan' | translate }}? - {{ loanDetails.isTopup | yesNo }} -
    + @if (loanDetails.isTopup) { +
    + {{ 'labels.inputs.Is Topup Loan' | translate }}? + {{ loanDetails.isTopup | yesNo }} +
    + } -
    - {{ 'labels.inputs.Loan closed with Topup' | translate }} - - {{ loanDetails.closureLoanAccountNo }} - -
    + @if (loanDetails.isTopup) { +
    + {{ 'labels.inputs.Loan closed with Topup' | translate }} + + {{ loanDetails.closureLoanAccountNo }} + +
    + } -
    - {{ 'labels.inputs.Topup closure amount' | translate }} - {{ loanDetails.topupAmount | formatNumber }} -
    + @if (loanDetails.isTopup) { +
    + {{ 'labels.inputs.Topup closure amount' | translate }} + {{ loanDetails.topupAmount | formatNumber }} +
    + }
    {{ 'labels.inputs.Recalculate Interest based on new terms' | translate }} @@ -233,64 +264,72 @@ {{ loanDetails.daysInMonthType.value | translateKey: 'catalogs' }}
    -
    - {{ 'labels.inputs.Interest recalculation compounding on' | translate }} - - {{ - loanDetails.interestRecalculationData.interestRecalculationCompoundingType.value | translateKey: 'catalogs' - }} - -
    + @if (loanDetails.isInterestRecalculationEnabled) { +
    + {{ 'labels.inputs.Interest recalculation compounding on' | translate }} + + {{ + loanDetails.interestRecalculationData.interestRecalculationCompoundingType.value | translateKey: 'catalogs' + }} + +
    + } -
    - {{ 'labels.inputs.Advance payments adjustment type' | translate }} - - {{ loanDetails.interestRecalculationData.rescheduleStrategyType.value | translateKey: 'catalogs' }} - -
    + @if (loanDetails.isInterestRecalculationEnabled) { +
    + {{ 'labels.inputs.Advance payments adjustment type' | translate }} + + {{ loanDetails.interestRecalculationData.rescheduleStrategyType.value | translateKey: 'catalogs' }} + +
    + } -
    - {{ 'labels.inputs.Frequency for recalculate Outstanding Principal' | translate }} - {{ loanDetails.interestRecalculationData.calendarData.humanReadable }} -
    + @if (loanDetails.isInterestRecalculationEnabled) { +
    + {{ 'labels.inputs.Frequency for recalculate Outstanding Principal' | translate }} + {{ loanDetails.interestRecalculationData.calendarData.humanReadable }} +
    + } -
    - {{ 'labels.inputs.Frequency for compounding' | translate }} - {{ loanDetails.interestRecalculationData.compoundingCalendarData.humanReadable }} -
    + @if ( + loanDetails.isInterestRecalculationEnabled && + loanDetails.interestRecalculationData.interestRecalculationCompoundingType.id !== 0 + ) { +
    + {{ 'labels.inputs.Frequency for compounding' | translate }} + {{ loanDetails.interestRecalculationData.compoundingCalendarData.humanReadable }} +
    + } -
    - {{ 'labels.inputs.Variable Installments Allowed' | translate }} - {{ loanDetails.isVariableInstallmentsAllowed | yesNo }} -
    + @if (loanDetails.isVariableInstallmentsAllowed) { +
    + {{ 'labels.inputs.Variable Installments Allowed' | translate }} + {{ loanDetails.isVariableInstallmentsAllowed | yesNo }} +
    + } -
    - {{ 'labels.inputs.Gap between Installments' | translate }} - - {{ loanDetails.minimumGap | formatNumber }} {{ 'labels.text.Days' | translate }} , Max:{{ - loanDetails.maximumGap | formatNumber - }} {{ 'labels.text.Days' | translate }} - -
    + @if (loanDetails.isVariableInstallmentsAllowed) { +
    + {{ 'labels.inputs.Gap between Installments' | translate }} + + {{ loanDetails.minimumGap | formatNumber }} {{ 'labels.text.Days' | translate }} , Max:{{ + loanDetails.maximumGap | formatNumber + }} {{ 'labels.text.Days' | translate }} + +
    + } -
    - {{ 'labels.inputs.Available Disbursement Amount (with Over Applied)' | translate }} - {{ - loanDetails.delinquent.availableDisbursementAmountWithOverApplied | formatNumber - }} -
    + @if ( + loanDetails && + loanDetails.delinquent && + loanDetails.delinquent.availableDisbursementAmountWithOverApplied !== undefined + ) { +
    + {{ 'labels.inputs.Available Disbursement Amount (with Over Applied)' | translate }} + {{ + loanDetails.delinquent.availableDisbursementAmountWithOverApplied | formatNumber + }} +
    + }
    diff --git a/src/app/loans/loans-view/account-details/account-details.component.ts b/src/app/loans/loans-view/account-details/account-details.component.ts index 40cb0a0b6..008d166ca 100644 --- a/src/app/loans/loans-view/account-details/account-details.component.ts +++ b/src/app/loans/loans-view/account-details/account-details.component.ts @@ -1,4 +1,4 @@ -import { Component } from '@angular/core'; +import { Component, inject } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; import { DateFormatPipe } from '../../../pipes/date-format.pipe'; import { FormatNumberPipe } from '../../../pipes/format-number.pipe'; @@ -17,13 +17,15 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class AccountDetailsComponent { + private route = inject(ActivatedRoute); + loanDetails: any; dataObject: { property: string; value: string; }[]; - constructor(private route: ActivatedRoute) { + constructor() { this.route.parent.data.subscribe((data: { loanDetailsData: any }) => { this.loanDetails = data.loanDetailsData; }); diff --git a/src/app/loans/loans-view/charges-tab/charges-tab.component.html b/src/app/loans/loans-view/charges-tab/charges-tab.component.html index 101fca9a9..e903785cc 100644 --- a/src/app/loans/loans-view/charges-tab/charges-tab.component.html +++ b/src/app/loans/loans-view/charges-tab/charges-tab.component.html @@ -8,8 +8,12 @@ {{ 'labels.inputs.Fee/Penalty' | translate }} - {{ 'labels.inputs.Penalty' | translate }} - {{ 'labels.inputs.Fee' | translate }} + @if (charge.penalty) { + {{ 'labels.inputs.Penalty' | translate }} + } + @if (!charge.penalty) { + {{ 'labels.inputs.Fee' | translate }} + } @@ -25,12 +29,20 @@ - {{ 'labels.inputs.Due As Of' | translate }} - {{ 'labels.inputs.Submitted On' | translate }} + @if (useDueDate) { + {{ 'labels.inputs.Due As Of' | translate }} + } + @if (!useDueDate) { + {{ 'labels.inputs.Submitted On' | translate }} + } - {{ charge.dueDate | dateFormat }} - {{ charge.submittedOnDate | dateFormat }} + @if (useDueDate) { + {{ charge.dueDate | dateFormat }} + } + @if (!useDueDate) { + {{ charge.submittedOnDate | dateFormat }} + } @@ -76,56 +88,61 @@ {{ 'labels.inputs.Actions' | translate }} - + @if (status === 'Submitted and pending approval') { + + + + + } + @if (!charge.paid && status === 'Active') { + + } + @if (charge.chargePayable && !charge.paid && status === 'Active') { + } + @if (!charge.actionFlag) { - - - - + } diff --git a/src/app/loans/loans-view/charges-tab/charges-tab.component.ts b/src/app/loans/loans-view/charges-tab/charges-tab.component.ts index 26defec75..f33a52ff6 100644 --- a/src/app/loans/loans-view/charges-tab/charges-tab.component.ts +++ b/src/app/loans/loans-view/charges-tab/charges-tab.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, ViewChild } from '@angular/core'; +import { Component, OnInit, ViewChild, inject } from '@angular/core'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; import { MatDialog } from '@angular/material/dialog'; import { MatPaginator } from '@angular/material/paginator'; @@ -35,7 +35,7 @@ import { Dates } from 'app/core/utils/dates'; import { SystemService } from 'app/system/system.service'; import { GlobalConfiguration } from 'app/system/configurations/global-configurations-tab/configuration.model'; import { TranslateService } from '@ngx-translate/core'; -import { NgIf, CurrencyPipe } from '@angular/common'; +import { CurrencyPipe } from '@angular/common'; import { MatTooltip } from '@angular/material/tooltip'; import { DateFormatPipe } from '../../../pipes/date-format.pipe'; import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; @@ -65,6 +65,15 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ChargesTabComponent implements OnInit { + private loansService = inject(LoansService); + private route = inject(ActivatedRoute); + private dateUtils = inject(Dates); + private router = inject(Router); + private translateService = inject(TranslateService); + dialog = inject(MatDialog); + private settingsService = inject(SettingsService); + private systemService = inject(SystemService); + /** Loan Details Data */ loanDetails: any; /** Charges Data */ @@ -99,16 +108,7 @@ export class ChargesTabComponent implements OnInit { * @param {ActivatedRoute} route Activated Route. * @param {SettingsService} settingsService Settings Service */ - constructor( - private loansService: LoansService, - private route: ActivatedRoute, - private dateUtils: Dates, - private router: Router, - private translateService: TranslateService, - public dialog: MatDialog, - private settingsService: SettingsService, - private systemService: SystemService - ) { + constructor() { this.route.parent.data.subscribe((data: { loanDetailsData: any }) => { this.loanDetails = data.loanDetailsData; }); @@ -164,7 +164,6 @@ export class ChargesTabComponent implements OnInit { type: 'date', required: true }) - ]; const data = { title: `Pay Charge ${chargeId}`, @@ -229,7 +228,6 @@ export class ChargesTabComponent implements OnInit { type: 'number', required: true }) - ]; const data = { title: `Edit Charge ${charge.id}`, diff --git a/src/app/loans/loans-view/datatable-tab/datatable-tab.component.ts b/src/app/loans/loans-view/datatable-tab/datatable-tab.component.ts index ed5ce8f56..907459661 100644 --- a/src/app/loans/loans-view/datatable-tab/datatable-tab.component.ts +++ b/src/app/loans/loans-view/datatable-tab/datatable-tab.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; import { EntityDatatableTabComponent } from '../../../shared/tabs/entity-datatable-tab/entity-datatable-tab.component'; import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; @@ -13,6 +13,8 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class DatatableTabComponent implements OnInit { + private route = inject(ActivatedRoute); + entityId: string; /** Loan Datatable */ entityDatatable: any = null; @@ -23,7 +25,7 @@ export class DatatableTabComponent implements OnInit { * Fetches data table data from `resolve` * @param {ActivatedRoute} route Activated Route. */ - constructor(private route: ActivatedRoute) { + constructor() { this.entityId = this.route.parent.parent.snapshot.paramMap.get('loanId'); this.entityDatatable = null; this.route.data.subscribe((data: { loanDatatable: any }) => { diff --git a/src/app/loans/loans-view/external-asset-owner-tab/external-asset-owner-tab.component.html b/src/app/loans/loans-view/external-asset-owner-tab/external-asset-owner-tab.component.html index 839792f26..382ec3429 100644 --- a/src/app/loans/loans-view/external-asset-owner-tab/external-asset-owner-tab.component.html +++ b/src/app/loans/loans-view/external-asset-owner-tab/external-asset-owner-tab.component.html @@ -1,200 +1,210 @@
    -
    -

    {{ 'labels.heading.Active Asset Transfer' | translate }}

    -
    - - - - - - - - - - - - - - - - - - - -
    - {{ 'labels.inputs.Status' | translate }} : - -
    - - {{ activeTransferData.status }} -
    -
    - {{ 'labels.inputs.Owner External Id' | translate }} : - - -
    - {{ 'labels.inputs.Settlement Date' | translate }} : - - {{ activeTransferData.settlementDate | dateFormat }} - - {{ 'labels.inputs.Effective Date' | translate }} : - - {{ activeTransferData.effectiveFrom | dateFormat }} -
    - {{ 'labels.inputs.Details' | translate }} : - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - {{ 'labels.inputs.Principal Outstanding' | translate }} : - - {{ activeTransferData.details.totalPrincipalOutstanding | formatNumber }} -
    - {{ 'labels.inputs.Interest Outstanding' | translate }} : - - {{ activeTransferData.details.totalInterestOutstanding | formatNumber }} -
    - {{ 'labels.inputs.Fees Outstanding' | translate }} : - - {{ activeTransferData.details.totalFeeChargesOutstanding | formatNumber }} -
    - {{ 'labels.inputs.Penalties Outstanding' | translate }} : - - {{ activeTransferData.details.totalPenaltyChargesOutstanding | formatNumber }} -
    - {{ 'labels.inputs.Outstanding' | translate }} : - - {{ activeTransferData.details.totalOutstanding | formatNumber }} -
    - {{ 'labels.inputs.Overpaid' | translate }} : - {{ activeTransferData.details.totalOverpaid | formatNumber }}
    -
    + @if (existActiveTransfer) { +
    +

    {{ 'labels.heading.Active Asset Transfer' | translate }}

    +
    + + + + + + + + + + + + + + + + + + + +
    + {{ 'labels.inputs.Status' | translate }} : + +
    + + {{ activeTransferData.status }} +
    +
    + {{ 'labels.inputs.Owner External Id' | translate }} : + + +
    + {{ 'labels.inputs.Settlement Date' | translate }} : + + {{ activeTransferData.settlementDate | dateFormat }} + + {{ 'labels.inputs.Effective Date' | translate }} : + + {{ activeTransferData.effectiveFrom | dateFormat }} +
    + {{ 'labels.inputs.Details' | translate }} : + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + {{ 'labels.inputs.Principal Outstanding' | translate }} : + + {{ activeTransferData.details.totalPrincipalOutstanding | formatNumber }} +
    + {{ 'labels.inputs.Interest Outstanding' | translate }} : + + {{ activeTransferData.details.totalInterestOutstanding | formatNumber }} +
    + {{ 'labels.inputs.Fees Outstanding' | translate }} : + + {{ activeTransferData.details.totalFeeChargesOutstanding | formatNumber }} +
    + {{ 'labels.inputs.Penalties Outstanding' | translate }} : + + {{ activeTransferData.details.totalPenaltyChargesOutstanding | formatNumber }} +
    + {{ 'labels.inputs.Outstanding' | translate }} : + + {{ activeTransferData.details.totalOutstanding | formatNumber }} +
    + {{ 'labels.inputs.Overpaid' | translate }} : + {{ activeTransferData.details.totalOverpaid | formatNumber }}
    +
    +
    -
    + }

    {{ 'labels.heading.External Asset Owner' | translate }}

    -
    - -
    + @if (canBeSold()) { +
    + +
    + } -
    - -
    + @if (canBeCancelled()) { +
    + +
    + } -
    - -
    + @if (canBeBuyed()) { +
    + +
    + }
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    {{ 'labels.inputs.Status' | translate }} -
    - - - {{ itemCurrentStatus(item) | translate }} - -
    -
    {{ 'labels.inputs.Effective From' | translate }}{{ item.effectiveFrom | dateFormat }}{{ 'labels.inputs.Owner External Id' | translate }} - - {{ 'labels.inputs.Transfer External Id' | translate }} - - {{ 'labels.inputs.Settlement Date' | translate }}{{ item.settlementDate | dateFormat }}{{ 'labels.inputs.Purchase Price Ratio' | translate }}{{ item.purchasePriceRatio | number }}{{ 'labels.inputs.Actions' | translate }} - -
    + @if (loanTransfersData.length > 0) { + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {{ 'labels.inputs.Status' | translate }} +
    + + + {{ itemCurrentStatus(item) | translate }} + +
    +
    {{ 'labels.inputs.Effective From' | translate }}{{ item.effectiveFrom | dateFormat }}{{ 'labels.inputs.Owner External Id' | translate }} + + {{ 'labels.inputs.Transfer External Id' | translate }} + + {{ 'labels.inputs.Settlement Date' | translate }}{{ item.settlementDate | dateFormat }}{{ 'labels.inputs.Purchase Price Ratio' | translate }}{{ item.purchasePriceRatio | number }}{{ 'labels.inputs.Actions' | translate }} + @if (!isPendingOrCanceled(item)) { + + } +
    + }
    diff --git a/src/app/loans/loans-view/external-asset-owner-tab/external-asset-owner-tab.component.ts b/src/app/loans/loans-view/external-asset-owner-tab/external-asset-owner-tab.component.ts index 423bb84c7..5e3df7c43 100644 --- a/src/app/loans/loans-view/external-asset-owner-tab/external-asset-owner-tab.component.ts +++ b/src/app/loans/loans-view/external-asset-owner-tab/external-asset-owner-tab.component.ts @@ -1,10 +1,10 @@ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { MatDialog } from '@angular/material/dialog'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; import { ExternalAssetOwner } from 'app/loans/services/external-asset-owner'; import { ExternalAssetOwnerService } from 'app/loans/services/external-asset-owner.service'; import { CancelDialogComponent } from 'app/shared/cancel-dialog/cancel-dialog.component'; -import { NgIf, NgClass, DecimalPipe } from '@angular/common'; +import { NgClass, DecimalPipe } from '@angular/common'; import { FaIconComponent } from '@fortawesome/angular-fontawesome'; import { ExternalIdentifierComponent } from '../../../shared/external-identifier/external-identifier.component'; import { @@ -50,6 +50,12 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ExternalAssetOwnerTabComponent implements OnInit { + private route = inject(ActivatedRoute); + private router = inject(Router); + private dialog = inject(MatDialog); + private externalAssetOwner = inject(ExternalAssetOwner); + private externalAssetOwnerService = inject(ExternalAssetOwnerService); + defaultDate = '9999-12-31'; loanTransfersData: any[] = []; activeTransferData: any; @@ -66,13 +72,7 @@ export class ExternalAssetOwnerTabComponent implements OnInit { currentItem: any; existActiveTransfer = false; - constructor( - private route: ActivatedRoute, - private router: Router, - private dialog: MatDialog, - private externalAssetOwner: ExternalAssetOwner, - private externalAssetOwnerService: ExternalAssetOwnerService - ) { + constructor() { this.route.data.subscribe((data: { loanTransfersData: any; activeTransferData: any }) => { this.loanTransfersData = data.loanTransfersData.empty ? [] : data.loanTransfersData.content; this.activeTransferData = data.activeTransferData || null; diff --git a/src/app/loans/loans-view/external-asset-owner-tab/external-asset-transfer/external-asset-transfer.component.ts b/src/app/loans/loans-view/external-asset-owner-tab/external-asset-transfer/external-asset-transfer.component.ts index bf3ba98ea..0eecd687b 100644 --- a/src/app/loans/loans-view/external-asset-owner-tab/external-asset-transfer/external-asset-transfer.component.ts +++ b/src/app/loans/loans-view/external-asset-owner-tab/external-asset-transfer/external-asset-transfer.component.ts @@ -1,4 +1,4 @@ -import { Component, Input, OnInit } from '@angular/core'; +import { Component, Input, OnInit, inject } from '@angular/core'; import { ExternalAssetOwner } from 'app/loans/services/external-asset-owner'; import { NgClass } from '@angular/common'; import { FaIconComponent } from '@fortawesome/angular-fontawesome'; @@ -21,11 +21,11 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ExternalAssetTransferComponent { + private externalAssetOwner = inject(ExternalAssetOwner); + /** Input Fields Data */ @Input() transferData: any; - constructor(private externalAssetOwner: ExternalAssetOwner) {} - itemStatus(status: string): string { return this.externalAssetOwner.itemStatus(status); } diff --git a/src/app/loans/loans-view/floating-interest-rates/floating-interest-rates.component.ts b/src/app/loans/loans-view/floating-interest-rates/floating-interest-rates.component.ts index 4571c7e87..ed25fb7a9 100644 --- a/src/app/loans/loans-view/floating-interest-rates/floating-interest-rates.component.ts +++ b/src/app/loans/loans-view/floating-interest-rates/floating-interest-rates.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; import { MatTable, @@ -35,6 +35,8 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class FloatingInterestRatesComponent implements OnInit { + private route = inject(ActivatedRoute); + /** Loan Details */ loanDetails: any; /** Interest Rate Data */ @@ -49,7 +51,7 @@ export class FloatingInterestRatesComponent implements OnInit { * Retrieves the loans data from `resolve`. * @param {ActivatedRoute} route Activated Route. */ - constructor(private route: ActivatedRoute) { + constructor() { this.route.parent.data.subscribe((data: { loanDetailsData: any }) => { this.loanDetails = data.loanDetailsData; }); diff --git a/src/app/loans/loans-view/general-tab/general-tab.component.html b/src/app/loans/loans-view/general-tab/general-tab.component.html index 49f144ba0..b5751f10e 100644 --- a/src/app/loans/loans-view/general-tab/general-tab.component.html +++ b/src/app/loans/loans-view/general-tab/general-tab.component.html @@ -1,5 +1,5 @@
    - + @if (loanDetails.summary) {

    {{ 'labels.heading.Performance History' | translate }}

    @@ -21,224 +21,253 @@
    -
    + } -
    -

    {{ 'labels.heading.Loan Summary' | translate }}

    + @if (loanDetails.summary) { +
    +

    {{ 'labels.heading.Loan Summary' | translate }}

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {{ ele.property }}{{ 'labels.inputs.Original' | translate }} + {{ ele.original | currency: currencyCode : 'symbol-narrow' : '1.2-2' }} + {{ 'labels.inputs.Paid' | translate }} + {{ ele.paid | currency: currencyCode : 'symbol-narrow' : '1.2-2' }} + + {{ 'labels.inputs.Credit Adjustments' | translate }} + + {{ ele.adjustment | currency: currencyCode : 'symbol-narrow' : '1.2-2' }} + {{ 'labels.inputs.Waived' | translate }} + {{ ele.waived | currency: currencyCode : 'symbol-narrow' : '1.2-2' }} + {{ 'labels.inputs.Written Off' | translate }} + {{ ele.writtenOff | currency: currencyCode : 'symbol-narrow' : '1.2-2' }} + {{ 'labels.inputs.Outstanding' | translate }} + {{ ele.outstanding | currency: currencyCode : 'symbol-narrow' : '1.2-2' }} + {{ 'labels.inputs.Over Due' | translate }} + {{ ele.overdue | currency: currencyCode : 'symbol-narrow' : '1.2-2' }} +
    +
    + } - - - - - + @if (loanDetails.summary) { +
    +

    {{ 'labels.heading.Loan Details' | translate }}

    +
    {{ ele.property }}
    + + + + + + + +
    {{ 'labels.inputs.' + ele.key | translate }} + @if (ele.key === 'Disbursement Date') { + @if (loanDetails.timeline.actualDisbursementDate) { + + {{ loanDetails.timeline.actualDisbursementDate | dateFormat }} + + } + @if (!loanDetails.timeline.actualDisbursementDate) { + + {{ 'labels.inputs.Not Available' | translate }} + + } + } + @if (ele.key === 'Loan Purpose') { + @if (loanDetails.loanPurposeName) { + {{ loanDetails.loanPurposeName }} + } + @if (!loanDetails.loanPurposeName) { + {{ 'labels.inputs.Not Available' | translate }} + } + } + @if (ele.key === 'Loan Officer') { + @if (!loanDetails.loanOfficerName) { + {{ 'labels.inputs.Unassigned' | translate }} + } + @if (loanDetails.loanOfficerName) { + + {{ loanDetails.loanOfficerName }}   + @if (loanDetails.loanOfficerName) { + + } + + } + } + @if (ele.key === 'Currency') { + {{ loanDetails.currency.name }} {{ loanDetails.currency.code }} + } + @if (ele.key === 'External Id') { + @if (loanDetails.externalId) { + + + + } + @if (!loanDetails.externalId) { + {{ 'labels.inputs.Not Available' | translate }} + } + } + @if (ele.key === 'Write-off Reason') { + @if (ele.value) { + {{ ele.value }} + } + @if (!ele.value) { + {{ 'labels.inputs.Not Available' | translate }} + } + } + @if (ele.key === 'Proposed Amount' || ele.key === 'Approved Amount' || ele.key === 'Disburse Amount') { + {{ ele.value }} + } +
    +
    + } - - {{ 'labels.inputs.Original' | translate }} - - {{ ele.original | currency: currencyCode : 'symbol-narrow' : '1.2-2' }} - - + @if (!loanDetails.summary) { +
    +

    {{ 'labels.heading.Loan Details' | translate }}

    + + + + + + + + +
    {{ 'labels.inputs.' + ele.key | translate }} + @if (ele.key === 'Disbursement Date') { + @if (loanDetails.timeline.actualDisbursementDate) { + + {{ loanDetails.timeline.actualDisbursementDate | dateFormat }} + + } + @if (!loanDetails.timeline.actualDisbursementDate) { + + {{ 'labels.inputs.Not Available' | translate }} + + } + } + @if (ele.key === 'Loan Officer') { + @if (!loanDetails.loanOfficerName) { + {{ 'labels.inputs.Unassigned' | translate }} + } + @if (loanDetails.loanOfficerName) { + + {{ loanDetails.loanOfficerName }}   + @if (loanDetails.loanOfficerName) { + + } + + } + } + @if (ele.key === 'Currency') { + {{ loanDetails.currency.name }} {{ loanDetails.currency.code }} + } + @if (ele.key === 'External Id') { + @if (loanDetails.externalId) { + + + + } + @if (!loanDetails.externalId) { + {{ 'labels.inputs.Not Available' | translate }} + } + } +
    +
    + } - - {{ 'labels.inputs.Paid' | translate }} - - {{ ele.paid | currency: currencyCode : 'symbol-narrow' : '1.2-2' }} - - - - - {{ 'labels.inputs.Credit Adjustments' | translate }} - - {{ ele.adjustment | currency: currencyCode : 'symbol-narrow' : '1.2-2' }} - - - - - {{ 'labels.inputs.Waived' | translate }} - - {{ ele.waived | currency: currencyCode : 'symbol-narrow' : '1.2-2' }} - - - - - {{ 'labels.inputs.Written Off' | translate }} - - {{ ele.writtenOff | currency: currencyCode : 'symbol-narrow' : '1.2-2' }} - - - - - {{ 'labels.inputs.Outstanding' | translate }} - - {{ ele.outstanding | currency: currencyCode : 'symbol-narrow' : '1.2-2' }} - - - - - {{ 'labels.inputs.Over Due' | translate }} - - {{ ele.overdue | currency: currencyCode : 'symbol-narrow' : '1.2-2' }} - - - - - - -
    - -
    -

    {{ 'labels.heading.Loan Details' | translate }}

    - - - - - - - - - - -
    {{ 'labels.inputs.' + ele.key | translate }} - - - {{ loanDetails.timeline.actualDisbursementDate | dateFormat }} - - - {{ 'labels.inputs.Not Available' | translate }} - - - - - {{ loanDetails.loanPurposeName }} - {{ 'labels.inputs.Not Available' | translate }} - - - - {{ 'labels.inputs.Unassigned' | translate }} - - {{ loanDetails.loanOfficerName }}   - - - - - - {{ loanDetails.currency.name }} {{ loanDetails.currency.code }} - - - - - - - {{ 'labels.inputs.Not Available' | translate }} - - - - {{ ele.value }} - {{ 'labels.inputs.Not Available' | translate }} - - - - {{ ele.value }} - -
    -
    - -
    -

    {{ 'labels.heading.Loan Details' | translate }}

    - - - - - - - - - - -
    {{ 'labels.inputs.' + ele.key | translate }} - - - {{ loanDetails.timeline.actualDisbursementDate | dateFormat }} - - - {{ 'labels.inputs.Not Available' | translate }} - - - - - {{ 'labels.inputs.Unassigned' | translate }} - - {{ loanDetails.loanOfficerName }}   - - - - - - {{ loanDetails.currency.name }} {{ loanDetails.currency.code }} - - - - - - - {{ 'labels.inputs.Not Available' | translate }} - -
    -
    - -
    -

    {{ 'labels.heading.Loan Purpose' | translate }}

    -
    -
    -
    - {{ 'labels.inputs.Loan Purpose' | translate }}: - - {{ loanDetails.loanPurposeName }} - - - {{ 'labels.inputs.Not Provided' | translate }} - -
    - -
    - {{ 'labels.inputs.Proposed Amount' | translate }}: - {{ - loanDetails.proposedPrincipal | currency: currencyCode : 'symbol-narrow' : '1.2-2' - }} -
    - -
    - {{ 'labels.inputs.Approved Amount' | translate }}: - {{ - loanDetails.approvedPrincipal | currency: currencyCode : 'symbol-narrow' : '1.2-2' - }} -
    - -
    - {{ 'labels.inputs.Disburse Amount' | translate }}: - {{ loanDetails.principal | currency: currencyCode : 'symbol-narrow' : '1.2-2' }} -
    - -
    - {{ 'labels.inputs.Balloon Repayment Amount' | translate }}: - {{ - loanDetails.balloonRepaymentAmount | currency: currencyCode : 'symbol-narrow' : '1.2-2' - }} -
    - -
    - {{ 'labels.inputs.Arrears By' | translate }}: - {{ 'labels.inputs.Not Provided' | translate }} + @if (!loanDetails.summary) { +
    +

    {{ 'labels.heading.Loan Purpose' | translate }}

    +
    +
    +
    + {{ 'labels.inputs.Loan Purpose' | translate }}: + @if (loanDetails.loanPurposeName) { + + {{ loanDetails.loanPurposeName }} + + } + @if (!loanDetails.loanPurposeName) { + + {{ 'labels.inputs.Not Provided' | translate }} + + } +
    +
    + {{ 'labels.inputs.Proposed Amount' | translate }}: + {{ + loanDetails.proposedPrincipal | currency: currencyCode : 'symbol-narrow' : '1.2-2' + }} +
    + @if (showApprovedAmountBasedOnStatus()) { +
    + {{ 'labels.inputs.Approved Amount' | translate }}: + {{ + loanDetails.approvedPrincipal | currency: currencyCode : 'symbol-narrow' : '1.2-2' + }} +
    + } + @if (showDisbursedAmountBasedOnStatus()) { +
    + {{ 'labels.inputs.Disburse Amount' | translate }}: + {{ + loanDetails.principal | currency: currencyCode : 'symbol-narrow' : '1.2-2' + }} +
    + } + @if (loanDetails.balloonRepaymentAmount > 0) { +
    + {{ 'labels.inputs.Balloon Repayment Amount' | translate }}: + {{ + loanDetails.balloonRepaymentAmount | currency: currencyCode : 'symbol-narrow' : '1.2-2' + }} +
    + } +
    + {{ 'labels.inputs.Arrears By' | translate }}: + {{ 'labels.inputs.Not Provided' | translate }} +
    -
    + }
    diff --git a/src/app/loans/loans-view/general-tab/general-tab.component.ts b/src/app/loans/loans-view/general-tab/general-tab.component.ts index 19b3bdcc1..3a32a4cec 100644 --- a/src/app/loans/loans-view/general-tab/general-tab.component.ts +++ b/src/app/loans/loans-view/general-tab/general-tab.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; import { MatTableDataSource, @@ -13,7 +13,7 @@ import { MatRowDef, MatRow } from '@angular/material/table'; -import { NgIf, CurrencyPipe } from '@angular/common'; +import { CurrencyPipe } from '@angular/common'; import { ExternalIdentifierComponent } from '../../../shared/external-identifier/external-identifier.component'; import { DateFormatPipe } from '../../../pipes/date-format.pipe'; import { FormatNumberPipe } from '../../../pipes/format-number.pipe'; @@ -42,6 +42,8 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class GeneralTabComponent implements OnInit { + private route = inject(ActivatedRoute); + /** Currency Code */ currencyCode: string; loanDetails: any; @@ -78,7 +80,7 @@ export class GeneralTabComponent implements OnInit { dataSource: MatTableDataSource; detailsDataSource: MatTableDataSource; - constructor(private route: ActivatedRoute) { + constructor() { this.route.parent.data.subscribe((data: { loanDetailsData: any }) => { this.loanDetails = data.loanDetailsData; this.currencyCode = this.loanDetails.currency.code; diff --git a/src/app/loans/loans-view/loan-account-actions/add-collateral/add-collateral.component.html b/src/app/loans/loans-view/loan-account-actions/add-collateral/add-collateral.component.html index 03570ed4d..53b3c4888 100644 --- a/src/app/loans/loans-view/loan-account-actions/add-collateral/add-collateral.component.html +++ b/src/app/loans/loans-view/loan-account-actions/add-collateral/add-collateral.component.html @@ -6,23 +6,27 @@ {{ 'labels.inputs.Collateral Type' | translate }} - - {{ collateral.name }} + @for (collateral of dataObject.allowedCollateralTypes; track collateral) { + {{ collateral.name }} + } - - {{ 'labels.inputs.Collateral Type' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (collateralForm.controls.collateralTypeId.hasError('required')) { + + {{ 'labels.inputs.Collateral Type' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Value' | translate }} - - {{ 'labels.inputs.Value' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (collateralForm.controls.value.hasError('required')) { + + {{ 'labels.inputs.Value' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } diff --git a/src/app/loans/loans-view/loan-account-actions/add-collateral/add-collateral.component.ts b/src/app/loans/loans-view/loan-account-actions/add-collateral/add-collateral.component.ts index 0b13a955a..9bac56505 100644 --- a/src/app/loans/loans-view/loan-account-actions/add-collateral/add-collateral.component.ts +++ b/src/app/loans/loans-view/loan-account-actions/add-collateral/add-collateral.component.ts @@ -1,5 +1,5 @@ /** Angular Imports. */ -import { Component, OnInit, Input } from '@angular/core'; +import { Component, OnInit, Input, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, Validators, ReactiveFormsModule } from '@angular/forms'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; @@ -21,6 +21,11 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class AddCollateralComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private router = inject(Router); + private route = inject(ActivatedRoute); + private loanService = inject(LoansService); + @Input() dataObject: any; /** Collateral form. */ @@ -28,20 +33,6 @@ export class AddCollateralComponent implements OnInit { /** Loan Id. */ loanId: string; - /** - * Retrieve data from `Resolver`. - * @param {FormBuilder} formBuilder Form Builder. - * @param {Router} router Router. - * @param {ActivatedRoute} route Activated Route. - * @param {LoansService} LoansService loans service. - */ - constructor( - private formBuilder: UntypedFormBuilder, - private router: Router, - private route: ActivatedRoute, - private loanService: LoansService - ) {} - ngOnInit() { this.createAddCollateralForm(); } diff --git a/src/app/loans/loans-view/loan-account-actions/add-interest-pause/add-interest-pause.component.html b/src/app/loans/loans-view/loan-account-actions/add-interest-pause/add-interest-pause.component.html index cb8890f69..aaba01196 100644 --- a/src/app/loans/loans-view/loan-account-actions/add-interest-pause/add-interest-pause.component.html +++ b/src/app/loans/loans-view/loan-account-actions/add-interest-pause/add-interest-pause.component.html @@ -1,8 +1,10 @@
    -
    - {{ 'Maturity Date' | translateKey: 'inputs' }} : {{ maturityDate | dateFormat }} -
    + @if (maturityDate) { +
    + {{ 'Maturity Date' | translateKey: 'inputs' }} : {{ maturityDate | dateFormat }} +
    + }
    @@ -18,9 +20,11 @@ /> - - {{ 'labels.inputs.Start Date' | translate }}{{ 'labels.commons.required' | translate }} - + @if (interestPauseLoanForm.controls.startDate.hasError('required')) { + + {{ 'labels.inputs.Start Date' | translate }}{{ 'labels.commons.required' | translate }} + + } @@ -35,9 +39,11 @@ /> - - {{ 'labels.inputs.End Date' | translate }}{{ 'labels.commons.required' | translate }} - + @if (interestPauseLoanForm.controls.endDate.hasError('required')) { + + {{ 'labels.inputs.End Date' | translate }}{{ 'labels.commons.required' | translate }} + + }
    diff --git a/src/app/loans/loans-view/loan-account-actions/add-interest-pause/add-interest-pause.component.ts b/src/app/loans/loans-view/loan-account-actions/add-interest-pause/add-interest-pause.component.ts index f5d6623c2..052d7c646 100644 --- a/src/app/loans/loans-view/loan-account-actions/add-interest-pause/add-interest-pause.component.ts +++ b/src/app/loans/loans-view/loan-account-actions/add-interest-pause/add-interest-pause.component.ts @@ -1,4 +1,4 @@ -import { Component, Input, OnInit } from '@angular/core'; +import { Component, Input, OnInit, inject } from '@angular/core'; import { UntypedFormBuilder, UntypedFormGroup, Validators, ReactiveFormsModule } from '@angular/forms'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; import { Dates } from 'app/core/utils/dates'; @@ -17,6 +17,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class AddInterestPauseComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private loanService = inject(LoansService); + private route = inject(ActivatedRoute); + private router = inject(Router); + private dateUtils = inject(Dates); + private settingsService = inject(SettingsService); + @Input() dataObject: any; /** Loan Id */ loanId: string; @@ -40,14 +47,7 @@ export class AddInterestPauseComponent implements OnInit { * @param {Router} router Router for navigation. * @param {SettingsService} settingsService Settings Service */ - constructor( - private formBuilder: UntypedFormBuilder, - private loanService: LoansService, - private route: ActivatedRoute, - private router: Router, - private dateUtils: Dates, - private settingsService: SettingsService - ) { + constructor() { this.loanId = this.route.snapshot.params['loanId']; } diff --git a/src/app/loans/loans-view/loan-account-actions/add-loan-charge/add-loan-charge.component.html b/src/app/loans/loans-view/loan-account-actions/add-loan-charge/add-loan-charge.component.html index 43a8e98b9..425d6b293 100644 --- a/src/app/loans/loans-view/loan-account-actions/add-loan-charge/add-loan-charge.component.html +++ b/src/app/loans/loans-view/loan-account-actions/add-loan-charge/add-loan-charge.component.html @@ -6,23 +6,29 @@ {{ 'labels.inputs.Charge' | translate }} - - {{ loanCharge.name + ' (' + loanCharge?.currency.name + ')' }} - + @for (loanCharge of loanChargeOptions; track loanCharge) { + + {{ loanCharge.name + ' (' + loanCharge?.currency.name + ')' }} + + } - - {{ 'labels.inputs.Charge' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (loanChargeForm.controls.chargeId.hasError('required')) { + + {{ 'labels.inputs.Charge' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Amount' | translate }} - - {{ 'labels.inputs.Amount' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (loanChargeForm.controls.amount.hasError('required')) { + + {{ 'labels.inputs.Amount' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } @@ -35,23 +41,27 @@ - - {{ 'labels.inputs.Due On' | translate }} - - - - - {{ 'labels.inputs.Due Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - + @if (loanChargeForm.controls['dueDate']) { + + {{ 'labels.inputs.Due On' | translate }} + + + + @if (loanChargeForm.controls.dueDate.hasError('required')) { + + {{ 'labels.inputs.Due Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + }
    diff --git a/src/app/loans/loans-view/loan-account-actions/add-loan-charge/add-loan-charge.component.ts b/src/app/loans/loans-view/loan-account-actions/add-loan-charge/add-loan-charge.component.ts index a695407cf..63176466a 100644 --- a/src/app/loans/loans-view/loan-account-actions/add-loan-charge/add-loan-charge.component.ts +++ b/src/app/loans/loans-view/loan-account-actions/add-loan-charge/add-loan-charge.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, @@ -27,6 +27,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class AddLoanChargeComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private route = inject(ActivatedRoute); + private router = inject(Router); + private dateUtils = inject(Dates); + private loansService = inject(LoansService); + private settingsService = inject(SettingsService); + /** Minimum Due Date allowed. */ minDate = new Date(2000, 0, 1); /** Maximum Due Date allowed. */ @@ -60,14 +67,7 @@ export class AddLoanChargeComponent implements OnInit { * @param {Router} router Router for navigation. * @param {SettingsService} settingsService Settings Service */ - constructor( - private formBuilder: UntypedFormBuilder, - private route: ActivatedRoute, - private router: Router, - private dateUtils: Dates, - private loansService: LoansService, - private settingsService: SettingsService - ) { + constructor() { this.route.data.subscribe((data: { actionButtonData: any }) => { this.loanChargeOptions = data.actionButtonData.chargeOptions; }); diff --git a/src/app/loans/loans-view/loan-account-actions/adjust-loan-charge/adjust-loan-charge.component.html b/src/app/loans/loans-view/loan-account-actions/adjust-loan-charge/adjust-loan-charge.component.html index 74afcf910..8f26082a1 100644 --- a/src/app/loans/loans-view/loan-account-actions/adjust-loan-charge/adjust-loan-charge.component.html +++ b/src/app/loans/loans-view/loan-account-actions/adjust-loan-charge/adjust-loan-charge.component.html @@ -8,10 +8,12 @@ {{ loanDetailsData.currency.code }} - - {{ 'labels.inputs.Amount' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (adjustLoanChargeForm.controls.amount.hasError('required')) { + + {{ 'labels.inputs.Amount' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + }
    @@ -22,9 +24,11 @@ {{ 'labels.inputs.Payment Type' | translate }} - - {{ paymentType.name }} - + @for (paymentType of paymentTypes; track paymentType) { + + {{ paymentType.name }} + + } @@ -38,32 +42,28 @@
    - + @if (showPaymentDetails) { {{ 'labels.inputs.Account' | translate }} # - {{ 'labels.inputs.Cheque' | translate }} # - {{ 'labels.inputs.Routing Code' | translate }} - {{ 'labels.inputs.Reciept' | translate }} # - {{ 'labels.inputs.Bank' | translate }} # - + } {{ 'labels.inputs.Note' | translate }} diff --git a/src/app/loans/loans-view/loan-account-actions/adjust-loan-charge/adjust-loan-charge.component.ts b/src/app/loans/loans-view/loan-account-actions/adjust-loan-charge/adjust-loan-charge.component.ts index 254adf4d3..39e299059 100644 --- a/src/app/loans/loans-view/loan-account-actions/adjust-loan-charge/adjust-loan-charge.component.ts +++ b/src/app/loans/loans-view/loan-account-actions/adjust-loan-charge/adjust-loan-charge.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormBuilder, UntypedFormControl, @@ -25,6 +25,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class AdjustLoanChargeComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private loanService = inject(LoansService); + private route = inject(ActivatedRoute); + private router = inject(Router); + private settingsService = inject(SettingsService); + private organizationService = inject(OrganizationService); + /** Loan Id */ loanId: string; chargeId: string; @@ -50,14 +57,7 @@ export class AdjustLoanChargeComponent implements OnInit { * @param {Router} router Router for navigation. * @param {SettingsService} settingsService Settings Service */ - constructor( - private formBuilder: UntypedFormBuilder, - private loanService: LoansService, - private route: ActivatedRoute, - private router: Router, - private settingsService: SettingsService, - private organizationService: OrganizationService - ) { + constructor() { this.loanId = this.route.snapshot.params['loanId']; this.chargeId = this.route.snapshot.params['id']; this.route.data.subscribe((data: { loansAccountCharge: any; loanDetailsData: any }) => { diff --git a/src/app/loans/loans-view/loan-account-actions/approve-loan/approve-loan.component.html b/src/app/loans/loans-view/loan-account-actions/approve-loan/approve-loan.component.html index 93983fcf5..2fc617610 100644 --- a/src/app/loans/loans-view/loan-account-actions/approve-loan/approve-loan.component.html +++ b/src/app/loans/loans-view/loan-account-actions/approve-loan/approve-loan.component.html @@ -14,10 +14,12 @@ /> - - {{ 'labels.inputs.Approved Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (approveLoanForm.controls.approvedOnDate.hasError('required')) { + + {{ 'labels.inputs.Approved Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } @@ -49,10 +51,12 @@ {{ 'labels.inputs.Transaction Amount' | translate }} - - {{ 'labels.inputs.Transaction Amount' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (approveLoanForm.controls.approvedLoanAmount.hasError('required')) { + + {{ 'labels.inputs.Transaction Amount' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } diff --git a/src/app/loans/loans-view/loan-account-actions/approve-loan/approve-loan.component.ts b/src/app/loans/loans-view/loan-account-actions/approve-loan/approve-loan.component.ts index a8fbf82e1..3a9433dbb 100644 --- a/src/app/loans/loans-view/loan-account-actions/approve-loan/approve-loan.component.ts +++ b/src/app/loans/loans-view/loan-account-actions/approve-loan/approve-loan.component.ts @@ -1,5 +1,5 @@ /** Angular Imports. */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, Validators } from '@angular/forms'; import { ActivatedRoute, Router } from '@angular/router'; import { Dates } from 'app/core/utils/dates'; @@ -28,6 +28,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ApproveLoanComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private route = inject(ActivatedRoute); + private dateUtils = inject(Dates); + private loanService = inject(LoansService); + private router = inject(Router); + private settingsService = inject(SettingsService); + /** Approve Loan form. */ approveLoanForm: UntypedFormGroup; /** Loan data. */ @@ -49,14 +56,7 @@ export class ApproveLoanComponent implements OnInit { * @param router Router. * @param {SettingsService} settingsService Settings Service */ - constructor( - private formBuilder: UntypedFormBuilder, - private route: ActivatedRoute, - private dateUtils: Dates, - private loanService: LoansService, - private router: Router, - private settingsService: SettingsService - ) { + constructor() { this.route.data.subscribe((data: { actionButtonData: any }) => { this.loanData = data.actionButtonData; this.currency = data.actionButtonData.currency; diff --git a/src/app/loans/loans-view/loan-account-actions/asset-transfer-loan/asset-transfer-loan.component.html b/src/app/loans/loans-view/loan-account-actions/asset-transfer-loan/asset-transfer-loan.component.html index ff89f0df6..0639f9cb0 100644 --- a/src/app/loans/loans-view/loan-account-actions/asset-transfer-loan/asset-transfer-loan.component.html +++ b/src/app/loans/loans-view/loan-account-actions/asset-transfer-loan/asset-transfer-loan.component.html @@ -15,29 +15,39 @@ /> - - {{ 'labels.inputs.Settlement Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (saleLoanForm.controls.settlementDate.hasError('required')) { + + {{ 'labels.inputs.Settlement Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } - - {{ 'labels.inputs.Purchase Price Ratio' | translate }} - - - {{ 'labels.inputs.Purchase Price Ratio' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - + @if (!isBuyBack()) { + + {{ 'labels.inputs.Purchase Price Ratio' | translate }} + + @if (saleLoanForm.controls.purchasePriceRatio.hasError('required')) { + + {{ 'labels.inputs.Purchase Price Ratio' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + } - - {{ 'labels.inputs.Owner External Id' | translate }} - - - {{ 'labels.inputs.Owner External Id' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - + @if (!isBuyBack()) { + + {{ 'labels.inputs.Owner External Id' | translate }} + + @if (saleLoanForm.controls.ownerExternalId.hasError('required')) { + + {{ 'labels.inputs.Owner External Id' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + } {{ 'labels.inputs.Transfer External Id' | translate }} diff --git a/src/app/loans/loans-view/loan-account-actions/asset-transfer-loan/asset-transfer-loan.component.ts b/src/app/loans/loans-view/loan-account-actions/asset-transfer-loan/asset-transfer-loan.component.ts index f70e5fa54..d2ead865b 100644 --- a/src/app/loans/loans-view/loan-account-actions/asset-transfer-loan/asset-transfer-loan.component.ts +++ b/src/app/loans/loans-view/loan-account-actions/asset-transfer-loan/asset-transfer-loan.component.ts @@ -1,4 +1,4 @@ -import { Component, Input, OnInit } from '@angular/core'; +import { Component, Input, OnInit, inject } from '@angular/core'; import { UntypedFormBuilder, UntypedFormGroup, Validators, ReactiveFormsModule } from '@angular/forms'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; import { Dates } from 'app/core/utils/dates'; @@ -15,6 +15,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class AssetTransferLoanComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private externalAssetOwnerService = inject(ExternalAssetOwnerService); + private route = inject(ActivatedRoute); + private router = inject(Router); + private dateUtils = inject(Dates); + private settingsService = inject(SettingsService); + BUYBACK_COMMAND = 'buyback'; SALE_COMMAND = 'sale'; @@ -28,14 +35,7 @@ export class AssetTransferLoanComponent implements OnInit { /** Sell Loan Form */ saleLoanForm: UntypedFormGroup; - constructor( - private formBuilder: UntypedFormBuilder, - private externalAssetOwnerService: ExternalAssetOwnerService, - private route: ActivatedRoute, - private router: Router, - private dateUtils: Dates, - private settingsService: SettingsService - ) { + constructor() { this.loanId = this.route.snapshot.params['loanId']; const actionName = this.route.snapshot.params['action']; this.command = actionName === 'Sell Loan' ? this.SALE_COMMAND : this.BUYBACK_COMMAND; diff --git a/src/app/loans/loans-view/loan-account-actions/assign-loan-officer/assign-loan-officer.component.html b/src/app/loans/loans-view/loan-account-actions/assign-loan-officer/assign-loan-officer.component.html index 8294ed002..ab63525dc 100644 --- a/src/app/loans/loans-view/loan-account-actions/assign-loan-officer/assign-loan-officer.component.html +++ b/src/app/loans/loans-view/loan-account-actions/assign-loan-officer/assign-loan-officer.component.html @@ -6,14 +6,18 @@ {{ 'labels.inputs.To Loan Officer' | translate }} - - {{ loanOfficer.displayName }} - + @for (loanOfficer of loanOfficers; track loanOfficer) { + + {{ loanOfficer.displayName }} + + } - - {{ 'labels.inputs.Loan Officer' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (assignOfficerForm.controls.toLoanOfficerId.hasError('required')) { + + {{ 'labels.inputs.Loan Officer' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } @@ -28,10 +32,12 @@ /> - - {{ 'labels.inputs.Assignment Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (assignOfficerForm.controls.assignmentDate.hasError('required')) { + + {{ 'labels.inputs.Assignment Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + }
    diff --git a/src/app/loans/loans-view/loan-account-actions/assign-loan-officer/assign-loan-officer.component.ts b/src/app/loans/loans-view/loan-account-actions/assign-loan-officer/assign-loan-officer.component.ts index f31223890..17a8ddebb 100644 --- a/src/app/loans/loans-view/loan-account-actions/assign-loan-officer/assign-loan-officer.component.ts +++ b/src/app/loans/loans-view/loan-account-actions/assign-loan-officer/assign-loan-officer.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit, Input } from '@angular/core'; +import { Component, OnInit, Input, inject } from '@angular/core'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; import { LoansService } from 'app/loans/loans.service'; import { UntypedFormGroup, UntypedFormBuilder, Validators, ReactiveFormsModule } from '@angular/forms'; @@ -17,6 +17,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class AssignLoanOfficerComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private loanService = inject(LoansService); + private route = inject(ActivatedRoute); + private router = inject(Router); + private dateUtils = inject(Dates); + private settingsService = inject(SettingsService); + @Input() dataObject: any; /** Loan Id */ loanId: string; @@ -35,14 +42,7 @@ export class AssignLoanOfficerComponent implements OnInit { * @param {Router} router Router for navigation. * @param {SettingsService} settingsService Settings Service */ - constructor( - private formBuilder: UntypedFormBuilder, - private loanService: LoansService, - private route: ActivatedRoute, - private router: Router, - private dateUtils: Dates, - private settingsService: SettingsService - ) { + constructor() { this.loanId = this.route.snapshot.params['loanId']; } diff --git a/src/app/loans/loans-view/loan-account-actions/charge-off/charge-off.component.html b/src/app/loans/loans-view/loan-account-actions/charge-off/charge-off.component.html index a5acf5848..9c06fe490 100644 --- a/src/app/loans/loans-view/loan-account-actions/charge-off/charge-off.component.html +++ b/src/app/loans/loans-view/loan-account-actions/charge-off/charge-off.component.html @@ -15,23 +15,29 @@ /> - - {{ 'labels.inputs.Transaction Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (chargeoffLoanForm.controls.transactionDate.hasError('required')) { + + {{ 'labels.inputs.Transaction Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Reason for Charge-Off' | translate }} - - {{ chargeOffReason.name }} - + @for (chargeOffReason of chargeOffReasonOptions; track chargeOffReason) { + + {{ chargeOffReason.name }} + + } - - {{ 'labels.inputs.Reason for Charge-Off' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (chargeoffLoanForm.controls.chargeOffReasonId.hasError('required')) { + + {{ 'labels.inputs.Reason for Charge-Off' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } diff --git a/src/app/loans/loans-view/loan-account-actions/charge-off/charge-off.component.ts b/src/app/loans/loans-view/loan-account-actions/charge-off/charge-off.component.ts index 71cd14b36..fe93685c4 100644 --- a/src/app/loans/loans-view/loan-account-actions/charge-off/charge-off.component.ts +++ b/src/app/loans/loans-view/loan-account-actions/charge-off/charge-off.component.ts @@ -1,4 +1,4 @@ -import { Component, Input, OnInit } from '@angular/core'; +import { Component, Input, OnInit, inject } from '@angular/core'; import { UntypedFormBuilder, UntypedFormGroup, Validators, ReactiveFormsModule } from '@angular/forms'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; import { Dates } from 'app/core/utils/dates'; @@ -17,6 +17,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ChargeOffComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private loanService = inject(LoansService); + private route = inject(ActivatedRoute); + private router = inject(Router); + private dateUtils = inject(Dates); + private settingsService = inject(SettingsService); + @Input() dataObject: any; /** Loan Id */ @@ -41,14 +48,7 @@ export class ChargeOffComponent implements OnInit { * @param {Router} router Router for navigation. * @param {SettingsService} settingsService Settings Service */ - constructor( - private formBuilder: UntypedFormBuilder, - private loanService: LoansService, - private route: ActivatedRoute, - private router: Router, - private dateUtils: Dates, - private settingsService: SettingsService - ) { + constructor() { this.loanId = this.route.snapshot.params['loanId']; } diff --git a/src/app/loans/loans-view/loan-account-actions/close-as-rescheduled/close-as-rescheduled.component.html b/src/app/loans/loans-view/loan-account-actions/close-as-rescheduled/close-as-rescheduled.component.html index ee2c0fff4..ac4e62fc1 100644 --- a/src/app/loans/loans-view/loan-account-actions/close-as-rescheduled/close-as-rescheduled.component.html +++ b/src/app/loans/loans-view/loan-account-actions/close-as-rescheduled/close-as-rescheduled.component.html @@ -15,10 +15,12 @@ /> - - {{ 'labels.inputs.Closed Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (closeLoanForm.controls.transactionDate.hasError('required')) { + + {{ 'labels.inputs.Closed Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } diff --git a/src/app/loans/loans-view/loan-account-actions/close-as-rescheduled/close-as-rescheduled.component.ts b/src/app/loans/loans-view/loan-account-actions/close-as-rescheduled/close-as-rescheduled.component.ts index acad14c09..95668ee4e 100644 --- a/src/app/loans/loans-view/loan-account-actions/close-as-rescheduled/close-as-rescheduled.component.ts +++ b/src/app/loans/loans-view/loan-account-actions/close-as-rescheduled/close-as-rescheduled.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit, Input } from '@angular/core'; +import { Component, OnInit, Input, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, Validators, ReactiveFormsModule } from '@angular/forms'; import { LoansService } from 'app/loans/loans.service'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; @@ -19,6 +19,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class CloseAsRescheduledComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private loanService = inject(LoansService); + private route = inject(ActivatedRoute); + private router = inject(Router); + private dateUtils = inject(Dates); + private settingsService = inject(SettingsService); + @Input() dataObject: any; /** Close form. */ @@ -37,14 +44,7 @@ export class CloseAsRescheduledComponent implements OnInit { * @param {Router} router Router for navigation. * @param {SettingsService} settingsService Settings Service */ - constructor( - private formBuilder: UntypedFormBuilder, - private loanService: LoansService, - private route: ActivatedRoute, - private router: Router, - private dateUtils: Dates, - private settingsService: SettingsService - ) { + constructor() { this.loanId = this.route.snapshot.params['loanId']; } diff --git a/src/app/loans/loans-view/loan-account-actions/create-guarantor/create-guarantor.component.html b/src/app/loans/loans-view/loan-account-actions/create-guarantor/create-guarantor.component.html index 955d8a794..eb7f55ac1 100644 --- a/src/app/loans/loans-view/loan-account-actions/create-guarantor/create-guarantor.component.html +++ b/src/app/loans/loans-view/loan-account-actions/create-guarantor/create-guarantor.component.html @@ -7,118 +7,119 @@ {{ 'labels.inputs.Existing Client' | translate }} - + @if (!showClientDetailsForm) { {{ 'labels.inputs.name' | translate }} - - {{ 'labels.inputs.name' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (newGuarantorForm.controls.name.hasError('required')) { + + {{ 'labels.inputs.name' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } - - - {{ client.displayName }} - + @for (client of clientsData; track client) { + + {{ client.displayName }} + + } - {{ 'labels.inputs.Relationship' | translate }} - - {{ relationType.name }} - + @for (relationType of relationTypes; track relationType) { + + {{ relationType.name }} + + } - - + @if (accountOptions?.length > 0) { {{ 'labels.inputs.Account' | translate }} - - {{ accountOption.productName }} - {{ accountOption.accountNo }} - + @for (accountOption of accountOptions; track accountOption) { + + {{ accountOption.productName }} - {{ accountOption.accountNo }} + + } - {{ 'labels.inputs.Amount' | translate }} - - + } + } - + @if (showClientDetailsForm) { {{ 'labels.inputs.Relationship' | translate }} - - {{ relationType.name }} - + @for (relationType of relationTypes; track relationType) { + + {{ relationType.name }} + + } - {{ 'labels.inputs.First Name' | translate }} - - {{ 'labels.inputs.First Name' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.is' | translate }} {{ 'labels.commons.required' | translate }} - + @if (newGuarantorForm.controls.firstname.hasError('required')) { + + {{ 'labels.inputs.First Name' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.is' | translate }} {{ 'labels.commons.required' | translate }} + + } - {{ 'labels.inputs.Last Name' | translate }} - - {{ 'labels.inputs.Last Name' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.is' | translate }} {{ 'labels.commons.required' | translate }} - + @if (newGuarantorForm.controls.lastname.hasError('required')) { + + {{ 'labels.inputs.Last Name' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.is' | translate }} {{ 'labels.commons.required' | translate }} + + } - {{ 'labels.inputs.Date Of Birth' | translate }} - {{ 'labels.inputs.Address Line' | translate }} 1 - {{ 'labels.inputs.Address Line' | translate }} 2 - {{ 'labels.inputs.City' | translate }} - {{ 'labels.inputs.Zip' | translate }} - {{ 'labels.inputs.Mobile' | translate }} - {{ 'labels.inputs.Residence Phone' | translate }} # - + }
    @@ -137,7 +138,7 @@ - + @if (newGuarantorForm?.controls?.name?.value) {
    {{ 'labels.inputs.Client Details' | translate }}
    @@ -155,6 +156,6 @@
    {{ newGuarantorForm.controls.name.value.officeName }}
    -
    + } diff --git a/src/app/loans/loans-view/loan-account-actions/create-guarantor/create-guarantor.component.ts b/src/app/loans/loans-view/loan-account-actions/create-guarantor/create-guarantor.component.ts index 6133f152d..5e27266f1 100644 --- a/src/app/loans/loans-view/loan-account-actions/create-guarantor/create-guarantor.component.ts +++ b/src/app/loans/loans-view/loan-account-actions/create-guarantor/create-guarantor.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, Input, AfterViewInit } from '@angular/core'; +import { Component, OnInit, Input, AfterViewInit, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, @@ -33,6 +33,14 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class CreateGuarantorComponent implements OnInit, AfterViewInit { + private formBuilder = inject(UntypedFormBuilder); + private loanService = inject(LoansService); + private route = inject(ActivatedRoute); + private router = inject(Router); + private dateUtils = inject(Dates); + private clientsService = inject(ClientsService); + private settingsService = inject(SettingsService); + @Input() dataObject: any; /** New Guarantor Form */ newGuarantorForm: UntypedFormGroup; @@ -58,15 +66,7 @@ export class CreateGuarantorComponent implements OnInit, AfterViewInit { * @param {Router} router Router for navigation. * @param {SettingsService} settingsService Settings Service */ - constructor( - private formBuilder: UntypedFormBuilder, - private loanService: LoansService, - private route: ActivatedRoute, - private router: Router, - private dateUtils: Dates, - private clientsService: ClientsService, - private settingsService: SettingsService - ) { + constructor() { this.loanId = this.route.snapshot.params['loanId']; } diff --git a/src/app/loans/loans-view/loan-account-actions/disburse-to-savings-account/disburse-to-savings-account.component.html b/src/app/loans/loans-view/loan-account-actions/disburse-to-savings-account/disburse-to-savings-account.component.html index 871883280..d7d31a58d 100644 --- a/src/app/loans/loans-view/loan-account-actions/disburse-to-savings-account/disburse-to-savings-account.component.html +++ b/src/app/loans/loans-view/loan-account-actions/disburse-to-savings-account/disburse-to-savings-account.component.html @@ -15,10 +15,12 @@ /> - - {{ 'labels.inputs.Disbursement Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (disbursementForm.controls.actualDisbursementDate.hasError('required')) { + + {{ 'labels.inputs.Disbursement Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + }
    - - {{ 'labels.inputs.Fixed EMI amount' | translate }} - - + @if (dataObject.fixedEmiAmount) { + + {{ 'labels.inputs.Fixed EMI amount' | translate }} + + + } {{ 'labels.inputs.Note' | translate }} diff --git a/src/app/loans/loans-view/loan-account-actions/disburse-to-savings-account/disburse-to-savings-account.component.ts b/src/app/loans/loans-view/loan-account-actions/disburse-to-savings-account/disburse-to-savings-account.component.ts index a58dc832a..bd71a96b6 100644 --- a/src/app/loans/loans-view/loan-account-actions/disburse-to-savings-account/disburse-to-savings-account.component.ts +++ b/src/app/loans/loans-view/loan-account-actions/disburse-to-savings-account/disburse-to-savings-account.component.ts @@ -1,4 +1,4 @@ -import { Component, Input, OnInit } from '@angular/core'; +import { Component, Input, OnInit, inject } from '@angular/core'; import { UntypedFormBuilder, UntypedFormControl, UntypedFormGroup, Validators } from '@angular/forms'; import { ActivatedRoute, Router } from '@angular/router'; import { Dates } from 'app/core/utils/dates'; @@ -22,6 +22,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class DisburseToSavingsAccountComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private route = inject(ActivatedRoute); + private router = inject(Router); + private dateUtils = inject(Dates); + private loanService = inject(LoansService); + private settingsService = inject(SettingsService); + @Input() dataObject: any; /** Minimum Date allowed. */ @@ -32,23 +39,6 @@ export class DisburseToSavingsAccountComponent implements OnInit { disbursementForm: UntypedFormGroup; currency: Currency; - /** - * Get data from `Resolver`. - * @param {FormBuilder} formBuilder FormBuilder. - * @param {ActivatedRoute} route ActivatedRoute. - * @param {Router} router Router. - * @param {LoansService} loanService Loan Service. - * @param {SettingsService} settingsService Settings Service - */ - constructor( - private formBuilder: UntypedFormBuilder, - private route: ActivatedRoute, - private router: Router, - private dateUtils: Dates, - private loanService: LoansService, - private settingsService: SettingsService - ) {} - ngOnInit() { this.maxDate = this.settingsService.businessDate; this.setDisbursementToSavingsForm(); diff --git a/src/app/loans/loans-view/loan-account-actions/disburse/disburse.component.html b/src/app/loans/loans-view/loan-account-actions/disburse/disburse.component.html index 7d0e4793b..faa539c26 100644 --- a/src/app/loans/loans-view/loan-account-actions/disburse/disburse.component.html +++ b/src/app/loans/loans-view/loan-account-actions/disburse/disburse.component.html @@ -15,10 +15,12 @@ /> - - {{ 'labels.inputs.Disbursed On Date' | translate - }}{{ 'labels.commons.required' | translate }} - + @if (disbursementLoanForm.controls.actualDisbursementDate.hasError('required')) { + + {{ 'labels.inputs.Disbursed On Date' | translate + }}{{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Payment Type' | translate }} - - {{ paymentType.name }} - + @for (paymentType of paymentTypes; track paymentType) { + + {{ paymentType.name }} + + } @@ -59,32 +63,28 @@ - + @if (showPaymentDetails) { {{ 'labels.inputs.Account' | translate }} # - {{ 'labels.inputs.Cheque' | translate }} # - {{ 'labels.inputs.Routing Code' | translate }} - {{ 'labels.inputs.Reciept' | translate }} # - {{ 'labels.inputs.Bank' | translate }} # - + } {{ 'labels.inputs.Note' | translate }} diff --git a/src/app/loans/loans-view/loan-account-actions/disburse/disburse.component.ts b/src/app/loans/loans-view/loan-account-actions/disburse/disburse.component.ts index 068e822ae..e74a28422 100644 --- a/src/app/loans/loans-view/loan-account-actions/disburse/disburse.component.ts +++ b/src/app/loans/loans-view/loan-account-actions/disburse/disburse.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, Input } from '@angular/core'; +import { Component, OnInit, Input, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, Validators, UntypedFormControl } from '@angular/forms'; import { ActivatedRoute, Router } from '@angular/router'; @@ -30,6 +30,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class DisburseComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private loanService = inject(LoansService); + private route = inject(ActivatedRoute); + private router = inject(Router); + private dateUtils = inject(Dates); + private settingsService = inject(SettingsService); + @Input() dataObject: any; /** Loan Id */ loanId: string; @@ -52,14 +59,7 @@ export class DisburseComponent implements OnInit { * @param {Router} router Router for navigation. * @param {SettingsService} settingsService Settings Service */ - constructor( - private formBuilder: UntypedFormBuilder, - private loanService: LoansService, - private route: ActivatedRoute, - private router: Router, - private dateUtils: Dates, - private settingsService: SettingsService - ) { + constructor() { this.loanId = this.route.snapshot.params['loanId']; } diff --git a/src/app/loans/loans-view/loan-account-actions/edit-repayment-schedule/edit-repayment-schedule.component.html b/src/app/loans/loans-view/loan-account-actions/edit-repayment-schedule/edit-repayment-schedule.component.html index 560fe0ee0..701520fda 100644 --- a/src/app/loans/loans-view/loan-account-actions/edit-repayment-schedule/edit-repayment-schedule.component.html +++ b/src/app/loans/loans-view/loan-account-actions/edit-repayment-schedule/edit-repayment-schedule.component.html @@ -2,13 +2,14 @@
    - - + @if (repaymentScheduleDetails) { + + + }
    diff --git a/src/app/loans/loans-view/loan-account-actions/edit-repayment-schedule/edit-repayment-schedule.component.ts b/src/app/loans/loans-view/loan-account-actions/edit-repayment-schedule/edit-repayment-schedule.component.ts index 4b224f163..8bb151a36 100644 --- a/src/app/loans/loans-view/loan-account-actions/edit-repayment-schedule/edit-repayment-schedule.component.ts +++ b/src/app/loans/loans-view/loan-account-actions/edit-repayment-schedule/edit-repayment-schedule.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { MatDialog } from '@angular/material/dialog'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; import { TranslateService } from '@ngx-translate/core'; @@ -24,6 +24,14 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class EditRepaymentScheduleComponent implements OnInit { + private loansService = inject(LoansService); + private router = inject(Router); + private route = inject(ActivatedRoute); + private dialog = inject(MatDialog); + private dateUtils = inject(Dates); + private translateService = inject(TranslateService); + private settingsService = inject(SettingsService); + /** Loan ID. */ loanId: string; /** Indicates If the Schedule has been changed */ @@ -43,15 +51,7 @@ export class EditRepaymentScheduleComponent implements OnInit { * @param {Dates} dateUtils Dates Utils. * @param {SettingsService} settingsService Settings Service */ - constructor( - private loansService: LoansService, - private router: Router, - private route: ActivatedRoute, - private dialog: MatDialog, - private dateUtils: Dates, - private translateService: TranslateService, - private settingsService: SettingsService - ) { + constructor() { this.loanId = this.route.snapshot.params['loanId']; this.getRepaymentSchedule(); } @@ -107,7 +107,6 @@ export class EditRepaymentScheduleComponent implements OnInit { type: 'number', required: true }) - ]; const data = { title: 'Pattern Update', diff --git a/src/app/loans/loans-view/loan-account-actions/foreclosure/foreclosure.component.html b/src/app/loans/loans-view/loan-account-actions/foreclosure/foreclosure.component.html index 084aa346e..a9101f21f 100644 --- a/src/app/loans/loans-view/loan-account-actions/foreclosure/foreclosure.component.html +++ b/src/app/loans/loans-view/loan-account-actions/foreclosure/foreclosure.component.html @@ -15,10 +15,12 @@ /> - - {{ 'labels.inputs.Transaction Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (foreclosureForm.controls.transactionDate.hasError('required')) { + + {{ 'labels.inputs.Transaction Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + }
    diff --git a/src/app/loans/loans-view/loan-account-actions/foreclosure/foreclosure.component.ts b/src/app/loans/loans-view/loan-account-actions/foreclosure/foreclosure.component.ts index dbf6f72ce..8e64bf361 100644 --- a/src/app/loans/loans-view/loan-account-actions/foreclosure/foreclosure.component.ts +++ b/src/app/loans/loans-view/loan-account-actions/foreclosure/foreclosure.component.ts @@ -1,4 +1,4 @@ -import { Component, Input, OnInit } from '@angular/core'; +import { Component, Input, OnInit, inject } from '@angular/core'; import { UntypedFormBuilder, UntypedFormGroup, Validators, ReactiveFormsModule } from '@angular/forms'; import { LoansService } from 'app/loans/loans.service'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; @@ -19,6 +19,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ForeclosureComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private loanService = inject(LoansService); + private route = inject(ActivatedRoute); + private router = inject(Router); + private dateUtils = inject(Dates); + private settingsService = inject(SettingsService); + @Input() dataObject: any; loanId: any; @@ -36,14 +43,7 @@ export class ForeclosureComponent implements OnInit { * @param {Router} router Router for navigation. * @param {SettingsService} settingsService Settings Service */ - constructor( - private formBuilder: UntypedFormBuilder, - private loanService: LoansService, - private route: ActivatedRoute, - private router: Router, - private dateUtils: Dates, - private settingsService: SettingsService - ) { + constructor() { this.loanId = this.route.snapshot.params['loanId']; } diff --git a/src/app/loans/loans-view/loan-account-actions/loan-account-actions.component.html b/src/app/loans/loans-view/loan-account-actions/loan-account-actions.component.html index c13b67ae2..1f3caebbf 100644 --- a/src/app/loans/loans-view/loan-account-actions/loan-account-actions.component.html +++ b/src/app/loans/loans-view/loan-account-actions/loan-account-actions.component.html @@ -1,69 +1,108 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +@if (actions['Close']) { + +} +@if (actions['Undo Approval']) { + +} +@if (actions['Assign Loan Officer']) { + +} +@if (actions['Foreclosure']) { + +} +@if (actions['Prepay Loan'] || actions['Contract Termination']) { + +} +@if (actions['Make Repayment']) { + +} +@if (actions['Capitalized Income']) { + +} +@if (actions['Goodwill Credit']) { + +} +@if (actions['Buy Down Fee']) { + +} +@if (actions['Interest Payment Waiver']) { + +} +@if (actions['Payout Refund']) { + +} +@if (actions['Merchant Issued Refund']) { + +} +@if (actions['Credit Balance Refund']) { + +} +@if (actions['Waive Interest']) { + +} +@if (actions['Write Off']) { + +} +@if (actions['Close (as Rescheduled)']) { + +} +@if (actions['Reschedule']) { + +} +@if (actions['Recovery Payment']) { + +} +@if (actions['View Guarantors']) { + +} +@if (actions['Create Guarantor']) { + +} +@if (actions['Disburse to Savings']) { + +} +@if (actions['Reject']) { + +} +@if (actions['Disburse']) { + +} +@if (actions['Withdrawn by Client']) { + +} +@if (actions['Add Collateral']) { + +} +@if (actions['Undo Disbursal'] || actions['Undo Last Disbursal']) { + +} +@if (actions['Loan Screen Reports']) { + +} +@if (actions['Approve']) { + +} +@if (actions['Add Loan Charge']) { + +} +@if (actions['Edit Repayment Schedule']) { + +} +@if (actions['Charge-Off']) { + +} +@if (actions['Sell Loan'] || actions['Buy Back Loan']) { + +} +@if (actions['Re-Age']) { + +} +@if (actions['Re-Amortize']) { + +} +@if (actions['Add Interest Pause']) { + +} +@if (actions['Undo Write-off']) { + +} diff --git a/src/app/loans/loans-view/loan-account-actions/loan-account-actions.component.ts b/src/app/loans/loans-view/loan-account-actions/loan-account-actions.component.ts index 65fb34cf6..f039a4b28 100644 --- a/src/app/loans/loans-view/loan-account-actions/loan-account-actions.component.ts +++ b/src/app/loans/loans-view/loan-account-actions/loan-account-actions.component.ts @@ -1,5 +1,5 @@ /** Angular Imports. */ -import { Component } from '@angular/core'; +import { Component, inject } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; import { LoansAccountCloseComponent } from './loans-account-close/loans-account-close.component'; import { UndoApprovalComponent } from './undo-approval/undo-approval.component'; @@ -75,6 +75,9 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class LoanAccountActionsComponent { + private route = inject(ActivatedRoute); + private router = inject(Router); + /** Loan Details Data */ navigationData: any; @@ -167,11 +170,8 @@ export class LoanAccountActionsComponent { /** * @param route Activated Route. */ - constructor( - private route: ActivatedRoute, - private router: Router - ) { - const currentNavigation = this.router.getCurrentNavigation(); + constructor() { + const currentNavigation = this.router.currentNavigation(); // Safely access data with optional chaining this.navigationData = currentNavigation?.extras?.state?.data; diff --git a/src/app/loans/loans-view/loan-account-actions/loan-credit-balance-refund/loan-credit-balance-refund.component.html b/src/app/loans/loans-view/loan-account-actions/loan-credit-balance-refund/loan-credit-balance-refund.component.html index 016ee84d7..589d14149 100644 --- a/src/app/loans/loans-view/loan-account-actions/loan-credit-balance-refund/loan-credit-balance-refund.component.html +++ b/src/app/loans/loans-view/loan-account-actions/loan-credit-balance-refund/loan-credit-balance-refund.component.html @@ -15,10 +15,12 @@ /> - - {{ 'labels.inputs.Transaction Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (creditBalanceLoanForm.controls.transactionDate.hasError('required')) { + + {{ 'labels.inputs.Transaction Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } -
    - -
    - - {{ 'labels.inputs.Number of Installments' | translate }} - - - - - {{ 'labels.inputs.Frequency Number' | translate }} - - - - - {{ 'labels.inputs.Frequency Type' | translate }} - - - {{ frequencyType }} - - - - - - {{ 'labels.inputs.Start Date' | translate }} - - - - - {{ 'labels.inputs.Start Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - - - {{ 'labels.inputs.Interest Handling' | translate }} - - + +
    + + {{ 'labels.inputs.Number of Installments' | translate }} + + + + {{ 'labels.inputs.Frequency Number' | translate }} + + + + {{ 'labels.inputs.Frequency Type' | translate }} + + @for (frequencyType of periodFrequencyOptions; track frequencyType) { + + {{ frequencyType }} + + } + + + + {{ 'labels.inputs.Start Date' | translate }} + + + + @if (reagingLoanForm.controls.startDate.hasError('required')) { + + {{ 'labels.inputs.Start Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + + {{ 'labels.inputs.Interest Handling' | translate }} + + @for (reAgeInterestHandlingOption of reAgeInterestHandlingOptions; track reAgeInterestHandlingOption) { + + {{ reAgeInterestHandlingOption.value | translateKey: 'catalogs' }} + + } + + + + {{ 'labels.inputs.Reason' | translate }} + + @for (reAgeReasonOption of reAgeReasonOptions; track reAgeReasonOption) { + + {{ reAgeReasonOption.name }} + + } + + + + {{ 'labels.inputs.External Id' | translate }} + + + + {{ 'labels.inputs.Note' | translate }} + + +
    + - {{ reAgeInterestHandlingOption.value | translateKey: 'catalogs' }} - - - - - - {{ 'labels.inputs.Reason' | translate }} - - - {{ reAgeReasonOption.name }} - - - - - - {{ 'labels.inputs.External Id' | translate }} - - - - - {{ 'labels.inputs.Note' | translate }} - - - -
    - - -
    - {{ 'labels.inputs.Transaction Amount' | translate }} -
    -
    -
    + +
    + {{ 'labels.inputs.Transaction Amount' | translate }} +
    +
    + +
    + @if (addTransactionAmount) { + + + }
    - - - -
    - - - - - - -
    - + + + + + + + + }
    diff --git a/src/app/loans/loans-view/loan-account-actions/loan-reaging/loan-reaging.component.ts b/src/app/loans/loans-view/loan-account-actions/loan-reaging/loan-reaging.component.ts index b5b8514c7..3efd46d97 100644 --- a/src/app/loans/loans-view/loan-account-actions/loan-reaging/loan-reaging.component.ts +++ b/src/app/loans/loans-view/loan-account-actions/loan-reaging/loan-reaging.component.ts @@ -1,4 +1,4 @@ -import { Component, Input, OnInit } from '@angular/core'; +import { Component, Input, OnInit, inject } from '@angular/core'; import { UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms'; import { ActivatedRoute, Router } from '@angular/router'; import { MatDialog } from '@angular/material/dialog'; @@ -24,6 +24,14 @@ import { MatSlideToggle } from '@angular/material/slide-toggle'; ] }) export class LoanReagingComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private route = inject(ActivatedRoute); + private router = inject(Router); + private settingsService = inject(SettingsService); + private loanService = inject(LoansService); + private dateUtils = inject(Dates); + private dialog = inject(MatDialog); + @Input() dataObject: any; /** Loan Id */ loanId: string; @@ -42,15 +50,7 @@ export class LoanReagingComponent implements OnInit { loanTransactionData: LoanTransactionTemplate | null = null; addTransactionAmount = false; - constructor( - private formBuilder: UntypedFormBuilder, - private route: ActivatedRoute, - private router: Router, - private settingsService: SettingsService, - private loanService: LoansService, - private dateUtils: Dates, - private dialog: MatDialog - ) { + constructor() { this.loanId = this.route.snapshot.params['loanId']; } diff --git a/src/app/loans/loans-view/loan-account-actions/loan-reaging/re-age-preview-dialog/re-age-preview-dialog.component.ts b/src/app/loans/loans-view/loan-account-actions/loan-reaging/re-age-preview-dialog/re-age-preview-dialog.component.ts index dfa621e9b..a4412dc37 100644 --- a/src/app/loans/loans-view/loan-account-actions/loan-reaging/re-age-preview-dialog/re-age-preview-dialog.component.ts +++ b/src/app/loans/loans-view/loan-account-actions/loan-reaging/re-age-preview-dialog/re-age-preview-dialog.component.ts @@ -1,4 +1,4 @@ -import { Component, Inject } from '@angular/core'; +import { Component, inject } from '@angular/core'; import { MAT_DIALOG_DATA, MatDialogRef, MatDialogContent, MatDialogActions } from '@angular/material/dialog'; import { MatButton } from '@angular/material/button'; import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; @@ -23,13 +23,15 @@ export interface ReAgePreviewDialogData { ] }) export class ReAgePreviewDialogComponent { + dialogRef = inject>(MatDialogRef); + data = inject(MAT_DIALOG_DATA); + repaymentSchedule: RepaymentSchedule; currencyCode: string; - constructor( - public dialogRef: MatDialogRef, - @Inject(MAT_DIALOG_DATA) public data: ReAgePreviewDialogData - ) { + constructor() { + const data = this.data; + this.repaymentSchedule = data.repaymentSchedule; this.currencyCode = data.currencyCode; } diff --git a/src/app/loans/loans-view/loan-account-actions/loan-reamortize/loan-reamortize.component.html b/src/app/loans/loans-view/loan-account-actions/loan-reamortize/loan-reamortize.component.html index 8ea48c3a9..938e085b3 100644 --- a/src/app/loans/loans-view/loan-account-actions/loan-reamortize/loan-reamortize.component.html +++ b/src/app/loans/loans-view/loan-account-actions/loan-reamortize/loan-reamortize.component.html @@ -6,15 +6,14 @@ {{ 'labels.inputs.Interest Handling' | translate }} - - {{ reAmortizationInterestHandlingOption.value | translateKey: 'catalogs' }} - + @for ( + reAmortizationInterestHandlingOption of reAmortizationInterestHandlingOptions; + track trackByInterestHandlingOption($index, reAmortizationInterestHandlingOption) + ) { + + {{ reAmortizationInterestHandlingOption.value | translateKey: 'catalogs' }} + + } @@ -23,12 +22,14 @@ {{ 'labels.inputs.Reason' | translate }} - - {{ reAmortizationReasonOption.name }} - + @for ( + reAmortizationReasonOption of reAmortizationReasonOptions; + track trackByReasonOption($index, reAmortizationReasonOption) + ) { + + {{ reAmortizationReasonOption.name }} + + } diff --git a/src/app/loans/loans-view/loan-account-actions/loan-reamortize/loan-reamortize.component.ts b/src/app/loans/loans-view/loan-account-actions/loan-reamortize/loan-reamortize.component.ts index b6fd5a17e..d0743ea2b 100644 --- a/src/app/loans/loans-view/loan-account-actions/loan-reamortize/loan-reamortize.component.ts +++ b/src/app/loans/loans-view/loan-account-actions/loan-reamortize/loan-reamortize.component.ts @@ -1,4 +1,4 @@ -import { Component, Input, OnInit } from '@angular/core'; +import { Component, Input, OnInit, inject } from '@angular/core'; import { UntypedFormBuilder, UntypedFormGroup } from '@angular/forms'; import { ActivatedRoute, Router } from '@angular/router'; import { LoansService } from 'app/loans/loans.service'; @@ -15,6 +15,11 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class LoanReamortizeComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private route = inject(ActivatedRoute); + private router = inject(Router); + private loanService = inject(LoansService); + @Input() dataObject: any; /** Loan Id */ loanId: string; @@ -23,12 +28,7 @@ export class LoanReamortizeComponent implements OnInit { reAmortizationReasonOptions: CodeValue[] = []; reAmortizationInterestHandlingOptions: OptionData[] = []; - constructor( - private formBuilder: UntypedFormBuilder, - private route: ActivatedRoute, - private router: Router, - private loanService: LoansService - ) { + constructor() { this.loanId = this.route.snapshot.params['loanId']; } diff --git a/src/app/loans/loans-view/loan-account-actions/loan-reschedule/loan-reschedule.component.html b/src/app/loans/loans-view/loan-account-actions/loan-reschedule/loan-reschedule.component.html index 6138f1e3c..5f2a5b26f 100644 --- a/src/app/loans/loans-view/loan-account-actions/loan-reschedule/loan-reschedule.component.html +++ b/src/app/loans/loans-view/loan-account-actions/loan-reschedule/loan-reschedule.component.html @@ -14,23 +14,29 @@ /> - - {{ 'labels.inputs.Reschedule Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (rescheduleLoanForm.controls.rescheduleFromDate.hasError('required')) { + + {{ 'labels.inputs.Reschedule Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Reason for Rescheduling' | translate }} - - {{ rescheduleReasonCode.name }} - + @for (rescheduleReasonCode of codes; track rescheduleReasonCode) { + + {{ rescheduleReasonCode.name }} + + } - - {{ 'labels.inputs.Reason for Rescheduling' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (rescheduleLoanForm.controls.rescheduleReasonId.hasError('required')) { + + {{ 'labels.inputs.Reason for Rescheduling' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } @@ -44,10 +50,12 @@ /> - - {{ 'labels.inputs.Submitted On Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (rescheduleLoanForm.controls.submittedOnDate.hasError('required')) { + + {{ 'labels.inputs.Submitted On Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } @@ -59,7 +67,7 @@ {{ 'labels.inputs.Change Repayment Date' | translate }} - + @if (changeRepaymentDate.value) { {{ 'labels.inputs.Installment Rescheduled to' | translate }} - + } {{ 'labels.inputs.Introduce Mid-term grace periods' | translate }} - + @if (introduceGracePeriods.value) { {{ 'labels.inputs.Principal Grace Periods' | translate }} - {{ 'labels.inputs.Interest Grace Periods' | translate }} - + } {{ 'labels.inputs.Extend Repayment Period' | translate }} - + @if (extendRepaymentPeriod.value) { {{ 'labels.inputs.Number Of new Repayments' | translate }} - + } {{ 'labels.inputs.Adjust interest rates for remainder of loan' | translate }} - + @if (adjustinterestrates.value) { {{ 'labels.inputs.New Interest Rate' | translate }} - + } diff --git a/src/app/loans/loans-view/loan-account-actions/loan-reschedule/loan-reschedule.component.ts b/src/app/loans/loans-view/loan-account-actions/loan-reschedule/loan-reschedule.component.ts index 077e590c6..622f2de8b 100644 --- a/src/app/loans/loans-view/loan-account-actions/loan-reschedule/loan-reschedule.component.ts +++ b/src/app/loans/loans-view/loan-account-actions/loan-reschedule/loan-reschedule.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit, Input } from '@angular/core'; +import { Component, OnInit, Input, inject } from '@angular/core'; import { LoansService } from 'app/loans/loans.service'; import { UntypedFormBuilder, @@ -25,6 +25,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class LoanRescheduleComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private loanService = inject(LoansService); + private route = inject(ActivatedRoute); + private router = inject(Router); + private dateUtils = inject(Dates); + private settingsService = inject(SettingsService); + @Input() dataObject: any; loanId: any; rescheduleLoanForm: UntypedFormGroup; @@ -47,14 +54,7 @@ export class LoanRescheduleComponent implements OnInit { * @param {Router} router Router for navigation. * @param {SettingsService} settingsService Settings Service */ - constructor( - private formBuilder: UntypedFormBuilder, - private loanService: LoansService, - private route: ActivatedRoute, - private router: Router, - private dateUtils: Dates, - private settingsService: SettingsService - ) { + constructor() { this.loanId = this.route.snapshot.params['loanId']; } diff --git a/src/app/loans/loans-view/loan-account-actions/loan-screen-reports/loan-screen-reports.component.html b/src/app/loans/loans-view/loan-account-actions/loan-screen-reports/loan-screen-reports.component.html index f42b97567..042e4a0ed 100644 --- a/src/app/loans/loans-view/loan-account-actions/loan-screen-reports/loan-screen-reports.component.html +++ b/src/app/loans/loans-view/loan-account-actions/loan-screen-reports/loan-screen-reports.component.html @@ -6,14 +6,18 @@ {{ 'labels.inputs.Loan Screen Reports' | translate }} - - {{ template.name }} - + @for (template of templatesData; track template) { + + {{ template.name }} + + } - - {{ 'labels.inputs.Screen Report' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (loanScreenReportForm.controls.templateId.hasError('required')) { + + {{ 'labels.inputs.Screen Report' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } diff --git a/src/app/loans/loans-view/loan-account-actions/loan-screen-reports/loan-screen-reports.component.ts b/src/app/loans/loans-view/loan-account-actions/loan-screen-reports/loan-screen-reports.component.ts index a22823d4c..5d2ce462e 100644 --- a/src/app/loans/loans-view/loan-account-actions/loan-screen-reports/loan-screen-reports.component.ts +++ b/src/app/loans/loans-view/loan-account-actions/loan-screen-reports/loan-screen-reports.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, Renderer2, ViewChild, ElementRef, SecurityContext, Input } from '@angular/core'; +import { Component, OnInit, Renderer2, ViewChild, ElementRef, SecurityContext, Input, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, ReactiveFormsModule } from '@angular/forms'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; @@ -22,6 +22,12 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class LoanScreenReportsComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private loansService = inject(LoansService); + private route = inject(ActivatedRoute); + private sanitizer = inject(DomSanitizer); + private renderer = inject(Renderer2); + @Input() dataObject: any; /** Loan Screen Reportform. */ loanScreenReportForm: UntypedFormGroup; @@ -43,13 +49,7 @@ export class LoanScreenReportsComponent implements OnInit { * @param {DomSanitizer} sanitizer DOM Sanitizer * @param {Renderer2} renderer Renderer 2 */ - constructor( - private formBuilder: UntypedFormBuilder, - private loansService: LoansService, - private route: ActivatedRoute, - private sanitizer: DomSanitizer, - private renderer: Renderer2 - ) { + constructor() { this.loanId = this.route.snapshot.params['loanId']; } diff --git a/src/app/loans/loans-view/loan-account-actions/loans-account-close/loans-account-close.component.html b/src/app/loans/loans-view/loan-account-actions/loans-account-close/loans-account-close.component.html index 4939d03fe..b1157675f 100644 --- a/src/app/loans/loans-view/loan-account-actions/loans-account-close/loans-account-close.component.html +++ b/src/app/loans/loans-view/loan-account-actions/loans-account-close/loans-account-close.component.html @@ -15,10 +15,12 @@ /> - - {{ 'labels.inputs.Closed Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (closeLoanForm.controls.transactionDate.hasError('required')) { + + {{ 'labels.inputs.Closed Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } diff --git a/src/app/loans/loans-view/loan-account-actions/loans-account-close/loans-account-close.component.ts b/src/app/loans/loans-view/loan-account-actions/loans-account-close/loans-account-close.component.ts index aed7f7725..fe773b19e 100644 --- a/src/app/loans/loans-view/loan-account-actions/loans-account-close/loans-account-close.component.ts +++ b/src/app/loans/loans-view/loan-account-actions/loans-account-close/loans-account-close.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, Input } from '@angular/core'; +import { Component, OnInit, Input, inject } from '@angular/core'; import { UntypedFormBuilder, UntypedFormGroup, Validators, ReactiveFormsModule } from '@angular/forms'; import { Router, ActivatedRoute, RouterLink } from '@angular/router'; import { LoansService } from 'app/loans/loans.service'; @@ -20,6 +20,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class LoansAccountCloseComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private loanService = inject(LoansService); + private route = inject(ActivatedRoute); + private router = inject(Router); + private dateUtils = inject(Dates); + private settingsService = inject(SettingsService); + @Input() dataObject: any; /** Close form. */ @@ -38,14 +45,7 @@ export class LoansAccountCloseComponent implements OnInit { * @param {Router} router Router for navigation. * @param {SettingsService} settingsService Settings Service */ - constructor( - private formBuilder: UntypedFormBuilder, - private loanService: LoansService, - private route: ActivatedRoute, - private router: Router, - private dateUtils: Dates, - private settingsService: SettingsService - ) { + constructor() { this.loanId = this.route.snapshot.params['loanId']; } diff --git a/src/app/loans/loans-view/loan-account-actions/make-repayment/make-repayment.component.html b/src/app/loans/loans-view/loan-account-actions/make-repayment/make-repayment.component.html index 50f521bae..7db7238b4 100644 --- a/src/app/loans/loans-view/loan-account-actions/make-repayment/make-repayment.component.html +++ b/src/app/loans/loans-view/loan-account-actions/make-repayment/make-repayment.component.html @@ -15,45 +15,42 @@ /> - - {{ 'labels.inputs.Transaction Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (repaymentLoanForm.controls.transactionDate.hasError('required')) { + + {{ 'labels.inputs.Transaction Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } -
    -
    - {{ 'labels.inputs.Principal' | translate }} + @if (showDetails()) { +
    +
    + {{ 'labels.inputs.Principal' | translate }} +
    +
    + {{ dataObject.principalPortion | formatNumber }} +
    +
    + {{ 'labels.inputs.Interest' | translate }} +
    +
    + {{ dataObject.interestPortion | formatNumber }} +
    +
    + {{ 'labels.inputs.Fees' | translate }} +
    +
    + {{ dataObject.feeChargesPortion | formatNumber }} +
    +
    + {{ 'labels.inputs.Penalties' | translate }} +
    +
    + {{ dataObject.penaltyChargesPortion | formatNumber }} +
    - -
    - {{ dataObject.principalPortion | formatNumber }} -
    - -
    - {{ 'labels.inputs.Interest' | translate }} -
    - -
    - {{ dataObject.interestPortion | formatNumber }} -
    - -
    - {{ 'labels.inputs.Fees' | translate }} -
    - -
    - {{ dataObject.feeChargesPortion | formatNumber }} -
    - -
    - {{ 'labels.inputs.Penalties' | translate }} -
    - -
    - {{ dataObject.penaltyChargesPortion | formatNumber }} -
    -
    + } - - {{ 'labels.inputs.Classification' | translate }} - - - {{ classificationOption.name }} - - - + @if (isCapitalizedIncome() || isBuyDownFee()) { + + {{ 'labels.inputs.Classification' | translate }} + + @for (classificationOption of classificationOptions; track classificationOption) { + + {{ classificationOption.name }} + + } + + + } {{ 'labels.inputs.Payment Type' | translate }} - - {{ paymentType.name }} - + @for (paymentType of paymentTypes; track paymentType) { + + {{ paymentType.name }} + + } @@ -96,41 +99,39 @@
    - + @if (showPaymentDetails) { {{ 'labels.inputs.Account' | translate }} # - {{ 'labels.inputs.Cheque' | translate }} # - {{ 'labels.inputs.Routing Code' | translate }} - {{ 'labels.inputs.Reciept' | translate }} # - {{ 'labels.inputs.Bank' | translate }} # - + } {{ 'labels.inputs.Note' | translate }} - - {{ 'labels.inputs.Skip Interest Refund Transaction Posting' | translate }} - + @if (showInterestRefundCheckbox()) { + + {{ 'labels.inputs.Skip Interest Refund Transaction Posting' | translate }} + + } diff --git a/src/app/loans/loans-view/loan-account-actions/make-repayment/make-repayment.component.ts b/src/app/loans/loans-view/loan-account-actions/make-repayment/make-repayment.component.ts index d19035350..035ddfd12 100644 --- a/src/app/loans/loans-view/loan-account-actions/make-repayment/make-repayment.component.ts +++ b/src/app/loans/loans-view/loan-account-actions/make-repayment/make-repayment.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, Input } from '@angular/core'; +import { Component, OnInit, Input, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, Validators, UntypedFormControl } from '@angular/forms'; import { ActivatedRoute, Router } from '@angular/router'; @@ -30,6 +30,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class MakeRepaymentComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private loanService = inject(LoansService); + private route = inject(ActivatedRoute); + private router = inject(Router); + private dateUtils = inject(Dates); + private settingsService = inject(SettingsService); + @Input() dataObject: any; /** Loan Id */ loanId: string; @@ -56,14 +63,7 @@ export class MakeRepaymentComponent implements OnInit { * @param {Router} router Router for navigation. * @param {SettingsService} settingsService Settings Service */ - constructor( - private formBuilder: UntypedFormBuilder, - private loanService: LoansService, - private route: ActivatedRoute, - private router: Router, - private dateUtils: Dates, - private settingsService: SettingsService - ) { + constructor() { this.loanId = this.route.snapshot.params['loanId']; } @@ -102,14 +102,16 @@ export class MakeRepaymentComponent implements OnInit { new UntypedFormControl('', [ Validators.required, Validators.min(0.001), - Validators.max(this.dataObject.amount)]) + Validators.max(this.dataObject.amount) + ]) ); } else { this.repaymentLoanForm.addControl( 'transactionAmount', new UntypedFormControl('', [ Validators.required, - Validators.min(0.001)]) + Validators.min(0.001) + ]) ); } if (this.isCapitalizedIncome() || this.isBuyDownFee()) { diff --git a/src/app/loans/loans-view/loan-account-actions/prepay-loan/prepay-loan.component.html b/src/app/loans/loans-view/loan-account-actions/prepay-loan/prepay-loan.component.html index 017d9cc28..72992a8f8 100644 --- a/src/app/loans/loans-view/loan-account-actions/prepay-loan/prepay-loan.component.html +++ b/src/app/loans/loans-view/loan-account-actions/prepay-loan/prepay-loan.component.html @@ -3,23 +3,27 @@
    - - {{ 'labels.inputs.Transaction Date' | translate }} - - - - - {{ 'labels.inputs.Transaction Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - + @if (!contractTermination) { + + {{ 'labels.inputs.Transaction Date' | translate }} + + + + @if (prepayLoanForm.controls.transactionDate.hasError('required')) { + + {{ 'labels.inputs.Transaction Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + }
    @@ -55,65 +59,68 @@
    - - + @if (!contractTermination) { + + + } {{ 'labels.inputs.External Id' | translate }} - - {{ 'labels.inputs.Payment Type' | translate }} - - - {{ paymentType.name }} - - - + @if (!contractTermination) { + + {{ 'labels.inputs.Payment Type' | translate }} + + @for (paymentType of paymentTypes; track paymentType) { + + {{ paymentType.name }} + + } + + + } -
    - - -
    - {{ 'labels.inputs.Show Payment Details' | translate }} -
    -
    -
    -
    + @if (!contractTermination) { +
    + + +
    + {{ 'labels.inputs.Show Payment Details' | translate }} +
    +
    +
    +
    + } - + @if (showPaymentDetails) { {{ 'labels.inputs.Account' | translate }} # - {{ 'labels.inputs.Cheque' | translate }} # - {{ 'labels.inputs.Routing Code' | translate }} - {{ 'labels.inputs.Reciept' | translate }} # - {{ 'labels.inputs.Bank' | translate }} # - + } {{ 'labels.inputs.Note' | translate }} diff --git a/src/app/loans/loans-view/loan-account-actions/prepay-loan/prepay-loan.component.ts b/src/app/loans/loans-view/loan-account-actions/prepay-loan/prepay-loan.component.ts index 82253c563..157e9f979 100644 --- a/src/app/loans/loans-view/loan-account-actions/prepay-loan/prepay-loan.component.ts +++ b/src/app/loans/loans-view/loan-account-actions/prepay-loan/prepay-loan.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, Input } from '@angular/core'; +import { Component, OnInit, Input, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, @@ -36,6 +36,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class PrepayLoanComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private loanService = inject(LoansService); + private route = inject(ActivatedRoute); + private router = inject(Router); + private dateUtils = inject(Dates); + private settingsService = inject(SettingsService); + @Input() dataObject: any; /** Loan Id */ loanId: string; @@ -65,14 +72,7 @@ export class PrepayLoanComponent implements OnInit { * @param {Router} router Router for navigation. * @param {SettingsService} settingsService Settings Service */ - constructor( - private formBuilder: UntypedFormBuilder, - private loanService: LoansService, - private route: ActivatedRoute, - private router: Router, - private dateUtils: Dates, - private settingsService: SettingsService - ) { + constructor() { this.loanId = this.route.snapshot.params['loanId']; } diff --git a/src/app/loans/loans-view/loan-account-actions/recovery-repayment/recovery-repayment.component.html b/src/app/loans/loans-view/loan-account-actions/recovery-repayment/recovery-repayment.component.html index 4f6d67005..863f3212f 100644 --- a/src/app/loans/loans-view/loan-account-actions/recovery-repayment/recovery-repayment.component.html +++ b/src/app/loans/loans-view/loan-account-actions/recovery-repayment/recovery-repayment.component.html @@ -15,10 +15,12 @@ /> - - {{ 'labels.inputs.Transaction Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (recoveryRepaymentLoanForm.controls.transactionDate.hasError('required')) { + + {{ 'labels.inputs.Transaction Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Payment Type' | translate }} - - {{ paymentType.name }} - + @for (paymentType of paymentTypes; track paymentType) { + + {{ paymentType.name }} + + } @@ -53,32 +57,28 @@
    - + @if (showPaymentDetails) { {{ 'labels.inputs.Account' | translate }} # - {{ 'labels.inputs.Cheque' | translate }} # - {{ 'labels.inputs.Routing Code' | translate }} - {{ 'labels.inputs.Reciept' | translate }} # - {{ 'labels.inputs.Bank' | translate }} # - + } {{ 'labels.inputs.Note' | translate }} diff --git a/src/app/loans/loans-view/loan-account-actions/recovery-repayment/recovery-repayment.component.ts b/src/app/loans/loans-view/loan-account-actions/recovery-repayment/recovery-repayment.component.ts index bfa2d8d97..3f1a71fe9 100644 --- a/src/app/loans/loans-view/loan-account-actions/recovery-repayment/recovery-repayment.component.ts +++ b/src/app/loans/loans-view/loan-account-actions/recovery-repayment/recovery-repayment.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, Input } from '@angular/core'; +import { Component, OnInit, Input, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, @@ -34,6 +34,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class RecoveryRepaymentComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private loanService = inject(LoansService); + private route = inject(ActivatedRoute); + private router = inject(Router); + private dateUtils = inject(Dates); + private settingsService = inject(SettingsService); + @Input() dataObject: any; /** Loan Id */ loanId: string; @@ -56,14 +63,7 @@ export class RecoveryRepaymentComponent implements OnInit { * @param {Router} router Router for navigation. * @param {SettingsService} settingsService Settings Service */ - constructor( - private formBuilder: UntypedFormBuilder, - private loanService: LoansService, - private route: ActivatedRoute, - private router: Router, - private dateUtils: Dates, - private settingsService: SettingsService - ) { + constructor() { this.loanId = this.route.snapshot.params['loanId']; } diff --git a/src/app/loans/loans-view/loan-account-actions/reject-loan/reject-loan.component.html b/src/app/loans/loans-view/loan-account-actions/reject-loan/reject-loan.component.html index f6e0123ea..721a5338a 100644 --- a/src/app/loans/loans-view/loan-account-actions/reject-loan/reject-loan.component.html +++ b/src/app/loans/loans-view/loan-account-actions/reject-loan/reject-loan.component.html @@ -15,10 +15,12 @@ /> - - {{ 'labels.inputs.Rejected Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (rejectLoanForm.controls.rejectedOnDate.hasError('required')) { + + {{ 'labels.inputs.Rejected Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } diff --git a/src/app/loans/loans-view/loan-account-actions/reject-loan/reject-loan.component.ts b/src/app/loans/loans-view/loan-account-actions/reject-loan/reject-loan.component.ts index 6835b6c4f..8bc7c56ca 100644 --- a/src/app/loans/loans-view/loan-account-actions/reject-loan/reject-loan.component.ts +++ b/src/app/loans/loans-view/loan-account-actions/reject-loan/reject-loan.component.ts @@ -1,5 +1,5 @@ /** Angular Imports. */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, Validators, ReactiveFormsModule } from '@angular/forms'; import { Router, ActivatedRoute, RouterLink } from '@angular/router'; @@ -23,6 +23,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class RejectLoanComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private router = inject(Router); + private route = inject(ActivatedRoute); + private loanService = inject(LoansService); + private dateUtils = inject(Dates); + private settingsService = inject(SettingsService); + /** Loan Id. */ loanId: any; /** Reject Loan form. */ @@ -39,14 +46,7 @@ export class RejectLoanComponent implements OnInit { * @param route Activated Route. * @param {SettingsService} settingsService Settings Service */ - constructor( - private formBuilder: UntypedFormBuilder, - private router: Router, - private route: ActivatedRoute, - private loanService: LoansService, - private dateUtils: Dates, - private settingsService: SettingsService - ) { + constructor() { this.loanId = this.route.snapshot.params['loanId']; } diff --git a/src/app/loans/loans-view/loan-account-actions/undo-approval/undo-approval.component.ts b/src/app/loans/loans-view/loan-account-actions/undo-approval/undo-approval.component.ts index c227307d8..b880515a6 100644 --- a/src/app/loans/loans-view/loan-account-actions/undo-approval/undo-approval.component.ts +++ b/src/app/loans/loans-view/loan-account-actions/undo-approval/undo-approval.component.ts @@ -1,5 +1,5 @@ /** Angular Imports. */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormControl, UntypedFormBuilder, ReactiveFormsModule } from '@angular/forms'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; @@ -18,21 +18,14 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class UndoApprovalComponent implements OnInit { + private loanService = inject(LoansService); + private formBuilder = inject(UntypedFormBuilder); + private route = inject(ActivatedRoute); + private router = inject(Router); + /** Form Controller. */ note: UntypedFormControl; - /** - * @param loanService Loan Service. - * @param route Activated Route. - * @param router Router. - */ - constructor( - private loanService: LoansService, - private formBuilder: UntypedFormBuilder, - private route: ActivatedRoute, - private router: Router - ) {} - ngOnInit() { this.note = this.formBuilder.control(''); } diff --git a/src/app/loans/loans-view/loan-account-actions/undo-disbursal/undo-disbursal.component.ts b/src/app/loans/loans-view/loan-account-actions/undo-disbursal/undo-disbursal.component.ts index dc649c14f..349e9d812 100644 --- a/src/app/loans/loans-view/loan-account-actions/undo-disbursal/undo-disbursal.component.ts +++ b/src/app/loans/loans-view/loan-account-actions/undo-disbursal/undo-disbursal.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, Input, OnInit } from '@angular/core'; +import { Component, Input, OnInit, inject } from '@angular/core'; import { UntypedFormControl, UntypedFormBuilder, Validators, ReactiveFormsModule } from '@angular/forms'; import { Router, ActivatedRoute, RouterLink } from '@angular/router'; @@ -21,6 +21,11 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class UndoDisbursalComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private loansService = inject(LoansService); + private router = inject(Router); + private route = inject(ActivatedRoute); + @Input() actionName: string; /** Loan ID. */ @@ -34,12 +39,7 @@ export class UndoDisbursalComponent implements OnInit { * @param {ActivatedRoute} route Activated Route. * @param {Router} router Router for navigation. */ - constructor( - private formBuilder: UntypedFormBuilder, - private loansService: LoansService, - private router: Router, - private route: ActivatedRoute - ) { + constructor() { this.loanId = this.route.snapshot.params['loanId']; } diff --git a/src/app/loans/loans-view/loan-account-actions/undo-write-off/undo-write-off.component.ts b/src/app/loans/loans-view/loan-account-actions/undo-write-off/undo-write-off.component.ts index ba1722077..d2a785a10 100644 --- a/src/app/loans/loans-view/loan-account-actions/undo-write-off/undo-write-off.component.ts +++ b/src/app/loans/loans-view/loan-account-actions/undo-write-off/undo-write-off.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, Input } from '@angular/core'; +import { Component, OnInit, Input, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, Validators, ReactiveFormsModule } from '@angular/forms'; import { ActivatedRoute, Router } from '@angular/router'; @@ -24,6 +24,14 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class UndoWriteOffComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private loanService = inject(LoansService); + private route = inject(ActivatedRoute); + private router = inject(Router); + private dateUtils = inject(Dates); + private settingsService = inject(SettingsService); + private alertService = inject(AlertService); + @Input() dataObject: any; /** Loan Id */ loanId: string; @@ -41,15 +49,7 @@ export class UndoWriteOffComponent implements OnInit { * @param {Router} router Router for navigation. * @param {SettingsService} settingsService Settings Service */ - constructor( - private formBuilder: UntypedFormBuilder, - private loanService: LoansService, - private route: ActivatedRoute, - private router: Router, - private dateUtils: Dates, - private settingsService: SettingsService, - private alertService: AlertService - ) { + constructor() { this.loanId = this.route.snapshot.params['loanId']; } diff --git a/src/app/loans/loans-view/loan-account-actions/view-guarantors/view-guarantors.component.html b/src/app/loans/loans-view/loan-account-actions/view-guarantors/view-guarantors.component.html index e5f810668..8e3a55fab 100644 --- a/src/app/loans/loans-view/loan-account-actions/view-guarantors/view-guarantors.component.html +++ b/src/app/loans/loans-view/loan-account-actions/view-guarantors/view-guarantors.component.html @@ -7,10 +7,10 @@ {{ 'labels.inputs.Disbursement Date' | translate }} - {{ dataObject.timeline.actualDisbursementDate - }}{{ - 'labels.inputs.Not Available' | translate - }} + {{ dataObject.timeline.actualDisbursementDate }} + @if (!dataObject.timeline.actualDisbursementDate) { + {{ 'labels.inputs.Not Available' | translate }} + } @@ -21,10 +21,14 @@ {{ 'labels.inputs.Loan Officer' | translate }} {{ dataObject.loanOfficerName }} - {{ 'labels.inputs.Unassigned' | translate }} - - - + @if (!dataObject.loanOfficerName) { + {{ 'labels.inputs.Unassigned' | translate }} + } + @if (dataObject.loanOfficerName) { + + + + } @@ -44,7 +48,9 @@ {{ 'labels.inputs.Loan Purpose' | translate }} {{ dataObject.loanPurposeName }} - {{ 'labels.inputs.Not Provided' | translate }} + @if (!dataObject.loanPurposeName) { + {{ 'labels.inputs.Not Provided' | translate }} + } @@ -63,7 +69,9 @@ {{ 'labels.inputs.Arrears By' | translate }} {{ dataObject.summary?.totalOverdue | formatNumber }} - {{ 'labels.inputs.Not Provided' | translate }} + @if (dataObject.summary?.totalOverdue < 0) { + {{ 'labels.inputs.Not Provided' | translate }} + } @@ -71,129 +79,139 @@ -
    - -
    -
    -
    -

    {{ 'labels.heading.Guarantors Details' | translate }}

    + @if (guarantorDetails) { +
    + +
    +
    +
    +

    {{ 'labels.heading.Guarantors Details' | translate }}

    +
    -
    -
    -
    - +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {{ 'labels.inputs.name' | translate }} + @if (!guarantor.guarantorFundingDetails) { + {{ guarantor.firstname }}   {{ guarantor.lastname }} + } + {{ 'labels.inputs.Relationship' | translate }} + @if (!guarantor.guarantorFundingDetails) { + + {{ guarantor.clientRelationshipType?.name }} + + } + {{ 'labels.inputs.Guarantor Type' | translate }} + @if (!guarantor.guarantorFundingDetails) { + + {{ guarantor.guarantorType.value }} + + } + {{ 'labels.inputs.Deposit Account' | translate }} + @if (!guarantor.guarantorFundingDetails) { + + } + {{ 'labels.inputs.Amount' | translate }} + @if (!guarantor.guarantorFundingDetails) { + + } + {{ 'labels.inputs.Remaining Amount' | translate }} + @if (!guarantor.guarantorFundingDetails) { + + } + {{ 'labels.inputs.Status' | translate }} + @if (!guarantor.guarantorFundingDetails) { + + @if (guarantor.status) { + + {{ 'labels.inputs.Active' | translate }} + + } + @if (!guarantor.status) { + + {{ 'labels.inputs.Deleted' | translate }} + + } + + } + {{ 'labels.inputs.Action' | translate }} + @if (!guarantor.guarantorFundingDetails) { + + + @if (guarantor.status && guarantor.guarantorType.id === 3 && guarantor.id) { + + } + @if (guarantor.status) { + + + + } + + } +
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    {{ 'labels.inputs.name' | translate }} - - {{ guarantor.firstname }}   {{ guarantor.lastname }} - - {{ 'labels.inputs.Relationship' | translate }} - - {{ guarantor.clientRelationshipType?.name }} - - {{ 'labels.inputs.Guarantor Type' | translate }} - - {{ guarantor.guarantorType.value }} - - {{ 'labels.inputs.Deposit Account' | translate }} - - {{ 'labels.inputs.Amount' | translate }} - - {{ 'labels.inputs.Remaining Amount' | translate }} - - {{ 'labels.inputs.Status' | translate }} - - - {{ 'labels.inputs.Active' | translate }} - - - {{ 'labels.inputs.Deleted' | translate }} - - - {{ 'labels.inputs.Action' | translate }} - - - - - - - -
    -
    + }
    diff --git a/src/app/loans/loans-view/loan-account-actions/view-guarantors/view-guarantors.component.ts b/src/app/loans/loans-view/loan-account-actions/view-guarantors/view-guarantors.component.ts index 7491640cd..b15ef6bfb 100644 --- a/src/app/loans/loans-view/loan-account-actions/view-guarantors/view-guarantors.component.ts +++ b/src/app/loans/loans-view/loan-account-actions/view-guarantors/view-guarantors.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, Input } from '@angular/core'; +import { Component, OnInit, Input, inject } from '@angular/core'; import { FormGroup, FormBuilder, Validators, FormControl } from '@angular/forms'; import { ActivatedRoute, Router } from '@angular/router'; import { MatDialog } from '@angular/material/dialog'; @@ -54,6 +54,11 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ViewGuarantorsComponent implements OnInit { + dialog = inject(MatDialog); + loansService = inject(LoansService); + private route = inject(ActivatedRoute); + private router = inject(Router); + @Input() dataObject: any; guarantorDetails: any; showDeletedGuarantorsAccounts = false; @@ -75,12 +80,7 @@ export class ViewGuarantorsComponent implements OnInit { * @param {route} Route Route * @param {router} Router Router */ - constructor( - public dialog: MatDialog, - public loansService: LoansService, - private route: ActivatedRoute, - private router: Router - ) { + constructor() { this.loanId = this.route.snapshot.params['loanId']; } diff --git a/src/app/loans/loans-view/loan-account-actions/waive-interest/waive-interest.component.html b/src/app/loans/loans-view/loan-account-actions/waive-interest/waive-interest.component.html index 48b88bb41..3b5ed5e7b 100644 --- a/src/app/loans/loans-view/loan-account-actions/waive-interest/waive-interest.component.html +++ b/src/app/loans/loans-view/loan-account-actions/waive-interest/waive-interest.component.html @@ -15,10 +15,12 @@ /> - - {{ 'labels.inputs.Interest Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (loanInterestForm.controls.transactionDate.hasError('required')) { + + {{ 'labels.inputs.Interest Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } - - {{ 'labels.inputs.Withdrawn On Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (withdrawnByClientLoanForm.controls.withdrawnOnDate.hasError('required')) { + + {{ 'labels.inputs.Withdrawn On Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } diff --git a/src/app/loans/loans-view/loan-account-actions/withdrawn-by-client/withdrawn-by-client.component.ts b/src/app/loans/loans-view/loan-account-actions/withdrawn-by-client/withdrawn-by-client.component.ts index a938f9250..c24093b7c 100644 --- a/src/app/loans/loans-view/loan-account-actions/withdrawn-by-client/withdrawn-by-client.component.ts +++ b/src/app/loans/loans-view/loan-account-actions/withdrawn-by-client/withdrawn-by-client.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, Input } from '@angular/core'; +import { Component, OnInit, Input, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, Validators, FormControl, ReactiveFormsModule } from '@angular/forms'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; @@ -23,6 +23,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class WithdrawnByClientComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private loanService = inject(LoansService); + private route = inject(ActivatedRoute); + private router = inject(Router); + private dateUtils = inject(Dates); + private settingsService = inject(SettingsService); + @Input() dataObject: any; /** Loan Id */ loanId: string; @@ -40,14 +47,7 @@ export class WithdrawnByClientComponent implements OnInit { * @param {Router} router Router for navigation. * @param {SettingsService} settingsService Settings Service */ - constructor( - private formBuilder: UntypedFormBuilder, - private loanService: LoansService, - private route: ActivatedRoute, - private router: Router, - private dateUtils: Dates, - private settingsService: SettingsService - ) { + constructor() { this.loanId = this.route.snapshot.params['loanId']; } diff --git a/src/app/loans/loans-view/loan-account-actions/write-off-page/write-off-page.component.html b/src/app/loans/loans-view/loan-account-actions/write-off-page/write-off-page.component.html index e5785f354..0b1db01ae 100644 --- a/src/app/loans/loans-view/loan-account-actions/write-off-page/write-off-page.component.html +++ b/src/app/loans/loans-view/loan-account-actions/write-off-page/write-off-page.component.html @@ -15,10 +15,12 @@ /> - - {{ 'labels.inputs.Write Off Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (writeOffForm.controls.transactionDate.hasError('required')) { + + {{ 'labels.inputs.Write Off Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } @@ -29,9 +31,11 @@ {{ 'labels.inputs.Reason for Write-Off' | translate }} - - {{ writeOffReason.name }} - + @for (writeOffReason of writeOffReasonOptions; track writeOffReason) { + + {{ writeOffReason.name }} + + } diff --git a/src/app/loans/loans-view/loan-account-actions/write-off-page/write-off-page.component.ts b/src/app/loans/loans-view/loan-account-actions/write-off-page/write-off-page.component.ts index 90a35587c..ff647800c 100644 --- a/src/app/loans/loans-view/loan-account-actions/write-off-page/write-off-page.component.ts +++ b/src/app/loans/loans-view/loan-account-actions/write-off-page/write-off-page.component.ts @@ -1,5 +1,5 @@ /** Angular Imports. */ -import { Component, OnInit, Input } from '@angular/core'; +import { Component, OnInit, Input, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, Validators, ReactiveFormsModule } from '@angular/forms'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; import { Dates } from 'app/core/utils/dates'; @@ -23,6 +23,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class WriteOffPageComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private route = inject(ActivatedRoute); + private loanService = inject(LoansService); + private dateUtils = inject(Dates); + private router = inject(Router); + private settingsService = inject(SettingsService); + @Input() dataObject: any; /** Loan Id */ loanId: string; @@ -44,14 +51,7 @@ export class WriteOffPageComponent implements OnInit { * @param {Router} router Router. * @param {SettingsService} settingsService Settings Service */ - constructor( - private formBuilder: UntypedFormBuilder, - private route: ActivatedRoute, - private loanService: LoansService, - private dateUtils: Dates, - private router: Router, - private settingsService: SettingsService - ) { + constructor() { this.loanId = this.route.snapshot.params['loanId']; } diff --git a/src/app/loans/loans-view/loan-buy-down-fees-tab/loan-buy-down-fees-tab.component.html b/src/app/loans/loans-view/loan-buy-down-fees-tab/loan-buy-down-fees-tab.component.html index 308bc2581..07ddb3e2a 100644 --- a/src/app/loans/loans-view/loan-buy-down-fees-tab/loan-buy-down-fees-tab.component.html +++ b/src/app/loans/loans-view/loan-buy-down-fees-tab/loan-buy-down-fees-tab.component.html @@ -1,60 +1,61 @@

    {{ 'labels.heading.Buy Down Fees' | translate }}

    -
    - -
    - -
    -
    - {{ 'labels.messages.No Data Found' | translate }} + @if (isLoading) { +
    +
    + } - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    {{ 'labels.heading.Date' | translate }} - {{ item.buyDownFeeDate | dateFormat }} - {{ 'labels.heading.Fee Amount' | translate }} - {{ item.buyDownFeeAmount | formatNumber: '0.00' }} - {{ 'labels.heading.Amortized Amount' | translate }} - {{ item.amortizedAmount | formatNumber: '0.00' }} - {{ 'labels.heading.Not Yet Amortized Amount' | translate }} - {{ item.notYetAmortizedAmount | formatNumber: '0.00' }} - {{ 'labels.heading.Adjusted Amount' | translate }} - {{ item.adjustedAmount | formatNumber: '0.00' }} - {{ 'labels.heading.Charged Off Amount' | translate }} - {{ item.chargedOffAmount | formatNumber: '0.00' }} -
    -
    + @if (!isLoading) { +
    + @if (buyDownFeeData.length === 0) { +
    + {{ 'labels.messages.No Data Found' | translate }} +
    + } + @if (buyDownFeeData.length > 0) { + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {{ 'labels.heading.Date' | translate }} + {{ item.buyDownFeeDate | dateFormat }} + {{ 'labels.heading.Fee Amount' | translate }} + {{ item.buyDownFeeAmount | formatNumber: '0.00' }} + {{ 'labels.heading.Amortized Amount' | translate }} + {{ item.amortizedAmount | formatNumber: '0.00' }} + {{ 'labels.heading.Not Yet Amortized Amount' | translate }} + {{ item.notYetAmortizedAmount | formatNumber: '0.00' }} + {{ 'labels.heading.Adjusted Amount' | translate }} + {{ item.adjustedAmount | formatNumber: '0.00' }} + {{ 'labels.heading.Charged Off Amount' | translate }} + {{ item.chargedOffAmount | formatNumber: '0.00' }} +
    + } +
    + }
    diff --git a/src/app/loans/loans-view/loan-buy-down-fees-tab/loan-buy-down-fees-tab.component.ts b/src/app/loans/loans-view/loan-buy-down-fees-tab/loan-buy-down-fees-tab.component.ts index 0e791156f..7644e3fec 100644 --- a/src/app/loans/loans-view/loan-buy-down-fees-tab/loan-buy-down-fees-tab.component.ts +++ b/src/app/loans/loans-view/loan-buy-down-fees-tab/loan-buy-down-fees-tab.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { MatCell, MatCellDef, @@ -39,6 +39,9 @@ import { DateFormatPipe } from '@pipes/date-format.pipe'; ] }) export class LoanBuyDownFeesTabComponent implements OnInit { + private route = inject(ActivatedRoute); + private loansService = inject(LoansService); + buyDownFeeData: BuyDownFeeAmortizationDetails[] = []; loanId: string; isLoading = true; @@ -52,11 +55,6 @@ export class LoanBuyDownFeesTabComponent implements OnInit { 'chargedOffAmount' ]; - constructor( - private route: ActivatedRoute, - private loansService: LoansService - ) {} - ngOnInit(): void { this.getLoanId(); this.loadBuyDownFees(); diff --git a/src/app/loans/loans-view/loan-collateral-tab/loan-collateral-tab.component.html b/src/app/loans/loans-view/loan-collateral-tab/loan-collateral-tab.component.html index c4b205da3..7f9a78968 100644 --- a/src/app/loans/loans-view/loan-collateral-tab/loan-collateral-tab.component.html +++ b/src/app/loans/loans-view/loan-collateral-tab/loan-collateral-tab.component.html @@ -8,49 +8,49 @@
    -
    - - - - - - - - - + @if (loanCollaterals?.length > 0) { +
    +
    - {{ 'labels.inputs.Number of Collaterals' | translate }} : - - {{ loanCollaterals?.length | formatNumber }} - - {{ 'labels.inputs.Total Amount' | translate }} : - - {{ totalAmount | formatNumber }} -
    + + + + + + + + +
    + {{ 'labels.inputs.Number of Collaterals' | translate }} : + + {{ loanCollaterals?.length | formatNumber }} + + {{ 'labels.inputs.Total Amount' | translate }} : + + {{ totalAmount | formatNumber }} +
    +
    + } + + @if (loanCollaterals?.length > 0) { + + + + + + + + + + + + + + + + + + +
    {{ 'labels.inputs.ID' | translate }}{{ ele.id }}{{ 'labels.inputs.Currency' | translate }}{{ ele.currency.code }}{{ 'labels.inputs.Description' | translate }}{{ ele.description }}{{ 'labels.inputs.Value' | translate }}{{ ele.value | formatNumber }}
    -
    - - - - - - - - - - - - - - - - - - - - - - - - -
    {{ 'labels.inputs.ID' | translate }}{{ ele.id }}{{ 'labels.inputs.Currency' | translate }}{{ ele.currency.code }}{{ 'labels.inputs.Description' | translate }}{{ ele.description }}{{ 'labels.inputs.Value' | translate }}{{ ele.value | formatNumber }}
    + }
    diff --git a/src/app/loans/loans-view/loan-collateral-tab/loan-collateral-tab.component.ts b/src/app/loans/loans-view/loan-collateral-tab/loan-collateral-tab.component.ts index edde01c22..9957c7578 100644 --- a/src/app/loans/loans-view/loan-collateral-tab/loan-collateral-tab.component.ts +++ b/src/app/loans/loans-view/loan-collateral-tab/loan-collateral-tab.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { ActivatedRoute, RouterLink } from '@angular/router'; import { MatTable, @@ -35,6 +35,8 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class LoanCollateralTabComponent implements OnInit { + private route = inject(ActivatedRoute); + /** Loan Collateral Details */ loanCollaterals: any[] = []; /** Columns to be displayed in collateral table. */ @@ -51,7 +53,7 @@ export class LoanCollateralTabComponent implements OnInit { * Retrieves the loans data from `resolve`. * @param {ActivatedRoute} route Activated Route. */ - constructor(private route: ActivatedRoute) { + constructor() { this.route.data.subscribe((data: { loanCollaterals: any }) => { this.loanCollaterals = data.loanCollaterals; }); diff --git a/src/app/loans/loans-view/loan-deferred-income-tab/loan-deferred-income-tab.component.html b/src/app/loans/loans-view/loan-deferred-income-tab/loan-deferred-income-tab.component.html index b518d537f..146a9f234 100644 --- a/src/app/loans/loans-view/loan-deferred-income-tab/loan-deferred-income-tab.component.html +++ b/src/app/loans/loans-view/loan-deferred-income-tab/loan-deferred-income-tab.component.html @@ -1,36 +1,34 @@

    {{ 'labels.inputs.Deferred income' | translate }} - {{ 'labels.menus.Capitalized Income' | translate }}

    - - - - - - - - - - - - - - - - - - - - - - - -
    {{ 'labels.inputs.Amount' | translate }} - {{ item.amount | formatNumber }} - {{ 'labels.inputs.Amortized Amount' | translate }} - {{ item.amortizedAmount | formatNumber }} - {{ 'labels.inputs.Unrecognized Amount' | translate }} - {{ item.unrecognizedAmount | formatNumber }} - {{ 'labels.inputs.Adjustment Amount' | translate }} - {{ item.amountAdjustment | formatNumber: '-' }} -
    + @if (capitalizedIncomeData.length > 0) { + + + + + + + + + + + + + + + + + + + +
    {{ 'labels.inputs.Amount' | translate }} + {{ item.amount | formatNumber }} + {{ 'labels.inputs.Amortized Amount' | translate }} + {{ item.amortizedAmount | formatNumber }} + {{ 'labels.inputs.Unrecognized Amount' | translate }} + {{ item.unrecognizedAmount | formatNumber }} + {{ 'labels.inputs.Adjustment Amount' | translate }} + {{ item.amountAdjustment | formatNumber: '-' }} +
    + }
    diff --git a/src/app/loans/loans-view/loan-deferred-income-tab/loan-deferred-income-tab.component.ts b/src/app/loans/loans-view/loan-deferred-income-tab/loan-deferred-income-tab.component.ts index 0aa9625ea..7831a2b81 100644 --- a/src/app/loans/loans-view/loan-deferred-income-tab/loan-deferred-income-tab.component.ts +++ b/src/app/loans/loans-view/loan-deferred-income-tab/loan-deferred-income-tab.component.ts @@ -1,4 +1,4 @@ -import { Component } from '@angular/core'; +import { Component, inject } from '@angular/core'; import { MatCell, MatCellDef, @@ -36,6 +36,8 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class LoanDeferredIncomeTabComponent { + private route = inject(ActivatedRoute); + capitalizedIncomeData: LoanCapitalizedIncomeData[] = []; loanId: any; @@ -47,7 +49,7 @@ export class LoanDeferredIncomeTabComponent { 'amountAdjustment' ]; - constructor(private route: ActivatedRoute) { + constructor() { this.loanId = this.route.parent.parent.snapshot.params['loanId']; this.capitalizedIncomeData = []; diff --git a/src/app/loans/loans-view/loan-delinquency-tags-tab/loan-delinquency-tags-tab.component.html b/src/app/loans/loans-view/loan-delinquency-tags-tab/loan-delinquency-tags-tab.component.html index d0f184d2d..f83aa6129 100644 --- a/src/app/loans/loans-view/loan-delinquency-tags-tab/loan-delinquency-tags-tab.component.html +++ b/src/app/loans/loans-view/loan-delinquency-tags-tab/loan-delinquency-tags-tab.component.html @@ -1,120 +1,124 @@

    {{ 'labels.heading.Loan Delinquency Tags' | translate }}

    - - - - - - - - - - - - - - - - - - -
    {{ 'labels.inputs.Delinquency Classification' | translate }} - {{ item.delinquencyRange.classification }} - ( {{ item.delinquencyRange.minimumAgeDays }} - {{ item.delinquencyRange.maximumAgeDays }} ) - ( {{ item.delinquencyRange.minimumAgeDays }} ) - {{ 'labels.inputs.Added On' | translate }} - - {{ item.addedOnDate | dateFormat }} - - {{ 'labels.inputs.Lifted On' | translate }} - - {{ item.liftedOnDate | dateFormat }} - -
    - -
    -

    {{ 'labels.heading.Loan Delinquency Installment Tags' | translate }}

    - - + @if (loanDelinquencyTags.length > 0) { +
    - - - - - - - - - - - - - -
    {{ 'labels.inputs.Delinquency Classification' | translate }}{{ item.classification }}{{ 'labels.inputs.Days' | translate }}{{ item.minimumAgeDays | formatNumber }}{{ 'labels.inputs.Amount' | translate }} - {{ item.delinquentAmount | currency: currency.code : 'symbol-narrow' : '1.2-2' }} + {{ item.delinquencyRange.classification }} + @if (item.delinquencyRange.maximumAgeDays) { + ( {{ item.delinquencyRange.minimumAgeDays }} - {{ item.delinquencyRange.maximumAgeDays }} ) + } + @if (!item.delinquencyRange.maximumAgeDays) { + ( {{ item.delinquencyRange.minimumAgeDays }} ) + }
    -
    - -
    - -
    - -
    -

    {{ 'labels.heading.Loan Delinquency Actions' | translate }}

    - - - - - - - - - - - - - - - - - - - - - - - - + + - - - + + + + + +
    {{ 'labels.inputs.Action' | translate }}{{ item.action }}{{ 'labels.inputs.Start Date' | translate }}{{ item.startDate | dateFormat }}{{ 'labels.inputs.End Date' | translate }}{{ item.endDate | dateFormat }}{{ 'labels.inputs.Created On' | translate }}{{ item.createdOn | datetimeFormat }}{{ 'labels.inputs.Actions' | translate }}{{ 'labels.inputs.Added On' | translate }} - - - + @if (item.addedOnDate) { + + {{ item.addedOnDate | dateFormat }} + + }
    {{ 'labels.inputs.Lifted On' | translate }} + @if (item.liftedOnDate) { + + {{ item.liftedOnDate | dateFormat }} + + } +
    -
    + } + + @if (installmentLevelDelinquency.length > 0) { +
    +

    {{ 'labels.heading.Loan Delinquency Installment Tags' | translate }}

    + + + + + + + + + + + + + + + +
    {{ 'labels.inputs.Delinquency Classification' | translate }}{{ item.classification }}{{ 'labels.inputs.Days' | translate }}{{ item.minimumAgeDays | formatNumber }}{{ 'labels.inputs.Amount' | translate }} + {{ item.delinquentAmount | currency: currency.code : 'symbol-narrow' : '1.2-2' }} +
    +
    + } + + @if (allowPause) { +
    + +
    + } + + @if (loanDelinquencyActions.length > 0) { +
    +

    {{ 'labels.heading.Loan Delinquency Actions' | translate }}

    + + + + + + + + + + + + + + + + + + + + + + + +
    {{ 'labels.inputs.Action' | translate }}{{ item.action }}{{ 'labels.inputs.Start Date' | translate }}{{ item.startDate | dateFormat }}{{ 'labels.inputs.End Date' | translate }}{{ item.endDate | dateFormat }}{{ 'labels.inputs.Created On' | translate }}{{ item.createdOn | datetimeFormat }}{{ 'labels.inputs.Actions' | translate }} + @if (isCurrentAndPauseAction(item)) { + + + + } +
    +
    + }
    diff --git a/src/app/loans/loans-view/loan-delinquency-tags-tab/loan-delinquency-tags-tab.component.ts b/src/app/loans/loans-view/loan-delinquency-tags-tab/loan-delinquency-tags-tab.component.ts index b0488d496..4eef95e96 100644 --- a/src/app/loans/loans-view/loan-delinquency-tags-tab/loan-delinquency-tags-tab.component.ts +++ b/src/app/loans/loans-view/loan-delinquency-tags-tab/loan-delinquency-tags-tab.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { MatDialog } from '@angular/material/dialog'; import { ActivatedRoute } from '@angular/router'; import { TranslateService } from '@ngx-translate/core'; @@ -14,7 +14,7 @@ import { import { SettingsService } from 'app/settings/settings.service'; import { ConfirmationDialogComponent } from 'app/shared/confirmation-dialog/confirmation-dialog.component'; import { Currency } from 'app/shared/models/general.model'; -import { NgIf, NgClass, CurrencyPipe } from '@angular/common'; +import { NgClass, CurrencyPipe } from '@angular/common'; import { MatTable, MatColumnDef, @@ -60,6 +60,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class LoanDelinquencyTagsTabComponent implements OnInit { + private route = inject(ActivatedRoute); + private loansServices = inject(LoansService); + private dateUtils = inject(Dates); + private settingsService = inject(SettingsService); + private translateService = inject(TranslateService); + dialog = inject(MatDialog); + loanDelinquencyTags: LoanDelinquencyTags[] = []; loanDelinquencyActions: LoanDelinquencyAction[] = []; currentLoanDelinquencyAction: LoanDelinquencyAction | null; @@ -89,14 +96,7 @@ export class LoanDelinquencyTagsTabComponent implements OnInit { locale: string; dateFormat: string; - constructor( - private route: ActivatedRoute, - private loansServices: LoansService, - private dateUtils: Dates, - private settingsService: SettingsService, - private translateService: TranslateService, - public dialog: MatDialog - ) { + constructor() { this.loanId = this.route.parent.parent.snapshot.params['loanId']; this.route.parent.data.subscribe( diff --git a/src/app/loans/loans-view/loan-documents-tab/loan-documents-tab.component.ts b/src/app/loans/loans-view/loan-documents-tab/loan-documents-tab.component.ts index 333bb4233..7275649e5 100644 --- a/src/app/loans/loans-view/loan-documents-tab/loan-documents-tab.component.ts +++ b/src/app/loans/loans-view/loan-documents-tab/loan-documents-tab.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; /** Custom Services */ @@ -22,6 +22,10 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class LoanDocumentsTabComponent implements OnInit { + private route = inject(ActivatedRoute); + private loansService = inject(LoansService); + private settingsService = inject(SettingsService); + /** Stores the resolved loan documents data */ entityDocuments: any; /** Loan account Id */ @@ -32,11 +36,7 @@ export class LoanDocumentsTabComponent implements OnInit { * Retrieves the loans data from `resolve`. * @param {ActivatedRoute} route Activated Route. */ - constructor( - private route: ActivatedRoute, - private loansService: LoansService, - private settingsService: SettingsService - ) { + constructor() { this.entityId = this.route.parent.snapshot.params['loanId']; this.route.data.subscribe((data: { loanDocuments: any }) => { diff --git a/src/app/loans/loans-view/loan-term-variations-tab/loan-term-variations-tab.component.html b/src/app/loans/loans-view/loan-term-variations-tab/loan-term-variations-tab.component.html index 0e62d9c72..eabed2f2a 100644 --- a/src/app/loans/loans-view/loan-term-variations-tab/loan-term-variations-tab.component.html +++ b/src/app/loans/loans-view/loan-term-variations-tab/loan-term-variations-tab.component.html @@ -1,62 +1,60 @@
    -
    -

    {{ 'labels.heading.' + loanTermVariation.label | translate }}

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    #{{ idx + 1 }}{{ 'labels.inputs.Start Date' | translate }}{{ item.termVariationApplicableFrom | dateFormat }}{{ 'labels.inputs.End Date' | translate }}{{ item.dateValue | dateFormat }}{{ 'labels.inputs.Value' | translate }}{{ item.decimalValue | formatNumber }}{{ 'labels.inputs.Days' | translate }}{{ item.days | formatNumber }}{{ 'labels.inputs.Actions' | translate }} - - - - -
    -
    + @for (loanTermVariation of loanTermVariationsData; track loanTermVariation) { +
    +

    {{ 'labels.heading.' + loanTermVariation.label | translate }}

    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    #{{ idx + 1 }}{{ 'labels.inputs.Start Date' | translate }}{{ item.termVariationApplicableFrom | dateFormat }}{{ 'labels.inputs.End Date' | translate }}{{ item.dateValue | dateFormat }}{{ 'labels.inputs.Value' | translate }}{{ item.decimalValue | formatNumber }}{{ 'labels.inputs.Days' | translate }}{{ item.days | formatNumber }}{{ 'labels.inputs.Actions' | translate }} + @if (allowActions(item.termType.value)) { + + + + + } +
    +
    + }
    diff --git a/src/app/loans/loans-view/loan-term-variations-tab/loan-term-variations-tab.component.ts b/src/app/loans/loans-view/loan-term-variations-tab/loan-term-variations-tab.component.ts index 5fffef7f4..603df39f3 100644 --- a/src/app/loans/loans-view/loan-term-variations-tab/loan-term-variations-tab.component.ts +++ b/src/app/loans/loans-view/loan-term-variations-tab/loan-term-variations-tab.component.ts @@ -1,4 +1,4 @@ -import { Component } from '@angular/core'; +import { Component, inject } from '@angular/core'; import { MatDialog } from '@angular/material/dialog'; import { ActivatedRoute, Router } from '@angular/router'; import { Dates } from 'app/core/utils/dates'; @@ -8,7 +8,6 @@ import { DeleteDialogComponent } from 'app/shared/delete-dialog/delete-dialog.co import { FormDialogComponent } from 'app/shared/form-dialog/form-dialog.component'; import { DatepickerBase } from 'app/shared/form-dialog/formfield/model/datepicker-base'; import { FormfieldBase } from 'app/shared/form-dialog/formfield/model/formfield-base'; -import { AnyKindOfDictionary } from 'cypress/types/lodash'; import { MatTable, MatColumnDef, @@ -52,6 +51,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class LoanTermVariationsTabComponent { + private route = inject(ActivatedRoute); + private router = inject(Router); + private dates = inject(Dates); + private settingsService = inject(SettingsService); + private loansService = inject(LoansService); + private dialog = inject(MatDialog); + /** Loan Term Variation Data */ loanTermVariationsData: any[] = []; loanDTermVariationsColumns: string[] = [ @@ -76,16 +82,11 @@ export class LoanTermVariationsTabComponent { invalidData: any[] = []; loanId: number; - clientId: AnyKindOfDictionary; + clientId: string; + + constructor() { + const dates = this.dates; - constructor( - private route: ActivatedRoute, - private router: Router, - private dates: Dates, - private settingsService: SettingsService, - private loansService: LoansService, - private dialog: MatDialog - ) { this.interestPausesData = []; this.clientId = this.route.parent.parent.snapshot.paramMap.get('clientId'); this.route.data.subscribe((data: { loanDetailsData: any }) => { @@ -241,7 +242,6 @@ export class LoanTermVariationsTabComponent { maxDate: this.settingsService.maxFutureDate, required: true }) - ]; const data = { diff --git a/src/app/loans/loans-view/loan-tranche-details/loan-tranche-details.component.html b/src/app/loans/loans-view/loan-tranche-details/loan-tranche-details.component.html index 9200519c4..3a05bed23 100644 --- a/src/app/loans/loans-view/loan-tranche-details/loan-tranche-details.component.html +++ b/src/app/loans/loans-view/loan-tranche-details/loan-tranche-details.component.html @@ -12,85 +12,92 @@

    {{ 'labels.heading.Loan Tranche Details' | translate }}

    - - + @if (showAddTrancheButtons()) { + + } + @if (!pristine) { + + }
    - - - - - - - - - - - - - - - - - - - - - - - -
    {{ 'labels.inputs.Expected Disbursement On' | translate }}{{ ele.expectedDisbursementDate | dateFormat }}{{ 'labels.inputs.Disbursed On' | translate }} - - {{ ele.actualDisbursementDate | dateFormat }} - - {{ 'labels.inputs.Principal' | translate }}{{ ele.principal }}{{ 'labels.inputs.Actions' | translate }} - - - - - -
    - -
    -

    {{ 'labels.heading.Installment Amount Variations' | translate }}:

    - - - - - + @if (disbursementDataSource.length > 0) { +
    {{ 'labels.inputs.Applicable From Date' | translate }}{{ ele.termVariationApplicableFrom | dateFormat }}
    + + + - - - - + + + - - - + + + + + + + + + +
    {{ 'labels.inputs.Expected Disbursement On' | translate }}{{ ele.expectedDisbursementDate | dateFormat }} {{ 'labels.inputs.Installment Amount' | translate }}{{ ele.termValue }}{{ 'labels.inputs.Disbursed On' | translate }} + @if (ele.actualDisbursementDate) { + + {{ ele.actualDisbursementDate | dateFormat }} + + } +
    {{ 'labels.inputs.Principal' | translate }}{{ ele.principal }}{{ 'labels.inputs.Actions' | translate }} + @if (ele.actualDisbursementDate) { + + + + } + @if (!ele.actualDisbursementDate && showActionsTrancheButtons()) { + + } + @if (!ele.actualDisbursementDate && showActionsTrancheButtons()) { + + } +
    -
    + } + + @if (loanDetails.emiAmountVariations.length > 0) { +
    +

    {{ 'labels.heading.Installment Amount Variations' | translate }}:

    + + + + + + + + + + + +
    {{ 'labels.inputs.Applicable From Date' | translate }}{{ ele.termVariationApplicableFrom | dateFormat }}{{ 'labels.inputs.Installment Amount' | translate }}{{ ele.termValue }}
    +
    + } diff --git a/src/app/loans/loans-view/loan-tranche-details/loan-tranche-details.component.ts b/src/app/loans/loans-view/loan-tranche-details/loan-tranche-details.component.ts index f6bbde9b9..136ada550 100644 --- a/src/app/loans/loans-view/loan-tranche-details/loan-tranche-details.component.ts +++ b/src/app/loans/loans-view/loan-tranche-details/loan-tranche-details.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { MatDialog } from '@angular/material/dialog'; import { ActivatedRoute, Router } from '@angular/router'; import { Dates } from 'app/core/utils/dates'; @@ -55,6 +55,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class LoanTrancheDetailsComponent implements OnInit { + private route = inject(ActivatedRoute); + private router = inject(Router); + private dialog = inject(MatDialog); + private loanServices = inject(LoansService); + private settingsService = inject(SettingsService); + private dateUtils = inject(Dates); + loanDetails: any; return: any; status: any; @@ -83,14 +90,7 @@ export class LoanTrancheDetailsComponent implements OnInit { * Retrieves the loans data from `resolve`. * @param {ActivatedRoute} route Activated Route. */ - constructor( - private route: ActivatedRoute, - private router: Router, - private dialog: MatDialog, - private loanServices: LoansService, - private settingsService: SettingsService, - private dateUtils: Dates - ) { + constructor() { this.route.parent.data.subscribe((data: { loanDetailsData: any }) => { this.loanId = data.loanDetailsData.id; this.loanDetails = data.loanDetailsData; @@ -179,7 +179,6 @@ export class LoanTrancheDetailsComponent implements OnInit { required: true, order: 2 }) - ]; return formBase; } diff --git a/src/app/loans/loans-view/loans-view.component.html b/src/app/loans/loans-view/loans-view.component.html index c531dbc73..07b91117d 100644 --- a/src/app/loans/loans-view/loans-view.component.html +++ b/src/app/loans/loans-view/loans-view.component.html @@ -41,118 +41,147 @@ }}({{ loanDetailsData.clientAccountNo || loanDetailsData.group.accountNo }})
    -
    - - - - - - - - - - - + + @if (loanDetailsData.delinquencyRange) { + + + + + } + @if (loanDetailsData.delinquent && loanDetailsData.delinquent.pastDueDays > 0) { + + + + + } + @if ( loanDetailsData.delinquent && loanDetailsData.delinquent.delinquentDays > 0 && loanDetailsData.delinquent.pastDueDays !== loanDetailsData.delinquent.delinquentDays - " - > - - + ) { + + + + + } + + +
    + } + + + @if (loanDetailsData.summary) { +
    +

    {{ 'labels.heading.Account Overview' | translate }}

    + + + + + + @if (loanDisplayArrearsDelinquency < 2) { + + + @if (loanDetailsData.summary.totalOverdue >= 0) { + + } + @if (!(loanDetailsData.summary.totalOverdue >= 0)) { + + } + + } + @if (loanDetailsData.inArrears) { + + + + + } + @if (loanDetailsData.totalOverpaid && loanDetailsData.totalOverpaid > 0) { + + + + + }
    - - -
    -

    {{ 'labels.heading.Account Overview' | translate }}

    - - - - - - - - - - - - - - - - - - - - - -
    + }
    - + @if (buttonConfig.singleButtons.length > 0) { + + }
    - + @for (item of buttonConfig.singleButtons; track item) { - + } - - - - - - - - + @if (buttonConfig.optionsPayment.length) { + + + + @for (item of buttonConfig.optionsPayment; track item) { + + + + } + + + } - - - - - - - - + @if (buttonConfig.options.length) { + + + + @for (item of buttonConfig.options; track item) { + + + + } + + + } @@ -177,7 +206,7 @@ > {{ 'labels.inputs.Account Details' | translate }} - + @if (loanDetailsData.originalSchedule) { {{ 'labels.inputs.Original Schedule' | translate }} - + } {{ 'labels.inputs.Repayment Schedule' | translate }} - + @if (loanDetailsData.transactions) { {{ 'labels.inputs.Transactions' | translate }} - - + } + @if (loanDetailsData.enableIncomeCapitalization) { {{ 'labels.inputs.Deferred income' | translate }} - - + } + @if (loanDetailsData.enableBuyDownFee) { {{ 'labels.heading.Buy Down Fees' | translate }} - - + } + @if (loanDetailsData.status.active) { {{ 'labels.inputs.Delinquency Tags' | translate }} - - + } + @if (loanDetailsData.collateral) { {{ 'labels.inputs.Loan Collateral Details' | translate }} - - + } + @if (loanDetailsData.multiDisburseLoan) { {{ 'labels.inputs.Loan Tranche Details' | translate }} - - + } + @if (loanDetailsData.loanTermVariations) { {{ 'labels.inputs.Term Variations' | translate }} - - + } + @if (loanDetailsData.overdueCharges.length > 0) { {{ 'labels.inputs.Overdue Charges' | translate }} - - + } + @if (loanDetailsData.isLoanProductLinkedToFloatingRate) { {{ 'labels.inputs.Floating Interest Rates' | translate }} - - + } + @if (loanDetailsData.charges) { {{ 'labels.inputs.Charges' | translate }} - - + } + @if (loanDetailsData.status.active || loanDetailsData.status.closed || loanDetailsData.status.overpaid) { {{ 'labels.inputs.Loan Reschedules' | translate }} - + } {{ 'labels.inputs.Notes' | translate }} - + @if (loanDetailsData.clientId) { {{ 'labels.inputs.Standing Instruction' | translate }} - - + } + @if (loanDetailsData.status.active) { {{ 'labels.inputs.External Asset Owner' | translate }} - - + } + @for (loanDatatable of loanDatatables; track loanDatatable) { {{ loanDatatable.registeredTableName }} - + } diff --git a/src/app/loans/loans-view/loans-view.component.ts b/src/app/loans/loans-view/loans-view.component.ts index b47d2fe5d..09ab8e766 100644 --- a/src/app/loans/loans-view/loans-view.component.ts +++ b/src/app/loans/loans-view/loans-view.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { ActivatedRoute, NavigationExtras, Router, RouterLinkActive, RouterOutlet } from '@angular/router'; import { MatDialog } from '@angular/material/dialog'; @@ -67,6 +67,12 @@ import { LoanProducts } from 'app/products/loan-products/loan-products'; ] }) export class LoansViewComponent implements OnInit { + private route = inject(ActivatedRoute); + private router = inject(Router); + loansService = inject(LoansService); + private translateService = inject(TranslateService); + dialog = inject(MatDialog); + /** Loan Details Data */ loanDetailsData: any; /** Loan Datatables */ @@ -94,13 +100,9 @@ export class LoansViewComponent implements OnInit { loanReAged = false; loanReAmortized = false; - constructor( - private route: ActivatedRoute, - private router: Router, - public loansService: LoansService, - private translateService: TranslateService, - public dialog: MatDialog - ) { + constructor() { + const loansService = this.loansService; + this.route.data.subscribe( (data: { loanDetailsData: any; loanDatatables: any; loanArrearsDelinquencyConfig: any }) => { this.loanDetailsData = data.loanDetailsData; diff --git a/src/app/loans/loans-view/notes-tab/notes-tab.component.ts b/src/app/loans/loans-view/notes-tab/notes-tab.component.ts index d20016f79..87c7c5173 100644 --- a/src/app/loans/loans-view/notes-tab/notes-tab.component.ts +++ b/src/app/loans/loans-view/notes-tab/notes-tab.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; /** Custom Components */ @@ -19,15 +19,15 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class NotesTabComponent implements OnInit { + private route = inject(ActivatedRoute); + private loansService = inject(LoansService); + private authenticationService = inject(AuthenticationService); + entityId: string; username: string; entityNotes: any; - constructor( - private route: ActivatedRoute, - private loansService: LoansService, - private authenticationService: AuthenticationService - ) { + constructor() { const savedCredentials = this.authenticationService.getCredentials(); this.username = savedCredentials.username; this.entityId = this.route.parent.snapshot.params['loanId']; diff --git a/src/app/loans/loans-view/original-schedule-tab/original-schedule-tab.component.ts b/src/app/loans/loans-view/original-schedule-tab/original-schedule-tab.component.ts index 8f057a00b..90a14621c 100644 --- a/src/app/loans/loans-view/original-schedule-tab/original-schedule-tab.component.ts +++ b/src/app/loans/loans-view/original-schedule-tab/original-schedule-tab.component.ts @@ -1,4 +1,4 @@ -import { Component } from '@angular/core'; +import { Component, inject } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; import { Currency } from 'app/shared/models/general.model'; import { @@ -50,6 +50,8 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class OriginalScheduleTabComponent { + private route = inject(ActivatedRoute); + /** Loan Details Data */ originalScheduleDetails: any; /** Columns to be displayed in original schedule table. */ @@ -70,7 +72,7 @@ export class OriginalScheduleTabComponent { * Retrieves the loans with associations data from `resolve`. * @param {ActivatedRoute} route Activated Route. */ - constructor(private route: ActivatedRoute) { + constructor() { this.route.parent.data.subscribe((data: { loanDetailsData: any }) => { this.currency = data.loanDetailsData.currency; this.originalScheduleDetails = data.loanDetailsData.originalSchedule; diff --git a/src/app/loans/loans-view/overdue-charges-tab/overdue-charges-tab.component.ts b/src/app/loans/loans-view/overdue-charges-tab/overdue-charges-tab.component.ts index 632390c12..f679f9341 100644 --- a/src/app/loans/loans-view/overdue-charges-tab/overdue-charges-tab.component.ts +++ b/src/app/loans/loans-view/overdue-charges-tab/overdue-charges-tab.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, ViewChild } from '@angular/core'; +import { Component, OnInit, ViewChild, inject } from '@angular/core'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort, MatSortHeader } from '@angular/material/sort'; import { @@ -45,6 +45,8 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class OverdueChargesTabComponent implements OnInit { + private route = inject(ActivatedRoute); + /** Stores the resolved loan data */ loanDetails: any; /** Stores the overdue data */ @@ -69,7 +71,7 @@ export class OverdueChargesTabComponent implements OnInit { * Retrieves the loans data from `resolve`. * @param {ActivatedRoute} route Activated Route. */ - constructor(private route: ActivatedRoute) { + constructor() { this.route.parent.data.subscribe((data: { loanDetailsData: any }) => { this.loanDetails = data.loanDetailsData; }); diff --git a/src/app/loans/loans-view/repayment-schedule-tab/repayment-schedule-tab.component.html b/src/app/loans/loans-view/repayment-schedule-tab/repayment-schedule-tab.component.html index 7aa2a3d19..942fe5abb 100644 --- a/src/app/loans/loans-view/repayment-schedule-tab/repayment-schedule-tab.component.html +++ b/src/app/loans/loans-view/repayment-schedule-tab/repayment-schedule-tab.component.html @@ -1,321 +1,317 @@
    -
    - -
    + @if (!forEditing) { +
    + +
    + } - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @if (!forEditing) { +
    #{{ item.period }} {{ 'labels.inputs.Days' | translate }}{{ item.daysInPeriod }} Total{{ 'labels.inputs.Date' | translate }} - {{ item.dueDate | dateFormat }} - - {{ 'labels.inputs.Paid Date' | translate }} - - {{ item.obligationsMetOnDate | dateFormat }} -   - - - {{ 'labels.inputs.Balance Of Loan' | translate }} - - {{ item.principalLoanBalanceOutstanding | formatNumber }} -   - {{ 'labels.inputs.Principal Due' | translate }} - - {{ item.principalDue | formatNumber }} - - - {{ repaymentScheduleDetails?.totalPrincipalExpected | currency: currencyCode : 'symbol-narrow' : '1.2-2' }} - - {{ 'labels.inputs.Interest' | translate }} - - {{ item.interestOriginalDue | formatNumber }} - - - {{ repaymentScheduleDetails?.totalInterestCharged | currency: currencyCode : 'symbol-narrow' : '1.2-2' }} - - {{ 'labels.inputs.Fees' | translate }} - {{ item.feeChargesDue | formatNumber }} - - - {{ repaymentScheduleDetails?.totalFeeChargesCharged | currency: currencyCode : 'symbol-narrow' : '1.2-2' }} - - - {{ 'labels.inputs.Penalties' | translate }} - - {{ item.penaltyChargesDue | formatNumber }} - - - {{ - repaymentScheduleDetails?.totalPenaltyChargesCharged | currency: currencyCode : 'symbol-narrow' : '1.2-2' - }} - - {{ 'labels.inputs.Due' | translate }} - {{ item.totalDueForPeriod | formatNumber }} - - - {{ repaymentScheduleDetails?.totalRepaymentExpected | currency: currencyCode : 'symbol-narrow' : '1.2-2' }} - - {{ 'labels.inputs.Paid' | translate }} - {{ item.totalPaidForPeriod | formatNumber }} - - {{ repaymentScheduleDetails?.totalRepayment | currency: currencyCode : 'symbol-narrow' : '1.2-2' }} - - {{ 'labels.inputs.In advance' | translate }} - - {{ item.totalPaidInAdvanceForPeriod | formatNumber }} - - {{ repaymentScheduleDetails?.totalPaidInAdvance | currency: currencyCode : 'symbol-narrow' : '1.2-2' }} - {{ 'labels.inputs.Late' | translate }} - {{ item.totalPaidLateForPeriod | formatNumber }} - - {{ repaymentScheduleDetails?.totalPaidLate | currency: currencyCode : 'symbol-narrow' : '1.2-2' }} -
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    #{{ item.period }} {{ 'labels.inputs.Days' | translate }} + {{ item.daysInPeriod }} + Total{{ 'labels.inputs.Date' | translate }} + {{ item.dueDate | dateFormat }} + + {{ 'labels.inputs.Paid Date' | translate }} + + {{ item.obligationsMetOnDate | dateFormat }} +   + @if (item.obligationsMetOnDate) { + + } + - {{ 'labels.inputs.Waived' | translate }} + {{ 'labels.inputs.Balance Of Loan' | translate }} - {{ item.totalWaivedForPeriod | formatNumber }} + {{ item.principalLoanBalanceOutstanding | formatNumber }} +   + {{ 'labels.inputs.Principal Due' | translate }} + + {{ item.principalDue | formatNumber }} + + + {{ + repaymentScheduleDetails?.totalPrincipalExpected | currency: currencyCode : 'symbol-narrow' : '1.2-2' + }} + + {{ 'labels.inputs.Interest' | translate }} + + {{ item.interestOriginalDue | formatNumber }} - {{ repaymentScheduleDetails?.totalWaived | currency: currencyCode : 'symbol-narrow' : '1.2-2' }} + + {{ repaymentScheduleDetails?.totalInterestCharged | currency: currencyCode : 'symbol-narrow' : '1.2-2' }} + + {{ 'labels.inputs.Fees' | translate }} + + {{ item.feeChargesDue | formatNumber }} + + + {{ repaymentScheduleDetails?.totalFeeChargesCharged | currency: currencyCode : 'symbol-narrow' : '1.2-2' }} + + - {{ 'labels.inputs.Outstanding' | translate }} - {{ item.totalOutstandingForPeriod | formatNumber }} - {{ repaymentScheduleDetails?.totalOutstanding | currency: currencyCode : 'symbol-narrow' : '1.2-2' }} - - {{ 'labels.inputs.Loan Amount and Balance' | translate }} - - {{ 'labels.inputs.Total Cost of Loan' | translate }} - - {{ 'labels.inputs.Installment Totals' | translate }} -
    + + + {{ 'labels.inputs.Penalties' | translate }} + + + {{ item.penaltyChargesDue | formatNumber }} + + + + {{ + repaymentScheduleDetails?.totalPenaltyChargesCharged | currency: currencyCode : 'symbol-narrow' : '1.2-2' + }} + + + + + + {{ 'labels.inputs.Due' | translate }} + + + {{ item.totalDueForPeriod | formatNumber }} + + + + {{ repaymentScheduleDetails?.totalRepaymentExpected | currency: currencyCode : 'symbol-narrow' : '1.2-2' }} + + + + + + {{ 'labels.inputs.Paid' | translate }} + + + {{ item.totalPaidForPeriod | formatNumber }} + + + {{ repaymentScheduleDetails?.totalRepayment | currency: currencyCode : 'symbol-narrow' : '1.2-2' }} + + + + + {{ 'labels.inputs.In advance' | translate }} + + + {{ item.totalPaidInAdvanceForPeriod | formatNumber }} + + + + {{ repaymentScheduleDetails?.totalPaidInAdvance | currency: currencyCode : 'symbol-narrow' : '1.2-2' }} + + + + + + {{ 'labels.inputs.Late' | translate }} + + + {{ item.totalPaidLateForPeriod | formatNumber }} + + + {{ repaymentScheduleDetails?.totalPaidLate | currency: currencyCode : 'symbol-narrow' : '1.2-2' }} + + + @if (isWaived) { + + + {{ 'labels.inputs.Waived' | translate }} + + + {{ item.totalWaivedForPeriod | formatNumber }} + + + {{ repaymentScheduleDetails?.totalWaived | currency: currencyCode : 'symbol-narrow' : '1.2-2' }} + + + } + @if (!isWaived) { + + + + + + } + + + {{ 'labels.inputs.Outstanding' | translate }} + + {{ item.totalOutstandingForPeriod | formatNumber }} + + {{ repaymentScheduleDetails?.totalOutstanding | currency: currencyCode : 'symbol-narrow' : '1.2-2' }} + + + + + + + + {{ 'labels.inputs.Loan Amount and Balance' | translate }} + + + + + {{ 'labels.inputs.Total Cost of Loan' | translate }} + + + + + {{ 'labels.inputs.Installment Totals' | translate }} + + + + + + + + } - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    #{{ item.period }}{{ 'labels.inputs.Date' | translate }} - - {{ item.dueDate | dateFormat }} - - - {{ 'labels.inputs.Balance Of Loan' | translate }} - - {{ item.principalLoanBalanceOutstanding | formatNumber }} - - {{ 'labels.inputs.Principal Due' | translate }} - - - {{ item.principalDue | formatNumber }} - - - {{ 'labels.inputs.Interest' | translate }} - {{ item.interestOriginalDue | formatNumber }}{{ 'labels.inputs.Fees' | translate }}{{ item.feeChargesDue | formatNumber }} - {{ 'labels.inputs.Installment Amount' | translate }} - - - {{ item.totalDueForPeriod | formatNumber }} - - - {{ item.totalDueForPeriod | formatNumber }} - - {{ 'labels.inputs.Actions' | translate }} - + @if (forEditing && repaymentScheduleDetails?.periods?.length > 0) { + + + + + + + + - - - - - -
    #{{ item.period }}{{ 'labels.inputs.Date' | translate }} - - + {{ item.dueDate | dateFormat }} - -
    +
    + {{ 'labels.inputs.Balance Of Loan' | translate }} + + {{ item.principalLoanBalanceOutstanding | formatNumber }} + + {{ 'labels.inputs.Principal Due' | translate }} + + + {{ item.principalDue | formatNumber }} + + + {{ 'labels.inputs.Interest' | translate }} + {{ item.interestOriginalDue | formatNumber }} + {{ 'labels.inputs.Fees' | translate }} + {{ item.feeChargesDue | formatNumber }} + {{ 'labels.inputs.Installment Amount' | translate }} + + @if (!item.changed) { + + {{ item.totalDueForPeriod | formatNumber }} + + } + @if (item.changed) { + + {{ item.totalDueForPeriod | formatNumber }} + + } + {{ 'labels.inputs.Actions' | translate }} + @if (item.period && item.period + 1 < repaymentScheduleDetails?.periods?.length) { + + + + + + + } +
    + }
    diff --git a/src/app/loans/loans-view/repayment-schedule-tab/repayment-schedule-tab.component.ts b/src/app/loans/loans-view/repayment-schedule-tab/repayment-schedule-tab.component.ts index d090fae55..370505c1b 100644 --- a/src/app/loans/loans-view/repayment-schedule-tab/repayment-schedule-tab.component.ts +++ b/src/app/loans/loans-view/repayment-schedule-tab/repayment-schedule-tab.component.ts @@ -80,6 +80,11 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class RepaymentScheduleTabComponent implements OnInit, OnChanges { + private route = inject(ActivatedRoute); + private settingsService = inject(SettingsService); + private dateUtils = inject(Dates); + private dialog = inject(MatDialog); + /** Currency Code */ @Input() currencyCode: string; /** Loan Repayment Schedule to be Edited */ @@ -139,12 +144,7 @@ export class RepaymentScheduleTabComponent implements OnInit, OnChanges { * Retrieves the loans with associations data from `resolve`. * @param {ActivatedRoute} route Activated Route. */ - constructor( - private route: ActivatedRoute, - private settingsService: SettingsService, - private dateUtils: Dates, - private dialog: MatDialog - ) { + constructor() { this.businessDate = this.settingsService.businessDate; } @@ -297,7 +297,6 @@ export class RepaymentScheduleTabComponent implements OnInit, OnChanges { type: 'number', required: true }) - ]; const data = { diff --git a/src/app/loans/loans-view/reschedule-loan-tab/reschedule-loan-tab.component.html b/src/app/loans/loans-view/reschedule-loan-tab/reschedule-loan-tab.component.html index 8b9c8eba1..f6a3e8dca 100644 --- a/src/app/loans/loans-view/reschedule-loan-tab/reschedule-loan-tab.component.html +++ b/src/app/loans/loans-view/reschedule-loan-tab/reschedule-loan-tab.component.html @@ -41,28 +41,30 @@ {{ 'labels.inputs.Actions' | translate }} - - - - + @if (item.statusEnum.pendingApproval) { + + + + + } diff --git a/src/app/loans/loans-view/reschedule-loan-tab/reschedule-loan-tab.component.ts b/src/app/loans/loans-view/reschedule-loan-tab/reschedule-loan-tab.component.ts index 25583e8ec..4a40150e7 100644 --- a/src/app/loans/loans-view/reschedule-loan-tab/reschedule-loan-tab.component.ts +++ b/src/app/loans/loans-view/reschedule-loan-tab/reschedule-loan-tab.component.ts @@ -1,4 +1,4 @@ -import { Component, Input } from '@angular/core'; +import { Component, Input, inject } from '@angular/core'; import { MatDialog } from '@angular/material/dialog'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; import { TranslateService } from '@ngx-translate/core'; @@ -19,7 +19,7 @@ import { MatRowDef, MatRow } from '@angular/material/table'; -import { NgClass, NgIf } from '@angular/common'; +import { NgClass } from '@angular/common'; import { FaIconComponent } from '@fortawesome/angular-fontawesome'; import { MatTooltip } from '@angular/material/tooltip'; import { StatusLookupPipe } from '../../../pipes/status-lookup.pipe'; @@ -50,6 +50,14 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class RescheduleLoanTabComponent { + private route = inject(ActivatedRoute); + private router = inject(Router); + private loansServices = inject(LoansService); + private settingsService = inject(SettingsService); + private dateUtils = inject(Dates); + private translateService = inject(TranslateService); + private dialog = inject(MatDialog); + @Input() loanStatus: LoanStatus; loanRescheduleData: any; @@ -62,15 +70,7 @@ export class RescheduleLoanTabComponent { ]; clientId: any; - constructor( - private route: ActivatedRoute, - private router: Router, - private loansServices: LoansService, - private settingsService: SettingsService, - private dateUtils: Dates, - private translateService: TranslateService, - private dialog: MatDialog - ) { + constructor() { this.clientId = this.route.parent.parent.snapshot.paramMap.get('clientId'); this.route.parent.data.subscribe((data: { loanRescheduleData: any }) => { this.loanRescheduleData = data.loanRescheduleData; diff --git a/src/app/loans/loans-view/standing-instructions-tab/standing-instructions-tab.component.html b/src/app/loans/loans-view/standing-instructions-tab/standing-instructions-tab.component.html index 11eb51061..1d7daa912 100644 --- a/src/app/loans/loans-view/standing-instructions-tab/standing-instructions-tab.component.html +++ b/src/app/loans/loans-view/standing-instructions-tab/standing-instructions-tab.component.html @@ -22,12 +22,14 @@ {{ 'labels.inputs.Beneficiary' | translate }} - - {{ instruction.toClient.displayName }} - - {{ - 'labels.inputs.Own Account' | translate - }} + @if (instruction.fromClient.id !== instruction.toClient.id) { + + {{ instruction.toClient.displayName }} + + } + @if (instruction.fromClient.id === instruction.toClient.id) { + {{ 'labels.inputs.Own Account' | translate }} + } @@ -53,29 +55,33 @@ {{ 'labels.inputs.Actions' | translate }} - - - - - - + @if (instruction.status.value !== 'Deleted') { + + + + } + @if (instruction.status.value !== 'Deleted') { + + + + } - + @if (checkStatus()) { +
    + + {{ 'labels.inputs.Hide Reversed' | translate }} + + {{ 'labels.inputs.Hide Accruals' | translate }} + +
    + } @@ -143,93 +145,105 @@ diff --git a/src/app/loans/loans-view/transactions-tab/transactions-tab.component.ts b/src/app/loans/loans-view/transactions-tab/transactions-tab.component.ts index 37cb58037..dd305a761 100644 --- a/src/app/loans/loans-view/transactions-tab/transactions-tab.component.ts +++ b/src/app/loans/loans-view/transactions-tab/transactions-tab.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit, ViewChild } from '@angular/core'; +import { Component, OnInit, ViewChild, inject } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; import { UntypedFormControl, Validators } from '@angular/forms'; import { MatPaginator } from '@angular/material/paginator'; @@ -72,6 +72,15 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class TransactionsTabComponent implements OnInit { + private route = inject(ActivatedRoute); + private dateUtils = inject(Dates); + private router = inject(Router); + private dialog = inject(MatDialog); + private loansService = inject(LoansService); + private translateService = inject(TranslateService); + private settingsService = inject(SettingsService); + private alertService = inject(AlertService); + /** Loan Details Data */ transactionsData: LoanTransaction[] = []; loanDetailsData: any; @@ -127,16 +136,7 @@ export class TransactionsTabComponent implements OnInit { * Retrieves the loans with associations data from `resolve`. * @param {ActivatedRoute} route Activated Route. */ - constructor( - private route: ActivatedRoute, - private dateUtils: Dates, - private router: Router, - private dialog: MatDialog, - private loansService: LoansService, - private translateService: TranslateService, - private settingsService: SettingsService, - private alertService: AlertService - ) { + constructor() { this.route.parent.parent.data.subscribe((data: { loanDetailsData: any }) => { this.loanDetailsData = data.loanDetailsData; this.status = data.loanDetailsData.status.value; @@ -520,7 +520,6 @@ export class TransactionsTabComponent implements OnInit { required: false, order: 4 }) - ]; const data = { title: this.translateService.instant('labels.buttons.Create Interest Refund'), @@ -595,10 +594,10 @@ export class TransactionsTabComponent implements OnInit { max: transactionAmount, validators: [ Validators.min(0.001), - Validators.max(transactionAmount)], + Validators.max(transactionAmount) + ], order: 2 }) - ]; const data = { title: `Adjustment ${transaction.type.value} Transaction`, @@ -671,10 +670,10 @@ export class TransactionsTabComponent implements OnInit { max: transactionAmount, validators: [ Validators.min(0.001), - Validators.max(transactionAmount)], + Validators.max(transactionAmount) + ], order: 2 }) - ]; const data = { title: `Adjustment ${transaction.type.value} Transaction`, diff --git a/src/app/loans/loans-view/transactions/edit-transaction/edit-transaction.component.html b/src/app/loans/loans-view/transactions/edit-transaction/edit-transaction.component.html index a6bf74e23..fcbedd162 100644 --- a/src/app/loans/loans-view/transactions/edit-transaction/edit-transaction.component.html +++ b/src/app/loans/loans-view/transactions/edit-transaction/edit-transaction.component.html @@ -14,10 +14,12 @@ /> - - {{ 'labels.inputs.Transaction Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (editTransactionForm.controls.transactionDate.hasError('required')) { + + {{ 'labels.inputs.Transaction Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Payment Type' | translate }} - - {{ paymentType.name }} - + @for (paymentType of paymentTypeOptions; track paymentType) { + + {{ paymentType.name }} + + } @@ -52,30 +56,40 @@ - - {{ 'labels.inputs.Account Number' | translate }} - - + @if (editTransactionForm.controls['accountNumber']) { + + {{ 'labels.inputs.Account Number' | translate }} + + + } - - {{ 'labels.inputs.Cheque' | translate }} - - + @if (editTransactionForm.controls['checkNumber']) { + + {{ 'labels.inputs.Cheque' | translate }} + + + } - - {{ 'labels.inputs.Routing Code' | translate }} - - + @if (editTransactionForm.controls['routingCode']) { + + {{ 'labels.inputs.Routing Code' | translate }} + + + } - - {{ 'labels.inputs.Receipt Number' | translate }} - - + @if (editTransactionForm.controls['receiptNumber']) { + + {{ 'labels.inputs.Receipt Number' | translate }} + + + } - - {{ 'labels.inputs.Bank' | translate }} - - + @if (editTransactionForm.controls['bankNumber']) { + + {{ 'labels.inputs.Bank' | translate }} + + + } - - - - - - - +@if (!transactionData.type.contra) { +
    + + + + + + + +
    +}
    @@ -29,15 +30,19 @@ {{ transactionData.id }}
    -
    - {{ 'Repayment Transaction' | translateKey: 'catalogs' }} -
    + @if (transactionData.toLoanTransactionRelation) { +
    + {{ 'Repayment Transaction' | translateKey: 'catalogs' }} +
    + } - + @if (transactionData.toLoanTransactionRelation) { + + }
    {{ 'Type' | translateKey: 'catalogs' }} @@ -71,64 +76,72 @@ {{ transactionData.amount | currency: transactionData.currency.code : 'symbol-narrow' : '1.2-2' }}
    -
    - {{ 'External Id' | translate }} -
    + @if (transactionData.externalId) { +
    + {{ 'External Id' | translate }} +
    + } -
    - -
    + @if (transactionData.externalId) { +
    + +
    + } -
    - {{ 'Classification' | translateKey: 'catalogs' }} -
    + @if (transactionData.classification) { +
    + {{ 'Classification' | translateKey: 'catalogs' }} +
    + } -
    - {{ transactionData.classification.name }} -
    + @if (transactionData.classification) { +
    + {{ transactionData.classification.name }} +
    + } - + @if (existTransactionRelations) { + + } -
    - {{ 'Linked Transactions' | translate }} -
    + @if (existTransactionRelations) { +
    + {{ 'Linked Transactions' | translate }} +
    +
    - + @if (displaySubMenu(transaction)) { + + } - - - - - - - - - - - - - - - - - - - - - - - - - + @if (showTransaction(transaction)) { + + + + } + @if (canCreateInterestRefund(transaction)) { + + + + } + @if (allowUndoTransaction(transaction)) { + + + + + } + @if (isReAge(transaction.type) && !transaction.manuallyReversed) { + + + + } + @if (isReAmortize(transaction.type) && !transaction.manuallyReversed) { + + + + } + @if (isCapitalizedIncome(transaction.type) && !transaction.manuallyReversed) { + + + + } + @if (isBuyDownFee(transaction.type) && !transaction.manuallyReversed) { + + + + } + @if (viewJournalEntry(transaction.type)) { + + + + }
    + + + + + + + + + + + + + + +
    {{ 'labels.inputs.Relation Type' | translate }} + {{ transactionRel.relationType | translate }} + {{ 'labels.inputs.Transaction' | translate }} + + {{ transactionRel.toLoanTransaction }} + + {{ 'labels.inputs.Amount' | translate }} + {{ transactionRel.amount | currency: transactionData.currency.code : 'symbol-narrow' : '1.2-2' }} +
    + + } - - - - - - - - - - - - - - - - - -
    {{ 'labels.inputs.Relation Type' | translate }} - {{ transactionRel.relationType | translate }} - {{ 'labels.inputs.Transaction' | translate }} - - {{ transactionRel.toLoanTransaction }} - - {{ 'labels.inputs.Amount' | translate }} - {{ transactionRel.amount | currency: transactionData.currency.code : 'symbol-narrow' : '1.2-2' }} -
    - - - - + @if (transactionData.paymentDetailData) { + + + }
    diff --git a/src/app/loans/loans-view/transactions/view-transaction/view-transaction.component.ts b/src/app/loans/loans-view/transactions/view-transaction/view-transaction.component.ts index 576cc451c..9051e6c9b 100644 --- a/src/app/loans/loans-view/transactions/view-transaction/view-transaction.component.ts +++ b/src/app/loans/loans-view/transactions/view-transaction/view-transaction.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; import { MatDialog } from '@angular/material/dialog'; @@ -29,7 +29,7 @@ import { import { LoanTransactionType } from 'app/loans/models/loan-transaction-type.model'; import { AlertService } from 'app/core/alert/alert.service'; import { TranslateService } from '@ngx-translate/core'; -import { NgIf, NgClass, CurrencyPipe } from '@angular/common'; +import { NgClass, CurrencyPipe } from '@angular/common'; import { FaIconComponent } from '@fortawesome/angular-fontawesome'; import { ExternalIdentifierComponent } from '../../../../shared/external-identifier/external-identifier.component'; import { MatDivider } from '@angular/material/divider'; @@ -71,6 +71,16 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ViewTransactionComponent implements OnInit { + private loansService = inject(LoansService); + private route = inject(ActivatedRoute); + private dateUtils = inject(Dates); + private router = inject(Router); + dialog = inject(MatDialog); + private translateService = inject(TranslateService); + private settingsService = inject(SettingsService); + private organizationService = inject(OrganizationService); + private alertService = inject(AlertService); + /** Transaction data. */ transactionData: any; transactionType: LoanTransactionType; @@ -106,17 +116,7 @@ export class ViewTransactionComponent implements OnInit { * @param {SettingsService} settingsService Settings Service * @param {AlertService} alertService Alert Service */ - constructor( - private loansService: LoansService, - private route: ActivatedRoute, - private dateUtils: Dates, - private router: Router, - public dialog: MatDialog, - private translateService: TranslateService, - private settingsService: SettingsService, - private organizationService: OrganizationService, - private alertService: AlertService - ) { + constructor() { this.route.data.subscribe((data: { loansAccountTransaction: any }) => { this.transactionData = data.loansAccountTransaction; this.transactionType = this.transactionData.type; @@ -228,7 +228,6 @@ export class ViewTransactionComponent implements OnInit { required: false, order: 2 }) - ]; const data = { title: this.translateService.instant('labels.heading.Undo Transaction'), @@ -303,7 +302,6 @@ export class ViewTransactionComponent implements OnInit { max: this.amountRelationsAllowed, order: 2 }) - ]; const data = { title: `Chargeback ${this.transactionType.value} Transaction`, diff --git a/src/app/loans/loans-view/view-charge/view-charge.component.html b/src/app/loans/loans-view/view-charge/view-charge.component.html index 961ae039b..323f96cf5 100644 --- a/src/app/loans/loans-view/view-charge/view-charge.component.html +++ b/src/app/loans/loans-view/view-charge/view-charge.component.html @@ -1,54 +1,76 @@ -
    - - - - - +@if (loansAccountData.status.value === 'Active' && chargeData.amountOutstanding !== 0) { +
    - - + @if (allowPayCharge) { + + + + } + @if (allowWaive) { + + + + } + + + +
    +} + +@if (loansAccountData.status.value === 'Submitted and pending approval') { +
    - -
    - -
    - - -
    + +
    +}
    diff --git a/src/app/loans/loans-view/view-charge/view-charge.component.ts b/src/app/loans/loans-view/view-charge/view-charge.component.ts index 4ffc09717..9d13b6d3b 100644 --- a/src/app/loans/loans-view/view-charge/view-charge.component.ts +++ b/src/app/loans/loans-view/view-charge/view-charge.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component } from '@angular/core'; +import { Component, inject } from '@angular/core'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; import { MatDialog } from '@angular/material/dialog'; @@ -18,7 +18,7 @@ import { InputBase } from 'app/shared/form-dialog/formfield/model/input-base'; import { DatepickerBase } from 'app/shared/form-dialog/formfield/model/datepicker-base'; import { Dates } from 'app/core/utils/dates'; import { TranslateService } from '@ngx-translate/core'; -import { NgIf, NgClass } from '@angular/common'; +import { NgClass } from '@angular/common'; import { FaIconComponent } from '@fortawesome/angular-fontawesome'; import { DateFormatPipe } from '../../../pipes/date-format.pipe'; import { FormatNumberPipe } from '../../../pipes/format-number.pipe'; @@ -40,6 +40,14 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ViewChargeComponent { + private loansService = inject(LoansService); + private route = inject(ActivatedRoute); + private dateUtils = inject(Dates); + private router = inject(Router); + private translateService = inject(TranslateService); + dialog = inject(MatDialog); + private settingsService = inject(SettingsService); + /** Charge data. */ chargeData: any; /** Loans Account Data */ @@ -56,15 +64,7 @@ export class ViewChargeComponent { * @param {Dates} dateUtils Date Utils. * @param {SettingsService} settingsService Settings Service */ - constructor( - private loansService: LoansService, - private route: ActivatedRoute, - private dateUtils: Dates, - private router: Router, - private translateService: TranslateService, - public dialog: MatDialog, - private settingsService: SettingsService - ) { + constructor() { this.route.data.subscribe((data: { loansAccountCharge: any; loanDetailsData: any }) => { this.chargeData = data.loansAccountCharge; this.allowPayCharge = this.chargeData.chargePayable && !this.chargeData.paid; @@ -85,7 +85,6 @@ export class ViewChargeComponent { type: 'date', required: true }) - ]; const data = { title: `Pay Charge ${this.chargeData.id}`, @@ -156,7 +155,6 @@ export class ViewChargeComponent { maxDate: this.settingsService.maxAllowedDate, required: true }) - ]; const data = { title: 'Edit Charge', diff --git a/src/app/loans/loans.service.ts b/src/app/loans/loans.service.ts index 59d31f6ea..870906317 100644 --- a/src/app/loans/loans.service.ts +++ b/src/app/loans/loans.service.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { HttpClient, HttpParams } from '@angular/common/http'; /** rxjs Imports */ @@ -15,11 +15,10 @@ import { DisbursementData } from './models/loan-account.model'; providedIn: 'root' }) export class LoansService { - constructor( - private http: HttpClient, - private settingsService: SettingsService, - private dateUtils: Dates - ) {} + private http = inject(HttpClient); + private settingsService = inject(SettingsService); + private dateUtils = inject(Dates); + /** * @param {string} loanId loanId of the loan. * @returns {Observable} diff --git a/src/app/loans/services/external-asset-owner.service.ts b/src/app/loans/services/external-asset-owner.service.ts index 29db09f09..afb08f989 100644 --- a/src/app/loans/services/external-asset-owner.service.ts +++ b/src/app/loans/services/external-asset-owner.service.ts @@ -1,14 +1,14 @@ import { HttpClient, HttpParams } from '@angular/common/http'; -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { Observable } from 'rxjs'; @Injectable({ providedIn: 'root' }) export class ExternalAssetOwnerService { - basePath = '/external-asset-owners'; + private http = inject(HttpClient); - constructor(private http: HttpClient) {} + basePath = '/external-asset-owners'; /** * @param {string} loanId Loan Id diff --git a/src/app/login/login-form/login-form.component.html b/src/app/login/login-form/login-form.component.html index 99a266a6c..79fcb59aa 100644 --- a/src/app/login/login-form/login-form.component.html +++ b/src/app/login/login-form/login-form.component.html @@ -1,63 +1,86 @@ -
    -
    - - -
    diff --git a/src/app/navigation/navigation.component.ts b/src/app/navigation/navigation.component.ts index cc60e4c73..11357894c 100644 --- a/src/app/navigation/navigation.component.ts +++ b/src/app/navigation/navigation.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, ViewChild } from '@angular/core'; +import { Component, OnInit, ViewChild, inject } from '@angular/core'; import { Router, ActivatedRoute } from '@angular/router'; import { UntypedFormControl, ReactiveFormsModule } from '@angular/forms'; @@ -31,6 +31,10 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class NavigationComponent implements OnInit { + private navigationService = inject(NavigationService); + private route = inject(ActivatedRoute); + private router = inject(Router); + /** Navigation Components */ @ViewChild(OfficeNavigationComponent) officeNavigationComponent: OfficeNavigationComponent; @ViewChild(StaffNavigationComponent) staffNavigationComponent: StaffNavigationComponent; @@ -74,11 +78,7 @@ export class NavigationComponent implements OnInit { * @param {ActivatedRoute} route Activated Route. * @param {Router} router Router for navigation. */ - constructor( - private navigationService: NavigationService, - private route: ActivatedRoute, - private router: Router - ) { + constructor() { this.route.data.subscribe((data: { offices: any }) => { this.officeData = data.offices; }); diff --git a/src/app/navigation/navigation.service.ts b/src/app/navigation/navigation.service.ts index 79cb05ea9..2fa6c7d59 100644 --- a/src/app/navigation/navigation.service.ts +++ b/src/app/navigation/navigation.service.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { HttpClient, HttpParams } from '@angular/common/http'; /** rxjs Imports */ @@ -12,10 +12,7 @@ import { Observable } from 'rxjs'; providedIn: 'root' }) export class NavigationService { - /** - * @param {HttpClient} http Http Client to send requests. - */ - constructor(private http: HttpClient) {} + private http = inject(HttpClient); /** * @returns {Observable} Offices. diff --git a/src/app/navigation/office-navigation/office-navigation.component.html b/src/app/navigation/office-navigation/office-navigation.component.html index b51170c2d..f0f04fe21 100644 --- a/src/app/navigation/office-navigation/office-navigation.component.html +++ b/src/app/navigation/office-navigation/office-navigation.component.html @@ -9,12 +9,16 @@
    -
    - {{ 'labels.inputs.External Id' | translate }} -
    -
    - -
    + @if (officeData.externalId) { +
    + {{ 'labels.inputs.External Id' | translate }} +
    + } + @if (officeData.externalId) { +
    + +
    + }
    {{ 'labels.inputs.Opened On' | translate }} diff --git a/src/app/navigation/offices.resolver.ts b/src/app/navigation/offices.resolver.ts index 575b6f7a1..f4b527499 100644 --- a/src/app/navigation/offices.resolver.ts +++ b/src/app/navigation/offices.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; /** rxjs Imports */ import { Observable } from 'rxjs'; @@ -12,10 +12,7 @@ import { NavigationService } from './navigation.service'; */ @Injectable() export class OfficesResolver { - /** - * @param {NavigationService} navigationService Navigation service. - */ - constructor(private navigationService: NavigationService) {} + private navigationService = inject(NavigationService); /** * Returns the Offices data. diff --git a/src/app/navigation/savings-account-table/savings-account-table.component.ts b/src/app/navigation/savings-account-table/savings-account-table.component.ts index 19e39c204..37ad29257 100644 --- a/src/app/navigation/savings-account-table/savings-account-table.component.ts +++ b/src/app/navigation/savings-account-table/savings-account-table.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, Input, ViewChild } from '@angular/core'; +import { Component, Input, ViewChild, inject } from '@angular/core'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort, MatSortHeader } from '@angular/material/sort'; import { @@ -48,6 +48,8 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class SavingsAccountTableComponent { + private accountsFilterPipe = inject(AccountsFilterPipe); + /** Columns to be displayed in the savings accounts table. */ displayedColumns: string[] = [ 'accountNo', @@ -81,11 +83,6 @@ export class SavingsAccountTableComponent { this.dataSource.sort = this.sort; } - /** - * @param {AccountsFilterPipe} accountsFilterPipe Accounts Filter Pipe. - */ - constructor(private accountsFilterPipe: AccountsFilterPipe) {} - /** * Filters data in users table based on passed value. * @param {string} filterValue Value to filter data. diff --git a/src/app/navigation/share-account-table/share-account-table.component.ts b/src/app/navigation/share-account-table/share-account-table.component.ts index f8f213081..bc9149172 100644 --- a/src/app/navigation/share-account-table/share-account-table.component.ts +++ b/src/app/navigation/share-account-table/share-account-table.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, Input, ViewChild } from '@angular/core'; +import { Component, Input, ViewChild, inject } from '@angular/core'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort, MatSortHeader } from '@angular/material/sort'; import { @@ -48,6 +48,8 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ShareAccountTableComponent { + private accountsFilterPipe = inject(AccountsFilterPipe); + /** Columns to be displayed in the share accounts table. */ displayedColumns: string[] = [ 'accountNo', @@ -81,11 +83,6 @@ export class ShareAccountTableComponent { this.dataSource.sort = this.sort; } - /** - * @param {AccountsFilterPipe} accountsFilterPipe Accounts Filter Pipe. - */ - constructor(private accountsFilterPipe: AccountsFilterPipe) {} - /** * Filters data in users table based on passed value. * @param {string} filterValue Value to filter data. diff --git a/src/app/navigation/staff-navigation/staff-navigation.component.html b/src/app/navigation/staff-navigation/staff-navigation.component.html index 05cc3159f..24667c546 100644 --- a/src/app/navigation/staff-navigation/staff-navigation.component.html +++ b/src/app/navigation/staff-navigation/staff-navigation.component.html @@ -40,13 +40,17 @@ {{ employeeData.isLoanOfficer | yesNo }}
    -
    - {{ 'labels.inputs.Mobile Number' | translate }} -
    + @if (employeeData.mobileNo) { +
    + {{ 'labels.inputs.Mobile Number' | translate }} +
    + } -
    - {{ employeeData.mobileNo }} -
    + @if (employeeData.mobileNo) { +
    + {{ employeeData.mobileNo }} +
    + }
    {{ 'labels.inputs.Number of Centers' | translate }} diff --git a/src/app/not-found/not-found.component.ts b/src/app/not-found/not-found.component.ts index 795406155..b44700604 100644 --- a/src/app/not-found/not-found.component.ts +++ b/src/app/not-found/not-found.component.ts @@ -1,4 +1,4 @@ -import { Component } from '@angular/core'; +import { Component, inject } from '@angular/core'; import { Location } from '@angular/common'; import { FaIconComponent } from '@fortawesome/angular-fontawesome'; import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; @@ -13,7 +13,7 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class NotFoundComponent { - constructor(private location: Location) {} + private location = inject(Location); goBack(): void { this.location.back(); diff --git a/src/app/notifications/notifications-page/notifications-page.component.ts b/src/app/notifications/notifications-page/notifications-page.component.ts index 8d1e1b5c4..515b680df 100644 --- a/src/app/notifications/notifications-page/notifications-page.component.ts +++ b/src/app/notifications/notifications-page/notifications-page.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, ViewChild } from '@angular/core'; +import { Component, OnInit, ViewChild, inject } from '@angular/core'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort, MatSortHeader } from '@angular/material/sort'; import { @@ -45,6 +45,8 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class NotificationsPageComponent implements OnInit { + private route = inject(ActivatedRoute); + /** Notifications data. */ notificationsData: any; /** Columns to be displayed in notifications table. */ @@ -81,7 +83,7 @@ export class NotificationsPageComponent implements OnInit { * Retrieves the notifications data from `resolve`. * @param {ActivatedRoute} route Activated Route. */ - constructor(private route: ActivatedRoute) { + constructor() { this.route.data.subscribe((data: { notifications: any }) => { this.notificationsData = data.notifications.pageItems; }); diff --git a/src/app/notifications/notifications-routing.module.ts b/src/app/notifications/notifications-routing.module.ts index b4a413c02..fe58d6efd 100644 --- a/src/app/notifications/notifications-routing.module.ts +++ b/src/app/notifications/notifications-routing.module.ts @@ -23,7 +23,6 @@ const routes: Routes = [ } } ]) - ]; @NgModule({ diff --git a/src/app/notifications/notifications.resolver.ts b/src/app/notifications/notifications.resolver.ts index a7fccdf8b..1f44eca68 100644 --- a/src/app/notifications/notifications.resolver.ts +++ b/src/app/notifications/notifications.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; /** rxjs Imports */ import { Observable } from 'rxjs'; @@ -12,10 +12,7 @@ import { NotificationsService } from './notifications.service'; */ @Injectable() export class NotificationsResolver { - /** - * @param {NotificationsService} notificationsService Notifications service. - */ - constructor(private notificationsService: NotificationsService) {} + private notificationsService = inject(NotificationsService); /** * Returns the Notifications data. diff --git a/src/app/notifications/notifications.service.ts b/src/app/notifications/notifications.service.ts index ca9e1d099..159f8bc93 100644 --- a/src/app/notifications/notifications.service.ts +++ b/src/app/notifications/notifications.service.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { HttpClient, HttpParams } from '@angular/common/http'; /** rxjs Imports */ @@ -12,10 +12,7 @@ import { Observable, of } from 'rxjs'; providedIn: 'root' }) export class NotificationsService { - /** - * @param {HttpClient} http Http Client to send requests. - */ - constructor(private http: HttpClient) {} + private http = inject(HttpClient); /** * @returns {Observable} Notifications. diff --git a/src/app/organization/adhoc-query/adhoc-query-template.resolver.ts b/src/app/organization/adhoc-query/adhoc-query-template.resolver.ts index a4511c011..9d38e8d74 100644 --- a/src/app/organization/adhoc-query/adhoc-query-template.resolver.ts +++ b/src/app/organization/adhoc-query/adhoc-query-template.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; /** rxjs Imports */ import { Observable } from 'rxjs'; @@ -12,10 +12,7 @@ import { OrganizationService } from 'app/organization/organization.service'; */ @Injectable() export class AdhocQueryTemplateResolver { - /** - * @param {OrganizationService} organizationService Organization service. - */ - constructor(private organizationService: OrganizationService) {} + private organizationService = inject(OrganizationService); /** * Returns the adhoc query template data. diff --git a/src/app/organization/adhoc-query/adhoc-query.component.ts b/src/app/organization/adhoc-query/adhoc-query.component.ts index 050ace331..63cdfdd76 100644 --- a/src/app/organization/adhoc-query/adhoc-query.component.ts +++ b/src/app/organization/adhoc-query/adhoc-query.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, ViewChild } from '@angular/core'; +import { Component, OnInit, ViewChild, inject } from '@angular/core'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort, MatSortHeader } from '@angular/material/sort'; import { @@ -50,6 +50,8 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class AdhocQueryComponent implements OnInit { + private route = inject(ActivatedRoute); + /** Adhoc Queries data. */ adhocQueriesData: any; /** Columns to be displayed in adhoc queries table. */ @@ -74,7 +76,7 @@ export class AdhocQueryComponent implements OnInit { * Retrieves the adhoc queries data from `resolve`. * @param {ActivatedRoute} route Activated Route. */ - constructor(private route: ActivatedRoute) { + constructor() { this.route.data.subscribe((data: { adhocQueries: any }) => { this.adhocQueriesData = data.adhocQueries; }); diff --git a/src/app/organization/adhoc-query/common-resolvers/adhoc-queries.resolver.ts b/src/app/organization/adhoc-query/common-resolvers/adhoc-queries.resolver.ts index 941317e5e..4058cf028 100644 --- a/src/app/organization/adhoc-query/common-resolvers/adhoc-queries.resolver.ts +++ b/src/app/organization/adhoc-query/common-resolvers/adhoc-queries.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; /** rxjs Imports */ import { Observable } from 'rxjs'; @@ -12,10 +12,7 @@ import { OrganizationService } from '../../organization.service'; */ @Injectable() export class AdhocQueriesResolver { - /** - * @param {OrganizationService} organizationService Organization service. - */ - constructor(private organizationService: OrganizationService) {} + private organizationService = inject(OrganizationService); /** * Returns the adhoc queries data. diff --git a/src/app/organization/adhoc-query/common-resolvers/adhoc-query-and-template.resolver.ts b/src/app/organization/adhoc-query/common-resolvers/adhoc-query-and-template.resolver.ts index 610bdad63..ba9cb33bd 100644 --- a/src/app/organization/adhoc-query/common-resolvers/adhoc-query-and-template.resolver.ts +++ b/src/app/organization/adhoc-query/common-resolvers/adhoc-query-and-template.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { OrganizationService } from 'app/organization/organization.service'; */ @Injectable() export class AdhocQueryAndTemplateResolver { - /** - * @param {OrganizationService} organizationService Organization service. - */ - constructor(private organizationService: OrganizationService) {} + private organizationService = inject(OrganizationService); /** * Returns the adhoc query and template data. diff --git a/src/app/organization/adhoc-query/common-resolvers/adhoc-query.resolver.ts b/src/app/organization/adhoc-query/common-resolvers/adhoc-query.resolver.ts index d1b777767..0d1a54270 100644 --- a/src/app/organization/adhoc-query/common-resolvers/adhoc-query.resolver.ts +++ b/src/app/organization/adhoc-query/common-resolvers/adhoc-query.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { OrganizationService } from 'app/organization/organization.service'; */ @Injectable() export class AdhocQueryResolver { - /** - * @param {OrganizationService} organizationService Organization service. - */ - constructor(private organizationService: OrganizationService) {} + private organizationService = inject(OrganizationService); /** * Returns the adhoc query data. diff --git a/src/app/organization/adhoc-query/create-adhoc-query/create-adhoc-query.component.html b/src/app/organization/adhoc-query/create-adhoc-query/create-adhoc-query.component.html index dcece277d..2d498e706 100644 --- a/src/app/organization/adhoc-query/create-adhoc-query/create-adhoc-query.component.html +++ b/src/app/organization/adhoc-query/create-adhoc-query/create-adhoc-query.component.html @@ -6,69 +6,87 @@ {{ 'labels.inputs.name' | translate }} - - {{ 'labels.inputs.name' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (adhocQueryForm.controls.name.hasError('required')) { + + {{ 'labels.inputs.name' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.SQL Query' | translate }} - - {{ 'labels.inputs.SQL Query' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (adhocQueryForm.controls.query.hasError('required')) { + + {{ 'labels.inputs.SQL Query' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Insert into table' | translate }} - - {{ 'labels.inputs.Insert into table' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (adhocQueryForm.controls.tableName.hasError('required')) { + + {{ 'labels.inputs.Insert into table' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Table Fields' | translate }} - - {{ 'labels.inputs.Table Fields' | translate }} {{ 'labels.commons.are' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (adhocQueryForm.controls.tableFields.hasError('required')) { + + {{ 'labels.inputs.Table Fields' | translate }} {{ 'labels.commons.are' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Email' | translate }} - - {{ 'labels.inputs.Email' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.invalid' | translate }} - + @if (adhocQueryForm.controls.email.hasError('email')) { + + {{ 'labels.inputs.Email' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.invalid' | translate }} + + } {{ 'labels.inputs.Report Run Frequency' | translate }} - - {{ reportRunFrequency.value }} - + @for (reportRunFrequency of reportRunFrequencyData; track reportRunFrequency) { + + {{ reportRunFrequency.value }} + + } - - {{ 'labels.inputs.Custom Report Run Frequency (Days)' | translate }} - - - {{ 'labels.inputs.Custom Report Run Frequency' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - {{ 'labels.inputs.Custom Report Run Frequency' | translate }} - {{ 'labels.commons.must be larger than 0' | translate }} - - + @if (adhocQueryForm.controls.reportRunFrequency.value === 5) { + + {{ 'labels.inputs.Custom Report Run Frequency (Days)' | translate }} + + @if (adhocQueryForm.controls.reportRunEvery.hasError('required')) { + + {{ 'labels.inputs.Custom Report Run Frequency' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + @if (adhocQueryForm.controls.reportRunEvery.hasError('min')) { + + {{ 'labels.inputs.Custom Report Run Frequency' | translate }} + {{ 'labels.commons.must be larger than 0' | translate }} + + } + + } {{ 'labels.inputs.Active' | translate }} diff --git a/src/app/organization/adhoc-query/create-adhoc-query/create-adhoc-query.component.ts b/src/app/organization/adhoc-query/create-adhoc-query/create-adhoc-query.component.ts index ac69bc3d6..c8d78bb0e 100644 --- a/src/app/organization/adhoc-query/create-adhoc-query/create-adhoc-query.component.ts +++ b/src/app/organization/adhoc-query/create-adhoc-query/create-adhoc-query.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, @@ -27,6 +27,11 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class CreateAdhocQueryComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private organizationService = inject(OrganizationService); + private route = inject(ActivatedRoute); + private router = inject(Router); + /** Adhoc Query form. */ adhocQueryForm: UntypedFormGroup; /** Adhoc Query template data. */ @@ -41,12 +46,7 @@ export class CreateAdhocQueryComponent implements OnInit { * @param {ActivatedRoute} route Activated Route. * @param {Router} router Router for navigation. */ - constructor( - private formBuilder: UntypedFormBuilder, - private organizationService: OrganizationService, - private route: ActivatedRoute, - private router: Router - ) { + constructor() { this.route.data.subscribe((data: { adhocQueryTemplate: any }) => { this.adhocQueryTemplateData = data.adhocQueryTemplate; }); @@ -101,7 +101,8 @@ export class CreateAdhocQueryComponent implements OnInit { 'reportRunEvery', new UntypedFormControl('', [ Validators.required, - Validators.min(1)]) + Validators.min(1) + ]) ); } else { this.adhocQueryForm.removeControl('reportRunEvery'); diff --git a/src/app/organization/adhoc-query/edit-adhoc-query/edit-adhoc-query.component.html b/src/app/organization/adhoc-query/edit-adhoc-query/edit-adhoc-query.component.html index 9e388f5a3..4529fe3fc 100644 --- a/src/app/organization/adhoc-query/edit-adhoc-query/edit-adhoc-query.component.html +++ b/src/app/organization/adhoc-query/edit-adhoc-query/edit-adhoc-query.component.html @@ -6,69 +6,87 @@ {{ 'labels.inputs.name' | translate }} - - {{ 'labels.inputs.name' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (editAdhocQueryForm.controls.name.hasError('required')) { + + {{ 'labels.inputs.name' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.SQL Query' | translate }} - - {{ 'labels.inputs.SQL Query' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (editAdhocQueryForm.controls.query.hasError('required')) { + + {{ 'labels.inputs.SQL Query' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Insert into table' | translate }} - - {{ 'labels.inputs.Insert into table' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (editAdhocQueryForm.controls.tableName.hasError('required')) { + + {{ 'labels.inputs.Insert into table' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Table Fields' | translate }} - - {{ 'labels.inputs.Table Fields' | translate }} {{ 'labels.commons.are' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (editAdhocQueryForm.controls.tableFields.hasError('required')) { + + {{ 'labels.inputs.Table Fields' | translate }} {{ 'labels.commons.are' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Email' | translate }} - - {{ 'labels.inputs.Email' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.invalid' | translate }} - + @if (editAdhocQueryForm.controls.email.hasError('email')) { + + {{ 'labels.inputs.Email' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.invalid' | translate }} + + } {{ 'labels.inputs.Report Run Frequency' | translate }} - - {{ reportRunFrequency.value }} - + @for (reportRunFrequency of reportRunFrequencyData; track reportRunFrequency) { + + {{ reportRunFrequency.value }} + + } - - {{ 'labels.inputs.Custom Report Run Frequency (Days)' | translate }} - - - {{ 'labels.inputs.Custom Report Run Frequency' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - {{ 'labels.inputs.Custom Report Run Frequency' | translate }} - {{ 'labels.commons.must be larger than 0' | translate }} - - + @if (editAdhocQueryForm.controls.reportRunFrequency.value === 5) { + + {{ 'labels.inputs.Custom Report Run Frequency (Days)' | translate }} + + @if (editAdhocQueryForm.controls.reportRunEvery.hasError('required')) { + + {{ 'labels.inputs.Custom Report Run Frequency' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + @if (editAdhocQueryForm.controls.reportRunEvery.hasError('min')) { + + {{ 'labels.inputs.Custom Report Run Frequency' | translate }} + {{ 'labels.commons.must be larger than 0' | translate }} + + } + + } {{ 'labels.inputs.Active' | translate }} diff --git a/src/app/organization/adhoc-query/edit-adhoc-query/edit-adhoc-query.component.ts b/src/app/organization/adhoc-query/edit-adhoc-query/edit-adhoc-query.component.ts index ce0c9a904..538cefb11 100644 --- a/src/app/organization/adhoc-query/edit-adhoc-query/edit-adhoc-query.component.ts +++ b/src/app/organization/adhoc-query/edit-adhoc-query/edit-adhoc-query.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, @@ -27,6 +27,11 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class EditAdhocQueryComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private organizationService = inject(OrganizationService); + private route = inject(ActivatedRoute); + private router = inject(Router); + /** Edit Adhoc Query form. */ editAdhocQueryForm: UntypedFormGroup; /** Adhoc Query template data. */ @@ -41,12 +46,7 @@ export class EditAdhocQueryComponent implements OnInit { * @param {ActivatedRoute} route Activated Route. * @param {Router} router Router for navigation. */ - constructor( - private formBuilder: UntypedFormBuilder, - private organizationService: OrganizationService, - private route: ActivatedRoute, - private router: Router - ) { + constructor() { this.route.data.subscribe((data: { adhocQueryAndTemplate: any }) => { this.adhocQueryTemplateData = data.adhocQueryAndTemplate; }); @@ -101,7 +101,8 @@ export class EditAdhocQueryComponent implements OnInit { 'reportRunEvery', new UntypedFormControl('', [ Validators.required, - Validators.min(1)]) + Validators.min(1) + ]) ); this.editAdhocQueryForm.get('reportRunEvery').patchValue(this.adhocQueryTemplateData.reportRunEvery); } else { diff --git a/src/app/organization/adhoc-query/view-adhoc-query/view-adhoc-query.component.html b/src/app/organization/adhoc-query/view-adhoc-query/view-adhoc-query.component.html index 68cfeb346..9480f1229 100644 --- a/src/app/organization/adhoc-query/view-adhoc-query/view-adhoc-query.component.html +++ b/src/app/organization/adhoc-query/view-adhoc-query/view-adhoc-query.component.html @@ -37,13 +37,17 @@ {{ adhocQueryData.tableName }}
    -
    - {{ 'labels.inputs.Report Run Frequency' | translate }} -
    + @if (adhocQueryData.reportRunFrequency) { +
    + {{ 'labels.inputs.Report Run Frequency' | translate }} +
    + } -
    - {{ reportRunFrequency }} -
    + @if (adhocQueryData.reportRunFrequency) { +
    + {{ reportRunFrequency }} +
    + }
    {{ 'labels.inputs.Status' | translate }} diff --git a/src/app/organization/adhoc-query/view-adhoc-query/view-adhoc-query.component.ts b/src/app/organization/adhoc-query/view-adhoc-query/view-adhoc-query.component.ts index dbf4fc908..a18d00a8d 100644 --- a/src/app/organization/adhoc-query/view-adhoc-query/view-adhoc-query.component.ts +++ b/src/app/organization/adhoc-query/view-adhoc-query/view-adhoc-query.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component } from '@angular/core'; +import { Component, inject } from '@angular/core'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; import { MatDialog } from '@angular/material/dialog'; @@ -24,6 +24,11 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ViewAdhocQueryComponent { + private organizationService = inject(OrganizationService); + private route = inject(ActivatedRoute); + private router = inject(Router); + private dialog = inject(MatDialog); + /** Adhoc query data. */ adhocQueryData: any; @@ -34,12 +39,7 @@ export class ViewAdhocQueryComponent { * @param {Router} router Router for navigation. * @param {MatDialog} dialog Dialog reference. */ - constructor( - private organizationService: OrganizationService, - private route: ActivatedRoute, - private router: Router, - private dialog: MatDialog - ) { + constructor() { this.route.data.subscribe((data: { adhocQuery: any }) => { this.adhocQueryData = data.adhocQuery; }); diff --git a/src/app/organization/bulk-import/bulk-import.component.html b/src/app/organization/bulk-import/bulk-import.component.html index 0817a9b2f..b0a3b1ef4 100644 --- a/src/app/organization/bulk-import/bulk-import.component.html +++ b/src/app/organization/bulk-import/bulk-import.component.html @@ -9,11 +9,17 @@

    {{ 'labels.heading.Offices' | translate }}

    - - -

    - {{ 'labels.text.Download, Upload Offices Template' | translate }} -

    + @if (!arrowBooleans[0]) { + + } + @if (arrowBooleans[0]) { + + } + @if (arrowBooleans[0]) { +

    + {{ 'labels.text.Download, Upload Offices Template' | translate }} +

    + } @@ -21,11 +27,17 @@

    {{ 'labels.heading.Users' | translate }}

    - - -

    - {{ 'labels.text.Download offices template and Upload office excel files' | translate }} -

    + @if (!arrowBooleans[1]) { + + } + @if (arrowBooleans[1]) { + + } + @if (arrowBooleans[1]) { +

    + {{ 'labels.text.Download offices template and Upload office excel files' | translate }} +

    + }
    @@ -33,11 +45,17 @@

    {{ 'labels.heading.Groups' | translate }}

    - - -

    - {{ 'labels.text.Download groups template and Upload group excel files' | translate }} -

    + @if (!arrowBooleans[2]) { + + } + @if (arrowBooleans[2]) { + + } + @if (arrowBooleans[2]) { +

    + {{ 'labels.text.Download groups template and Upload group excel files' | translate }} +

    + }
    @@ -45,11 +63,17 @@

    {{ 'labels.heading.Loan Accounts' | translate }}

    - - -

    - {{ 'labels.text.Download loan accounts template and upload loan account excel files' | translate }} -

    + @if (!arrowBooleans[3]) { + + } + @if (arrowBooleans[3]) { + + } + @if (arrowBooleans[3]) { +

    + {{ 'labels.text.Download loan accounts template and upload loan account excel files' | translate }} +

    + }
    @@ -57,11 +81,19 @@

    {{ 'labels.heading.Savings Accounts' | translate }}

    - - -

    - {{ 'labels.text.Download savings accounts template and upload savings account excel files' | translate }} -

    + @if (!arrowBooleans[4]) { + + } + @if (arrowBooleans[4]) { + + } + @if (arrowBooleans[4]) { +

    + {{ + 'labels.text.Download savings accounts template and upload savings account excel files' | translate + }} +

    + }
    @@ -71,14 +103,20 @@

    {{ 'labels.heading.Fixed Deposit Accounts' | translate }}

    - - -

    - {{ - 'labels.text.Download fixed deposit accounts template and upload fixed deposit account excel files' - | translate - }} -

    + @if (!arrowBooleans[5]) { + + } + @if (arrowBooleans[5]) { + + } + @if (arrowBooleans[5]) { +

    + {{ + 'labels.text.Download fixed deposit accounts template and upload fixed deposit account excel files' + | translate + }} +

    + }
    @@ -86,13 +124,19 @@

    {{ 'labels.heading.Chart of Accounts' | translate }}

    - - -

    - {{ - 'labels.text.Download chart of accounts template and upload chart of account excel files' | translate - }} -

    + @if (!arrowBooleans[6]) { + + } + @if (arrowBooleans[6]) { + + } + @if (arrowBooleans[6]) { +

    + {{ + 'labels.text.Download chart of accounts template and upload chart of account excel files' | translate + }} +

    + }
    @@ -100,11 +144,17 @@

    {{ 'labels.heading.Share Accounts' | translate }}

    - - -

    - {{ 'labels.text.Download share accounts template and upload share account excel files' | translate }} -

    + @if (!arrowBooleans[7]) { + + } + @if (arrowBooleans[7]) { + + } + @if (arrowBooleans[7]) { +

    + {{ 'labels.text.Download share accounts template and upload share account excel files' | translate }} +

    + }
    @@ -116,11 +166,17 @@

    {{ 'labels.heading.Employees' | translate }}

    - - -

    - {{ 'labels.text.Download loan accounts template and upload loan account excel files' | translate }} -

    + @if (!arrowBooleans[8]) { + + } + @if (arrowBooleans[8]) { + + } + @if (arrowBooleans[8]) { +

    + {{ 'labels.text.Download loan accounts template and upload loan account excel files' | translate }} +

    + } @@ -128,11 +184,17 @@

    {{ 'labels.heading.Clients' | translate }}

    - - -

    - {{ 'labels.text.Download clients template and upload clients excel files' | translate }} -

    + @if (!arrowBooleans[9]) { + + } + @if (arrowBooleans[9]) { + + } + @if (arrowBooleans[9]) { +

    + {{ 'labels.text.Download clients template and upload clients excel files' | translate }} +

    + }
    @@ -140,11 +202,17 @@

    {{ 'labels.heading.Centers' | translate }}

    - - -

    - {{ 'labels.text.Download centers template and upload centers excel files' | translate }} -

    + @if (!arrowBooleans[10]) { + + } + @if (arrowBooleans[10]) { + + } + @if (arrowBooleans[10]) { +

    + {{ 'labels.text.Download centers template and upload centers excel files' | translate }} +

    + }
    @@ -152,11 +220,17 @@

    {{ 'labels.heading.Loan Repayments' | translate }}

    - - -

    - {{ 'labels.text.Download loan repayments template and upload loan repayment excel files' | translate }} -

    + @if (!arrowBooleans[11]) { + + } + @if (arrowBooleans[11]) { + + } + @if (arrowBooleans[11]) { +

    + {{ 'labels.text.Download loan repayments template and upload loan repayment excel files' | translate }} +

    + }
    @@ -166,14 +240,20 @@

    {{ 'labels.heading.Savings Transactions' | translate }}

    - - -

    - {{ - 'labels.text.Download savings transactions template and upload savings transaction excel files' - | translate - }} -

    + @if (!arrowBooleans[12]) { + + } + @if (arrowBooleans[12]) { + + } + @if (arrowBooleans[12]) { +

    + {{ + 'labels.text.Download savings transactions template and upload savings transaction excel files' + | translate + }} +

    + }
    @@ -183,14 +263,20 @@

    {{ 'labels.heading.Fixed Deposit Transactions' | translate }}

    - - -

    - {{ - 'labels.text.Download fixed deposit transactions template and upload fixed deposit transaction excel files' - | translate - }} -

    + @if (!arrowBooleans[13]) { + + } + @if (arrowBooleans[13]) { + + } + @if (arrowBooleans[13]) { +

    + {{ + 'labels.text.Download fixed deposit transactions template and upload fixed deposit transaction excel files' + | translate + }} +

    + }
    @@ -200,14 +286,20 @@

    {{ 'labels.heading.Recurring Deposit Transactions' | translate }}

    - - -

    - {{ - 'labels.text.Download recurring deposit transactions template and upload recurring deposit transaction excel files' - | translate - }} -

    + @if (!arrowBooleans[14]) { + + } + @if (arrowBooleans[14]) { + + } + @if (arrowBooleans[14]) { +

    + {{ + 'labels.text.Download recurring deposit transactions template and upload recurring deposit transaction excel files' + | translate + }} +

    + }
    @@ -215,11 +307,17 @@

    {{ 'labels.heading.Journal Entries' | translate }}

    - - -

    - {{ 'labels.text.Download journal entries template and upload journal entries excel files' | translate }} -

    + @if (!arrowBooleans[15]) { + + } + @if (arrowBooleans[15]) { + + } + @if (arrowBooleans[15]) { +

    + {{ 'labels.text.Download journal entries template and upload journal entries excel files' | translate }} +

    + }
    @@ -227,11 +325,17 @@

    {{ 'labels.heading.Guarantors' | translate }}

    - - -

    - {{ 'labels.text.Download guarantors template and upload guarantor excel files' | translate }} -

    + @if (!arrowBooleans[16]) { + + } + @if (arrowBooleans[16]) { + + } + @if (arrowBooleans[16]) { +

    + {{ 'labels.text.Download guarantors template and upload guarantor excel files' | translate }} +

    + }
    diff --git a/src/app/organization/bulk-import/bulk-import.resolver.ts b/src/app/organization/bulk-import/bulk-import.resolver.ts index 3212a19ee..91ecf826a 100644 --- a/src/app/organization/bulk-import/bulk-import.resolver.ts +++ b/src/app/organization/bulk-import/bulk-import.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -16,12 +16,9 @@ import { BulkImports } from './view-bulk-import/bulk-imports'; */ @Injectable() export class BulkImportResolver { - bulkImportsArray = BulkImports; + private organizationService = inject(OrganizationService); - /** - * @param {OrganizationService} organizationService Organization service. - */ - constructor(private organizationService: OrganizationService) {} + bulkImportsArray = BulkImports; /** * Gets bulk-import's entity name diff --git a/src/app/organization/bulk-import/view-bulk-import/view-bulk-import.component.html b/src/app/organization/bulk-import/view-bulk-import/view-bulk-import.component.html index 3d37e7fd5..5cfa53d59 100644 --- a/src/app/organization/bulk-import/view-bulk-import/view-bulk-import.component.html +++ b/src/app/organization/bulk-import/view-bulk-import/view-bulk-import.component.html @@ -7,37 +7,47 @@
    -
    - - {{ 'labels.inputs.Office' | translate }} - - - {{ office.name }} - - - -
    + @if (bulkImport.formFields >= 1) { +
    + + {{ 'labels.inputs.Office' | translate }} + + @for (office of officeData; track office) { + + {{ office.name }} + + } + + +
    + } -
    - - {{ 'labels.inputs.Staff' | translate }} - - - {{ staff.displayName }} - - - -
    + @if (bulkImport.formFields >= 2) { +
    + + {{ 'labels.inputs.Staff' | translate }} + + @for (staff of staffData; track staff) { + + {{ staff.displayName }} + + } + + +
    + } -
    - - {{ 'labels.inputs.Legal Form' | translate }} - - {{ 'labels.inputs.Entity' | translate }} - {{ 'labels.inputs.Person' | translate }} - - -
    + @if (bulkImport.formFields === 3) { +
    + + {{ 'labels.inputs.Legal Form' | translate }} + + {{ 'labels.inputs.Entity' | translate }} + {{ 'labels.inputs.Person' | translate }} + + +
    + }
    @@ -62,9 +72,9 @@ - {{ - 'labels.text.Please retain the value Entity/Person in the filename.' | translate - }} + @if (bulkImport.name === 'Clients') { + {{ 'labels.text.Please retain the value Entity/Person in the filename.' | translate }} + }
    diff --git a/src/app/organization/bulk-import/view-bulk-import/view-bulk-import.component.ts b/src/app/organization/bulk-import/view-bulk-import/view-bulk-import.component.ts index d08cfc1dd..0be146e74 100644 --- a/src/app/organization/bulk-import/view-bulk-import/view-bulk-import.component.ts +++ b/src/app/organization/bulk-import/view-bulk-import/view-bulk-import.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, ViewChild } from '@angular/core'; +import { Component, OnInit, ViewChild, inject } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort, MatSortHeader } from '@angular/material/sort'; @@ -58,6 +58,10 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ViewBulkImportComponent implements OnInit { + private route = inject(ActivatedRoute); + private formBuilder = inject(UntypedFormBuilder); + private organizationService = inject(OrganizationService); + /** offices Data */ officeData: any; /** staff Data */ @@ -99,11 +103,7 @@ export class ViewBulkImportComponent implements OnInit { * @param {FormBuilder} formBuilder FormBuilder * @param {OrganizationService} organizationService OrganizationService */ - constructor( - private route: ActivatedRoute, - private formBuilder: UntypedFormBuilder, - private organizationService: OrganizationService - ) { + constructor() { this.bulkImport.name = this.route.snapshot.params['import-name']; this.route.data.subscribe((data: any) => { this.officeData = data.offices; diff --git a/src/app/organization/bulk-loan-reassignmnet/bulk-loan-reassignmnet.component.html b/src/app/organization/bulk-loan-reassignmnet/bulk-loan-reassignmnet.component.html index dcaa6d028..38f6431a2 100644 --- a/src/app/organization/bulk-loan-reassignmnet/bulk-loan-reassignmnet.component.html +++ b/src/app/organization/bulk-loan-reassignmnet/bulk-loan-reassignmnet.component.html @@ -6,14 +6,18 @@ {{ 'labels.inputs.Office' | translate }} - - {{ office.name }} - + @for (office of offices; track office) { + + {{ office.name }} + + } - - {{ 'labels.inputs.Office' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (bulkLoanForm.controls.officeId.hasError('required')) { + + {{ 'labels.inputs.Office' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + }
    @@ -31,95 +35,119 @@ /> - - {{ 'labels.inputs.Assignment Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (bulkLoanForm.controls.assignmentDate.hasError('required')) { + + {{ 'labels.inputs.Assignment Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + }
    - - {{ 'labels.inputs.From loan officer' | translate }} - - - {{ fromOfficers.displayName }} - - - - {{ 'labels.inputs.From Loan Officer' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - + @if (fromLoanOfficers !== undefined) { + + {{ 'labels.inputs.From loan officer' | translate }} + + @for (fromOfficers of fromLoanOfficers; track fromOfficers) { + + {{ fromOfficers.displayName }} + + } + + @if (bulkLoanForm.controls.fromLoanOfficerId.hasError('required')) { + + {{ 'labels.inputs.From Loan Officer' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + }
    {{ 'labels.inputs.To loan officer' | translate }} - - {{ toOfficers.displayName }} - + @for (toOfficers of toLoanOfficers; track toOfficers) { + + {{ toOfficers.displayName }} + + } - - {{ 'labels.inputs.To Loan Officer' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (bulkLoanForm.controls.toLoanOfficerId.hasError('required')) { + + {{ 'labels.inputs.To Loan Officer' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + }
    - - - - - - - -
    {{ 'labels.inputs.Clients' | translate }}
    + @if (officerTemplate !== undefined) { +
    + + + + + @for (clients of officerTemplate.accountSummaryCollection.clients; track clients) { - +
    {{ 'labels.inputs.Clients' | translate }}
    - {{ clients.displayName }} -
    + + + + @for (loans of clients.loans; track loans) { + + + + } +
    + {{ clients.displayName }} +
    + {{ loans.productName }}({{ loans.accountNo }}) +
    + } + + + } - - - {{ loans.productName }}({{ loans.accountNo }}) - - - - - - - - - - - - - - -
    {{ 'labels.inputs.Groups' | translate }}
    + @if (officerTemplate !== undefined) { +
    + + + + + @for (groups of officerTemplate.accountSummaryCollection.groups; track groups) { - +
    {{ 'labels.inputs.Groups' | translate }}
    - {{ groups.displayName }} -
    + + + + @for (loans of groups.loans; track loans) { + + + + } +
    + {{ groups.displayName }} +
    + {{ loans.productName }}({{ loans.accountNo }}) +
    - - - - {{ loans.productName }}({{ loans.accountNo }}) - - - - - - + } + + + }
    diff --git a/src/app/organization/bulk-loan-reassignmnet/bulk-loan-reassignmnet.component.ts b/src/app/organization/bulk-loan-reassignmnet/bulk-loan-reassignmnet.component.ts index 704a20557..7ec9868ca 100644 --- a/src/app/organization/bulk-loan-reassignmnet/bulk-loan-reassignmnet.component.ts +++ b/src/app/organization/bulk-loan-reassignmnet/bulk-loan-reassignmnet.component.ts @@ -1,5 +1,5 @@ /** Angular Imports. */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, @@ -29,6 +29,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class BulkLoanReassignmnetComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private route = inject(ActivatedRoute); + private organizationSevice = inject(OrganizationService); + private settingsService = inject(SettingsService); + private dateUtils = inject(Dates); + private router = inject(Router); + /** Bulk Loan form. */ bulkLoanForm: UntypedFormGroup; /** Office data. */ @@ -56,14 +63,7 @@ export class BulkLoanReassignmnetComponent implements OnInit { * @param {SettingsService} settingsService Settings Service. * @param {Router} router Router. */ - constructor( - private formBuilder: UntypedFormBuilder, - private route: ActivatedRoute, - private organizationSevice: OrganizationService, - private settingsService: SettingsService, - private dateUtils: Dates, - private router: Router - ) { + constructor() { this.route.data.subscribe((data: { offices: any }) => { this.offices = data.offices; }); diff --git a/src/app/organization/currencies/currencies.component.ts b/src/app/organization/currencies/currencies.component.ts index 7d99ea15b..9eb6d38bb 100644 --- a/src/app/organization/currencies/currencies.component.ts +++ b/src/app/organization/currencies/currencies.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, TemplateRef, ElementRef, ViewChild, AfterViewInit } from '@angular/core'; +import { Component, OnInit, TemplateRef, ElementRef, ViewChild, AfterViewInit, inject } from '@angular/core'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort, MatSortHeader } from '@angular/material/sort'; import { @@ -52,6 +52,11 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class CurrenciesComponent implements OnInit, AfterViewInit { + private route = inject(ActivatedRoute); + private router = inject(Router); + private configurationWizardService = inject(ConfigurationWizardService); + private popoverService = inject(PopoverService); + /** Currencies data. */ currenciesData: any; /** Columns to be displayed in currencies table. */ @@ -83,12 +88,7 @@ export class CurrenciesComponent implements OnInit, AfterViewInit { * @param {ConfigurationWizardService} configurationWizardService ConfigurationWizard Service. * @param {PopoverService} popoverService PopoverService. */ - constructor( - private route: ActivatedRoute, - private router: Router, - private configurationWizardService: ConfigurationWizardService, - private popoverService: PopoverService - ) { + constructor() { this.route.data.subscribe((data: { currencies: any }) => { this.currenciesData = data.currencies.selectedCurrencyOptions; }); diff --git a/src/app/organization/currencies/currencies.resolver.ts b/src/app/organization/currencies/currencies.resolver.ts index ba2d75118..fdf1ad03f 100644 --- a/src/app/organization/currencies/currencies.resolver.ts +++ b/src/app/organization/currencies/currencies.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; /** rxjs Imports */ import { Observable } from 'rxjs'; @@ -12,10 +12,7 @@ import { OrganizationService } from '../organization.service'; */ @Injectable() export class CurrenciesResolver { - /** - * @param {OrganizationService} organizationService Organization service. - */ - constructor(private organizationService: OrganizationService) {} + private organizationService = inject(OrganizationService); /** * Returns the currencies data. diff --git a/src/app/organization/currencies/manage-currencies/manage-currencies.component.html b/src/app/organization/currencies/manage-currencies/manage-currencies.component.html index b7dae201e..415e3b24d 100644 --- a/src/app/organization/currencies/manage-currencies/manage-currencies.component.html +++ b/src/app/organization/currencies/manage-currencies/manage-currencies.component.html @@ -17,14 +17,16 @@ [formControl]="filterFormCtrl" > - - ({{ currency.code }}) {{ currency.name }} - + @for (currency of currencyData | async; track currency) { + ({{ currency.code }}) {{ currency.name }} + } - - {{ 'labels.inputs.Currency' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (currencyForm.controls.currency.hasError('required')) { + + {{ 'labels.inputs.Currency' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + {{ currency.name }} - - - - {{ currency.name }} - - + + } diff --git a/src/app/organization/currencies/manage-currencies/manage-currencies.component.ts b/src/app/organization/currencies/manage-currencies/manage-currencies.component.ts index e2d5f09c9..545a008a6 100644 --- a/src/app/organization/currencies/manage-currencies/manage-currencies.component.ts +++ b/src/app/organization/currencies/manage-currencies/manage-currencies.component.ts @@ -8,7 +8,8 @@ import { AfterViewInit, OnDestroy, OnChanges, - SimpleChanges + SimpleChanges, + inject } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; import { MatDialog } from '@angular/material/dialog'; @@ -29,7 +30,7 @@ import { takeUntil } from 'rxjs/operators'; import { ReplaySubject, Subject } from 'rxjs'; import { Currency } from 'app/shared/models/general.model'; import { NgxMatSelectSearchModule } from 'ngx-mat-select-search'; -import { NgFor, NgIf, AsyncPipe } from '@angular/common'; +import { AsyncPipe } from '@angular/common'; import { FaIconComponent } from '@fortawesome/angular-fontawesome'; import { MatGridList, MatGridTile } from '@angular/material/grid-list'; import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; @@ -51,6 +52,15 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ManageCurrenciesComponent implements OnInit, AfterViewInit, OnDestroy, OnChanges { + private route = inject(ActivatedRoute); + private formBuilder = inject(UntypedFormBuilder); + private organizationservice = inject(OrganizationService); + dialog = inject(MatDialog); + private router = inject(Router); + private translateService = inject(TranslateService); + private configurationWizardService = inject(ConfigurationWizardService); + private popoverService = inject(PopoverService); + //** Defining PlaceHolders for the search bar */ placeHolderLabel = ''; noEntriesFoundLabel = ''; @@ -82,16 +92,7 @@ export class ManageCurrenciesComponent implements OnInit, AfterViewInit, OnDestr * @param {OrganizationService} organizationservice Organization Service * @param {MatDialog} dialog Mat Dialog */ - constructor( - private route: ActivatedRoute, - private formBuilder: UntypedFormBuilder, - private organizationservice: OrganizationService, - public dialog: MatDialog, - private router: Router, - private translateService: TranslateService, - private configurationWizardService: ConfigurationWizardService, - private popoverService: PopoverService - ) { + constructor() { this.route.parent.data.subscribe((data: { currencies: any }) => { this.selectedCurrencies = data.currencies.selectedCurrencyOptions; this.currencyList = data.currencies.currencyOptions; diff --git a/src/app/organization/employees/create-employee/create-employee.component.html b/src/app/organization/employees/create-employee/create-employee.component.html index fe69ac110..1dbb7da6c 100644 --- a/src/app/organization/employees/create-employee/create-employee.component.html +++ b/src/app/organization/employees/create-employee/create-employee.component.html @@ -6,40 +6,52 @@ {{ 'labels.inputs.Office' | translate }} - - {{ office.name }} - + @for (office of officeData; track office) { + + {{ office.name }} + + } - - {{ 'labels.inputs.Office' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (employeeForm.controls.officeId.hasError('required')) { + + {{ 'labels.inputs.Office' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.First Name' | translate }} - - {{ 'labels.inputs.First Name' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - {{ 'labels.inputs.First Name' | translate }} {{ 'labels.inputs.cannot' | translate }} - {{ 'labels.inputs.begin with a special character or number' | translate }} - + @if (employeeForm.controls.firstname.hasError('required')) { + + {{ 'labels.inputs.First Name' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + @if (employeeForm.controls.firstname.hasError('pattern')) { + + {{ 'labels.inputs.First Name' | translate }} {{ 'labels.inputs.cannot' | translate }} + {{ 'labels.inputs.begin with a special character or number' | translate }} + + } {{ 'labels.inputs.Last Name' | translate }} - - {{ 'labels.inputs.Last Name' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - {{ 'labels.inputs.Last Name' | translate }} {{ 'labels.inputs.cannot' | translate }} - {{ 'labels.inputs.begin with a special character or number' | translate }} - + @if (employeeForm.controls.lastname.hasError('required')) { + + {{ 'labels.inputs.Last Name' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + @if (employeeForm.controls.lastname.hasError('pattern')) { + + {{ 'labels.inputs.Last Name' | translate }} {{ 'labels.inputs.cannot' | translate }} + {{ 'labels.inputs.begin with a special character or number' | translate }} + + } @@ -63,10 +75,12 @@ /> - - {{ 'labels.inputs.Joining Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (employeeForm.controls.joiningDate.hasError('required')) { + + {{ 'labels.inputs.Joining Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } diff --git a/src/app/organization/employees/create-employee/create-employee.component.ts b/src/app/organization/employees/create-employee/create-employee.component.ts index 646efe656..fa6884db6 100644 --- a/src/app/organization/employees/create-employee/create-employee.component.ts +++ b/src/app/organization/employees/create-employee/create-employee.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, TemplateRef, ElementRef, ViewChild, AfterViewInit } from '@angular/core'; +import { Component, OnInit, TemplateRef, ElementRef, ViewChild, AfterViewInit, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, Validators, ReactiveFormsModule } from '@angular/forms'; import { Router, ActivatedRoute, RouterLink } from '@angular/router'; @@ -29,6 +29,16 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class CreateEmployeeComponent implements OnInit, AfterViewInit { + private formBuilder = inject(UntypedFormBuilder); + private organizationService = inject(OrganizationService); + private settingsService = inject(SettingsService); + private route = inject(ActivatedRoute); + private router = inject(Router); + private dateUtils = inject(Dates); + private configurationWizardService = inject(ConfigurationWizardService); + private popoverService = inject(PopoverService); + dialog = inject(MatDialog); + /** Minimum joining date allowed. */ minDate = new Date(2000, 0, 1); /** Maximum joining date allowed. */ @@ -55,17 +65,7 @@ export class CreateEmployeeComponent implements OnInit, AfterViewInit { * @param {PopoverService} popoverService PopoverService. * @param {MatDialog} dialog MatDialog. */ - constructor( - private formBuilder: UntypedFormBuilder, - private organizationService: OrganizationService, - private settingsService: SettingsService, - private route: ActivatedRoute, - private router: Router, - private dateUtils: Dates, - private configurationWizardService: ConfigurationWizardService, - private popoverService: PopoverService, - public dialog: MatDialog - ) { + constructor() { this.route.data.subscribe((data: { offices: any }) => { this.officeData = data.offices; }); @@ -92,13 +92,15 @@ export class CreateEmployeeComponent implements OnInit, AfterViewInit { '', [ Validators.required, - Validators.pattern('(^[A-z]).*')] + Validators.pattern('(^[A-z]).*') + ] ], lastname: [ '', [ Validators.required, - Validators.pattern('(^[A-z]).*')] + Validators.pattern('(^[A-z]).*') + ] ], isLoanOfficer: [false], mobileNo: [''], diff --git a/src/app/organization/employees/edit-employee.resolver.ts b/src/app/organization/employees/edit-employee.resolver.ts index da2702b70..077a3261e 100644 --- a/src/app/organization/employees/edit-employee.resolver.ts +++ b/src/app/organization/employees/edit-employee.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { OrganizationService } from '../organization.service'; */ @Injectable() export class EditEmployeeResolver { - /** - * @param {OrganizationService} organizationService Organization service. - */ - constructor(private organizationService: OrganizationService) {} + private organizationService = inject(OrganizationService); /** * Returns the employees data. diff --git a/src/app/organization/employees/edit-employee/edit-employee.component.html b/src/app/organization/employees/edit-employee/edit-employee.component.html index 2ff77879a..61c4b345d 100644 --- a/src/app/organization/employees/edit-employee/edit-employee.component.html +++ b/src/app/organization/employees/edit-employee/edit-employee.component.html @@ -6,40 +6,52 @@ {{ 'labels.inputs.Office' | translate }} - - {{ office.name }} - + @for (office of officeData; track office) { + + {{ office.name }} + + } - - {{ 'labels.inputs.Office' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (editEmployeeForm.controls.officeId.hasError('required')) { + + {{ 'labels.inputs.Office' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.First Name' | translate }} - - {{ 'labels.inputs.First Name' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - {{ 'labels.inputs.First Name' | translate }} {{ 'labels.inputs.cannot' | translate }} - {{ 'labels.inputs.begin with a special character or number' | translate }} - + @if (editEmployeeForm.controls.firstname.hasError('required')) { + + {{ 'labels.inputs.First Name' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + @if (editEmployeeForm.controls.firstname.hasError('pattern')) { + + {{ 'labels.inputs.First Name' | translate }} {{ 'labels.inputs.cannot' | translate }} + {{ 'labels.inputs.begin with a special character or number' | translate }} + + } {{ 'labels.inputs.Last Name' | translate }} - - {{ 'labels.inputs.Last Name' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - {{ 'labels.inputs.Last Name' | translate }} {{ 'labels.inputs.cannot' | translate }} - {{ 'labels.inputs.begin with a special character or number' | translate }} - + @if (editEmployeeForm.controls.lastname.hasError('required')) { + + {{ 'labels.inputs.Last Name' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + @if (editEmployeeForm.controls.lastname.hasError('pattern')) { + + {{ 'labels.inputs.Last Name' | translate }} {{ 'labels.inputs.cannot' | translate }} + {{ 'labels.inputs.begin with a special character or number' | translate }} + + } @@ -67,10 +79,12 @@ /> - - {{ 'labels.inputs.Joining Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (editEmployeeForm.controls.joiningDate.hasError('required')) { + + {{ 'labels.inputs.Joining Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } diff --git a/src/app/organization/employees/edit-employee/edit-employee.component.ts b/src/app/organization/employees/edit-employee/edit-employee.component.ts index 57d831b45..5478b2516 100644 --- a/src/app/organization/employees/edit-employee/edit-employee.component.ts +++ b/src/app/organization/employees/edit-employee/edit-employee.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; import { UntypedFormGroup, UntypedFormBuilder, Validators, ReactiveFormsModule } from '@angular/forms'; @@ -23,6 +23,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class EditEmployeeComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private organizationService = inject(OrganizationService); + private settingsService = inject(SettingsService); + private route = inject(ActivatedRoute); + private router = inject(Router); + private dateUtils = inject(Dates); + /** Employee data. */ employeeData: any; /** Minimum joining date allowed. */ @@ -43,14 +50,7 @@ export class EditEmployeeComponent implements OnInit { * @param {Router} router Router for navigation. * @param {Dates} dateUtils Date Utils to format date. */ - constructor( - private formBuilder: UntypedFormBuilder, - private organizationService: OrganizationService, - private settingsService: SettingsService, - private route: ActivatedRoute, - private router: Router, - private dateUtils: Dates - ) { + constructor() { this.route.data.subscribe((data: { employee: any; offices: any }) => { this.employeeData = data.employee; this.officeData = data.employee.allowedOffices; @@ -78,13 +78,15 @@ export class EditEmployeeComponent implements OnInit { this.employeeData.firstname, [ Validators.required, - Validators.pattern('(^[A-z]).*')] + Validators.pattern('(^[A-z]).*') + ] ], lastname: [ this.employeeData.lastname, [ Validators.required, - Validators.pattern('(^[A-z]).*')] + Validators.pattern('(^[A-z]).*') + ] ], isLoanOfficer: [this.employeeData.isLoanOfficer], mobileNo: [this.employeeData.mobileNo], diff --git a/src/app/organization/employees/employee.resolver.ts b/src/app/organization/employees/employee.resolver.ts index a64b8f109..cb3abad24 100644 --- a/src/app/organization/employees/employee.resolver.ts +++ b/src/app/organization/employees/employee.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { OrganizationService } from 'app/organization/organization.service'; */ @Injectable() export class EmployeeResolver { - /** - * @param {OrganizationService} organizationService Organization service. - */ - constructor(private organizationService: OrganizationService) {} + private organizationService = inject(OrganizationService); /** * Returns the employee data. diff --git a/src/app/organization/employees/employees.component.html b/src/app/organization/employees/employees.component.html index 2e309e951..cb6bf5978 100644 --- a/src/app/organization/employees/employees.component.html +++ b/src/app/organization/employees/employees.component.html @@ -37,20 +37,22 @@ {{ 'labels.inputs.Loan Officer' | translate }}
    - - + @if (employee.isLoanOfficer) { + + } + @if (!employee.isLoanOfficer) { + + }
    diff --git a/src/app/organization/employees/employees.component.ts b/src/app/organization/employees/employees.component.ts index f8dbf0777..9b29cae16 100644 --- a/src/app/organization/employees/employees.component.ts +++ b/src/app/organization/employees/employees.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, TemplateRef, ElementRef, ViewChild, AfterViewInit } from '@angular/core'; +import { Component, OnInit, TemplateRef, ElementRef, ViewChild, AfterViewInit, inject } from '@angular/core'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort, MatSortHeader } from '@angular/material/sort'; import { @@ -54,6 +54,11 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class EmployeesComponent implements OnInit, AfterViewInit { + private route = inject(ActivatedRoute); + private router = inject(Router); + private configurationWizardService = inject(ConfigurationWizardService); + private popoverService = inject(PopoverService); + /** Employees data. */ employeesData: any; /** Columns to be displayed in employees table. */ @@ -87,12 +92,7 @@ export class EmployeesComponent implements OnInit, AfterViewInit { * @param {ConfigurationWizardService} configurationWizardService ConfigurationWizard Service. * @param {PopoverService} popoverService PopoverService. */ - constructor( - private route: ActivatedRoute, - private router: Router, - private configurationWizardService: ConfigurationWizardService, - private popoverService: PopoverService - ) { + constructor() { this.route.data.subscribe((data: { employees: any }) => { this.employeesData = data.employees; }); diff --git a/src/app/organization/employees/employees.resolver.ts b/src/app/organization/employees/employees.resolver.ts index 6b5f5b56f..6afdd4d69 100644 --- a/src/app/organization/employees/employees.resolver.ts +++ b/src/app/organization/employees/employees.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; /** rxjs Imports */ import { Observable } from 'rxjs'; @@ -12,10 +12,7 @@ import { OrganizationService } from '../organization.service'; */ @Injectable() export class EmployeesResolver { - /** - * @param {OrganizationService} organizationService Organization service. - */ - constructor(private organizationService: OrganizationService) {} + private organizationService = inject(OrganizationService); /** * Returns the employees data. diff --git a/src/app/organization/employees/view-employee/view-employee.component.html b/src/app/organization/employees/view-employee/view-employee.component.html index 848d81d97..32477e0b3 100644 --- a/src/app/organization/employees/view-employee/view-employee.component.html +++ b/src/app/organization/employees/view-employee/view-employee.component.html @@ -41,13 +41,17 @@ {{ employeeData.isLoanOfficer === true | yesNo }} -
    - {{ 'labels.inputs.Mobile Number for SMS' | translate }} -
    + @if (employeeData.mobileNo) { +
    + {{ 'labels.inputs.Mobile Number for SMS' | translate }} +
    + } -
    - {{ employeeData.mobileNo }} -
    + @if (employeeData.mobileNo) { +
    + {{ employeeData.mobileNo }} +
    + }
    {{ 'labels.inputs.Status' | translate }} diff --git a/src/app/organization/employees/view-employee/view-employee.component.ts b/src/app/organization/employees/view-employee/view-employee.component.ts index 4cf7de254..1f5ae5ad4 100644 --- a/src/app/organization/employees/view-employee/view-employee.component.ts +++ b/src/app/organization/employees/view-employee/view-employee.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component } from '@angular/core'; +import { Component, inject } from '@angular/core'; import { ActivatedRoute, RouterLink } from '@angular/router'; import { FaIconComponent } from '@fortawesome/angular-fontawesome'; import { DateFormatPipe } from '../../../pipes/date-format.pipe'; @@ -21,6 +21,8 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ViewEmployeeComponent { + private route = inject(ActivatedRoute); + /** Employee data. */ employeeData: any; @@ -28,7 +30,7 @@ export class ViewEmployeeComponent { * Retrieves the employee data from `resolve`. * @param {ActivatedRoute} route Activated Route. */ - constructor(private route: ActivatedRoute) { + constructor() { this.route.data.subscribe((data: { employee: any }) => { this.employeeData = data.employee; }); diff --git a/src/app/organization/entity-data-table-checks/create-entity-data-table-checks/create-entity-data-table-checks.component.html b/src/app/organization/entity-data-table-checks/create-entity-data-table-checks/create-entity-data-table-checks.component.html index 0f4c8a693..e18cd7b9c 100644 --- a/src/app/organization/entity-data-table-checks/create-entity-data-table-checks/create-entity-data-table-checks.component.html +++ b/src/app/organization/entity-data-table-checks/create-entity-data-table-checks/create-entity-data-table-checks.component.html @@ -6,70 +6,91 @@ {{ 'labels.inputs.Entity' | translate }} - - {{ entity.name }} - + @for (entity of entityTypes; track entity) { + + {{ entity.name }} + + } - - {{ 'labels.inputs.Entity' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (createEntityForm.controls.entity.hasError('required')) { + + {{ 'labels.inputs.Entity' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Status' | translate }} - - {{ status.name }} - + @for (status of statusList; track status) { + + {{ status.name }} + + } - - {{ 'labels.inputs.Status' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (createEntityForm.controls.status.hasError('required')) { + + {{ 'labels.inputs.Status' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Data Table' | translate }} - - {{ dataTable.dataTableName }} - + @for (dataTable of dataTableList; track dataTable) { + + {{ dataTable.dataTableName }} + + } - - {{ 'labels.inputs.Data Table' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (createEntityForm.controls.datatableName.hasError('required')) { + + {{ 'labels.inputs.Data Table' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } - - {{ 'labels.inputs.Products' | translate }} - - - {{ loanProducts.name }} - - - - {{ 'labels.inputs.Loan Product' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - + @if (entityType === 'm_loan') { + + {{ 'labels.inputs.Products' | translate }} + + @for (loanProducts of createEntityData.loanProductDatas; track loanProducts) { + + {{ loanProducts.name }} + + } + + @if (createEntityForm.controls.productId.hasError('required')) { + + {{ 'labels.inputs.Loan Product' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + } - - {{ 'labels.inputs.Products' | translate }} - - - {{ savingsProducts.name }} - - - - {{ 'labels.inputs.Loan Product' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - + @if (entityType === 'm_savings_account') { + + {{ 'labels.inputs.Products' | translate }} + + @for (savingsProducts of createEntityData.savingsProductDatas; track savingsProducts) { + + {{ savingsProducts.name }} + + } + + @if (createEntityForm.controls.productId.hasError('required')) { + + {{ 'labels.inputs.Loan Product' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + }
    diff --git a/src/app/organization/entity-data-table-checks/create-entity-data-table-checks/create-entity-data-table-checks.component.ts b/src/app/organization/entity-data-table-checks/create-entity-data-table-checks/create-entity-data-table-checks.component.ts index 1a7c23655..1b267064e 100644 --- a/src/app/organization/entity-data-table-checks/create-entity-data-table-checks/create-entity-data-table-checks.component.ts +++ b/src/app/organization/entity-data-table-checks/create-entity-data-table-checks/create-entity-data-table-checks.component.ts @@ -1,5 +1,5 @@ /** Angular Imports. */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormBuilder, UntypedFormGroup, @@ -25,6 +25,11 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class CreateEntityDataTableChecksComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private route = inject(ActivatedRoute); + private organizationService = inject(OrganizationService); + private router = inject(Router); + /** Create Entity Datatable Checks form. */ createEntityForm: UntypedFormGroup; /** Entity Datatable Checks data. */ @@ -45,12 +50,7 @@ export class CreateEntityDataTableChecksComponent implements OnInit { * @param {OrganizationService} organizationService Organization Service. * @param {Router} router Router. */ - constructor( - private formBuilder: UntypedFormBuilder, - private route: ActivatedRoute, - private organizationService: OrganizationService, - private router: Router - ) { + constructor() { this.route.data.subscribe((data: { dataTableEntity: any }) => { this.createEntityData = data.dataTableEntity; // hardcoded, because data.dataTableEntity.entities might change anytime its order diff --git a/src/app/organization/entity-data-table-checks/enitity-data-table-checks-template.resolver.ts b/src/app/organization/entity-data-table-checks/enitity-data-table-checks-template.resolver.ts index 476a046e9..7fd3d06f1 100644 --- a/src/app/organization/entity-data-table-checks/enitity-data-table-checks-template.resolver.ts +++ b/src/app/organization/entity-data-table-checks/enitity-data-table-checks-template.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; /** rxjs Imports */ import { Observable } from 'rxjs'; @@ -12,10 +12,7 @@ import { OrganizationService } from '../organization.service'; */ @Injectable() export class EntityDataTableChecksTemplateResolver { - /** - * @param {OrganizationService} organizationService Organization service. - */ - constructor(private organizationService: OrganizationService) {} + private organizationService = inject(OrganizationService); /** * Returns the Entity Data Table Checks data. diff --git a/src/app/organization/entity-data-table-checks/entity-data-table-checks.component.html b/src/app/organization/entity-data-table-checks/entity-data-table-checks.component.html index a54f2f49d..d4333b054 100644 --- a/src/app/organization/entity-data-table-checks/entity-data-table-checks.component.html +++ b/src/app/organization/entity-data-table-checks/entity-data-table-checks.component.html @@ -44,20 +44,22 @@ {{ 'labels.inputs.System Defined' | translate }}
    - - + @if (entityDataTableCheck.systemDefined) { + + } + @if (!entityDataTableCheck.systemDefined) { + + }
    diff --git a/src/app/organization/entity-data-table-checks/entity-data-table-checks.component.ts b/src/app/organization/entity-data-table-checks/entity-data-table-checks.component.ts index b725878d3..793c72019 100644 --- a/src/app/organization/entity-data-table-checks/entity-data-table-checks.component.ts +++ b/src/app/organization/entity-data-table-checks/entity-data-table-checks.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, ViewChild } from '@angular/core'; +import { Component, OnInit, ViewChild, inject } from '@angular/core'; import { MatDialog } from '@angular/material/dialog'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort, MatSortHeader } from '@angular/material/sort'; @@ -54,6 +54,10 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class EntityDataTableChecksComponent implements OnInit { + private organizationService = inject(OrganizationService); + private route = inject(ActivatedRoute); + private dialog = inject(MatDialog); + /** Entity Data Table Checks data. */ entityDataTableChecksData: any; /** Columns to be displayed in entity data table checks table. */ @@ -98,11 +102,7 @@ export class EntityDataTableChecksComponent implements OnInit { * @param {ActivatedRoute} route Activated Route. * @param {MatDialog} dialog Dialog reference. */ - constructor( - private organizationService: OrganizationService, - private route: ActivatedRoute, - private dialog: MatDialog - ) { + constructor() { this.route.data.subscribe((data: { entityDataTableChecks: any }) => { this.entityDataTableChecksData = data.entityDataTableChecks.pageItems; }); diff --git a/src/app/organization/entity-data-table-checks/entity-data-table-checks.resolver.ts b/src/app/organization/entity-data-table-checks/entity-data-table-checks.resolver.ts index 647162602..995d1173b 100644 --- a/src/app/organization/entity-data-table-checks/entity-data-table-checks.resolver.ts +++ b/src/app/organization/entity-data-table-checks/entity-data-table-checks.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; /** rxjs Imports */ import { Observable } from 'rxjs'; @@ -12,10 +12,7 @@ import { OrganizationService } from '../organization.service'; */ @Injectable() export class EntityDataTableChecksResolver { - /** - * @param {OrganizationService} organizationService Organization service. - */ - constructor(private organizationService: OrganizationService) {} + private organizationService = inject(OrganizationService); /** * Returns the Entity Data Table Checks data. diff --git a/src/app/organization/fund-mapping/advance-search-template.resolver.ts b/src/app/organization/fund-mapping/advance-search-template.resolver.ts index 381e0c90a..50ce79cce 100644 --- a/src/app/organization/fund-mapping/advance-search-template.resolver.ts +++ b/src/app/organization/fund-mapping/advance-search-template.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; /** rxjs Imports */ import { Observable } from 'rxjs'; @@ -12,10 +12,7 @@ import { OrganizationService } from '../organization.service'; */ @Injectable() export class AdvanceSearchTemplateResolver { - /** - * @param {OrganizationService} organizationService Organization service. - */ - constructor(private organizationService: OrganizationService) {} + private organizationService = inject(OrganizationService); /** * Returns the Advance Search template. diff --git a/src/app/organization/fund-mapping/fund-mapping.component.html b/src/app/organization/fund-mapping/fund-mapping.component.html index 043f9d2b1..1a9544e89 100644 --- a/src/app/organization/fund-mapping/fund-mapping.component.html +++ b/src/app/organization/fund-mapping/fund-mapping.component.html @@ -1,282 +1,306 @@ - -
    - -
    - - {{ 'labels.inputs.Loan Status' | translate }} - - {{ 'labels.inputs.All' | translate }} - {{ 'labels.inputs.Active' | translate }} - {{ 'labels.inputs.Overpaid' | translate }} - {{ 'labels.inputs.Closed (obligations met)' | translate }} - {{ 'labels.inputs.Closed (written-off)' | translate }} - - - - - - - {{ 'labels.inputs.Product' | translate }} - - - {{ product.name }} - - - - - - {{ 'labels.inputs.Office' | translate }} - - - {{ office.name }} - - - - - - {{ 'labels.inputs.Date Type' | translate }} - - {{ 'labels.inputs.Approval Date' | translate }} - {{ 'labels.inputs.Creation Date' | translate }} - {{ 'labels.inputs.Disbursement Date' | translate }} - - - {{ 'labels.inputs.Date Type' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - - - {{ 'labels.inputs.From Date' | translate }} - - - - - {{ 'labels.inputs.From Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - - - {{ 'labels.inputs.To Date' | translate }} - - - - - {{ 'labels.inputs.To Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - - - {{ 'labels.inputs.Loan Outstanding Percentage' | translate }} - - -
    - - {{ 'labels.inputs.Comparison Condition' | translate }} - - {{ 'labels.inputs.between' | translate }} - <= - >= - < - > - = +@if (!isCollapsed) { + + + +
    + + {{ 'labels.inputs.Loan Status' | translate }} + + {{ 'labels.inputs.All' | translate }} + {{ 'labels.inputs.Active' | translate }} + {{ 'labels.inputs.Overpaid' | translate }} + {{ 'labels.inputs.Closed (obligations met)' | translate }} + {{ 'labels.inputs.Closed (written-off)' | translate }} - - {{ 'labels.inputs.Comparison Condition' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - - {{ 'labels.inputs.Minimum Value' | translate }} - - - {{ 'labels.inputs.Minimum Value' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - - - {{ 'labels.inputs.Comparison Value' | translate }} - - - {{ 'labels.inputs.Comparison Value' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - - - {{ 'labels.inputs.Maximum Value' | translate }} - - - {{ 'labels.inputs.Maximum Value' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - -
    - - - {{ 'labels.inputs.Loan Outstanding Amount' | translate }} - - -
    - - {{ 'labels.inputs.Comparison Condition' | translate }} - - {{ 'labels.inputs.between' | translate }} - <= - >= - < - > - = + + + {{ 'labels.inputs.Product' | translate }} + + @for (product of advanceSearchTemplate.loanProducts; track product) { + + {{ product.name }} + + } - - {{ 'labels.inputs.Comparison Condition' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - - {{ 'labels.inputs.Minimum Value' | translate }} + + {{ 'labels.inputs.Office' | translate }} + + @for (office of advanceSearchTemplate.offices; track office) { + + {{ office.name }} + + } + + + + {{ 'labels.inputs.Date Type' | translate }} + + {{ 'labels.inputs.Approval Date' | translate }} + {{ 'labels.inputs.Creation Date' | translate }} + {{ 'labels.inputs.Disbursement Date' | translate }} + + @if (fundMappingForm.controls.loanDateOption.hasError('required')) { + + {{ 'labels.inputs.Date Type' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + + {{ 'labels.inputs.From Date' | translate }} - - {{ 'labels.inputs.Minimum Value' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + + + @if (fundMappingForm.controls.loanFromDate.hasError('required')) { + + {{ 'labels.inputs.From Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } - - - {{ 'labels.inputs.Comparison Value' | translate }} + + {{ 'labels.inputs.To Date' | translate }} - - {{ 'labels.inputs.Comparison Value' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + + + @if (fundMappingForm.controls.loanToDate.hasError('required')) { + + {{ 'labels.inputs.To Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + {{ 'labels.inputs.Loan Outstanding Percentage' | translate }} + + @if (fundMappingForm.value.includeOutStandingAmountPercentage) { +
    + @if (fundMappingForm.contains('outStandingAmountPercentageCondition')) { + + {{ 'labels.inputs.Comparison Condition' | translate }} + + {{ 'labels.inputs.between' | translate }} + <= + >= + < + > + = + + @if (fundMappingForm.controls.outStandingAmountPercentageCondition.hasError('required')) { + + {{ 'labels.inputs.Comparison Condition' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + } - - {{ 'labels.inputs.Maximum Value' | translate }} - - - {{ 'labels.inputs.Maximum Value' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - + @if (fundMappingForm.contains('minOutStandingAmountPercentage')) { + + {{ 'labels.inputs.Minimum Value' | translate }} + + @if (fundMappingForm.controls.minOutStandingAmountPercentage.hasError('required')) { + + {{ 'labels.inputs.Minimum Value' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + } + @if (fundMappingForm.contains('outStandingAmountPercentage')) { + + {{ 'labels.inputs.Comparison Value' | translate }} + + @if (fundMappingForm.controls.outStandingAmountPercentage.hasError('required')) { + + {{ 'labels.inputs.Comparison Value' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + } + @if (fundMappingForm.contains('maxOutStandingAmountPercentage')) { + + {{ 'labels.inputs.Maximum Value' | translate }} + + @if (fundMappingForm.controls.maxOutStandingAmountPercentage.hasError('required')) { + + {{ 'labels.inputs.Maximum Value' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + } +
    + } + + {{ 'labels.inputs.Loan Outstanding Amount' | translate }} + + @if (fundMappingForm.value.includeOutstandingAmount) { +
    + @if (fundMappingForm.contains('outstandingAmountCondition')) { + + {{ 'labels.inputs.Comparison Condition' | translate }} + + {{ 'labels.inputs.between' | translate }} + <= + >= + < + > + = + + @if (fundMappingForm.controls.outstandingAmountCondition.hasError('required')) { + + {{ 'labels.inputs.Comparison Condition' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + } + + @if (fundMappingForm.contains('minOutstandingAmount')) { + + {{ 'labels.inputs.Minimum Value' | translate }} + + @if (fundMappingForm.controls.minOutstandingAmount.hasError('required')) { + + {{ 'labels.inputs.Minimum Value' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + } + @if (fundMappingForm.contains('outstandingAmount')) { + + {{ 'labels.inputs.Comparison Value' | translate }} + + @if (fundMappingForm.controls.outstandingAmount.hasError('required')) { + + {{ 'labels.inputs.Comparison Value' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + } + @if (fundMappingForm.contains('maxOutstandingAmount')) { + + {{ 'labels.inputs.Maximum Value' | translate }} + + @if (fundMappingForm.controls.maxOutstandingAmount.hasError('required')) { + + {{ 'labels.inputs.Maximum Value' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + } +
    + }
    -
    - - - - - - - - - -
    - -
    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    {{ 'labels.inputs.Office Name' | translate }}{{ loan.officeName }}{{ 'labels.inputs.Product Name' | translate }}{{ loan.loanProductName }}{{ 'labels.inputs.Count' | translate }}{{ loan.count }}{{ 'labels.inputs.Outstanding' | translate }}{{ loan.loanOutStanding }}{{ 'labels.inputs.Percentage' | translate }}{{ loan.percentage }}
    - - + + + + + +
    -
    +} + +@if (isCollapsed) { +
    + +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + +
    {{ 'labels.inputs.Office Name' | translate }}{{ loan.officeName }}{{ 'labels.inputs.Product Name' | translate }}{{ loan.loanProductName }}{{ 'labels.inputs.Count' | translate }}{{ loan.count }}{{ 'labels.inputs.Outstanding' | translate }}{{ loan.loanOutStanding }}{{ 'labels.inputs.Percentage' | translate }}{{ loan.percentage }}
    + +
    +
    +} diff --git a/src/app/organization/fund-mapping/fund-mapping.component.ts b/src/app/organization/fund-mapping/fund-mapping.component.ts index 3db794242..fd35537c9 100644 --- a/src/app/organization/fund-mapping/fund-mapping.component.ts +++ b/src/app/organization/fund-mapping/fund-mapping.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, ViewChild } from '@angular/core'; +import { Component, OnInit, ViewChild, inject } from '@angular/core'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort, MatSortHeader } from '@angular/material/sort'; import { @@ -61,6 +61,12 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class FundMappingComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private organizationService = inject(OrganizationService); + private settingsService = inject(SettingsService); + private route = inject(ActivatedRoute); + private dateUtils = inject(Dates); + /** Minimum Date allowed. */ minDate = new Date(2000, 0, 1); /** Maximum Date allowed. */ @@ -96,13 +102,7 @@ export class FundMappingComponent implements OnInit { * @param {Router} router Router for navigation. * @param {Dates} dateUtils Date Utils to format date. */ - constructor( - private formBuilder: UntypedFormBuilder, - private organizationService: OrganizationService, - private settingsService: SettingsService, - private route: ActivatedRoute, - private dateUtils: Dates - ) { + constructor() { this.route.data.subscribe((data: { advanceSearchTemplate: any }) => { this.advanceSearchTemplate = data.advanceSearchTemplate; }); @@ -137,13 +137,16 @@ export class FundMappingComponent implements OnInit { this.fundMappingForm = this.formBuilder.group({ loanStatus: [ [], - this.nonEmptyArrayValidator.bind(this)], + this.nonEmptyArrayValidator.bind(this) + ], loanProducts: [ [], - this.nonEmptyArrayValidator.bind(this)], + this.nonEmptyArrayValidator.bind(this) + ], offices: [ [], - this.nonEmptyArrayValidator.bind(this)], + this.nonEmptyArrayValidator.bind(this) + ], loanDateOption: [ '', Validators.required diff --git a/src/app/organization/holidays/create-holiday/create-holiday.component.html b/src/app/organization/holidays/create-holiday/create-holiday.component.html index 59357aff0..5ac34dca8 100644 --- a/src/app/organization/holidays/create-holiday/create-holiday.component.html +++ b/src/app/organization/holidays/create-holiday/create-holiday.component.html @@ -6,10 +6,12 @@ {{ 'labels.inputs.name' | translate }} - - {{ 'labels.inputs.name' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (holidayForm.controls.name.hasError('required')) { + + {{ 'labels.inputs.name' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } @@ -24,10 +26,12 @@ /> - - {{ 'labels.inputs.From Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (holidayForm.controls.fromDate.hasError('required')) { + + {{ 'labels.inputs.From Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } @@ -42,42 +46,52 @@ /> - - {{ 'labels.inputs.To Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (holidayForm.controls.toDate.hasError('required')) { + + {{ 'labels.inputs.To Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Repayment Scheduling Type' | translate }} - - {{ repayments.value }} - + @for (repayments of repaymentSchedulingTypes; track repayments) { + + {{ repayments.value }} + + } - - {{ 'labels.inputs.Repayment Scheduling Type' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (holidayForm.controls.reschedulingType.hasError('required')) { + + {{ 'labels.inputs.Repayment Scheduling Type' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } - - {{ 'labels.inputs.Repayment scheduled to' | translate }} - - - - - {{ 'labels.inputs.Repayment scheduled to' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - + @if (holidayForm.contains('repaymentsRescheduledTo')) { + + {{ 'labels.inputs.Repayment scheduled to' | translate }} + + + + @if (holidayForm.controls.repaymentsRescheduledTo.hasError('required')) { + + {{ 'labels.inputs.Repayment scheduled to' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + } {{ 'labels.inputs.Description' | translate }} diff --git a/src/app/organization/holidays/create-holiday/create-holiday.component.ts b/src/app/organization/holidays/create-holiday/create-holiday.component.ts index 692674059..1b01460bc 100644 --- a/src/app/organization/holidays/create-holiday/create-holiday.component.ts +++ b/src/app/organization/holidays/create-holiday/create-holiday.component.ts @@ -1,6 +1,6 @@ /** Angular Imports. */ import { SelectionModel } from '@angular/cdk/collections'; -import { Component, OnInit, ViewChild, Injectable } from '@angular/core'; +import { Component, OnInit, ViewChild, Injectable, inject } from '@angular/core'; import { UntypedFormBuilder, UntypedFormGroup, @@ -53,6 +53,15 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class CreateHolidayComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private route = inject(ActivatedRoute); + private dateUtils = inject(Dates); + private organizationService = inject(OrganizationService); + private settings = inject(SettingsService); + private router = inject(Router); + private _database = inject(ChecklistDatabase); + private createHoliday = inject(CreateHoliday); + /** Create Holiday form. */ holidayForm: UntypedFormGroup; /** Repayment Scheduling data. */ @@ -101,16 +110,9 @@ export class CreateHolidayComponent implements OnInit { * @param {OrganizationService} organizationService Organization Service. * @param {Router} router Router. */ - constructor( - private formBuilder: UntypedFormBuilder, - private route: ActivatedRoute, - private dateUtils: Dates, - private organizationService: OrganizationService, - private settings: SettingsService, - private router: Router, - private _database: ChecklistDatabase, - private createHoliday: CreateHoliday - ) { + constructor() { + const _database = this._database; + this.route.data.subscribe((data: { offices: any; holidayTemplate: any }) => { this.officesData = data.offices; this.repaymentSchedulingTypes = data.holidayTemplate; diff --git a/src/app/organization/holidays/edit-holiday/edit-holiday.component.html b/src/app/organization/holidays/edit-holiday/edit-holiday.component.html index 4598fd662..3083abd2a 100644 --- a/src/app/organization/holidays/edit-holiday/edit-holiday.component.html +++ b/src/app/organization/holidays/edit-holiday/edit-holiday.component.html @@ -6,78 +6,98 @@ {{ 'labels.inputs.name' | translate }} - - {{ 'labels.inputs.name' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (holidayForm.controls.name.hasError('required')) { + + {{ 'labels.inputs.name' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } - - {{ 'labels.inputs.From Date' | translate }} - - - - - {{ 'labels.inputs.From Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - + @if (!isActiveHoliday) { + + {{ 'labels.inputs.From Date' | translate }} + + + + @if (holidayForm.controls.fromDate.hasError('required')) { + + {{ 'labels.inputs.From Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + } - - {{ 'labels.inputs.To Date' | translate }} - - - - - {{ 'labels.inputs.To Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - + @if (!isActiveHoliday) { + + {{ 'labels.inputs.To Date' | translate }} + + + + @if (holidayForm.controls.toDate.hasError('required')) { + + {{ 'labels.inputs.To Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + } - - {{ 'labels.inputs.Repayment Scheduling Type' | translate }} - - - {{ repayments.value }} - - - - {{ 'labels.inputs.Repayment Scheduling Type' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - + @if (!isActiveHoliday) { + + {{ 'labels.inputs.Repayment Scheduling Type' | translate }} + + @for (repayments of holidayData.repaymentSchedulingTypes; track repayments) { + + {{ repayments.value }} + + } + + @if (holidayForm.controls.reschedulingType.hasError('required')) { + + {{ 'labels.inputs.Repayment Scheduling Type' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + } - - {{ 'labels.inputs.Repayment scheduled to' | translate }} - - - - - {{ 'labels.inputs.Repayment scheduled to' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - + @if (!isActiveHoliday && reSchedulingType === 2) { + + {{ 'labels.inputs.Repayment scheduled to' | translate }} + + + + @if (holidayForm.controls.repaymentsRescheduledTo.hasError('required')) { + + {{ 'labels.inputs.Repayment scheduled to' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + } {{ 'labels.inputs.Description' | translate }} diff --git a/src/app/organization/holidays/edit-holiday/edit-holiday.component.ts b/src/app/organization/holidays/edit-holiday/edit-holiday.component.ts index 9bb4f1cc7..49b15d556 100644 --- a/src/app/organization/holidays/edit-holiday/edit-holiday.component.ts +++ b/src/app/organization/holidays/edit-holiday/edit-holiday.component.ts @@ -1,5 +1,5 @@ /** Angular Imports. */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormBuilder, UntypedFormGroup, @@ -27,6 +27,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class EditHolidayComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private route = inject(ActivatedRoute); + private dateUtils = inject(Dates); + private organizatioService = inject(OrganizationService); + private settingsService = inject(SettingsService); + private router = inject(Router); + /** Edit Holiday form. */ holidayForm: UntypedFormGroup; /** Holiday data. */ @@ -48,14 +55,7 @@ export class EditHolidayComponent implements OnInit { * @param {OrganizationService} organizatioService Organization Service. * @param {Router} router Router. */ - constructor( - private formBuilder: UntypedFormBuilder, - private route: ActivatedRoute, - private dateUtils: Dates, - private organizatioService: OrganizationService, - private settingsService: SettingsService, - private router: Router - ) { + constructor() { this.route.data.subscribe((data: { holiday: any; holidayTemplate: any }) => { this.holidayData = data.holiday; this.holidayData.repaymentSchedulingTypes = data.holidayTemplate; diff --git a/src/app/organization/holidays/holiday-template.resolver.ts b/src/app/organization/holidays/holiday-template.resolver.ts index 4ba7497dc..1368f0720 100644 --- a/src/app/organization/holidays/holiday-template.resolver.ts +++ b/src/app/organization/holidays/holiday-template.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { OrganizationService } from 'app/organization/organization.service'; */ @Injectable() export class HolidayTemplateResolver { - /** - * @param {OrganizationService} organizationService Organization service. - */ - constructor(private organizationService: OrganizationService) {} + private organizationService = inject(OrganizationService); /** * Returns the holiday data. diff --git a/src/app/organization/holidays/holiday.resolver.ts b/src/app/organization/holidays/holiday.resolver.ts index 8f4e4cbef..21571eeec 100644 --- a/src/app/organization/holidays/holiday.resolver.ts +++ b/src/app/organization/holidays/holiday.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { OrganizationService } from 'app/organization/organization.service'; */ @Injectable() export class HolidayResolver { - /** - * @param {OrganizationService} organizationService Organization service. - */ - constructor(private organizationService: OrganizationService) {} + private organizationService = inject(OrganizationService); /** * Returns the holiday data. diff --git a/src/app/organization/holidays/holidays.component.html b/src/app/organization/holidays/holidays.component.html index f471e831b..c80d06e96 100644 --- a/src/app/organization/holidays/holidays.component.html +++ b/src/app/organization/holidays/holidays.component.html @@ -16,9 +16,11 @@ {{ 'labels.inputs.Select Office' | translate }} - - {{ office.name }} - + @for (office of officeData; track office) { + + {{ office.name }} + + }
    diff --git a/src/app/organization/holidays/holidays.component.ts b/src/app/organization/holidays/holidays.component.ts index fc3273985..ca2980c88 100644 --- a/src/app/organization/holidays/holidays.component.ts +++ b/src/app/organization/holidays/holidays.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, TemplateRef, ElementRef, ViewChild, AfterViewInit } from '@angular/core'; +import { Component, OnInit, TemplateRef, ElementRef, ViewChild, AfterViewInit, inject } from '@angular/core'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort, MatSortHeader } from '@angular/material/sort'; import { @@ -56,6 +56,12 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class HolidaysComponent implements OnInit, AfterViewInit { + private organizationService = inject(OrganizationService); + private route = inject(ActivatedRoute); + private router = inject(Router); + private configurationWizardService = inject(ConfigurationWizardService); + private popoverService = inject(PopoverService); + /** Office selector. */ officeSelector = new UntypedFormControl(); /** Holidays data. */ @@ -96,13 +102,7 @@ export class HolidaysComponent implements OnInit, AfterViewInit { * @param {ConfigurationWizardService} configurationWizardService ConfigurationWizard Service. * @param {PopoverService} popoverService PopoverService. */ - constructor( - private organizationService: OrganizationService, - private route: ActivatedRoute, - private router: Router, - private configurationWizardService: ConfigurationWizardService, - private popoverService: PopoverService - ) { + constructor() { this.route.data.subscribe((data: { offices: any }) => { this.officeData = data.offices; }); diff --git a/src/app/organization/holidays/view-holidays/view-holidays.component.html b/src/app/organization/holidays/view-holidays/view-holidays.component.html index 8459cb973..1a1c6aa31 100644 --- a/src/app/organization/holidays/view-holidays/view-holidays.component.html +++ b/src/app/organization/holidays/view-holidays/view-holidays.component.html @@ -1,9 +1,11 @@
    - + @if (holidayData.status.value !== 'Active') { + + }
    -
    - {{ holidayData.repaymentsRescheduledTo | dateFormat }} -
    + @if (holidayData.repaymentsRescheduledTo !== undefined && holidayData.repaymentsRescheduledTo !== null) { +
    + {{ holidayData.repaymentsRescheduledTo | dateFormat }} +
    + } -
    - {{ 'labels.inputs.Next Repayment Date' | translate }} -
    + @if (holidayData.repaymentsRescheduledTo === undefined || holidayData.repaymentsRescheduledTo === null) { +
    + {{ 'labels.inputs.Next Repayment Date' | translate }} +
    + }
    diff --git a/src/app/organization/holidays/view-holidays/view-holidays.component.ts b/src/app/organization/holidays/view-holidays/view-holidays.component.ts index 0d3b8205e..2780247b0 100644 --- a/src/app/organization/holidays/view-holidays/view-holidays.component.ts +++ b/src/app/organization/holidays/view-holidays/view-holidays.component.ts @@ -1,5 +1,5 @@ /** Angular Imports. */ -import { Component } from '@angular/core'; +import { Component, inject } from '@angular/core'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; import { MatDialog } from '@angular/material/dialog'; @@ -28,6 +28,12 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ViewHolidaysComponent { + private route = inject(ActivatedRoute); + private router = inject(Router); + private dialog = inject(MatDialog); + private translateService = inject(TranslateService); + private organizationService = inject(OrganizationService); + /** Holiday data. */ holidayData: any; @@ -35,13 +41,7 @@ export class ViewHolidaysComponent { * Retrieves hioliday data from `resolve`. * @param {ActivatedRoute} route Activated Route. */ - constructor( - private route: ActivatedRoute, - private router: Router, - private dialog: MatDialog, - private translateService: TranslateService, - private organizationService: OrganizationService - ) { + constructor() { this.route.data.subscribe((data: { holidays: any }) => { this.holidayData = data.holidays; }); diff --git a/src/app/organization/investors/investors.component.html b/src/app/organization/investors/investors.component.html index 91165da6f..d09b15b93 100644 --- a/src/app/organization/investors/investors.component.html +++ b/src/app/organization/investors/investors.component.html @@ -66,164 +66,176 @@
    -
    -
    -
    - - - - - - - - - - - - - - -
    -
    - - {{ record.status }} -
    -
    {{ 'labels.inputs.Owner External Id' | translate }} - - {{ 'labels.inputs.Transfer External Id' | translate }} - - {{ 'labels.inputs.Effective From' | translate }}{{ record.effectiveFrom | dateFormat }}
    -
    -
    + @if (isLoading) { +
    +
    +
    + } + @if (existsDataToFilter) { + + @for (record of searchResults; track record; let i = $index) { + + + + + + + + + + + + + +
    +
    + + {{ record.status }} +
    +
    {{ 'labels.inputs.Owner External Id' | translate }} + + {{ 'labels.inputs.Transfer External Id' | translate }} + + {{ 'labels.inputs.Effective From' | translate }}{{ record.effectiveFrom | dateFormat }}
    +
    +
    +
    + + + + + + + + + + + + + + + @if (record.details) { + + + + + } + +
    + {{ 'labels.inputs.Status' | translate }} : + +
    + + {{ record.status }} +
    +
    + {{ 'labels.inputs.Owner External Id' | translate }} : + + +
    + {{ 'labels.inputs.Settlement Date' | translate }} : + + {{ record.settlementDate | dateFormat }} + + {{ 'labels.inputs.Effective Date' | translate }} : + + {{ record.effectiveFrom | dateFormat }} +
    + {{ 'labels.inputs.Details' | translate }} : + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + {{ 'labels.inputs.Principal Outstanding' | translate }} : + + {{ record.details.totalPrincipalOutstanding | formatNumber }} +
    + {{ 'labels.inputs.Interest Outstanding' | translate }} : + + {{ record.details.totalInterestOutstanding | formatNumber }} +
    + {{ 'labels.inputs.Fees Outstanding' | translate }} : + + {{ record.details.totalFeeChargesOutstanding | formatNumber }} +
    + {{ 'labels.inputs.Penalties Outstanding' | translate }} : + + {{ record.details.totalPenaltyChargesOutstanding | formatNumber }} +
    + {{ 'labels.inputs.Outstanding' | translate }} : + {{ record.details.totalOutstanding | formatNumber }}
    + {{ 'labels.inputs.Overpaid' | translate }} : + {{ record.details.totalOverpaid | formatNumber }}
    +
    +
    + + @if (canBeCancelled(record)) { +
    + +
    + } +
    + } +
    + } -
    - - - - - - - - - - - - - - - - - - - -
    - {{ 'labels.inputs.Status' | translate }} : - -
    - - {{ record.status }} -
    -
    - {{ 'labels.inputs.Owner External Id' | translate }} : - - -
    - {{ 'labels.inputs.Settlement Date' | translate }} : - - {{ record.settlementDate | dateFormat }} - - {{ 'labels.inputs.Effective Date' | translate }} : - - {{ record.effectiveFrom | dateFormat }} -
    - {{ 'labels.inputs.Details' | translate }} : - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - {{ 'labels.inputs.Principal Outstanding' | translate }} : - - {{ record.details.totalPrincipalOutstanding | formatNumber }} -
    - {{ 'labels.inputs.Interest Outstanding' | translate }} : - - {{ record.details.totalInterestOutstanding | formatNumber }} -
    - {{ 'labels.inputs.Fees Outstanding' | translate }} : - - {{ record.details.totalFeeChargesOutstanding | formatNumber }} -
    - {{ 'labels.inputs.Penalties Outstanding' | translate }} : - - {{ record.details.totalPenaltyChargesOutstanding | formatNumber }} -
    - {{ 'labels.inputs.Outstanding' | translate }} : - {{ record.details.totalOutstanding | formatNumber }}
    - {{ 'labels.inputs.Overpaid' | translate }} : - {{ record.details.totalOverpaid | formatNumber }}
    -
    -
    - - - -
    - -
    -
    -
    - - + @if (existsDataToFilter) { + + }
    -
    -
    - - {{ 'labels.text.No data found' | translate }} + @if (!existsDataToFilter) { +
    +
    + + {{ 'labels.text.No data found' | translate }} +
    -
    + } diff --git a/src/app/organization/investors/investors.component.ts b/src/app/organization/investors/investors.component.ts index 9126da559..c6b6e139a 100644 --- a/src/app/organization/investors/investors.component.ts +++ b/src/app/organization/investors/investors.component.ts @@ -1,5 +1,5 @@ import { animate, state, style, transition, trigger } from '@angular/animations'; -import { Component, OnInit, ViewChild } from '@angular/core'; +import { Component, OnInit, ViewChild, inject } from '@angular/core'; import { UntypedFormControl, ReactiveFormsModule } from '@angular/forms'; import { MatDialog } from '@angular/material/dialog'; import { MatPaginator, PageEvent } from '@angular/material/paginator'; @@ -12,7 +12,7 @@ import { ExternalAssetOwnerService } from 'app/loans/services/external-asset-own import { SettingsService } from 'app/settings/settings.service'; import { CancelDialogComponent } from 'app/shared/cancel-dialog/cancel-dialog.component'; import { FaIconComponent } from '@fortawesome/angular-fontawesome'; -import { NgIf, NgFor, NgClass } from '@angular/common'; +import { NgClass } from '@angular/common'; import { MatAccordion, MatExpansionPanel, @@ -34,8 +34,8 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; trigger('detailExpand', [ state('collapsed', style({ height: '0px', minHeight: '0' })), state('expanded', style({ height: '*' })), - transition('expanded <=> collapsed', animate('225ms cubic-bezier(0.4, 0.0, 0.2, 1)'))]) - + transition('expanded <=> collapsed', animate('225ms cubic-bezier(0.4, 0.0, 0.2, 1)')) + ]) ], imports: [ ...STANDALONE_SHARED_IMPORTS, @@ -54,6 +54,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class InvestorsComponent implements OnInit { + private settingsService = inject(SettingsService); + private router = inject(Router); + private dialog = inject(MatDialog); + private externalAssetOwner = inject(ExternalAssetOwner); + private externalAssetOwnerService = inject(ExternalAssetOwnerService); + private dateUtils = inject(Dates); + /** Minimum transaction date allowed. */ minDate = new Date(2000, 0, 1); /** Maximum transaction date allowed. */ @@ -113,14 +120,6 @@ export class InvestorsComponent implements OnInit { 'totalAmount', 'actions' ]; - constructor( - private settingsService: SettingsService, - private router: Router, - private dialog: MatDialog, - private externalAssetOwner: ExternalAssetOwner, - private externalAssetOwnerService: ExternalAssetOwnerService, - private dateUtils: Dates - ) {} ngOnInit(): void { this.maxDate = this.settingsService.maxAllowedDate; diff --git a/src/app/organization/loan-provisioning-criteria/common-resolvers/loan-provisioning-criteria-and-template.resolver.ts b/src/app/organization/loan-provisioning-criteria/common-resolvers/loan-provisioning-criteria-and-template.resolver.ts index b47d53355..2fb824d29 100644 --- a/src/app/organization/loan-provisioning-criteria/common-resolvers/loan-provisioning-criteria-and-template.resolver.ts +++ b/src/app/organization/loan-provisioning-criteria/common-resolvers/loan-provisioning-criteria-and-template.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { OrganizationService } from '../../organization.service'; */ @Injectable() export class LoanProvisioningCriteriaAndTemplateResolver { - /** - * @param {OrganizationService} organizationService Products service. - */ - constructor(private organizationService: OrganizationService) {} + private organizationService = inject(OrganizationService); /** * Returns the Pprovisioning criteria and template data. diff --git a/src/app/organization/loan-provisioning-criteria/common-resolvers/loan-provisioning-criteria-template.resolver.ts b/src/app/organization/loan-provisioning-criteria/common-resolvers/loan-provisioning-criteria-template.resolver.ts index 39b230731..1802fd5c2 100644 --- a/src/app/organization/loan-provisioning-criteria/common-resolvers/loan-provisioning-criteria-template.resolver.ts +++ b/src/app/organization/loan-provisioning-criteria/common-resolvers/loan-provisioning-criteria-template.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; /** rxjs Imports */ import { Observable } from 'rxjs'; @@ -12,10 +12,7 @@ import { OrganizationService } from '../../organization.service'; */ @Injectable() export class LoanProvisioningCriteriaTemplateResolver { - /** - * @param {OrganizationService} organizationService Products service. - */ - constructor(private organizationService: OrganizationService) {} + private organizationService = inject(OrganizationService); /** * Returns the Pprovisioning criteria template diff --git a/src/app/organization/loan-provisioning-criteria/common-resolvers/loan-provisioning-criteria.resolver.ts b/src/app/organization/loan-provisioning-criteria/common-resolvers/loan-provisioning-criteria.resolver.ts index ac97acabc..b9a0c68ae 100644 --- a/src/app/organization/loan-provisioning-criteria/common-resolvers/loan-provisioning-criteria.resolver.ts +++ b/src/app/organization/loan-provisioning-criteria/common-resolvers/loan-provisioning-criteria.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { OrganizationService } from '../../organization.service'; */ @Injectable() export class LoanProvisioningCriteriaResolver { - /** - * @param {OrganizationService} organizationService Organization service. - */ - constructor(private organizationService: OrganizationService) {} + private organizationService = inject(OrganizationService); /** * Returns the loan provisioning criteria data. diff --git a/src/app/organization/loan-provisioning-criteria/common-resolvers/loan-provisioning-criterias.resolver.ts b/src/app/organization/loan-provisioning-criteria/common-resolvers/loan-provisioning-criterias.resolver.ts index 32b759301..ed9811617 100644 --- a/src/app/organization/loan-provisioning-criteria/common-resolvers/loan-provisioning-criterias.resolver.ts +++ b/src/app/organization/loan-provisioning-criteria/common-resolvers/loan-provisioning-criterias.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; /** rxjs Imports */ import { Observable } from 'rxjs'; @@ -12,10 +12,7 @@ import { OrganizationService } from '../../organization.service'; */ @Injectable() export class LoanProvisioningCriteriasResolver { - /** - * @param {OrganizationService} organizationService Products service. - */ - constructor(private organizationService: OrganizationService) {} + private organizationService = inject(OrganizationService); /** * Returns the products data. diff --git a/src/app/organization/loan-provisioning-criteria/create-loan-provisioning-criteria/create-loan-provisioning-criteria.component.html b/src/app/organization/loan-provisioning-criteria/create-loan-provisioning-criteria/create-loan-provisioning-criteria.component.html index 7e2f464f1..9a5bfecd1 100644 --- a/src/app/organization/loan-provisioning-criteria/create-loan-provisioning-criteria/create-loan-provisioning-criteria.component.html +++ b/src/app/organization/loan-provisioning-criteria/create-loan-provisioning-criteria/create-loan-provisioning-criteria.component.html @@ -6,32 +6,38 @@ {{ 'labels.inputs.Provisioning Criteria' | translate }} - - {{ 'labels.inputs.Provisioning Criteria' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (provisioningCriteriaForm.controls.criteriaName.hasError('required')) { + + {{ 'labels.inputs.Provisioning Criteria' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Selected Products' | translate }} - - {{ product.name }} - + @for (product of loanProvisioningCriteriaTemplate.loanProducts; track product) { + + {{ product.name }} + + } - - {{ 'labels.inputs.Selected Products' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (provisioningCriteriaForm.controls.loanProducts.hasError('required')) { + + {{ 'labels.inputs.Selected Products' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + }
    - - {{ 'labels.text.Provisioning criteria definitions' | translate }} + @if (!provisioningCriteriaFormValid) { + {{ 'labels.text.Provisioning criteria definitions' | translate }} + } diff --git a/src/app/organization/loan-provisioning-criteria/create-loan-provisioning-criteria/create-loan-provisioning-criteria.component.ts b/src/app/organization/loan-provisioning-criteria/create-loan-provisioning-criteria/create-loan-provisioning-criteria.component.ts index 3936879d8..3e62ab14b 100644 --- a/src/app/organization/loan-provisioning-criteria/create-loan-provisioning-criteria/create-loan-provisioning-criteria.component.ts +++ b/src/app/organization/loan-provisioning-criteria/create-loan-provisioning-criteria/create-loan-provisioning-criteria.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, Validators, ReactiveFormsModule } from '@angular/forms'; import { MatDialog } from '@angular/material/dialog'; import { @@ -58,6 +58,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class CreateLoanProvisioningCriteriaComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private organizationService = inject(OrganizationService); + private settingsService = inject(SettingsService); + private router = inject(Router); + dialog = inject(MatDialog); + private route = inject(ActivatedRoute); + /** Loan Provisioning Criteria form. */ provisioningCriteriaForm: UntypedFormGroup; /** Loan Provisioning Criteria Template */ @@ -98,14 +105,7 @@ export class CreateLoanProvisioningCriteriaComponent implements OnInit { * @param {ActivatedRoute} route Activated Route. * @param {Router} router Router for navigation. */ - constructor( - private formBuilder: UntypedFormBuilder, - private organizationService: OrganizationService, - private settingsService: SettingsService, - private router: Router, - public dialog: MatDialog, - private route: ActivatedRoute - ) { + constructor() { this.route.data.subscribe((data: { loanProvisioningCriteriaTemplate: any }) => { this.loanProvisioningCriteriaTemplate = data.loanProvisioningCriteriaTemplate; this.definitions = this.loanProvisioningCriteriaTemplate.definitions; diff --git a/src/app/organization/loan-provisioning-criteria/edit-loan-provisioning-criteria/edit-loan-provisioning-criteria.component.html b/src/app/organization/loan-provisioning-criteria/edit-loan-provisioning-criteria/edit-loan-provisioning-criteria.component.html index c429259a4..3b27ca4a7 100644 --- a/src/app/organization/loan-provisioning-criteria/edit-loan-provisioning-criteria/edit-loan-provisioning-criteria.component.html +++ b/src/app/organization/loan-provisioning-criteria/edit-loan-provisioning-criteria/edit-loan-provisioning-criteria.component.html @@ -6,18 +6,22 @@ {{ 'labels.inputs.Provisioning Criteria' | translate }} - - {{ 'labels.inputs.Provisioning Criteria' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (provisioningCriteriaForm.controls.criteriaName.hasError('required')) { + + {{ 'labels.inputs.Provisioning Criteria' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Selected Products' | translate }} - - {{ product.name }} - + @for (product of loanProducts; track product) { + + {{ product.name }} + + } @@ -25,9 +29,9 @@
    - {{ - 'labels.text.Provisioning criteria definitions' | translate - }} + @if (!provisioningCriteriaFormValid) { + {{ 'labels.text.Provisioning criteria definitions' | translate }} + }
    diff --git a/src/app/organization/loan-provisioning-criteria/edit-loan-provisioning-criteria/edit-loan-provisioning-criteria.component.ts b/src/app/organization/loan-provisioning-criteria/edit-loan-provisioning-criteria/edit-loan-provisioning-criteria.component.ts index 9dffeac86..fb29182e1 100644 --- a/src/app/organization/loan-provisioning-criteria/edit-loan-provisioning-criteria/edit-loan-provisioning-criteria.component.ts +++ b/src/app/organization/loan-provisioning-criteria/edit-loan-provisioning-criteria/edit-loan-provisioning-criteria.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, Validators, ReactiveFormsModule } from '@angular/forms'; import { MatDialog } from '@angular/material/dialog'; import { @@ -58,6 +58,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class EditLoanProvisioningCriteriaComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private organizationService = inject(OrganizationService); + private router = inject(Router); + private settingsService = inject(SettingsService); + dialog = inject(MatDialog); + private route = inject(ActivatedRoute); + /** Loan Provisioning Criteria form. */ provisioningCriteriaForm: UntypedFormGroup; /** Loan Provisioning Criteria Template */ @@ -98,14 +105,7 @@ export class EditLoanProvisioningCriteriaComponent implements OnInit { * @param {ActivatedRoute} route Activated Route. * @param {Router} router Router for navigation. */ - constructor( - private formBuilder: UntypedFormBuilder, - private organizationService: OrganizationService, - private router: Router, - private settingsService: SettingsService, - public dialog: MatDialog, - private route: ActivatedRoute - ) { + constructor() { this.route.data.subscribe((data: { loanProvisioningCriteriaAndTemplate: any }) => { this.loanProvisioningCriteriaAndTemplate = data.loanProvisioningCriteriaAndTemplate; this.definitions = this.loanProvisioningCriteriaAndTemplate.definitions; diff --git a/src/app/organization/loan-provisioning-criteria/loan-provisioning-criteria.component.ts b/src/app/organization/loan-provisioning-criteria/loan-provisioning-criteria.component.ts index 686bc5352..7185aea79 100644 --- a/src/app/organization/loan-provisioning-criteria/loan-provisioning-criteria.component.ts +++ b/src/app/organization/loan-provisioning-criteria/loan-provisioning-criteria.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, ViewChild } from '@angular/core'; +import { Component, OnInit, ViewChild, inject } from '@angular/core'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort, MatSortHeader } from '@angular/material/sort'; import { @@ -48,6 +48,8 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class LoanProvisioningCriteriaComponent implements OnInit { + private route = inject(ActivatedRoute); + /** Loan Provisioning Criteria data. */ loanProvisioningCriteriaData: any; /** Columns to be displayed in loan provisioning criteria table. */ @@ -67,7 +69,7 @@ export class LoanProvisioningCriteriaComponent implements OnInit { * Retrieves the loan provisioning criteria data from `resolve`. * @param {ActivatedRoute} route Activated Route. */ - constructor(private route: ActivatedRoute) { + constructor() { this.route.data.subscribe((data: { loanProvisioningCriterias: any }) => { this.loanProvisioningCriteriaData = data.loanProvisioningCriterias; }); diff --git a/src/app/organization/loan-provisioning-criteria/view-loan-provisioning-criteria/view-loan-provisioning-criteria.component.ts b/src/app/organization/loan-provisioning-criteria/view-loan-provisioning-criteria/view-loan-provisioning-criteria.component.ts index 8f6e580ee..97b502ee0 100644 --- a/src/app/organization/loan-provisioning-criteria/view-loan-provisioning-criteria/view-loan-provisioning-criteria.component.ts +++ b/src/app/organization/loan-provisioning-criteria/view-loan-provisioning-criteria/view-loan-provisioning-criteria.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { MatDialog } from '@angular/material/dialog'; import { Router, ActivatedRoute, RouterLink } from '@angular/router'; import { @@ -51,6 +51,11 @@ import { LoanProduct } from 'app/products/loan-products/models/loan-product.mode ] }) export class ViewLoanProvisioningCriteriaComponent implements OnInit { + private organizationService = inject(OrganizationService); + private route = inject(ActivatedRoute); + private router = inject(Router); + dialog = inject(MatDialog); + /** Loan Provisioning data. */ provisioningData: any; /** Loan Product String. */ @@ -74,12 +79,7 @@ export class ViewLoanProvisioningCriteriaComponent implements OnInit { * @param {Router} router Router for navigation. * @param {MatDialog} dialog Dialog reference. */ - constructor( - private organizationService: OrganizationService, - private route: ActivatedRoute, - private router: Router, - public dialog: MatDialog - ) { + constructor() { this.route.data.subscribe((data: { loanProvisioningCriteria: any }) => { this.provisioningData = data.loanProvisioningCriteria; }); diff --git a/src/app/organization/manage-funds/create-fund/create-fund.component.html b/src/app/organization/manage-funds/create-fund/create-fund.component.html index 23f2474e3..8a874cd2f 100644 --- a/src/app/organization/manage-funds/create-fund/create-fund.component.html +++ b/src/app/organization/manage-funds/create-fund/create-fund.component.html @@ -6,10 +6,12 @@ {{ 'labels.inputs.name' | translate }} - - {{ 'labels.inputs.name' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (fundForm.controls.name.hasError('required')) { + + {{ 'labels.inputs.name' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } diff --git a/src/app/organization/manage-funds/create-fund/create-fund.component.ts b/src/app/organization/manage-funds/create-fund/create-fund.component.ts index 58735b518..215a6b88d 100644 --- a/src/app/organization/manage-funds/create-fund/create-fund.component.ts +++ b/src/app/organization/manage-funds/create-fund/create-fund.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormBuilder, UntypedFormGroup, Validators, ReactiveFormsModule } from '@angular/forms'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; import { OrganizationService } from 'app/organization/organization.service'; @@ -13,23 +13,14 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class CreateFundComponent implements OnInit { + private organizationService = inject(OrganizationService); + private formBuilder = inject(UntypedFormBuilder); + private router = inject(Router); + private route = inject(ActivatedRoute); + /** Charge form. */ fundForm: UntypedFormGroup; - /** - * Retrieves the charge data from `resolve`. - * @param {ProductsService} productsService Products Service. - * @param {FormBuilder} formBuilder Form Builder. - * @param {ActivatedRoute} route Activated Route. - * @param {Router} router Router for navigation. - */ - constructor( - private organizationService: OrganizationService, - private formBuilder: UntypedFormBuilder, - private router: Router, - private route: ActivatedRoute - ) {} - ngOnInit() { this.createFundForm(); } diff --git a/src/app/organization/manage-funds/edit-fund/edit-fund.component.html b/src/app/organization/manage-funds/edit-fund/edit-fund.component.html index 3b98b258a..5b454999a 100644 --- a/src/app/organization/manage-funds/edit-fund/edit-fund.component.html +++ b/src/app/organization/manage-funds/edit-fund/edit-fund.component.html @@ -6,10 +6,12 @@ {{ 'labels.inputs.name' | translate }} - - {{ 'labels.inputs.name' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (fundForm.controls.name.hasError('required')) { + + {{ 'labels.inputs.name' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } diff --git a/src/app/organization/manage-funds/edit-fund/edit-fund.component.ts b/src/app/organization/manage-funds/edit-fund/edit-fund.component.ts index 7d24b6719..0e6355696 100644 --- a/src/app/organization/manage-funds/edit-fund/edit-fund.component.ts +++ b/src/app/organization/manage-funds/edit-fund/edit-fund.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormBuilder, UntypedFormGroup, Validators, ReactiveFormsModule } from '@angular/forms'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; import { OrganizationService } from 'app/organization/organization.service'; @@ -13,6 +13,11 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class EditFundComponent implements OnInit { + private organizationService = inject(OrganizationService); + private formBuilder = inject(UntypedFormBuilder); + private router = inject(Router); + private route = inject(ActivatedRoute); + /** Selected Data. */ fundData: any; /** Charge form. */ @@ -25,12 +30,7 @@ export class EditFundComponent implements OnInit { * @param {ActivatedRoute} route Activated Route. * @param {Router} router Router for navigation. */ - constructor( - private organizationService: OrganizationService, - private formBuilder: UntypedFormBuilder, - private router: Router, - private route: ActivatedRoute - ) { + constructor() { this.route.data.subscribe((data: { fundData: any }) => { this.fundData = data.fundData; }); diff --git a/src/app/organization/manage-funds/manage-fund.resolver.ts b/src/app/organization/manage-funds/manage-fund.resolver.ts index 1f3f47893..384a00a30 100644 --- a/src/app/organization/manage-funds/manage-fund.resolver.ts +++ b/src/app/organization/manage-funds/manage-fund.resolver.ts @@ -1,4 +1,4 @@ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; import { Observable } from 'rxjs'; import { OrganizationService } from '../organization.service'; @@ -7,10 +7,7 @@ import { OrganizationService } from '../organization.service'; providedIn: 'root' }) export class ManageFundResolver { - /** - * @param {OrganizationService} organizationService Organization service. - */ - constructor(private organizationService: OrganizationService) {} + private organizationService = inject(OrganizationService); /** * Returns the manage funds data. diff --git a/src/app/organization/manage-funds/manage-funds.component.ts b/src/app/organization/manage-funds/manage-funds.component.ts index ead5bea21..29ac59355 100644 --- a/src/app/organization/manage-funds/manage-funds.component.ts +++ b/src/app/organization/manage-funds/manage-funds.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, TemplateRef, ElementRef, ViewChild, AfterViewInit } from '@angular/core'; +import { Component, OnInit, TemplateRef, ElementRef, ViewChild, AfterViewInit, inject } from '@angular/core'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; import { MatDialog } from '@angular/material/dialog'; import { UntypedFormBuilder, Validators } from '@angular/forms'; @@ -64,6 +64,14 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ManageFundsComponent implements OnInit, AfterViewInit { + private route = inject(ActivatedRoute); + private formBuilder = inject(UntypedFormBuilder); + private organizationservice = inject(OrganizationService); + dialog = inject(MatDialog); + private router = inject(Router); + private configurationWizardService = inject(ConfigurationWizardService); + private popoverService = inject(PopoverService); + /** Manage Funds data. */ fundsData: any; /** New Fund form */ @@ -98,15 +106,7 @@ export class ManageFundsComponent implements OnInit, AfterViewInit { * @param {ConfigurationWizardService} configurationWizardService ConfigurationWizard Service. * @param {PopoverService} popoverService PopoverService. */ - constructor( - private route: ActivatedRoute, - private formBuilder: UntypedFormBuilder, - private organizationservice: OrganizationService, - public dialog: MatDialog, - private router: Router, - private configurationWizardService: ConfigurationWizardService, - private popoverService: PopoverService - ) { + constructor() { this.route.data.subscribe((data: { funds: any }) => { this.fundsData = data.funds; }); @@ -171,7 +171,6 @@ export class ManageFundsComponent implements OnInit, AfterViewInit { type: 'text', required: true }) - ]; const data = { title: 'Edit Fund', diff --git a/src/app/organization/manage-funds/manage-funds.resolver.ts b/src/app/organization/manage-funds/manage-funds.resolver.ts index 3348d44dc..62637b6d4 100644 --- a/src/app/organization/manage-funds/manage-funds.resolver.ts +++ b/src/app/organization/manage-funds/manage-funds.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; /** rxjs Imports */ import { Observable } from 'rxjs'; @@ -12,10 +12,7 @@ import { OrganizationService } from '../organization.service'; */ @Injectable() export class ManageFundsResolver { - /** - * @param {OrganizationService} organizationService Organization service. - */ - constructor(private organizationService: OrganizationService) {} + private organizationService = inject(OrganizationService); /** * Returns the manage funds data. diff --git a/src/app/organization/manage-funds/view-fund/view-fund.component.ts b/src/app/organization/manage-funds/view-fund/view-fund.component.ts index 1b3035422..5977f2aaf 100644 --- a/src/app/organization/manage-funds/view-fund/view-fund.component.ts +++ b/src/app/organization/manage-funds/view-fund/view-fund.component.ts @@ -1,4 +1,4 @@ -import { Component } from '@angular/core'; +import { Component, inject } from '@angular/core'; import { ActivatedRoute, RouterLink } from '@angular/router'; import { FaIconComponent } from '@fortawesome/angular-fontawesome'; import { ExternalIdentifierComponent } from '../../../shared/external-identifier/external-identifier.component'; @@ -15,6 +15,8 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ViewFundComponent { + private route = inject(ActivatedRoute); + /** Fund data. */ fundData: any; @@ -22,7 +24,7 @@ export class ViewFundComponent { * Retrieves the charge data from `resolve`. * @param {Router} router Router for navigation. */ - constructor(private route: ActivatedRoute) { + constructor() { this.route.data.subscribe((data: { fundData: any }) => { this.fundData = data.fundData; }); diff --git a/src/app/organization/offices/common-resolvers/edit-office.resolver.ts b/src/app/organization/offices/common-resolvers/edit-office.resolver.ts index 1155ab264..e0d1ca03c 100644 --- a/src/app/organization/offices/common-resolvers/edit-office.resolver.ts +++ b/src/app/organization/offices/common-resolvers/edit-office.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { OrganizationService } from '../../organization.service'; */ @Injectable() export class EditOfficeResolver { - /** - * @param {OrganizationService} organizationService Organization service. - */ - constructor(private organizationService: OrganizationService) {} + private organizationService = inject(OrganizationService); /** * Returns the office and template data. diff --git a/src/app/organization/offices/common-resolvers/office-datatable.resolver.ts b/src/app/organization/offices/common-resolvers/office-datatable.resolver.ts index fe4109229..3314d8808 100644 --- a/src/app/organization/offices/common-resolvers/office-datatable.resolver.ts +++ b/src/app/organization/offices/common-resolvers/office-datatable.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; import { SystemService } from 'app/system/system.service'; @@ -11,10 +11,7 @@ import { Observable } from 'rxjs'; */ @Injectable() export class OfficeDatatableResolver { - /** - * @param {SystemService} systemService Products service. - */ - constructor(private systemService: SystemService) {} + private systemService = inject(SystemService); /** * Returns the Office's Datatable data. diff --git a/src/app/organization/offices/common-resolvers/office-datatables.resolver.ts b/src/app/organization/offices/common-resolvers/office-datatables.resolver.ts index 58baf8b99..91e606f9f 100644 --- a/src/app/organization/offices/common-resolvers/office-datatables.resolver.ts +++ b/src/app/organization/offices/common-resolvers/office-datatables.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; import { SystemService } from 'app/system/system.service'; @@ -11,10 +11,7 @@ import { Observable } from 'rxjs'; */ @Injectable() export class OfficeDatatablesResolver { - /** - * @param {SystemService} systemService Products service. - */ - constructor(private systemService: SystemService) {} + private systemService = inject(SystemService); /** * Returns the loan product data. diff --git a/src/app/organization/offices/common-resolvers/office.resolver.ts b/src/app/organization/offices/common-resolvers/office.resolver.ts index 4d470f9ff..212292d00 100644 --- a/src/app/organization/offices/common-resolvers/office.resolver.ts +++ b/src/app/organization/offices/common-resolvers/office.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { OrganizationService } from '../../organization.service'; */ @Injectable() export class OfficeResolver { - /** - * @param {OrganizationService} organizationService Organization service. - */ - constructor(private organizationService: OrganizationService) {} + private organizationService = inject(OrganizationService); /** * Returns the office data. diff --git a/src/app/organization/offices/common-resolvers/offices.resolver.ts b/src/app/organization/offices/common-resolvers/offices.resolver.ts index a8323a2ee..9e22f337b 100644 --- a/src/app/organization/offices/common-resolvers/offices.resolver.ts +++ b/src/app/organization/offices/common-resolvers/offices.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; /** rxjs Imports */ import { Observable } from 'rxjs'; @@ -12,10 +12,7 @@ import { OrganizationService } from '../../organization.service'; */ @Injectable() export class OfficesResolver { - /** - * @param {OrganizationService} organizationService Organization service. - */ - constructor(private organizationService: OrganizationService) {} + private organizationService = inject(OrganizationService); /** * Returns the offices data. diff --git a/src/app/organization/offices/create-office/create-office.component.html b/src/app/organization/offices/create-office/create-office.component.html index 3a3510785..8e6d91563 100644 --- a/src/app/organization/offices/create-office/create-office.component.html +++ b/src/app/organization/offices/create-office/create-office.component.html @@ -6,23 +6,29 @@ {{ 'labels.inputs.Office' | translate }} - - {{ 'labels.inputs.Office' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (officeForm.controls.name.hasError('required')) { + + {{ 'labels.inputs.Office' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Parent Office' | translate }} - - {{ office.name }} - + @for (office of officeData; track office) { + + {{ office.name }} + + } - - {{ 'labels.inputs.Parent Office' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (officeForm.controls.parentId.hasError('required')) { + + {{ 'labels.inputs.Parent Office' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } @@ -37,10 +43,12 @@ /> - - {{ 'labels.inputs.Opening Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (officeForm.controls.openingDate.hasError('required')) { + + {{ 'labels.inputs.Opening Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } diff --git a/src/app/organization/offices/create-office/create-office.component.ts b/src/app/organization/offices/create-office/create-office.component.ts index c30ab04fe..47ac1488e 100644 --- a/src/app/organization/offices/create-office/create-office.component.ts +++ b/src/app/organization/offices/create-office/create-office.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, TemplateRef, ElementRef, ViewChild, AfterViewInit } from '@angular/core'; +import { Component, OnInit, TemplateRef, ElementRef, ViewChild, AfterViewInit, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, Validators, ReactiveFormsModule } from '@angular/forms'; import { Router, ActivatedRoute, RouterLink } from '@angular/router'; @@ -27,6 +27,16 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class CreateOfficeComponent implements OnInit, AfterViewInit { + private formBuilder = inject(UntypedFormBuilder); + private organizationService = inject(OrganizationService); + private settingsService = inject(SettingsService); + private router = inject(Router); + private route = inject(ActivatedRoute); + private dateUtils = inject(Dates); + private popoverService = inject(PopoverService); + private configurationWizardService = inject(ConfigurationWizardService); + dialog = inject(MatDialog); + /** Office form. */ officeForm: UntypedFormGroup; /** Office Data */ @@ -53,17 +63,7 @@ export class CreateOfficeComponent implements OnInit, AfterViewInit { * @param {ConfigurationWizardService} configurationWizardService ConfigurationWizard Service. * @param {PopoverService} popoverService PopoverService. */ - constructor( - private formBuilder: UntypedFormBuilder, - private organizationService: OrganizationService, - private settingsService: SettingsService, - private router: Router, - private route: ActivatedRoute, - private dateUtils: Dates, - private popoverService: PopoverService, - private configurationWizardService: ConfigurationWizardService, - public dialog: MatDialog - ) { + constructor() { this.route.data.subscribe((data: { offices: any }) => { this.officeData = data.offices; }); diff --git a/src/app/organization/offices/edit-office/edit-office.component.html b/src/app/organization/offices/edit-office/edit-office.component.html index c110d1874..152f099df 100644 --- a/src/app/organization/offices/edit-office/edit-office.component.html +++ b/src/app/organization/offices/edit-office/edit-office.component.html @@ -6,24 +6,32 @@ {{ 'labels.inputs.Office' | translate }} - - {{ 'labels.inputs.Office' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (officeForm.controls.name.hasError('required')) { + + {{ 'labels.inputs.Office' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } - - {{ 'labels.inputs.Parent Office' | translate }} - - - {{ office.name }} - - - - {{ 'labels.inputs.Parent Office' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - + @if (officeForm.contains('parentId')) { + + {{ 'labels.inputs.Parent Office' | translate }} + + @for (office of officeData.allowedParents; track office) { + + {{ office.name }} + + } + + @if (officeForm.controls.parentId.hasError('required')) { + + {{ 'labels.inputs.Parent Office' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + } {{ 'labels.inputs.Opened On' | translate }} @@ -37,10 +45,12 @@ /> - - {{ 'labels.inputs.Opening Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (officeForm.controls.openingDate.hasError('required')) { + + {{ 'labels.inputs.Opening Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } diff --git a/src/app/organization/offices/edit-office/edit-office.component.ts b/src/app/organization/offices/edit-office/edit-office.component.ts index b2d8a30d3..92e7fec48 100644 --- a/src/app/organization/offices/edit-office/edit-office.component.ts +++ b/src/app/organization/offices/edit-office/edit-office.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, Validators, ReactiveFormsModule } from '@angular/forms'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; import { Dates } from 'app/core/utils/dates'; @@ -21,6 +21,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class EditOfficeComponent implements OnInit { + private organizationService = inject(OrganizationService); + private settingsService = inject(SettingsService); + private formBuilder = inject(UntypedFormBuilder); + private route = inject(ActivatedRoute); + private router = inject(Router); + private dateUtils = inject(Dates); + /** Selected Data. */ officeData: any; /** Office form. */ @@ -40,14 +47,7 @@ export class EditOfficeComponent implements OnInit { * @param {MatDialog} dialog Dialog reference. * @param {Dates} dateUtils Date Utils */ - constructor( - private organizationService: OrganizationService, - private settingsService: SettingsService, - private formBuilder: UntypedFormBuilder, - private route: ActivatedRoute, - private router: Router, - private dateUtils: Dates - ) { + constructor() { this.route.data.subscribe((data: { officeTemplate: any }) => { this.officeData = data.officeTemplate; }); diff --git a/src/app/organization/offices/offices.component.html b/src/app/organization/offices/offices.component.html index 2c162288d..4173c4391 100644 --- a/src/app/organization/offices/offices.component.html +++ b/src/app/organization/offices/offices.component.html @@ -117,55 +117,59 @@ -
    - - -
    - - {{ office.name }} - - -
    - -
    -
    - - - -
    -
    - {{ 'Parent Office' | translate }} -
    - -
    - {{ office.parentName }} -
    - -
    - {{ ' Opened On' | translate }} -
    - -
    - {{ office.openingDate | date }} -
    - -
    - {{ 'External Id' | translate }} -
    - -
    - -
    + @if (office) { +
    + + +
    + + {{ office.name }} + +
    +
    - - - - - - -
    +
    + + +
    + @if (office.parentId) { +
    + {{ 'Parent Office' | translate }} +
    + } + @if (office.parentId) { +
    + {{ office.parentName }} +
    + } +
    + {{ ' Opened On' | translate }} +
    +
    + {{ office.openingDate | date }} +
    + @if (office.externalId) { +
    + {{ 'External Id' | translate }} +
    + } + @if (office.externalId) { +
    + +
    + } +
    +
    + @for (dataTable of dataTablesData; track dataTable) { + + } +
    + + +
    + }
    diff --git a/src/app/organization/offices/offices.component.ts b/src/app/organization/offices/offices.component.ts index d41a2e1d3..ef19d03e8 100644 --- a/src/app/organization/offices/offices.component.ts +++ b/src/app/organization/offices/offices.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, TemplateRef, ElementRef, ViewChild, AfterViewInit } from '@angular/core'; +import { Component, OnInit, TemplateRef, ElementRef, ViewChild, AfterViewInit, inject } from '@angular/core'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort, MatSortHeader } from '@angular/material/sort'; import { @@ -41,7 +41,7 @@ import { MatButtonToggleGroup, MatButtonToggle } from '@angular/material/button- import { FaIconComponent } from '@fortawesome/angular-fontawesome'; import { MatButton, MatIconButton } from '@angular/material/button'; import { MatCard, MatCardContent, MatCardTitle } from '@angular/material/card'; -import { NgIf, NgFor, DatePipe } from '@angular/common'; +import { DatePipe } from '@angular/common'; import { MatTabGroup, MatTab } from '@angular/material/tabs'; import { ExternalIdentifierComponent } from '../../shared/external-identifier/external-identifier.component'; import { DateFormatPipe } from '../../pipes/date-format.pipe'; @@ -88,6 +88,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class OfficesComponent implements OnInit, AfterViewInit { + private route = inject(ActivatedRoute); + private router = inject(Router); + private officeTreeService = inject(OfficeTreeService); + private treeControlService = inject(TreeControlService); + private configurationWizardService = inject(ConfigurationWizardService); + private popoverService = inject(PopoverService); + /** Button toggle group form control for type of view. (list/tree) */ viewGroup = new UntypedFormControl('listView'); @@ -135,14 +142,9 @@ export class OfficesComponent implements OnInit, AfterViewInit { * @param {ConfigurationWizardService} configurationWizardService ConfigurationWizard Service. * @param {PopoverService} popoverService PopoverService. */ - constructor( - private route: ActivatedRoute, - private router: Router, - private officeTreeService: OfficeTreeService, - private treeControlService: TreeControlService, - private configurationWizardService: ConfigurationWizardService, - private popoverService: PopoverService - ) { + constructor() { + const officeTreeService = this.officeTreeService; + this.route.data.subscribe((data: { offices: any; officeDataTables: any }) => { this.officesData = data.offices; officeTreeService.initialize(this.officesData); diff --git a/src/app/organization/offices/view-office/datatable-tabs/datatable-tabs.component.ts b/src/app/organization/offices/view-office/datatable-tabs/datatable-tabs.component.ts index e3ea0df49..a0ad2211b 100644 --- a/src/app/organization/offices/view-office/datatable-tabs/datatable-tabs.component.ts +++ b/src/app/organization/offices/view-office/datatable-tabs/datatable-tabs.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component } from '@angular/core'; +import { Component, inject } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; import { EntityDatatableTabComponent } from '../../../../shared/tabs/entity-datatable-tab/entity-datatable-tab.component'; import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; @@ -17,6 +17,8 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class DatatableTabsComponent { + private route = inject(ActivatedRoute); + entityId: string; /** Office Datatable */ entityDatatable: any; @@ -27,7 +29,7 @@ export class DatatableTabsComponent { * Fetches data table data from `resolve` * @param {ActivatedRoute} route Activated Route. */ - constructor(private route: ActivatedRoute) { + constructor() { this.entityId = this.route.parent.parent.snapshot.paramMap.get('officeId'); this.route.data.subscribe((data: { officeDatatable: any }) => { diff --git a/src/app/organization/offices/view-office/general-tab/general-tab.component.html b/src/app/organization/offices/view-office/general-tab/general-tab.component.html index 2dec268ce..abda67080 100644 --- a/src/app/organization/offices/view-office/general-tab/general-tab.component.html +++ b/src/app/organization/offices/view-office/general-tab/general-tab.component.html @@ -19,12 +19,16 @@
    {{ 'labels.inputs.External Id' | translate }}
    -
    - -
    -
    - {{ 'labels.inputs.Unassigned' | translate }} -
    + @if (officeData.externalId) { +
    + +
    + } + @if (!officeData.externalId) { +
    + {{ 'labels.inputs.Unassigned' | translate }} +
    + }
    diff --git a/src/app/organization/offices/view-office/general-tab/general-tab.component.ts b/src/app/organization/offices/view-office/general-tab/general-tab.component.ts index b3c0fe612..6132ff58b 100644 --- a/src/app/organization/offices/view-office/general-tab/general-tab.component.ts +++ b/src/app/organization/offices/view-office/general-tab/general-tab.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component } from '@angular/core'; +import { Component, inject } from '@angular/core'; import { ActivatedRoute, RouterLink } from '@angular/router'; import { FaIconComponent } from '@fortawesome/angular-fontawesome'; import { ExternalIdentifierComponent } from '../../../../shared/external-identifier/external-identifier.component'; @@ -21,6 +21,8 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class GeneralTabComponent { + private route = inject(ActivatedRoute); + /** Office data */ officeData: any; @@ -28,7 +30,7 @@ export class GeneralTabComponent { * Fetches office data from `resolve` * @param {ActivatedRoute} route Activated Route */ - constructor(private route: ActivatedRoute) { + constructor() { this.route.data.subscribe((data: { office: any }) => { this.officeData = data.office; }); diff --git a/src/app/organization/offices/view-office/view-office.component.html b/src/app/organization/offices/view-office/view-office.component.html index 45594bf8d..f78445295 100644 --- a/src/app/organization/offices/view-office/view-office.component.html +++ b/src/app/organization/offices/view-office/view-office.component.html @@ -12,19 +12,21 @@ > {{ 'labels.inputs.General' | translate }} - - - {{ officeDatatable.registeredTableName }} - - + @for (officeDatatable of officeDatatables; track officeDatatable) { + + + {{ officeDatatable.registeredTableName }} + + + } diff --git a/src/app/organization/offices/view-office/view-office.component.ts b/src/app/organization/offices/view-office/view-office.component.ts index 126531b61..4eb9ba223 100644 --- a/src/app/organization/offices/view-office/view-office.component.ts +++ b/src/app/organization/offices/view-office/view-office.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component } from '@angular/core'; +import { Component, inject } from '@angular/core'; import { ActivatedRoute, RouterLinkActive, RouterLink, RouterOutlet } from '@angular/router'; import { MatTabNav, MatTabLink, MatTabNavPanel } from '@angular/material/tabs'; import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; @@ -21,6 +21,8 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ViewOfficeComponent { + private route = inject(ActivatedRoute); + /** Office datatables data */ officeDatatables: any; @@ -28,7 +30,7 @@ export class ViewOfficeComponent { * Fetches office datatables from `resolve` * @param {ActivatedRoute} route Activated Route */ - constructor(private route: ActivatedRoute) { + constructor() { this.route.data.subscribe((data: { officeDatatables: any }) => { this.officeDatatables = data.officeDatatables; }); diff --git a/src/app/organization/organization-routing.module.ts b/src/app/organization/organization-routing.module.ts index 3cb00a607..b224dadc4 100644 --- a/src/app/organization/organization-routing.module.ts +++ b/src/app/organization/organization-routing.module.ts @@ -695,7 +695,6 @@ const routes: Routes = [ ] } ]) - ]; /** diff --git a/src/app/organization/organization.component.html b/src/app/organization/organization.component.html index cc3889f51..305d3f96e 100644 --- a/src/app/organization/organization.component.html +++ b/src/app/organization/organization.component.html @@ -12,24 +12,20 @@
    {{ 'labels.heading.Manage Offices' | translate }} - + @if (arrowBooleans[0]) { + + }
    @@ -44,24 +40,20 @@
    {{ 'labels.heading.Manage Holidays' | translate }} - + @if (arrowBooleans[1]) { + + }
    @@ -76,24 +68,20 @@
    {{ 'labels.heading.Manage Employees' | translate }} - + @if (arrowBooleans[2]) { + + }
    @@ -108,29 +96,20 @@
    {{ 'labels.heading.Standing Instructions History' | translate }} - + @if (arrowBooleans[3]) { + + }
    @@ -145,24 +124,20 @@
    {{ 'labels.text.Investors' | translate }} - + @if (arrowBooleans[4]) { + + }
    @@ -177,24 +152,20 @@
    {{ 'labels.heading.Fund Mapping' | translate }} - + @if (arrowBooleans[5]) { + + }
    @@ -209,29 +180,20 @@
    {{ 'labels.heading.Password Preferences' | translate }} - + @if (arrowBooleans[6]) { + + }
    @@ -246,29 +208,20 @@
    {{ 'labels.heading.Loan Provisioning Criteria' | translate }} - + @if (arrowBooleans[7]) { + + }
    @@ -283,29 +236,20 @@
    {{ 'labels.heading.Entity Data Table Checks' | translate }} - + @if (arrowBooleans[8]) { + + }
    @@ -324,24 +268,20 @@
    {{ 'labels.heading.Currency Configuration' | translate }} - + @if (arrowBooleans[9]) { + + }
    @@ -356,24 +296,20 @@
    {{ 'labels.heading.Manage Funds' | translate }} - + @if (arrowBooleans[10]) { + + }
    @@ -388,24 +324,20 @@
    {{ 'labels.heading.Bulk Loan Reassignment' | translate }} - + @if (arrowBooleans[11]) { + + }
    @@ -420,24 +352,20 @@
    {{ 'labels.heading.Teller / Cashier Management' | translate }} - + @if (arrowBooleans[12]) { + + }
    @@ -452,24 +380,20 @@
    {{ 'labels.heading.Working Days' | translate }} - + @if (arrowBooleans[13]) { + + }
    @@ -484,24 +408,20 @@
    {{ 'labels.heading.Payment Type' | translate }} - + @if (arrowBooleans[14]) { + + }
    @@ -516,24 +436,20 @@
    {{ 'labels.heading.SMS Campaigns' | translate }} - + @if (arrowBooleans[15]) { + + }
    @@ -548,24 +464,20 @@
    {{ 'labels.heading.AdHocQuery' | translate }} - + @if (arrowBooleans[16]) { + + }
    @@ -580,24 +492,20 @@
    {{ 'labels.heading.Bulk Import' | translate }} - + @if (arrowBooleans[17]) { + + }
    diff --git a/src/app/organization/organization.component.ts b/src/app/organization/organization.component.ts index 25b0fe3a8..5a709a4c7 100644 --- a/src/app/organization/organization.component.ts +++ b/src/app/organization/organization.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { AfterViewInit, Component, ElementRef, TemplateRef, ViewChild } from '@angular/core'; +import { AfterViewInit, Component, ElementRef, TemplateRef, ViewChild, inject } from '@angular/core'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; /** Custom Services */ @@ -28,6 +28,11 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class OrganizationComponent implements AfterViewInit { + private activatedRoute = inject(ActivatedRoute); + private router = inject(Router); + private configurationWizardService = inject(ConfigurationWizardService); + private popoverService = inject(PopoverService); + shouldShowFundMapping = false; /* Reference of manage offices */ @ViewChild('office') office: ElementRef; @@ -56,19 +61,6 @@ export class OrganizationComponent implements AfterViewInit { // Initialize an array of 18 boolean values, all set to false arrowBooleans: boolean[] = new Array(18).fill(false); - /** - * @param {ActivatedRoute} activatedRoute ActivatedRoute. - * @param {Router} router Router. - * @param {ConfigurationWizardService} configurationWizardService ConfigurationWizard Service. - * @param {PopoverService} popoverService PopoverService. - */ - constructor( - private activatedRoute: ActivatedRoute, - private router: Router, - private configurationWizardService: ConfigurationWizardService, - private popoverService: PopoverService - ) {} - /** * Popover function * @param template TemplateRef. diff --git a/src/app/organization/organization.service.ts b/src/app/organization/organization.service.ts index fb43dfe1d..854e0743c 100644 --- a/src/app/organization/organization.service.ts +++ b/src/app/organization/organization.service.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { HttpClient, HttpParams } from '@angular/common/http'; /** rxjs Imports */ @@ -15,13 +15,8 @@ import { SettingsService } from 'app/settings/settings.service'; providedIn: 'root' }) export class OrganizationService { - /** - * @param {HttpClient} http Http Client to send requests. - */ - constructor( - private http: HttpClient, - private settingsService: SettingsService - ) {} + private http = inject(HttpClient); + private settingsService = inject(SettingsService); /** * @returns {Observable} Loan Provisioning Criteria data diff --git a/src/app/organization/password-preferences/password-preferences-template.resolver.ts b/src/app/organization/password-preferences/password-preferences-template.resolver.ts index 855c62a84..90e31b1e6 100644 --- a/src/app/organization/password-preferences/password-preferences-template.resolver.ts +++ b/src/app/organization/password-preferences/password-preferences-template.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; /** rxjs Imports */ import { Observable } from 'rxjs'; @@ -12,10 +12,7 @@ import { OrganizationService } from '../organization.service'; */ @Injectable() export class PasswordPreferencesTemplateResolver { - /** - * @param {OrganizationService} organizationService Organization service. - */ - constructor(private organizationService: OrganizationService) {} + private organizationService = inject(OrganizationService); /** * Returns the password preferences template data. diff --git a/src/app/organization/password-preferences/password-preferences.component.html b/src/app/organization/password-preferences/password-preferences.component.html index 642d3c0f0..2b7986f1e 100644 --- a/src/app/organization/password-preferences/password-preferences.component.html +++ b/src/app/organization/password-preferences/password-preferences.component.html @@ -3,9 +3,11 @@
    - - {{ passwordPreference.description }} - + @for (passwordPreference of passwordPreferencesData; track passwordPreference) { + + {{ passwordPreference.description }} + + } diff --git a/src/app/organization/password-preferences/password-preferences.component.ts b/src/app/organization/password-preferences/password-preferences.component.ts index cae38e7b4..59c1803aa 100644 --- a/src/app/organization/password-preferences/password-preferences.component.ts +++ b/src/app/organization/password-preferences/password-preferences.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, ReactiveFormsModule } from '@angular/forms'; import { Router, ActivatedRoute, RouterLink } from '@angular/router'; @@ -22,6 +22,11 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class PasswordPreferencesComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private organizationService = inject(OrganizationService); + private route = inject(ActivatedRoute); + private router = inject(Router); + /** Password preferences form. */ passwordPreferencesForm: UntypedFormGroup; /** Password preferences data. */ @@ -34,12 +39,7 @@ export class PasswordPreferencesComponent implements OnInit { * @param {ActivatedRoute} route Activated Route. * @param {Router} router Router for navigation. */ - constructor( - private formBuilder: UntypedFormBuilder, - private organizationService: OrganizationService, - private route: ActivatedRoute, - private router: Router - ) { + constructor() { this.route.data.subscribe((data: { passwordPreferencesTemplate: any }) => { this.passwordPreferencesData = data.passwordPreferencesTemplate; }); diff --git a/src/app/organization/payment-types/create-payment-type/create-payment-type.component.html b/src/app/organization/payment-types/create-payment-type/create-payment-type.component.html index 3410d54b7..9326f65d2 100644 --- a/src/app/organization/payment-types/create-payment-type/create-payment-type.component.html +++ b/src/app/organization/payment-types/create-payment-type/create-payment-type.component.html @@ -6,10 +6,12 @@ {{ 'labels.inputs.Payment Type' | translate }} - - {{ 'labels.inputs.Payment Type' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (paymentTypeForm.controls.name.hasError('required')) { + + {{ 'labels.inputs.Payment Type' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } @@ -24,13 +26,15 @@ {{ 'labels.inputs.Position' | translate }} - - {{ 'labels.inputs.Position' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - {{ 'labels.inputs.Position' | translate }} must be a positive number. - + @if (paymentTypeForm.controls.position.hasError('required')) { + + {{ 'labels.inputs.Position' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + @if (paymentTypeForm.controls.position.hasError('min')) { + {{ 'labels.inputs.Position' | translate }} must be a positive number. + } diff --git a/src/app/organization/payment-types/create-payment-type/create-payment-type.component.ts b/src/app/organization/payment-types/create-payment-type/create-payment-type.component.ts index de675ec46..b03fbd868 100644 --- a/src/app/organization/payment-types/create-payment-type/create-payment-type.component.ts +++ b/src/app/organization/payment-types/create-payment-type/create-payment-type.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, Validators, ReactiveFormsModule } from '@angular/forms'; import { Router, ActivatedRoute, RouterLink } from '@angular/router'; @@ -23,22 +23,14 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class CreatePaymentTypeComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private organizationService = inject(OrganizationService); + private router = inject(Router); + private route = inject(ActivatedRoute); + /** Payment Type form. */ paymentTypeForm: UntypedFormGroup; - /** - * @param {FormBuilder} formBuilder Form Builder. - * @param {OrganizationService} organizationService Organization Service. - * @param {ActivatedRoute} route Activated Route. - * @param {Router} router Router for navigation. - */ - constructor( - private formBuilder: UntypedFormBuilder, - private organizationService: OrganizationService, - private router: Router, - private route: ActivatedRoute - ) {} - /** * Creates and sets the payment type form. */ @@ -61,7 +53,8 @@ export class CreatePaymentTypeComponent implements OnInit { '', [ Validators.required, - Validators.min(1)] + Validators.min(1) + ] ] }); } diff --git a/src/app/organization/payment-types/edit-payment-type/edit-payment-type.component.html b/src/app/organization/payment-types/edit-payment-type/edit-payment-type.component.html index a079f32b4..9e6421d7c 100644 --- a/src/app/organization/payment-types/edit-payment-type/edit-payment-type.component.html +++ b/src/app/organization/payment-types/edit-payment-type/edit-payment-type.component.html @@ -6,10 +6,12 @@ {{ 'labels.inputs.Payment Type' | translate }} - - {{ 'labels.inputs.Payment Type' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (paymentTypeForm.controls.name.hasError('required')) { + + {{ 'labels.inputs.Payment Type' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } @@ -24,13 +26,15 @@ {{ 'labels.inputs.Position' | translate }} - - {{ 'labels.inputs.Position' | translate }} must be a positive number. - - - {{ 'labels.inputs.Position' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (paymentTypeForm.controls.position.hasError('min')) { + {{ 'labels.inputs.Position' | translate }} must be a positive number. + } + @if (paymentTypeForm.controls.position.hasError('required')) { + + {{ 'labels.inputs.Position' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } diff --git a/src/app/organization/payment-types/edit-payment-type/edit-payment-type.component.ts b/src/app/organization/payment-types/edit-payment-type/edit-payment-type.component.ts index 601c0aa3e..0c8c7fceb 100644 --- a/src/app/organization/payment-types/edit-payment-type/edit-payment-type.component.ts +++ b/src/app/organization/payment-types/edit-payment-type/edit-payment-type.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, Validators, ReactiveFormsModule } from '@angular/forms'; import { Router, ActivatedRoute, RouterLink } from '@angular/router'; @@ -23,6 +23,11 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class EditPaymentTypeComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private organizationService = inject(OrganizationService); + private router = inject(Router); + private route = inject(ActivatedRoute); + /** Payment Type form. */ paymentTypeForm: UntypedFormGroup; /** Payment Type Data. */ @@ -35,12 +40,7 @@ export class EditPaymentTypeComponent implements OnInit { * @param {ActivatedRoute} route Activated Route. * @param {Router} router Router for navigation. */ - constructor( - private formBuilder: UntypedFormBuilder, - private organizationService: OrganizationService, - private router: Router, - private route: ActivatedRoute - ) { + constructor() { this.route.data.subscribe((data: { paymentType: any }) => { this.paymentTypeData = data.paymentType; }); @@ -68,7 +68,8 @@ export class EditPaymentTypeComponent implements OnInit { this.paymentTypeData.position, [ Validators.required, - Validators.min(1)] + Validators.min(1) + ] ] }); } diff --git a/src/app/organization/payment-types/payment-types.component.html b/src/app/organization/payment-types/payment-types.component.html index eb5204544..c374f780e 100644 --- a/src/app/organization/payment-types/payment-types.component.html +++ b/src/app/organization/payment-types/payment-types.component.html @@ -34,20 +34,22 @@
    @@ -56,20 +58,22 @@ @@ -82,24 +86,16 @@ diff --git a/src/app/organization/payment-types/payment-types.component.ts b/src/app/organization/payment-types/payment-types.component.ts index e95a5502c..9449c607a 100644 --- a/src/app/organization/payment-types/payment-types.component.ts +++ b/src/app/organization/payment-types/payment-types.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, ViewChild } from '@angular/core'; +import { Component, OnInit, ViewChild, inject } from '@angular/core'; import { MatDialog } from '@angular/material/dialog'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort, MatSortHeader } from '@angular/material/sort'; @@ -54,6 +54,10 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class PaymentTypesComponent implements OnInit { + private organizationService = inject(OrganizationService); + private route = inject(ActivatedRoute); + private dialog = inject(MatDialog); + /** Payment Types data. */ paymentTypesData: any; /** Columns to be displayed in payment types table. */ @@ -80,11 +84,7 @@ export class PaymentTypesComponent implements OnInit { * @param {ActivatedRoute} route Activated Route. * @param {MatDialog} dialog Dialog reference. */ - constructor( - private organizationService: OrganizationService, - private route: ActivatedRoute, - private dialog: MatDialog - ) { + constructor() { this.route.data.subscribe((data: { paymentTypes: any }) => { this.paymentTypesData = data.paymentTypes; }); diff --git a/src/app/organization/payment-types/payment-types.resolver.ts b/src/app/organization/payment-types/payment-types.resolver.ts index 69cbe9467..c8c6821c5 100644 --- a/src/app/organization/payment-types/payment-types.resolver.ts +++ b/src/app/organization/payment-types/payment-types.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { OrganizationService } from '../organization.service'; */ @Injectable() export class PaymentTypesResolver { - /** - * @param {OrganizationService} organizationService Organization service. - */ - constructor(private organizationService: OrganizationService) {} + private organizationService = inject(OrganizationService); /** * Returns the payment types data. diff --git a/src/app/organization/sms-campaigns/common-resolvers/sms-campaign-template.resolver.ts b/src/app/organization/sms-campaigns/common-resolvers/sms-campaign-template.resolver.ts index d7c0bbb14..eeaa54e08 100644 --- a/src/app/organization/sms-campaigns/common-resolvers/sms-campaign-template.resolver.ts +++ b/src/app/organization/sms-campaigns/common-resolvers/sms-campaign-template.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; /** rxjs Imports */ import { Observable } from 'rxjs'; @@ -12,10 +12,7 @@ import { OrganizationService } from '../../organization.service'; */ @Injectable() export class SmsCampaignTemplateResolver { - /** - * @param {OrganizationService} organizationService Organization service. - */ - constructor(private organizationService: OrganizationService) {} + private organizationService = inject(OrganizationService); /** * Returns the SMS Campaign Template. diff --git a/src/app/organization/sms-campaigns/common-resolvers/sms-campaign.resolver.ts b/src/app/organization/sms-campaigns/common-resolvers/sms-campaign.resolver.ts index 7682ff4a6..e859bd976 100644 --- a/src/app/organization/sms-campaigns/common-resolvers/sms-campaign.resolver.ts +++ b/src/app/organization/sms-campaigns/common-resolvers/sms-campaign.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { OrganizationService } from 'app/organization/organization.service'; */ @Injectable() export class SmsCampaignResolver { - /** - * @param {OrganizationService} organizationService Organization service. - */ - constructor(private organizationService: OrganizationService) {} + private organizationService = inject(OrganizationService); /** * Returns the SMS Campaign data. diff --git a/src/app/organization/sms-campaigns/common-resolvers/sms-campaigns.resolver.ts b/src/app/organization/sms-campaigns/common-resolvers/sms-campaigns.resolver.ts index 7ac25e0c4..d409277d4 100644 --- a/src/app/organization/sms-campaigns/common-resolvers/sms-campaigns.resolver.ts +++ b/src/app/organization/sms-campaigns/common-resolvers/sms-campaigns.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; /** rxjs Imports */ import { Observable } from 'rxjs'; @@ -12,10 +12,7 @@ import { OrganizationService } from '../../organization.service'; */ @Injectable() export class SmsCampaignsResolver { - /** - * @param {OrganizationService} organizationService Organization service. - */ - constructor(private organizationService: OrganizationService) {} + private organizationService = inject(OrganizationService); /** * Returns the SMS Campaigns data. diff --git a/src/app/organization/sms-campaigns/create-campaign/create-campaign.component.html b/src/app/organization/sms-campaigns/create-campaign/create-campaign.component.html index d04abeef6..19fb760f5 100644 --- a/src/app/organization/sms-campaigns/create-campaign/create-campaign.component.html +++ b/src/app/organization/sms-campaigns/create-campaign/create-campaign.component.html @@ -46,15 +46,16 @@ - - {{ 'labels.inputs.PREVIEW' | translate }} - - - - + @if (smsCampaignForm.valid) { + + {{ 'labels.inputs.PREVIEW' | translate }} + + + + } diff --git a/src/app/organization/sms-campaigns/create-campaign/create-campaign.component.ts b/src/app/organization/sms-campaigns/create-campaign/create-campaign.component.ts index 71421e4a0..7f947165e 100644 --- a/src/app/organization/sms-campaigns/create-campaign/create-campaign.component.ts +++ b/src/app/organization/sms-campaigns/create-campaign/create-campaign.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, ViewChild } from '@angular/core'; +import { Component, ViewChild, inject } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; /** Custom Components */ @@ -35,6 +35,12 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class CreateCampaignComponent { + private route = inject(ActivatedRoute); + private router = inject(Router); + private organizationService = inject(OrganizationService); + private settingsService = inject(SettingsService); + private dateUtils = inject(Dates); + /** SMS Campaign Template */ smsCampaignTemplate: any; /** Run report headers */ @@ -53,13 +59,7 @@ export class CreateCampaignComponent { * @param {SettingsService} settingsService Settings Service * @param {Dates} dateUtils Date Utils */ - constructor( - private route: ActivatedRoute, - private router: Router, - private organizationService: OrganizationService, - private settingsService: SettingsService, - private dateUtils: Dates - ) { + constructor() { this.route.data.subscribe((data: { smsCampaignTemplate: any }) => { this.smsCampaignTemplate = data.smsCampaignTemplate; }); diff --git a/src/app/organization/sms-campaigns/edit-campaign/edit-campaign.component.ts b/src/app/organization/sms-campaigns/edit-campaign/edit-campaign.component.ts index 9b5495c66..4641c405e 100644 --- a/src/app/organization/sms-campaigns/edit-campaign/edit-campaign.component.ts +++ b/src/app/organization/sms-campaigns/edit-campaign/edit-campaign.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, ViewChild } from '@angular/core'; +import { Component, ViewChild, inject } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; import { Dates } from 'app/core/utils/dates'; @@ -35,6 +35,12 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class EditCampaignComponent { + private route = inject(ActivatedRoute); + private router = inject(Router); + private dateUtils = inject(Dates); + private organizationService = inject(OrganizationService); + private settingsService = inject(SettingsService); + /** smsCampaign */ smsCampaign: any; /** SMS Campaign Template */ @@ -53,13 +59,7 @@ export class EditCampaignComponent { * @param {OrganizationService} organizationService Organiztion Service * @param {SettingsService} settingsService Settings Service */ - constructor( - private route: ActivatedRoute, - private router: Router, - private dateUtils: Dates, - private organizationService: OrganizationService, - private settingsService: SettingsService - ) { + constructor() { this.route.data.subscribe((data: { smsCampaign: any; smsCampaignTemplate: any }) => { this.smsCampaignTemplate = data.smsCampaignTemplate; this.smsCampaign = data.smsCampaign; diff --git a/src/app/organization/sms-campaigns/sms-campaign-stepper/campaign-message-step/campaign-message-step.component.html b/src/app/organization/sms-campaigns/sms-campaign-stepper/campaign-message-step/campaign-message-step.component.html index 0804e7c30..1ad8ad4a2 100644 --- a/src/app/organization/sms-campaigns/sms-campaign-stepper/campaign-message-step/campaign-message-step.component.html +++ b/src/app/organization/sms-campaigns/sms-campaign-stepper/campaign-message-step/campaign-message-step.component.html @@ -7,15 +7,11 @@

    {{ 'labels.heading.Template Parameters' | translate }}

    - + @for (label of parameterLabels; track label) { + + }
    diff --git a/src/app/organization/sms-campaigns/sms-campaign-stepper/edit-sms-campaign-step/edit-business-rule-parameters/edit-business-rule-parameters.component.ts b/src/app/organization/sms-campaigns/sms-campaign-stepper/edit-sms-campaign-step/edit-business-rule-parameters/edit-business-rule-parameters.component.ts index 3f4c95689..480190754 100644 --- a/src/app/organization/sms-campaigns/sms-campaign-stepper/edit-sms-campaign-step/edit-business-rule-parameters/edit-business-rule-parameters.component.ts +++ b/src/app/organization/sms-campaigns/sms-campaign-stepper/edit-sms-campaign-step/edit-business-rule-parameters/edit-business-rule-parameters.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnChanges, Input, Output, EventEmitter, OnInit } from '@angular/core'; +import { Component, OnChanges, Input, Output, EventEmitter, OnInit, inject } from '@angular/core'; import { Validators, UntypedFormGroup, UntypedFormControl, ReactiveFormsModule } from '@angular/forms'; /** Rxjs Imports */ @@ -37,6 +37,10 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class EditBusinessRuleParametersComponent implements OnInit, OnChanges { + private reportsService = inject(ReportsService); + private settingsService = inject(SettingsService); + private dateUtils = inject(Dates); + /** Run Report Parameters Data */ @Input() paramData: any; /** SMS Campaign */ @@ -55,16 +59,6 @@ export class EditBusinessRuleParametersComponent implements OnInit, OnChanges { /** Maximum Date allowed. */ maxDate = new Date(); - /** - * @param {ReportsService} reportsService Reports Service - * @param {SettingsService} settingsService Settings Service. - */ - constructor( - private reportsService: ReportsService, - private settingsService: SettingsService, - private dateUtils: Dates - ) {} - ngOnInit(): void { this.maxDate = this.settingsService.businessDate; } diff --git a/src/app/organization/sms-campaigns/sms-campaign-stepper/edit-sms-campaign-step/edit-sms-campaign-step.component.html b/src/app/organization/sms-campaigns/sms-campaign-stepper/edit-sms-campaign-step/edit-sms-campaign-step.component.html index 8da355667..7cb3bfdec 100644 --- a/src/app/organization/sms-campaigns/sms-campaign-stepper/edit-sms-campaign-step/edit-sms-campaign-step.component.html +++ b/src/app/organization/sms-campaigns/sms-campaign-stepper/edit-sms-campaign-step/edit-sms-campaign-step.component.html @@ -9,21 +9,27 @@ - - {{ 'labels.inputs.SMS Provider' | translate }} - - - {{ provider.value }} - - - + @if (!smsCampaignDetailsForm.controls.isNotification.value) { + + {{ 'labels.inputs.SMS Provider' | translate }} + + @for (provider of smsProviders; track provider) { + + {{ provider.value }} + + } + + + } {{ 'labels.inputs.Trigger Type' | translate }} - - {{ triggerType.value }} - + @for (triggerType of triggerTypes; track triggerType) { + + {{ triggerType.value }} + + } {{ 'labels.inputs.Trigger Type' | translate }} {{ 'labels.commons.is' | translate }} @@ -35,34 +41,34 @@ {{ 'labels.inputs.Is Notification' | translate }}? - - {{ 'labels.inputs.Schedule Date' | translate }} - - - - - {{ 'labels.inputs.Schedule Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - + @if (smsCampaignDetailsForm.controls.recurrenceStartDate) { + + {{ 'labels.inputs.Schedule Date' | translate }} + + + + + {{ 'labels.inputs.Schedule Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + + } {{ 'labels.inputs.Business Rule' | translate }} - - {{ rule.reportName }} - + @for (rule of businessRules; track rule) { + + {{ rule.reportName }} + + } {{ 'labels.inputs.Business Rule' | translate }} {{ 'labels.commons.is' | translate }} diff --git a/src/app/organization/sms-campaigns/sms-campaign-stepper/edit-sms-campaign-step/edit-sms-campaign-step.component.ts b/src/app/organization/sms-campaigns/sms-campaign-stepper/edit-sms-campaign-step/edit-sms-campaign-step.component.ts index 9409de4c6..a7339ea5c 100644 --- a/src/app/organization/sms-campaigns/sms-campaign-stepper/edit-sms-campaign-step/edit-sms-campaign-step.component.ts +++ b/src/app/organization/sms-campaigns/sms-campaign-stepper/edit-sms-campaign-step/edit-sms-campaign-step.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, Output, Input, EventEmitter } from '@angular/core'; +import { Component, OnInit, Output, Input, EventEmitter, inject } from '@angular/core'; import { UntypedFormGroup, Validators, @@ -32,6 +32,10 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class EditSmsCampaignStepComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private reportService = inject(ReportsService); + private settingsService = inject(SettingsService); + /** SMS Campaign Template */ @Input() smsCampaignTemplate: any; /** SMS Campaign */ @@ -62,11 +66,7 @@ export class EditSmsCampaignStepComponent implements OnInit { * @param {ReportsService} reportService Reports Service * @param {SettingsService} settingsService Settings Service. */ - constructor( - private formBuilder: UntypedFormBuilder, - private reportService: ReportsService, - private settingsService: SettingsService - ) { + constructor() { this.createSMSCampaignDetailsForm(); } diff --git a/src/app/organization/sms-campaigns/sms-campaign-stepper/sms-campaign-step/business-rule-parameters/business-rule-parameters.component.ts b/src/app/organization/sms-campaigns/sms-campaign-stepper/sms-campaign-step/business-rule-parameters/business-rule-parameters.component.ts index 3189e986d..5ed0b2338 100644 --- a/src/app/organization/sms-campaigns/sms-campaign-stepper/sms-campaign-step/business-rule-parameters/business-rule-parameters.component.ts +++ b/src/app/organization/sms-campaigns/sms-campaign-stepper/sms-campaign-step/business-rule-parameters/business-rule-parameters.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnChanges, Input, Output, EventEmitter, OnInit } from '@angular/core'; +import { Component, OnChanges, Input, Output, EventEmitter, OnInit, inject } from '@angular/core'; import { Validators, UntypedFormGroup, UntypedFormControl, ReactiveFormsModule } from '@angular/forms'; /** Custom Services */ @@ -31,6 +31,10 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class BusinessRuleParametersComponent implements OnInit, OnChanges { + private reportsService = inject(ReportsService); + private settingsService = inject(SettingsService); + private dateUtils = inject(Dates); + /** Run Report Parameters Data */ @Input() paramData: any; @@ -48,17 +52,6 @@ export class BusinessRuleParametersComponent implements OnInit, OnChanges { /** Template Parameters Event Emitter */ @Output() templateParameters = new EventEmitter(); - /** - * @param {ReportsService} reportsService Reports Service. - * @param {SettingsService} settingsService Settings Service. - * @param {Dates} dateUtils Date Utils. - */ - constructor( - private reportsService: ReportsService, - private settingsService: SettingsService, - private dateUtils: Dates - ) {} - ngOnInit(): void { this.maxDate = this.settingsService.businessDate; } diff --git a/src/app/organization/sms-campaigns/sms-campaign-stepper/sms-campaign-step/sms-campaign-step.component.html b/src/app/organization/sms-campaigns/sms-campaign-stepper/sms-campaign-step/sms-campaign-step.component.html index 12fc99a57..9d159482d 100644 --- a/src/app/organization/sms-campaigns/sms-campaign-stepper/sms-campaign-step/sms-campaign-step.component.html +++ b/src/app/organization/sms-campaigns/sms-campaign-stepper/sms-campaign-step/sms-campaign-step.component.html @@ -9,21 +9,27 @@ - - {{ 'labels.inputs.SMS Provider' | translate }} - - - {{ provider.value }} - - - + @if (!smsCampaignDetailsForm.controls.isNotification.value) { + + {{ 'labels.inputs.SMS Provider' | translate }} + + @for (provider of smsProviders; track provider) { + + {{ provider.value }} + + } + + + } {{ 'labels.inputs.Trigger Type' | translate }} - - {{ triggerType.value }} - + @for (triggerType of triggerTypes; track triggerType) { + + {{ triggerType.value }} + + } {{ 'labels.inputs.Trigger Type' | translate }} {{ 'labels.commons.is' | translate }} @@ -35,78 +41,86 @@ {{ 'labels.inputs.Is Notification' | translate }}? - - {{ 'labels.inputs.Schedule Date' | translate }} - - - - - {{ 'labels.inputs.Schedule Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - + @if (smsCampaignDetailsForm.contains('recurrenceStartDate')) { + + {{ 'labels.inputs.Schedule Date' | translate }} + + + + + {{ 'labels.inputs.Schedule Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + + } - - {{ 'labels.inputs.Repeats' | translate }} - - {{ 'labels.inputs.Daily' | translate }} - {{ 'labels.inputs.Weekly' | translate }} - {{ 'labels.inputs.Monthly' | translate }} - {{ 'labels.inputs.Yearly' | translate }} - - - {{ 'labels.inputs.Repetition Frequency' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - + @if (smsCampaignDetailsForm.contains('frequency')) { + + {{ 'labels.inputs.Repeats' | translate }} + + {{ 'labels.inputs.Daily' | translate }} + {{ 'labels.inputs.Weekly' | translate }} + {{ 'labels.inputs.Monthly' | translate }} + {{ 'labels.inputs.Yearly' | translate }} + + + {{ 'labels.inputs.Repetition Frequency' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + + } - - {{ 'labels.inputs.Repetition Interval' | translate }} - - - {{ interval }} - - - - {{ 'labels.inputs.Repetition Interval' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - + @if (smsCampaignDetailsForm.contains('interval')) { + + {{ 'labels.inputs.Repetition Interval' | translate }} + + @for (interval of repetitionIntervals; track interval) { + + {{ interval }} + + } + + + {{ 'labels.inputs.Repetition Interval' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + + } - - {{ 'labels.inputs.Repeats on Day' | translate }} - - {{ 'labels.inputs.Monday' | translate }} - {{ 'labels.inputs.Tuesday' | translate }} - {{ 'labels.inputs.Wednesday' | translate }} - {{ 'labels.inputs.Thursday' | translate }} - {{ 'labels.inputs.Friday' | translate }} - {{ 'labels.inputs.Saturday' | translate }} - {{ 'labels.inputs.Sunday' | translate }} - - - {{ 'labels.inputs.At least' | translate }} {{ 'labels.inputs.one' | translate }} - {{ 'labels.inputs.day must be selected' | translate }} - - + @if (smsCampaignDetailsForm.contains('repeatsOnDay')) { + + {{ 'labels.inputs.Repeats on Day' | translate }} + + {{ 'labels.inputs.Monday' | translate }} + {{ 'labels.inputs.Tuesday' | translate }} + {{ 'labels.inputs.Wednesday' | translate }} + {{ 'labels.inputs.Thursday' | translate }} + {{ 'labels.inputs.Friday' | translate }} + {{ 'labels.inputs.Saturday' | translate }} + {{ 'labels.inputs.Sunday' | translate }} + + + {{ 'labels.inputs.At least' | translate }} {{ 'labels.inputs.one' | translate }} + {{ 'labels.inputs.day must be selected' | translate }} + + + } {{ 'labels.inputs.Business Rule' | translate }} - - {{ rule.reportName }} - + @for (rule of businessRules; track rule) { + + {{ rule.reportName }} + + } {{ 'labels.inputs.Business Rule' | translate }} {{ 'labels.commons.is' | translate }} @@ -115,24 +129,21 @@
    -
    - - -
    + @if (!smsCampaignDetailsForm.controls.runReportId.value) { +
    + + +
    + } - - + @if (smsCampaignDetailsForm.controls.runReportId.value) { + + + } diff --git a/src/app/organization/sms-campaigns/sms-campaign-stepper/sms-campaign-step/sms-campaign-step.component.ts b/src/app/organization/sms-campaigns/sms-campaign-stepper/sms-campaign-step/sms-campaign-step.component.ts index e3894108a..525f088a4 100644 --- a/src/app/organization/sms-campaigns/sms-campaign-stepper/sms-campaign-step/sms-campaign-step.component.ts +++ b/src/app/organization/sms-campaigns/sms-campaign-stepper/sms-campaign-step/sms-campaign-step.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, Input, ViewChild, EventEmitter, Output } from '@angular/core'; +import { Component, OnInit, Input, ViewChild, EventEmitter, Output, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, @@ -38,6 +38,9 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class SmsCampaignStepComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private reportService = inject(ReportsService); + /** SMS Campaign Template */ @Input() smsCampaignTemplate: any; /** Business Rule Parameters Component */ @@ -68,10 +71,7 @@ export class SmsCampaignStepComponent implements OnInit { * @param {FormBuilder} formBuilder Form Builder * @param {ReportsService} reportService Reports Service */ - constructor( - private formBuilder: UntypedFormBuilder, - private reportService: ReportsService - ) { + constructor() { this.createSMSCampaignDetailsForm(); this.buildDependencies(); } diff --git a/src/app/organization/sms-campaigns/sms-campaigns.component.ts b/src/app/organization/sms-campaigns/sms-campaigns.component.ts index 28eefc620..daecbd101 100644 --- a/src/app/organization/sms-campaigns/sms-campaigns.component.ts +++ b/src/app/organization/sms-campaigns/sms-campaigns.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, ViewChild } from '@angular/core'; +import { Component, OnInit, ViewChild, inject } from '@angular/core'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort, MatSortHeader } from '@angular/material/sort'; import { @@ -54,6 +54,8 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class SmsCampaignsComponent implements OnInit { + private route = inject(ActivatedRoute); + /** SMS Campaigns data. */ smsCampaignsData: any; /** Columns to be displayed in sms campaigns table. */ @@ -77,7 +79,7 @@ export class SmsCampaignsComponent implements OnInit { * Retrieves the SMS campaigns data from `resolve`. * @param {ActivatedRoute} route Activated Route. */ - constructor(private route: ActivatedRoute) { + constructor() { this.route.data.subscribe((data: { smsCampaigns: any }) => { this.smsCampaignsData = data.smsCampaigns.pageItems; }); diff --git a/src/app/organization/sms-campaigns/view-campaign/view-campaign.component.html b/src/app/organization/sms-campaigns/view-campaign/view-campaign.component.html index 509bdab31..92400fbe7 100644 --- a/src/app/organization/sms-campaigns/view-campaign/view-campaign.component.html +++ b/src/app/organization/sms-campaigns/view-campaign/view-campaign.component.html @@ -1,46 +1,54 @@
    - - - + @if (smsCampaignData.campaignStatus.value !== 'active') { + + + + } - - - + @if (smsCampaignData.campaignStatus.value === 'Pending') { + + + + } - - - + @if (smsCampaignData.campaignStatus.value !== 'closed') { + + + + } - - - + @if (smsCampaignData.campaignStatus.value !== 'Pending' && smsCampaignData.campaignStatus.value !== 'active') { + + + + } - - - + @if (smsCampaignData.campaignStatus.value === 'closed') { + + + + }
    @@ -70,9 +78,11 @@ {{ smsCampaignData.smsCampaignTimeLine.submittedOnDate | dateFormat }} - - {{ 'labels.inputs.Recurrence' | translate }} : {{ smsCampaignData.recurrence }} - + @if (smsCampaignData.recurrence) { + + {{ 'labels.inputs.Recurrence' | translate }} : {{ smsCampaignData.recurrence }} + + }

    {{ 'labels.heading.Template Message' | translate }} :

    @@ -82,70 +92,65 @@
    - -
    -
    -
    - - {{ 'labels.inputs.From Date' | translate }} - - - - - - - {{ 'labels.inputs.To Date' | translate }} - - - - - -
    - + @for (tab of smsTabs; track tab) { + +
    + +
    + + {{ 'labels.inputs.From Date' | translate }} + + + + + + {{ 'labels.inputs.To Date' | translate }} + + + + +
    + +
    -
    - - -
    {{ 'labels.inputs.System Defined' | translate }}
    - - + @if (paymentType.isSystemDefined) { + + } + @if (!paymentType.isSystemDefined) { + + }
    {{ 'labels.inputs.Cash Payment' | translate }}
    - - + @if (paymentType.isCashPayment) { + + } + @if (!paymentType.isCashPayment) { + + }
    {{ 'labels.inputs.Actions' | translate }} - - + @if (!paymentType.isSystemDefined) { + + } + @if (!paymentType.isSystemDefined) { + + }
    - - - - - - - - - - - - - - - - - - - - - - -
    {{ 'labels.inputs.Message' | translate }}{{ sms.message }}{{ 'labels.inputs.Status' | translate }}{{ sms.status.value }}{{ 'labels.inputs.Mobile No' | translate }}.{{ sms.mobileNo }}{{ 'labels.inputs.Campaign Name' | translate }}{{ sms.campaignName }}
    -
    - + + + + + + + + + + + + + + + + + + + + +
    {{ 'labels.inputs.Message' | translate }}{{ sms.message }}{{ 'labels.inputs.Status' | translate }}{{ sms.status.value }}{{ 'labels.inputs.Mobile No' | translate }}.{{ sms.mobileNo }}{{ 'labels.inputs.Campaign Name' | translate }}{{ sms.campaignName }}
    + + + } diff --git a/src/app/organization/sms-campaigns/view-campaign/view-campaign.component.ts b/src/app/organization/sms-campaigns/view-campaign/view-campaign.component.ts index 3cdac76e4..6090be280 100644 --- a/src/app/organization/sms-campaigns/view-campaign/view-campaign.component.ts +++ b/src/app/organization/sms-campaigns/view-campaign/view-campaign.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, ViewChild } from '@angular/core'; +import { Component, OnInit, ViewChild, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, ReactiveFormsModule } from '@angular/forms'; import { MatDialog } from '@angular/material/dialog'; import { @@ -63,6 +63,14 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ViewCampaignComponent implements OnInit { + private router = inject(Router); + private route = inject(ActivatedRoute); + dialog = inject(MatDialog); + private formBuilder = inject(UntypedFormBuilder); + private dateUtils = inject(Dates); + private organizationService = inject(OrganizationService); + private settingsService = inject(SettingsService); + /** Minimum date allowed. */ minDate = new Date(2000, 0, 1); /** Maximum date allowed. */ @@ -120,15 +128,7 @@ export class ViewCampaignComponent implements OnInit { * @param {OrganizationService} organizationService Organization Service * @param {SettingsService} settingsService Setting Service */ - constructor( - private router: Router, - private route: ActivatedRoute, - public dialog: MatDialog, - private formBuilder: UntypedFormBuilder, - private dateUtils: Dates, - private organizationService: OrganizationService, - private settingsService: SettingsService - ) { + constructor() { this.route.data.subscribe((data: { smsCampaign: any }) => { this.smsCampaignData = data.smsCampaign; }); @@ -176,7 +176,6 @@ export class ViewCampaignComponent implements OnInit { type: 'date', required: true }) - ]; const data = { title: 'Close SMS Campaign', @@ -214,7 +213,6 @@ export class ViewCampaignComponent implements OnInit { type: 'date', required: true }) - ]; const data = { title: 'Activate SMS Campaign', @@ -252,7 +250,6 @@ export class ViewCampaignComponent implements OnInit { type: 'date', required: true }) - ]; const data = { title: 'Reactivate SMS Campaign', diff --git a/src/app/organization/standing-instructions-history/standing-instructions-history.component.html b/src/app/organization/standing-instructions-history/standing-instructions-history.component.html index 15ff00fa4..d09b3337f 100644 --- a/src/app/organization/standing-instructions-history/standing-instructions-history.component.html +++ b/src/app/organization/standing-instructions-history/standing-instructions-history.component.html @@ -1,153 +1,136 @@
    - -
    - -
    - - {{ 'labels.inputs.Client Name' | translate }} - - - - - {{ 'labels.inputs.Client Id' | translate }} - - - - - {{ 'labels.inputs.Transfer Type' | translate }} - - - {{ transferType.value }} - - - - - - {{ 'labels.inputs.Account Type' | translate }} - - - {{ accountType.value }} - - - - - - {{ 'labels.inputs.From Account ID' | translate }} - - - - - {{ 'labels.inputs.From Date' | translate }} - - - - - - - {{ 'labels.inputs.To Date' | translate }} - - - - -
    -
    - - - - - -
    -
    -
    - -
    - -
    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    {{ 'labels.inputs.From Client' | translate }} - {{ instruction.fromClient.displayName }}({{ instruction.fromClient.id }}) - {{ 'labels.inputs.From Account' | translate }} - {{ instruction.fromAccount.productName }}({{ instruction.fromAccount.id }}) - {{ 'labels.inputs.To Client' | translate }} - {{ instruction.toClient.displayName }}({{ instruction.toClient.id }}) - {{ 'labels.inputs.To Account' | translate }} - {{ instruction.toAccount.productName }}({{ instruction.toAccount.id }}) - {{ 'labels.inputs.Execution Time' | translate }}{{ instruction.executionTime }}{{ 'labels.inputs.Amount' | translate }}{{ instruction.amount | formatNumber }}{{ 'labels.inputs.Status' | translate }}{{ instruction.status }}{{ 'labels.inputs.Error Log' | translate }} - -
    - - -
    + + + + + }
    + +@if (isCollapsed) { +
    + +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {{ 'labels.inputs.From Client' | translate }} + {{ instruction.fromClient.displayName }}({{ instruction.fromClient.id }}) + {{ 'labels.inputs.From Account' | translate }} + {{ instruction.fromAccount.productName }}({{ instruction.fromAccount.id }}) + {{ 'labels.inputs.To Client' | translate }} + {{ instruction.toClient.displayName }}({{ instruction.toClient.id }}) + {{ 'labels.inputs.To Account' | translate }} + {{ instruction.toAccount.productName }}({{ instruction.toAccount.id }}) + {{ 'labels.inputs.Execution Time' | translate }}{{ instruction.executionTime }}{{ 'labels.inputs.Amount' | translate }}{{ instruction.amount | formatNumber }}{{ 'labels.inputs.Status' | translate }}{{ instruction.status }}{{ 'labels.inputs.Error Log' | translate }} + @if (instruction.status === 'failed') { + + } +
    + +
    +
    +} diff --git a/src/app/organization/standing-instructions-history/standing-instructions-history.component.ts b/src/app/organization/standing-instructions-history/standing-instructions-history.component.ts index ede15cacc..8e82aaa6d 100644 --- a/src/app/organization/standing-instructions-history/standing-instructions-history.component.ts +++ b/src/app/organization/standing-instructions-history/standing-instructions-history.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, ViewChild } from '@angular/core'; +import { Component, OnInit, ViewChild, inject } from '@angular/core'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort, MatSortHeader } from '@angular/material/sort'; import { @@ -55,6 +55,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class StandingInstructionsHistoryComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private organizationService = inject(OrganizationService); + private settingsService = inject(SettingsService); + private router = inject(Router); + private route = inject(ActivatedRoute); + private dateUtils = inject(Dates); + /** Minimum Date allowed. */ minDate = new Date(2000, 0, 1); /** Maximum Date allowed. */ @@ -94,14 +101,7 @@ export class StandingInstructionsHistoryComponent implements OnInit { * @param {Router} router Router for navigation. * @param {Dates} dateUtils Date Utils to format date. */ - constructor( - private formBuilder: UntypedFormBuilder, - private organizationService: OrganizationService, - private settingsService: SettingsService, - private router: Router, - private route: ActivatedRoute, - private dateUtils: Dates - ) { + constructor() { this.route.data.subscribe((data: { standingInstructionsTemplate: any }) => { this.standingInstructionsTemplate = data.standingInstructionsTemplate; }); diff --git a/src/app/organization/standing-instructions-history/standing-instructions-template.resolver.ts b/src/app/organization/standing-instructions-history/standing-instructions-template.resolver.ts index 3b68cf938..52205cec9 100644 --- a/src/app/organization/standing-instructions-history/standing-instructions-template.resolver.ts +++ b/src/app/organization/standing-instructions-history/standing-instructions-template.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; /** rxjs Imports */ import { Observable } from 'rxjs'; @@ -12,10 +12,7 @@ import { OrganizationService } from '../organization.service'; */ @Injectable() export class StandingInstructionsTemplateResolver { - /** - * @param {OrganizationService} organizationService Organization service. - */ - constructor(private organizationService: OrganizationService) {} + private organizationService = inject(OrganizationService); /** * Returns the Standing Instruction template. diff --git a/src/app/organization/tellers/cashiers/allocate-cash/allocate-cash.component.html b/src/app/organization/tellers/cashiers/allocate-cash/allocate-cash.component.html index 4116c7d74..d15eea40f 100644 --- a/src/app/organization/tellers/cashiers/allocate-cash/allocate-cash.component.html +++ b/src/app/organization/tellers/cashiers/allocate-cash/allocate-cash.component.html @@ -35,41 +35,51 @@ /> - - {{ 'labels.inputs.Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (allocateCashForm.controls.txnDate.hasError('required')) { + + {{ 'labels.inputs.Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Currency' | translate }} - - {{ currency.name }} - + @for (currency of cashierData.currencyOptions; track currency) { + + {{ currency.name }} + + } - - {{ 'labels.inputs.Currency' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (allocateCashForm.controls.currencyCode.hasError('required')) { + + {{ 'labels.inputs.Currency' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Amount' | translate }} - - {{ 'labels.inputs.Amount' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (allocateCashForm.controls.txnAmount.hasError('required')) { + + {{ 'labels.inputs.Amount' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Notes/Comments' | translate }} - - {{ 'labels.inputs.Notes/Comments' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (allocateCashForm.controls.txnNote.hasError('required')) { + + {{ 'labels.inputs.Notes/Comments' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } diff --git a/src/app/organization/tellers/cashiers/allocate-cash/allocate-cash.component.ts b/src/app/organization/tellers/cashiers/allocate-cash/allocate-cash.component.ts index 772ccee1e..80f3b8f0e 100644 --- a/src/app/organization/tellers/cashiers/allocate-cash/allocate-cash.component.ts +++ b/src/app/organization/tellers/cashiers/allocate-cash/allocate-cash.component.ts @@ -1,5 +1,5 @@ /** Angular Imports. */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormBuilder, UntypedFormGroup, Validators, ReactiveFormsModule } from '@angular/forms'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; import { Dates } from 'app/core/utils/dates'; @@ -21,6 +21,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class AllocateCashComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private route = inject(ActivatedRoute); + private dateUtils = inject(Dates); + private organizationService = inject(OrganizationService); + private settingsService = inject(SettingsService); + private router = inject(Router); + /** Minimum Date allowed. */ minDate = new Date(2000, 0, 1); /** Maximum Date allowed. */ @@ -39,14 +46,7 @@ export class AllocateCashComponent implements OnInit { * @param {SettingsService} settingsService Settings Service. * @param {Router} router Router. */ - constructor( - private formBuilder: UntypedFormBuilder, - private route: ActivatedRoute, - private dateUtils: Dates, - private organizationService: OrganizationService, - private settingsService: SettingsService, - private router: Router - ) { + constructor() { this.route.data.subscribe((data: { cashierTemplate: any }) => { this.cashierData = data.cashierTemplate; }); diff --git a/src/app/organization/tellers/cashiers/cashiers.component.ts b/src/app/organization/tellers/cashiers/cashiers.component.ts index de009cb01..cd334e36a 100644 --- a/src/app/organization/tellers/cashiers/cashiers.component.ts +++ b/src/app/organization/tellers/cashiers/cashiers.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, ViewChild } from '@angular/core'; +import { Component, OnInit, ViewChild, inject } from '@angular/core'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort, MatSortHeader } from '@angular/material/sort'; import { @@ -51,6 +51,8 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class CashiersComponent implements OnInit { + private route = inject(ActivatedRoute); + /** Cashiers data. */ cashiersData: any; /** Columns to be displayed in cashiers table. */ @@ -72,7 +74,7 @@ export class CashiersComponent implements OnInit { * Retrieves the cashiers data from `resolve`. * @param {ActivatedRoute} route Activated Route. */ - constructor(private route: ActivatedRoute) { + constructor() { this.route.data.subscribe((data: { cashiersData: any }) => { this.cashiersData = data.cashiersData.cashiers; }); diff --git a/src/app/organization/tellers/cashiers/create-cashier/create-cashier.component.html b/src/app/organization/tellers/cashiers/create-cashier/create-cashier.component.html index ebc7af16b..347b0e57c 100644 --- a/src/app/organization/tellers/cashiers/create-cashier/create-cashier.component.html +++ b/src/app/organization/tellers/cashiers/create-cashier/create-cashier.component.html @@ -16,14 +16,18 @@ {{ 'labels.inputs.Cashier' | translate }} - - {{ staff.displayName }} - + @for (staff of cashierTemplate.staffOptions; track staff) { + + {{ staff.displayName }} + + } - - {{ 'labels.inputs.Cashier' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (createCashierForm.controls.staffId.hasError('required')) { + + {{ 'labels.inputs.Cashier' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } @@ -43,10 +47,12 @@ /> - - {{ 'labels.inputs.From Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (createCashierForm.controls.startDate.hasError('required')) { + + {{ 'labels.inputs.From Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } @@ -61,10 +67,12 @@ /> - - {{ 'labels.inputs.To Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (createCashierForm.controls.endDate.hasError('required')) { + + {{ 'labels.inputs.To Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + }
    diff --git a/src/app/organization/tellers/cashiers/create-cashier/create-cashier.component.ts b/src/app/organization/tellers/cashiers/create-cashier/create-cashier.component.ts index f2c54407d..9153d924d 100644 --- a/src/app/organization/tellers/cashiers/create-cashier/create-cashier.component.ts +++ b/src/app/organization/tellers/cashiers/create-cashier/create-cashier.component.ts @@ -1,5 +1,5 @@ /** Angular Imports. */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, Validators, ReactiveFormsModule } from '@angular/forms'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; import { Dates } from 'app/core/utils/dates'; @@ -23,6 +23,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class CreateCashierComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private route = inject(ActivatedRoute); + private router = inject(Router); + private dateUtils = inject(Dates); + private organizationService = inject(OrganizationService); + private settingsService = inject(SettingsService); + /** Minimum Date allowed. */ minDate = new Date(2000, 0, 1); /** Maximum Date allowed. */ @@ -41,14 +48,7 @@ export class CreateCashierComponent implements OnInit { * @param {OrganizationService} organizationService Organization Service. * @param {SettingsService} settingsService Settings Service. */ - constructor( - private formBuilder: UntypedFormBuilder, - private route: ActivatedRoute, - private router: Router, - private dateUtils: Dates, - private organizationService: OrganizationService, - private settingsService: SettingsService - ) { + constructor() { this.route.data.subscribe((data: { cashierTemplate: any }) => { this.cashierTemplate = data.cashierTemplate; }); diff --git a/src/app/organization/tellers/cashiers/edit-cashier/edit-cashier.component.html b/src/app/organization/tellers/cashiers/edit-cashier/edit-cashier.component.html index 1da783ac4..758f42ea9 100644 --- a/src/app/organization/tellers/cashiers/edit-cashier/edit-cashier.component.html +++ b/src/app/organization/tellers/cashiers/edit-cashier/edit-cashier.component.html @@ -13,23 +13,31 @@ - - {{ 'labels.inputs.Cashier' | translate }} - - - {{ staff.displayName }} - - - + @if (isStaffId) { + + {{ 'labels.inputs.Cashier' | translate }} + + @for (staff of cashierData.template.staffOptions; track staff) { + + {{ staff.displayName }} + + } + + + } - - {{ 'labels.inputs.Cashier' | translate }} - - - {{ 'labels.inputs.Select Option' | translate }} - - - + @if (!isStaffId) { + + {{ 'labels.inputs.Cashier' | translate }} + @if (!isStaffId) { + + + {{ 'labels.inputs.Select Option' | translate }} + + + } + + } {{ 'labels.inputs.Description/Notes' | translate }} @@ -48,10 +56,12 @@ /> - - {{ 'labels.inputs.From Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (editCashierForm.controls.startDate.hasError('required')) { + + {{ 'labels.inputs.From Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } @@ -66,10 +76,12 @@ /> - - {{ 'labels.inputs.To Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (editCashierForm.controls.endDate.hasError('required')) { + + {{ 'labels.inputs.To Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + }
    diff --git a/src/app/organization/tellers/cashiers/edit-cashier/edit-cashier.component.ts b/src/app/organization/tellers/cashiers/edit-cashier/edit-cashier.component.ts index 4abf0bab3..f3eef561a 100644 --- a/src/app/organization/tellers/cashiers/edit-cashier/edit-cashier.component.ts +++ b/src/app/organization/tellers/cashiers/edit-cashier/edit-cashier.component.ts @@ -1,5 +1,5 @@ /** Angular Imports. */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, Validators, ReactiveFormsModule } from '@angular/forms'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; import { Dates } from 'app/core/utils/dates'; @@ -23,6 +23,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class EditCashierComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private route = inject(ActivatedRoute); + private router = inject(Router); + private dateUtils = inject(Dates); + private organizationService = inject(OrganizationService); + private settingsService = inject(SettingsService); + /** Cashier Data. */ cashierData: any = new Object(); /** Edit cashier form. */ @@ -43,14 +50,7 @@ export class EditCashierComponent implements OnInit { * @param {OrganizationService} organizationService Organization Service. * @param {SettingsService} settingsService Settings Service. */ - constructor( - private formBuilder: UntypedFormBuilder, - private route: ActivatedRoute, - private router: Router, - private dateUtils: Dates, - private organizationService: OrganizationService, - private settingsService: SettingsService - ) { + constructor() { this.route.data.subscribe((data: { cashier: any; cashierTemplate: any }) => { this.cashierData.data = data.cashier; this.cashierData.template = data.cashierTemplate; diff --git a/src/app/organization/tellers/cashiers/settle-cash/settle-cash.component.html b/src/app/organization/tellers/cashiers/settle-cash/settle-cash.component.html index 68c41fd96..9c52e8693 100644 --- a/src/app/organization/tellers/cashiers/settle-cash/settle-cash.component.html +++ b/src/app/organization/tellers/cashiers/settle-cash/settle-cash.component.html @@ -35,41 +35,51 @@ /> - - {{ 'labels.inputs.Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (settleCashForm.controls.txnDate.hasError('required')) { + + {{ 'labels.inputs.Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Currency' | translate }} - - {{ currency.name }} - + @for (currency of cashierData.currencyOptions; track currency) { + + {{ currency.name }} + + } - - {{ 'labels.inputs.Currency' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (settleCashForm.controls.currencyCode.hasError('required')) { + + {{ 'labels.inputs.Currency' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Amount' | translate }} - - {{ 'labels.inputs.Amount' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (settleCashForm.controls.txnAmount.hasError('required')) { + + {{ 'labels.inputs.Amount' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Notes/Comments' | translate }} - - {{ 'labels.inputs.Notes/Comments' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (settleCashForm.controls.txnNote.hasError('required')) { + + {{ 'labels.inputs.Notes/Comments' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + }
    diff --git a/src/app/organization/tellers/cashiers/settle-cash/settle-cash.component.ts b/src/app/organization/tellers/cashiers/settle-cash/settle-cash.component.ts index 72012689b..7645cd97c 100644 --- a/src/app/organization/tellers/cashiers/settle-cash/settle-cash.component.ts +++ b/src/app/organization/tellers/cashiers/settle-cash/settle-cash.component.ts @@ -1,5 +1,5 @@ /** Angular Imports. */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, Validators, ReactiveFormsModule } from '@angular/forms'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; import { Dates } from 'app/core/utils/dates'; @@ -18,6 +18,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class SettleCashComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private route = inject(ActivatedRoute); + private dateUtils = inject(Dates); + private organizationService = inject(OrganizationService); + private settingsService = inject(SettingsService); + private router = inject(Router); + /** Minimum Date allowed. */ minDate = new Date(2000, 0, 1); /** Maximum Date allowed. */ @@ -36,14 +43,7 @@ export class SettleCashComponent implements OnInit { * @param {SettingsService} settingsService Settings Service. * @param {Router} router Router. */ - constructor( - private formBuilder: UntypedFormBuilder, - private route: ActivatedRoute, - private dateUtils: Dates, - private organizationService: OrganizationService, - private settingsService: SettingsService, - private router: Router - ) { + constructor() { this.route.data.subscribe((data: { cashierTemplate: any }) => { this.cashierData = data.cashierTemplate; }); diff --git a/src/app/organization/tellers/cashiers/transactions/transactions.component.html b/src/app/organization/tellers/cashiers/transactions/transactions.component.html index 928de59ec..01248b12d 100644 --- a/src/app/organization/tellers/cashiers/transactions/transactions.component.html +++ b/src/app/organization/tellers/cashiers/transactions/transactions.component.html @@ -19,43 +19,38 @@
    -
    - - -
    -
    - {{ 'labels.inputs.Branch' | translate }} +@if (cashierData) { +
    + + +
    +
    + {{ 'labels.inputs.Branch' | translate }} +
    +
    + {{ cashierData.officeName }} +
    +
    + {{ 'labels.inputs.Teller' | translate }} +
    +
    + {{ cashierData.tellerName }} +
    +
    + {{ 'labels.inputs.Cashier' | translate }} +
    +
    + {{ cashierData.cashierName }} +
    +
    + {{ 'labels.inputs.Net Cash' | translate }} +
    +
    {{ cashierData.netCash | formatNumber }} [{{ currencySelector.value }}]
    - -
    - {{ cashierData.officeName }} -
    - -
    - {{ 'labels.inputs.Teller' | translate }} -
    - -
    - {{ cashierData.tellerName }} -
    - -
    - {{ 'labels.inputs.Cashier' | translate }} -
    - -
    - {{ cashierData.cashierName }} -
    - -
    - {{ 'labels.inputs.Net Cash' | translate }} -
    - -
    {{ cashierData.netCash | formatNumber }} [{{ currencySelector.value }}]
    -
    - - -
    + + +
    +}
    @@ -68,66 +63,63 @@ {{ 'labels.inputs.Select Currency' | translate }} - - {{ currency.name }} - + @for (currency of currencyData; track currency) { + + {{ currency.name }} + + }
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    {{ 'labels.inputs.Date' | translate }}{{ transaction.txnDate | dateFormat }}{{ 'labels.inputs.Transactions' | translate }}{{ transaction.txnType.value }} - {{ 'labels.inputs.Allocation' | translate }} ({{ cashierData.sumCashAllocation | formatNumber }}) - - {{ transaction.txnType.value === 'Allocate Cash' ? (transaction.txnAmount | formatNumber) : '-' }} - - {{ 'labels.inputs.Cash In' | translate }} ({{ cashierData.sumInwardCash | formatNumber }}) - - {{ transaction.txnType.value === 'Cash In' ? (transaction.txnAmount | formatNumber) : '-' }} - - {{ 'labels.inputs.Cash Out' | translate }} ({{ cashierData.sumOutwardCash | formatNumber }}) - - {{ transaction.txnType.value === 'Cash Out' ? (transaction.txnAmount | formatNumber) : '-' }} - - {{ 'labels.inputs.Settlement' | translate }} ({{ cashierData.sumCashSettlement | formatNumber }}) - - {{ transaction.txnType.value === 'Settle Cash' ? (transaction.txnAmount | formatNumber) : '-' }} -
    - - -
    + @if (cashierData) { +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {{ 'labels.inputs.Date' | translate }}{{ transaction.txnDate | dateFormat }}{{ 'labels.inputs.Transactions' | translate }}{{ transaction.txnType.value }} + {{ 'labels.inputs.Allocation' | translate }} ({{ cashierData.sumCashAllocation | formatNumber }}) + + {{ transaction.txnType.value === 'Allocate Cash' ? (transaction.txnAmount | formatNumber) : '-' }} + + {{ 'labels.inputs.Cash In' | translate }} ({{ cashierData.sumInwardCash | formatNumber }}) + + {{ transaction.txnType.value === 'Cash In' ? (transaction.txnAmount | formatNumber) : '-' }} + + {{ 'labels.inputs.Cash Out' | translate }} ({{ cashierData.sumOutwardCash | formatNumber }}) + + {{ transaction.txnType.value === 'Cash Out' ? (transaction.txnAmount | formatNumber) : '-' }} + + {{ 'labels.inputs.Settlement' | translate }} ({{ cashierData.sumCashSettlement | formatNumber }}) + + {{ transaction.txnType.value === 'Settle Cash' ? (transaction.txnAmount | formatNumber) : '-' }} +
    + +
    + }
    diff --git a/src/app/organization/tellers/cashiers/transactions/transactions.component.ts b/src/app/organization/tellers/cashiers/transactions/transactions.component.ts index 58f3ca3b1..dfc3120cc 100644 --- a/src/app/organization/tellers/cashiers/transactions/transactions.component.ts +++ b/src/app/organization/tellers/cashiers/transactions/transactions.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, ViewChild } from '@angular/core'; +import { Component, OnInit, ViewChild, inject } from '@angular/core'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort, MatSortHeader } from '@angular/material/sort'; import { @@ -53,6 +53,9 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class TransactionsComponent implements OnInit { + private organizationService = inject(OrganizationService); + private route = inject(ActivatedRoute); + /** Currency selector. */ currencySelector = new UntypedFormControl(); /** Cashier Id */ @@ -85,10 +88,7 @@ export class TransactionsComponent implements OnInit { * @param {OrganizationService} organizationService Organization Service. * @param {ActivatedRoute} route Activated Route. */ - constructor( - private organizationService: OrganizationService, - private route: ActivatedRoute - ) { + constructor() { this.route.data.subscribe((data: { currencies: any }) => { this.currencyData = data.currencies.selectedCurrencyOptions; }); diff --git a/src/app/organization/tellers/cashiers/view-cashier/view-cashier.component.html b/src/app/organization/tellers/cashiers/view-cashier/view-cashier.component.html index d1441c366..2e4571609 100644 --- a/src/app/organization/tellers/cashiers/view-cashier/view-cashier.component.html +++ b/src/app/organization/tellers/cashiers/view-cashier/view-cashier.component.html @@ -29,13 +29,17 @@ {{ cashierData.tellerName }} -
    - {{ 'labels.inputs.Description' | translate }} -
    + @if (cashierData.description !== '') { +
    + {{ 'labels.inputs.Description' | translate }} +
    + } -
    - {{ cashierData.description }} -
    + @if (cashierData.description !== '') { +
    + {{ cashierData.description }} +
    + }
    {{ 'labels.inputs.Start Date' | translate }} diff --git a/src/app/organization/tellers/cashiers/view-cashier/view-cashier.component.ts b/src/app/organization/tellers/cashiers/view-cashier/view-cashier.component.ts index 4903726d4..8362baae1 100644 --- a/src/app/organization/tellers/cashiers/view-cashier/view-cashier.component.ts +++ b/src/app/organization/tellers/cashiers/view-cashier/view-cashier.component.ts @@ -1,5 +1,5 @@ /** Angular Imports. */ -import { Component } from '@angular/core'; +import { Component, inject } from '@angular/core'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; /** Custom Dialogs */ @@ -26,6 +26,11 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ViewCashierComponent { + private route = inject(ActivatedRoute); + private router = inject(Router); + private organizationService = inject(OrganizationService); + dialog = inject(MatDialog); + /** Cashier data. */ cashierData: any; @@ -36,12 +41,7 @@ export class ViewCashierComponent { * @param {OrganizationService} organizationService Organization Service * @param {MatDialog} dialog Mat Dialog */ - constructor( - private route: ActivatedRoute, - private router: Router, - private organizationService: OrganizationService, - public dialog: MatDialog - ) { + constructor() { this.route.data.subscribe((data: { cashier: any }) => { this.cashierData = data.cashier; }); diff --git a/src/app/organization/tellers/common-resolvers/cashier.resolver.ts b/src/app/organization/tellers/common-resolvers/cashier.resolver.ts index 9b2b52e2c..2099b56cf 100644 --- a/src/app/organization/tellers/common-resolvers/cashier.resolver.ts +++ b/src/app/organization/tellers/common-resolvers/cashier.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { OrganizationService } from 'app/organization/organization.service'; */ @Injectable() export class CashierResolver { - /** - * @param {OrganizationService} organizationService Organization service. - */ - constructor(private organizationService: OrganizationService) {} + private organizationService = inject(OrganizationService); /** * Returns the cashier data. diff --git a/src/app/organization/tellers/common-resolvers/cashiers.resolver.ts b/src/app/organization/tellers/common-resolvers/cashiers.resolver.ts index d8cd28ae0..539bee3a9 100644 --- a/src/app/organization/tellers/common-resolvers/cashiers.resolver.ts +++ b/src/app/organization/tellers/common-resolvers/cashiers.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { OrganizationService } from 'app/organization/organization.service'; */ @Injectable() export class CashiersResolver { - /** - * @param {OrganizationService} organizationService Organization service. - */ - constructor(private organizationService: OrganizationService) {} + private organizationService = inject(OrganizationService); /** * Returns the cashiers data. diff --git a/src/app/organization/tellers/common-resolvers/edit-cashier.resolver.ts b/src/app/organization/tellers/common-resolvers/edit-cashier.resolver.ts index 067ef3623..ea866fb8a 100644 --- a/src/app/organization/tellers/common-resolvers/edit-cashier.resolver.ts +++ b/src/app/organization/tellers/common-resolvers/edit-cashier.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { OrganizationService } from 'app/organization/organization.service'; */ @Injectable() export class EditCashierResolver { - /** - * @param {OrganizationService} organizationService Organization service. - */ - constructor(private organizationService: OrganizationService) {} + private organizationService = inject(OrganizationService); /** * Returns the cashier template. diff --git a/src/app/organization/tellers/common-resolvers/teller-transaction-template.resolver.ts b/src/app/organization/tellers/common-resolvers/teller-transaction-template.resolver.ts index 69ed4cd6b..6af1ece84 100644 --- a/src/app/organization/tellers/common-resolvers/teller-transaction-template.resolver.ts +++ b/src/app/organization/tellers/common-resolvers/teller-transaction-template.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { OrganizationService } from 'app/organization/organization.service'; */ @Injectable() export class CashierTransactionTemplateResolver { - /** - * @param {OrganizationService} organizationService Organization service. - */ - constructor(private organizationService: OrganizationService) {} + private organizationService = inject(OrganizationService); /** * Returns the cashier transaction data. diff --git a/src/app/organization/tellers/common-resolvers/teller.resolver.ts b/src/app/organization/tellers/common-resolvers/teller.resolver.ts index 40ea8cf2b..2d056d2d6 100644 --- a/src/app/organization/tellers/common-resolvers/teller.resolver.ts +++ b/src/app/organization/tellers/common-resolvers/teller.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { OrganizationService } from 'app/organization/organization.service'; */ @Injectable() export class TellerResolver { - /** - * @param {OrganizationService} organizationService Organization service. - */ - constructor(private organizationService: OrganizationService) {} + private organizationService = inject(OrganizationService); /** * Returns the teller data. diff --git a/src/app/organization/tellers/common-resolvers/tellers.resolver.ts b/src/app/organization/tellers/common-resolvers/tellers.resolver.ts index 022c8383d..3b309d5df 100644 --- a/src/app/organization/tellers/common-resolvers/tellers.resolver.ts +++ b/src/app/organization/tellers/common-resolvers/tellers.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; /** rxjs Imports */ import { Observable } from 'rxjs'; @@ -12,10 +12,7 @@ import { OrganizationService } from '../../organization.service'; */ @Injectable() export class TellersResolver { - /** - * @param {OrganizationService} organizationService Organization service. - */ - constructor(private organizationService: OrganizationService) {} + private organizationService = inject(OrganizationService); /** * Returns the Tellers data. diff --git a/src/app/organization/tellers/create-teller/create-teller.component.html b/src/app/organization/tellers/create-teller/create-teller.component.html index 8f903d70f..df5f75ecf 100644 --- a/src/app/organization/tellers/create-teller/create-teller.component.html +++ b/src/app/organization/tellers/create-teller/create-teller.component.html @@ -6,27 +6,35 @@ {{ 'labels.inputs.Teller Name' | translate }} - - {{ 'labels.inputs.Teller Name' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - {{ 'labels.inputs.Teller Name' | translate }} {{ 'labels.commons.cannot' | translate }} - {{ 'labels.commons.begin with a special character or number' | translate }} - + @if (tellerForm.controls.name.hasError('required')) { + + {{ 'labels.inputs.Teller Name' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + @if (tellerForm.controls.name.hasError('pattern')) { + + {{ 'labels.inputs.Teller Name' | translate }} {{ 'labels.commons.cannot' | translate }} + {{ 'labels.commons.begin with a special character or number' | translate }} + + } {{ 'labels.inputs.Office' | translate }} - - {{ office.name }} - + @for (office of officeData; track office) { + + {{ office.name }} + + } - - {{ 'labels.inputs.Office' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (tellerForm.controls.officeId.hasError('required')) { + + {{ 'labels.inputs.Office' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } @@ -46,10 +54,12 @@ /> - - {{ 'labels.inputs.Start Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (tellerForm.controls.startDate.hasError('required')) { + + {{ 'labels.inputs.Start Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } @@ -68,14 +78,18 @@ {{ 'labels.inputs.Status' | translate }} - - {{ tellerStatus.value }} - + @for (tellerStatus of tellerStatusesData; track tellerStatus) { + + {{ tellerStatus.value }} + + } - - {{ 'labels.inputs.Status' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (tellerForm.controls.status.hasError('required')) { + + {{ 'labels.inputs.Status' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + }
    diff --git a/src/app/organization/tellers/create-teller/create-teller.component.ts b/src/app/organization/tellers/create-teller/create-teller.component.ts index 7e25df92c..eca15ae01 100644 --- a/src/app/organization/tellers/create-teller/create-teller.component.ts +++ b/src/app/organization/tellers/create-teller/create-teller.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, Validators, ReactiveFormsModule } from '@angular/forms'; import { Router, ActivatedRoute, RouterLink } from '@angular/router'; @@ -23,6 +23,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class CreateTellerComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private organizationService = inject(OrganizationService); + private settingsService = inject(SettingsService); + private route = inject(ActivatedRoute); + private router = inject(Router); + private dateUtils = inject(Dates); + /** Minimum date allowed. */ minDate = new Date(2000, 0, 1); /** Maximum date allowed. */ @@ -43,14 +50,7 @@ export class CreateTellerComponent implements OnInit { * @param {Router} router Router for navigation. * @param {Dates} dateUtils Date Utils to format date. */ - constructor( - private formBuilder: UntypedFormBuilder, - private organizationService: OrganizationService, - private settingsService: SettingsService, - private route: ActivatedRoute, - private router: Router, - private dateUtils: Dates - ) { + constructor() { this.route.data.subscribe((data: { offices: any }) => { this.officeData = data.offices; }); @@ -81,7 +81,8 @@ export class CreateTellerComponent implements OnInit { '', [ Validators.required, - Validators.pattern('(^[A-z]).*')] + Validators.pattern('(^[A-z]).*') + ] ], description: [''], startDate: [ diff --git a/src/app/organization/tellers/edit-teller/edit-teller.component.html b/src/app/organization/tellers/edit-teller/edit-teller.component.html index 9a53cefb1..cb2488263 100644 --- a/src/app/organization/tellers/edit-teller/edit-teller.component.html +++ b/src/app/organization/tellers/edit-teller/edit-teller.component.html @@ -6,22 +6,28 @@ {{ 'labels.inputs.Teller Name' | translate }} - - {{ 'labels.inputs.Teller Name' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - {{ 'labels.inputs.Teller Name' | translate }} {{ 'labels.commons.cannot' | translate }} - {{ 'labels.commons.begin with a special character or number' | translate }} - + @if (tellerForm.controls.name.hasError('required')) { + + {{ 'labels.inputs.Teller Name' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + @if (tellerForm.controls.name.hasError('pattern')) { + + {{ 'labels.inputs.Teller Name' | translate }} {{ 'labels.commons.cannot' | translate }} + {{ 'labels.commons.begin with a special character or number' | translate }} + + } {{ 'labels.inputs.Office' | translate }} - - {{ office.name }} - + @for (office of officeData; track office) { + + {{ office.name }} + + } @@ -42,10 +48,12 @@ /> - - {{ 'labels.inputs.Start Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (tellerForm.controls.startDate.hasError('required')) { + + {{ 'labels.inputs.Start Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } @@ -64,14 +72,18 @@ {{ 'labels.inputs.Status' | translate }} - - {{ tellerStatus.value }} - + @for (tellerStatus of tellerStatusesData; track tellerStatus) { + + {{ tellerStatus.value }} + + } - - {{ 'labels.inputs.Status' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (tellerForm.controls.status.hasError('required')) { + + {{ 'labels.inputs.Status' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } diff --git a/src/app/organization/tellers/edit-teller/edit-teller.component.ts b/src/app/organization/tellers/edit-teller/edit-teller.component.ts index d481111c7..bffd03fe5 100644 --- a/src/app/organization/tellers/edit-teller/edit-teller.component.ts +++ b/src/app/organization/tellers/edit-teller/edit-teller.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, Validators, ReactiveFormsModule } from '@angular/forms'; import { Router, ActivatedRoute, RouterLink } from '@angular/router'; @@ -22,6 +22,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class EditTellerComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private organizationService = inject(OrganizationService); + private settingsService = inject(SettingsService); + private route = inject(ActivatedRoute); + private router = inject(Router); + private dateUtils = inject(Dates); + /** Minimum date allowed. */ minDate = new Date(2000, 0, 1); /** Maximum date allowed. */ @@ -44,14 +51,7 @@ export class EditTellerComponent implements OnInit { * @param {Router} router Router for navigation. * @param {Dates} dateUtils Date Utils to format date. */ - constructor( - private formBuilder: UntypedFormBuilder, - private organizationService: OrganizationService, - private settingsService: SettingsService, - private route: ActivatedRoute, - private router: Router, - private dateUtils: Dates - ) { + constructor() { this.route.data.subscribe((data: { teller: any; offices: any }) => { this.tellerData = data.teller; this.officeData = data.offices; @@ -88,7 +88,8 @@ export class EditTellerComponent implements OnInit { this.tellerData.name, [ Validators.required, - Validators.pattern('(^[A-z]).*')] + Validators.pattern('(^[A-z]).*') + ] ], description: [this.tellerData.description], startDate: [ diff --git a/src/app/organization/tellers/teller-transaction-template.resolver.ts b/src/app/organization/tellers/teller-transaction-template.resolver.ts index 85850a309..3ac74ffaf 100644 --- a/src/app/organization/tellers/teller-transaction-template.resolver.ts +++ b/src/app/organization/tellers/teller-transaction-template.resolver.ts @@ -16,6 +16,7 @@ export class CashierTransactionTemplateResolver implements Resolve { /** * @param {OrganizationService} organizationService Organization service. */ + // eslint-disable-next-line @angular-eslint/prefer-inject constructor(private organizationService: OrganizationService) {} /** diff --git a/src/app/organization/tellers/tellers.component.ts b/src/app/organization/tellers/tellers.component.ts index 00ee160e0..1ae9add8b 100644 --- a/src/app/organization/tellers/tellers.component.ts +++ b/src/app/organization/tellers/tellers.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, ViewChild } from '@angular/core'; +import { Component, OnInit, ViewChild, inject } from '@angular/core'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort, MatSortHeader } from '@angular/material/sort'; import { @@ -52,6 +52,8 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class TellersComponent implements OnInit { + private route = inject(ActivatedRoute); + /** Tellers data. */ tellersData: any; /** Columns to be displayed in tellers table. */ @@ -74,7 +76,7 @@ export class TellersComponent implements OnInit { * Retrieves the tellers data from `resolve`. * @param {ActivatedRoute} route Activated Route. */ - constructor(private route: ActivatedRoute) { + constructor() { this.route.data.subscribe((data: { tellers: any }) => { this.tellersData = data.tellers; }); diff --git a/src/app/organization/tellers/view-teller/view-teller.component.html b/src/app/organization/tellers/view-teller/view-teller.component.html index c4b17c3d8..7336f27ce 100644 --- a/src/app/organization/tellers/view-teller/view-teller.component.html +++ b/src/app/organization/tellers/view-teller/view-teller.component.html @@ -29,13 +29,17 @@ {{ tellerData.officeName }} -
    - {{ 'labels.inputs.Description' | translate }} -
    + @if (tellerData.description) { +
    + {{ 'labels.inputs.Description' | translate }} +
    + } -
    - {{ tellerData.description }} -
    + @if (tellerData.description) { +
    + {{ tellerData.description }} +
    + }
    {{ 'labels.inputs.Start Date' | translate }} @@ -45,13 +49,17 @@ {{ tellerData.startDate | dateFormat }}
    -
    - {{ 'labels.inputs.End Date' | translate }} -
    + @if (tellerData.endDate) { +
    + {{ 'labels.inputs.End Date' | translate }} +
    + } -
    - {{ tellerData.endDate | dateFormat }} -
    + @if (tellerData.endDate) { +
    + {{ tellerData.endDate | dateFormat }} +
    + }
    {{ 'labels.inputs.Status' | translate }} diff --git a/src/app/organization/tellers/view-teller/view-teller.component.ts b/src/app/organization/tellers/view-teller/view-teller.component.ts index e99791a4c..ebfdc6a31 100644 --- a/src/app/organization/tellers/view-teller/view-teller.component.ts +++ b/src/app/organization/tellers/view-teller/view-teller.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component } from '@angular/core'; +import { Component, inject } from '@angular/core'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; import { MatDialog } from '@angular/material/dialog'; @@ -9,7 +9,7 @@ import { OrganizationService } from 'app/organization/organization.service'; /** Custom Components */ import { DeleteDialogComponent } from '../../../shared/delete-dialog/delete-dialog.component'; import { FaIconComponent } from '@fortawesome/angular-fontawesome'; -import { NgIf, TitleCasePipe } from '@angular/common'; +import { TitleCasePipe } from '@angular/common'; import { DateFormatPipe } from '../../../pipes/date-format.pipe'; import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; @@ -28,6 +28,11 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ViewTellerComponent { + private organizationService = inject(OrganizationService); + private route = inject(ActivatedRoute); + private router = inject(Router); + dialog = inject(MatDialog); + /** Teller data. */ tellerData: any; @@ -38,12 +43,7 @@ export class ViewTellerComponent { * @param {Router} router Router for navigation. * @param {MatDialog} dialog Dialog reference. */ - constructor( - private organizationService: OrganizationService, - private route: ActivatedRoute, - private router: Router, - public dialog: MatDialog - ) { + constructor() { this.route.data.subscribe((data: { teller: any }) => { this.tellerData = data.teller; }); diff --git a/src/app/organization/working-days/working-days.component.html b/src/app/organization/working-days/working-days.component.html index d08c4359a..ccb1254ad 100644 --- a/src/app/organization/working-days/working-days.component.html +++ b/src/app/organization/working-days/working-days.component.html @@ -6,23 +6,24 @@
    {{ 'labels.inputs.Working Days' | translate }}
    -
    - - {{ weekDays[i].name }} - -
    + @for (day of recurrence.controls; track day; let i = $index) { +
    + + {{ weekDays[i].name }} + +
    + }
    {{ 'labels.inputs.Payments due on non working days' | translate }} - - {{ repaymentRescheduleType.value }} - + @for (repaymentRescheduleType of repaymentRescheduleTypeData; track repaymentRescheduleType) { + + {{ repaymentRescheduleType.value }} + + } diff --git a/src/app/organization/working-days/working-days.component.ts b/src/app/organization/working-days/working-days.component.ts index e7ac52633..3c0e2fec9 100644 --- a/src/app/organization/working-days/working-days.component.ts +++ b/src/app/organization/working-days/working-days.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, TemplateRef, ElementRef, ViewChild, AfterViewInit } from '@angular/core'; +import { Component, OnInit, TemplateRef, ElementRef, ViewChild, AfterViewInit, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, @@ -37,6 +37,15 @@ const recurrenceDefaultValue = 'FREQ=WEEKLY;INTERVAL=1;BYDAY='; ] }) export class WorkingDaysComponent implements OnInit, AfterViewInit { + private formBuilder = inject(UntypedFormBuilder); + private route = inject(ActivatedRoute); + private organizationService = inject(OrganizationService); + private settingsService = inject(SettingsService); + private router = inject(Router); + private dialog = inject(MatDialog); + private configurationWizardService = inject(ConfigurationWizardService); + private popoverService = inject(PopoverService); + /** Working days form. */ workingDaysForm: UntypedFormGroup; /** Working days data. */ @@ -70,16 +79,7 @@ export class WorkingDaysComponent implements OnInit, AfterViewInit { * @param {ConfigurationWizardService} configurationWizardService ConfigurationWizard Service. * @param {PopoverService} popoverService PopoverService. */ - constructor( - private formBuilder: UntypedFormBuilder, - private route: ActivatedRoute, - private organizationService: OrganizationService, - private settingsService: SettingsService, - private router: Router, - private dialog: MatDialog, - private configurationWizardService: ConfigurationWizardService, - private popoverService: PopoverService - ) { + constructor() { this.route.data.subscribe((data: { workingDays: any }) => { this.workingDaysData = data.workingDays; }); diff --git a/src/app/organization/working-days/working-days.resolver.ts b/src/app/organization/working-days/working-days.resolver.ts index 29eb016d7..bab5a6830 100644 --- a/src/app/organization/working-days/working-days.resolver.ts +++ b/src/app/organization/working-days/working-days.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; /** rxjs Imports */ import { Observable } from 'rxjs'; @@ -12,10 +12,7 @@ import { OrganizationService } from '../organization.service'; */ @Injectable() export class WorkingDaysResolver { - /** - * @param {OrganizationService} organizationService Organization service. - */ - constructor(private organizationService: OrganizationService) {} + private organizationService = inject(OrganizationService); /** * Returns the working days data. diff --git a/src/app/pipes/date-format.pipe.ts b/src/app/pipes/date-format.pipe.ts index b15e93779..b985863e2 100644 --- a/src/app/pipes/date-format.pipe.ts +++ b/src/app/pipes/date-format.pipe.ts @@ -1,10 +1,10 @@ -import { Pipe, PipeTransform } from '@angular/core'; +import { Pipe, PipeTransform, inject } from '@angular/core'; import { SettingsService } from 'app/settings/settings.service'; import moment from 'moment'; @Pipe({ name: 'dateFormat' }) export class DateFormatPipe implements PipeTransform { - constructor(private settingsService: SettingsService) {} + private settingsService = inject(SettingsService); transform(value: any, dateFormat?: string): any { const defaultDateFormat = this.settingsService.dateFormat.replace('dd', 'DD'); diff --git a/src/app/pipes/datetime-format.pipe.ts b/src/app/pipes/datetime-format.pipe.ts index 5ee05ded6..b2eacb721 100644 --- a/src/app/pipes/datetime-format.pipe.ts +++ b/src/app/pipes/datetime-format.pipe.ts @@ -26,7 +26,7 @@ export class DatetimeFormatPipe implements PipeTransform { } else { dateVal = moment(value as any); } - const fmt = datetimeFormat ?? 'YYYY-MM-DDTHH:mm:ssZ'; + const fmt = datetimeFormat ?? 'yyyy-MM-ddTHH:mm:ssZ'; return dateVal.format(fmt); } } diff --git a/src/app/pipes/find.pipe.ts b/src/app/pipes/find.pipe.ts index 669a050be..0ef723a85 100644 --- a/src/app/pipes/find.pipe.ts +++ b/src/app/pipes/find.pipe.ts @@ -1,4 +1,4 @@ -import { Pipe, PipeTransform, SecurityContext } from '@angular/core'; +import { Pipe, PipeTransform, SecurityContext, inject } from '@angular/core'; import { DomSanitizer } from '@angular/platform-browser'; /** @@ -10,7 +10,7 @@ const lookupCache = new WeakMap>>(); @Pipe({ name: 'find' }) export class FindPipe implements PipeTransform { - constructor(private sanitizer: DomSanitizer) {} + private sanitizer = inject(DomSanitizer); transform(value: any, options: any, key: string, property: string): string { if (!options || !key || value === null || value === undefined) { diff --git a/src/app/pipes/format-number.pipe.ts b/src/app/pipes/format-number.pipe.ts index c147b0a33..bde5d9027 100644 --- a/src/app/pipes/format-number.pipe.ts +++ b/src/app/pipes/format-number.pipe.ts @@ -1,13 +1,11 @@ import { DecimalPipe } from '@angular/common'; -import { Pipe, PipeTransform } from '@angular/core'; +import { Pipe, PipeTransform, inject } from '@angular/core'; import { SettingsService } from 'app/settings/settings.service'; @Pipe({ name: 'formatNumber' }) export class FormatNumberPipe implements PipeTransform { - constructor( - private decimalFormat: DecimalPipe, - private settingsService: SettingsService - ) {} + private decimalFormat = inject(DecimalPipe); + private settingsService = inject(SettingsService); transform(value: string | number, defaultValue: any): string { if (value === undefined) { diff --git a/src/app/pipes/translate.pipe.ts b/src/app/pipes/translate.pipe.ts index d0c4c1358..d50960b59 100644 --- a/src/app/pipes/translate.pipe.ts +++ b/src/app/pipes/translate.pipe.ts @@ -1,9 +1,9 @@ -import { Pipe, PipeTransform } from '@angular/core'; +import { Pipe, PipeTransform, inject } from '@angular/core'; import { TranslateService } from '@ngx-translate/core'; @Pipe({ name: 'translateKey', standalone: true }) export class TranslatePipe implements PipeTransform { - constructor(private translateService: TranslateService) {} + private translateService = inject(TranslateService); transform(attributeValue: any, group: string, prefix: string = 'labels'): string { const translationKey = `${prefix}.${group}.${attributeValue}`; diff --git a/src/app/pipes/yesno.pipe.ts b/src/app/pipes/yesno.pipe.ts index 945ee0663..b826f5325 100644 --- a/src/app/pipes/yesno.pipe.ts +++ b/src/app/pipes/yesno.pipe.ts @@ -1,9 +1,9 @@ -import { Pipe, PipeTransform } from '@angular/core'; +import { Pipe, PipeTransform, inject } from '@angular/core'; import { TranslateService } from '@ngx-translate/core'; @Pipe({ name: 'yesNo' }) export class YesnoPipe implements PipeTransform { - constructor(private translateService: TranslateService) {} + private translateService = inject(TranslateService); transform(value: boolean, ...args: unknown[]): string { if (value == null) { diff --git a/src/app/products/charges/charge.resolver.ts b/src/app/products/charges/charge.resolver.ts index 0dbe5983d..973eecfe0 100644 --- a/src/app/products/charges/charge.resolver.ts +++ b/src/app/products/charges/charge.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { ProductsService } from 'app/products/products.service'; */ @Injectable() export class ChargeResolver { - /** - * @param {productsService} productsService Products service. - */ - constructor(private productsService: ProductsService) {} + private productsService = inject(ProductsService); /** * Returns the charge data. diff --git a/src/app/products/charges/charges-template-and-resolver.ts b/src/app/products/charges/charges-template-and-resolver.ts index 8dcf9af50..797a7b91f 100644 --- a/src/app/products/charges/charges-template-and-resolver.ts +++ b/src/app/products/charges/charges-template-and-resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRoute, ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -10,7 +10,7 @@ import { ProductsService } from '../products.service'; @Injectable() export class ChargesTemplateAndResolver { - constructor(private productsService: ProductsService) {} + private productsService = inject(ProductsService); /** * Returns the changes template and data. diff --git a/src/app/products/charges/charges-template.resolver.ts b/src/app/products/charges/charges-template.resolver.ts index 3409f6244..c4061f5db 100644 --- a/src/app/products/charges/charges-template.resolver.ts +++ b/src/app/products/charges/charges-template.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; /** rxjs Imports */ import { Observable } from 'rxjs'; @@ -12,10 +12,7 @@ import { ProductsService } from '../products.service'; */ @Injectable() export class ChargesTemplateResolver { - /** - * @param {ProductsService} productsService Products service. - */ - constructor(private productsService: ProductsService) {} + private productsService = inject(ProductsService); /** * Returns the charges template data. diff --git a/src/app/products/charges/charges.component.html b/src/app/products/charges/charges.component.html index 764eee1c1..befac6d58 100644 --- a/src/app/products/charges/charges.component.html +++ b/src/app/products/charges/charges.component.html @@ -18,9 +18,11 @@ placeholder="{{ 'labels.inputs.Filter' | translate }}" (selectionChange)="filterByAppliesTo($event.value)" > - - {{ chargeAppliesTo.value | translateKey: 'catalogs' }} - + @for (chargeAppliesTo of chargeAppliesToOptions; track chargeAppliesTo) { + + {{ chargeAppliesTo.value | translateKey: 'catalogs' }} + + }
    @@ -57,22 +59,24 @@ {{ 'labels.commons.Is' | translate }} {{ 'labels.inputs.Penalty' | translate }}? - - + @if (charge.penalty) { + + } + @if (!charge.penalty) { + + } diff --git a/src/app/products/charges/charges.component.ts b/src/app/products/charges/charges.component.ts index 7f9c7e419..2ab8a867e 100644 --- a/src/app/products/charges/charges.component.ts +++ b/src/app/products/charges/charges.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, TemplateRef, ElementRef, ViewChild, AfterViewInit } from '@angular/core'; +import { Component, OnInit, TemplateRef, ElementRef, ViewChild, AfterViewInit, inject } from '@angular/core'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort, MatSortHeader } from '@angular/material/sort'; import { @@ -59,6 +59,12 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ChargesComponent implements OnInit, AfterViewInit { + private route = inject(ActivatedRoute); + private router = inject(Router); + private configurationWizardService = inject(ConfigurationWizardService); + private popoverService = inject(PopoverService); + private charges = inject(Charges); + /** Charge data. */ chargeData: Charge[] = []; /** Columns to be displayed in charges table. */ @@ -97,13 +103,7 @@ export class ChargesComponent implements OnInit, AfterViewInit { * @param {ConfigurationWizardService} configurationWizardService ConfigurationWizard Service. * @param {PopoverService} popoverService PopoverService. */ - constructor( - private route: ActivatedRoute, - private router: Router, - private configurationWizardService: ConfigurationWizardService, - private popoverService: PopoverService, - private charges: Charges - ) { + constructor() { this.route.data.subscribe((data: { charges: any }) => { this.chargeData = data.charges; }); diff --git a/src/app/products/charges/charges.resolver.ts b/src/app/products/charges/charges.resolver.ts index c70ca5a26..74cd90f40 100644 --- a/src/app/products/charges/charges.resolver.ts +++ b/src/app/products/charges/charges.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; /** rxjs Imports */ import { Observable } from 'rxjs'; @@ -12,10 +12,7 @@ import { ProductsService } from '../products.service'; */ @Injectable() export class ChargesResolver { - /** - * @param {ProductsService} productsService Products service. - */ - constructor(private productsService: ProductsService) {} + private productsService = inject(ProductsService); /** * Returns the products data. diff --git a/src/app/products/charges/create-charge/create-charge.component.html b/src/app/products/charges/create-charge/create-charge.component.html index 18c3601be..9358edc64 100644 --- a/src/app/products/charges/create-charge/create-charge.component.html +++ b/src/app/products/charges/create-charge/create-charge.component.html @@ -6,248 +6,265 @@ {{ 'labels.inputs.Charge Applies To' | translate }} - - {{ chargeAppliesTo.value | translateKey: 'catalogs' }} - + @for (chargeAppliesTo of chargesTemplateData.chargeAppliesToOptions; track chargeAppliesTo) { + + {{ chargeAppliesTo.value | translateKey: 'catalogs' }} + + } - - {{ 'labels.inputs.Charge Applies To' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (chargeForm.controls.chargeAppliesTo.hasError('required')) { + + {{ 'labels.inputs.Charge Applies To' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } -
    - - {{ 'labels.inputs.Charge Name' | translate }} - - - {{ 'labels.inputs.Charge Name' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - - - {{ 'labels.inputs.Currency' | translate }} - - - {{ currency.name }} - - - - {{ 'labels.inputs.Currency' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - - - {{ 'labels.inputs.Charge Time Type' | translate }} - - - {{ chargeTimeType.value | translateKey: 'catalogs' }} - - - - {{ 'labels.inputs.Charge Time Type' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - - - {{ 'labels.inputs.Charge Calculation Type' | translate }} - - + + {{ 'labels.inputs.Charge Name' | translate }} + + @if (chargeForm.controls.name.hasError('required')) { + + {{ 'labels.inputs.Charge Name' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + + {{ 'labels.inputs.Currency' | translate }} + + @for (currency of chargesTemplateData.currencyOptions; track currency) { + + {{ currency.name }} + + } + + @if (chargeForm.controls.currencyCode.hasError('required')) { + + {{ 'labels.inputs.Currency' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + + {{ 'labels.inputs.Charge Time Type' | translate }} + + @for (chargeTimeType of chargeTimeTypeData; track chargeTimeType) { + + {{ chargeTimeType.value | translateKey: 'catalogs' }} + + } + + @if (chargeForm.controls.chargeTimeType.hasError('required')) { + + {{ 'labels.inputs.Charge Time Type' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + + {{ 'labels.inputs.Charge Calculation Type' | translate }} + + @for (chargeCalculationType of filteredChargeCalculationType(); track chargeCalculationType) { + + {{ chargeCalculationType.value | translateKey: 'catalogs' }} + + } + + @if (chargeForm.controls.chargeCalculationType.hasError('required')) { + + {{ 'labels.inputs.Charge Calculation Type' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + @if (chargeForm.controls.chargeAppliesTo.value === 1) { + + {{ 'labels.inputs.Charge Payment Mode' | translate }} + + @for (chargePaymentMode of chargesTemplateData.chargePaymetModeOptions; track chargePaymentMode) { + + {{ chargePaymentMode.value | translateKey: 'catalogs' }} + + } + + @if (chargeForm.controls.chargePaymentMode.hasError('required')) { + + {{ 'labels.inputs.Charge Payment Mode' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + } + @if (chargeForm.controls.chargeTimeType.value === 9) { +
    + + {{ 'labels.inputs.Add Fee Frequency' | translate }} + +
    + } + @if (chargeForm.controls.chargeTimeType.value === 9 && chargeForm.controls.addFeeFrequency.value) { + + {{ 'labels.inputs.Frequency Interval' | translate }} + + @if (chargeForm.controls.feeInterval.hasError('required')) { + + {{ 'labels.inputs.Frequency Interval' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + @if (chargeForm.controls.feeInterval.hasError('pattern')) { + + {{ 'labels.inputs.Frequency Interval' | translate }} + {{ 'labels.commons.must be a positive integer' | translate }} + + } + + } + @if (chargeForm.controls.chargeTimeType.value === 9 && chargeForm.controls.addFeeFrequency.value) { + + {{ 'labels.inputs.Charge Frequency' | translate }} + + @for (feeFrequency of chargesTemplateData.feeFrequencyOptions; track feeFrequency) { + + {{ feeFrequency.value | translateKey: 'catalogs' }} + + } + + @if (chargeForm.controls.feeFrequency.hasError('required')) { + + {{ 'labels.inputs.Charge Frequency' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + } + @if (chargeForm.controls.chargeTimeType.value === 6 || chargeForm.controls.chargeTimeType.value === 7) { + + {{ 'labels.inputs.Due Date' | translate }} + + + + @if (chargeForm.controls.feeOnMonthDay.hasError('required')) { + + {{ 'labels.inputs.Due Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + } + @if (chargeForm.controls.chargeTimeType.value === 7 || chargeForm.controls.chargeTimeType.value === 11) { + + {{ 'labels.inputs.Repeat Every' | translate }} ({{ repeatEveryLabel }}) + + @if (chargeForm.controls.feeInterval.hasError('required')) { + + {{ 'labels.inputs.Repeat Every' | translate }} ({{ repeatEveryLabel }}) + {{ 'labels.commons.is' | translate }} {{ 'labels.commons.required' | translate }} + + } + @if ( + (chargeForm.controls.feeInterval.hasError('min') || + chargeForm.controls.feeInterval.hasError('max')) && + !chargeForm.controls.feeInterval.hasError('pattern') + ) { + + {{ 'labels.inputs.Repeat Every' | translate }} ({{ repeatEveryLabel }}) + {{ 'labels.commons.must be between 1 and 12' | translate }} + + } + @if (chargeForm.controls.feeInterval.hasError('pattern')) { + + {{ 'labels.inputs.Repeat Every' | translate }} ({{ repeatEveryLabel }}) + {{ 'labels.commons.must be a positive integer' | translate }} + + } + + } + + {{ 'labels.inputs.Amount' | translate }} + + @if (chargeForm.controls.amount.hasError('required')) { + + {{ 'labels.inputs.Amount' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + + @if (showMinMaxCap()) { + + {{ 'labels.inputs.Minimum Charge Cap' | translate }} + + @if (chargeForm.controls.minCap.hasError('maxValue')) { + + {{ 'errors.validation.msg.loanproduct.minimumGap.not.greater.than.specified.number' | translate }} + ({{ chargeForm.controls.maxCap.value }}) + + } + + } + @if (showMinMaxCap()) { + + {{ 'labels.inputs.Maximum Charge Cap' | translate }} + + @if (chargeForm.controls.maxCap.hasError('minValue')) { + + {{ 'errors.validation.msg.loanproduct.maximumGap.not.greater.than.specified.number' | translate }} + ({{ chargeForm.controls.minCap.value }}) + + } + + } + @if (chargeForm.controls.chargeAppliesTo.value === 3) { + - {{ chargeCalculationType.value | translateKey: 'catalogs' }} -
    -
    - - {{ 'labels.inputs.Charge Calculation Type' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - -
    - - - {{ 'labels.inputs.Charge Payment Mode' | translate }} - - - {{ chargePaymentMode.value | translateKey: 'catalogs' }} - - - - {{ 'labels.inputs.Charge Payment Mode' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - -
    - - {{ 'labels.inputs.Add Fee Frequency' | translate }} - -
    - - - {{ 'labels.inputs.Frequency Interval' | translate }} - - - {{ 'labels.inputs.Frequency Interval' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - {{ 'labels.inputs.Frequency Interval' | translate }} - {{ 'labels.commons.must be a positive integer' | translate }} - - - - - {{ 'labels.inputs.Charge Frequency' | translate }} - - - {{ feeFrequency.value | translateKey: 'catalogs' }} - - - - {{ 'labels.inputs.Charge Frequency' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - - - {{ 'labels.inputs.Due Date' | translate }} - - - - - {{ 'labels.inputs.Due Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - - - {{ 'labels.inputs.Repeat Every' | translate }} ({{ repeatEveryLabel }}) - - - {{ 'labels.inputs.Repeat Every' | translate }} ({{ repeatEveryLabel }}) - {{ 'labels.commons.is' | translate }} {{ 'labels.commons.required' | translate }} - - - {{ 'labels.inputs.Repeat Every' | translate }} ({{ repeatEveryLabel }}) - {{ 'labels.commons.must be between 1 and 12' | translate }} - - - {{ 'labels.inputs.Repeat Every' | translate }} ({{ repeatEveryLabel }}) - {{ 'labels.commons.must be a positive integer' | translate }} - - - - - {{ 'labels.inputs.Amount' | translate }} - - - {{ 'labels.inputs.Amount' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - - - {{ 'labels.inputs.Minimum Charge Cap' | translate }} - - - {{ 'errors.validation.msg.loanproduct.minimumGap.not.greater.than.specified.number' | translate }} ({{ - chargeForm.controls.maxCap.value - }}) - - - - - {{ 'labels.inputs.Maximum Charge Cap' | translate }} - - - - {{ 'errors.validation.msg.loanproduct.maximumGap.not.greater.than.specified.number' | translate }} ({{ - chargeForm.controls.minCap.value - }}) - - - - - - - - {{ 'labels.inputs.Tax Group' | translate }} - - - {{ taxGroup.name }} - - - - -
    -
    - - {{ 'labels.status.Active' | translate }} - -
    - -
    - - {{ 'labels.commons.Is' | translate }} {{ 'labels.inputs.Penalty' | translate }} - + + } + + {{ 'labels.inputs.Tax Group' | translate }} + + @for (taxGroup of chargesTemplateData.taxGroupOptions; track taxGroup) { + + {{ taxGroup.name }} + + } + + +
    +
    + + {{ 'labels.status.Active' | translate }} + +
    +
    + + {{ 'labels.commons.Is' | translate }} {{ 'labels.inputs.Penalty' | translate }} + +
    -
    + }
    diff --git a/src/app/products/charges/create-charge/create-charge.component.ts b/src/app/products/charges/create-charge/create-charge.component.ts index 29621ce28..1ea0f5363 100644 --- a/src/app/products/charges/create-charge/create-charge.component.ts +++ b/src/app/products/charges/create-charge/create-charge.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, @@ -37,6 +37,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class CreateChargeComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private productsService = inject(ProductsService); + private route = inject(ActivatedRoute); + private router = inject(Router); + private dateUtils = inject(Dates); + private settingsService = inject(SettingsService); + /** Charge form. */ chargeForm: UntypedFormGroup; /** Charges template data. */ @@ -65,14 +72,7 @@ export class CreateChargeComponent implements OnInit { * @param {Dates} dateUtils Date Utils to format date. * @param {SettingsService} settingsService Settings Service */ - constructor( - private formBuilder: UntypedFormBuilder, - private productsService: ProductsService, - private route: ActivatedRoute, - private router: Router, - private dateUtils: Dates, - private settingsService: SettingsService - ) { + constructor() { this.route.data.subscribe((data: { chargesTemplate: any }) => { this.chargesTemplateData = data.chargesTemplate; const incomeOptions = data.chargesTemplate.incomeOrLiabilityAccountOptions.incomeAccountOptions || []; @@ -123,7 +123,8 @@ export class CreateChargeComponent implements OnInit { '', [ Validators.required, - Validators.pattern('^\\s*(?=.*[1-9])\\d*(?:\\.\\d+)?\\s*$')] + Validators.pattern('^\\s*(?=.*[1-9])\\d*(?:\\.\\d+)?\\s*$') + ] ], active: [false], penalty: [false], @@ -263,7 +264,8 @@ export class CreateChargeComponent implements OnInit { Validators.required, Validators.min(1), Validators.max(12), - Validators.pattern('^[1-9]\\d*$')]) + Validators.pattern('^[1-9]\\d*$') + ]) ); this.repeatEveryLabel = 'Months'; break; @@ -277,7 +279,8 @@ export class CreateChargeComponent implements OnInit { 'feeInterval', new UntypedFormControl('', [ Validators.required, - Validators.pattern('^[1-9]\\d*$')]) + Validators.pattern('^[1-9]\\d*$') + ]) ); } else { this.chargeForm.removeControl('feeFrequency'); @@ -290,7 +293,8 @@ export class CreateChargeComponent implements OnInit { 'feeInterval', new UntypedFormControl('', [ Validators.required, - Validators.pattern('^[1-9]\\d*$')]) + Validators.pattern('^[1-9]\\d*$') + ]) ); this.repeatEveryLabel = 'Weeks'; break; diff --git a/src/app/products/charges/edit-charge/edit-charge.component.html b/src/app/products/charges/edit-charge/edit-charge.component.html index 540997a01..f0c35fec1 100644 --- a/src/app/products/charges/edit-charge/edit-charge.component.html +++ b/src/app/products/charges/edit-charge/edit-charge.component.html @@ -6,12 +6,11 @@ {{ 'labels.inputs.Charge Applies To' | translate }} - - {{ chargeAppliesTo.value | translateKey: 'catalogs' }} - + @for (chargeAppliesTo of chargeData.chargeAppliesToOptions; track chargeAppliesTo) { + + {{ chargeAppliesTo.value | translateKey: 'catalogs' }} + + } @@ -20,187 +19,228 @@ {{ 'labels.inputs.Name' | translate }} - - {{ 'labels.inputs.Name' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (chargeForm.controls.name.hasError('required')) { + + {{ 'labels.inputs.Name' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Currency' | translate }} - - {{ currency.name }} - + @for (currency of chargeData.currencyOptions; track currency) { + + {{ currency.name }} + + } - - {{ 'labels.inputs.Currency' | translate }} {{ 'labels.inputs.Type' | translate }} - {{ 'labels.commons.is' | translate }} {{ 'labels.commons.required' | translate }} - + @if (chargeForm.controls.currencyCode.hasError('required')) { + + {{ 'labels.inputs.Currency' | translate }} {{ 'labels.inputs.Type' | translate }} + {{ 'labels.commons.is' | translate }} {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Charge Time Type' | translate }} - - {{ chargeTime.value | translateKey: 'catalogs' }} - + @for (chargeTime of chargeTimeTypeOptions; track chargeTime) { + + {{ chargeTime.value | translateKey: 'catalogs' }} + + } - - {{ 'labels.inputs.Charge Time Type' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (chargeForm.controls.chargeTimeType.hasError('required')) { + + {{ 'labels.inputs.Charge Time Type' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Charge Calculation' | translate }} - - {{ chargeCalculation.value | translateKey: 'catalogs' }} - + @for (chargeCalculation of chargeCalculationTypeOptions; track chargeCalculation) { + + {{ chargeCalculation.value | translateKey: 'catalogs' }} + + } - - {{ 'labels.inputs.Charge Calculation Type' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (chargeForm.controls.chargeCalculationType.hasError('required')) { + + {{ 'labels.inputs.Charge Calculation Type' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } - - {{ 'labels.inputs.Charge Payment By' | translate }} - - - {{ chargePaymentMode.value | translateKey: 'catalogs' }} - - - - {{ 'labels.inputs.Charge Payment Mode' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - + @if (chargePaymentMode) { + + {{ 'labels.inputs.Charge Payment By' | translate }} + + @for (chargePaymentMode of chargeData.chargePaymetModeOptions; track chargePaymentMode) { + + {{ chargePaymentMode.value | translateKey: 'catalogs' }} + + } + + @if (chargeForm.controls.chargePaymentMode.hasError('required')) { + + {{ 'labels.inputs.Charge Payment Mode' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + } {{ 'labels.inputs.Amount' | translate }} - - {{ 'labels.inputs.Amount' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (chargeForm.controls.amount.hasError('required')) { + + {{ 'labels.inputs.Amount' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } - - {{ 'labels.inputs.Minimum Charge Cap' | translate }} - - - {{ 'errors.validation.msg.loanproduct.minimumGap.not.greater.than.specified.number' | translate }} ({{ - chargeForm.controls.maxCap.value - }}) - - - - {{ 'labels.inputs.Maximum Charge Cap' | translate }} - + * minCap and maxCap only allowed for loan ,shares and savings entitites + * In Loan case: Only for the "charge calculation type" set as "%amount", "% loan amount+interest", "%interest",and "%disbursement amount". + * In saving case: Only for 1. charge time type is "withdrawlfee" or "savings no activity fee" with charge calculation type as "% amount" + * In shares case: Only for charge time type: SHARE_PURCHASE and SHARE_REDEEM and with charge calculation type as % amount only + --> + @if ( + (chargeForm.controls.chargeAppliesTo.value === 1 && + (chargeForm.controls.chargeCalculationType.value === 2 || + chargeForm.controls.chargeCalculationType.value === 3 || + chargeForm.controls.chargeCalculationType.value === 4 || + chargeForm.controls.chargeCalculationType.value === 5)) || + (chargeForm.controls.chargeAppliesTo.value === 2 && + (chargeForm.controls.chargeTimeType.value === 16 || chargeForm.controls.chargeTimeType.value === 5) && + chargeForm.controls.chargeCalculationType.value === 2) || + (chargeForm.controls.chargeAppliesTo.value === 4 && + (chargeForm.controls.chargeTimeType.value === 14 || chargeForm.controls.chargeTimeType.value === 15) && + chargeForm.controls.chargeCalculationType.value === 2) + ) { + + {{ 'labels.inputs.Minimum Charge Cap' | translate }} + + @if (chargeForm.controls.minCap.hasError('maxValue')) { + + {{ 'errors.validation.msg.loanproduct.minimumGap.not.greater.than.specified.number' | translate }} ({{ + chargeForm.controls.maxCap.value + }}) + + } + + } + @if ( + (chargeForm.controls.chargeAppliesTo.value === 1 && + (chargeForm.controls.chargeCalculationType.value === 2 || + chargeForm.controls.chargeCalculationType.value === 3 || + chargeForm.controls.chargeCalculationType.value === 4 || + chargeForm.controls.chargeCalculationType.value === 5)) || + (chargeForm.controls.chargeAppliesTo.value === 2 && + (chargeForm.controls.chargeTimeType.value === 16 || chargeForm.controls.chargeTimeType.value === 5) && + chargeForm.controls.chargeCalculationType.value === 2) || + (chargeForm.controls.chargeAppliesTo.value === 4 && + (chargeForm.controls.chargeTimeType.value === 14 || chargeForm.controls.chargeTimeType.value === 15) && + chargeForm.controls.chargeCalculationType.value === 2) + ) { + + {{ 'labels.inputs.Maximum Charge Cap' | translate }} + + @if (chargeForm.controls.maxCap.hasError('minValue')) { + + {{ 'errors.validation.msg.loanproduct.maximumGap.not.greater.than.specified.number' | translate }} ({{ + chargeForm.controls.minCap.value + }}) + + } + + } - - {{ 'errors.validation.msg.loanproduct.maximumGap.not.greater.than.specified.number' | translate }} ({{ - chargeForm.controls.minCap.value - }}) - - - - - + @if (showGLAccount) { + + + } {{ 'labels.inputs.Tax Group' | translate }} - - - {{ taxGroup.name }} - - + @if (chargeData.taxGroup) { + + @for (taxGroup of chargeData.taxGroupOptions; track taxGroup) { + + {{ taxGroup.name }} + + } + + } - - - {{ taxGroup.name }} - - + @if (!chargeData.taxGroup) { + + @for (taxGroup of chargeData.taxGroupOptions; track taxGroup) { + + {{ taxGroup.name }} + + } + + } -
    - - {{ 'labels.inputs.Add Fee Frequency' | translate }} - -
    + @if (addFeeFrequency) { +
    + + {{ 'labels.inputs.Add Fee Frequency' | translate }} + +
    + } - - {{ 'labels.inputs.Frequency Interval' | translate }} - - - {{ 'labels.inputs.Frequency Interval' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - + @if (addFeeFrequency && showFeeOptions) { + + {{ 'labels.inputs.Frequency Interval' | translate }} + + @if (chargeForm.controls.feeInterval.hasError('required')) { + + {{ 'labels.inputs.Frequency Interval' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + } - - {{ 'labels.inputs.Charge Frequency' | translate }} - - - {{ chargeFrequency.value | translateKey: 'catalogs' }} - - - - {{ 'labels.inputs.Add Fee Frequency' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - + @if (addFeeFrequency && showFeeOptions) { + + {{ 'labels.inputs.Charge Frequency' | translate }} + + @for (chargeFrequency of chargeData.feeFrequencyOptions; track chargeFrequency) { + + {{ chargeFrequency.value | translateKey: 'catalogs' }} + + } + + @if (chargeForm.controls.feeFrequency.hasError('required')) { + + {{ 'labels.inputs.Add Fee Frequency' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + }
    @@ -210,11 +250,13 @@
    -
    - - {{ 'labels.commons.Is' | translate }} {{ 'labels.inputs.Penalty' | translate }} - -
    + @if (showPenalty) { +
    + + {{ 'labels.commons.Is' | translate }} {{ 'labels.inputs.Penalty' | translate }} + +
    + } diff --git a/src/app/products/charges/edit-charge/edit-charge.component.ts b/src/app/products/charges/edit-charge/edit-charge.component.ts index eefd18e75..0a7889472 100644 --- a/src/app/products/charges/edit-charge/edit-charge.component.ts +++ b/src/app/products/charges/edit-charge/edit-charge.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, Validators, ReactiveFormsModule } from '@angular/forms'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; @@ -28,6 +28,12 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class EditChargeComponent implements OnInit { + private productsService = inject(ProductsService); + private formBuilder = inject(UntypedFormBuilder); + private route = inject(ActivatedRoute); + private router = inject(Router); + private settingsService = inject(SettingsService); + /** Selected Data. */ chargeData: any; /** Charge form. */ @@ -63,13 +69,7 @@ export class EditChargeComponent implements OnInit { * @param {Router} router Router for navigation. * @param {SettingsService} settingsService Settings Service */ - constructor( - private productsService: ProductsService, - private formBuilder: UntypedFormBuilder, - private route: ActivatedRoute, - private router: Router, - private settingsService: SettingsService - ) { + constructor() { this.route.data.subscribe((data: { chargesTemplate: any }) => { this.chargeData = data.chargesTemplate; }); diff --git a/src/app/products/charges/view-charge/view-charge.component.html b/src/app/products/charges/view-charge/view-charge.component.html index d604b7113..232e32dc6 100644 --- a/src/app/products/charges/view-charge/view-charge.component.html +++ b/src/app/products/charges/view-charge/view-charge.component.html @@ -53,21 +53,29 @@ {{ chargeData.amount }} -
    - {{ 'labels.inputs.Minimum Charge Cap' | translate }} -
    + @if (minCap) { +
    + {{ 'labels.inputs.Minimum Charge Cap' | translate }} +
    + } -
    - {{ chargeData.minCap }} -
    + @if (minCap) { +
    + {{ chargeData.minCap }} +
    + } -
    - {{ 'labels.inputs.Maximum Charge Cap' | translate }} -
    + @if (maxCap) { +
    + {{ 'labels.inputs.Maximum Charge Cap' | translate }} +
    + } -
    - {{ chargeData.maxCap }} -
    + @if (maxCap) { +
    + {{ chargeData.maxCap }} +
    + }
    {{ 'labels.inputs.Charge Time Type' | translate }} @@ -101,41 +109,51 @@ {{ chargeData.active === true | yesNo }}
    -
    - {{ 'labels.inputs.Add Fee Frequency' | translate }} -
    + @if (chargeData.chargeTimeType.id === 9 && chargeData.feeFrequency) { +
    + {{ 'labels.inputs.Add Fee Frequency' | translate }} +
    + } -
    - {{ chargeData.feeFrequency.value | translateKey: 'catalogs' }} -
    + @if (chargeData.chargeTimeType.id === 9 && chargeData.feeFrequency && chargeData.feeFrequency) { +
    + {{ chargeData.feeFrequency.value | translateKey: 'catalogs' }} +
    + } -
    - {{ 'labels.inputs.Frequency Interval' | translate }} -
    + @if (chargeData.chargeTimeType.id === 9 && chargeData.feeInterval) { +
    + {{ 'labels.inputs.Frequency Interval' | translate }} +
    + } -
    - {{ chargeData.feeInterval }} -
    + @if (chargeData.chargeTimeType.id === 9 && chargeData.feeInterval) { +
    + {{ chargeData.feeInterval }} +
    + } - - + @if (chargeData.incomeOrLiabilityAccount) { + + + } -
    - {{ 'labels.inputs.Tax Group' | translate }} -
    + @if (chargeData.taxGroup) { +
    + {{ 'labels.inputs.Tax Group' | translate }} +
    + } -
    - {{ chargeData.taxGroup.name }} -
    + @if (chargeData.taxGroup) { +
    + {{ chargeData.taxGroup.name }} +
    + }
    diff --git a/src/app/products/charges/view-charge/view-charge.component.ts b/src/app/products/charges/view-charge/view-charge.component.ts index c0649fd6c..d1713080c 100644 --- a/src/app/products/charges/view-charge/view-charge.component.ts +++ b/src/app/products/charges/view-charge/view-charge.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component } from '@angular/core'; +import { Component, inject } from '@angular/core'; import { MatDialog } from '@angular/material/dialog'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; @@ -29,6 +29,12 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ViewChargeComponent { + private productsService = inject(ProductsService); + private route = inject(ActivatedRoute); + private router = inject(Router); + private dialog = inject(MatDialog); + private translateService = inject(TranslateService); + /** Charge data. */ chargeData: any; /** Boolean for MinCap and MaxCap */ @@ -42,13 +48,7 @@ export class ViewChargeComponent { * @param {MatDialog} dialog Dialog reference. * @param {TranslateService} translateService Translate Service. */ - constructor( - private productsService: ProductsService, - private route: ActivatedRoute, - private router: Router, - private dialog: MatDialog, - private translateService: TranslateService - ) { + constructor() { this.route.data.subscribe((data: { charge: any }) => { this.chargeData = data.charge; if (this.chargeData.minCap) { diff --git a/src/app/products/collaterals/collateral.resolver.ts b/src/app/products/collaterals/collateral.resolver.ts index 3ceb9c679..23106fa09 100644 --- a/src/app/products/collaterals/collateral.resolver.ts +++ b/src/app/products/collaterals/collateral.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { ProductsService } from '../products.service'; */ @Injectable() export class CollateralResolver { - /** - * @param {ProductsService} productsService Products service. - */ - constructor(private productsService: ProductsService) {} + private productsService = inject(ProductsService); /** * Returns the products data. diff --git a/src/app/products/collaterals/collaterals-template.resolver.ts b/src/app/products/collaterals/collaterals-template.resolver.ts index 01a4a7674..69aaf395d 100644 --- a/src/app/products/collaterals/collaterals-template.resolver.ts +++ b/src/app/products/collaterals/collaterals-template.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; /** rxjs Imports */ import { Observable } from 'rxjs'; @@ -12,10 +12,7 @@ import { ProductsService } from '../products.service'; */ @Injectable() export class CollateralTemplateResolver { - /** - * @param {ProductsService} productsService products Service - */ - constructor(private productsService: ProductsService) {} + private productsService = inject(ProductsService); /** * Returns the product Data. diff --git a/src/app/products/collaterals/collaterals.component.ts b/src/app/products/collaterals/collaterals.component.ts index 4301233f5..2ce7acedb 100644 --- a/src/app/products/collaterals/collaterals.component.ts +++ b/src/app/products/collaterals/collaterals.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, ViewChild, OnInit } from '@angular/core'; +import { Component, ViewChild, OnInit, inject } from '@angular/core'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort, MatSortHeader } from '@angular/material/sort'; import { @@ -42,6 +42,8 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class CollateralsComponent implements OnInit { + private route = inject(ActivatedRoute); + /** Collateral Data */ collateralData: any; /** Columns to be displayed in the Collaterals Table */ @@ -64,7 +66,7 @@ export class CollateralsComponent implements OnInit { * Retrieves the Collaterals data from `resolve`. * @param {ActivatedRoute} route Activated Route. */ - constructor(private route: ActivatedRoute) { + constructor() { this.route.data.subscribe((data: { collaterals: any }) => { this.collateralData = data.collaterals; }); diff --git a/src/app/products/collaterals/collaterals.resolver.ts b/src/app/products/collaterals/collaterals.resolver.ts index f97274ebd..776d93531 100644 --- a/src/app/products/collaterals/collaterals.resolver.ts +++ b/src/app/products/collaterals/collaterals.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { ProductsService } from '../products.service'; */ @Injectable() export class CollateralsResolver { - /** - * @param {ProductsService} productsService Products service - */ - constructor(private productsService: ProductsService) {} + private productsService = inject(ProductsService); /** * Returns the All Collaterals Data diff --git a/src/app/products/collaterals/create-collateral/create-collateral.component.html b/src/app/products/collaterals/create-collateral/create-collateral.component.html index b4e821992..825a50aff 100644 --- a/src/app/products/collaterals/create-collateral/create-collateral.component.html +++ b/src/app/products/collaterals/create-collateral/create-collateral.component.html @@ -6,54 +6,68 @@ {{ 'labels.inputs.Name' | translate }} - - {{ 'labels.inputs.Name' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (collateralForm.controls.name.hasError('required')) { + + {{ 'labels.inputs.Name' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Type/Quality' | translate }} - - {{ 'labels.inputs.Type/Quality' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (collateralForm.controls.quality.hasError('required')) { + + {{ 'labels.inputs.Type/Quality' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Unit Type' | translate }} - - {{ 'labels.inputs.Unit Type' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (collateralForm.controls.unitType.hasError('required')) { + + {{ 'labels.inputs.Unit Type' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Base Price' | translate }} - - {{ 'labels.inputs.Base Price' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (collateralForm.controls.basePrice.hasError('required')) { + + {{ 'labels.inputs.Base Price' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Percentage to Base' | translate }} - - {{ 'labels.inputs.Percentage to Base' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (collateralForm.controls.pctToBase.hasError('required')) { + + {{ 'labels.inputs.Percentage to Base' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.heading.Currency' | translate }} - - {{ currency.name }} - + @for (currency of collateralTemplateData; track currency) { + + {{ currency.name }} + + } - - {{ 'labels.heading.Currency' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (collateralForm.controls.currency.hasError('required')) { + + {{ 'labels.heading.Currency' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + }
    diff --git a/src/app/products/collaterals/create-collateral/create-collateral.component.ts b/src/app/products/collaterals/create-collateral/create-collateral.component.ts index beaa9dada..eac9c0ddf 100644 --- a/src/app/products/collaterals/create-collateral/create-collateral.component.ts +++ b/src/app/products/collaterals/create-collateral/create-collateral.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { OrganizationService } from 'app/organization/organization.service'; import { UntypedFormGroup, UntypedFormBuilder, FormControl, Validators, ReactiveFormsModule } from '@angular/forms'; import { Router, ActivatedRoute, RouterLink } from '@angular/router'; @@ -22,6 +22,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class CreateCollateralComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private productsService = inject(ProductsService); + private route = inject(ActivatedRoute); + private router = inject(Router); + private settingsService = inject(SettingsService); + private organizationService = inject(OrganizationService); + /** Collateral form */ collateralForm: UntypedFormGroup; /** Charges Template data */ @@ -35,14 +42,7 @@ export class CreateCollateralComponent implements OnInit { * @param {Router} router Router for navigation. * @param {SettingsService} settingsService Settings Service */ - constructor( - private formBuilder: UntypedFormBuilder, - private productsService: ProductsService, - private route: ActivatedRoute, - private router: Router, - private settingsService: SettingsService, - private organizationService: OrganizationService - ) { + constructor() { this.route.data.subscribe((data: { collateralTemplate: any }) => { this.organizationService.getCurrencies().subscribe((orgCurrencies: any) => { let orgCurrencyList = Array.isArray(orgCurrencies.selectedCurrencyOptions) diff --git a/src/app/products/collaterals/edit-collateral/edit-collateral.component.html b/src/app/products/collaterals/edit-collateral/edit-collateral.component.html index 3191c4720..c88a684fa 100644 --- a/src/app/products/collaterals/edit-collateral/edit-collateral.component.html +++ b/src/app/products/collaterals/edit-collateral/edit-collateral.component.html @@ -6,59 +6,73 @@ {{ 'labels.inputs.Name' | translate }} - - {{ 'labels.inputs.Name' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (collateralForm.controls.name.hasError('required')) { + + {{ 'labels.inputs.Name' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Type/Quality' | translate }} - - {{ 'labels.inputs.Type/Quality' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (collateralForm.controls.quality.hasError('required')) { + + {{ 'labels.inputs.Type/Quality' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Unit Type' | translate }} - - {{ 'labels.inputs.Unit Type' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (collateralForm.controls.unitType.hasError('required')) { + + {{ 'labels.inputs.Unit Type' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Base Price' | translate }} - - {{ 'labels.inputs.Base Price' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (collateralForm.controls.basePrice.hasError('required')) { + + {{ 'labels.inputs.Base Price' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Percentage to Base' | translate }} - - {{ 'labels.inputs.Percentage to Base' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (collateralForm.controls.pctToBase.hasError('required')) { + + {{ 'labels.inputs.Percentage to Base' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.heading.Currency' | translate }} - - {{ currency.name }} - + @for (currency of collateralTemplateData; track currency) { + + {{ currency.name }} + + } - - {{ 'labels.heading.Currency' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (collateralForm.controls.currency.hasError('required')) { + + {{ 'labels.heading.Currency' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } diff --git a/src/app/products/collaterals/edit-collateral/edit-collateral.component.ts b/src/app/products/collaterals/edit-collateral/edit-collateral.component.ts index ca2d71df7..7e989cd21 100644 --- a/src/app/products/collaterals/edit-collateral/edit-collateral.component.ts +++ b/src/app/products/collaterals/edit-collateral/edit-collateral.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormBuilder, UntypedFormGroup, Validators, ReactiveFormsModule } from '@angular/forms'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; @@ -17,6 +17,12 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class EditCollateralComponent implements OnInit { + private productsService = inject(ProductsService); + private formBuilder = inject(UntypedFormBuilder); + private route = inject(ActivatedRoute); + private router = inject(Router); + private settingsService = inject(SettingsService); + /** Colalteral Data */ collateralData: any; /** Collateral Template */ @@ -32,13 +38,7 @@ export class EditCollateralComponent implements OnInit { * @param {Router} router Router for navigation. * @param {SettingsService} settingsService Settings Service. */ - constructor( - private productsService: ProductsService, - private formBuilder: UntypedFormBuilder, - private route: ActivatedRoute, - private router: Router, - private settingsService: SettingsService - ) { + constructor() { this.route.data.subscribe((data: { collateral: any; collateralTemplate: any }) => { this.collateralData = data.collateral; this.collateralTemplateData = data.collateralTemplate; diff --git a/src/app/products/collaterals/view-collateral/view-collateral.component.spec.ts b/src/app/products/collaterals/view-collateral/view-collateral.component.spec.ts index 27bf9f531..f7c24aa88 100644 --- a/src/app/products/collaterals/view-collateral/view-collateral.component.spec.ts +++ b/src/app/products/collaterals/view-collateral/view-collateral.component.spec.ts @@ -98,7 +98,6 @@ describe('ViewCollateralComponent - Integration Tests', () => { }, provideNativeDateAdapter(), provideAnimationsAsync() - ], schemas: [NO_ERRORS_SCHEMA] }).compileComponents(); diff --git a/src/app/products/collaterals/view-collateral/view-collateral.component.ts b/src/app/products/collaterals/view-collateral/view-collateral.component.ts index 52e02bce6..2288c323b 100644 --- a/src/app/products/collaterals/view-collateral/view-collateral.component.ts +++ b/src/app/products/collaterals/view-collateral/view-collateral.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { MatDialog } from '@angular/material/dialog'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; @@ -24,6 +24,12 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ViewCollateralComponent { + private productsService = inject(ProductsService); + private route = inject(ActivatedRoute); + private router = inject(Router); + private dialog = inject(MatDialog); + private translateService = inject(TranslateService); + /** Collateral Data */ collateralData: any; @@ -35,13 +41,7 @@ export class ViewCollateralComponent { * @param {MatDialog} dialog Dialog reference. * @param {TranslateService} translateService Translate Service. */ - constructor( - private productsService: ProductsService, - private route: ActivatedRoute, - private router: Router, - private dialog: MatDialog, - private translateService: TranslateService - ) { + constructor() { this.route.data.subscribe((data: { collateral: any }) => { this.collateralData = data.collateral; }); diff --git a/src/app/products/deposit-product-incentive-form-dialog/deposit-product-incentive-form-dialog.component.html b/src/app/products/deposit-product-incentive-form-dialog/deposit-product-incentive-form-dialog.component.html index 25c14332c..605994dd7 100644 --- a/src/app/products/deposit-product-incentive-form-dialog/deposit-product-incentive-form-dialog.component.html +++ b/src/app/products/deposit-product-incentive-form-dialog/deposit-product-incentive-form-dialog.component.html @@ -4,9 +4,11 @@ {{ 'labels.inputs.Attribute' | translate }} - - {{ attributeName.value }} - + @for (attributeName of attributeNameData; track attributeName) { + + {{ attributeName.value }} + + } {{ 'labels.inputs.Attribute' | translate }} {{ 'labels.commons.is' | translate }} @@ -17,9 +19,11 @@ {{ 'labels.inputs.Condition' | translate }} - - {{ conditionType.value }} - + @for (conditionType of conditionTypeData; track conditionType) { + + {{ conditionType.value }} + + } {{ 'labels.inputs.Condition' | translate }} {{ 'labels.commons.is' | translate }} @@ -27,32 +31,36 @@ - - {{ 'labels.inputs.Value' | translate }} - - - {{ attributeValue.name }} - - - - - {{ 'labels.inputs.Value' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - + @if (depositProductIncentiveForm.value.attributeName) { + + {{ 'labels.inputs.Value' | translate }} + @if (depositProductIncentiveForm.value.attributeName !== 3) { + + @for (attributeValue of attributeValueData; track attributeValue) { + + {{ attributeValue.name }} + + } + + } + @if (depositProductIncentiveForm.value.attributeName === 3) { + + } + + {{ 'labels.inputs.Value' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + + } {{ 'labels.inputs.Type' | translate }} - - {{ incentiveType.value }} - + @for (incentiveType of incentiveTypeData; track incentiveType) { + + {{ incentiveType.value }} + + } {{ 'labels.inputs.Type' | translate }} {{ 'labels.commons.is' | translate }} diff --git a/src/app/products/deposit-product-incentive-form-dialog/deposit-product-incentive-form-dialog.component.ts b/src/app/products/deposit-product-incentive-form-dialog/deposit-product-incentive-form-dialog.component.ts index 409aa1d0c..0b193f629 100644 --- a/src/app/products/deposit-product-incentive-form-dialog/deposit-product-incentive-form-dialog.component.ts +++ b/src/app/products/deposit-product-incentive-form-dialog/deposit-product-incentive-form-dialog.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit, Inject } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { MatDialogRef, MAT_DIALOG_DATA, @@ -26,6 +26,11 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class DepositProductIncentiveFormDialogComponent implements OnInit { + dialogRef = inject>(MatDialogRef); + data = inject(MAT_DIALOG_DATA); + private formBuilder = inject(UntypedFormBuilder); + private translateService = inject(TranslateService); + layout: { addButtonText?: string; } = { @@ -42,12 +47,9 @@ export class DepositProductIncentiveFormDialogComponent implements OnInit { attributeValueData: any; incentiveTypeData: any; - constructor( - public dialogRef: MatDialogRef, - @Inject(MAT_DIALOG_DATA) public data: any, - private formBuilder: UntypedFormBuilder, - private translateService: TranslateService - ) { + constructor() { + const data = this.data; + this.createDepositProductIncentiveForm(); this.setConditionalControls(); this.layout = { ...this.layout, ...data.layout }; diff --git a/src/app/products/fixed-deposit-products/create-fixed-deposit-product/create-fixed-deposit-product.component.html b/src/app/products/fixed-deposit-products/create-fixed-deposit-product/create-fixed-deposit-product.component.html index 895db4a93..9657b96d1 100644 --- a/src/app/products/fixed-deposit-products/create-fixed-deposit-product/create-fixed-deposit-product.component.html +++ b/src/app/products/fixed-deposit-products/create-fixed-deposit-product/create-fixed-deposit-product.component.html @@ -85,17 +85,18 @@ - - {{ 'labels.inputs.PREVIEW' | translate }} - - - - + @if (fixedDepositProductFormValid) { + + {{ 'labels.inputs.PREVIEW' | translate }} + + + + } diff --git a/src/app/products/fixed-deposit-products/create-fixed-deposit-product/create-fixed-deposit-product.component.ts b/src/app/products/fixed-deposit-products/create-fixed-deposit-product/create-fixed-deposit-product.component.ts index b7b7fd1fe..97b070168 100644 --- a/src/app/products/fixed-deposit-products/create-fixed-deposit-product/create-fixed-deposit-product.component.ts +++ b/src/app/products/fixed-deposit-products/create-fixed-deposit-product/create-fixed-deposit-product.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, ViewChild } from '@angular/core'; +import { Component, ViewChild, inject } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; /** Custom Components */ @@ -42,6 +42,12 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class CreateFixedDepositProductComponent { + private route = inject(ActivatedRoute); + private productsService = inject(ProductsService); + private router = inject(Router); + private settingsService = inject(SettingsService); + private accounting = inject(Accounting); + @ViewChild(FixedDepositProductDetailsStepComponent, { static: true }) fixedDepositProductDetailsStep: FixedDepositProductDetailsStepComponent; @ViewChild(FixedDepositProductCurrencyStepComponent, { static: true }) @@ -67,13 +73,7 @@ export class CreateFixedDepositProductComponent { * @param {SettingsService} settingsService Settings Service. */ - constructor( - private route: ActivatedRoute, - private productsService: ProductsService, - private router: Router, - private settingsService: SettingsService, - private accounting: Accounting - ) { + constructor() { this.route.data.subscribe((data: { fixedDepositProductsTemplate: any }) => { this.fixedDepositProductsTemplate = data.fixedDepositProductsTemplate; }); diff --git a/src/app/products/fixed-deposit-products/edit-fixed-deposit-product/edit-fixed-deposit-product.component.html b/src/app/products/fixed-deposit-products/edit-fixed-deposit-product/edit-fixed-deposit-product.component.html index f741c0d77..f0b50fa18 100644 --- a/src/app/products/fixed-deposit-products/edit-fixed-deposit-product/edit-fixed-deposit-product.component.html +++ b/src/app/products/fixed-deposit-products/edit-fixed-deposit-product/edit-fixed-deposit-product.component.html @@ -84,17 +84,18 @@ - - {{ 'labels.inputs.PREVIEW' | translate }} - - - - + @if (fixedDepositProductFormValidAndNotPrinstine) { + + {{ 'labels.inputs.PREVIEW' | translate }} + + + + } diff --git a/src/app/products/fixed-deposit-products/edit-fixed-deposit-product/edit-fixed-deposit-product.component.ts b/src/app/products/fixed-deposit-products/edit-fixed-deposit-product/edit-fixed-deposit-product.component.ts index 1ba92c739..5b72dd32d 100644 --- a/src/app/products/fixed-deposit-products/edit-fixed-deposit-product/edit-fixed-deposit-product.component.ts +++ b/src/app/products/fixed-deposit-products/edit-fixed-deposit-product/edit-fixed-deposit-product.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, ViewChild } from '@angular/core'; +import { Component, ViewChild, inject } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; /** Custom Components */ @@ -42,6 +42,12 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class EditFixedDepositProductComponent { + private route = inject(ActivatedRoute); + private productsService = inject(ProductsService); + private router = inject(Router); + private settingsService = inject(SettingsService); + private accounting = inject(Accounting); + @ViewChild(FixedDepositProductDetailsStepComponent, { static: true }) fixedDepositProductDetailsStep: FixedDepositProductDetailsStepComponent; @ViewChild(FixedDepositProductCurrencyStepComponent, { static: true }) @@ -67,13 +73,7 @@ export class EditFixedDepositProductComponent { * @param {SettingsService} settingsService Settings Service */ - constructor( - private route: ActivatedRoute, - private productsService: ProductsService, - private router: Router, - private settingsService: SettingsService, - private accounting: Accounting - ) { + constructor() { this.route.data.subscribe((data: { fixedDepositProductAndTemplate: any }) => { this.fixedDepositProductsTemplate = data.fixedDepositProductAndTemplate; }); diff --git a/src/app/products/fixed-deposit-products/edit-fixed-deposit-product/fixed-deposit-product-and-template.resolver.ts b/src/app/products/fixed-deposit-products/edit-fixed-deposit-product/fixed-deposit-product-and-template.resolver.ts index 480493a05..4460c2b8a 100644 --- a/src/app/products/fixed-deposit-products/edit-fixed-deposit-product/fixed-deposit-product-and-template.resolver.ts +++ b/src/app/products/fixed-deposit-products/edit-fixed-deposit-product/fixed-deposit-product-and-template.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { ProductsService } from '../../products.service'; */ @Injectable() export class FixedDepositProductAndTemplateResolver { - /** - * @param {ProductsService} productsService Products service. - */ - constructor(private productsService: ProductsService) {} + private productsService = inject(ProductsService); /** * Returns the Fixed Deposits Product and Template. diff --git a/src/app/products/fixed-deposit-products/fixed-deposit-product-stepper/fixed-deposit-product-accounting-step/fixed-deposit-product-accounting-step.component.html b/src/app/products/fixed-deposit-products/fixed-deposit-product-stepper/fixed-deposit-product-accounting-step/fixed-deposit-product-accounting-step.component.html index 7a4ae8ff1..7d8d22f74 100644 --- a/src/app/products/fixed-deposit-products/fixed-deposit-product-stepper/fixed-deposit-product-accounting-step/fixed-deposit-product-accounting-step.component.html +++ b/src/app/products/fixed-deposit-products/fixed-deposit-product-stepper/fixed-deposit-product-accounting-step/fixed-deposit-product-accounting-step.component.html @@ -4,291 +4,265 @@ class="flex-98 layout-row gap-5percent layout-lt-md-column radio-group-spacing" formControlName="accountingRule" > - - {{ 'labels.accounting.' + accountingRule | translate }} - + @for (accountingRule of accountingRuleData; track accountingRule; let i = $index) { + + {{ 'labels.accounting.' + accountingRule | translate }} + + } -
    -

    {{ 'labels.heading.Assets' | translate }}

    - - - - - - - - - - - - -

    {{ 'labels.heading.Liabilities' | translate }}

    - - - - - - - - - - - - -

    {{ 'labels.heading.Expenses' | translate }}

    - - - - - - -

    {{ 'labels.heading.Income' | translate }}

    - - - - - - - - - -

    {{ 'labels.heading.Advanced Accounting Rules' | translate }}

    - - - -
    -
    -

    - {{ 'labels.heading.Configure Fund Sources for Payment Channels' | translate }} -

    - -
    - -
    - - +

    {{ 'labels.heading.Assets' | translate }}

    + + + @if (isAccrualAccounting()) { + - - - - - - - - - - - - - - - - - -
    {{ 'labels.heading.Payment Type' | translate }} - {{ paymentFundSource.paymentTypeId | find: paymentTypeData : 'id' : 'name' }} - {{ 'labels.inputs.Fund Source' | translate }} - {{ paymentFundSource.fundSourceAccountId | find: assetAccountData : 'id' : 'name' }} - {{ 'labels.buttons.Actions' | translate }} + + } + @if (isAccrualAccounting()) { + + + } + +

    {{ 'labels.heading.Liabilities' | translate }}

    + + + + + @if (isAccrualAccounting()) { + + + } + +

    {{ 'labels.heading.Expenses' | translate }}

    + + + +

    {{ 'labels.heading.Income' | translate }}

    + + + + + +

    {{ 'labels.heading.Advanced Accounting Rules' | translate }}

    + + @if (fixedDepositProductAccountingForm.value.advancedAccountingRules) { +
    +
    +

    + {{ 'labels.heading.Configure Fund Sources for Payment Channels' | translate }} +

    +
    - -
    -
    -
    -

    {{ 'labels.heading.Map Fees to Specific Income Accounts' | translate }}

    - -
    - -
    - - - - - - - - - - - - - - - - - - - -
    {{ 'labels.catalogs.Fees' | translate }} - {{ feesIncome.chargeId | find: chargeData : 'id' : 'name' }} - {{ 'labels.inputs.Income Account' | translate }} - {{ feesIncome.incomeAccountId | find: incomeAccountData : 'id' : 'name' }} - {{ 'labels.buttons.Actions' | translate }} - - -
    -
    - -
    -

    - {{ 'labels.catalogs.Penalties' | translate }} - {{ 'labels.heading.Map Penalties to Specific Income Accounts' | translate }} -

    - -
    - -
    - - - - - - - - - - - - - - - + + + + + + + + + + + + +
    {{ 'labels.inputs.Penalty' | translate }} - {{ penaltyIncome.chargeId | find: penaltyData : 'id' : 'name' }} - {{ 'labels.inputs.Income Account' | translate }} - {{ penaltyIncome.incomeAccountId | find: incomeAccountData : 'id' : 'name' }} - {{ 'labels.buttons.Actions' | translate }} - {{ 'labels.heading.Payment Type' | translate }} + {{ paymentFundSource.paymentTypeId | find: paymentTypeData : 'id' : 'name' }} + {{ 'labels.inputs.Fund Source' | translate }} + {{ paymentFundSource.fundSourceAccountId | find: assetAccountData : 'id' : 'name' }} + {{ 'labels.buttons.Actions' | translate }} + + +
    + } +
    + @if (existCharges()) { +
    +

    {{ 'labels.heading.Map Fees to Specific Income Accounts' | translate }}

    +
    + +
    + @if (feeToIncomeAccountMappings.value.length !== 0) { + + + + + + + + + + + + + + + +
    {{ 'labels.catalogs.Fees' | translate }} + {{ feesIncome.chargeId | find: chargeData : 'id' : 'name' }} + {{ 'labels.inputs.Income Account' | translate }} + {{ feesIncome.incomeAccountId | find: incomeAccountData : 'id' : 'name' }} + {{ 'labels.buttons.Actions' | translate }} + + +
    + } +
    + } + @if (existCharges()) { +
    +

    + {{ 'labels.catalogs.Penalties' | translate }} + {{ 'labels.heading.Map Penalties to Specific Income Accounts' | translate }} +

    +
    + +
    + @if (penaltyToIncomeAccountMappings.value.length !== 0) { + + + + + + + + + + + + + + + +
    {{ 'labels.inputs.Penalty' | translate }} + {{ penaltyIncome.chargeId | find: penaltyData : 'id' : 'name' }} + {{ 'labels.inputs.Income Account' | translate }} + {{ penaltyIncome.incomeAccountId | find: incomeAccountData : 'id' : 'name' }} + {{ 'labels.buttons.Actions' | translate }} + + +
    + } +
    + } +
    + }
    - + }
    diff --git a/src/app/products/fixed-deposit-products/fixed-deposit-product-stepper/fixed-deposit-product-accounting-step/fixed-deposit-product-accounting-step.component.ts b/src/app/products/fixed-deposit-products/fixed-deposit-product-stepper/fixed-deposit-product-accounting-step/fixed-deposit-product-accounting-step.component.ts index bba7ccfae..7ed392bf2 100644 --- a/src/app/products/fixed-deposit-products/fixed-deposit-product-stepper/fixed-deposit-product-accounting-step/fixed-deposit-product-accounting-step.component.ts +++ b/src/app/products/fixed-deposit-products/fixed-deposit-product-stepper/fixed-deposit-product-accounting-step/fixed-deposit-product-accounting-step.component.ts @@ -1,4 +1,4 @@ -import { Component, Input, OnInit } from '@angular/core'; +import { Component, Input, OnInit, inject } from '@angular/core'; import { UntypedFormArray, UntypedFormBuilder, @@ -67,6 +67,11 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class FixedDepositProductAccountingStepComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + dialog = inject(MatDialog); + private accounting = inject(Accounting); + private translateService = inject(TranslateService); + @Input() fixedDepositProductsTemplate: any; @Input() accountingRuleData: any; @Input() fixedDepositProductFormValid: boolean; @@ -92,12 +97,7 @@ export class FixedDepositProductAccountingStepComponent implements OnInit { 'actions' ]; - constructor( - private formBuilder: UntypedFormBuilder, - public dialog: MatDialog, - private accounting: Accounting, - private translateService: TranslateService - ) { + constructor() { this.createfixedDepositProductAccountingForm(); this.setConditionalControls(); } @@ -383,7 +383,6 @@ export class FixedDepositProductAccountingStepComponent implements OnInit { required: true, order: 2 }) - ]; return formfields; } @@ -406,7 +405,6 @@ export class FixedDepositProductAccountingStepComponent implements OnInit { required: true, order: 2 }) - ]; return formfields; } @@ -429,7 +427,6 @@ export class FixedDepositProductAccountingStepComponent implements OnInit { required: true, order: 2 }) - ]; return formfields; } diff --git a/src/app/products/fixed-deposit-products/fixed-deposit-product-stepper/fixed-deposit-product-charges-step/fixed-deposit-product-charges-step.component.html b/src/app/products/fixed-deposit-products/fixed-deposit-product-stepper/fixed-deposit-product-charges-step/fixed-deposit-product-charges-step.component.html index f036c5fcc..f98a03445 100644 --- a/src/app/products/fixed-deposit-products/fixed-deposit-product-stepper/fixed-deposit-product-charges-step/fixed-deposit-product-charges-step.component.html +++ b/src/app/products/fixed-deposit-products/fixed-deposit-product-stepper/fixed-deposit-product-charges-step/fixed-deposit-product-charges-step.component.html @@ -2,12 +2,11 @@ {{ 'labels.inputs.Charge' | translate }} - - {{ charge.name }} - + @for (charge of chargeData | chargesFilter: chargesDataSource : currencyCode.value; track charge) { + + {{ charge.name }} + + } diff --git a/src/app/products/fixed-deposit-products/fixed-deposit-product-stepper/fixed-deposit-product-charges-step/fixed-deposit-product-charges-step.component.ts b/src/app/products/fixed-deposit-products/fixed-deposit-product-stepper/fixed-deposit-product-charges-step/fixed-deposit-product-charges-step.component.ts index ce1416aae..aafe5ee71 100644 --- a/src/app/products/fixed-deposit-products/fixed-deposit-product-stepper/fixed-deposit-product-charges-step/fixed-deposit-product-charges-step.component.ts +++ b/src/app/products/fixed-deposit-products/fixed-deposit-product-stepper/fixed-deposit-product-charges-step/fixed-deposit-product-charges-step.component.ts @@ -1,4 +1,4 @@ -import { Component, Input, OnInit } from '@angular/core'; +import { Component, Input, OnInit, inject } from '@angular/core'; import { UntypedFormControl } from '@angular/forms'; import { MatDialog } from '@angular/material/dialog'; @@ -48,6 +48,9 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class FixedDepositProductChargesStepComponent implements OnInit { + dialog = inject(MatDialog); + private translateService = inject(TranslateService); + @Input() fixedDepositProductsTemplate: any; @Input() currencyCode: UntypedFormControl; @@ -62,11 +65,6 @@ export class FixedDepositProductChargesStepComponent implements OnInit { 'action' ]; - constructor( - public dialog: MatDialog, - private translateService: TranslateService - ) {} - ngOnInit() { this.chargeData = this.fixedDepositProductsTemplate.chargeOptions; if (!(this.fixedDepositProductsTemplate === undefined) && this.fixedDepositProductsTemplate.id) { diff --git a/src/app/products/fixed-deposit-products/fixed-deposit-product-stepper/fixed-deposit-product-currency-step/fixed-deposit-product-currency-step.component.html b/src/app/products/fixed-deposit-products/fixed-deposit-product-stepper/fixed-deposit-product-currency-step/fixed-deposit-product-currency-step.component.html index fe00ee119..79a0e64f6 100644 --- a/src/app/products/fixed-deposit-products/fixed-deposit-product-stepper/fixed-deposit-product-currency-step/fixed-deposit-product-currency-step.component.html +++ b/src/app/products/fixed-deposit-products/fixed-deposit-product-stepper/fixed-deposit-product-currency-step/fixed-deposit-product-currency-step.component.html @@ -3,9 +3,11 @@ {{ 'labels.inputs.Currency' | translate }} - - {{ currency.name }} - + @for (currency of currencyData; track currency) { + + {{ currency.name }} + + } {{ 'labels.inputs.Currency' | translate }} {{ 'labels.commons.is' | translate }} diff --git a/src/app/products/fixed-deposit-products/fixed-deposit-product-stepper/fixed-deposit-product-currency-step/fixed-deposit-product-currency-step.component.ts b/src/app/products/fixed-deposit-products/fixed-deposit-product-stepper/fixed-deposit-product-currency-step/fixed-deposit-product-currency-step.component.ts index fdde5e9bd..917ab0646 100644 --- a/src/app/products/fixed-deposit-products/fixed-deposit-product-stepper/fixed-deposit-product-currency-step/fixed-deposit-product-currency-step.component.ts +++ b/src/app/products/fixed-deposit-products/fixed-deposit-product-stepper/fixed-deposit-product-currency-step/fixed-deposit-product-currency-step.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit, Input } from '@angular/core'; +import { Component, OnInit, Input, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, Validators, ReactiveFormsModule } from '@angular/forms'; import { MatStepperPrevious, MatStepperNext } from '@angular/material/stepper'; import { FaIconComponent } from '@fortawesome/angular-fontawesome'; @@ -16,13 +16,15 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class FixedDepositProductCurrencyStepComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + @Input() fixedDepositProductsTemplate: any; fixedDepositProductCurrencyForm: UntypedFormGroup; currencyData: any; - constructor(private formBuilder: UntypedFormBuilder) { + constructor() { this.createFixedDepositProductCurrencyForm(); } diff --git a/src/app/products/fixed-deposit-products/fixed-deposit-product-stepper/fixed-deposit-product-details-step/fixed-deposit-product-details-step.component.html b/src/app/products/fixed-deposit-products/fixed-deposit-product-stepper/fixed-deposit-product-details-step/fixed-deposit-product-details-step.component.html index 4948d4a22..a55de800c 100644 --- a/src/app/products/fixed-deposit-products/fixed-deposit-product-stepper/fixed-deposit-product-details-step/fixed-deposit-product-details-step.component.html +++ b/src/app/products/fixed-deposit-products/fixed-deposit-product-stepper/fixed-deposit-product-details-step/fixed-deposit-product-details-step.component.html @@ -3,28 +3,34 @@ {{ 'labels.inputs.Product Name' | translate }} - - {{ 'labels.inputs.Product Name' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (fixedDepositProductDetailsForm.controls.name.hasError('required')) { + + {{ 'labels.inputs.Product Name' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Short Name' | translate }} - - {{ 'labels.inputs.Short Name' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (fixedDepositProductDetailsForm.controls.shortName.hasError('required')) { + + {{ 'labels.inputs.Short Name' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Description' | translate }} - - {{ 'labels.inputs.Description' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (fixedDepositProductDetailsForm.controls.description.hasError('required')) { + + {{ 'labels.inputs.Description' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + }
    diff --git a/src/app/products/fixed-deposit-products/fixed-deposit-product-stepper/fixed-deposit-product-details-step/fixed-deposit-product-details-step.component.ts b/src/app/products/fixed-deposit-products/fixed-deposit-product-stepper/fixed-deposit-product-details-step/fixed-deposit-product-details-step.component.ts index 2092b0df6..2eac38e3e 100644 --- a/src/app/products/fixed-deposit-products/fixed-deposit-product-stepper/fixed-deposit-product-details-step/fixed-deposit-product-details-step.component.ts +++ b/src/app/products/fixed-deposit-products/fixed-deposit-product-stepper/fixed-deposit-product-details-step/fixed-deposit-product-details-step.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit, Input } from '@angular/core'; +import { Component, OnInit, Input, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, Validators, ReactiveFormsModule } from '@angular/forms'; import { MatStepperPrevious, MatStepperNext } from '@angular/material/stepper'; import { FaIconComponent } from '@fortawesome/angular-fontawesome'; @@ -16,11 +16,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class FixedDepositProductDetailsStepComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + @Input() fixedDepositProductsTemplate: any; fixedDepositProductDetailsForm: UntypedFormGroup; - constructor(private formBuilder: UntypedFormBuilder) { + constructor() { this.createFixedDepositProductDetailsForm(); } diff --git a/src/app/products/fixed-deposit-products/fixed-deposit-product-stepper/fixed-deposit-product-interest-rate-chart-step/fixed-deposit-product-interest-rate-chart-step.component.html b/src/app/products/fixed-deposit-products/fixed-deposit-product-stepper/fixed-deposit-product-interest-rate-chart-step/fixed-deposit-product-interest-rate-chart-step.component.html index 9de6124af..6b0e03497 100644 --- a/src/app/products/fixed-deposit-products/fixed-deposit-product-stepper/fixed-deposit-product-interest-rate-chart-step/fixed-deposit-product-interest-rate-chart-step.component.html +++ b/src/app/products/fixed-deposit-products/fixed-deposit-product-stepper/fixed-deposit-product-interest-rate-chart-step/fixed-deposit-product-interest-rate-chart-step.component.html @@ -12,276 +12,275 @@ -
    - - -
    -
    - -
    - - - {{ 'labels.inputs.Name' | translate }} - - - {{ 'labels.inputs.Name' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - - - {{ 'labels.inputs.Description' | translate }} - - - {{ 'labels.inputs.Description' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - - - {{ 'labels.inputs.From Date' | translate }} - - - - - {{ 'labels.inputs.Valid from Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - - - {{ 'labels.inputs.End Date' | translate }} - - - - - -
    - - {{ 'labels.inputs.Is primary grouping by amount?' | translate }} - -
    - -
    - -
    - -
    -

    {{ 'labels.heading.It is required to add at least one Slab' | translate }}

    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    {{ 'labels.inputs.Period' | translate }} - {{ - chartSlab.fromPeriod + - ' - ' + - chartSlab.toPeriod + - ' ' + - (chartSlab.periodType | find: periodTypeData : 'id' : 'value') - }} - {{ 'labels.inputs.Amount Range' | translate }} - {{ chartSlab.amountRangeFrom + ' - ' + chartSlab.amountRangeTo }} - {{ 'labels.inputs.Interest' | translate }}{{ chartSlab.annualInterestRate }} %{{ 'labels.inputs.Description' | translate }} - {{ chartSlab.description }} - {{ 'labels.inputs.Actions' | translate }} - - - - + +
    +
    + -
    - - + + + + {{ 'labels.inputs.Name' | translate }} + + @if (chart.get('name')?.touched && chart.get('name')?.hasError('required')) { + + {{ 'labels.inputs.Name' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + + {{ 'labels.inputs.Description' | translate }} + + @if (chart.get('description')?.touched && chart.get('description')?.hasError('required')) { + + {{ 'labels.inputs.Description' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + + {{ 'labels.inputs.From Date' | translate }} + + + + + {{ 'labels.inputs.Valid from Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + + + {{ 'labels.inputs.End Date' | translate }} + + + + +
    + + {{ 'labels.inputs.Is primary grouping by amount?' | translate }} + +
    +
    + +
    + @if (chart.value.chartSlabs.length === 0) { +
    +

    {{ 'labels.heading.It is required to add at least one Slab' | translate }}

    +
    + } + @if (chart.value.chartSlabs.length !== 0) { +
    + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + - - - - -
    {{ 'labels.inputs.Period' | translate }} + {{ + chartSlab.fromPeriod + + ' - ' + + chartSlab.toPeriod + + ' ' + + (chartSlab.periodType | find: periodTypeData : 'id' : 'value') + }} + {{ 'labels.inputs.Amount Range' | translate }} + {{ chartSlab.amountRangeFrom + ' - ' + chartSlab.amountRangeTo }} + {{ 'labels.inputs.Interest' | translate }}{{ chartSlab.annualInterestRate }} %{{ 'labels.inputs.Description' | translate }} + {{ chartSlab.description }} + {{ 'labels.inputs.Actions' | translate }} + {{ 'labels.inputs.Entity Type' | translate }} - {{ incentive.entityType | find: entityTypeData : 'id' : 'value' }} - {{ 'labels.inputs.Attribute Name' | translate }} - {{ incentive.attributeName | find: attributeNameData : 'id' : 'value' }} - {{ 'labels.inputs.Condition Type' | translate }} - {{ incentive.conditionType | find: conditionTypeData : 'id' : 'value' }} - {{ 'labels.inputs.Attribute Value' | translate }} - {{ incentive.attributeValue | find: genderData : 'id' : 'name' }} - {{ incentive.attributeValue }} - {{ - incentive.attributeValue | find: clientTypeData : 'id' : 'name' - }} - {{ - incentive.attributeValue | find: clientClassificationData : 'id' : 'name' - }} - {{ 'labels.inputs.Incentive Type' | translate }} - {{ incentive.incentiveType | find: incentiveTypeData : 'id' : 'value' }} - {{ 'labels.inputs.Interest' | translate }} - {{ incentive.amount }} - {{ 'labels.inputs.Actions' | translate }} + + + + + +
    + +

    + {{ 'labels.heading.Incentives' | translate }} +

    +
    - -
    - -
    -
    +
    + @if (chartSlab.incentives.length) { + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {{ 'labels.inputs.Entity Type' | translate }} + {{ incentive.entityType | find: entityTypeData : 'id' : 'value' }} + {{ 'labels.inputs.Attribute Name' | translate }} + {{ incentive.attributeName | find: attributeNameData : 'id' : 'value' }} + {{ 'labels.inputs.Condition Type' | translate }} + {{ incentive.conditionType | find: conditionTypeData : 'id' : 'value' }} + {{ 'labels.inputs.Attribute Value' | translate }} + @switch (incentive.attributeName) { + @case (2) { + {{ incentive.attributeValue | find: genderData : 'id' : 'name' }} + } + @case (3) { + {{ incentive.attributeValue }} + } + @case (4) { + {{ incentive.attributeValue | find: clientTypeData : 'id' : 'name' }} + } + @case (5) { + {{ + incentive.attributeValue | find: clientClassificationData : 'id' : 'name' + }} + } + } + {{ 'labels.inputs.Incentive Type' | translate }} + {{ incentive.incentiveType | find: incentiveTypeData : 'id' : 'value' }} + {{ 'labels.inputs.Interest' | translate }} + {{ incentive.amount }} + {{ 'labels.inputs.Actions' | translate }} + + +
    + } + +
    + + + + + + + } + - + }
    diff --git a/src/app/products/fixed-deposit-products/fixed-deposit-product-stepper/fixed-deposit-product-interest-rate-chart-step/fixed-deposit-product-interest-rate-chart-step.component.ts b/src/app/products/fixed-deposit-products/fixed-deposit-product-stepper/fixed-deposit-product-interest-rate-chart-step/fixed-deposit-product-interest-rate-chart-step.component.ts index a23aefb2d..db3dff3a7 100644 --- a/src/app/products/fixed-deposit-products/fixed-deposit-product-stepper/fixed-deposit-product-interest-rate-chart-step/fixed-deposit-product-interest-rate-chart-step.component.ts +++ b/src/app/products/fixed-deposit-products/fixed-deposit-product-stepper/fixed-deposit-product-interest-rate-chart-step/fixed-deposit-product-interest-rate-chart-step.component.ts @@ -1,6 +1,6 @@ /** Angular Imports */ import { animate, state, style, transition, trigger } from '@angular/animations'; -import { Component, Input, OnInit } from '@angular/core'; +import { Component, Input, OnInit, inject } from '@angular/core'; import { UntypedFormArray, UntypedFormBuilder, @@ -27,7 +27,7 @@ import { SettingsService } from 'app/settings/settings.service'; import { MatTooltip } from '@angular/material/tooltip'; import { MatButton, MatIconButton } from '@angular/material/button'; import { FaIconComponent } from '@fortawesome/angular-fontawesome'; -import { NgFor, NgIf, NgSwitch, NgSwitchCase } from '@angular/common'; + import { MatDivider } from '@angular/material/divider'; import { MatCheckbox } from '@angular/material/checkbox'; import { @@ -54,8 +54,8 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; trigger('expandChartSlab', [ state('collapsed', style({ height: '0px', minHeight: '0' })), state('expanded', style({ height: '*' })), - transition('expanded <=> collapsed', animate('225ms cubic-bezier(0.4, 0.0, 0.2, 1)'))]) - + transition('expanded <=> collapsed', animate('225ms cubic-bezier(0.4, 0.0, 0.2, 1)')) + ]) ], imports: [ ...STANDALONE_SHARED_IMPORTS, @@ -70,8 +70,6 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; MatHeaderCell, MatCellDef, MatCell, - NgSwitch, - NgSwitchCase, MatHeaderRowDef, MatHeaderRow, MatRowDef, @@ -82,6 +80,12 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class FixedDepositProductInterestRateChartStepComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + dialog = inject(MatDialog); + private dateUtils = inject(Dates); + private settingsService = inject(SettingsService); + private translateService = inject(TranslateService); + @Input() fixedDepositProductsTemplate: any; fixedDepositProductInterestRateChartForm: UntypedFormGroup; @@ -121,13 +125,7 @@ export class FixedDepositProductInterestRateChartStepComponent implements OnInit * @param {SettingsService} settingsService Settings Service. */ - constructor( - private formBuilder: UntypedFormBuilder, - public dialog: MatDialog, - private dateUtils: Dates, - private settingsService: SettingsService, - private translateService: TranslateService - ) { + constructor() { this.createFixedDepositProductInterestRateChartForm(); } @@ -497,7 +495,6 @@ export class FixedDepositProductInterestRateChartStepComponent implements OnInit required: true, order: 7 }) - ]; return formfields; } diff --git a/src/app/products/fixed-deposit-products/fixed-deposit-product-stepper/fixed-deposit-product-preview-step/fixed-deposit-product-preview-step.component.html b/src/app/products/fixed-deposit-products/fixed-deposit-product-stepper/fixed-deposit-product-preview-step/fixed-deposit-product-preview-step.component.html index d35286e43..9367fef71 100644 --- a/src/app/products/fixed-deposit-products/fixed-deposit-product-stepper/fixed-deposit-product-preview-step/fixed-deposit-product-preview-step.component.html +++ b/src/app/products/fixed-deposit-products/fixed-deposit-product-stepper/fixed-deposit-product-preview-step/fixed-deposit-product-preview-step.component.html @@ -10,10 +10,12 @@ {{ fixedDepositProduct.shortName }}
    -
    - {{ 'labels.inputs.Description' | translate }}: - {{ fixedDepositProduct.description }} -
    + @if (fixedDepositProduct.description) { +
    + {{ 'labels.inputs.Description' | translate }}: + {{ fixedDepositProduct.description }} +
    + }

    {{ 'labels.inputs.Currency' | translate }}

    @@ -89,15 +91,17 @@

    {{ 'labels.heading.Settings' | translate }}

    -
    - {{ 'labels.inputs.Lock-in Period' | translate }}: - {{ - fixedDepositProduct.lockinPeriodFrequency + - ' ' + - (fixedDepositProduct.lockinPeriodFrequencyType - | find: fixedDepositProductsTemplate.lockinPeriodFrequencyTypeOptions : 'id' : 'value') - }} -
    + @if (fixedDepositProduct.lockinPeriodFrequency) { +
    + {{ 'labels.inputs.Lock-in Period' | translate }}: + {{ + fixedDepositProduct.lockinPeriodFrequency + + ' ' + + (fixedDepositProduct.lockinPeriodFrequencyType + | find: fixedDepositProductsTemplate.lockinPeriodFrequencyTypeOptions : 'id' : 'value') + }} +
    + }
    {{ 'labels.inputs.Minimum Deposit Term' | translate }}: @@ -109,407 +113,405 @@ }}
    -
    - {{ 'labels.inputs.And thereafter, in Multiples of' | translate }}: - {{ - fixedDepositProduct.inMultiplesOfDepositTerm + - ' ' + - (fixedDepositProduct.inMultiplesOfDepositTermTypeId - | find: fixedDepositProductsTemplate.periodFrequencyTypeOptions : 'id' : 'value') - }} -
    + @if (fixedDepositProduct.inMultiplesOfDepositTerm) { +
    + {{ 'labels.inputs.And thereafter, in Multiples of' | translate }}: + {{ + fixedDepositProduct.inMultiplesOfDepositTerm + + ' ' + + (fixedDepositProduct.inMultiplesOfDepositTermTypeId + | find: fixedDepositProductsTemplate.periodFrequencyTypeOptions : 'id' : 'value') + }} +
    + } -
    - {{ 'labels.inputs.Maximum Deposit Term' | translate }}: - {{ - fixedDepositProduct.maxDepositTerm + - ' ' + - (fixedDepositProduct.maxDepositTermTypeId - | find: fixedDepositProductsTemplate.periodFrequencyTypeOptions : 'id' : 'value') - }} -
    + @if (fixedDepositProduct.maxDepositTerm) { +
    + {{ 'labels.inputs.Maximum Deposit Term' | translate }}: + {{ + fixedDepositProduct.maxDepositTerm + + ' ' + + (fixedDepositProduct.maxDepositTermTypeId + | find: fixedDepositProductsTemplate.periodFrequencyTypeOptions : 'id' : 'value') + }} +
    + }
    {{ 'labels.inputs.Apply Penal Interest (less)' | translate }}: {{ fixedDepositProduct.preClosurePenalApplicable | yesNo }}
    -
    - {{ 'labels.inputs.Penal Interest' | translate }} (%): - {{ - fixedDepositProduct.preClosurePenalInterest + - '% (' + - (fixedDepositProduct.preClosurePenalInterestOnTypeId - | find: fixedDepositProductsTemplate.preClosurePenalInterestOnTypeOptions : 'id' : 'value') + - ')' - }} -
    + @if (fixedDepositProduct.preClosurePenalApplicable) { +
    + {{ 'labels.inputs.Penal Interest' | translate }} (%): + {{ + fixedDepositProduct.preClosurePenalInterest + + '% (' + + (fixedDepositProduct.preClosurePenalInterestOnTypeId + | find: fixedDepositProductsTemplate.preClosurePenalInterestOnTypeOptions : 'id' : 'value') + + ')' + }} +
    + }
    {{ 'labels.inputs.Withhold Tax is Applicable' | translate }}: {{ fixedDepositProduct.withHoldTax | yesNo }}
    -
    - {{ 'labels.inputs.Tax Group' | translate }}: - {{ - fixedDepositProduct.taxGroupId | find: fixedDepositProductsTemplate.taxGroupOptions : 'id' : 'name' - }} -
    - -
    -

    {{ 'labels.heading.Interest Rate Charts' | translate }}

    - - -
    -
    - {{ 'labels.inputs.Name' | translate }}: - {{ chart.name }} -
    - -
    - {{ 'labels.inputs.Description' | translate }}: - {{ chart.description }} -
    - -
    - {{ 'labels.inputs.From Date' | translate }}: - {{ chart.fromDate | dateFormat }} -
    - -
    - {{ 'labels.inputs.End Date' | translate }}: - {{ chart.endDate | dateFormat }} -
    - -
    - {{ 'labels.inputs.Primary Grouping by Amount' | translate }}: - {{ fixedDepositProduct.isPrimaryGroupingByAmount | yesNo }} -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    {{ 'labels.inputs.Period' | translate }} - {{ - chartSlab.fromPeriod + - ' - ' + - chartSlab.toPeriod + - ' ' + - (chartSlab.periodType | find: fixedDepositProductsTemplate.chartTemplate.periodTypes : 'id' : 'value') - }} - {{ 'labels.inputs.Amount Range' | translate }} - {{ chartSlab.amountRangeFrom + ' - ' + chartSlab.amountRangeTo }} - {{ 'labels.inputs.Interest' | translate }} - {{ chartSlab.annualInterestRate }} - {{ 'labels.inputs.Description' | translate }} - {{ chartSlab.description }} - {{ 'labels.inputs.Actions' | translate }} - - -
    - -

    - {{ 'labels.heading.Incentives' | translate }} -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    {{ 'labels.inputs.Entity Type' | translate }} - {{ - incentive.entityType - | find: fixedDepositProductsTemplate.chartTemplate.entityTypeOptions : 'id' : 'value' - }} - {{ 'labels.inputs.Attribute Name' | translate }} - {{ - incentive.attributeName - | find: fixedDepositProductsTemplate.chartTemplate.attributeNameOptions : 'id' : 'value' - }} - {{ 'labels.inputs.Condition Type' | translate }} - {{ - incentive.conditionType - | find: fixedDepositProductsTemplate.chartTemplate.conditionTypeOptions : 'id' : 'value' - }} - {{ 'labels.inputs.Attribute Value' | translate }} - {{ - incentive.attributeValue - | find: fixedDepositProductsTemplate.chartTemplate.genderOptions : 'id' : 'name' - }} - {{ incentive.attributeValue }} - {{ - incentive.attributeValue - | find: fixedDepositProductsTemplate.chartTemplate.clientTypeOptions : 'id' : 'name' - }} - {{ - incentive.attributeValue - | find: fixedDepositProductsTemplate.chartTemplate.clientClassificationOptions : 'id' : 'name' - }} - {{ 'labels.inputs.Incentive Type' | translate }} - {{ - incentive.incentiveType - | find: fixedDepositProductsTemplate.chartTemplate.incentiveTypeOptions : 'id' : 'value' - }} - {{ 'labels.inputs.Amount' | translate }} - {{ incentive.amount | formatNumber }} -
    -
    -
    -
    - - + @if (fixedDepositProduct.withHoldTax) { +
    + {{ 'labels.inputs.Tax Group' | translate }}: + {{ + fixedDepositProduct.taxGroupId | find: fixedDepositProductsTemplate.taxGroupOptions : 'id' : 'name' + }}
    -
    + } -
    -

    {{ 'labels.heading.Charges' | translate }}

    + @if (fixedDepositProduct.charts.length !== 0) { +
    +

    {{ 'labels.heading.Interest Rate Charts' | translate }}

    + + @for (chart of fixedDepositProduct.charts; track chart; let chartIndex = $index) { +
    + @if (chart.name) { +
    + {{ 'labels.inputs.Name' | translate }}: + {{ chart.name }} +
    + } + @if (chart.description) { +
    + {{ 'labels.inputs.Description' | translate }}: + {{ chart.description }} +
    + } +
    + {{ 'labels.inputs.From Date' | translate }}: + {{ chart.fromDate | dateFormat }} +
    + @if (chart.endDate) { +
    + {{ 'labels.inputs.End Date' | translate }}: + {{ chart.endDate | dateFormat }} +
    + } +
    + {{ 'labels.inputs.Primary Grouping by Amount' | translate }}: + {{ fixedDepositProduct.isPrimaryGroupingByAmount | yesNo }} +
    + @if (chart.chartSlabs.length !== 0) { + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {{ 'labels.inputs.Period' | translate }} + {{ + chartSlab.fromPeriod + + ' - ' + + chartSlab.toPeriod + + ' ' + + (chartSlab.periodType + | find: fixedDepositProductsTemplate.chartTemplate.periodTypes : 'id' : 'value') + }} + {{ 'labels.inputs.Amount Range' | translate }} + {{ chartSlab.amountRangeFrom + ' - ' + chartSlab.amountRangeTo }} + {{ 'labels.inputs.Interest' | translate }} + {{ chartSlab.annualInterestRate }} + {{ 'labels.inputs.Description' | translate }} + {{ chartSlab.description }} + {{ 'labels.inputs.Actions' | translate }} + + +
    + +

    + {{ 'labels.heading.Incentives' | translate }} +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {{ 'labels.inputs.Entity Type' | translate }} + {{ + incentive.entityType + | find: fixedDepositProductsTemplate.chartTemplate.entityTypeOptions : 'id' : 'value' + }} + {{ 'labels.inputs.Attribute Name' | translate }} + {{ + incentive.attributeName + | find: fixedDepositProductsTemplate.chartTemplate.attributeNameOptions : 'id' : 'value' + }} + {{ 'labels.inputs.Condition Type' | translate }} + {{ + incentive.conditionType + | find: fixedDepositProductsTemplate.chartTemplate.conditionTypeOptions : 'id' : 'value' + }} + {{ 'labels.inputs.Attribute Value' | translate }} + @switch (incentive.attributeName) { + @case (2) { + {{ + incentive.attributeValue + | find: fixedDepositProductsTemplate.chartTemplate.genderOptions : 'id' : 'name' + }} + } + @case (3) { + {{ incentive.attributeValue }} + } + @case (4) { + {{ + incentive.attributeValue + | find: fixedDepositProductsTemplate.chartTemplate.clientTypeOptions : 'id' : 'name' + }} + } + @case (5) { + {{ + incentive.attributeValue + | find + : fixedDepositProductsTemplate.chartTemplate.clientClassificationOptions + : 'id' + : 'name' + }} + } + } + {{ 'labels.inputs.Incentive Type' | translate }} + {{ + incentive.incentiveType + | find: fixedDepositProductsTemplate.chartTemplate.incentiveTypeOptions : 'id' : 'value' + }} + {{ 'labels.inputs.Amount' | translate }} + {{ incentive.amount | formatNumber }} +
    +
    +
    +
    + } + +
    + } +
    + } - - - - - - - - - - - - - - - - - - - - - - - - -
    {{ 'labels.inputs.Name' | translate }} - {{ charge.name + ', ' + charge.currency.displaySymbol }} - {{ 'labels.inputs.Type' | translate }} - {{ charge.chargeCalculationType.value }} - {{ 'labels.inputs.Amount' | translate }} - {{ charge.amount }} - {{ 'labels.inputs.Collected On' | translate }} - {{ charge.chargeTimeType.value }} -
    -
    + @if (fixedDepositProduct.charges.length) { +
    +

    {{ 'labels.heading.Charges' | translate }}

    + + + + + + + + + + + + + + + + + + + + +
    {{ 'labels.inputs.Name' | translate }} + {{ charge.name + ', ' + charge.currency.displaySymbol }} + {{ 'labels.inputs.Type' | translate }} + {{ charge.chargeCalculationType.value }} + {{ 'labels.inputs.Amount' | translate }} + {{ charge.amount }} + {{ 'labels.inputs.Collected On' | translate }} + {{ charge.chargeTimeType.value }} +
    +
    + }

    {{ 'labels.heading.Accounting' | translate }}

    - - + @if (!isNoneAccounting()) { + + + } -
    -

    {{ 'labels.heading.Advanced Accounting Rules' | translate }}

    - - -
    -

    {{ 'labels.heading.Fund Sources for Payment Channels' | translate }}

    - - - - - - - - - - - - - -
    {{ 'labels.inputs.Payment Type' | translate }} - {{ - paymentFundSource.paymentTypeId | find: fixedDepositProductsTemplate.paymentTypeOptions : 'id' : 'name' - }} - {{ 'labels.inputs.Fund Source' | translate }} - {{ - paymentFundSource.fundSourceAccountId - | find: fixedDepositProductsTemplate.accountingMappingOptions.assetAccountOptions : 'id' : 'name' - }} -
    + @if ( + fixedDepositProduct.advancedAccountingRules && + (fixedDepositProduct.paymentChannelToFundSourceMappings?.length || + fixedDepositProduct.feeToIncomeAccountMappings?.length || + fixedDepositProduct.penaltyToIncomeAccountMappings?.length) + ) { +
    +

    {{ 'labels.heading.Advanced Accounting Rules' | translate }}

    + + @if (fixedDepositProduct.paymentChannelToFundSourceMappings?.length) { +
    +

    {{ 'labels.heading.Fund Sources for Payment Channels' | translate }}

    + + + + + + + + + + + +
    {{ 'labels.inputs.Payment Type' | translate }} + {{ + paymentFundSource.paymentTypeId + | find: fixedDepositProductsTemplate.paymentTypeOptions : 'id' : 'name' + }} + {{ 'labels.inputs.Fund Source' | translate }} + {{ + paymentFundSource.fundSourceAccountId + | find: fixedDepositProductsTemplate.accountingMappingOptions.assetAccountOptions : 'id' : 'name' + }} +
    +
    + } + @if (fixedDepositProduct.feeToIncomeAccountMappings?.length) { +
    +

    {{ 'labels.heading.Fees to Specific Income Accounts' | translate }}

    + + + + + + + + + + + +
    {{ 'labels.inputs.Fees' | translate }} + {{ feesIncome.chargeId | find: fixedDepositProductsTemplate.chargeOptions : 'id' : 'name' }} + {{ 'labels.inputs.Income Account' | translate }} + {{ + feesIncome.incomeAccountId + | find: fixedDepositProductsTemplate.accountingMappingOptions.incomeAccountOptions : 'id' : 'name' + }} +
    +
    + } + @if (fixedDepositProduct.penaltyToIncomeAccountMappings?.length) { +
    +

    {{ 'labels.heading.Penalties to Specific Income Accounts' | translate }}

    + + + + + + + + + + + +
    {{ 'labels.inputs.Penalty' | translate }} + {{ penaltyIncome.chargeId | find: fixedDepositProductsTemplate.penaltyOptions : 'id' : 'name' }} + {{ 'labels.inputs.Income Account' | translate }} + {{ + penaltyIncome.incomeAccountId + | find: fixedDepositProductsTemplate.accountingMappingOptions.incomeAccountOptions : 'id' : 'name' + }} +
    +
    + }
    - -
    -

    {{ 'labels.heading.Fees to Specific Income Accounts' | translate }}

    - - - - - - - - - - - - - - -
    {{ 'labels.inputs.Fees' | translate }} - {{ feesIncome.chargeId | find: fixedDepositProductsTemplate.chargeOptions : 'id' : 'name' }} - {{ 'labels.inputs.Income Account' | translate }} - {{ - feesIncome.incomeAccountId - | find: fixedDepositProductsTemplate.accountingMappingOptions.incomeAccountOptions : 'id' : 'name' - }} -
    -
    - -
    -

    {{ 'labels.heading.Penalties to Specific Income Accounts' | translate }}

    - - - - - - - - - - - - - - -
    {{ 'labels.inputs.Penalty' | translate }} - {{ penaltyIncome.chargeId | find: fixedDepositProductsTemplate.penaltyOptions : 'id' : 'name' }} - {{ 'labels.inputs.Income Account' | translate }} - {{ - penaltyIncome.incomeAccountId - | find: fixedDepositProductsTemplate.accountingMappingOptions.incomeAccountOptions : 'id' : 'name' - }} -
    -
    -
    + }
    diff --git a/src/app/products/fixed-deposit-products/fixed-deposit-product-stepper/fixed-deposit-product-preview-step/fixed-deposit-product-preview-step.component.ts b/src/app/products/fixed-deposit-products/fixed-deposit-product-stepper/fixed-deposit-product-preview-step/fixed-deposit-product-preview-step.component.ts index cc197ab60..cac78bbfd 100644 --- a/src/app/products/fixed-deposit-products/fixed-deposit-product-stepper/fixed-deposit-product-preview-step/fixed-deposit-product-preview-step.component.ts +++ b/src/app/products/fixed-deposit-products/fixed-deposit-product-stepper/fixed-deposit-product-preview-step/fixed-deposit-product-preview-step.component.ts @@ -1,9 +1,9 @@ -import { Component, OnInit, Input, Output, EventEmitter, SimpleChanges, OnChanges } from '@angular/core'; +import { Component, OnInit, Input, Output, EventEmitter, SimpleChanges, OnChanges, inject } from '@angular/core'; import { trigger, state, transition, animate, style } from '@angular/animations'; import { Accounting } from 'app/core/utils/accounting'; import { OptionData } from 'app/shared/models/option-data.model'; import { MatDivider } from '@angular/material/divider'; -import { NgIf, NgFor, NgSwitch, NgSwitchCase } from '@angular/common'; + import { MatTable, MatColumnDef, @@ -33,8 +33,8 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; trigger('expandChartSlab', [ state('collapsed', style({ height: '0px', minHeight: '0' })), state('expanded', style({ height: '*' })), - transition('expanded <=> collapsed', animate('225ms cubic-bezier(0.4, 0.0, 0.2, 1)'))]) - + transition('expanded <=> collapsed', animate('225ms cubic-bezier(0.4, 0.0, 0.2, 1)')) + ]) ], imports: [ ...STANDALONE_SHARED_IMPORTS, @@ -46,8 +46,6 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; MatCellDef, MatCell, FaIconComponent, - NgSwitch, - NgSwitchCase, MatHeaderRowDef, MatHeaderRow, MatRowDef, @@ -61,6 +59,8 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class FixedDepositProductPreviewStepComponent implements OnInit, OnChanges { + private accounting = inject(Accounting); + @Input() fixedDepositProductsTemplate: any; @Input() chartSlabsDisplayedColumns: any[]; @Input() accountingRuleData: any; @@ -96,8 +96,6 @@ export class FixedDepositProductPreviewStepComponent implements OnInit, OnChange accountingMappings: any = {}; accountingRule: OptionData; - constructor(private accounting: Accounting) {} - ngOnInit() { this.setCurrentValues(); } diff --git a/src/app/products/fixed-deposit-products/fixed-deposit-product-stepper/fixed-deposit-product-settings-step/fixed-deposit-product-settings-step.component.html b/src/app/products/fixed-deposit-products/fixed-deposit-product-stepper/fixed-deposit-product-settings-step/fixed-deposit-product-settings-step.component.html index b851dae1b..09817f818 100644 --- a/src/app/products/fixed-deposit-products/fixed-deposit-product-stepper/fixed-deposit-product-settings-step/fixed-deposit-product-settings-step.component.html +++ b/src/app/products/fixed-deposit-products/fixed-deposit-product-stepper/fixed-deposit-product-settings-step/fixed-deposit-product-settings-step.component.html @@ -16,12 +16,11 @@ {{ 'labels.inputs.Type' | translate }} - - {{ lockinPeriodFrequencyType.value }} - + @for (lockinPeriodFrequencyType of lockinPeriodFrequencyTypeData; track lockinPeriodFrequencyType) { + + {{ lockinPeriodFrequencyType.value }} + + } @@ -42,9 +41,11 @@ {{ 'labels.inputs.Frequency Type' | translate }} - - {{ periodFrequencyType.value }} - + @for (periodFrequencyType of periodFrequencyTypeData; track periodFrequencyType) { + + {{ periodFrequencyType.value }} + + } {{ 'labels.inputs.Minimum Deposit Term Frequency Type' | translate }} {{ 'labels.commons.is' | translate }} @@ -68,9 +69,11 @@ {{ 'labels.inputs.Type' | translate }} - - {{ periodFrequencyType.value }} - + @for (periodFrequencyType of periodFrequencyTypeData; track periodFrequencyType) { + + {{ periodFrequencyType.value }} + + } @@ -87,9 +90,11 @@ {{ 'labels.inputs.Type' | translate }} - - {{ periodFrequencyType.value }} - + @for (periodFrequencyType of periodFrequencyTypeData; track periodFrequencyType) { + + {{ periodFrequencyType.value }} + + } @@ -115,12 +120,11 @@ {{ 'labels.inputs.Period' | translate }} - - {{ preClosurePenalInterestOnType.value }} - + @for (preClosurePenalInterestOnType of preClosurePenalInterestOnTypeData; track preClosurePenalInterestOnType) { + + {{ preClosurePenalInterestOnType.value }} + + } @@ -135,18 +139,22 @@ {{ 'labels.inputs.Is Withhold Tax Applicable' | translate }} - - {{ 'labels.inputs.Tax Group' | translate }} - - - {{ taxGroup.name }} - - - - {{ 'labels.inputs.Tax Group' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - + @if (fixedDepositProductSettingsForm.value.withHoldTax) { + + {{ 'labels.inputs.Tax Group' | translate }} + + @for (taxGroup of taxGroupData; track taxGroup) { + + {{ taxGroup.name }} + + } + + + {{ 'labels.inputs.Tax Group' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + + }
    diff --git a/src/app/products/fixed-deposit-products/fixed-deposit-product-stepper/fixed-deposit-product-settings-step/fixed-deposit-product-settings-step.component.ts b/src/app/products/fixed-deposit-products/fixed-deposit-product-stepper/fixed-deposit-product-settings-step/fixed-deposit-product-settings-step.component.ts index 647b4a35e..2ac4b5edf 100644 --- a/src/app/products/fixed-deposit-products/fixed-deposit-product-stepper/fixed-deposit-product-settings-step/fixed-deposit-product-settings-step.component.ts +++ b/src/app/products/fixed-deposit-products/fixed-deposit-product-stepper/fixed-deposit-product-settings-step/fixed-deposit-product-settings-step.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit, Input } from '@angular/core'; +import { Component, OnInit, Input, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, @@ -28,6 +28,8 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class FixedDepositProductSettingsStepComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + @Input() fixedDepositProductsTemplate: any; fixedDepositProductSettingsForm: UntypedFormGroup; @@ -37,7 +39,7 @@ export class FixedDepositProductSettingsStepComponent implements OnInit { preClosurePenalInterestOnTypeData: any; taxGroupData: any; - constructor(private formBuilder: UntypedFormBuilder) { + constructor() { this.createFixedDepositProductSettingsForm(); this.setConditionalControls(); } diff --git a/src/app/products/fixed-deposit-products/fixed-deposit-product-stepper/fixed-deposit-product-terms-step/fixed-deposit-product-terms-step.component.html b/src/app/products/fixed-deposit-products/fixed-deposit-product-stepper/fixed-deposit-product-terms-step/fixed-deposit-product-terms-step.component.html index c60d0a5ad..50e43ead8 100644 --- a/src/app/products/fixed-deposit-products/fixed-deposit-product-stepper/fixed-deposit-product-terms-step/fixed-deposit-product-terms-step.component.html +++ b/src/app/products/fixed-deposit-products/fixed-deposit-product-stepper/fixed-deposit-product-terms-step/fixed-deposit-product-terms-step.component.html @@ -47,12 +47,11 @@ matTooltip="{{ 'tooltips.The period at which interest rate' | translate }}" required > - - {{ interestCompoundingPeriodType.value }} - + @for (interestCompoundingPeriodType of interestCompoundingPeriodTypeData; track interestCompoundingPeriodType) { + + {{ interestCompoundingPeriodType.value }} + + } {{ 'labels.inputs.Interest Compounding Period' | translate }} {{ 'labels.commons.is' | translate }} @@ -67,12 +66,11 @@ matTooltip="{{ 'tooltips.The period at which interest rate is posted or credited' | translate }}" required > - - {{ interestPostingPeriodType.value }} - + @for (interestPostingPeriodType of interestPostingPeriodTypeData; track interestPostingPeriodType) { + + {{ interestPostingPeriodType.value }} + + } {{ 'labels.inputs.Interest Posting Period' | translate }} {{ 'labels.commons.is' | translate }} @@ -87,12 +85,11 @@ matTooltip="{{ 'tooltips.The method used to calculate interest' | translate }}" required > - - {{ interestCalculationType.value }} - + @for (interestCalculationType of interestCalculationTypeData; track interestCalculationType) { + + {{ interestCalculationType.value }} + + } {{ 'labels.inputs.Interest Calculated using' | translate }} {{ 'labels.commons.is' | translate }} @@ -107,12 +104,14 @@ matTooltip="{{ 'tooltips.The setting for number of days' | translate }}" required > - - {{ interestCalculationDaysInYearType.value }} - + @for ( + interestCalculationDaysInYearType of interestCalculationDaysInYearTypeData; + track interestCalculationDaysInYearType + ) { + + {{ interestCalculationDaysInYearType.value }} + + } {{ 'labels.inputs.Days in Year' | translate }} {{ 'labels.commons.is' | translate }} diff --git a/src/app/products/fixed-deposit-products/fixed-deposit-product-stepper/fixed-deposit-product-terms-step/fixed-deposit-product-terms-step.component.ts b/src/app/products/fixed-deposit-products/fixed-deposit-product-stepper/fixed-deposit-product-terms-step/fixed-deposit-product-terms-step.component.ts index 476c7cf87..d43e353c8 100644 --- a/src/app/products/fixed-deposit-products/fixed-deposit-product-stepper/fixed-deposit-product-terms-step/fixed-deposit-product-terms-step.component.ts +++ b/src/app/products/fixed-deposit-products/fixed-deposit-product-stepper/fixed-deposit-product-terms-step/fixed-deposit-product-terms-step.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit, Input } from '@angular/core'; +import { Component, OnInit, Input, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, Validators, ReactiveFormsModule } from '@angular/forms'; import { MatTooltip } from '@angular/material/tooltip'; import { MatDivider } from '@angular/material/divider'; @@ -20,6 +20,8 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class FixedDepositProductTermsStepComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + @Input() fixedDepositProductsTemplate: any; fixedDepositProductTermsForm: UntypedFormGroup; @@ -29,7 +31,7 @@ export class FixedDepositProductTermsStepComponent implements OnInit { interestCalculationTypeData: any; interestCalculationDaysInYearTypeData: any; - constructor(private formBuilder: UntypedFormBuilder) { + constructor() { this.createFixedDepositProductTermsForm(); } diff --git a/src/app/products/fixed-deposit-products/fixed-deposit-product.resolver.ts b/src/app/products/fixed-deposit-products/fixed-deposit-product.resolver.ts index 3273b2fe3..44d8f83b0 100644 --- a/src/app/products/fixed-deposit-products/fixed-deposit-product.resolver.ts +++ b/src/app/products/fixed-deposit-products/fixed-deposit-product.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { ProductsService } from '../products.service'; */ @Injectable() export class FixedDepositProductResolver { - /** - * @param {ProductsService} productsService Products service. - */ - constructor(private productsService: ProductsService) {} + private productsService = inject(ProductsService); /** * Returns the fixed deposit product data. diff --git a/src/app/products/fixed-deposit-products/fixed-deposit-products-template.resolver.ts b/src/app/products/fixed-deposit-products/fixed-deposit-products-template.resolver.ts index 9a758362f..eb60ed1e6 100644 --- a/src/app/products/fixed-deposit-products/fixed-deposit-products-template.resolver.ts +++ b/src/app/products/fixed-deposit-products/fixed-deposit-products-template.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; /** rxjs Imports */ import { Observable } from 'rxjs'; @@ -9,7 +9,7 @@ import { ProductsService } from '../products.service'; @Injectable() export class FixedDepositProductsTemplateResolver { - constructor(private productsService: ProductsService) {} + private productsService = inject(ProductsService); /** * Returns the fixed deposit products template data. diff --git a/src/app/products/fixed-deposit-products/fixed-deposit-products.component.ts b/src/app/products/fixed-deposit-products/fixed-deposit-products.component.ts index 9ac73e42d..a2e9b5e60 100644 --- a/src/app/products/fixed-deposit-products/fixed-deposit-products.component.ts +++ b/src/app/products/fixed-deposit-products/fixed-deposit-products.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, TemplateRef, ElementRef, ViewChild, AfterViewInit } from '@angular/core'; +import { Component, OnInit, TemplateRef, ElementRef, ViewChild, AfterViewInit, inject } from '@angular/core'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort, MatSortHeader } from '@angular/material/sort'; import { @@ -52,6 +52,11 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class FixedDepositProductsComponent implements OnInit, AfterViewInit { + private route = inject(ActivatedRoute); + private router = inject(Router); + private configurationWizardService = inject(ConfigurationWizardService); + private popoverService = inject(PopoverService); + /** Fixed deposit products data. */ fixedDepositProductData: any; /** Columns to be displayed in fixed deposit products table. */ @@ -83,12 +88,7 @@ export class FixedDepositProductsComponent implements OnInit, AfterViewInit { * @param {ConfigurationWizardService} configurationWizardService ConfigurationWizard Service. * @param {PopoverService} popoverService PopoverService. */ - constructor( - private route: ActivatedRoute, - private router: Router, - private configurationWizardService: ConfigurationWizardService, - private popoverService: PopoverService - ) { + constructor() { this.route.data.subscribe((data: { fixedDepositProducts: any }) => { this.fixedDepositProductData = data.fixedDepositProducts; }); diff --git a/src/app/products/fixed-deposit-products/fixed-deposit-products.resolver.ts b/src/app/products/fixed-deposit-products/fixed-deposit-products.resolver.ts index 312a5f741..e958b1f5e 100644 --- a/src/app/products/fixed-deposit-products/fixed-deposit-products.resolver.ts +++ b/src/app/products/fixed-deposit-products/fixed-deposit-products.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; /** rxjs Imports */ import { Observable } from 'rxjs'; @@ -12,10 +12,7 @@ import { ProductsService } from '../products.service'; */ @Injectable() export class FixedDepositProductsResolver { - /** - * @param {ProductsService} productsService Products service. - */ - constructor(private productsService: ProductsService) {} + private productsService = inject(ProductsService); /** * Returns the fixed deposit products data. diff --git a/src/app/products/fixed-deposit-products/view-fixed-deposit-product/fixed-deposit-datatable-tab/fixed-deposit-datatable-tab.component.ts b/src/app/products/fixed-deposit-products/view-fixed-deposit-product/fixed-deposit-datatable-tab/fixed-deposit-datatable-tab.component.ts index a08c4f857..a1d70538d 100644 --- a/src/app/products/fixed-deposit-products/view-fixed-deposit-product/fixed-deposit-datatable-tab/fixed-deposit-datatable-tab.component.ts +++ b/src/app/products/fixed-deposit-products/view-fixed-deposit-product/fixed-deposit-datatable-tab/fixed-deposit-datatable-tab.component.ts @@ -1,4 +1,4 @@ -import { Component } from '@angular/core'; +import { Component, inject } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; import { EntityDatatableTabComponent } from '../../../../shared/tabs/entity-datatable-tab/entity-datatable-tab.component'; import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; @@ -13,11 +13,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class FixedDepositDatatableTabComponent { + private route = inject(ActivatedRoute); + entityId: string; entityDatatable: any; multiRowDatatableFlag: boolean; - constructor(private route: ActivatedRoute) { + constructor() { this.entityId = this.route.parent.parent.snapshot.paramMap.get('productId'); this.route.data.subscribe((data: { fixedDepositDatatable: any }) => { diff --git a/src/app/products/fixed-deposit-products/view-fixed-deposit-product/fixed-deposit-general-tab/fixed-deposit-general-tab.component.html b/src/app/products/fixed-deposit-products/view-fixed-deposit-product/fixed-deposit-general-tab/fixed-deposit-general-tab.component.html index dac0a3e91..4e4ed735a 100644 --- a/src/app/products/fixed-deposit-products/view-fixed-deposit-product/fixed-deposit-general-tab/fixed-deposit-general-tab.component.html +++ b/src/app/products/fixed-deposit-products/view-fixed-deposit-product/fixed-deposit-general-tab/fixed-deposit-general-tab.component.html @@ -21,10 +21,12 @@ {{ fixedDepositProductData.shortName }}
    -
    - {{ 'labels.inputs.Description' | translate }}: - {{ fixedDepositProductData.description }} -
    + @if (fixedDepositProductData.description) { +
    + {{ 'labels.inputs.Description' | translate }}: + {{ fixedDepositProductData.description }} +
    + }

    {{ 'labels.inputs.Currency' | translate }}

    @@ -91,300 +93,332 @@ -
    - {{ 'labels.inputs.Lock-in Period' | translate }}: - - {{ fixedDepositProductData.lockinPeriodFrequency }} - {{ fixedDepositProductData.lockinPeriodFrequencyType.value }} -
    + @if (fixedDepositProductData.lockinPeriodFrequency) { +
    + {{ 'labels.inputs.Lock-in Period' | translate }}: + + {{ fixedDepositProductData.lockinPeriodFrequency }} + {{ fixedDepositProductData.lockinPeriodFrequencyType.value }} +
    + } -
    - {{ 'labels.inputs.Minimum Deposit Term' | translate }}: - {{ fixedDepositProductData.minDepositTerm }} -   - {{ fixedDepositProductData.minDepositTermType.value }} -
    + @if (fixedDepositProductData.minDepositTerm) { +
    + {{ 'labels.inputs.Minimum Deposit Term' | translate }}: + @if (fixedDepositProductData.minDepositTerm !== undefined) { + {{ fixedDepositProductData.minDepositTerm }} +   + {{ fixedDepositProductData.minDepositTermType.value }} + } +
    + } -
    - {{ 'labels.inputs.Maximum Deposit Term' | translate }}: - {{ fixedDepositProductData.maxDepositTerm }} -   - {{ fixedDepositProductData.maxDepositTermType.value }} -
    + @if (fixedDepositProductData.maxDepositTerm) { +
    + {{ 'labels.inputs.Maximum Deposit Term' | translate }}: + @if (fixedDepositProductData.maxDepositTerm !== undefined) { + {{ fixedDepositProductData.maxDepositTerm }} +   + {{ fixedDepositProductData.maxDepositTermType.value }} + } +
    + } -
    - {{ 'labels.inputs.Deposit Term In multiple of' | translate }}: - {{ fixedDepositProductData.inMultiplesOfDepositTerm }} - - - {{ fixedDepositProductData.inMultiplesOfDepositTermType.value }} -
    + @if (fixedDepositProductData.inMultiplesOfDepositTerm) { +
    + {{ 'labels.inputs.Deposit Term In multiple of' | translate }}: + {{ fixedDepositProductData.inMultiplesOfDepositTerm }} + - + {{ fixedDepositProductData.inMultiplesOfDepositTermType.value }} +
    + }
    {{ 'labels.inputs.Apply Penal Interest (less)' | translate }}: {{ fixedDepositProductData.preClosurePenalApplicable | yesNo }}
    -
    - {{ 'labels.inputs.Penal Interest' | translate }} (%): - {{ fixedDepositProductData.preClosurePenalInterest }}     %     On    - {{ fixedDepositProductData.preClosurePenalInterestOnType.value }} -
    + @if (fixedDepositProductData.preClosurePenalApplicable) { +
    + {{ 'labels.inputs.Penal Interest' | translate }} (%): + {{ fixedDepositProductData.preClosurePenalInterest }}     %     On    + {{ fixedDepositProductData.preClosurePenalInterestOnType.value }} +
    + } -
    - {{ 'labels.inputs.Balance Required for Interest Calculation' | translate }}: - {{ fixedDepositProductData.minBalanceForInterestCalculation | formatNumber }} -
    + @if (fixedDepositProductData.minBalanceForInterestCalculation) { +
    + {{ 'labels.inputs.Balance Required for Interest Calculation' | translate }}: + {{ fixedDepositProductData.minBalanceForInterestCalculation | formatNumber }} +
    + }
    {{ 'labels.inputs.Withhold Tax is Applicable' | translate }}: {{ fixedDepositProductData.withHoldTax | yesNo }}
    -
    - {{ 'labels.inputs.Withhold Tax group' | translate }}: - {{ fixedDepositProductData.taxGroup.name }} -
    - -
    -

    {{ 'labels.heading.Interest Rate Chart' | translate }}

    - - + @if (fixedDepositProductData.withHoldTax) { +
    + {{ 'labels.inputs.Withhold Tax group' | translate }}: + {{ fixedDepositProductData.taxGroup.name }} +
    + } + @if (fixedDepositProductData.activeChart) {
    -
    - {{ 'labels.inputs.Name' | translate }}: - {{ fixedDepositProductData.activeChart.name }} -
    - -
    - {{ 'labels.inputs.Description' | translate }}: - {{ fixedDepositProductData.activeChart.description }} -
    - -
    - {{ 'labels.inputs.From Date' | translate }}: - {{ fixedDepositProductData.activeChart.fromDate | dateFormat }} -
    - -
    - {{ 'labels.inputs.End Date' | translate }}: - {{ fixedDepositProductData.activeChart.endDate | dateFormat }} -
    - -
    - {{ 'labels.inputs.Primary Grouping by Amount' | translate }}: - {{ fixedDepositProductData.activeChart.isPrimaryGroupingByAmount | yesNo }} -
    - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/app/products/floating-rates/create-floating-rate/create-floating-rate.component.ts b/src/app/products/floating-rates/create-floating-rate/create-floating-rate.component.ts index 923f6530e..85fe3df52 100644 --- a/src/app/products/floating-rates/create-floating-rate/create-floating-rate.component.ts +++ b/src/app/products/floating-rates/create-floating-rate/create-floating-rate.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, ViewChild } from '@angular/core'; +import { Component, OnInit, ViewChild, inject } from '@angular/core'; import { UntypedFormBuilder, UntypedFormGroup, Validators, ReactiveFormsModule } from '@angular/forms'; import { MatDialog } from '@angular/material/dialog'; import { MatPaginator } from '@angular/material/paginator'; @@ -70,6 +70,15 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class CreateFloatingRateComponent implements OnInit { + private router = inject(Router); + private formBuilder = inject(UntypedFormBuilder); + private productsService = inject(ProductsService); + private route = inject(ActivatedRoute); + private dateUtils = inject(Dates); + private dialog = inject(MatDialog); + private settingsService = inject(SettingsService); + private translateService = inject(TranslateService); + /** Floating Rate Period Data. */ floatingRatePeriodsData: any[] = []; /** Minimum floating rate period date allowed. */ @@ -93,27 +102,6 @@ export class CreateFloatingRateComponent implements OnInit { /** Sorter for floating rate periods table. */ @ViewChild(MatSort, { static: true }) sort: MatSort; - /** - * @param {Router} router Router for navigation. - * @param {FormBuilder} formBuilder Form Builder. - * @param {ProductsService} productsService Product Service. - * @param {ActivatedRoute} route Activated Route. - * @param {Dates} dateUtils Date Utils. - * @param {MatDialog} dialog Dialog reference. - * @param {SettingsService} settingsService Settings Service. - * @param {TranslateService} translateService Translate Service. - */ - constructor( - private router: Router, - private formBuilder: UntypedFormBuilder, - private productsService: ProductsService, - private route: ActivatedRoute, - private dateUtils: Dates, - private dialog: MatDialog, - private settingsService: SettingsService, - private translateService: TranslateService - ) {} - /** * Sets the floating rate periods table. */ diff --git a/src/app/products/floating-rates/edit-floating-rate/edit-floating-rate.component.html b/src/app/products/floating-rates/edit-floating-rate/edit-floating-rate.component.html index 44e99bce7..af4d6ed57 100644 --- a/src/app/products/floating-rates/edit-floating-rate/edit-floating-rate.component.html +++ b/src/app/products/floating-rates/edit-floating-rate/edit-floating-rate.component.html @@ -11,10 +11,12 @@ matTooltip="{{ 'tooltips.Unique name for the floating rate scheme' | translate }}" formControlName="name" /> - - {{ 'labels.inputs.Floating Rate Name' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (floatingRateForm.controls.name.hasError('required')) { + + {{ 'labels.inputs.Floating Rate Name' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + }
    @@ -97,22 +99,24 @@ {{ 'labels.inputs.Is Differential' | translate }}?
    diff --git a/src/app/products/floating-rates/edit-floating-rate/edit-floating-rate.component.ts b/src/app/products/floating-rates/edit-floating-rate/edit-floating-rate.component.ts index 35b94e7f3..644d6cce5 100644 --- a/src/app/products/floating-rates/edit-floating-rate/edit-floating-rate.component.ts +++ b/src/app/products/floating-rates/edit-floating-rate/edit-floating-rate.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, ViewChild } from '@angular/core'; +import { Component, OnInit, ViewChild, inject } from '@angular/core'; import { UntypedFormBuilder, UntypedFormGroup, Validators, ReactiveFormsModule } from '@angular/forms'; import { MatDialog } from '@angular/material/dialog'; import { MatPaginator } from '@angular/material/paginator'; @@ -68,6 +68,15 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class EditFloatingRateComponent implements OnInit { + private router = inject(Router); + private formBuilder = inject(UntypedFormBuilder); + private productsService = inject(ProductsService); + private route = inject(ActivatedRoute); + private dateUtils = inject(Dates); + private dialog = inject(MatDialog); + private settingsService = inject(SettingsService); + private translateService = inject(TranslateService); + /** Floating Rate Form. */ floatingRateForm: UntypedFormGroup; /** Floating Rate Data. */ @@ -106,16 +115,7 @@ export class EditFloatingRateComponent implements OnInit { * @param {SettingsService} settingsService Settings Service. * @param {TranslateService} translateService Translate Service. */ - constructor( - private router: Router, - private formBuilder: UntypedFormBuilder, - private productsService: ProductsService, - private route: ActivatedRoute, - private dateUtils: Dates, - private dialog: MatDialog, - private settingsService: SettingsService, - private translateService: TranslateService - ) { + constructor() { this.route.data.subscribe((data: { floatingRate: any }) => { this.floatingRateData = data.floatingRate; this.floatingRatePeriodsData = data.floatingRate.ratePeriods ? data.floatingRate.ratePeriods : []; diff --git a/src/app/products/floating-rates/floating-rate-period-dialog/floating-rate-period-dialog.component.html b/src/app/products/floating-rates/floating-rate-period-dialog/floating-rate-period-dialog.component.html index 4a1ef4d89..e56b609d1 100644 --- a/src/app/products/floating-rates/floating-rate-period-dialog/floating-rate-period-dialog.component.html +++ b/src/app/products/floating-rates/floating-rate-period-dialog/floating-rate-period-dialog.component.html @@ -8,19 +8,23 @@ - - {{ 'labels.inputs.From Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (floatingRatePeriodForm.controls.fromDate.hasError('required')) { + + {{ 'labels.inputs.From Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Interest Rate' | translate }} - - {{ 'labels.inputs.Interest Rate' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (floatingRatePeriodForm.controls.interestRate.hasError('required')) { + + {{ 'labels.inputs.Interest Rate' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } diff --git a/src/app/products/floating-rates/floating-rate-period-dialog/floating-rate-period-dialog.component.ts b/src/app/products/floating-rates/floating-rate-period-dialog/floating-rate-period-dialog.component.ts index e1fd03e0a..38cc9a36a 100644 --- a/src/app/products/floating-rates/floating-rate-period-dialog/floating-rate-period-dialog.component.ts +++ b/src/app/products/floating-rates/floating-rate-period-dialog/floating-rate-period-dialog.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, Inject } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { MAT_DIALOG_DATA, MatDialogRef, @@ -32,23 +32,16 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class FloatingRatePeriodDialogComponent implements OnInit { + dialogRef = inject>(MatDialogRef); + formBuilder = inject(UntypedFormBuilder); + private settingsService = inject(SettingsService); + data = inject(MAT_DIALOG_DATA); + /** Floating Rate Period Form. */ floatingRatePeriodForm: UntypedFormGroup; /** Minimum floating rate period date allowed. */ minDate = new Date(); - /** - * @param {MatDialogRef} dialogRef Component reference to dialog. - * @param {FormBuilder} formBuilder Form Builder. - * @param {any} data Provides values for the form (if available). - */ - constructor( - public dialogRef: MatDialogRef, - public formBuilder: UntypedFormBuilder, - private settingsService: SettingsService, - @Inject(MAT_DIALOG_DATA) public data: any - ) {} - /** * Creates the floating rate period form. */ diff --git a/src/app/products/floating-rates/floating-rate.resolver.ts b/src/app/products/floating-rates/floating-rate.resolver.ts index ba19d0adc..5fe7be6de 100644 --- a/src/app/products/floating-rates/floating-rate.resolver.ts +++ b/src/app/products/floating-rates/floating-rate.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { ProductsService } from '../products.service'; */ @Injectable() export class FloatingRateResolver { - /** - * @param {ProductsService} productsService Products service. - */ - constructor(private productsService: ProductsService) {} + private productsService = inject(ProductsService); /** * Returns the floating rate data. diff --git a/src/app/products/floating-rates/floating-rates.component.html b/src/app/products/floating-rates/floating-rates.component.html index 62d15f85d..69d64f60e 100644 --- a/src/app/products/floating-rates/floating-rates.component.html +++ b/src/app/products/floating-rates/floating-rates.component.html @@ -30,44 +30,48 @@ {{ 'labels.inputs.Is Base Lending Rate' | translate }}? diff --git a/src/app/products/floating-rates/floating-rates.component.ts b/src/app/products/floating-rates/floating-rates.component.ts index 4ed8e6ca4..ca2f9e4dd 100644 --- a/src/app/products/floating-rates/floating-rates.component.ts +++ b/src/app/products/floating-rates/floating-rates.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, ViewChild } from '@angular/core'; +import { Component, OnInit, ViewChild, inject } from '@angular/core'; import { ActivatedRoute, RouterLink } from '@angular/router'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort, MatSortHeader } from '@angular/material/sort'; @@ -47,6 +47,8 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class FloatingRatesComponent implements OnInit { + private route = inject(ActivatedRoute); + /** Floating Rates data. */ floatingRatesData: any; /** Columns to be displayed in floating rates table. */ @@ -68,7 +70,7 @@ export class FloatingRatesComponent implements OnInit { * Retrieves the floating rates data from `resolve`. * @param {ActivatedRoute} route Activated Route. */ - constructor(private route: ActivatedRoute) { + constructor() { this.route.data.subscribe((data: { floatingrates: any }) => { this.floatingRatesData = data.floatingrates; }); diff --git a/src/app/products/floating-rates/floating-rates.resolver.ts b/src/app/products/floating-rates/floating-rates.resolver.ts index c417c2acd..42e6d07d8 100644 --- a/src/app/products/floating-rates/floating-rates.resolver.ts +++ b/src/app/products/floating-rates/floating-rates.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; /** rxjs Imports */ import { Observable } from 'rxjs'; @@ -12,10 +12,7 @@ import { ProductsService } from '../products.service'; */ @Injectable() export class FloatingRatesResolver { - /** - * @param {ProductsService} productsService Products service. - */ - constructor(private productsService: ProductsService) {} + private productsService = inject(ProductsService); /** * Returns the floating rates data. diff --git a/src/app/products/floating-rates/view-floating-rate/view-floating-rate.component.html b/src/app/products/floating-rates/view-floating-rate/view-floating-rate.component.html index a12c52207..a65b86054 100644 --- a/src/app/products/floating-rates/view-floating-rate/view-floating-rate.component.html +++ b/src/app/products/floating-rates/view-floating-rate/view-floating-rate.component.html @@ -53,22 +53,24 @@ {{ 'labels.inputs.Is Differential' | translate }}? diff --git a/src/app/products/floating-rates/view-floating-rate/view-floating-rate.component.ts b/src/app/products/floating-rates/view-floating-rate/view-floating-rate.component.ts index 97e8e3a85..558a2afa2 100644 --- a/src/app/products/floating-rates/view-floating-rate/view-floating-rate.component.ts +++ b/src/app/products/floating-rates/view-floating-rate/view-floating-rate.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, ViewChild } from '@angular/core'; +import { Component, OnInit, ViewChild, inject } from '@angular/core'; import { ActivatedRoute, RouterLink } from '@angular/router'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort, MatSortHeader } from '@angular/material/sort'; @@ -18,7 +18,7 @@ import { } from '@angular/material/table'; import { FaIconComponent } from '@fortawesome/angular-fontawesome'; import { MatDivider } from '@angular/material/divider'; -import { NgIf, DecimalPipe } from '@angular/common'; +import { DecimalPipe } from '@angular/common'; import { MatTooltip } from '@angular/material/tooltip'; import { DateFormatPipe } from '../../../pipes/date-format.pipe'; import { YesnoPipe } from '../../../pipes/yesno.pipe'; @@ -55,6 +55,8 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ViewFloatingRateComponent implements OnInit { + private route = inject(ActivatedRoute); + /** Floating Rate Data. */ floatingRateData: any; /** Columns to be displayed in floating rate periods table. */ @@ -75,7 +77,7 @@ export class ViewFloatingRateComponent implements OnInit { * Retrieves the floating rate data from `resolve`. * @param {ActivatedRoute} route Activated Route. */ - constructor(private route: ActivatedRoute) { + constructor() { this.route.data.subscribe((data: { floatingRate: any }) => { this.floatingRateData = data.floatingRate; }); diff --git a/src/app/products/loan-products/common/loan-product-summary/loan-product-summary.component.html b/src/app/products/loan-products/common/loan-product-summary/loan-product-summary.component.html index 3222ceb89..b951cacd4 100644 --- a/src/app/products/loan-products/common/loan-product-summary/loan-product-summary.component.html +++ b/src/app/products/loan-products/common/loan-product-summary/loan-product-summary.component.html @@ -1,1347 +1,1338 @@ -
    -

    {{ loanProduct.name }}

    - -

    {{ 'labels.heading.Details' | translate }}

    - - - -
    - {{ 'labels.inputs.Short Name' | translate }}: - {{ loanProduct.shortName }} -
    - -
    - {{ 'labels.inputs.External Id' | translate }}: - {{ loanProduct.externalId }} -
    - -
    - {{ 'labels.inputs.Fund' | translate }}: - {{ loanProduct.fundName }} -
    - -
    - {{ 'labels.inputs.Include in Customer Loan Counter' | translate }}: - {{ loanProduct.includeInBorrowerCycle | yesNo }} -
    - -
    - {{ 'labels.inputs.Start Date' | translate }}: - {{ loanProduct.startDate | dateFormat }} -
    - -
    - {{ 'labels.inputs.Close Date' | translate }}: - {{ loanProduct.closeDate | dateFormat }} -
    - -
    - {{ 'labels.inputs.Description' | translate }}: - {{ loanProduct.description }} -
    - -

    {{ 'labels.inputs.Currency' | translate }}

    - - - -
    - {{ 'labels.inputs.Currency' | translate }}: - {{ loanProduct.currency.code }} -
    - -
    - {{ 'labels.inputs.Currency' | translate }}: - {{ loanProduct.currency.displayLabel }} -
    - -
    - {{ 'labels.inputs.Decimal Places' | translate }}: - {{ loanProduct.currency.decimalPlaces }} -
    - -
    - {{ 'labels.inputs.Currency in multiples of' | translate }}: - {{ loanProduct.currency.inMultiplesOf }} -
    - -
    - {{ 'labels.inputs.Installment in multiples of' | translate }}: - {{ loanProduct.installmentAmountInMultiplesOf }} -
    - -

    {{ 'labels.heading.Terms' | translate }}

    - - - -
    - {{ 'labels.inputs.Principal' | translate }}: - {{ loanProduct.principal | formatNumber }} (Min - {{ (loanProduct.minPrincipal ? loanProduct.minPrincipal : loanProduct.principal) | formatNumber }} : Max - {{ (loanProduct.maxPrincipal ? loanProduct.maxPrincipal : loanProduct.principal) | formatNumber }}) - -
    - -
    - {{ 'labels.inputs.Allow Approved / Disbursed Amounts Over Applied' | translate }}: - {{ loanProduct.allowApprovedDisbursedAmountsOverApplied | yesNo }} -
    - -
    - {{ 'labels.inputs.Over Amount' | translate }}: - {{ loanProduct.overAppliedNumber | formatNumber: 0 }} % - {{ loanProduct.overAppliedNumber | formatNumber }} {{ loanProduct.currencyCode }} -
    - -
    - {{ 'labels.inputs.Installment day calculation from' | translate }}: - {{ loanProduct.repaymentStartDateType?.value | translateKey: 'catalogs' }} -
    - -
    - {{ 'labels.inputs.Number of Repayments' | translate }}: - {{ - loanProduct.numberOfRepayments + - ' (Min: ' + - (loanProduct.minNumberOfRepayments ? loanProduct.minNumberOfRepayments : loanProduct.numberOfRepayments) + - ', Max: ' + - (loanProduct.maxNumberOfRepayments ? loanProduct.maxNumberOfRepayments : loanProduct.numberOfRepayments) + - ')' - }} -
    - -
    - {{ 'labels.inputs.Linked to floating interest rates' | translate }}: - {{ loanProduct.isLinkedToFloatingInterestRates | yesNo }} -
    - -
    - {{ 'labels.inputs.Nominal interest rate' | translate }}: - {{ - loanProduct.interestRatePerPeriod + - ' (Min: ' + - (loanProduct.minInterestRatePerPeriod - ? loanProduct.minInterestRatePerPeriod - : loanProduct.interestRatePerPeriod) + - ', Max: ' + - (loanProduct.maxInterestRatePerPeriod - ? loanProduct.maxInterestRatePerPeriod - : loanProduct.interestRatePerPeriod) + - ')' - }} - {{ loanProduct.interestRateFrequencyType?.value | translateKey: 'catalogs' }} -
    - -
    -
    - {{ 'labels.inputs.Floating Lending Interest Rate' | translate }}: - {{ loanProduct.floatingRateName }} -
    -
    - {{ 'labels.inputs.Interest Rate Differential' | translate }}: - {{ loanProduct.interestRateDifferential }} -
    -
    - {{ 'labels.inputs.Floating Interest Rate Calculation Allowed' | translate }}: - {{ loanProduct.isFloatingInterestRateCalculationAllowed | yesNo }} -
    -
    - {{ 'labels.inputs.Floating Interest Rate' | translate }}: - {{ - loanProduct.defaultDifferentialLendingRate + - ' (Min: ' + - (loanProduct.minDifferentialLendingRate - ? loanProduct.minDifferentialLendingRate - : loanProduct.defaultDifferentialLendingRate) + - ', Max: ' + - (loanProduct.maxDifferentialLendingRate - ? loanProduct.maxDifferentialLendingRate - : loanProduct.defaultDifferentialLendingRate) + - ')' - }} -
    -
    - -
    - {{ 'labels.inputs.Terms vary based on loan cycle' | translate }}: - {{ loanProduct.useBorrowerCycle | yesNo }} -
    - -
    -

    {{ 'labels.inputs.Principal by loan cycle' | translate }}

    - -
    {{ 'labels.inputs.Period' | translate }} -
    - {{ chartSlab.fromPeriod }} - {{ chartSlab.toPeriod }} {{ chartSlab.periodType.value }} -
    -
     
    -
    {{ 'labels.inputs.Amount Range' | translate }} -
    - {{ chartSlab.amountRangeFrom }} - {{ chartSlab.amountRangeTo }} -
    - -
     
    -
    {{ 'labels.inputs.Interest' | translate }}{{ chartSlab.annualInterestRate }} %{{ 'labels.inputs.Description' | translate }} - {{ chartSlab.description }} - {{ 'labels.inputs.Actions' | translate }} - - - + @if (floatingRate.isDifferentialToBaseLendingRate) { + + } + @if (!floatingRate.isDifferentialToBaseLendingRate) { + + } - - + @if (floatingRate.isDifferentialToBaseLendingRate) { + + } + @if (!floatingRate.isDifferentialToBaseLendingRate) { + + } - - + @if (floatingRate.isBaseLendingRate) { + + } + @if (!floatingRate.isBaseLendingRate) { + + } {{ 'labels.catalogs.Active' | translate }} - - + @if (floatingRate.isActive) { + + } + @if (!floatingRate.isActive) { + + } - - + @if (floatingRate.isDifferentialToBaseLendingRate) { + + } + @if (!floatingRate.isDifferentialToBaseLendingRate) { + + }
    - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    {{ 'labels.inputs.Condition' | translate }} - {{ variation.valueConditionType.value | translateKey: 'catalogs' }} - {{ 'labels.inputs.Loan Cycle' | translate }} - {{ variation.borrowerCycleNumber }} - {{ 'labels.inputs.Minimum' | translate }} - {{ variation.minValue | formatNumber }} - {{ 'labels.inputs.Default' | translate }} - {{ variation.defaultValue | formatNumber }} - {{ 'labels.inputs.Maximum' | translate }} - {{ variation.maxValue | formatNumber }} -
    -
    - -
    -

    {{ 'labels.inputs.Number of Repayments by loan cycle' | translate }}

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    {{ 'labels.inputs.Condition' | translate }} - {{ variation.valueConditionType.value | translateKey: 'catalogs' }} - {{ 'labels.inputs.Loan Cycle' | translate }} - {{ variation.borrowerCycleNumber }} - {{ 'labels.inputs.Minimum' | translate }} - {{ variation.minValue }} - {{ 'labels.inputs.Default' | translate }} - {{ variation.defaultValue }} - {{ 'labels.inputs.Maximum' | translate }} - {{ variation.maxValue }} -
    -
    - -
    -

    {{ 'labels.inputs.Nominal Interest Rate by loan cycle' | translate }}

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    {{ 'labels.inputs.Condition' | translate }} - {{ variation.valueConditionType.value | translateKey: 'catalogs' }} - {{ 'labels.inputs.Loan Cycle' | translate }} - {{ variation.borrowerCycleNumber }} - {{ 'labels.inputs.Minimum' | translate }} - {{ variation.minValue }} - {{ 'labels.inputs.Default' | translate }} - {{ variation.defaultValue }} - {{ 'labels.inputs.Maximum' | translate }} - {{ variation.maxValue }} -
    -
    - -
    - {{ 'labels.inputs.Repay Every' | translate }}: - {{ loanProduct.repaymentEvery }} {{ loanProduct.repaymentFrequencyType.value | translateKey: 'catalogs' }} -
    - -
    - {{ 'labels.inputs.Fixed Length' | translate }}: - {{ loanProduct.fixedLength }} {{ loanProduct.repaymentFrequencyType.value | translateKey: 'catalogs' }} -
    - -
    - {{ 'labels.inputs.Minimum days between disbursal and first repayment date' | translate }}: - {{ loanProduct.minimumDaysBetweenDisbursalAndFirstRepayment | formatNumber }} -
    - -

    {{ 'labels.heading.Settings' | translate }}

    - - - -
    - {{ 'labels.inputs.Amortization' | translate }}: - {{ loanProduct.amortizationType.value | translateKey: 'catalogs' }} -
    - -
    - {{ 'labels.inputs.Is Equal Amortization' | translate }}: - {{ loanProduct.isEqualAmortization | yesNo }} -
    - -
    - {{ 'labels.inputs.Interest Method' | translate }}: - {{ loanProduct.interestType?.value | translateKey: 'catalogs' }} -
    - -
    - {{ 'labels.inputs.Interest Calculation Period' | translate }}: - {{ loanProduct.interestCalculationPeriodType?.value | translateKey: 'catalogs' }} -
    - -
    - {{ 'labels.inputs.Allow Partial Interest Calculation with same as repayment' | translate }}: - {{ loanProduct.allowPartialPeriodInterestCalculation | yesNo }} -
    - -
    - {{ 'labels.inputs.Is interest recognition on disbursement date?' | translate }}: - {{ loanProduct.interestRecognitionOnDisbursementDate | yesNo }} -
    - -

    {{ 'labels.inputs.Loan Schedule' | translate }}

    - - - -
    - {{ 'labels.inputs.Loan Schedule Type' | translate }}: - {{ loanProduct.loanScheduleType.value | translateKey: 'catalogs' }} -
    - -
    - {{ 'labels.inputs.Repayment Strategy' | translate }}: - {{ - loanProduct.transactionProcessingStrategyName | translateKey: 'catalogs' - }} -
    - -
    - {{ 'labels.inputs.Loan Schedule Processing Type' | translate }}: - {{ loanProduct.loanScheduleProcessingType.value }} -
    - -
    - {{ 'labels.inputs.Advanced Payment Allocation Transactions' | translate }}: - - - - - - -
    - -
    - {{ 'labels.inputs.Advanced Credit Allocation Transactions' | translate }}: - - - - - - -
    - -
    - {{ 'labels.inputs.Supported Interest Refund Types' | translate }}: - - {{ mapHumanReadableValueStringEnumOptionDataList(supportedInterestRefundTypes) }} - -
    - -

    {{ 'labels.inputs.Down Payments' | translate }}

    - - - -
    - {{ 'labels.inputs.Enable Down Payments' | translate }}: - {{ loanProduct.enableDownPayment | yesNo }} -
    - -
    - {{ 'labels.inputs.Disbursed Amount Percentage Down Payment' | translate }} (%): - {{ loanProduct.disbursedAmountPercentageForDownPayment }} % -
    - -
    - {{ 'labels.inputs.Enable Auto Repayment for Down Payment' | translate }}: - {{ loanProduct.enableAutoRepaymentForDownPayment | yesNo }} -
    - -
    -

    {{ 'labels.inputs.Loan Charge-off behaviour' | translate }}

    - +@if (loanProduct) { +
    +

    {{ loanProduct.name }}

    +

    {{ 'labels.heading.Details' | translate }}

    - -
    - {{ 'labels.inputs.Loan Charge-off behaviour' | translate }}: - {{ loanProduct.chargeOffBehaviour.value | translateKey: 'catalogs' }} +
    + {{ 'labels.inputs.Short Name' | translate }}: + {{ loanProduct.shortName }}
    -
    - -

    {{ 'labels.heading.Moratorium' | translate }}

    - -
    - {{ 'labels.inputs.Delinquency Bucket' | translate }}: - {{ loanProduct.delinquencyBucket.name }} - {{ - 'labels.inputs.Unassigned' | translate - }} -
    - -
    - {{ 'labels.inputs.Delinquency Bucket' | translate }}: - {{ 'labels.inputs.Unassigned' | translate }} -
    - -
    - {{ 'labels.inputs.Enable installment level Delinquency' | translate }}: - {{ loanProduct.enableInstallmentLevelDelinquency | yesNo }} -
    - -
    - {{ 'labels.inputs.Grace on principal payment' | translate }}: - {{ loanProduct.graceOnPrincipalPayment }} -
    - -
    - {{ 'labels.inputs.Grace on interest payment' | translate }}: - {{ loanProduct.graceOnInterestPayment }} -
    - -
    - {{ 'labels.inputs.Interest free period' | translate }}: - {{ loanProduct.graceOnInterestCharged }} -
    - -
    - {{ 'labels.inputs.Arrears tolerance' | translate }}: - {{ loanProduct.inArrearsTolerance }} -
    - -
    - {{ 'labels.inputs.Days in year' | translate }}: - {{ loanProduct.daysInYearType?.value | translateKey: 'catalogs' }} -
    - -
    - {{ 'labels.inputs.Days in year custom strategy' | translate }}: - {{ loanProduct.daysInYearCustomStrategy.value | translateKey: 'catalogs' }} -
    - -
    - {{ 'labels.inputs.Days in month' | translate }}: - {{ loanProduct.daysInMonthType?.value | translateKey: 'catalogs' }} -
    - -
    - {{ 'labels.inputs.Allow fixing of the installment amount' | translate }}: - {{ loanProduct.canDefineInstallmentAmount | yesNo }} -
    - -
    - {{ 'labels.inputs.Number of days a loan may be overdue before moving into arrears' | translate }}: - {{ loanProduct.graceOnArrearsAgeing }} -
    - -
    - {{ - 'labels.inputs.Maximum number of days a loan may be overdue before becoming a NPA (non performing asset)' - | translate - }}: - {{ loanProduct.overdueDaysForNPA }} -
    - -
    - {{ 'labels.inputs.Account moves out of NPA only after all arrears have been cleared' | translate }}: - {{ loanProduct.accountMovesOutOfNPAOnlyOnArrearsCompletion | yesNo }} -
    - -
    - {{ 'labels.inputs.Principal Threshold (%) for Last Instalment' | translate }}: - {{ loanProduct.principalThresholdForLastInstallment }} -
    - -
    - {{ 'labels.inputs.Variable Installments allowed' | translate }}: - {{ loanProduct.allowVariableInstallments | yesNo }} -
    - -
    - {{ 'labels.inputs.Variable Installments' | translate }}: - {{ - '(Min: ' + - loanProduct.minimumGap + - ', Max: ' + - (loanProduct.maximumGap ? loanProduct.maximumGap : loanProduct.minimumGap) + - ')' - }} -
    - -
    - {{ 'labels.inputs.Allowed to be used for providing Topup Loans' | translate }}: - {{ loanProduct.canUseForTopup | yesNo }} -
    - -

    {{ 'labels.heading.Interest Recalculation' | translate }}

    - - - -
    - {{ 'labels.inputs.Recalculate Interest' | translate }}: - {{ loanProduct.isInterestRecalculationEnabled | yesNo }} -
    - -
    -
    - {{ 'labels.inputs.Pre-closure interest calculation rule' | translate }}: - {{ - loanProduct.interestRecalculationData.preClosureInterestCalculationStrategy.value - }} + @if (loanProduct.externalId) { +
    + {{ 'labels.inputs.External Id' | translate }}: + {{ loanProduct.externalId }} +
    + } + @if (loanProduct.fundId) { +
    + {{ 'labels.inputs.Fund' | translate }}: + {{ loanProduct.fundName }} +
    + } +
    + {{ 'labels.inputs.Include in Customer Loan Counter' | translate }}: + {{ loanProduct.includeInBorrowerCycle | yesNo }}
    -
    - {{ 'labels.inputs.Advance payments adjustment type' | translate }}: - {{ loanProduct.interestRecalculationData.rescheduleStrategyType.value }} + @if (loanProduct.startDate) { +
    + {{ 'labels.inputs.Start Date' | translate }}: + {{ loanProduct.startDate | dateFormat }} +
    + } + @if (loanProduct.closeDate) { +
    + {{ 'labels.inputs.Close Date' | translate }}: + {{ loanProduct.closeDate | dateFormat }} +
    + } + @if (loanProduct.description) { +
    + {{ 'labels.inputs.Description' | translate }}: + {{ loanProduct.description }} +
    + } +

    {{ 'labels.inputs.Currency' | translate }}

    + +
    + {{ 'labels.inputs.Currency' | translate }}: + {{ loanProduct.currency.code }}
    -
    - {{ 'labels.inputs.Interest recalculation compounding on' | translate }}: - {{ - loanProduct.interestRecalculationData.interestRecalculationCompoundingType.value - }} +
    + {{ 'labels.inputs.Currency' | translate }}: + {{ loanProduct.currency.displayLabel }}
    -
    - {{ 'labels.inputs.Frequency for compounding' | translate }}: - - {{ loanProduct.interestRecalculationData.recalculationCompoundingFrequencyType.value }} -   {{ - 'on ' + loanProduct.interestRecalculationData.recalculationCompoundingFrequencyNthDay?.value - }} -   {{ loanProduct.interestRecalculationData.recalculationCompoundingFrequencyWeekday?.value }} -   {{ - 'on day ' + loanProduct.interestRecalculationData.recalculationCompoundingFrequencyOnDay - }} +
    + {{ 'labels.inputs.Decimal Places' | translate }}: + {{ loanProduct.currency.decimalPlaces }} +
    +
    + {{ 'labels.inputs.Currency in multiples of' | translate }}: + {{ loanProduct.currency.inMultiplesOf }} +
    +
    + {{ 'labels.inputs.Installment in multiples of' | translate }}: + {{ loanProduct.installmentAmountInMultiplesOf }} +
    +

    {{ 'labels.heading.Terms' | translate }}

    + +
    + {{ 'labels.inputs.Principal' | translate }}: + {{ loanProduct.principal | formatNumber }} (Min + {{ (loanProduct.minPrincipal ? loanProduct.minPrincipal : loanProduct.principal) | formatNumber }} : Max + {{ (loanProduct.maxPrincipal ? loanProduct.maxPrincipal : loanProduct.principal) | formatNumber }}) -
    +
    + {{ 'labels.inputs.Allow Approved / Disbursed Amounts Over Applied' | translate }}: + {{ loanProduct.allowApprovedDisbursedAmountsOverApplied | yesNo }} +
    + @if (loanProduct.allowApprovedDisbursedAmountsOverApplied) { +
    + {{ 'labels.inputs.Over Amount' | translate }}: + @if (loanProduct.overAppliedCalculationType === 'percentage') { + {{ loanProduct.overAppliedNumber | formatNumber: 0 }} % + } + @if (loanProduct.overAppliedCalculationType === 'flat') { + {{ loanProduct.overAppliedNumber | formatNumber }} {{ loanProduct.currencyCode }} + } +
    + } +
    + {{ 'labels.inputs.Installment day calculation from' | translate }}: + {{ loanProduct.repaymentStartDateType?.value | translateKey: 'catalogs' }} +
    +
    + {{ 'labels.inputs.Number of Repayments' | translate }}: + {{ + loanProduct.numberOfRepayments + + ' (Min: ' + + (loanProduct.minNumberOfRepayments ? loanProduct.minNumberOfRepayments : loanProduct.numberOfRepayments) + + ', Max: ' + + (loanProduct.maxNumberOfRepayments ? loanProduct.maxNumberOfRepayments : loanProduct.numberOfRepayments) + + ')' + }} +
    +
    + {{ 'labels.inputs.Linked to floating interest rates' | translate }}: + {{ loanProduct.isLinkedToFloatingInterestRates | yesNo }} +
    + @if (!loanProduct.isLinkedToFloatingInterestRates) { +
    + {{ 'labels.inputs.Nominal interest rate' | translate }}: + {{ + loanProduct.interestRatePerPeriod + + ' (Min: ' + + (loanProduct.minInterestRatePerPeriod + ? loanProduct.minInterestRatePerPeriod + : loanProduct.interestRatePerPeriod) + + ', Max: ' + + (loanProduct.maxInterestRatePerPeriod + ? loanProduct.maxInterestRatePerPeriod + : loanProduct.interestRatePerPeriod) + + ')' + }} + {{ loanProduct.interestRateFrequencyType?.value | translateKey: 'catalogs' }} +
    + } + @if (loanProduct.isLinkedToFloatingInterestRates) { +
    +
    + {{ 'labels.inputs.Floating Lending Interest Rate' | translate }}: + {{ loanProduct.floatingRateName }} +
    +
    + {{ 'labels.inputs.Interest Rate Differential' | translate }}: + {{ loanProduct.interestRateDifferential }} +
    +
    + {{ 'labels.inputs.Floating Interest Rate Calculation Allowed' | translate }}: + {{ loanProduct.isFloatingInterestRateCalculationAllowed | yesNo }} +
    +
    + {{ 'labels.inputs.Floating Interest Rate' | translate }}: + {{ + loanProduct.defaultDifferentialLendingRate + + ' (Min: ' + + (loanProduct.minDifferentialLendingRate + ? loanProduct.minDifferentialLendingRate + : loanProduct.defaultDifferentialLendingRate) + + ', Max: ' + + (loanProduct.maxDifferentialLendingRate + ? loanProduct.maxDifferentialLendingRate + : loanProduct.defaultDifferentialLendingRate) + + ')' + }} +
    +
    + } +
    + {{ 'labels.inputs.Terms vary based on loan cycle' | translate }}: + {{ loanProduct.useBorrowerCycle | yesNo }} +
    + @if (loanProduct.principalVariationsForBorrowerCycle?.length) { +
    +

    {{ 'labels.inputs.Principal by loan cycle' | translate }}

    + + + + + + + + + + + + + + + + + + + + + + + +
    {{ 'labels.inputs.Condition' | translate }} + {{ variation.valueConditionType.value | translateKey: 'catalogs' }} + {{ 'labels.inputs.Loan Cycle' | translate }} + {{ variation.borrowerCycleNumber }} + {{ 'labels.inputs.Minimum' | translate }} + {{ variation.minValue | formatNumber }} + {{ 'labels.inputs.Default' | translate }} + {{ variation.defaultValue | formatNumber }} + {{ 'labels.inputs.Maximum' | translate }} + {{ variation.maxValue | formatNumber }} +
    +
    + } + @if (loanProduct.numberOfRepaymentVariationsForBorrowerCycle?.length) { +
    +

    {{ 'labels.inputs.Number of Repayments by loan cycle' | translate }}

    + + + + + + + + + + + + + + + + + + + + + + + +
    {{ 'labels.inputs.Condition' | translate }} + {{ variation.valueConditionType.value | translateKey: 'catalogs' }} + {{ 'labels.inputs.Loan Cycle' | translate }} + {{ variation.borrowerCycleNumber }} + {{ 'labels.inputs.Minimum' | translate }} + {{ variation.minValue }} + {{ 'labels.inputs.Default' | translate }} + {{ variation.defaultValue }} + {{ 'labels.inputs.Maximum' | translate }} + {{ variation.maxValue }} +
    +
    + } + @if (loanProduct.interestRateVariationsForBorrowerCycle?.length) { +
    +

    {{ 'labels.inputs.Nominal Interest Rate by loan cycle' | translate }}

    + + + + + + + + + + + + + + + + + + + + + + + +
    {{ 'labels.inputs.Condition' | translate }} + {{ variation.valueConditionType.value | translateKey: 'catalogs' }} + {{ 'labels.inputs.Loan Cycle' | translate }} + {{ variation.borrowerCycleNumber }} + {{ 'labels.inputs.Minimum' | translate }} + {{ variation.minValue }} + {{ 'labels.inputs.Default' | translate }} + {{ variation.defaultValue }} + {{ 'labels.inputs.Maximum' | translate }} + {{ variation.maxValue }} +
    +
    + } +
    + {{ 'labels.inputs.Repay Every' | translate }}: + {{ loanProduct.repaymentEvery }} + {{ loanProduct.repaymentFrequencyType.value | translateKey: 'catalogs' }} - {{ 'labels.inputs.Frequency Interval for compounding' | translate }}: +
    + @if (loanProduct.fixedLength) { +
    + {{ 'labels.inputs.Fixed Length' | translate }}: + {{ loanProduct.fixedLength }} {{ loanProduct.repaymentFrequencyType.value | translateKey: 'catalogs' }} +
    + } + @if (loanProduct.minimumDaysBetweenDisbursalAndFirstRepayment) { +
    + {{ 'labels.inputs.Minimum days between disbursal and first repayment date' | translate }}: + {{ loanProduct.minimumDaysBetweenDisbursalAndFirstRepayment | formatNumber }} +
    + } +

    {{ 'labels.heading.Settings' | translate }}

    + + @if (loanProduct.amortizationType?.value) { +
    + {{ 'labels.inputs.Amortization' | translate }}: + {{ loanProduct.amortizationType.value | translateKey: 'catalogs' }} +
    + } +
    + {{ 'labels.inputs.Is Equal Amortization' | translate }}: + {{ loanProduct.isEqualAmortization | yesNo }} +
    +
    + {{ 'labels.inputs.Interest Method' | translate }}: + {{ loanProduct.interestType?.value | translateKey: 'catalogs' }} +
    +
    + {{ 'labels.inputs.Interest Calculation Period' | translate }}: + {{ loanProduct.interestCalculationPeriodType?.value | translateKey: 'catalogs' }} +
    +
    + {{ 'labels.inputs.Allow Partial Interest Calculation with same as repayment' | translate }}: + {{ loanProduct.allowPartialPeriodInterestCalculation | yesNo }} +
    +
    + {{ 'labels.inputs.Is interest recognition on disbursement date?' | translate }}: + {{ loanProduct.interestRecognitionOnDisbursementDate | yesNo }} +
    +

    {{ 'labels.inputs.Loan Schedule' | translate }}

    + +
    + {{ 'labels.inputs.Loan Schedule Type' | translate }}: + {{ loanProduct.loanScheduleType.value | translateKey: 'catalogs' }} +
    +
    + {{ 'labels.inputs.Repayment Strategy' | translate }}: + {{ + loanProduct.transactionProcessingStrategyName | translateKey: 'catalogs' + }} +
    + @if (isAdvancedPaymentAllocation) { +
    + {{ 'labels.inputs.Loan Schedule Processing Type' | translate }}: + {{ loanProduct.loanScheduleProcessingType.value }} +
    + } + @if (isAdvancedPaymentAllocation) { +
    + {{ 'labels.inputs.Advanced Payment Allocation Transactions' | translate }}: + + + @for (paymentAllocation of paymentAllocations; track paymentAllocation) { + + + } + + +
    + } + @if (isAdvancedPaymentAllocation && creditAllocations.length > 0) { +
    + {{ 'labels.inputs.Advanced Credit Allocation Transactions' | translate }}: + + + @for (creditAllocation of creditAllocations; track creditAllocation) { + + + } + + +
    + } + @if (isAdvancedPaymentAllocation && supportedInterestRefundTypes?.length > 0) { +
    + {{ 'labels.inputs.Supported Interest Refund Types' | translate }}: + + {{ mapHumanReadableValueStringEnumOptionDataList(supportedInterestRefundTypes) }} + +
    + } +

    {{ 'labels.inputs.Down Payments' | translate }}

    + +
    + {{ 'labels.inputs.Enable Down Payments' | translate }}: + {{ loanProduct.enableDownPayment | yesNo }} +
    + @if (loanProduct.enableDownPayment) { +
    + {{ 'labels.inputs.Disbursed Amount Percentage Down Payment' | translate }} (%): + {{ loanProduct.disbursedAmountPercentageForDownPayment }} % +
    + } + @if (loanProduct.enableDownPayment) { +
    + {{ 'labels.inputs.Enable Auto Repayment for Down Payment' | translate }}: + {{ loanProduct.enableAutoRepaymentForDownPayment | yesNo }} +
    + } + @if (isAdvancedPaymentAllocation) { +
    +

    {{ 'labels.inputs.Loan Charge-off behaviour' | translate }}

    + +
    + {{ 'labels.inputs.Loan Charge-off behaviour' | translate }}: + {{ loanProduct.chargeOffBehaviour.value | translateKey: 'catalogs' }} +
    +
    + } +

    {{ 'labels.heading.Moratorium' | translate }}

    + @if (loanProduct.delinquencyBucket) { +
    + {{ 'labels.inputs.Delinquency Bucket' | translate }}: + @if (loanProduct.delinquencyBucket.name) { + {{ loanProduct.delinquencyBucket.name }} + } + @if (!loanProduct.delinquencyBucket.name) { + {{ 'labels.inputs.Unassigned' | translate }} + } +
    + } + @if (!loanProduct.delinquencyBucket) { +
    + {{ 'labels.inputs.Delinquency Bucket' | translate }}: + {{ 'labels.inputs.Unassigned' | translate }} +
    + } + @if (loanProduct.delinquencyBucket) { +
    + {{ 'labels.inputs.Enable installment level Delinquency' | translate }}: + {{ loanProduct.enableInstallmentLevelDelinquency | yesNo }} +
    + } + @if (loanProduct.graceOnPrincipalPayment) { +
    + {{ 'labels.inputs.Grace on principal payment' | translate }}: + {{ loanProduct.graceOnPrincipalPayment }} +
    + } + @if (loanProduct.graceOnInterestPayment) { +
    + {{ 'labels.inputs.Grace on interest payment' | translate }}: + {{ loanProduct.graceOnInterestPayment }} +
    + } + @if (loanProduct.graceOnInterestCharged) { +
    + {{ 'labels.inputs.Interest free period' | translate }}: + {{ loanProduct.graceOnInterestCharged }} +
    + } + @if (loanProduct.inArrearsTolerance) { +
    + {{ 'labels.inputs.Arrears tolerance' | translate }}: + {{ loanProduct.inArrearsTolerance }} +
    + } +
    + {{ 'labels.inputs.Days in year' | translate }}: + {{ loanProduct.daysInYearType?.value | translateKey: 'catalogs' }} +
    + @if (isAdvancedPaymentAllocation && loanProduct.daysInYearCustomStrategy) { +
    + {{ 'labels.inputs.Days in year custom strategy' | translate }}: + {{ loanProduct.daysInYearCustomStrategy.value | translateKey: 'catalogs' }} +
    + } +
    + {{ 'labels.inputs.Days in month' | translate }}: + {{ loanProduct.daysInMonthType?.value | translateKey: 'catalogs' }} +
    +
    + {{ 'labels.inputs.Allow fixing of the installment amount' | translate }}: + {{ loanProduct.canDefineInstallmentAmount | yesNo }} +
    + @if (loanProduct.graceOnArrearsAgeing) { +
    + {{ 'labels.inputs.Number of days a loan may be overdue before moving into arrears' | translate }}: + {{ loanProduct.graceOnArrearsAgeing }} +
    + } + @if (loanProduct.overdueDaysForNPA) { +
    + {{ + 'labels.inputs.Maximum number of days a loan may be overdue before becoming a NPA (non performing asset)' + | translate + }}: + {{ loanProduct.overdueDaysForNPA }} +
    + } +
    + {{ 'labels.inputs.Account moves out of NPA only after all arrears have been cleared' | translate }}: + {{ loanProduct.accountMovesOutOfNPAOnlyOnArrearsCompletion | yesNo }} +
    + @if (loanProduct.principalThresholdForLastInstallment) { +
    + {{ 'labels.inputs.Principal Threshold (%) for Last Instalment' | translate }}: + {{ loanProduct.principalThresholdForLastInstallment }} +
    + } +
    + {{ 'labels.inputs.Variable Installments allowed' | translate }}: + {{ loanProduct.allowVariableInstallments | yesNo }} +
    + @if (loanProduct.allowVariableInstallments) { +
    + {{ 'labels.inputs.Variable Installments' | translate }}: {{ - loanProduct.interestRecalculationData.recalculationCompoundingFrequencyInterval + '(Min: ' + + loanProduct.minimumGap + + ', Max: ' + + (loanProduct.maximumGap ? loanProduct.maximumGap : loanProduct.minimumGap) + + ')' }}
    + } +
    + {{ 'labels.inputs.Allowed to be used for providing Topup Loans' | translate }}: + {{ loanProduct.canUseForTopup | yesNo }}
    -
    - {{ 'labels.inputs.Frequency for recalculate Outstanding Principal' | translate }}: - - {{ loanProduct.interestRecalculationData.recalculationRestFrequencyType.value }} -   {{ 'on ' + loanProduct.interestRecalculationData.recalculationRestFrequencyNthDay?.value }} -   {{ loanProduct.interestRecalculationData.recalculationRestFrequencyWeekday?.value }} -   {{ 'on day ' + loanProduct.interestRecalculationData.recalculationRestFrequencyOnDay }} - +

    {{ 'labels.heading.Interest Recalculation' | translate }}

    + +
    + {{ 'labels.inputs.Recalculate Interest' | translate }}: + {{ loanProduct.isInterestRecalculationEnabled | yesNo }}
    -
    - {{ 'labels.inputs.Frequency Interval for recalculation' | translate }}: - {{ loanProduct.interestRecalculationData.recalculationRestFrequencyInterval }} -
    - {{ 'labels.inputs.Rest Frequency Date' | translate }}: - {{ loanProduct.interestRecalculationData.recalculationRestFrequencyDate }} + @if (loanProduct.isInterestRecalculationEnabled) { +
    +
    + {{ 'labels.inputs.Pre-closure interest calculation rule' | translate }}: + {{ + loanProduct.interestRecalculationData.preClosureInterestCalculationStrategy.value + }} +
    +
    + {{ 'labels.inputs.Advance payments adjustment type' | translate }}: + {{ loanProduct.interestRecalculationData.rescheduleStrategyType.value }} +
    +
    + {{ 'labels.inputs.Interest recalculation compounding on' | translate }}: + {{ + loanProduct.interestRecalculationData.interestRecalculationCompoundingType.value + }} +
    + @if (loanProduct.interestRecalculationData.interestRecalculationCompoundingType.id !== 0) { +
    + {{ 'labels.inputs.Frequency for compounding' | translate }}: + + {{ loanProduct.interestRecalculationData.recalculationCompoundingFrequencyType.value }} + @if ( + loanProduct.interestRecalculationData.recalculationCompoundingFrequencyType.id === 4 && + loanProduct.interestRecalculationData.recalculationCompoundingFrequencyNthDay + ) { +   {{ + 'on ' + loanProduct.interestRecalculationData.recalculationCompoundingFrequencyNthDay?.value + }} + } + @if ( + (loanProduct.interestRecalculationData.recalculationCompoundingFrequencyType.id === 4 && + !loanProduct.interestRecalculationData.recalculationCompoundingFrequencyOnDay) || + loanProduct.interestRecalculationData.recalculationCompoundingFrequencyType.id === 3 + ) { +   {{ + loanProduct.interestRecalculationData.recalculationCompoundingFrequencyWeekday?.value + }} + } + @if ( + loanProduct.interestRecalculationData.recalculationCompoundingFrequencyType.id === 4 && + loanProduct.interestRecalculationData.recalculationCompoundingFrequencyOnDay + ) { +   {{ + 'on day ' + loanProduct.interestRecalculationData.recalculationCompoundingFrequencyOnDay + }} + } + + @if (loanProduct.interestRecalculationData.recalculationCompoundingFrequencyType.id !== 1) { +
    + {{ 'labels.inputs.Frequency Interval for compounding' | translate }}: + {{ + loanProduct.interestRecalculationData.recalculationCompoundingFrequencyInterval + }} +
    + } +
    + } +
    + {{ 'labels.inputs.Frequency for recalculate Outstanding Principal' | translate }}: + + {{ loanProduct.interestRecalculationData.recalculationRestFrequencyType.value }} + @if ( + loanProduct.interestRecalculationData.recalculationRestFrequencyType.id === 4 && + loanProduct.interestRecalculationData.recalculationRestFrequencyNthDay + ) { +   {{ + 'on ' + loanProduct.interestRecalculationData.recalculationRestFrequencyNthDay?.value + }} + } + @if ( + (loanProduct.interestRecalculationData.recalculationRestFrequencyType.id === 4 && + !loanProduct.interestRecalculationData.recalculationRestFrequencyOnDay) || + loanProduct.interestRecalculationData.recalculationRestFrequencyType.id === 3 + ) { +   {{ loanProduct.interestRecalculationData.recalculationRestFrequencyWeekday?.value }} + } + @if ( + loanProduct.interestRecalculationData.recalculationRestFrequencyType.id === 4 && + loanProduct.interestRecalculationData.recalculationRestFrequencyOnDay + ) { +   {{ + 'on day ' + loanProduct.interestRecalculationData.recalculationRestFrequencyOnDay + }} + } + +
    + @if (loanProduct.interestRecalculationData.recalculationRestFrequencyType.id !== 1) { +
    + {{ 'labels.inputs.Frequency Interval for recalculation' | translate }}: + {{ loanProduct.interestRecalculationData.recalculationRestFrequencyInterval }} + @if (loanProduct.recalculationRestFrequencyDate) { +
    + {{ 'labels.inputs.Rest Frequency Date' | translate }}: + {{ loanProduct.interestRecalculationData.recalculationRestFrequencyDate }} +
    + } +
    + } +
    + {{ 'labels.inputs.Is Arrears recognization based on original schedule' | translate }}: + {{ + loanProduct.interestRecalculationData.isArrearsBasedOnOriginalSchedule | yesNo + }} +
    + @if (loanProduct.loanScheduleType.code === 'PROGRESSIVE') { +
    + {{ 'labels.inputs.Do not calculate interest on past due principal balances' | translate }}: + {{ + loanProduct.interestRecalculationData.disallowInterestCalculationOnPastDue | yesNo + }} +
    + }
    + } +

    {{ 'labels.heading.Guarantee Requirements' | translate }}

    + +
    + {{ 'labels.inputs.Place Guarantee Funds On-Hold' | translate }}: + {{ loanProduct.holdGuaranteeFunds | yesNo }}
    + @if (loanProduct.holdGuaranteeFunds) { +
    + {{ 'labels.inputs.Mandatory Guarantee' | translate }} (%): + {{ loanProduct.productGuaranteeData.mandatoryGuarantee }} + @if (loanProduct.productGuaranteeData.minimumGuaranteeFromOwnFunds) { +
    + {{ 'labels.inputs.Minimum Guarantee from Own Funds' | translate }} (%): + {{ loanProduct.productGuaranteeData.minimumGuaranteeFromOwnFunds }} +
    + } + @if (loanProduct.productGuaranteeData.minimumGuaranteeFromGuarantor) { +
    + {{ 'labels.inputs.Minimum Guarantee from Guarantor Funds' | translate }} (%): + {{ loanProduct.productGuaranteeData.minimumGuaranteeFromGuarantor }} +
    + } +
    + } +

    {{ 'labels.heading.Loan Tranche Details' | translate }}

    + +
    + {{ 'labels.inputs.Enable Multiple Disbursals' | translate }}: + {{ loanProduct.multiDisburseLoan | yesNo }} +
    + @if (loanProduct.multiDisburseLoan) { +
    + {{ 'labels.inputs.Maximum Tranche count' | translate }}: + {{ loanProduct.maxTrancheCount }} + @if (loanProduct.outstandingLoanBalance) { +
    + {{ 'labels.inputs.Maximum allowed outstanding balance' | translate }}: + {{ loanProduct.outstandingLoanBalance }} +
    + } +
    + {{ 'labels.inputs.Disallow Expected Disbursements' | translate }}: + {{ loanProduct.disallowExpectedDisbursements | yesNo }} +
    +
    + } +

    {{ 'labels.heading.Event Settings' | translate }}

    +
    + {{ + 'labels.inputs.Use the Global Configurations values to the Repayment Event (notifications)' | translate + }}: + {{ useDueForRepaymentsConfigurations | yesNo }} +
    + @if (loanProduct.dueDaysForRepaymentEvent) { +
    + {{ 'labels.inputs.Due days for repayment event' | translate }}: + {{ loanProduct.dueDaysForRepaymentEvent | number }} +
    + } + @if (loanProduct.overDueDaysForRepaymentEvent) { +
    + {{ 'labels.inputs.OverDue days for repayment event' | translate }}: + {{ loanProduct.overDueDaysForRepaymentEvent | number }} +
    + } +

    {{ 'labels.inputs.Configurable Terms and Settings' | translate }}

    + +
    + {{ 'labels.inputs.Allow overriding select terms and settings in loan accounts' | translate }}: + {{ loanProduct.allowAttributeConfiguration | yesNo }} +
    + @if (loanProduct.allowAttributeConfiguration) { +
    +
    + {{ 'labels.inputs.Amortization' | translate }}: + {{ loanProduct.allowAttributeOverrides.amortizationType | yesNo }} +
    +
    + {{ 'labels.inputs.Interest method' | translate }}: + {{ loanProduct.allowAttributeOverrides.interestType | yesNo }} +
    +
    + {{ 'labels.inputs.Repayment strategy' | translate }}: + {{ + loanProduct.allowAttributeOverrides.transactionProcessingStrategyCode | yesNo + }} +
    +
    + {{ 'labels.inputs.Interest calculation period' | translate }}: + {{ loanProduct.allowAttributeOverrides.interestCalculationPeriodType | yesNo }} +
    +
    + {{ 'labels.inputs.Arrears tolerance' | translate }}: + {{ loanProduct.allowAttributeOverrides.inArrearsTolerance | yesNo }} +
    +
    + {{ 'labels.inputs.Repaid every' | translate }}: + {{ loanProduct.allowAttributeOverrides.repaymentEvery | yesNo }} +
    +
    + {{ 'labels.inputs.Moratorium' | translate }}: + {{ + loanProduct.allowAttributeOverrides.graceOnPrincipalAndInterestPayment | yesNo + }} +
    +
    + {{ 'labels.inputs.Number of days a loan may be overdue before moving into arrears' | translate }}: + {{ loanProduct.allowAttributeOverrides.graceOnArrearsAgeing | yesNo }} +
    +
    + } + @if (loanProduct.charges.length) { +
    +

    {{ 'labels.heading.Charges' | translate }}

    + + + + + + + + + + + + + + + + + + + + +
    {{ 'labels.inputs.Name' | translate }} + {{ charge.name + ', ' + charge.currency.displaySymbol }} + {{ 'labels.inputs.Charge Type' | translate }} + {{ charge.chargeCalculationType.value | translateKey: 'catalogs' }} + {{ 'labels.inputs.Amount' | translate }} + {{ charge.amount | formatNumber }} + {{ 'labels.inputs.Collected On' | translate }} + {{ charge.chargeTimeType.value | translateKey: 'catalogs' }} +
    +

    {{ 'labels.inputs.Overdue Charges' | translate }}

    + + + + + + + + + + + + + + + + + + + + +
    {{ 'labels.inputs.Name' | translate }} + {{ overdueCharge.name + ', ' + overdueCharge.currency.displaySymbol }} + {{ 'labels.inputs.Charge Type' | translate }} + {{ overdueCharge.chargeCalculationType.value | translateKey: 'catalogs' }} + {{ 'labels.inputs.Amount' | translate }} + {{ overdueCharge.amount | formatNumber }} + {{ 'labels.inputs.Collected On' | translate }} + {{ overdueCharge.chargeTimeType.value | translateKey: 'catalogs' }} +
    +
    + } + @if (isAdvancedPaymentAllocation) { +
    +

    {{ 'labels.inputs.Income capitalization' | translate }}

    + +
    + {{ 'labels.inputs.Enable income capitalization' | translate }}: + {{ loanProduct.enableIncomeCapitalization | yesNo }} +
    + @if (loanProduct.enableIncomeCapitalization) { +
    + {{ 'labels.inputs.Income capitalization calculation type' | translate }}: + {{ + loanProduct.capitalizedIncomeCalculationType?.value | translateKey: 'catalogs' + }} +
    + } + @if (loanProduct.enableIncomeCapitalization) { +
    + {{ 'labels.inputs.Income capitalization strategy' | translate }}: + {{ loanProduct.capitalizedIncomeStrategy?.value | translateKey: 'catalogs' }} +
    + } + @if (loanProduct.enableIncomeCapitalization) { +
    + {{ 'labels.inputs.Income type' | translate }}: + {{ loanProduct.capitalizedIncomeType?.value | translateKey: 'catalogs' }} +
    + } +
    + } + @if (isAdvancedPaymentAllocation) { +
    +

    {{ 'labels.inputs.Buy down fees' | translate }}

    + +
    + {{ 'labels.inputs.Enable Buy down fee' | translate }}: + {{ loanProduct.enableBuyDownFee | yesNo }} +
    + @if (loanProduct.enableBuyDownFee) { +
    + {{ 'labels.inputs.Buy down fee calculation type' | translate }}: + {{ loanProduct.buyDownFeeCalculationType?.value | translateKey: 'catalogs' }} +
    + } + @if (loanProduct.enableBuyDownFee) { +
    + {{ 'labels.inputs.Buy down fee strategy' | translate }}: + {{ loanProduct.buyDownFeeStrategy?.value | translateKey: 'catalogs' }} +
    + } + @if (loanProduct.enableBuyDownFee) { +
    + {{ 'labels.inputs.Buy down fee income type' | translate }}: + {{ loanProduct.buyDownFeeIncomeType?.value | translateKey: 'catalogs' }} +
    + } + @if (loanProduct.enableBuyDownFee) { +
    + {{ 'labels.inputs.Merchant Buy down fee' | translate }}: + {{ loanProduct.merchantBuyDownFee | yesNo }} +
    + } +
    + } +

    {{ 'labels.heading.Accounting' | translate }}

    +
    - {{ 'labels.inputs.Is Arrears recognization based on original schedule' | translate }}: - {{ loanProduct.interestRecalculationData.isArrearsBasedOnOriginalSchedule | yesNo }} -
    -
    - {{ 'labels.inputs.Do not calculate interest on past due principal balances' | translate }}: + {{ 'labels.inputs.Type' | translate }}: {{ - loanProduct.interestRecalculationData.disallowInterestCalculationOnPastDue | yesNo + 'labels.accounting.' + getAccountingRuleName(accountingRuleData[accountingRule() - 1]) | translate }}
    -
    - -

    {{ 'labels.heading.Guarantee Requirements' | translate }}

    - - - -
    - {{ 'labels.inputs.Place Guarantee Funds On-Hold' | translate }}: - {{ loanProduct.holdGuaranteeFunds | yesNo }} -
    - -
    - {{ 'labels.inputs.Mandatory Guarantee' | translate }} (%): - {{ loanProduct.productGuaranteeData.mandatoryGuarantee }} -
    - {{ 'labels.inputs.Minimum Guarantee from Own Funds' | translate }} (%): - {{ loanProduct.productGuaranteeData.minimumGuaranteeFromOwnFunds }} -
    -
    - {{ 'labels.inputs.Minimum Guarantee from Guarantor Funds' | translate }} (%): - {{ loanProduct.productGuaranteeData.minimumGuaranteeFromGuarantor }} -
    -
    - -

    {{ 'labels.heading.Loan Tranche Details' | translate }}

    - - - -
    - {{ 'labels.inputs.Enable Multiple Disbursals' | translate }}: - {{ loanProduct.multiDisburseLoan | yesNo }} -
    - -
    - {{ 'labels.inputs.Maximum Tranche count' | translate }}: - {{ loanProduct.maxTrancheCount }} -
    - {{ 'labels.inputs.Maximum allowed outstanding balance' | translate }}: - {{ loanProduct.outstandingLoanBalance }} -
    -
    - {{ 'labels.inputs.Disallow Expected Disbursements' | translate }}: - {{ loanProduct.disallowExpectedDisbursements | yesNo }} -
    -
    - -

    {{ 'labels.heading.Event Settings' | translate }}

    - -
    - {{ - 'labels.inputs.Use the Global Configurations values to the Repayment Event (notifications)' | translate - }}: - {{ useDueForRepaymentsConfigurations | yesNo }} -
    - -
    - {{ 'labels.inputs.Due days for repayment event' | translate }}: - {{ loanProduct.dueDaysForRepaymentEvent | number }} -
    - -
    - {{ 'labels.inputs.OverDue days for repayment event' | translate }}: - {{ loanProduct.overDueDaysForRepaymentEvent | number }} -
    - -

    {{ 'labels.inputs.Configurable Terms and Settings' | translate }}

    - - - -
    - {{ 'labels.inputs.Allow overriding select terms and settings in loan accounts' | translate }}: - {{ loanProduct.allowAttributeConfiguration | yesNo }} -
    - -
    -
    - {{ 'labels.inputs.Amortization' | translate }}: - {{ loanProduct.allowAttributeOverrides.amortizationType | yesNo }} -
    -
    - {{ 'labels.inputs.Interest method' | translate }}: - {{ loanProduct.allowAttributeOverrides.interestType | yesNo }} -
    -
    - {{ 'labels.inputs.Repayment strategy' | translate }}: - {{ loanProduct.allowAttributeOverrides.transactionProcessingStrategyCode | yesNo }} -
    -
    - {{ 'labels.inputs.Interest calculation period' | translate }}: - {{ loanProduct.allowAttributeOverrides.interestCalculationPeriodType | yesNo }} -
    -
    - {{ 'labels.inputs.Arrears tolerance' | translate }}: - {{ loanProduct.allowAttributeOverrides.inArrearsTolerance | yesNo }} -
    -
    - {{ 'labels.inputs.Repaid every' | translate }}: - {{ loanProduct.allowAttributeOverrides.repaymentEvery | yesNo }} -
    -
    - {{ 'labels.inputs.Moratorium' | translate }}: - {{ loanProduct.allowAttributeOverrides.graceOnPrincipalAndInterestPayment | yesNo }} -
    -
    - {{ 'labels.inputs.Number of days a loan may be overdue before moving into arrears' | translate }}: - {{ loanProduct.allowAttributeOverrides.graceOnArrearsAgeing | yesNo }} -
    -
    - -
    -

    {{ 'labels.heading.Charges' | translate }}

    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    {{ 'labels.inputs.Name' | translate }} - {{ charge.name + ', ' + charge.currency.displaySymbol }} - {{ 'labels.inputs.Charge Type' | translate }} - {{ charge.chargeCalculationType.value | translateKey: 'catalogs' }} - {{ 'labels.inputs.Amount' | translate }} - {{ charge.amount | formatNumber }} - {{ 'labels.inputs.Collected On' | translate }} - {{ charge.chargeTimeType.value | translateKey: 'catalogs' }} -
    - -

    {{ 'labels.inputs.Overdue Charges' | translate }}

    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    {{ 'labels.inputs.Name' | translate }} - {{ overdueCharge.name + ', ' + overdueCharge.currency.displaySymbol }} - {{ 'labels.inputs.Charge Type' | translate }} - {{ overdueCharge.chargeCalculationType.value | translateKey: 'catalogs' }} - {{ 'labels.inputs.Amount' | translate }} - {{ overdueCharge.amount | formatNumber }} - {{ 'labels.inputs.Collected On' | translate }} - {{ overdueCharge.chargeTimeType.value | translateKey: 'catalogs' }} -
    -
    - -
    -

    {{ 'labels.inputs.Income capitalization' | translate }}

    - - - -
    - {{ 'labels.inputs.Enable income capitalization' | translate }}: - {{ loanProduct.enableIncomeCapitalization | yesNo }} -
    - -
    - {{ 'labels.inputs.Income capitalization calculation type' | translate }}: - {{ loanProduct.capitalizedIncomeCalculationType?.value | translateKey: 'catalogs' }} -
    - -
    - {{ 'labels.inputs.Income capitalization strategy' | translate }}: - {{ loanProduct.capitalizedIncomeStrategy?.value | translateKey: 'catalogs' }} -
    - -
    - {{ 'labels.inputs.Income type' | translate }}: - {{ loanProduct.capitalizedIncomeType?.value | translateKey: 'catalogs' }} -
    -
    - -
    -

    {{ 'labels.inputs.Buy down fees' | translate }}

    - - - -
    - {{ 'labels.inputs.Enable Buy down fee' | translate }}: - {{ loanProduct.enableBuyDownFee | yesNo }} -
    - -
    - {{ 'labels.inputs.Buy down fee calculation type' | translate }}: - {{ loanProduct.buyDownFeeCalculationType?.value | translateKey: 'catalogs' }} -
    - -
    - {{ 'labels.inputs.Buy down fee strategy' | translate }}: - {{ loanProduct.buyDownFeeStrategy?.value | translateKey: 'catalogs' }} -
    - -
    - {{ 'labels.inputs.Buy down fee income type' | translate }}: - {{ loanProduct.buyDownFeeIncomeType?.value | translateKey: 'catalogs' }} -
    - -
    - {{ 'labels.inputs.Merchant Buy down fee' | translate }}: - {{ loanProduct.merchantBuyDownFee | yesNo }} -
    -
    - -

    {{ 'labels.heading.Accounting' | translate }}

    - - - -
    - {{ 'labels.inputs.Type' | translate }}: - {{ - 'labels.accounting.' + getAccountingRuleName(accountingRuleData[accountingRule() - 1]) | translate - }} -
    - -
    - {{ 'labels.inputs.Enable Accrual Activity Posting on Installment Due Date' | translate }}: - {{ loanProduct.enableAccrualActivityPosting | yesNo }} -
    - -
    -

    - {{ 'labels.heading.Assets' | translate }} / {{ 'labels.heading.Liabilities' | translate }} -

    - -
    - - -
    - -

    {{ 'labels.heading.Assets' | translate }}

    -
    - - -
    - + {{ 'labels.inputs.Enable Accrual Activity Posting on Installment Due Date' | translate }}: - - - - - + {{ loanProduct.enableAccrualActivityPosting | yesNo }}
    - - -
    - -

    {{ 'labels.heading.Income' | translate }}

    - - - - - - - - - - - - - - - - - - - - -

    {{ 'labels.heading.Expenses' | translate }}

    - -
    - - - - - - - - - - - -

    {{ 'labels.heading.Liabilities' | translate }}

    - - - - - -
    -

    {{ 'labels.heading.Advanced Accounting Rules' | translate }}

    - - - -
    -

    - {{ 'labels.heading.Configure Fund Sources for Payment Channels' | translate }} -

    - - - - - - - - - - - - - - -
    {{ 'labels.heading.Payment Type' | translate }} - {{ paymentFundSource.paymentType.name }} - {{ 'labels.inputs.Fund Source' | translate }} - {{ paymentFundSource.fundSourceAccount.name }} -
    -
    - -
    -

    {{ 'labels.heading.Map Fees to Specific Income Accounts' | translate }}

    - - - - - - - - - - - - - - -
    {{ 'labels.catalogs.Fees' | translate }} - {{ feesIncome.charge.name }} - {{ 'labels.inputs.Income Account' | translate }} - - {{ feesIncome.incomeAccount.name }} - -
    -
    - -
    -

    - {{ 'labels.heading.Map Penalties to Specific Income Accounts' | translate }} -

    - - - - - - - - - - - - - - -
    {{ 'labels.inputs.Penalty' | translate }} - {{ penaltyIncome.charge.name }} - {{ 'labels.inputs.Income Account' | translate }} - {{ penaltyIncome.incomeAccount.name }} -
    -
    - -
    -

    - {{ 'labels.heading.Map Charge-off reasons to Expense accounts' | translate }} -

    - - - - - - - - - - - - - - -
    {{ 'labels.inputs.Charge-off reason' | translate }} - {{ chargeOffReasonToExpenseAccountMapping.reasonCodeValue.name }} - {{ 'labels.inputs.Expense Account' | translate }} - ({{ chargeOffReasonToExpenseAccountMapping.expenseAccount.glCode }}) - {{ chargeOffReasonToExpenseAccountMapping.expenseAccount.name }} -
    -
    - + } + @if (isAccountingEnabled()) { +
    +

    + {{ 'labels.heading.Assets' | translate }} / {{ 'labels.heading.Liabilities' | translate }} +

    -

    - {{ 'labels.heading.Buydown Fee classifications to Income accounts' | translate }} -

    - - - - - - - - - - - - - - -
    {{ 'labels.inputs.Classification' | translate }} - {{ classificationToIncomeAccountMapping.classificationCodeValue.name }} - {{ 'labels.inputs.Income Account' | translate }} - ({{ classificationToIncomeAccountMapping.incomeAccount.glCode }}) - {{ classificationToIncomeAccountMapping.incomeAccount.name }} -
    +
    - -
    {{ 'labels.heading.Assets' | translate }} +
    + + + @if (loanProduct.accountingRule.id === 3 || loanProduct.accountingRule.id === 4) { +
    + + + + + + +
    + } + + +
    +

    {{ 'labels.heading.Income' | translate }}

    + -

    - {{ 'labels.heading.Capitalized Income classifications to Income accounts' | translate }} -

    - - + + + + + + + @if (accountingMappings.incomeFromChargeOffInterestAccount) { + - - - - - - - - - - - - -
    {{ 'labels.inputs.Classification' | translate }} - {{ capitalizedIncomeClassificationToIncomeAccountMapping.classificationCodeValue.name }} - {{ 'labels.inputs.Income Account' | translate }} - ({{ capitalizedIncomeClassificationToIncomeAccountMapping.incomeAccount.glCode }}) - {{ capitalizedIncomeClassificationToIncomeAccountMapping.incomeAccount.name }} -
    -
    - -
    -

    - {{ 'labels.heading.WriteOff reasons to Expense accounts' | translate }} -

    - - - - - - - - - - - - - - -
    {{ 'labels.inputs.WriteOff Reason' | translate }} - {{ writeOffReasonsToExpenseMapping.reasonCodeValue.name }} - {{ 'labels.inputs.Expense Account' | translate }} - ({{ writeOffReasonsToExpenseMapping.expenseAccount.glCode }}) - {{ writeOffReasonsToExpenseMapping.expenseAccount.name }} -
    + + } + @if (accountingMappings.incomeFromChargeOffFeesAccount) { + + + } + @if (accountingMappings.incomeFromChargeOffPenaltyAccount) { + + + } + @if (accountingMappings.incomeFromCapitalizationAccount) { + + + } + @if (accountingMappings.incomeFromBuyDownAccount) { + + + } +

    {{ 'labels.heading.Expenses' | translate }}

    +
    + + + + + @if (accountingMappings.chargeOffExpenseAccount) { + + + } + @if (accountingMappings.chargeOffFraudExpenseAccount) { + + + } + @if (accountingMappings.buyDownExpenseAccount) { + + + } +

    {{ 'labels.heading.Liabilities' | translate }}

    + + + @if (accountingMappings.deferredIncomeLiabilityAccount) { + + + } + @if (isAdvancedAccountingEnabled()) { +
    +

    {{ 'labels.heading.Advanced Accounting Rules' | translate }}

    + + @if (paymentChannelToFundSourceMappings?.length > 0) { +
    +

    + {{ 'labels.heading.Configure Fund Sources for Payment Channels' | translate }} +

    + + + + + + + + + + + +
    {{ 'labels.heading.Payment Type' | translate }} + {{ paymentFundSource.paymentType.name }} + {{ 'labels.inputs.Fund Source' | translate }} + {{ paymentFundSource.fundSourceAccount.name }} +
    +
    + } + @if (feeToIncomeAccountMappings?.length > 0) { +
    +

    + {{ 'labels.heading.Map Fees to Specific Income Accounts' | translate }} +

    + + + + + + + + + + + +
    {{ 'labels.catalogs.Fees' | translate }} + {{ feesIncome.charge.name }} + {{ 'labels.inputs.Income Account' | translate }} + @if (feesIncome.incomeAccount) { + + {{ feesIncome.incomeAccount.name }} + + } +
    +
    + } + @if (penaltyToIncomeAccountMappings?.length > 0) { +
    +

    + {{ 'labels.heading.Map Penalties to Specific Income Accounts' | translate }} +

    + + + + + + + + + + + +
    {{ 'labels.inputs.Penalty' | translate }} + {{ penaltyIncome.charge.name }} + {{ 'labels.inputs.Income Account' | translate }} + {{ penaltyIncome.incomeAccount.name }} +
    +
    + } + @if (chargeOffReasonToExpenseAccountMappings?.length > 0) { +
    +

    + {{ 'labels.heading.Map Charge-off reasons to Expense accounts' | translate }} +

    + + + + + + + + + + + +
    {{ 'labels.inputs.Charge-off reason' | translate }} + {{ chargeOffReasonToExpenseAccountMapping.reasonCodeValue.name }} + {{ 'labels.inputs.Expense Account' | translate }} + ({{ chargeOffReasonToExpenseAccountMapping.expenseAccount.glCode }}) + {{ chargeOffReasonToExpenseAccountMapping.expenseAccount.name }} +
    +
    + } +
    +

    + {{ 'labels.heading.Buydown Fee classifications to Income accounts' | translate }} +

    + + + + + + + + + + + +
    {{ 'labels.inputs.Classification' | translate }} + {{ classificationToIncomeAccountMapping.classificationCodeValue.name }} + {{ 'labels.inputs.Income Account' | translate }} + ({{ classificationToIncomeAccountMapping.incomeAccount.glCode }}) + {{ classificationToIncomeAccountMapping.incomeAccount.name }} +
    +
    + @if (capitalizedIncomeClassificationToIncomeAccountMappings?.length > 0) { +
    +

    + {{ 'labels.heading.Capitalized Income classifications to Income accounts' | translate }} +

    + + + + + + + + + + + +
    {{ 'labels.inputs.Classification' | translate }} + {{ capitalizedIncomeClassificationToIncomeAccountMapping.classificationCodeValue.name }} + {{ 'labels.inputs.Income Account' | translate }} + ({{ capitalizedIncomeClassificationToIncomeAccountMapping.incomeAccount.glCode }}) + {{ capitalizedIncomeClassificationToIncomeAccountMapping.incomeAccount.name }} +
    +
    + } + @if (writeOffReasonsToExpenseMappings?.length > 0) { +
    +

    + {{ 'labels.heading.WriteOff reasons to Expense accounts' | translate }} +

    + + + + + + + + + + + +
    {{ 'labels.inputs.WriteOff Reason' | translate }} + {{ writeOffReasonsToExpenseMapping.reasonCodeValue.name }} + {{ 'labels.inputs.Expense Account' | translate }} + ({{ writeOffReasonsToExpenseMapping.expenseAccount.glCode }}) + {{ writeOffReasonsToExpenseMapping.expenseAccount.name }} +
    +
    + } +
    + }
    -
    + }
    -
    +} diff --git a/src/app/products/loan-products/common/loan-product-summary/loan-product-summary.component.ts b/src/app/products/loan-products/common/loan-product-summary/loan-product-summary.component.ts index e189bbdd4..171aeeb93 100644 --- a/src/app/products/loan-products/common/loan-product-summary/loan-product-summary.component.ts +++ b/src/app/products/loan-products/common/loan-product-summary/loan-product-summary.component.ts @@ -1,4 +1,4 @@ -import { Component, Input, OnChanges, OnInit, SimpleChanges } from '@angular/core'; +import { Component, Input, OnChanges, OnInit, SimpleChanges, inject } from '@angular/core'; import { AccountingMappingDTO, DelinquencyBucket, LoanProduct } from '../../models/loan-product.model'; import { AccountingMapping, @@ -71,6 +71,8 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class LoanProductSummaryComponent implements OnInit, OnChanges { + private accounting = inject(Accounting); + @Input() action: string; @Input() loanProduct: LoanProduct; @Input() loanProductsTemplate: any | null; @@ -119,8 +121,6 @@ export class LoanProductSummaryComponent implements OnInit, OnChanges { capitalizedIncomeClassificationToIncomeAccountMappings: ClassificationToIncomeAccountMapping[] = []; writeOffReasonsToExpenseMappings: ChargeOffReasonToExpenseAccountMapping[] = []; - constructor(private accounting: Accounting) {} - ngOnInit() { this.accountingRuleData = this.accounting.getAccountingRulesForLoans(); this.setCurrentValues(); diff --git a/src/app/products/loan-products/create-loan-product/create-loan-product.component.html b/src/app/products/loan-products/create-loan-product/create-loan-product.component.html index ac962bfe6..1c864086e 100644 --- a/src/app/products/loan-products/create-loan-product/create-loan-product.component.html +++ b/src/app/products/loan-products/create-loan-product/create-loan-product.component.html @@ -53,34 +53,35 @@ - - {{ 'labels.inputs.INTEREST REFUND' | translate }} - - + @if (isAdvancedPaymentStrategy) { + + {{ 'labels.inputs.INTEREST REFUND' | translate }} + + + + + } - - - - - {{ 'labels.inputs.PAYMENT ALLOCATION' | translate }} - - - - - - + @if (isAdvancedPaymentStrategy) { + + {{ 'labels.inputs.PAYMENT ALLOCATION' | translate }} + + + + + } {{ 'labels.inputs.TERMS' | translate }} @@ -99,22 +100,23 @@ - - {{ 'labels.inputs.DEFERRED INCOME RECOGNITION' | translate }} - - - - - + @if (isAdvancedPaymentStrategy) { + + {{ 'labels.inputs.DEFERRED INCOME RECOGNITION' | translate }} + + + + + } {{ 'labels.inputs.ACCOUNTING' | translate }} @@ -128,16 +130,17 @@ - - {{ 'labels.inputs.PREVIEW' | translate }} - - - - + @if (loanProductFormValid) { + + {{ 'labels.inputs.PREVIEW' | translate }} + + + + }
    diff --git a/src/app/products/loan-products/create-loan-product/create-loan-product.component.ts b/src/app/products/loan-products/create-loan-product/create-loan-product.component.ts index 0d64dad7f..d97f4f213 100644 --- a/src/app/products/loan-products/create-loan-product/create-loan-product.component.ts +++ b/src/app/products/loan-products/create-loan-product/create-loan-product.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, ViewChild } from '@angular/core'; +import { Component, OnInit, ViewChild, inject } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; /** Custom Components */ @@ -58,6 +58,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class CreateLoanProductComponent implements OnInit { + private route = inject(ActivatedRoute); + private productsService = inject(ProductsService); + private loanProducts = inject(LoanProducts); + private router = inject(Router); + private accounting = inject(Accounting); + private advancedPaymentStrategy = inject(AdvancedPaymentStrategy); + @ViewChild(LoanProductDetailsStepComponent, { static: true }) loanProductDetailsStep: LoanProductDetailsStepComponent; @ViewChild(LoanProductCurrencyStepComponent, { static: true }) loanProductCurrencyStep: LoanProductCurrencyStepComponent; @@ -92,14 +99,9 @@ export class CreateLoanProductComponent implements OnInit { * @param {LoanProducts} loanProducts LoanProducts * @param {Router} router Router for navigation. */ - constructor( - private route: ActivatedRoute, - private productsService: ProductsService, - private loanProducts: LoanProducts, - private router: Router, - private accounting: Accounting, - private advancedPaymentStrategy: AdvancedPaymentStrategy - ) { + constructor() { + const loanProducts = this.loanProducts; + this.route.data.subscribe((data: { loanProductsTemplate: any; configurations: any }) => { this.loanProductsTemplate = data.loanProductsTemplate; const assetAccountData = this.loanProductsTemplate.accountingMappingOptions.assetAccountOptions || []; diff --git a/src/app/products/loan-products/edit-loan-product/edit-loan-product.component.html b/src/app/products/loan-products/edit-loan-product/edit-loan-product.component.html index 1315fd364..1cca5bf1f 100644 --- a/src/app/products/loan-products/edit-loan-product/edit-loan-product.component.html +++ b/src/app/products/loan-products/edit-loan-product/edit-loan-product.component.html @@ -53,34 +53,35 @@ - - {{ 'labels.inputs.INTEREST REFUND' | translate }} - - + @if (isAdvancedPaymentStrategy) { + + {{ 'labels.inputs.INTEREST REFUND' | translate }} + + + + + } - - - - - {{ 'labels.inputs.PAYMENT ALLOCATION' | translate }} - - - - - - + @if (isAdvancedPaymentStrategy) { + + {{ 'labels.inputs.PAYMENT ALLOCATION' | translate }} + + + + + } {{ 'labels.inputs.TERMS' | translate }} @@ -99,23 +100,23 @@ - - {{ 'labels.inputs.DEFERRED INCOME RECOGNITION' | translate }} - - - - - - + @if (isAdvancedPaymentStrategy) { + + {{ 'labels.inputs.DEFERRED INCOME RECOGNITION' | translate }} + + + + + } {{ 'labels.inputs.ACCOUNTING' | translate }} @@ -129,16 +130,17 @@ - - {{ 'labels.inputs.PREVIEW' | translate }} - - - - + @if (loanProductFormValidAndNotPristine) { + + {{ 'labels.inputs.PREVIEW' | translate }} + + + + }
    diff --git a/src/app/products/loan-products/edit-loan-product/edit-loan-product.component.ts b/src/app/products/loan-products/edit-loan-product/edit-loan-product.component.ts index a1d56a979..72fbae2fc 100644 --- a/src/app/products/loan-products/edit-loan-product/edit-loan-product.component.ts +++ b/src/app/products/loan-products/edit-loan-product/edit-loan-product.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, ViewChild } from '@angular/core'; +import { Component, OnInit, ViewChild, inject } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; /** Custom Components */ @@ -61,6 +61,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class EditLoanProductComponent implements OnInit { + private route = inject(ActivatedRoute); + private productsService = inject(ProductsService); + private loanProducts = inject(LoanProducts); + private router = inject(Router); + private accounting = inject(Accounting); + private advancedPaymentStrategy = inject(AdvancedPaymentStrategy); + @ViewChild(LoanProductDetailsStepComponent, { static: true }) loanProductDetailsStep: LoanProductDetailsStepComponent; @ViewChild(LoanProductCurrencyStepComponent, { static: true }) loanProductCurrencyStep: LoanProductCurrencyStepComponent; @@ -97,14 +104,9 @@ export class EditLoanProductComponent implements OnInit { * @param {Router} router Router for navigation. */ - constructor( - private route: ActivatedRoute, - private productsService: ProductsService, - private loanProducts: LoanProducts, - private router: Router, - private accounting: Accounting, - private advancedPaymentStrategy: AdvancedPaymentStrategy - ) { + constructor() { + const loanProducts = this.loanProducts; + this.route.data.subscribe((data: { loanProductAndTemplate: any; configurations: any }) => { this.loanProductAndTemplate = data.loanProductAndTemplate; const assetAccountData = this.loanProductAndTemplate.accountingMappingOptions.assetAccountOptions || []; diff --git a/src/app/products/loan-products/edit-loan-product/loan-product-and-template.resolver.ts b/src/app/products/loan-products/edit-loan-product/loan-product-and-template.resolver.ts index 6fe9cfd4a..8331a18d7 100644 --- a/src/app/products/loan-products/edit-loan-product/loan-product-and-template.resolver.ts +++ b/src/app/products/loan-products/edit-loan-product/loan-product-and-template.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { ProductsService } from '../../products.service'; */ @Injectable() export class LoanProductAndTemplateResolver { - /** - * @param {ProductsService} productsService Products service. - */ - constructor(private productsService: ProductsService) {} + private productsService = inject(ProductsService); /** * Returns the loan product and template data. diff --git a/src/app/products/loan-products/loan-product-datatable.resolver.ts b/src/app/products/loan-products/loan-product-datatable.resolver.ts index 983512ee3..c6d691064 100644 --- a/src/app/products/loan-products/loan-product-datatable.resolver.ts +++ b/src/app/products/loan-products/loan-product-datatable.resolver.ts @@ -1,4 +1,4 @@ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; import { SystemService } from 'app/system/system.service'; import { Observable } from 'rxjs'; @@ -7,10 +7,7 @@ import { Observable } from 'rxjs'; providedIn: 'root' }) export class LoanProductDatatableResolver { - /** - * @param {SystemService} systemService Products service. - */ - constructor(private systemService: SystemService) {} + private systemService = inject(SystemService); /** * Returns the loan product data. diff --git a/src/app/products/loan-products/loan-product-datatables.resolver.ts b/src/app/products/loan-products/loan-product-datatables.resolver.ts index 0f4e6059d..3daafd525 100644 --- a/src/app/products/loan-products/loan-product-datatables.resolver.ts +++ b/src/app/products/loan-products/loan-product-datatables.resolver.ts @@ -1,4 +1,4 @@ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; import { SystemService } from 'app/system/system.service'; import { Observable } from 'rxjs'; @@ -7,10 +7,7 @@ import { Observable } from 'rxjs'; providedIn: 'root' }) export class LoanProductDatatablesResolver { - /** - * @param {SystemService} systemService Products service. - */ - constructor(private systemService: SystemService) {} + private systemService = inject(SystemService); /** * Returns the loan product data. diff --git a/src/app/products/loan-products/loan-product-stepper/loan-product-accounting-step/advanced-accounting-mapping-rule/advanced-accounting-mapping-rule.component.html b/src/app/products/loan-products/loan-product-stepper/loan-product-accounting-step/advanced-accounting-mapping-rule/advanced-accounting-mapping-rule.component.html index 97b193129..c7e16ea9a 100644 --- a/src/app/products/loan-products/loan-product-stepper/loan-product-accounting-step/advanced-accounting-mapping-rule/advanced-accounting-mapping-rule.component.html +++ b/src/app/products/loan-products/loan-product-stepper/loan-product-accounting-step/advanced-accounting-mapping-rule/advanced-accounting-mapping-rule.component.html @@ -9,32 +9,31 @@ {{ 'labels.buttons.Add' | translate }}
    - - - - - - - - - - - - - - - - - - -
    {{ 'labels.inputs.' + textField | translate }} - {{ item.value.name }} - {{ 'labels.inputs.GL Account Name or Code' | translate }}({{ item.glAccount.glCode }}) {{ item.glAccount.name }}{{ 'labels.inputs.Actions' | translate }} - - -
    + @if (tableData.length !== 0) { + + + + + + + + + + + + + + + +
    {{ 'labels.inputs.' + textField | translate }} + {{ item.value.name }} + {{ 'labels.inputs.GL Account Name or Code' | translate }}({{ item.glAccount.glCode }}) {{ item.glAccount.name }}{{ 'labels.inputs.Actions' | translate }} + + +
    + }
    diff --git a/src/app/products/loan-products/loan-product-stepper/loan-product-accounting-step/advanced-accounting-mapping-rule/advanced-accounting-mapping-rule.component.ts b/src/app/products/loan-products/loan-product-stepper/loan-product-accounting-step/advanced-accounting-mapping-rule/advanced-accounting-mapping-rule.component.ts index 12e3825ed..3bf5d2cd6 100644 --- a/src/app/products/loan-products/loan-product-stepper/loan-product-accounting-step/advanced-accounting-mapping-rule/advanced-accounting-mapping-rule.component.ts +++ b/src/app/products/loan-products/loan-product-stepper/loan-product-accounting-step/advanced-accounting-mapping-rule/advanced-accounting-mapping-rule.component.ts @@ -1,4 +1,4 @@ -import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; +import { Component, EventEmitter, Input, OnInit, Output, inject } from '@angular/core'; import { UntypedFormArray } from '@angular/forms'; import { MatIconButton } from '@angular/material/button'; import { MatDialog } from '@angular/material/dialog'; @@ -45,6 +45,9 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; styleUrl: './advanced-accounting-mapping-rule.component.scss' }) export class AdvancedAccountingMappingRuleComponent implements OnInit { + dialog = inject(MatDialog); + translateService = inject(TranslateService); + @Input() formType: string; @Input() formArray: UntypedFormArray; @Input() textHeading: string; @@ -73,11 +76,6 @@ export class AdvancedAccountingMappingRuleComponent implements OnInit { 'actions' ]; - constructor( - public dialog: MatDialog, - public translateService: TranslateService - ) {} - ngOnInit(): void { this.tableData = this.formArray?.value || []; this.sendParentData(); @@ -137,7 +135,8 @@ export class AdvancedAccountingMappingRuleComponent implements OnInit { let newData = [ ...this.tableData.slice(0, index), updatedData, - ...this.tableData.slice(index + 1)]; + ...this.tableData.slice(index + 1) + ]; this.tableData = newData; } @@ -261,7 +260,6 @@ export class AdvancedAccountingMappingRuleComponent implements OnInit { required: true, order: 2 }) - ]; return formfields; } @@ -284,7 +282,6 @@ export class AdvancedAccountingMappingRuleComponent implements OnInit { required: true, order: 2 }) - ]; return formfields; } @@ -307,7 +304,6 @@ export class AdvancedAccountingMappingRuleComponent implements OnInit { required: true, order: 2 }) - ]; return formfields; } @@ -333,7 +329,6 @@ export class AdvancedAccountingMappingRuleComponent implements OnInit { required: true, order: 2 }) - ]; return formfields; } @@ -359,7 +354,6 @@ export class AdvancedAccountingMappingRuleComponent implements OnInit { required: true, order: 2 }) - ]; return formfields; } diff --git a/src/app/products/loan-products/loan-product-stepper/loan-product-accounting-step/loan-product-accounting-step.component.html b/src/app/products/loan-products/loan-product-stepper/loan-product-accounting-step/loan-product-accounting-step.component.html index 0e237c1bb..4239bcb8e 100644 --- a/src/app/products/loan-products/loan-product-stepper/loan-product-accounting-step/loan-product-accounting-step.component.html +++ b/src/app/products/loan-products/loan-product-stepper/loan-product-accounting-step/loan-product-accounting-step.component.html @@ -4,551 +4,493 @@ class="flex-98 layout-row gap-5percent layout-lt-md-column radio-group-spacing" formControlName="accountingRule" > - - {{ 'labels.accounting.' + accountingRule | translate }} - + @for (accountingRule of accountingRuleData; track accountingRule; let i = $index) { + + {{ 'labels.accounting.' + accountingRule | translate }} + + } -
    - {{ - 'labels.inputs.Enable Accrual Activity Posting on Installment Due Date' | translate - }} - -

    - {{ 'labels.heading.Assets' | translate }} / {{ 'labels.heading.Liabilities' | translate }} -

    - - - - -

    {{ 'labels.heading.Assets' | translate }}

    - - - - - - - -
    + @if (isAccountingAccrualBased) { + {{ + 'labels.inputs.Enable Accrual Activity Posting on Installment Due Date' | translate + }} + } +

    + {{ 'labels.heading.Assets' | translate }} / {{ 'labels.heading.Liabilities' | translate }} +

    + + +

    {{ 'labels.heading.Assets' | translate }}

    + + + + + @if ( loanProductAccountingForm.value.accountingRule === 3 || loanProductAccountingForm.value.accountingRule === 4 - " - class="flex-100 layout-row-wrap responsive-column" - > + ) { +
    + + + + + + +
    + } + +

    {{ 'labels.heading.Income' | translate }}

    - - -
    - - - -

    {{ 'labels.heading.Income' | translate }}

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    {{ 'labels.heading.Expenses' | translate }}

    - - - - - - - - - - - - - - + + + + + + + + + + + + + + @if (deferredIncomeRecognition?.capitalizedIncome?.enableIncomeCapitalization) { + + + } + @if (deferredIncomeRecognition?.buyDownFee?.enableBuyDownFee) { + + + } + +

    {{ 'labels.heading.Expenses' | translate }}

    + + + + + + + + + @if ( deferredIncomeRecognition?.buyDownFee?.enableBuyDownFee && deferredIncomeRecognition?.buyDownFee?.merchantBuyDownFee - " - [inputFormControl]="loanProductAccountingForm.controls.buyDownExpenseAccountId" - [glAccountList]="expenseAccountData" - [required]="true" - [inputLabel]="'Buy down fee Expense'" - > - - - - -

    {{ 'labels.heading.Liabilities' | translate }}

    - - - - - + + } + +

    {{ 'labels.heading.Liabilities' | translate }}

    + + + @if ( deferredIncomeRecognition?.capitalizedIncome?.enableIncomeCapitalization || deferredIncomeRecognition?.buyDownFee?.enableBuyDownFee - " - class="flex-48" - [inputFormControl]="loanProductAccountingForm.controls.deferredIncomeLiabilityAccountId" - [glAccountList]="liabilityAccountData" - [required]="true" - [inputLabel]="'Deferred income'" - > - - - - - {{ - 'labels.heading.Advanced Accounting Rules' | translate - }} - -
    -

    - {{ 'labels.heading.Configure Fund Sources for Payment Channels' | translate }} -

    - -
    - -
    - - - - - - - - - - - - - - - - - - - -
    {{ 'labels.inputs.Payment Type' | translate }} - {{ paymentFundSource.paymentTypeId | find: paymentTypeData : 'id' : 'name' }} - {{ 'labels.inputs.Fund Source' | translate }} - {{ paymentFundSource.fundSourceAccountId | find: assetAccountData : 'id' : 'name' }} - {{ 'labels.inputs.Actions' | translate }} + + } + + {{ + 'labels.heading.Advanced Accounting Rules' | translate + }} + @if (loanProductAccountingForm.value.advancedAccountingRules) { +
    +

    + {{ 'labels.heading.Configure Fund Sources for Payment Channels' | translate }} +

    +
    +
    + @if (paymentChannelToFundSourceMappings.value.length !== 0) { + + + + + + + + + + + + + + + +
    {{ 'labels.inputs.Payment Type' | translate }} + {{ paymentFundSource.paymentTypeId | find: paymentTypeData : 'id' : 'name' }} + {{ 'labels.inputs.Fund Source' | translate }} + {{ paymentFundSource.fundSourceAccountId | find: assetAccountData : 'id' : 'name' }} + {{ 'labels.inputs.Actions' | translate }} + + +
    + } +

    {{ 'labels.heading.Map Fees to Specific Income Accounts' | translate }}

    +
    -
    - -

    {{ 'labels.heading.Map Fees to Specific Income Accounts' | translate }}

    - -
    - -
    - - - - - - - - - - - - - - - - - - - -
    {{ 'labels.inputs.Fees' | translate }} - {{ feesIncome.chargeId | find: chargeData : 'id' : 'name' }} - {{ 'labels.inputs.Income Account' | translate }} - {{ feesIncome.incomeAccountId | find: incomeAndLiabilityAccountData : 'id' : 'name' }} - {{ 'labels.inputs.Actions' | translate }} - - -
    - -

    - {{ 'labels.heading.Map Penalties to Specific Income Accounts' | translate }} -

    - -
    - -
    - - - - - - - - - - - - - - - - - - - -
    {{ 'labels.inputs.Penalty' | translate }} - {{ penaltyIncome.chargeId | find: penaltyData : 'id' : 'name' }} - {{ 'labels.inputs.Income Account' | translate }} - {{ penaltyIncome.incomeAccountId | find: incomeAccountData : 'id' : 'name' }} - {{ 'labels.inputs.Actions' | translate }} - - -
    - -

    - {{ 'labels.heading.Map Charge-off reasons to Expense accounts' | translate }} -

    - -
    - -
    - - - - - - - - - - - - - - - - - - -
    {{ 'labels.inputs.Charge-off reason' | translate }} - {{ chargeOffReasonExpense.chargeOffReasonCodeValueId | find: chargeOffReasonOptions : 'id' : 'name' }} - {{ 'labels.inputs.Expense Account' | translate }} - {{ chargeOffReasonExpense.expenseAccountId | find: expenseAccountData : 'id' : 'name' }} - {{ 'labels.inputs.Actions' | translate }} + + @if (feeToIncomeAccountMappings.value.length !== 0) { + + + + + + + + + + + + + + + +
    {{ 'labels.inputs.Fees' | translate }} + {{ feesIncome.chargeId | find: chargeData : 'id' : 'name' }} + {{ 'labels.inputs.Income Account' | translate }} + {{ feesIncome.incomeAccountId | find: incomeAndLiabilityAccountData : 'id' : 'name' }} + {{ 'labels.inputs.Actions' | translate }} + + +
    + } +

    + {{ 'labels.heading.Map Penalties to Specific Income Accounts' | translate }} +

    +
    +
    + @if (penaltyToIncomeAccountMappings.value.length !== 0) { + + + + + + + + + + + + + + + +
    {{ 'labels.inputs.Penalty' | translate }} + {{ penaltyIncome.chargeId | find: penaltyData : 'id' : 'name' }} + {{ 'labels.inputs.Income Account' | translate }} + {{ penaltyIncome.incomeAccountId | find: incomeAccountData : 'id' : 'name' }} + {{ 'labels.inputs.Actions' | translate }} + + +
    + } +

    + {{ 'labels.heading.Map Charge-off reasons to Expense accounts' | translate }} +

    +
    -
    - - - - - - +
    + @if (chargeOffReasonToExpenseAccountMappings.value.length !== 0) { + + + + + + + + + + + + + + + +
    {{ 'labels.inputs.Charge-off reason' | translate }} + {{ + chargeOffReasonExpense.chargeOffReasonCodeValueId | find: chargeOffReasonOptions : 'id' : 'name' + }} + {{ 'labels.inputs.Expense Account' | translate }} + {{ chargeOffReasonExpense.expenseAccountId | find: expenseAccountData : 'id' : 'name' }} + {{ 'labels.inputs.Actions' | translate }} + + +
    + } + + + +
    + }
    -
    + }
    diff --git a/src/app/products/loan-products/loan-product-stepper/loan-product-accounting-step/loan-product-accounting-step.component.ts b/src/app/products/loan-products/loan-product-stepper/loan-product-accounting-step/loan-product-accounting-step.component.ts index d05072957..615dc53ab 100644 --- a/src/app/products/loan-products/loan-product-stepper/loan-product-accounting-step/loan-product-accounting-step.component.ts +++ b/src/app/products/loan-products/loan-product-stepper/loan-product-accounting-step/loan-product-accounting-step.component.ts @@ -1,4 +1,4 @@ -import { Component, Input, OnChanges, OnInit, SimpleChanges } from '@angular/core'; +import { Component, Input, OnChanges, OnInit, SimpleChanges, inject } from '@angular/core'; import { UntypedFormArray, UntypedFormBuilder, UntypedFormControl, UntypedFormGroup, Validators } from '@angular/forms'; import { MatDialog } from '@angular/material/dialog'; @@ -67,6 +67,10 @@ import { AccountingMappingDTO, AdvancedMappingDTO } from '../../models/loan-prod ] }) export class LoanProductAccountingStepComponent implements OnInit, OnChanges { + private formBuilder = inject(UntypedFormBuilder); + dialog = inject(MatDialog); + private translateService = inject(TranslateService); + @Input() loanProductsTemplate: any; @Input() accountingRuleData: any; @Input() loanProductFormValid: boolean; @@ -107,11 +111,7 @@ export class LoanProductAccountingStepComponent implements OnInit, OnChanges { 'actions' ]; - constructor( - private formBuilder: UntypedFormBuilder, - public dialog: MatDialog, - private translateService: TranslateService - ) { + constructor() { this.createLoanProductAccountingForm(); this.setConditionalControls(); } @@ -592,7 +592,6 @@ export class LoanProductAccountingStepComponent implements OnInit, OnChanges { required: true, order: 2 }) - ]; return formfields; } @@ -615,7 +614,6 @@ export class LoanProductAccountingStepComponent implements OnInit, OnChanges { required: true, order: 2 }) - ]; return formfields; } @@ -638,7 +636,6 @@ export class LoanProductAccountingStepComponent implements OnInit, OnChanges { required: true, order: 2 }) - ]; return formfields; } @@ -662,7 +659,6 @@ export class LoanProductAccountingStepComponent implements OnInit, OnChanges { required: true, order: 2 }) - ]; return formfields; } diff --git a/src/app/products/loan-products/loan-product-stepper/loan-product-capitalized-income-step/loan-product-deferred-income-recognition-step.component.html b/src/app/products/loan-products/loan-product-stepper/loan-product-capitalized-income-step/loan-product-deferred-income-recognition-step.component.html index 5d01f7852..6e0902f53 100644 --- a/src/app/products/loan-products/loan-product-stepper/loan-product-capitalized-income-step/loan-product-deferred-income-recognition-step.component.html +++ b/src/app/products/loan-products/loan-product-stepper/loan-product-capitalized-income-step/loan-product-deferred-income-recognition-step.component.html @@ -4,75 +4,92 @@ {{ 'labels.inputs.Enable income capitalization' | translate }} - - {{ 'labels.inputs.Income capitalization calculation type' | translate }} - - - {{ capitalizedIncomeCalculationType.value | translateKey: 'catalogs' }} - - - - - {{ 'labels.inputs.Income capitalization strategy' | translate }} - - - {{ capitalizedIncomeStrategy.value | translateKey: 'catalogs' }} - - - - - {{ 'labels.inputs.Income type' | translate }} - - - {{ capitalizedIncomeType.value | translateKey: 'catalogs' }} - - - + @if (enableIncomeCapitalization) { + + {{ 'labels.inputs.Income capitalization calculation type' | translate }} + + @for ( + capitalizedIncomeCalculationType of capitalizedIncomeCalculationTypeOptions; + track capitalizedIncomeCalculationType + ) { + + {{ capitalizedIncomeCalculationType.value | translateKey: 'catalogs' }} + + } + + + } + @if (enableIncomeCapitalization) { + + {{ 'labels.inputs.Income capitalization strategy' | translate }} + + @for (capitalizedIncomeStrategy of capitalizedIncomeStrategyOptions; track capitalizedIncomeStrategy) { + + {{ capitalizedIncomeStrategy.value | translateKey: 'catalogs' }} + + } + + + } + @if (enableIncomeCapitalization) { + + {{ 'labels.inputs.Income type' | translate }} + + @for (capitalizedIncomeType of capitalizedIncomeTypeOptions; track capitalizedIncomeType) { + + {{ capitalizedIncomeType.value | translateKey: 'catalogs' }} + + } + + + }
    {{ 'labels.inputs.Enable Buy down fee' | translate }} - - {{ 'labels.inputs.Buy down fee calculation type' | translate }} - - - {{ buyDownFeeCalculationType.value | translateKey: 'catalogs' }} - - - - - {{ 'labels.inputs.Buy down fee strategy' | translate }} - - - {{ buyDownFeeStrategy.value | translateKey: 'catalogs' }} - - - - - {{ 'labels.inputs.Buy down fee income type' | translate }} - - - {{ buyDownFeeIncomeType.value | translateKey: 'catalogs' }} - - - + @if (enableBuyDownFee) { + + {{ 'labels.inputs.Buy down fee calculation type' | translate }} + + @for (buyDownFeeCalculationType of buyDownFeeCalculationTypeOptions; track buyDownFeeCalculationType) { + + {{ buyDownFeeCalculationType.value | translateKey: 'catalogs' }} + + } + + + } + @if (enableBuyDownFee) { + + {{ 'labels.inputs.Buy down fee strategy' | translate }} + + @for (buyDownFeeStrategy of buyDownFeeStrategyOptions; track buyDownFeeStrategy) { + + {{ buyDownFeeStrategy.value | translateKey: 'catalogs' }} + + } + + + } + @if (enableBuyDownFee) { + + {{ 'labels.inputs.Buy down fee income type' | translate }} + + @for (buyDownFeeIncomeType of buyDownFeeIncomeTypeOptions; track buyDownFeeIncomeType) { + + {{ buyDownFeeIncomeType.value | translateKey: 'catalogs' }} + + } + + + } - - {{ 'labels.inputs.Merchant Buy down fee' | translate }} - + @if (enableBuyDownFee) { + + {{ 'labels.inputs.Merchant Buy down fee' | translate }} + + }
    diff --git a/src/app/products/loan-products/loan-product-stepper/loan-product-capitalized-income-step/loan-product-deferred-income-recognition-step.component.ts b/src/app/products/loan-products/loan-product-stepper/loan-product-capitalized-income-step/loan-product-deferred-income-recognition-step.component.ts index 798849afd..35c3c0d9b 100644 --- a/src/app/products/loan-products/loan-product-stepper/loan-product-capitalized-income-step/loan-product-deferred-income-recognition-step.component.ts +++ b/src/app/products/loan-products/loan-product-stepper/loan-product-capitalized-income-step/loan-product-deferred-income-recognition-step.component.ts @@ -1,4 +1,4 @@ -import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; +import { Component, EventEmitter, Input, OnInit, Output, inject } from '@angular/core'; import { UntypedFormBuilder, UntypedFormControl, UntypedFormGroup, Validators } from '@angular/forms'; import { DeferredIncomeRecognition } from '../loan-product-payment-strategy-step/payment-allocation-model'; import { StringEnumOptionData } from 'app/shared/models/option-data.model'; @@ -15,6 +15,8 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class LoanProductDeferredIncomeRecognitionStepComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + @Input() deferredIncomeRecognition: DeferredIncomeRecognition; @Input() capitalizedIncomeCalculationTypeOptions: StringEnumOptionData[]; @Input() capitalizedIncomeStrategyOptions: StringEnumOptionData[]; @@ -30,7 +32,7 @@ export class LoanProductDeferredIncomeRecognitionStepComponent implements OnInit @Output() setViewChildForm = new EventEmitter(); - constructor(private formBuilder: UntypedFormBuilder) { + constructor() { this.enableIncomeCapitalization = this.deferredIncomeRecognition != null ? this.deferredIncomeRecognition.capitalizedIncome.enableIncomeCapitalization diff --git a/src/app/products/loan-products/loan-product-stepper/loan-product-charges-step/loan-product-charges-step.component.html b/src/app/products/loan-products/loan-product-stepper/loan-product-charges-step/loan-product-charges-step.component.html index 6d72b4266..5b7ec36d6 100644 --- a/src/app/products/loan-products/loan-product-stepper/loan-product-charges-step/loan-product-charges-step.component.html +++ b/src/app/products/loan-products/loan-product-stepper/loan-product-charges-step/loan-product-charges-step.component.html @@ -2,14 +2,14 @@ {{ 'labels.inputs.Charge' | translate }} - - {{ charge.name }} - + @for ( + charge of chargeData | chargesFilter: chargesDataSource : currencyCode.value : multiDisburseLoan.value; + track charge + ) { + + {{ charge.name }} + + } @@ -77,12 +77,14 @@ {{ 'labels.inputs.Overdue Charge' | translate }} - - {{ overdueCharge.name }} - + @for ( + overdueCharge of overdueChargeData | chargesFilter: chargesDataSource : currencyCode.value; + track overdueCharge + ) { + + {{ overdueCharge.name }} + + } diff --git a/src/app/products/loan-products/loan-product-stepper/loan-product-charges-step/loan-product-charges-step.component.ts b/src/app/products/loan-products/loan-product-stepper/loan-product-charges-step/loan-product-charges-step.component.ts index d236fb500..05a7397ea 100644 --- a/src/app/products/loan-products/loan-product-stepper/loan-product-charges-step/loan-product-charges-step.component.ts +++ b/src/app/products/loan-products/loan-product-stepper/loan-product-charges-step/loan-product-charges-step.component.ts @@ -1,4 +1,4 @@ -import { Component, Input, OnInit } from '@angular/core'; +import { Component, Input, OnInit, inject } from '@angular/core'; import { UntypedFormControl } from '@angular/forms'; import { MatDialog } from '@angular/material/dialog'; @@ -52,6 +52,9 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class LoanProductChargesStepComponent implements OnInit { + dialog = inject(MatDialog); + private translateService = inject(TranslateService); + @Input() loanProductsTemplate: any; @Input() currencyCode: UntypedFormControl; @Input() multiDisburseLoan: UntypedFormControl; @@ -70,11 +73,6 @@ export class LoanProductChargesStepComponent implements OnInit { pristine = true; - constructor( - public dialog: MatDialog, - private translateService: TranslateService - ) {} - ngOnInit() { this.chargeData = this.loanProductsTemplate.chargeOptions; this.overdueChargeData = this.loanProductsTemplate.penaltyOptions diff --git a/src/app/products/loan-products/loan-product-stepper/loan-product-currency-step/loan-product-currency-step.component.html b/src/app/products/loan-products/loan-product-stepper/loan-product-currency-step/loan-product-currency-step.component.html index b255bdf2d..fe4ea19ef 100644 --- a/src/app/products/loan-products/loan-product-stepper/loan-product-currency-step/loan-product-currency-step.component.html +++ b/src/app/products/loan-products/loan-product-stepper/loan-product-currency-step/loan-product-currency-step.component.html @@ -7,9 +7,11 @@ matTooltip="{{ 'tooltips.The currency in which the loan will be disbursed' | translate }}" required > - - {{ currency.name }} - + @for (currency of currencyData; track currency) { + + {{ currency.name }} + + } {{ 'labels.inputs.Currency' | translate }} {{ 'labels.commons.is' | translate }} diff --git a/src/app/products/loan-products/loan-product-stepper/loan-product-currency-step/loan-product-currency-step.component.ts b/src/app/products/loan-products/loan-product-stepper/loan-product-currency-step/loan-product-currency-step.component.ts index af84f34f3..2d0e4db67 100644 --- a/src/app/products/loan-products/loan-product-stepper/loan-product-currency-step/loan-product-currency-step.component.ts +++ b/src/app/products/loan-products/loan-product-stepper/loan-product-currency-step/loan-product-currency-step.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit, Input } from '@angular/core'; +import { Component, OnInit, Input, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, Validators, ReactiveFormsModule } from '@angular/forms'; import { MatTooltip } from '@angular/material/tooltip'; import { MatStepperPrevious, MatStepperNext } from '@angular/material/stepper'; @@ -18,13 +18,15 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class LoanProductCurrencyStepComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + @Input() loanProductsTemplate: any; loanProductCurrencyForm: UntypedFormGroup; currencyData: any; - constructor(private formBuilder: UntypedFormBuilder) { + constructor() { this.createLoanProductCurrencyForm(); } diff --git a/src/app/products/loan-products/loan-product-stepper/loan-product-details-step/loan-product-details-step.component.html b/src/app/products/loan-products/loan-product-stepper/loan-product-details-step/loan-product-details-step.component.html index 9a41e62b8..d6710f44c 100644 --- a/src/app/products/loan-products/loan-product-stepper/loan-product-details-step/loan-product-details-step.component.html +++ b/src/app/products/loan-products/loan-product-stepper/loan-product-details-step/loan-product-details-step.component.html @@ -41,9 +41,11 @@ {{ 'labels.inputs.Fund' | translate }} - - {{ fund.name }} - + @for (fund of fundData; track fund) { + + {{ fund.name }} + + } diff --git a/src/app/products/loan-products/loan-product-stepper/loan-product-details-step/loan-product-details-step.component.ts b/src/app/products/loan-products/loan-product-stepper/loan-product-details-step/loan-product-details-step.component.ts index ff2138ea4..bf5d11d0a 100644 --- a/src/app/products/loan-products/loan-product-stepper/loan-product-details-step/loan-product-details-step.component.ts +++ b/src/app/products/loan-products/loan-product-stepper/loan-product-details-step/loan-product-details-step.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, Input } from '@angular/core'; +import { Component, OnInit, Input, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, Validators, ReactiveFormsModule } from '@angular/forms'; import { Dates } from 'app/core/utils/dates'; @@ -27,6 +27,10 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class LoanProductDetailsStepComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private dateUtils = inject(Dates); + private settingsService = inject(SettingsService); + @Input() loanProductsTemplate: any; loanProductDetailsForm: UntypedFormGroup; @@ -42,11 +46,7 @@ export class LoanProductDetailsStepComponent implements OnInit { * @param {SettingsService} settingsService Settings Service. */ - constructor( - private formBuilder: UntypedFormBuilder, - private dateUtils: Dates, - private settingsService: SettingsService - ) { + constructor() { this.createLoanProductDetailsForm(); } diff --git a/src/app/products/loan-products/loan-product-stepper/loan-product-interest-refund-step/loan-product-interest-refund-step.component.html b/src/app/products/loan-products/loan-product-stepper/loan-product-interest-refund-step/loan-product-interest-refund-step.component.html index 3c8192a2b..dcf19219e 100644 --- a/src/app/products/loan-products/loan-product-stepper/loan-product-interest-refund-step/loan-product-interest-refund-step.component.html +++ b/src/app/products/loan-products/loan-product-stepper/loan-product-interest-refund-step/loan-product-interest-refund-step.component.html @@ -9,12 +9,11 @@ 'tooltips.Refund transactions where interest refund will automatically be calculated' | translate }}" > - - {{ supportedTransaction.value | translateKey: 'catalogs' }} - + @for (supportedTransaction of supportedInterestRefundTypesOptions; track supportedTransaction) { + + {{ supportedTransaction.value | translateKey: 'catalogs' }} + + }
    diff --git a/src/app/products/loan-products/loan-product-stepper/loan-product-interest-refund-step/loan-product-interest-refund-step.component.ts b/src/app/products/loan-products/loan-product-stepper/loan-product-interest-refund-step/loan-product-interest-refund-step.component.ts index 7a5dd7de2..feb7afa1a 100644 --- a/src/app/products/loan-products/loan-product-stepper/loan-product-interest-refund-step/loan-product-interest-refund-step.component.ts +++ b/src/app/products/loan-products/loan-product-stepper/loan-product-interest-refund-step/loan-product-interest-refund-step.component.ts @@ -1,4 +1,4 @@ -import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; +import { Component, EventEmitter, Input, OnInit, Output, inject } from '@angular/core'; import { UntypedFormBuilder, UntypedFormGroup, ReactiveFormsModule } from '@angular/forms'; import { StringEnumOptionData } from '../../../../shared/models/option-data.model'; import { MatTooltip } from '@angular/material/tooltip'; @@ -14,6 +14,8 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class LoanProductInterestRefundStepComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + @Input() loanProductsTemplate: any; @Output() supportedInterestRefundTypes = new EventEmitter(); @@ -21,7 +23,7 @@ export class LoanProductInterestRefundStepComponent implements OnInit { supportedInterestRefundTypesOptions: StringEnumOptionData[]; - constructor(private formBuilder: UntypedFormBuilder) { + constructor() { this.createLoanProductInterestRefundForm(); this.setConditionalControls(); } diff --git a/src/app/products/loan-products/loan-product-stepper/loan-product-payment-strategy-step/advance-payment-allocation-tab/advance-payment-allocation-tab.component.html b/src/app/products/loan-products/loan-product-stepper/loan-product-payment-strategy-step/advance-payment-allocation-tab/advance-payment-allocation-tab.component.html index 880640c68..7a9f54c3d 100644 --- a/src/app/products/loan-products/loan-product-stepper/loan-product-payment-strategy-step/advance-payment-allocation-tab/advance-payment-allocation-tab.component.html +++ b/src/app/products/loan-products/loan-product-stepper/loan-product-payment-strategy-step/advance-payment-allocation-tab/advance-payment-allocation-tab.component.html @@ -3,86 +3,87 @@ {{ 'labels.heading.You can drag and drop the rows to set a Payment Allocations order' | translate }} -
    - -
    + @if (!isDefault()) { +
    + +
    + } -
    - - - - - - - - - - - - - - - - - - -
    - - {{ 'labels.inputs.Order' | translate }}{{ rowIndex + 1 }}{{ 'labels.inputs.Payment Allocation Rule' | translate }}{{ paymentAllocation.value | translateKey: 'catalogs' }}
    -
    - -
    - - - - - - - - - - - - - - - - - - -
    - - {{ 'labels.inputs.Order' | translate }}{{ rowIndex + 1 }}{{ 'labels.inputs.Credit Allocation Rule' | translate }}{{ creditAllocation.value | translateKey: 'catalogs' }}
    -
    - - - {{ 'labels.inputs.Future Installment Allocation Rule' | translate }} - - + - {{ futureInstallmentAllocationRule.value | translateKey: 'catalogs' }} - - - + + + + + + + + + + + + + + +
    + + {{ 'labels.inputs.Order' | translate }}{{ rowIndex + 1 }}{{ 'labels.inputs.Payment Allocation Rule' | translate }}{{ paymentAllocation.value | translateKey: 'catalogs' }}
    +
    + } + + @if (creditAllocationsData) { +
    + + + + + + + + + + + + + + + +
    + + {{ 'labels.inputs.Order' | translate }}{{ rowIndex + 1 }}{{ 'labels.inputs.Credit Allocation Rule' | translate }}{{ creditAllocation.value | translateKey: 'catalogs' }}
    +
    + } + + @if (advancedPaymentAllocation && advancedPaymentAllocation.futureInstallmentAllocationRules) { + + {{ 'labels.inputs.Future Installment Allocation Rule' | translate }} + + @for ( + futureInstallmentAllocationRule of advancedPaymentAllocation.futureInstallmentAllocationRules; + track futureInstallmentAllocationRule + ) { + + {{ futureInstallmentAllocationRule.value | translateKey: 'catalogs' }} + + } + + + }
    diff --git a/src/app/products/loan-products/loan-product-stepper/loan-product-payment-strategy-step/advance-payment-allocation-tab/advance-payment-allocation-tab.component.ts b/src/app/products/loan-products/loan-product-stepper/loan-product-payment-strategy-step/advance-payment-allocation-tab/advance-payment-allocation-tab.component.ts index ec44dc020..b309db3fd 100644 --- a/src/app/products/loan-products/loan-product-stepper/loan-product-payment-strategy-step/advance-payment-allocation-tab/advance-payment-allocation-tab.component.ts +++ b/src/app/products/loan-products/loan-product-stepper/loan-product-payment-strategy-step/advance-payment-allocation-tab/advance-payment-allocation-tab.component.ts @@ -1,5 +1,5 @@ import { CdkDragDrop, moveItemInArray, CdkDropList, CdkDrag } from '@angular/cdk/drag-drop'; -import { Component, EventEmitter, Input, OnInit, Output, ViewChild } from '@angular/core'; +import { Component, EventEmitter, Input, OnInit, Output, ViewChild, inject } from '@angular/core'; import { UntypedFormControl, Validators, ReactiveFormsModule } from '@angular/forms'; import { MatDialog } from '@angular/material/dialog'; import { @@ -50,6 +50,10 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class AdvancePaymentAllocationTabComponent implements OnInit { + private dialog = inject(MatDialog); + private advancedPaymentStrategy = inject(AdvancedPaymentStrategy); + private translateService = inject(TranslateService); + @Input() advancedPaymentAllocation: AdvancedPaymentAllocation; @Input() advancedCreditAllocation: AdvancedCreditAllocation; @@ -70,12 +74,6 @@ export class AdvancePaymentAllocationTabComponent implements OnInit { @ViewChild('table') table: MatTable; - constructor( - private dialog: MatDialog, - private advancedPaymentStrategy: AdvancedPaymentStrategy, - private translateService: TranslateService - ) {} - ngOnInit(): void { if (this.advancedCreditAllocation) { this.creditAllocationsData = this.advancedCreditAllocation?.creditAllocationOrder; diff --git a/src/app/products/loan-products/loan-product-stepper/loan-product-payment-strategy-step/loan-product-payment-strategy-step.component.html b/src/app/products/loan-products/loan-product-stepper/loan-product-payment-strategy-step/loan-product-payment-strategy-step.component.html index 33b89d0a0..df6fe7697 100644 --- a/src/app/products/loan-products/loan-product-stepper/loan-product-payment-strategy-step/loan-product-payment-strategy-step.component.html +++ b/src/app/products/loan-products/loan-product-stepper/loan-product-payment-strategy-step/loan-product-payment-strategy-step.component.html @@ -1,27 +1,31 @@ - - - {{ advancedPaymentAllocation.transaction.value | translateKey: 'catalogs' }} - - - - + @for (advancedPaymentAllocation of advancedPaymentAllocations; track advancedPaymentAllocation) { + + + {{ advancedPaymentAllocation.transaction.value | translateKey: 'catalogs' }} + + + + + } - - - {{ advancedCreditAllocation.transaction.value | translateKey: 'catalogs' }} - - - - + @for (advancedCreditAllocation of advancedCreditAllocations; track advancedCreditAllocation) { + + + {{ advancedCreditAllocation.transaction.value | translateKey: 'catalogs' }} + + + + + } diff --git a/src/app/products/loan-products/loan-product-stepper/loan-product-payment-strategy-step/loan-product-payment-strategy-step.component.ts b/src/app/products/loan-products/loan-product-stepper/loan-product-payment-strategy-step/loan-product-payment-strategy-step.component.ts index e335ed5ff..2ce492b8c 100644 --- a/src/app/products/loan-products/loan-product-stepper/loan-product-payment-strategy-step/loan-product-payment-strategy-step.component.ts +++ b/src/app/products/loan-products/loan-product-stepper/loan-product-payment-strategy-step/loan-product-payment-strategy-step.component.ts @@ -1,4 +1,4 @@ -import { Component, EventEmitter, Input, OnInit, Output, ViewChild } from '@angular/core'; +import { Component, EventEmitter, Input, OnInit, Output, ViewChild, inject } from '@angular/core'; import { AdvancedCreditAllocation, AdvancedPaymentAllocation, @@ -38,6 +38,10 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class LoanProductPaymentStrategyStepComponent implements OnInit { + private dialog = inject(MatDialog); + private advancedPaymentStrategy = inject(AdvancedPaymentStrategy); + private translateService = inject(TranslateService); + @Input() advancedPaymentAllocations: AdvancedPaymentAllocation[] = []; @Input() advancedCreditAllocations: AdvancedCreditAllocation[] = []; @Input() advancedPaymentAllocationTransactionTypes: PaymentAllocationTransactionType[] = []; @@ -51,12 +55,6 @@ export class LoanProductPaymentStrategyStepComponent implements OnInit { @ViewChild(MatTabGroup) tabGroup: MatTabGroup; - constructor( - private dialog: MatDialog, - private advancedPaymentStrategy: AdvancedPaymentStrategy, - private translateService: TranslateService - ) {} - ngOnInit(): void { this.sendAllocations(); } @@ -105,7 +103,6 @@ export class LoanProductPaymentStrategyStepComponent implements OnInit { options: { label: 'value', value: 'code', data: transactionTypesOptions }, order: 1 }) - ]; const data = { title: this.translateService.instant('labels.inputs.Advanced Payment Allocation Transaction Type'), diff --git a/src/app/products/loan-products/loan-product-stepper/loan-product-settings-step/loan-product-settings-step.component.html b/src/app/products/loan-products/loan-product-stepper/loan-product-settings-step/loan-product-settings-step.component.html index 995bd0f35..a4a8ee1c0 100644 --- a/src/app/products/loan-products/loan-product-stepper/loan-product-settings-step/loan-product-settings-step.component.html +++ b/src/app/products/loan-products/loan-product-stepper/loan-product-settings-step/loan-product-settings-step.component.html @@ -7,9 +7,11 @@ matTooltip="{{ 'tooltips.The Amortization value' | translate }}" required > - - {{ 'labels.inputs.products.loan.amortizationType.' + amortizationType.value | translate }} - + @for (amortizationType of amortizationTypeData; track amortizationType) { + + {{ 'labels.inputs.products.loan.amortizationType.' + amortizationType.value | translate }} + + } {{ 'labels.inputs.products.loan.Amortization' | translate }} {{ 'labels.commons.is' | translate }} @@ -24,9 +26,11 @@ matTooltip="{{ 'tooltips.The Interest method value' | translate }}" required > - - {{ interestType.value | translateKey: 'catalogs' }} - + @for (interestType of interestTypeData; track interestType) { + + {{ interestType.value | translateKey: 'catalogs' }} + + } {{ 'labels.inputs.Interest Method' | translate }} {{ 'labels.commons.is' | translate }} @@ -41,12 +45,11 @@ matTooltip="{{ 'tooltips.Daily - Will Calculate the interest' | translate }}" required > - - {{ interestCalculationPeriodType.value | translateKey: 'catalogs' }} - + @for (interestCalculationPeriodType of interestCalculationPeriodTypeData; track interestCalculationPeriodType) { + + {{ interestCalculationPeriodType.value | translateKey: 'catalogs' }} + + } {{ 'labels.inputs.Interest calculation period' | translate }} {{ 'labels.commons.is' | translate }} @@ -58,15 +61,16 @@ {{ 'labels.inputs.products.loan.Is Equal Amortization?' | translate }} - - {{ 'labels.inputs.Calculate interest for exact days in partial period' | translate }} - + @if (loanProductSettingsForm.value.interestCalculationPeriodType === 1) { + + {{ 'labels.inputs.Calculate interest for exact days in partial period' | translate }} + + } @@ -75,9 +79,11 @@ {{ 'labels.inputs.Loan Schedule Type' | translate }} - - {{ loanScheduleType.value | translateKey: 'catalogs' }} - + @for (loanScheduleType of loanScheduleTypeData; track loanScheduleType) { + + {{ loanScheduleType.value | translateKey: 'catalogs' }} + + } @@ -89,12 +95,11 @@ required [disabled]="advancedTransactionProcessingStrategyDisabled" > - - {{ transactionProcessingStrategy.name | translateKey: 'catalogs' }} - + @for (transactionProcessingStrategy of transactionProcessingStrategyData; track transactionProcessingStrategy) { + + {{ transactionProcessingStrategy.name | translateKey: 'catalogs' }} + + } {{ 'labels.inputs.Repayment strategy' | translate }} {{ 'labels.commons.is' | translate }} @@ -102,17 +107,18 @@ - - {{ 'labels.inputs.Loan Schedule Processing Type' | translate }} - - - {{ loanScheduleProcessingType.value | translateKey: 'catalogs' }} - - - + @if (isAdvancedTransactionProcessingStrategy) { + + {{ 'labels.inputs.Loan Schedule Processing Type' | translate }} + + @for (loanScheduleProcessingType of loanScheduleProcessingTypeData; track loanScheduleProcessingType) { + + {{ loanScheduleProcessingType.value | translateKey: 'catalogs' }} + + } + + + }

    {{ 'labels.inputs.Loan Tranche Details' | translate }}

    @@ -125,49 +131,48 @@ {{ 'labels.inputs.Enable Multiple Disbursals' | translate }} -
    - - {{ 'labels.inputs.Maximum Tranche count' | translate }} - - - {{ 'labels.inputs.Maximum Tranche count' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - - - {{ 'labels.inputs.Maximum allowed outstanding balance' | translate }} - - - - - {{ 'labels.inputs.Disallow Expected Disbursements' | translate }} - - - - {{ 'labels.inputs.Allow full term for each tranche' | translate }} - -
    + @if (loanProductSettingsForm.value.multiDisburseLoan) { +
    + + {{ 'labels.inputs.Maximum Tranche count' | translate }} + + @if (loanProductSettingsForm.controls.maxTrancheCount.hasError('required')) { + + {{ 'labels.inputs.Maximum Tranche count' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + + {{ 'labels.inputs.Maximum allowed outstanding balance' | translate }} + + + + {{ 'labels.inputs.Disallow Expected Disbursements' | translate }} + + @if (loanProductSettingsForm.value.loanScheduleType === 'PROGRESSIVE') { + + {{ 'labels.inputs.Allow full term for each tranche' | translate }} + + } +
    + }

    {{ 'labels.heading.Down Payment' | translate }}

    @@ -180,61 +185,64 @@ {{ 'labels.inputs.Enable Down Payment' | translate }} -
    - - {{ 'labels.inputs.Disbursed Amount Percentage Down Payment' | translate }} (%) - - + + {{ 'labels.inputs.Disbursed Amount Percentage Down Payment' | translate }} (%) + + @if (loanProductSettingsForm.controls.disbursedAmountPercentageForDownPayment.hasError('required')) { + + {{ 'labels.inputs.Disbursed Amount Percentage Down Payment' | translate }} + {{ 'labels.commons.is' | translate }} {{ 'labels.commons.required' | translate }} + + } + @if (loanProductSettingsForm.controls.disbursedAmountPercentageForDownPayment.errors?.range) { + + {{ 'labels.inputs.Disbursed Amount Percentage Down Payment' | translate }} + {{ 'labels.commons.is' | translate }} {{ 'labels.text.out' | translate }} + {{ 'labels.text.percentage range' | translate }} + + } + + - {{ 'labels.inputs.Disbursed Amount Percentage Down Payment' | translate }} - {{ 'labels.commons.is' | translate }} {{ 'labels.commons.required' | translate }} - - - {{ 'labels.inputs.Disbursed Amount Percentage Down Payment' | translate }} - {{ 'labels.commons.is' | translate }} {{ 'labels.text.out' | translate }} - {{ 'labels.text.percentage range' | translate }} - - - - - {{ 'labels.inputs.Enable Auto Repayment for Down Payment' | translate }} - -
    + {{ 'labels.inputs.Enable Auto Repayment for Down Payment' | translate }} + +
    + }
    -
    -

    {{ 'labels.inputs.Loan Charge-off behaviour' | translate }}

    - - - {{ 'labels.inputs.Loan Charge-off behaviour' | translate }} - - - {{ chargeOffBehaviour.value | translateKey: 'catalogs' }} - - - -
    + @if (isAdvancedTransactionProcessingStrategy) { +
    +

    {{ 'labels.inputs.Loan Charge-off behaviour' | translate }}

    + + {{ 'labels.inputs.Loan Charge-off behaviour' | translate }} + + @for (chargeOffBehaviour of chargeOffBehaviourData; track chargeOffBehaviour) { + + {{ chargeOffBehaviour.value | translateKey: 'catalogs' }} + + } + + +
    + }

    @@ -257,29 +265,24 @@ {{ 'labels.inputs.Delinquency Bucket' | translate }} - - {{ delinquencyBucket.name }} - + @for (delinquencyBucket of delinquencyBucketData; track delinquencyBucket) { + + {{ delinquencyBucket.name }} + + } - + @if (loanProductSettingsForm.controls.delinquencyBucketId) { + + } - - {{ 'labels.inputs.Enable installment level Delinquency' | translate }} - + @if (loanProductSettingsForm.value.delinquencyBucketId) { + + {{ 'labels.inputs.Enable installment level Delinquency' | translate }} + + } @@ -310,9 +313,11 @@ formControlName="daysInYearType" required > - - {{ daysInYearType.value | translateKey: 'catalogs' }} - + @for (daysInYearType of daysInYearTypeData; track daysInYearType) { + + {{ daysInYearType.value | translateKey: 'catalogs' }} + + } {{ 'labels.inputs.Days in year' | translate }} {{ 'labels.commons.is' | translate }} @@ -320,20 +325,21 @@ - - {{ 'labels.inputs.Days in year custom strategy' | translate }} - - + {{ 'labels.inputs.Days in year custom strategy' | translate }} + - {{ daysInYearCustomStrategy.value | translateKey: 'catalogs' }} - - - + @for (daysInYearCustomStrategy of daysInYearCustomStrategyOptions; track daysInYearCustomStrategy) { + + {{ daysInYearCustomStrategy.value | translateKey: 'catalogs' }} + + } + + + } {{ 'labels.inputs.Days in month' | translate }} @@ -342,9 +348,11 @@ formControlName="daysInMonthType" required > - - {{ daysInMonthType.value | translateKey: 'catalogs' }} - + @for (daysInMonthType of daysInMonthTypeData; track daysInMonthType) { + + {{ daysInMonthType.value | translateKey: 'catalogs' }} + + } {{ 'labels.inputs.Days in month' | translate }} {{ 'labels.commons.is' | translate }} @@ -407,30 +415,27 @@ {{ 'labels.inputs.Are Variable Installments allowed?' | translate }} -
    -

    {{ 'labels.inputs.Variable Installments' | translate }}

    - - - {{ 'labels.inputs.Minimum gap between Installments' | translate }} - - - {{ 'labels.inputs.Minimum gap between Installments' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - - - {{ 'labels.inputs.Maximum gap between Installments' | translate }} - - - {{ 'labels.inputs.Maximum gap between Installments' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - -
    + @if (loanProductSettingsForm.value.allowVariableInstallments) { +
    +

    {{ 'labels.inputs.Variable Installments' | translate }}

    + + {{ 'labels.inputs.Minimum gap between Installments' | translate }} + + + {{ 'labels.inputs.Minimum gap between Installments' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + + + {{ 'labels.inputs.Maximum gap between Installments' | translate }} + + + {{ 'labels.inputs.Maximum gap between Installments' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + +
    + } -
    - - {{ 'labels.inputs.Pre-closure interest calculation rule' | translate }} - - - {{ preClosureInterestCalculationStrategy.value | translateKey: 'catalogs' }} - - - - {{ 'labels.inputs.Pre-closure interest calculation rule' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - - - {{ 'labels.inputs.Advance payments adjustment type' | translate }} - - - {{ rescheduleStrategyType.value | translateKey: 'catalogs' }} - - - - {{ 'labels.inputs.Advance payments adjustment type' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - - - {{ 'labels.inputs.Interest recalculation compounding on' | translate }} - - - {{ interestRecalculationCompoundingType.value | translateKey: 'catalogs' }} - - - - {{ 'labels.inputs.Interest recalculation compounding on' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - - - -
    - - {{ 'labels.inputs.Frequency Interval for compounding' | translate }} - + @if (loanProductSettingsForm.value.isInterestRecalculationEnabled) { +
    + + {{ 'labels.inputs.Pre-closure interest calculation rule' | translate }} + + @for ( + preClosureInterestCalculationStrategy of preClosureInterestCalculationStrategyData; + track preClosureInterestCalculationStrategy + ) { + + {{ preClosureInterestCalculationStrategy.value | translateKey: 'catalogs' }} + + } + - {{ 'labels.inputs.Frequency Interval for compounding' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.inputs.Pre-closure interest calculation rule' | translate }} + {{ 'labels.commons.is' | translate }} {{ 'labels.commons.required' | translate }} - - - {{ 'labels.inputs.Frequency Interval for recalculation' | translate }} - + + {{ 'labels.inputs.Advance payments adjustment type' | translate }} + + @for (rescheduleStrategyType of rescheduleStrategyTypeData; track rescheduleStrategyType) { + + {{ rescheduleStrategyType.value | translateKey: 'catalogs' }} + + } + - {{ 'labels.inputs.Frequency Interval for recalculation' | translate }} + {{ 'labels.inputs.Advance payments adjustment type' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + + + {{ 'labels.inputs.Interest recalculation compounding on' | translate }} + + @for ( + interestRecalculationCompoundingType of interestRecalculationCompoundingTypeData; + track interestRecalculationCompoundingType + ) { + + {{ interestRecalculationCompoundingType.value | translateKey: 'catalogs' }} + + } + + + {{ 'labels.inputs.Interest recalculation compounding on' | translate }} + {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + + +
    + @if ( + loanProductSettingsForm.value.interestRecalculationCompoundingMethod !== 0 && + loanProductSettingsForm.value.recalculationCompoundingFrequencyType !== 1 + ) { + + {{ 'labels.inputs.Frequency Interval for compounding' | translate }} + + + {{ 'labels.inputs.Frequency Interval for compounding' | translate }} + {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + + } + @if (loanProductSettingsForm.value.recalculationRestFrequencyType !== 1) { + + {{ 'labels.inputs.Frequency Interval for recalculation' | translate }} + + + {{ 'labels.inputs.Frequency Interval for recalculation' | translate }} + {{ 'labels.commons.is' | translate }} {{ 'labels.commons.required' | translate }} + + + } +
    + @if (loanProductSettingsForm.value.interestRecalculationCompoundingMethod !== 0) { +
    + + {{ 'labels.inputs.Frequency for compounding' | translate }} + + @for ( + interestRecalculationFrequencyType of interestRecalculationFrequencyTypeData; + track interestRecalculationFrequencyType + ) { + + {{ interestRecalculationFrequencyType.value }} + + } + + + @if (loanProductSettingsForm.value.recalculationCompoundingFrequencyType === 4) { +
    + + + @for ( + interestRecalculationNthDayType of interestRecalculationNthDayTypeData; + track interestRecalculationNthDayType + ) { + + {{ interestRecalculationNthDayType.value | translateKey: 'catalogs' }} + + } + + +
    + } + @if ( + (loanProductSettingsForm.value.recalculationCompoundingFrequencyType === 4 && + loanProductSettingsForm.value.recalculationCompoundingFrequencyNthDayType !== -2) || + loanProductSettingsForm.value.recalculationCompoundingFrequencyType === 3 + ) { +
    + + + @for ( + interestRecalculationDayOfWeekType of interestRecalculationDayOfWeekTypeData; + track interestRecalculationDayOfWeekType + ) { + + {{ interestRecalculationDayOfWeekType.value | translateKey: 'catalogs' }} + + } + + +
    + } + @if ( + loanProductSettingsForm.value.recalculationCompoundingFrequencyType === 4 && + loanProductSettingsForm.value.recalculationCompoundingFrequencyNthDayType === -2 + ) { +
    + + + @for ( + interestRecalculationOnDayType of interestRecalculationOnDayTypeData; + track interestRecalculationOnDayType + ) { + + {{ interestRecalculationOnDayType }} + + } + + +
    + } +
    + } + + {{ 'labels.inputs.Frequency for recalculate Outstanding Principal' | translate }} + + @for ( + interestRecalculationFrequencyType of interestRecalculationFrequencyTypeData; + track interestRecalculationFrequencyType + ) { + + {{ interestRecalculationFrequencyType.value | translateKey: 'catalogs' }} + + } + + + {{ 'labels.inputs.Frequency for recalculate Outstanding Principal' | translate }} {{ 'labels.commons.is' | translate }} {{ 'labels.commons.required' | translate }} -
    - -
    - - {{ 'labels.inputs.Frequency for compounding' | translate }} - - - {{ interestRecalculationFrequencyType.value }} - - - - -
    - - - - {{ interestRecalculationNthDayType.value | translateKey: 'catalogs' }} - - - -
    - -
    - - - - {{ interestRecalculationDayOfWeekType.value | translateKey: 'catalogs' }} - - - -
    - -
    - - - - {{ interestRecalculationOnDayType }} - - - -
    -
    - - - {{ 'labels.inputs.Frequency for recalculate Outstanding Principal' | translate }} - - - {{ interestRecalculationFrequencyType.value | translateKey: 'catalogs' }} - - - - {{ 'labels.inputs.Frequency for recalculate Outstanding Principal' | translate }} - {{ 'labels.commons.is' | translate }} {{ 'labels.commons.required' | translate }} - - - -
    - - - - {{ interestRecalculationNthDayType.value | translateKey: 'catalogs' }} - - - -
    - -
    + + + @for ( + interestRecalculationNthDayType of interestRecalculationNthDayTypeData; + track interestRecalculationNthDayType + ) { + + {{ interestRecalculationNthDayType.value | translateKey: 'catalogs' }} + + } + + +
    + } + @if ( (loanProductSettingsForm.value.recalculationRestFrequencyType === 4 && loanProductSettingsForm.value.recalculationRestFrequencyNthDayType !== -2) || loanProductSettingsForm.value.recalculationRestFrequencyType === 3 - " - class="flex-31 layout-row layout-lt-md-column" - > - - - - {{ interestRecalculationDayOfWeekType.value | translateKey: 'catalogs' }} - - - -
    - -
    + + + @for ( + interestRecalculationDayOfWeekType of interestRecalculationDayOfWeekTypeData; + track interestRecalculationDayOfWeekType + ) { + + {{ interestRecalculationDayOfWeekType.value | translateKey: 'catalogs' }} + + } + + +
    + } + @if ( loanProductSettingsForm.value.recalculationRestFrequencyType === 4 && loanProductSettingsForm.value.recalculationRestFrequencyNthDayType === -2 - " - class="flex-31 layout-row layout-lt-md-column" - > - - - - {{ interestRecalculationOnDayType }} - - - + ) { +
    + + + @for ( + interestRecalculationOnDayType of interestRecalculationOnDayTypeData; + track interestRecalculationOnDayType + ) { + + {{ interestRecalculationOnDayType }} + + } + + +
    + } + + {{ 'labels.inputs.Is Arrears recognization based on original schedule' | translate }}? + + @if (loanProductSettingsForm.value.loanScheduleType === 'PROGRESSIVE') { + + {{ 'labels.inputs.Do not calculate interest on past due principal balances' | translate }} + + }
    - - - {{ 'labels.inputs.Is Arrears recognization based on original schedule' | translate }}? - - - - {{ 'labels.inputs.Do not calculate interest on past due principal balances' | translate }} - -

    + } @@ -694,29 +704,26 @@ {{ 'labels.inputs.Place Guarantee Funds On-Hold' | translate }} -
    - - {{ 'labels.inputs.Mandatory Guarantee(%)' | translate }} - - - {{ 'labels.inputs.Mandatory Guarantee' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - - - {{ 'labels.inputs.Minimum Guarantee from Own Funds(%)' | translate }} - - - - - {{ 'labels.inputs.Minimum Guarantee from Guarantor Funds(%)' | translate }} - - -
    + @if (loanProductSettingsForm.value.holdGuaranteeFunds) { +
    + + {{ 'labels.inputs.Mandatory Guarantee(%)' | translate }} + + + {{ 'labels.inputs.Mandatory Guarantee' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + + + {{ 'labels.inputs.Minimum Guarantee from Own Funds(%)' | translate }} + + + + {{ 'labels.inputs.Minimum Guarantee from Guarantor Funds(%)' | translate }} + + +
    + } @@ -737,30 +744,28 @@ {{ 'labels.inputs.Use the Global Configurations values to the Repayment Event (notifications)' | translate }} -
    - - {{ 'labels.inputs.Due days for repayment event' | translate }} - - - - - {{ 'labels.inputs.OverDue days for repayment event' | translate }} - - -
    + @if (!loanProductSettingsForm.value.useDueForRepaymentsConfigurations) { +
    + + {{ 'labels.inputs.Due days for repayment event' | translate }} + + + + {{ 'labels.inputs.OverDue days for repayment event' | translate }} + + +
    + } @@ -770,47 +775,42 @@ {{ 'labels.inputs.Allow overriding select terms and settings in loan accounts' | translate }} -
    - - {{ 'labels.inputs.Amortization' | translate }} - - - - {{ 'labels.inputs.Interest method' | translate }} - - - - {{ 'labels.inputs.Repayment strategy' | translate }} - - - - {{ 'labels.inputs.Interest calculation period' | translate }} - - - - {{ 'labels.inputs.Arrears tolerance' | translate }} - - - - {{ 'labels.inputs.Repaid every' | translate }} - - - - {{ 'labels.inputs.Moratorium' | translate }} - - - - {{ 'labels.inputs.Number of days a loan may be overdue before moving into arrears' | translate }} - -
    + @if (loanProductSettingsForm.value.allowAttributeConfiguration) { +
    + + {{ 'labels.inputs.Amortization' | translate }} + + + {{ 'labels.inputs.Interest method' | translate }} + + + {{ 'labels.inputs.Repayment strategy' | translate }} + + + {{ 'labels.inputs.Interest calculation period' | translate }} + + + {{ 'labels.inputs.Arrears tolerance' | translate }} + + + {{ 'labels.inputs.Repaid every' | translate }} + + + {{ 'labels.inputs.Moratorium' | translate }} + + + {{ 'labels.inputs.Number of days a loan may be overdue before moving into arrears' | translate }} + +
    + }
    diff --git a/src/app/products/loan-products/loan-product-stepper/loan-product-settings-step/loan-product-settings-step.component.ts b/src/app/products/loan-products/loan-product-stepper/loan-product-settings-step/loan-product-settings-step.component.ts index eee52c613..c52374d9d 100644 --- a/src/app/products/loan-products/loan-product-stepper/loan-product-settings-step/loan-product-settings-step.component.ts +++ b/src/app/products/loan-products/loan-product-stepper/loan-product-settings-step/loan-product-settings-step.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core'; +import { Component, OnInit, Input, Output, EventEmitter, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, @@ -35,6 +35,9 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class LoanProductSettingsStepComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private processingStrategyService = inject(ProcessingStrategyService); + DAYS_BEFORE_REPAYMENT_IS_DUE = LoanProducts.DAYS_BEFORE_REPAYMENT_IS_DUE; DAYS_AFTER_REPAYMENT_IS_OVERDUE = LoanProducts.DAYS_AFTER_REPAYMENT_IS_OVERDUE; @@ -74,10 +77,7 @@ export class LoanProductSettingsStepComponent implements OnInit { /** Values to Days for Repayments */ defaultConfigValues: GlobalConfiguration[] = []; - constructor( - private formBuilder: UntypedFormBuilder, - private processingStrategyService: ProcessingStrategyService - ) { + constructor() { this.createLoanProductSettingsForm(); this.setConditionalControls(); } @@ -568,7 +568,8 @@ export class LoanProductSettingsStepComponent implements OnInit { 'disbursedAmountPercentageForDownPayment', new UntypedFormControl(0, [ Validators.required, - rangeValidator(0, 100)]) + rangeValidator(0, 100) + ]) ); this.loanProductSettingsForm.addControl('enableAutoRepaymentForDownPayment', new UntypedFormControl(false, [])); } else { diff --git a/src/app/products/loan-products/loan-product-stepper/loan-product-terms-step/loan-product-terms-step.component.html b/src/app/products/loan-products/loan-product-stepper/loan-product-terms-step/loan-product-terms-step.component.html index d622f4f30..d51c7314d 100644 --- a/src/app/products/loan-products/loan-product-stepper/loan-product-terms-step/loan-product-terms-step.component.html +++ b/src/app/products/loan-products/loan-product-stepper/loan-product-terms-step/loan-product-terms-step.component.html @@ -43,28 +43,25 @@
    - - {{ 'labels.inputs.Over Amount Calculation Type' | translate }} - - - {{ overAppliedCalculationType.value | translateKey: 'catalogs' }} - - - + @if (loanProductTermsForm.value.allowApprovedDisbursedAmountsOverApplied) { + + {{ 'labels.inputs.Over Amount Calculation Type' | translate }} + + @for (overAppliedCalculationType of overAppliedCalculationTypeData; track overAppliedCalculationType) { + + {{ overAppliedCalculationType.value | translateKey: 'catalogs' }} + + } + + + } - - {{ 'labels.inputs.Over Amount' | translate }} - - + @if (loanProductTermsForm.value.allowApprovedDisbursedAmountsOverApplied) { + + {{ 'labels.inputs.Over Amount' | translate }} + + + }
    @@ -76,12 +73,11 @@ > - - {{ repaymentStartDateType.value | translateKey: 'catalogs' }} - + @for (repaymentStartDateType of repaymentStartDateTypeOptions; track repaymentStartDateType) { + + {{ repaymentStartDateType.value | translateKey: 'catalogs' }} + + } @@ -133,171 +129,154 @@

    {{ 'labels.inputs.Interest Rates' | translate }}

    - - {{ 'labels.inputs.Is Zero Interest Rate?' | translate }} - - - - {{ 'labels.inputs.Is Linked to floating interest rates?' | translate }} - - -
    -

    - {{ 'labels.inputs.Nominal interest rate' | translate }} - -

    - - - {{ 'labels.inputs.Minimum' | translate }} - - - {{ 'labels.commons.Minimum Value must be' | translate }} - {{ 'labels.commons.greater equal to than 0' | translate }} - - - - - {{ 'labels.inputs.Default' | translate }} - - - {{ 'labels.catalogs.Default' | translate }} {{ 'labels.inputs.Nominal interest rate' | translate }} - {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - - - {{ 'labels.inputs.Maximum' | translate }} - - - {{ 'labels.commons.Maximum Value must be' | translate }} - {{ 'labels.commons.greater equal to than 0' | translate }} - {{ 'labels.commons.and must be greater than' | translate }} - {{ 'labels.commons.Minimum Principal' | translate }} - - - - - {{ 'labels.inputs.Frequency' | translate }} - - - {{ interestRateFrequencyType.value | translateKey: 'catalogs' }} - - - - {{ 'labels.inputs.Nominal interest rate frequency' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - -
    - -
    -

    - {{ 'labels.inputs.Floating Interest Rate' | translate }} - -

    - - - {{ 'labels.inputs.Floating Rate' | translate }} - - - {{ floatingRate.name }} - - - - {{ 'labels.inputs.Floating rate' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - - - {{ 'labels.inputs.Differential Rate' | translate }} - - - {{ 'labels.inputs.Differential rate' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - - - {{ 'labels.inputs.Is Floating calculation allowed?' | translate }} + @if (!loanProductTermsForm.value.isLinkedToFloatingInterestRates) { + + {{ 'labels.inputs.Is Zero Interest Rate?' | translate }} + } - - {{ 'labels.inputs.Minimum' | translate }} - - - {{ 'labels.inputs.Minimum interest rate' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - + @if (!isZeroInterest()) { + + {{ 'labels.inputs.Is Linked to floating interest rates?' | translate }} + + } - - {{ 'labels.inputs.Default' | translate }} - - - {{ 'labels.catalogs.Default' | translate }} {{ 'labels.inputs.Interest rate' | translate }} - {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - + @if (!loanProductTermsForm.value.isLinkedToFloatingInterestRates) { +
    +

    + {{ 'labels.inputs.Nominal interest rate' | translate }} + +

    + + {{ 'labels.inputs.Minimum' | translate }} + + + {{ 'labels.commons.Minimum Value must be' | translate }} + {{ 'labels.commons.greater equal to than 0' | translate }} + + + + {{ 'labels.inputs.Default' | translate }} + + + {{ 'labels.catalogs.Default' | translate }} {{ 'labels.inputs.Nominal interest rate' | translate }} + {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + + + {{ 'labels.inputs.Maximum' | translate }} + + + {{ 'labels.commons.Maximum Value must be' | translate }} + {{ 'labels.commons.greater equal to than 0' | translate }} + {{ 'labels.commons.and must be greater than' | translate }} + {{ 'labels.commons.Minimum Principal' | translate }} + + + + {{ 'labels.inputs.Frequency' | translate }} + + @for (interestRateFrequencyType of interestRateFrequencyTypeData; track interestRateFrequencyType) { + + {{ interestRateFrequencyType.value | translateKey: 'catalogs' }} + + } + + + {{ 'labels.inputs.Nominal interest rate frequency' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + +
    + } - - {{ 'labels.inputs.Maximum' | translate }} - - - {{ 'labels.inputs.Maximum interest rate' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - -
    + @if (loanProductTermsForm.value.isLinkedToFloatingInterestRates && !isZeroInterest()) { +
    +

    + {{ 'labels.inputs.Floating Interest Rate' | translate }} + +

    + + {{ 'labels.inputs.Floating Rate' | translate }} + + @for (floatingRate of floatingRateData; track floatingRate) { + + {{ floatingRate.name }} + + } + + + {{ 'labels.inputs.Floating rate' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + + + {{ 'labels.inputs.Differential Rate' | translate }} + + + {{ 'labels.inputs.Differential rate' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + + + {{ 'labels.inputs.Is Floating calculation allowed?' | translate }} + + + {{ 'labels.inputs.Minimum' | translate }} + + + {{ 'labels.inputs.Minimum interest rate' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + + + {{ 'labels.inputs.Default' | translate }} + + + {{ 'labels.catalogs.Default' | translate }} {{ 'labels.inputs.Interest rate' | translate }} + {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + + + {{ 'labels.inputs.Maximum' | translate }} + + + {{ 'labels.inputs.Maximum interest rate' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + +
    + } @@ -307,249 +286,219 @@ {{ 'labels.inputs.Terms vary based on loan cycle' | translate }} -
    -

    {{ 'labels.inputs.Principal by loan cycle' | translate }}

    - -
    - + @if (loanProductTermsForm.value.useBorrowerCycle) { +
    +

    {{ 'labels.inputs.Principal by loan cycle' | translate }}

    +
    + +
    + @if (principalVariationsForBorrowerCycle.value.length) { + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {{ 'labels.inputs.Condition' | translate }} + {{ variation.valueConditionType | find: valueConditionTypeData : 'id' : 'value' }} + {{ 'labels.inputs.Loan Cycle' | translate }} + {{ variation.borrowerCycleNumber }} + {{ 'labels.inputs.Minimum' | translate }} + {{ variation.minValue }} + {{ 'labels.inputs.Default' | translate }} + {{ variation.defaultValue }} + {{ 'labels.inputs.Maximum' | translate }} + {{ variation.maxValue }} + {{ 'labels.inputs.Actions' | translate }} + + +
    + } +

    {{ 'labels.inputs.Number of repayments by loan cycle' | translate }}

    +
    + +
    + @if (numberOfRepaymentVariationsForBorrowerCycle.value.length) { + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {{ 'labels.inputs.Condition' | translate }} + {{ variation.valueConditionType | find: valueConditionTypeData : 'id' : 'value' }} + {{ 'labels.inputs.Loan Cycle' | translate }} + {{ variation.borrowerCycleNumber }} + {{ 'labels.inputs.Minimum' | translate }} + {{ variation.minValue }} + {{ 'labels.inputs.Default' | translate }} + {{ variation.defaultValue }} + {{ 'labels.inputs.Maximum' | translate }} + {{ variation.maxValue }} + {{ 'labels.inputs.Actions' | translate }} + + +
    + } +

    {{ 'labels.inputs.Nominal interest rate by loan cycle' | translate }}

    +
    + +
    + @if (interestRateVariationsForBorrowerCycle.value.length) { + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {{ 'labels.inputs.Condition' | translate }} + {{ variation.valueConditionType | find: valueConditionTypeData : 'id' : 'value' }} + {{ 'labels.inputs.Loan Cycle' | translate }} + {{ variation.borrowerCycleNumber }} + {{ 'labels.inputs.Minimum' | translate }} + {{ variation.minValue }} + {{ 'labels.inputs.Default' | translate }} + {{ variation.defaultValue }} + {{ 'labels.inputs.Maximum' | translate }} + {{ variation.maxValue }} + {{ 'labels.inputs.Actions' | translate }} + + +
    + }
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    {{ 'labels.inputs.Condition' | translate }} - {{ variation.valueConditionType | find: valueConditionTypeData : 'id' : 'value' }} - {{ 'labels.inputs.Loan Cycle' | translate }} - {{ variation.borrowerCycleNumber }} - {{ 'labels.inputs.Minimum' | translate }} - {{ variation.minValue }} - {{ 'labels.inputs.Default' | translate }} - {{ variation.defaultValue }} - {{ 'labels.inputs.Maximum' | translate }} - {{ variation.maxValue }} - {{ 'labels.inputs.Actions' | translate }} - - -
    - -

    {{ 'labels.inputs.Number of repayments by loan cycle' | translate }}

    - -
    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    {{ 'labels.inputs.Condition' | translate }} - {{ variation.valueConditionType | find: valueConditionTypeData : 'id' : 'value' }} - {{ 'labels.inputs.Loan Cycle' | translate }} - {{ variation.borrowerCycleNumber }} - {{ 'labels.inputs.Minimum' | translate }} - {{ variation.minValue }} - {{ 'labels.inputs.Default' | translate }} - {{ variation.defaultValue }} - {{ 'labels.inputs.Maximum' | translate }} - {{ variation.maxValue }} - {{ 'labels.inputs.Actions' | translate }} - - -
    - -

    {{ 'labels.inputs.Nominal interest rate by loan cycle' | translate }}

    - -
    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    {{ 'labels.inputs.Condition' | translate }} - {{ variation.valueConditionType | find: valueConditionTypeData : 'id' : 'value' }} - {{ 'labels.inputs.Loan Cycle' | translate }} - {{ variation.borrowerCycleNumber }} - {{ 'labels.inputs.Minimum' | translate }} - {{ variation.minValue }} - {{ 'labels.inputs.Default' | translate }} - {{ variation.defaultValue }} - {{ 'labels.inputs.Maximum' | translate }} - {{ variation.maxValue }} - {{ 'labels.inputs.Actions' | translate }} - - -
    -
    + } @@ -574,12 +523,11 @@ {{ 'labels.inputs.Frequency Type' | translate }} - - {{ repaymentFrequencyType.value | translateKey: 'catalogs' }} - + @for (repaymentFrequencyType of repaymentFrequencyTypeData; track repaymentFrequencyType) { + + {{ repaymentFrequencyType.value | translateKey: 'catalogs' }} + + } {{ 'labels.inputs.Repaid every type' | translate }} {{ 'labels.commons.is' | translate }} @@ -587,23 +535,29 @@ -

    - {{ 'labels.inputs.Fixed Length' | translate }} - -

    + @if (allowFixedLength()) { +

    + {{ 'labels.inputs.Fixed Length' | translate }} + +

    + } - - {{ 'labels.inputs.Fixed Length' | translate }} - - - {{ - loanProductTermsForm.value.repaymentFrequencyType - | find: repaymentFrequencyTypeData : 'id' : 'value' - | translateKey: 'catalogs' - }} + @if (allowFixedLength()) { + + {{ 'labels.inputs.Fixed Length' | translate }} + + + } + @if (allowFixedLength()) { + {{ + loanProductTermsForm.value.repaymentFrequencyType + | find: repaymentFrequencyTypeData : 'id' : 'value' + | translateKey: 'catalogs' + }} + } {{ 'labels.inputs.Minimum days between disbursal and first repayment date' | translate }} diff --git a/src/app/products/loan-products/loan-product-stepper/loan-product-terms-step/loan-product-terms-step.component.ts b/src/app/products/loan-products/loan-product-stepper/loan-product-terms-step/loan-product-terms-step.component.ts index e9192df72..503267279 100644 --- a/src/app/products/loan-products/loan-product-stepper/loan-product-terms-step/loan-product-terms-step.component.ts +++ b/src/app/products/loan-products/loan-product-stepper/loan-product-terms-step/loan-product-terms-step.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit, Input, OnChanges, SimpleChanges } from '@angular/core'; +import { Component, OnInit, Input, OnChanges, SimpleChanges, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, @@ -65,6 +65,11 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class LoanProductTermsStepComponent implements OnInit, OnChanges { + private formBuilder = inject(UntypedFormBuilder); + private processingStrategyService = inject(ProcessingStrategyService); + private dialog = inject(MatDialog); + private translateService = inject(TranslateService); + @Input() loanProductsTemplate: any; loanProductTermsForm: UntypedFormGroup; @@ -89,12 +94,7 @@ export class LoanProductTermsStepComponent implements OnInit, OnChanges { ]; isAdvancedTransactionProcessingStrategy = false; - constructor( - private formBuilder: UntypedFormBuilder, - private processingStrategyService: ProcessingStrategyService, - private dialog: MatDialog, - private translateService: TranslateService - ) { + constructor() { this.createLoanProductTermsForm(); this.setConditionalControls(); } @@ -456,7 +456,6 @@ export class LoanProductTermsStepComponent implements OnInit, OnChanges { type: 'number', order: 5 }) - ]; return formfields; } diff --git a/src/app/products/loan-products/loan-product.resolver.ts b/src/app/products/loan-products/loan-product.resolver.ts index 873ae8a85..dcac717f0 100644 --- a/src/app/products/loan-products/loan-product.resolver.ts +++ b/src/app/products/loan-products/loan-product.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { ProductsService } from '../products.service'; */ @Injectable() export class LoanProductResolver { - /** - * @param {ProductsService} productsService Products service. - */ - constructor(private productsService: ProductsService) {} + private productsService = inject(ProductsService); /** * Returns the loan product data. diff --git a/src/app/products/loan-products/loan-products-template.resolver.ts b/src/app/products/loan-products/loan-products-template.resolver.ts index 60f1e3f68..8c4eecbe3 100644 --- a/src/app/products/loan-products/loan-products-template.resolver.ts +++ b/src/app/products/loan-products/loan-products-template.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; /** rxjs Imports */ import { Observable } from 'rxjs'; @@ -9,7 +9,7 @@ import { ProductsService } from '../products.service'; @Injectable() export class LoanProductsTemplateResolver { - constructor(private productsService: ProductsService) {} + private productsService = inject(ProductsService); /** * Returns the loan products template data. diff --git a/src/app/products/loan-products/loan-products.component.ts b/src/app/products/loan-products/loan-products.component.ts index 007a3ff93..b098cc098 100644 --- a/src/app/products/loan-products/loan-products.component.ts +++ b/src/app/products/loan-products/loan-products.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, TemplateRef, ElementRef, ViewChild, AfterViewInit } from '@angular/core'; +import { Component, OnInit, TemplateRef, ElementRef, ViewChild, AfterViewInit, inject } from '@angular/core'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort, MatSortHeader } from '@angular/material/sort'; import { @@ -52,6 +52,11 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class LoanProductsComponent implements OnInit, AfterViewInit { + private route = inject(ActivatedRoute); + private router = inject(Router); + private configurationWizardService = inject(ConfigurationWizardService); + private popoverService = inject(PopoverService); + loanProductsData: any; displayedColumns: string[] = [ 'name', @@ -79,12 +84,7 @@ export class LoanProductsComponent implements OnInit, AfterViewInit { * @param {ConfigurationWizardService} configurationWizardService ConfigurationWizard Service. * @param {PopoverService} popoverService PopoverService. */ - constructor( - private route: ActivatedRoute, - private router: Router, - private configurationWizardService: ConfigurationWizardService, - private popoverService: PopoverService - ) { + constructor() { this.route.data.subscribe((data: { loanProducts: any }) => { this.loanProductsData = data.loanProducts; }); diff --git a/src/app/products/loan-products/loan-products.resolver.ts b/src/app/products/loan-products/loan-products.resolver.ts index 284f24f33..828d192ac 100644 --- a/src/app/products/loan-products/loan-products.resolver.ts +++ b/src/app/products/loan-products/loan-products.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; /** rxjs Imports */ import { Observable } from 'rxjs'; @@ -12,11 +12,7 @@ import { ProductsService } from '../products.service'; */ @Injectable() export class LoanProductsResolver { - /** - * - * @param {ProductsService} productsService Products service. - */ - constructor(private productsService: ProductsService) {} + private productsService = inject(ProductsService); /** * Returns the loan products data. diff --git a/src/app/products/loan-products/loan-products.ts b/src/app/products/loan-products/loan-products.ts index 557ef16ee..0336db976 100644 --- a/src/app/products/loan-products/loan-products.ts +++ b/src/app/products/loan-products/loan-products.ts @@ -1,4 +1,4 @@ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { SettingsService } from 'app/settings/settings.service'; import { GlobalConfiguration } from 'app/system/configurations/global-configurations-tab/configuration.model'; @@ -6,6 +6,8 @@ import { GlobalConfiguration } from 'app/system/configurations/global-configurat providedIn: 'root' }) export class LoanProducts { + private settingsService = inject(SettingsService); + public static LOAN_SCHEDULE_TYPE_CUMULATIVE = 'CUMULATIVE'; public static LOAN_SCHEDULE_TYPE_PROGRESSIVE = 'PROGRESSIVE'; @@ -30,8 +32,6 @@ export class LoanProducts { return code === this.ADVANCED_PAYMENT_ALLOCATION_STRATEGY; } - constructor(private settingsService: SettingsService) {} - public setItemsByDefault(configurations: any) { const itemsByDefault: GlobalConfiguration[] = []; configurations.globalConfiguration.forEach((config: GlobalConfiguration) => { diff --git a/src/app/products/loan-products/view-loan-product/datatable-tab/datatable-tab.component.ts b/src/app/products/loan-products/view-loan-product/datatable-tab/datatable-tab.component.ts index b1c2451c4..23ef3a938 100644 --- a/src/app/products/loan-products/view-loan-product/datatable-tab/datatable-tab.component.ts +++ b/src/app/products/loan-products/view-loan-product/datatable-tab/datatable-tab.component.ts @@ -1,4 +1,4 @@ -import { Component } from '@angular/core'; +import { Component, inject } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; import { EntityDatatableTabComponent } from '../../../../shared/tabs/entity-datatable-tab/entity-datatable-tab.component'; import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; @@ -13,11 +13,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class DatatableTabComponent { + private route = inject(ActivatedRoute); + entityId: string; entityDatatable: any; multiRowDatatableFlag: boolean; - constructor(private route: ActivatedRoute) { + constructor() { this.entityId = this.route.parent.parent.snapshot.paramMap.get('productId'); this.route.data.subscribe((data: { loanProductDatatable: any }) => { diff --git a/src/app/products/loan-products/view-loan-product/general-tab/general-tab.component.ts b/src/app/products/loan-products/view-loan-product/general-tab/general-tab.component.ts index 6e47f7f9b..9b8829bbd 100644 --- a/src/app/products/loan-products/view-loan-product/general-tab/general-tab.component.ts +++ b/src/app/products/loan-products/view-loan-product/general-tab/general-tab.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; import { LoanProduct } from '../../models/loan-product.model'; import { FormfieldBase } from 'app/shared/form-dialog/formfield/model/formfield-base'; @@ -23,17 +23,17 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class GeneralTabComponent implements OnInit { + private route = inject(ActivatedRoute); + private router = inject(Router); + private dialog = inject(MatDialog); + private productsService = inject(ProductsService); + private settingsService = inject(SettingsService); + private translateService = inject(TranslateService); + loanProduct: LoanProduct; useDueForRepaymentsConfigurations = false; - constructor( - private route: ActivatedRoute, - private router: Router, - private dialog: MatDialog, - private productsService: ProductsService, - private settingsService: SettingsService, - private translateService: TranslateService - ) { + constructor() { this.route.data.subscribe((data: { loanProduct: any }) => { this.loanProduct = data.loanProduct; this.useDueForRepaymentsConfigurations = @@ -80,7 +80,6 @@ export class GeneralTabComponent implements OnInit { required: true, order: 2 }) - ]; const data = { title: `${this.translateService.instant('labels.buttons.Create')} ${this.translateService.instant('labels.inputs.Loan Product')}`, diff --git a/src/app/products/loan-products/view-loan-product/shared/view-advance-paymeny-allocation/view-advance-paymeny-allocation.component.html b/src/app/products/loan-products/view-loan-product/shared/view-advance-paymeny-allocation/view-advance-paymeny-allocation.component.html index 2c39f0a75..a4bc81f2b 100644 --- a/src/app/products/loan-products/view-loan-product/shared/view-advance-paymeny-allocation/view-advance-paymeny-allocation.component.html +++ b/src/app/products/loan-products/view-loan-product/shared/view-advance-paymeny-allocation/view-advance-paymeny-allocation.component.html @@ -1,71 +1,84 @@ - - - +@if (paymentAllocation) { + + + +
    + {{ 'labels.inputs.Transaction Type' | translate }}: + {{ transactionTypeValue(paymentAllocation.transactionType) }} +
    +
    +
    +
    - {{ 'labels.inputs.Transaction Type' | translate }}: - {{ transactionTypeValue(paymentAllocation.transactionType) }} + {{ 'labels.inputs.Future Installment Allocation Rule' | translate }}: + {{ + futureInstallmentRuleValue(paymentAllocation.futureInstallmentAllocationRule) | translateKey: 'catalogs' + }}
    - - - -
    -
    - {{ 'labels.inputs.Future Installment Allocation Rule' | translate }}: - {{ - futureInstallmentRuleValue(paymentAllocation.futureInstallmentAllocationRule) | translateKey: 'catalogs' - }} -
    - -
    - {{ 'labels.inputs.Payment Allocation Order' | translate }} - - - - - - - - - - - - - - -
    {{ 'labels.inputs.Order' | translate }}{{ 'labels.inputs.Payment Allocation Rule' | translate }}
    {{ idx + 1 }}{{ allocationRuleValue(paymentAllocation.paymentAllocationRule) | translateKey: 'catalogs' }}
    -
    -
    -
    - - - -
    - {{ 'labels.inputs.Transaction Type' | translate }}: - {{ transactionTypeValue(creditAllocation.transactionType) }} + {{ 'labels.inputs.Payment Allocation Order' | translate }} + + + + + + + + + + @for ( + paymentAllocation of paymentAllocation.paymentAllocationOrder; + track paymentAllocation; + let idx = $index + ) { + + + + + } + +
    {{ 'labels.inputs.Order' | translate }}{{ 'labels.inputs.Payment Allocation Rule' | translate }}
    {{ idx + 1 }}{{ allocationRuleValue(paymentAllocation.paymentAllocationRule) | translateKey: 'catalogs' }}
    +
    -
    -
    - -
    -
    - {{ 'labels.inputs.Credit Allocation Order' | translate }} - - - - - - - - - - - - - - -
    {{ 'labels.inputs.Order' | translate }}{{ 'labels.inputs.Credit Allocation Rule' | translate }}
    {{ idx + 1 }}{{ allocationRuleValue(creditAllocation.creditAllocationRule) | translateKey: 'catalogs' }}
    -
    -
    -
    + +} +@if (creditAllocation) { + + + +
    + {{ 'labels.inputs.Transaction Type' | translate }}: + {{ transactionTypeValue(creditAllocation.transactionType) }} +
    +
    +
    +
    +
    + {{ 'labels.inputs.Credit Allocation Order' | translate }} + + + + + + + + + + @for ( + creditAllocation of creditAllocation.creditAllocationOrder; + track creditAllocation; + let idx = $index + ) { + + + + + } + +
    {{ 'labels.inputs.Order' | translate }}{{ 'labels.inputs.Credit Allocation Rule' | translate }}
    {{ idx + 1 }}{{ allocationRuleValue(creditAllocation.creditAllocationRule) | translateKey: 'catalogs' }}
    +
    +
    +
    +
    +} diff --git a/src/app/products/loan-products/view-loan-product/view-loan-product.component.html b/src/app/products/loan-products/view-loan-product/view-loan-product.component.html index c6f1db237..01bcae50d 100644 --- a/src/app/products/loan-products/view-loan-product/view-loan-product.component.html +++ b/src/app/products/loan-products/view-loan-product/view-loan-product.component.html @@ -10,7 +10,7 @@ > {{ 'labels.heading.General' | translate }} - + @for (loanProductDatatable of loanProductDatatables; track loanProductDatatable) { {{ loanProductDatatable.registeredTableName }} - + } diff --git a/src/app/products/loan-products/view-loan-product/view-loan-product.component.ts b/src/app/products/loan-products/view-loan-product/view-loan-product.component.ts index 8d6614e14..afd474fdd 100644 --- a/src/app/products/loan-products/view-loan-product/view-loan-product.component.ts +++ b/src/app/products/loan-products/view-loan-product/view-loan-product.component.ts @@ -1,4 +1,4 @@ -import { Component } from '@angular/core'; +import { Component, inject } from '@angular/core'; import { ActivatedRoute, RouterLinkActive, RouterLink, RouterOutlet } from '@angular/router'; import { MatTabNav, MatTabLink, MatTabNavPanel } from '@angular/material/tabs'; import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; @@ -17,9 +17,11 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ViewLoanProductComponent { + private route = inject(ActivatedRoute); + loanProductDatatables: any = []; - constructor(private route: ActivatedRoute) { + constructor() { this.route.data.subscribe((data: { loanProductDatatables: any }) => { this.loanProductDatatables = data.loanProductDatatables; }); diff --git a/src/app/products/manage-delinquency-buckets/delinquency-bucket/create-bucket/create-bucket.component.html b/src/app/products/manage-delinquency-buckets/delinquency-bucket/create-bucket/create-bucket.component.html index a7c5412cd..9733551c5 100644 --- a/src/app/products/manage-delinquency-buckets/delinquency-bucket/create-bucket/create-bucket.component.html +++ b/src/app/products/manage-delinquency-buckets/delinquency-bucket/create-bucket/create-bucket.component.html @@ -6,10 +6,12 @@ {{ 'labels.inputs.Name' | translate }} - - {{ 'labels.inputs.Name' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (bucketForm.controls.name.hasError('required')) { + + {{ 'labels.inputs.Name' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + }

    {{ 'labels.heading.Delinquency Ranges' | translate }}

    diff --git a/src/app/products/manage-delinquency-buckets/delinquency-bucket/create-bucket/create-bucket.component.ts b/src/app/products/manage-delinquency-buckets/delinquency-bucket/create-bucket/create-bucket.component.ts index 1276a69ce..67c7958ec 100644 --- a/src/app/products/manage-delinquency-buckets/delinquency-bucket/create-bucket/create-bucket.component.ts +++ b/src/app/products/manage-delinquency-buckets/delinquency-bucket/create-bucket/create-bucket.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormBuilder, UntypedFormGroup, Validators, ReactiveFormsModule } from '@angular/forms'; import { MatDialog } from '@angular/material/dialog'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; @@ -49,6 +49,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class CreateBucketComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private productsService = inject(ProductsService); + private router = inject(Router); + private route = inject(ActivatedRoute); + dialog = inject(MatDialog); + private translateService = inject(TranslateService); + /** Delinquency Bucket form. */ bucketForm: UntypedFormGroup; /** Delinquency Bucket template data. */ @@ -67,14 +74,7 @@ export class CreateBucketComponent implements OnInit { 'actions' ]; - constructor( - private formBuilder: UntypedFormBuilder, - private productsService: ProductsService, - private router: Router, - private route: ActivatedRoute, - public dialog: MatDialog, - private translateService: TranslateService - ) { + constructor() { this.route.data.subscribe((data: { delinquencyRanges: any }) => { this.delinquencyRangesData = data.delinquencyRanges; this.delinquencyRangesData = this.delinquencyRangesData.sort( @@ -119,7 +119,6 @@ export class CreateBucketComponent implements OnInit { options: { label: 'classification', value: 'id', data: delinquencyRanges }, order: 1 }) - ]; const data = { title: 'Add Delinquency Range', diff --git a/src/app/products/manage-delinquency-buckets/delinquency-bucket/delinquency-bucket.component.resolver.ts b/src/app/products/manage-delinquency-buckets/delinquency-bucket/delinquency-bucket.component.resolver.ts index ede45e660..fa3c1db74 100644 --- a/src/app/products/manage-delinquency-buckets/delinquency-bucket/delinquency-bucket.component.resolver.ts +++ b/src/app/products/manage-delinquency-buckets/delinquency-bucket/delinquency-bucket.component.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { ProductsService } from '../../products.service'; */ @Injectable() export class DelinquencyBucketComponentsResolver { - /** - * @param {ProductsService} productsService Products service. - */ - constructor(private productsService: ProductsService) {} + private productsService = inject(ProductsService); /** * Returns the delinquency buckets data. diff --git a/src/app/products/manage-delinquency-buckets/delinquency-bucket/delinquency-bucket.component.ts b/src/app/products/manage-delinquency-buckets/delinquency-bucket/delinquency-bucket.component.ts index a87b3f16e..95e56e031 100644 --- a/src/app/products/manage-delinquency-buckets/delinquency-bucket/delinquency-bucket.component.ts +++ b/src/app/products/manage-delinquency-buckets/delinquency-bucket/delinquency-bucket.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit, ViewChild } from '@angular/core'; +import { Component, OnInit, ViewChild, inject } from '@angular/core'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort, MatSortHeader } from '@angular/material/sort'; import { @@ -41,6 +41,8 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class DelinquencyBucketComponent implements OnInit { + private route = inject(ActivatedRoute); + delinquencyBucketData: any; /** Columns to be displayed in delinquency bucket table. */ displayedColumns: string[] = ['name']; @@ -52,7 +54,7 @@ export class DelinquencyBucketComponent implements OnInit { /** Sorter for delinquency bucket table. */ @ViewChild(MatSort, { static: true }) sort: MatSort; - constructor(private route: ActivatedRoute) { + constructor() { this.route.data.subscribe((data: { delinquencyBuckets: any }) => { this.delinquencyBucketData = data.delinquencyBuckets; }); diff --git a/src/app/products/manage-delinquency-buckets/delinquency-bucket/edit-bucket/edit-bucket.component.html b/src/app/products/manage-delinquency-buckets/delinquency-bucket/edit-bucket/edit-bucket.component.html index bd064a745..5385612bc 100644 --- a/src/app/products/manage-delinquency-buckets/delinquency-bucket/edit-bucket/edit-bucket.component.html +++ b/src/app/products/manage-delinquency-buckets/delinquency-bucket/edit-bucket/edit-bucket.component.html @@ -6,10 +6,12 @@ {{ 'labels.inputs.Name' | translate }} - - {{ 'labels.inputs.Name' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (bucketForm.controls.name.hasError('required')) { + + {{ 'labels.inputs.Name' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + }

    {{ 'labels.heading.Delinquency Ranges' | translate }}

    diff --git a/src/app/products/manage-delinquency-buckets/delinquency-bucket/edit-bucket/edit-bucket.component.ts b/src/app/products/manage-delinquency-buckets/delinquency-bucket/edit-bucket/edit-bucket.component.ts index 9ce1b68c7..0cd245d2e 100644 --- a/src/app/products/manage-delinquency-buckets/delinquency-bucket/edit-bucket/edit-bucket.component.ts +++ b/src/app/products/manage-delinquency-buckets/delinquency-bucket/edit-bucket/edit-bucket.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormBuilder, UntypedFormGroup, Validators, ReactiveFormsModule } from '@angular/forms'; import { MatDialog } from '@angular/material/dialog'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; @@ -49,6 +49,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class EditBucketComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private productsService = inject(ProductsService); + private router = inject(Router); + private route = inject(ActivatedRoute); + dialog = inject(MatDialog); + private translateService = inject(TranslateService); + /** Delinquency Bucket form. */ bucketForm: UntypedFormGroup; /** Delinquency Bucket template data. */ @@ -73,14 +80,7 @@ export class EditBucketComponent implements OnInit { 'actions' ]; - constructor( - private formBuilder: UntypedFormBuilder, - private productsService: ProductsService, - private router: Router, - private route: ActivatedRoute, - public dialog: MatDialog, - private translateService: TranslateService - ) { + constructor() { this.route.data.subscribe((data: { delinquencyBucket: any; delinquencyRanges: any }) => { this.delinquencyRangesData = data.delinquencyRanges; this.rangesDataSource = []; @@ -131,7 +131,6 @@ export class EditBucketComponent implements OnInit { options: { label: 'classification', value: 'id', data: delinquencyRanges }, order: 1 }) - ]; const data = { title: 'Add Delinquency Range', diff --git a/src/app/products/manage-delinquency-buckets/delinquency-bucket/view-bucket/view-bucket.component.html b/src/app/products/manage-delinquency-buckets/delinquency-bucket/view-bucket/view-bucket.component.html index 8eab82c7f..95156da52 100644 --- a/src/app/products/manage-delinquency-buckets/delinquency-bucket/view-bucket/view-bucket.component.html +++ b/src/app/products/manage-delinquency-buckets/delinquency-bucket/view-bucket/view-bucket.component.html @@ -42,19 +42,19 @@
    -
    -
    - {{ range.classification }} + @for (range of delinquencyBucketData.ranges; track range) { +
    +
    + {{ range.classification }} +
    +
    + {{ range.minimumAgeDays }} +
    +
    + {{ range.maximumAgeDays }} +
    - -
    - {{ range.minimumAgeDays }} -
    - -
    - {{ range.maximumAgeDays }} -
    -
    + }
    diff --git a/src/app/products/manage-delinquency-buckets/delinquency-bucket/view-bucket/view-bucket.component.ts b/src/app/products/manage-delinquency-buckets/delinquency-bucket/view-bucket/view-bucket.component.ts index e9e524fd5..1459e0ec8 100644 --- a/src/app/products/manage-delinquency-buckets/delinquency-bucket/view-bucket/view-bucket.component.ts +++ b/src/app/products/manage-delinquency-buckets/delinquency-bucket/view-bucket/view-bucket.component.ts @@ -1,4 +1,4 @@ -import { Component } from '@angular/core'; +import { Component, inject } from '@angular/core'; import { MatDialog } from '@angular/material/dialog'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; import { ProductsService } from 'app/products/products.service'; @@ -16,15 +16,15 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ViewBucketComponent { + private route = inject(ActivatedRoute); + private router = inject(Router); + private dialog = inject(MatDialog); + private productsService = inject(ProductsService); + /** Delinquency Bucket Data. */ delinquencyBucketData: any; - constructor( - private route: ActivatedRoute, - private router: Router, - private dialog: MatDialog, - private productsService: ProductsService - ) { + constructor() { this.route.data.subscribe((data: { delinquencyBucket: any }) => { this.delinquencyBucketData = data.delinquencyBucket; this.delinquencyBucketData.ranges = this.delinquencyBucketData.ranges.sort( diff --git a/src/app/products/manage-delinquency-buckets/delinquency-range/create-range/create-range.component.html b/src/app/products/manage-delinquency-buckets/delinquency-range/create-range/create-range.component.html index 24d2f57c3..bcc81476a 100644 --- a/src/app/products/manage-delinquency-buckets/delinquency-range/create-range/create-range.component.html +++ b/src/app/products/manage-delinquency-buckets/delinquency-range/create-range/create-range.component.html @@ -6,22 +6,26 @@ {{ 'labels.inputs.Classification' | translate }} - - {{ 'labels.inputs.Classification' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (delinquencyRangeForm.controls.classification.hasError('required')) { + + {{ 'labels.inputs.Classification' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Days From' | translate }} - - {{ 'labels.inputs.Days From' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - {{ 'labels.inputs.Days From' | translate }} must be a positive number. - + @if (delinquencyRangeForm.controls.minimumAgeDays.hasError('required')) { + + {{ 'labels.inputs.Days From' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + @if (delinquencyRangeForm.controls.minimumAgeDays.hasError('pattern')) { + {{ 'labels.inputs.Days From' | translate }} must be a positive number. + } diff --git a/src/app/products/manage-delinquency-buckets/delinquency-range/create-range/create-range.component.ts b/src/app/products/manage-delinquency-buckets/delinquency-range/create-range/create-range.component.ts index d22d9275d..70c51ccf5 100644 --- a/src/app/products/manage-delinquency-buckets/delinquency-range/create-range/create-range.component.ts +++ b/src/app/products/manage-delinquency-buckets/delinquency-range/create-range/create-range.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormBuilder, UntypedFormGroup, Validators, ReactiveFormsModule } from '@angular/forms'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; import { ProductsService } from 'app/products/products.service'; @@ -14,17 +14,15 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class CreateRangeComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private productsService = inject(ProductsService); + private route = inject(ActivatedRoute); + private router = inject(Router); + private settingsService = inject(SettingsService); + /** Delinquency Range form. */ delinquencyRangeForm: UntypedFormGroup; - constructor( - private formBuilder: UntypedFormBuilder, - private productsService: ProductsService, - private route: ActivatedRoute, - private router: Router, - private settingsService: SettingsService - ) {} - ngOnInit(): void { this.setInputForm(); } @@ -43,13 +41,15 @@ export class CreateRangeComponent implements OnInit { [ Validators.required, Validators.pattern('^(0*[1-9][0-9]*?)$'), - Validators.max(1000)] + Validators.max(1000) + ] ], maximumAgeDays: [ '', [ Validators.pattern('^(0*[1-9][0-9]*?)$'), - Validators.max(10000)] + Validators.max(10000) + ] ] }); } diff --git a/src/app/products/manage-delinquency-buckets/delinquency-range/delinquency-range.component.resolver.ts b/src/app/products/manage-delinquency-buckets/delinquency-range/delinquency-range.component.resolver.ts index 35f36abc0..a77b6da05 100644 --- a/src/app/products/manage-delinquency-buckets/delinquency-range/delinquency-range.component.resolver.ts +++ b/src/app/products/manage-delinquency-buckets/delinquency-range/delinquency-range.component.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { ProductsService } from '../../products.service'; */ @Injectable() export class DelinquencyRangeComponentsResolver { - /** - * @param {ProductsService} productsService Products service. - */ - constructor(private productsService: ProductsService) {} + private productsService = inject(ProductsService); /** * Returns the delinquency ranges data. diff --git a/src/app/products/manage-delinquency-buckets/delinquency-range/delinquency-range.component.ts b/src/app/products/manage-delinquency-buckets/delinquency-range/delinquency-range.component.ts index 1a1d9b730..f725b521d 100644 --- a/src/app/products/manage-delinquency-buckets/delinquency-range/delinquency-range.component.ts +++ b/src/app/products/manage-delinquency-buckets/delinquency-range/delinquency-range.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit, ViewChild } from '@angular/core'; +import { Component, OnInit, ViewChild, inject } from '@angular/core'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort, MatSortHeader } from '@angular/material/sort'; import { @@ -41,6 +41,8 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class DelinquencyRangeComponent implements OnInit { + private route = inject(ActivatedRoute); + delinquencyRangeData: any; /** Columns to be displayed in delinquency range table. */ displayedColumns: string[] = [ @@ -56,7 +58,7 @@ export class DelinquencyRangeComponent implements OnInit { /** Sorter for delinquency range table. */ @ViewChild(MatSort, { static: true }) sort: MatSort; - constructor(private route: ActivatedRoute) { + constructor() { this.route.data.subscribe((data: { delinquencyRanges: any }) => { this.delinquencyRangeData = data.delinquencyRanges; }); diff --git a/src/app/products/manage-delinquency-buckets/delinquency-range/edit-range/edit-range.component.html b/src/app/products/manage-delinquency-buckets/delinquency-range/edit-range/edit-range.component.html index c0c848fce..279964e92 100644 --- a/src/app/products/manage-delinquency-buckets/delinquency-range/edit-range/edit-range.component.html +++ b/src/app/products/manage-delinquency-buckets/delinquency-range/edit-range/edit-range.component.html @@ -6,19 +6,23 @@ {{ 'labels.inputs.Classification' | translate }} - - {{ 'labels.inputs.Classification' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (delinquencyRangeForm.controls.classification.hasError('required')) { + + {{ 'labels.inputs.Classification' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Days From' | translate }} - - {{ 'labels.inputs.Days From' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (delinquencyRangeForm.controls.minimumAgeDays.hasError('required')) { + + {{ 'labels.inputs.Days From' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } diff --git a/src/app/products/manage-delinquency-buckets/delinquency-range/edit-range/edit-range.component.ts b/src/app/products/manage-delinquency-buckets/delinquency-range/edit-range/edit-range.component.ts index 42494824e..d4f0e9c6e 100644 --- a/src/app/products/manage-delinquency-buckets/delinquency-range/edit-range/edit-range.component.ts +++ b/src/app/products/manage-delinquency-buckets/delinquency-range/edit-range/edit-range.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormBuilder, UntypedFormGroup, Validators, ReactiveFormsModule } from '@angular/forms'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; import { ProductsService } from 'app/products/products.service'; @@ -14,18 +14,18 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class EditRangeComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private productsService = inject(ProductsService); + private route = inject(ActivatedRoute); + private router = inject(Router); + private settingsService = inject(SettingsService); + /** Delinquency Range Data. */ delinquencyRangeData: any; /** Delinquency Range form. */ delinquencyRangeForm: UntypedFormGroup; - constructor( - private formBuilder: UntypedFormBuilder, - private productsService: ProductsService, - private route: ActivatedRoute, - private router: Router, - private settingsService: SettingsService - ) { + constructor() { this.route.data.subscribe((data: { delinquencyRange: any }) => { this.delinquencyRangeData = data.delinquencyRange; }); @@ -49,13 +49,15 @@ export class EditRangeComponent implements OnInit { [ Validators.required, Validators.pattern('^(0*[1-9][0-9]*?)$'), - Validators.max(1000)] + Validators.max(1000) + ] ], maximumAgeDays: [ this.delinquencyRangeData.maximumAgeDays, [ Validators.pattern('^(0*[1-9][0-9]*?)$'), - Validators.max(10000)] + Validators.max(10000) + ] ] }); } diff --git a/src/app/products/manage-delinquency-buckets/delinquency-range/view-range/view-range.component.ts b/src/app/products/manage-delinquency-buckets/delinquency-range/view-range/view-range.component.ts index 208b49bd9..b66add120 100644 --- a/src/app/products/manage-delinquency-buckets/delinquency-range/view-range/view-range.component.ts +++ b/src/app/products/manage-delinquency-buckets/delinquency-range/view-range/view-range.component.ts @@ -1,4 +1,4 @@ -import { Component } from '@angular/core'; +import { Component, inject } from '@angular/core'; import { MatDialog } from '@angular/material/dialog'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; import { ProductsService } from 'app/products/products.service'; @@ -16,15 +16,15 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ViewRangeComponent { + private route = inject(ActivatedRoute); + private router = inject(Router); + private dialog = inject(MatDialog); + private productsService = inject(ProductsService); + /** Delinquency Range Data. */ delinquencyRangeData: any; - constructor( - private route: ActivatedRoute, - private router: Router, - private dialog: MatDialog, - private productsService: ProductsService - ) { + constructor() { this.route.data.subscribe((data: { delinquencyRange: any }) => { this.delinquencyRangeData = data.delinquencyRange; }); diff --git a/src/app/products/manage-delinquency-buckets/manage-delinquency-buckets.component.html b/src/app/products/manage-delinquency-buckets/manage-delinquency-buckets.component.html index 6a22fed23..726428c05 100644 --- a/src/app/products/manage-delinquency-buckets/manage-delinquency-buckets.component.html +++ b/src/app/products/manage-delinquency-buckets/manage-delinquency-buckets.component.html @@ -8,21 +8,17 @@

    {{ 'labels.heading.Manage Delinquency Ranges' | translate }}

    - - -

    - {{ 'labels.text.Define delinquency day ranges' | translate }} -

    + @if (!arrowBooleans[0]) { + + } + @if (arrowBooleans[0]) { + + } + @if (arrowBooleans[0]) { +

    + {{ 'labels.text.Define delinquency day ranges' | translate }} +

    + }
    @@ -34,21 +30,17 @@

    {{ 'labels.heading.Manage Delinquency Buckets' | translate }}

    - - -

    - {{ 'labels.text.Define delinquency bucket as set of ranges' | translate }} -

    + @if (!arrowBooleans[1]) { + + } + @if (arrowBooleans[1]) { + + } + @if (arrowBooleans[1]) { +

    + {{ 'labels.text.Define delinquency bucket as set of ranges' | translate }} +

    + }
    diff --git a/src/app/products/manage-tax-components/create-tax-component/create-tax-component.component.html b/src/app/products/manage-tax-components/create-tax-component/create-tax-component.component.html index b0f74d437..a131a8344 100644 --- a/src/app/products/manage-tax-components/create-tax-component/create-tax-component.component.html +++ b/src/app/products/manage-tax-components/create-tax-component/create-tax-component.component.html @@ -6,65 +6,75 @@ {{ 'labels.inputs.Name' | translate }} - - {{ 'labels.inputs.Name' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (taxComponentForm.controls.name.hasError('required')) { + + {{ 'labels.inputs.Name' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Percentage' | translate }} - - {{ 'labels.inputs.Percentage' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - {{ 'labels.inputs.Percentage' | translate }} {{ 'labels.commons.should' | translate }} - {{ 'labels.commons.be larger than 0 and at most 100' | translate }} - + @if (taxComponentForm.controls.percentage.hasError('required')) { + + {{ 'labels.inputs.Percentage' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + @if ( + taxComponentForm.controls.percentage.hasError('pattern') || + taxComponentForm.controls.percentage.hasError('max') + ) { + + {{ 'labels.inputs.Percentage' | translate }} {{ 'labels.commons.should' | translate }} + {{ 'labels.commons.be larger than 0 and at most 100' | translate }} + + } {{ 'labels.inputs.Debit Account Type' | translate }} - - {{ debitAccountType.value | translateKey: 'inputs.accounting' }} - + @for (debitAccountType of debitAccountTypeData; track debitAccountType) { + + {{ debitAccountType.value | translateKey: 'inputs.accounting' }} + + } - - + @if (debitAccountData.length > 0) { + + + } {{ 'labels.inputs.Credit Account Type' | translate }} - - {{ creditAccountType.value | translateKey: 'inputs.accounting' }} - + @for (creditAccountType of creditAccountTypeData; track creditAccountType) { + + {{ creditAccountType.value | translateKey: 'inputs.accounting' }} + + } - - + @if (creditAccountData.length > 0) { + + + } {{ 'labels.inputs.Start Date' | translate }} @@ -78,10 +88,12 @@ /> - - {{ 'labels.inputs.Start Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (taxComponentForm.controls.startDate.hasError('required')) { + + {{ 'labels.inputs.Start Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } diff --git a/src/app/products/manage-tax-components/create-tax-component/create-tax-component.component.ts b/src/app/products/manage-tax-components/create-tax-component/create-tax-component.component.ts index 55c651a4e..a9efdf248 100644 --- a/src/app/products/manage-tax-components/create-tax-component/create-tax-component.component.ts +++ b/src/app/products/manage-tax-components/create-tax-component/create-tax-component.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, @@ -29,6 +29,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class CreateTaxComponentComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private productsService = inject(ProductsService); + private route = inject(ActivatedRoute); + private router = inject(Router); + private dateUtils = inject(Dates); + private settingsService = inject(SettingsService); + /** Minimum start date allowed. */ minDate = new Date(); /** Maximum start date allowed. */ @@ -55,14 +62,7 @@ export class CreateTaxComponentComponent implements OnInit { * @param {Dates} dateUtils Date Utils to format date. * @param {SettingsService} settingsService Settings Service. */ - constructor( - private formBuilder: UntypedFormBuilder, - private productsService: ProductsService, - private route: ActivatedRoute, - private router: Router, - private dateUtils: Dates, - private settingsService: SettingsService - ) { + constructor() { this.route.data.subscribe((data: { taxComponentTemplate: any }) => { this.taxComponentTemplateData = data.taxComponentTemplate; }); @@ -93,7 +93,8 @@ export class CreateTaxComponentComponent implements OnInit { [ Validators.required, Validators.pattern('^(0*[1-9][0-9]*(\\.[0-9]+)?|0+\\.[0-9]*[1-9][0-9]*)$'), - Validators.max(100)] + Validators.max(100) + ] ], creditAccountType: [''], debitAccountType: [''], diff --git a/src/app/products/manage-tax-components/edit-tax-component/edit-tax-component.component.html b/src/app/products/manage-tax-components/edit-tax-component/edit-tax-component.component.html index 8a79a44b7..558c8f52c 100644 --- a/src/app/products/manage-tax-components/edit-tax-component/edit-tax-component.component.html +++ b/src/app/products/manage-tax-components/edit-tax-component/edit-tax-component.component.html @@ -6,30 +6,38 @@ {{ 'labels.inputs.Name' | translate }} - - {{ 'labels.inputs.Name' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (taxComponentForm.controls.name.hasError('required')) { + + {{ 'labels.inputs.Name' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Percentage' | translate }} - - {{ 'labels.inputs.Percentage' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (taxComponentForm.controls.name.hasError('required')) { + + {{ 'labels.inputs.Percentage' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } - - {{ 'labels.inputs.Credit Account Type' | translate }} - - + @if (taxComponentData?.creditAccountType?.value) { + + {{ 'labels.inputs.Credit Account Type' | translate }} + + + } - - {{ 'labels.inputs.Credit Account' | translate }} - - + @if (taxComponentData?.creditAccount?.name) { + + {{ 'labels.inputs.Credit Account' | translate }} + + + } {{ 'labels.inputs.Start Date' | translate }} @@ -43,10 +51,12 @@ /> - - {{ 'labels.inputs.Start Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (taxComponentForm.controls.startDate.hasError('required')) { + + {{ 'labels.inputs.Start Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } diff --git a/src/app/products/manage-tax-components/edit-tax-component/edit-tax-component.component.ts b/src/app/products/manage-tax-components/edit-tax-component/edit-tax-component.component.ts index ef3ad80b1..b0df1e13b 100644 --- a/src/app/products/manage-tax-components/edit-tax-component/edit-tax-component.component.ts +++ b/src/app/products/manage-tax-components/edit-tax-component/edit-tax-component.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, Validators, ReactiveFormsModule } from '@angular/forms'; import { Router, ActivatedRoute, RouterLink } from '@angular/router'; @@ -22,6 +22,14 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class EditTaxComponentComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private productsService = inject(ProductsService); + private route = inject(ActivatedRoute); + private router = inject(Router); + private dateUtils = inject(Dates); + private settingsService = inject(SettingsService); + private translateService = inject(TranslateService); + /** Minimum date allowed. */ minDate = new Date(2000, 0, 1); /** Maximum start date allowed. */ @@ -40,15 +48,7 @@ export class EditTaxComponentComponent implements OnInit { * @param {Dates} dateUtils Date Utils to format date. * @param {SettingsService} settingsService Settings Service. */ - constructor( - private formBuilder: UntypedFormBuilder, - private productsService: ProductsService, - private route: ActivatedRoute, - private router: Router, - private dateUtils: Dates, - private settingsService: SettingsService, - private translateService: TranslateService - ) { + constructor() { this.route.data.subscribe((data: { taxComponent: any }) => { this.taxComponentData = data.taxComponent; }); @@ -83,7 +83,8 @@ export class EditTaxComponentComponent implements OnInit { [ Validators.required, Validators.pattern('^(0*[1-9][0-9]*(\\.[0-9]+)?|0+\\.[0-9]*[1-9][0-9]*)$'), - Validators.max(100)] + Validators.max(100) + ] ], startDate: [this.taxComponentData.startDate && new Date(this.taxComponentData.startDate)], creditAccountType: [ diff --git a/src/app/products/manage-tax-components/manage-tax-components.component.ts b/src/app/products/manage-tax-components/manage-tax-components.component.ts index 166d8bd4b..de47d1461 100644 --- a/src/app/products/manage-tax-components/manage-tax-components.component.ts +++ b/src/app/products/manage-tax-components/manage-tax-components.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, ViewChild } from '@angular/core'; +import { Component, OnInit, ViewChild, inject } from '@angular/core'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort, MatSortHeader } from '@angular/material/sort'; import { @@ -52,6 +52,8 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ManageTaxComponentsComponent implements OnInit { + private route = inject(ActivatedRoute); + /** Tax Components data. */ taxComponentData: any; /** Columns to be displayed in tax component table. */ @@ -73,7 +75,7 @@ export class ManageTaxComponentsComponent implements OnInit { * Retrieves the tax component data from `resolve`. * @param {ActivatedRoute} route Activated Route. */ - constructor(private route: ActivatedRoute) { + constructor() { this.route.data.subscribe((data: { taxComponents: any }) => { this.taxComponentData = data.taxComponents; }); diff --git a/src/app/products/manage-tax-components/manage-tax-components.resolver.ts b/src/app/products/manage-tax-components/manage-tax-components.resolver.ts index 46a3bc88c..4d316b85f 100644 --- a/src/app/products/manage-tax-components/manage-tax-components.resolver.ts +++ b/src/app/products/manage-tax-components/manage-tax-components.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; /** rxjs Imports */ import { Observable } from 'rxjs'; @@ -12,10 +12,7 @@ import { ProductsService } from '../products.service'; */ @Injectable() export class ManageTaxComponentsResolver { - /** - * @param {ProductsService} productsService Products service. - */ - constructor(private productsService: ProductsService) {} + private productsService = inject(ProductsService); /** * Returns the tax components data. diff --git a/src/app/products/manage-tax-components/tax-component-template.resolver.ts b/src/app/products/manage-tax-components/tax-component-template.resolver.ts index 9ef01666b..6aa6d4e7b 100644 --- a/src/app/products/manage-tax-components/tax-component-template.resolver.ts +++ b/src/app/products/manage-tax-components/tax-component-template.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; /** rxjs Imports */ import { Observable } from 'rxjs'; @@ -12,10 +12,7 @@ import { ProductsService } from '../products.service'; */ @Injectable() export class TaxComponentTemplateResolver { - /** - * @param {ProductsService} productsService Products service. - */ - constructor(private productsService: ProductsService) {} + private productsService = inject(ProductsService); /** * Returns the tax components template data. diff --git a/src/app/products/manage-tax-components/tax-component.resolver.ts b/src/app/products/manage-tax-components/tax-component.resolver.ts index 8e137e88d..d61289e54 100644 --- a/src/app/products/manage-tax-components/tax-component.resolver.ts +++ b/src/app/products/manage-tax-components/tax-component.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { ProductsService } from '../products.service'; */ @Injectable() export class TaxComponentResolver { - /** - * @param {ProductsService} productsService Products service. - */ - constructor(private productsService: ProductsService) {} + private productsService = inject(ProductsService); /** * Returns the tax Component data. diff --git a/src/app/products/manage-tax-components/view-tax-component/view-tax-component.component.html b/src/app/products/manage-tax-components/view-tax-component/view-tax-component.component.html index bab697b0f..5d90e057c 100644 --- a/src/app/products/manage-tax-components/view-tax-component/view-tax-component.component.html +++ b/src/app/products/manage-tax-components/view-tax-component/view-tax-component.component.html @@ -23,39 +23,55 @@
    {{ taxComponentData.percentage | formatNumber }} %
    -
    - {{ 'labels.inputs.Debit Account Type' | translate }} -
    + @if (taxComponentData.debitAccountType) { +
    + {{ 'labels.inputs.Debit Account Type' | translate }} +
    + } -
    - {{ taxComponentData.debitAccountType.value }} -
    + @if (taxComponentData.debitAccountType) { +
    + {{ taxComponentData.debitAccountType.value }} +
    + } -
    - {{ 'labels.inputs.Debit Account' | translate }} -
    + @if (taxComponentData.debitAccount) { +
    + {{ 'labels.inputs.Debit Account' | translate }} +
    + } -
    - ({{ 'labels.inputs.accounting.' + taxComponentData.debitAccount.glCode }}) - {{ taxComponentData.debitAccount.name | translate }} -
    + @if (taxComponentData.debitAccount) { +
    + ({{ 'labels.inputs.accounting.' + taxComponentData.debitAccount.glCode }}) + {{ taxComponentData.debitAccount.name | translate }} +
    + } -
    - {{ 'labels.inputs.Credit Account Type' | translate }} -
    + @if (taxComponentData.creditAccountType) { +
    + {{ 'labels.inputs.Credit Account Type' | translate }} +
    + } -
    - {{ taxComponentData.creditAccountType.value | translateKey: 'catalogs' }} -
    + @if (taxComponentData.creditAccountType) { +
    + {{ taxComponentData.creditAccountType.value | translateKey: 'catalogs' }} +
    + } -
    - {{ 'labels.inputs.Credit Account' | translate }} -
    + @if (taxComponentData.creditAccount) { +
    + {{ 'labels.inputs.Credit Account' | translate }} +
    + } -
    - ({{ taxComponentData.creditAccount.glCode }}) - {{ taxComponentData.creditAccount.name }} -
    + @if (taxComponentData.creditAccount) { +
    + ({{ taxComponentData.creditAccount.glCode }}) + {{ taxComponentData.creditAccount.name }} +
    + }
    {{ 'labels.inputs.Start Date' | translate }} diff --git a/src/app/products/manage-tax-components/view-tax-component/view-tax-component.component.spec.ts b/src/app/products/manage-tax-components/view-tax-component/view-tax-component.component.spec.ts index 6747bb356..3b356c768 100644 --- a/src/app/products/manage-tax-components/view-tax-component/view-tax-component.component.spec.ts +++ b/src/app/products/manage-tax-components/view-tax-component/view-tax-component.component.spec.ts @@ -85,7 +85,6 @@ describe('ViewTaxComponentComponent - Integration Tests', () => { DecimalPipe, provideNativeDateAdapter(), provideAnimationsAsync() - ] }).compileComponents(); diff --git a/src/app/products/manage-tax-components/view-tax-component/view-tax-component.component.ts b/src/app/products/manage-tax-components/view-tax-component/view-tax-component.component.ts index 65662a878..184045496 100644 --- a/src/app/products/manage-tax-components/view-tax-component/view-tax-component.component.ts +++ b/src/app/products/manage-tax-components/view-tax-component/view-tax-component.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component } from '@angular/core'; +import { Component, inject } from '@angular/core'; import { ActivatedRoute, RouterLink } from '@angular/router'; import { FaIconComponent } from '@fortawesome/angular-fontawesome'; import { DateFormatPipe } from '../../../pipes/date-format.pipe'; @@ -21,6 +21,8 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ViewTaxComponentComponent { + private route = inject(ActivatedRoute); + /** tax Component Data. */ taxComponentData: any; @@ -28,7 +30,7 @@ export class ViewTaxComponentComponent { * Retrieves the tax Component data from `resolve`. * @param {ActivatedRoute} route Activated Route. */ - constructor(private route: ActivatedRoute) { + constructor() { this.route.data.subscribe((data: { taxComponent: any }) => { this.taxComponentData = data.taxComponent; }); diff --git a/src/app/products/manage-tax-configurations/manage-tax-configurations.component.html b/src/app/products/manage-tax-configurations/manage-tax-configurations.component.html index 649da59b0..545ce1b4f 100644 --- a/src/app/products/manage-tax-configurations/manage-tax-configurations.component.html +++ b/src/app/products/manage-tax-configurations/manage-tax-configurations.component.html @@ -8,21 +8,17 @@

    {{ 'labels.heading.Manage Tax Components' | translate }}

    - - -

    - {{ 'labels.heading.Define Tax Components' | translate }} -

    + @if (!arrowBooleans[0]) { + + } + @if (arrowBooleans[0]) { + + } + @if (arrowBooleans[0]) { +

    + {{ 'labels.heading.Define Tax Components' | translate }} +

    + }
    @@ -34,21 +30,17 @@

    {{ 'labels.heading.Manage Tax Groups' | translate }}

    - - -

    - {{ 'labels.heading.Define Tax Groups' | translate }} -

    + @if (!arrowBooleans[1]) { + + } + @if (arrowBooleans[1]) { + + } + @if (arrowBooleans[1]) { +

    + {{ 'labels.heading.Define Tax Groups' | translate }} +

    + } diff --git a/src/app/products/manage-tax-groups/create-tax-group/create-tax-group.component.html b/src/app/products/manage-tax-groups/create-tax-group/create-tax-group.component.html index 0a635d319..e1a0d61fe 100644 --- a/src/app/products/manage-tax-groups/create-tax-group/create-tax-group.component.html +++ b/src/app/products/manage-tax-groups/create-tax-group/create-tax-group.component.html @@ -6,10 +6,12 @@ {{ 'labels.inputs.Name' | translate }} - - {{ 'labels.inputs.Name' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (taxGroupForm.controls.name.hasError('required')) { + + {{ 'labels.inputs.Name' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + }

    {{ 'labels.inputs.Tax Components' | translate }}

    diff --git a/src/app/products/manage-tax-groups/create-tax-group/create-tax-group.component.ts b/src/app/products/manage-tax-groups/create-tax-group/create-tax-group.component.ts index a22bc9e6c..79048feab 100644 --- a/src/app/products/manage-tax-groups/create-tax-group/create-tax-group.component.ts +++ b/src/app/products/manage-tax-groups/create-tax-group/create-tax-group.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, @@ -67,6 +67,15 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class CreateTaxGroupComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private productsService = inject(ProductsService); + private route = inject(ActivatedRoute); + private router = inject(Router); + private dateUtils = inject(Dates); + private dialog = inject(MatDialog); + private settingsService = inject(SettingsService); + private translateService = inject(TranslateService); + /** Minimum start date allowed. */ minDate = new Date(2000, 0, 1); /** Maximum start date allowed. */ @@ -97,16 +106,7 @@ export class CreateTaxGroupComponent implements OnInit { * @param {MatDialog} dialog Dialog reference. * @param {SettingsService} settingsService Settings Service. */ - constructor( - private formBuilder: UntypedFormBuilder, - private productsService: ProductsService, - private route: ActivatedRoute, - private router: Router, - private dateUtils: Dates, - private dialog: MatDialog, - private settingsService: SettingsService, - private translateService: TranslateService - ) { + constructor() { this.route.data.subscribe((data: { taxGroupTemplate: any }) => { this.taxGroupTemplateData = data.taxGroupTemplate; this.taxComponentOptions = this.taxGroupTemplateData.taxComponents; @@ -148,7 +148,6 @@ export class CreateTaxGroupComponent implements OnInit { maxDate: this.maxDate, order: 2 }) - ]; const data = { title: @@ -186,7 +185,6 @@ export class CreateTaxGroupComponent implements OnInit { maxDate: this.maxDate, order: 2 }) - ]; const data = { title: 'Edit Tax Component', diff --git a/src/app/products/manage-tax-groups/create-tax-group/manage-tax-group-template.resolver.ts b/src/app/products/manage-tax-groups/create-tax-group/manage-tax-group-template.resolver.ts index 6f0b206fc..acf74c722 100644 --- a/src/app/products/manage-tax-groups/create-tax-group/manage-tax-group-template.resolver.ts +++ b/src/app/products/manage-tax-groups/create-tax-group/manage-tax-group-template.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; /** rxjs Imports */ import { Observable } from 'rxjs'; @@ -12,10 +12,7 @@ import { ProductsService } from '../../products.service'; */ @Injectable() export class ManageTaxGroupTemplateResolver { - /** - * @param {ProductsService} productsService Products service. - */ - constructor(private productsService: ProductsService) {} + private productsService = inject(ProductsService); /** * Returns the tax groups template data. diff --git a/src/app/products/manage-tax-groups/edit-tax-group/edit-tax-group.component.html b/src/app/products/manage-tax-groups/edit-tax-group/edit-tax-group.component.html index ac4e80e2e..cb87141a0 100644 --- a/src/app/products/manage-tax-groups/edit-tax-group/edit-tax-group.component.html +++ b/src/app/products/manage-tax-groups/edit-tax-group/edit-tax-group.component.html @@ -6,10 +6,12 @@ {{ 'labels.inputs.Name' | translate }} - - {{ 'labels.inputs.Name' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (taxGroupForm.controls.name.hasError('required')) { + + {{ 'labels.inputs.Name' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + }

    {{ 'labels.inputs.Tax Components' | translate }}

    @@ -51,17 +53,18 @@ > - + @if (taxComponent.isNew) { + + } diff --git a/src/app/products/manage-tax-groups/edit-tax-group/edit-tax-group.component.ts b/src/app/products/manage-tax-groups/edit-tax-group/edit-tax-group.component.ts index dbebd3981..e6f6b7d50 100644 --- a/src/app/products/manage-tax-groups/edit-tax-group/edit-tax-group.component.ts +++ b/src/app/products/manage-tax-groups/edit-tax-group/edit-tax-group.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormBuilder, UntypedFormGroup, Validators, ReactiveFormsModule } from '@angular/forms'; import { MatDialog } from '@angular/material/dialog'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; @@ -62,6 +62,15 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class EditTaxGroupComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private productsService = inject(ProductsService); + private route = inject(ActivatedRoute); + private router = inject(Router); + private dateUtils = inject(Dates); + dialog = inject(MatDialog); + private settingsService = inject(SettingsService); + private translateService = inject(TranslateService); + /** Minimum start date allowed. */ minDate = new Date(2000, 0, 1); /** Maximum start date allowed. */ @@ -93,16 +102,7 @@ export class EditTaxGroupComponent implements OnInit { * @param {SettingsService} settingsService Settings Service. * @param {TranslateService} translateService translate Service. */ - constructor( - private formBuilder: UntypedFormBuilder, - private productsService: ProductsService, - private route: ActivatedRoute, - private router: Router, - private dateUtils: Dates, - public dialog: MatDialog, - private settingsService: SettingsService, - private translateService: TranslateService - ) { + constructor() { this.route.data.subscribe((data: { taxGroup: any }) => { this.taxGroupData = data.taxGroup; this.taxComponentOptions = this.taxGroupData.taxComponents; @@ -145,7 +145,6 @@ export class EditTaxGroupComponent implements OnInit { maxDate: this.maxDate, order: 2 }) - ]; const data = { title: 'Add Tax Component', @@ -184,7 +183,6 @@ export class EditTaxGroupComponent implements OnInit { maxDate: this.maxDate, order: 2 }) - ]; if (!taxComponent.isNew) { formfields.push( diff --git a/src/app/products/manage-tax-groups/edit-tax-group/edit-tax-group.resolver.ts b/src/app/products/manage-tax-groups/edit-tax-group/edit-tax-group.resolver.ts index eee7d31e5..0217bc5f7 100644 --- a/src/app/products/manage-tax-groups/edit-tax-group/edit-tax-group.resolver.ts +++ b/src/app/products/manage-tax-groups/edit-tax-group/edit-tax-group.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { ProductsService } from '../../products.service'; */ @Injectable() export class EditTaxGroupResolver { - /** - * @param {ProductsService} productsService Products service. - */ - constructor(private productsService: ProductsService) {} + private productsService = inject(ProductsService); /** * Returns the tax Group data. diff --git a/src/app/products/manage-tax-groups/manage-tax-groups.component.ts b/src/app/products/manage-tax-groups/manage-tax-groups.component.ts index b65d4942b..37e3e471a 100644 --- a/src/app/products/manage-tax-groups/manage-tax-groups.component.ts +++ b/src/app/products/manage-tax-groups/manage-tax-groups.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, ViewChild } from '@angular/core'; +import { Component, OnInit, ViewChild, inject } from '@angular/core'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort, MatSortHeader } from '@angular/material/sort'; import { @@ -48,6 +48,8 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ManageTaxGroupsComponent implements OnInit { + private route = inject(ActivatedRoute); + /** Tax Groups data. */ taxGroupsData: any; /** Columns to be displayed in tax groups table. */ @@ -64,7 +66,7 @@ export class ManageTaxGroupsComponent implements OnInit { * Retrieves the tax groups data from `resolve`. * @param {ActivatedRoute} route Activated Route. */ - constructor(private route: ActivatedRoute) { + constructor() { this.route.data.subscribe((data: { taxGroups: any }) => { this.taxGroupsData = data.taxGroups; }); diff --git a/src/app/products/manage-tax-groups/manage-tax-groups.resolver.ts b/src/app/products/manage-tax-groups/manage-tax-groups.resolver.ts index e1049ec08..2d757873f 100644 --- a/src/app/products/manage-tax-groups/manage-tax-groups.resolver.ts +++ b/src/app/products/manage-tax-groups/manage-tax-groups.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; /** rxjs Imports */ import { Observable } from 'rxjs'; @@ -12,10 +12,7 @@ import { ProductsService } from '../products.service'; */ @Injectable() export class ManageTaxGroupsResolver { - /** - * @param {ProductsService} productsService Products service. - */ - constructor(private productsService: ProductsService) {} + private productsService = inject(ProductsService); /** * Returns the tax groups data. diff --git a/src/app/products/manage-tax-groups/tax-group.resolver.ts b/src/app/products/manage-tax-groups/tax-group.resolver.ts index 1540ad351..75250f02c 100644 --- a/src/app/products/manage-tax-groups/tax-group.resolver.ts +++ b/src/app/products/manage-tax-groups/tax-group.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { ProductsService } from '../products.service'; */ @Injectable() export class TaxGroupResolver { - /** - * @param {ProductsService} productsService Products service. - */ - constructor(private productsService: ProductsService) {} + private productsService = inject(ProductsService); /** * Returns the tax Group data. diff --git a/src/app/products/manage-tax-groups/view-tax-group/view-tax-group.component.html b/src/app/products/manage-tax-groups/view-tax-group/view-tax-group.component.html index a87318320..bc8740087 100644 --- a/src/app/products/manage-tax-groups/view-tax-group/view-tax-group.component.html +++ b/src/app/products/manage-tax-groups/view-tax-group/view-tax-group.component.html @@ -30,20 +30,22 @@ -
    -
    - {{ taxcomponent.taxComponent.glCode }} - {{ taxcomponent.taxComponent.name }} + @for (taxcomponent of taxGroupData.taxAssociations; track taxcomponent) { +
    +
    + {{ taxcomponent.taxComponent.glCode }} + {{ taxcomponent.taxComponent.name }} +
    +
    + {{ taxcomponent.startDate | dateFormat }} +
    + @if (taxcomponent.endDate !== undefined || taxcomponent.endDate !== null) { +
    + {{ taxcomponent.endDate | dateFormat }} +
    + }
    - -
    - {{ taxcomponent.startDate | dateFormat }} -
    - -
    - {{ taxcomponent.endDate | dateFormat }} -
    -
    + }
    diff --git a/src/app/products/manage-tax-groups/view-tax-group/view-tax-group.component.ts b/src/app/products/manage-tax-groups/view-tax-group/view-tax-group.component.ts index 98d9c3bf2..c7367dd72 100644 --- a/src/app/products/manage-tax-groups/view-tax-group/view-tax-group.component.ts +++ b/src/app/products/manage-tax-groups/view-tax-group/view-tax-group.component.ts @@ -1,5 +1,5 @@ /** Angular Imports. */ -import { Component } from '@angular/core'; +import { Component, inject } from '@angular/core'; import { ActivatedRoute, RouterLink } from '@angular/router'; import { FaIconComponent } from '@fortawesome/angular-fontawesome'; import { DateFormatPipe } from '../../../pipes/date-format.pipe'; @@ -19,6 +19,8 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ViewTaxGroupComponent { + private route = inject(ActivatedRoute); + /** tax Group Data. */ taxGroupData: any; @@ -26,7 +28,7 @@ export class ViewTaxGroupComponent { * Retrieves the tax Group data from `resolve`. * @param {ActivatedRoute} route Activated Route. */ - constructor(private route: ActivatedRoute) { + constructor() { this.route.data.subscribe((data: { taxGroup: any }) => { this.taxGroupData = data.taxGroup; }); diff --git a/src/app/products/products-mix/create-product-mix/create-product-mix.component.html b/src/app/products/products-mix/create-product-mix/create-product-mix.component.html index ac7947bf3..ff9b5d0a1 100644 --- a/src/app/products/products-mix/create-product-mix/create-product-mix.component.html +++ b/src/app/products/products-mix/create-product-mix/create-product-mix.component.html @@ -6,28 +6,38 @@ {{ 'labels.inputs.Product' | translate }} - - {{ productOption.name }} - + @for (productOption of productOptionData; track productOption) { + + {{ productOption.name }} + + } - - {{ 'labels.inputs.Product' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (productMixForm.controls.productId.hasError('required')) { + + {{ 'labels.inputs.Product' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } - - {{ 'labels.inputs.Restricted products' | translate }} - - - {{ product.name }} - - - - {{ 'labels.commons.At least one restricted product' | translate }} - {{ 'labels.commons.must be selected' | translate }} - - + @if (productData) { + + {{ 'labels.inputs.Restricted products' | translate }} + + @for (product of productData; track product) { + + {{ product.name }} + + } + + @if (productMixForm.controls.restrictedProducts.hasError('required')) { + + {{ 'labels.commons.At least one restricted product' | translate }} + {{ 'labels.commons.must be selected' | translate }} + + } + + } diff --git a/src/app/products/products-mix/create-product-mix/create-product-mix.component.ts b/src/app/products/products-mix/create-product-mix/create-product-mix.component.ts index c17da579a..bb50d55dc 100644 --- a/src/app/products/products-mix/create-product-mix/create-product-mix.component.ts +++ b/src/app/products/products-mix/create-product-mix/create-product-mix.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, Validators, FormControl, ReactiveFormsModule } from '@angular/forms'; import { Router, ActivatedRoute, RouterLink } from '@angular/router'; @@ -19,6 +19,11 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class CreateProductMixComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private productsService = inject(ProductsService); + private route = inject(ActivatedRoute); + private router = inject(Router); + /** Product mix form. */ productMixForm: UntypedFormGroup; /** Products mix template data. */ @@ -35,12 +40,7 @@ export class CreateProductMixComponent implements OnInit { * @param {ActivatedRoute} route Activated Route. * @param {Router} router Router for navigation. */ - constructor( - private formBuilder: UntypedFormBuilder, - private productsService: ProductsService, - private route: ActivatedRoute, - private router: Router - ) { + constructor() { this.route.data.subscribe((data: { productsMixTemplate: any }) => { this.productsMixTemplateData = data.productsMixTemplate; }); diff --git a/src/app/products/products-mix/edit-product-mix/edit-product-mix.component.html b/src/app/products/products-mix/edit-product-mix/edit-product-mix.component.html index a6ab61d6e..9b8399ab8 100644 --- a/src/app/products/products-mix/edit-product-mix/edit-product-mix.component.html +++ b/src/app/products/products-mix/edit-product-mix/edit-product-mix.component.html @@ -8,18 +8,24 @@
    - - {{ 'labels.inputs.Restricted products' | translate }} - - - {{ product.name }} - - - - {{ 'labels.commons.At least one restricted product' | translate }} - {{ 'labels.commons.must be selected' | translate }} - - + @if (productData) { + + {{ 'labels.inputs.Restricted products' | translate }} + + @for (product of productData; track product) { + + {{ product.name }} + + } + + @if (productMixForm.controls.restrictedProducts.hasError('required')) { + + {{ 'labels.commons.At least one restricted product' | translate }} + {{ 'labels.commons.must be selected' | translate }} + + } + + } diff --git a/src/app/products/products-mix/edit-product-mix/edit-product-mix.component.ts b/src/app/products/products-mix/edit-product-mix/edit-product-mix.component.ts index 92d94839f..a226b54bd 100644 --- a/src/app/products/products-mix/edit-product-mix/edit-product-mix.component.ts +++ b/src/app/products/products-mix/edit-product-mix/edit-product-mix.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, Validators, FormControl, ReactiveFormsModule } from '@angular/forms'; import { Router, ActivatedRoute, RouterLink } from '@angular/router'; @@ -19,6 +19,11 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class EditProductMixComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private productsService = inject(ProductsService); + private route = inject(ActivatedRoute); + private router = inject(Router); + /** Product mix form. */ productMixForm: UntypedFormGroup; /** Products mix template data. */ @@ -35,12 +40,7 @@ export class EditProductMixComponent implements OnInit { * @param {ActivatedRoute} route Activated Route. * @param {Router} router Router for navigation. */ - constructor( - private formBuilder: UntypedFormBuilder, - private productsService: ProductsService, - private route: ActivatedRoute, - private router: Router - ) { + constructor() { this.route.data.subscribe((data: { productMix: any }) => { this.productMixData = data.productMix; }); diff --git a/src/app/products/products-mix/products-mix-template.resolver.ts b/src/app/products/products-mix/products-mix-template.resolver.ts index 3f99520a4..4664ee978 100644 --- a/src/app/products/products-mix/products-mix-template.resolver.ts +++ b/src/app/products/products-mix/products-mix-template.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; /** rxjs Imports */ import { Observable } from 'rxjs'; @@ -12,10 +12,7 @@ import { ProductsService } from '../products.service'; */ @Injectable() export class ProductsMixTemplateResolver { - /** - * @param {ProductsService} productsService Products service. - */ - constructor(private productsService: ProductsService) {} + private productsService = inject(ProductsService); /** * Returns the products mix template data. diff --git a/src/app/products/products-mix/products-mix.component.ts b/src/app/products/products-mix/products-mix.component.ts index bd68dbad1..c605e2ebf 100644 --- a/src/app/products/products-mix/products-mix.component.ts +++ b/src/app/products/products-mix/products-mix.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, ViewChild } from '@angular/core'; +import { Component, OnInit, ViewChild, inject } from '@angular/core'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort, MatSortHeader } from '@angular/material/sort'; import { @@ -48,6 +48,8 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ProductsMixComponent implements OnInit { + private route = inject(ActivatedRoute); + /** productMix data. */ productMixData: any; /** Columns to be displayed in products mix table. */ @@ -63,7 +65,7 @@ export class ProductsMixComponent implements OnInit { * Retrieves the products data from `resolve`. * @param {ActivatedRoute} route Activated Route. */ - constructor(private route: ActivatedRoute) { + constructor() { this.route.data.subscribe((data: { products: any }) => { this.productMixData = data.products; }); diff --git a/src/app/products/products-mix/products-mix.resolver.ts b/src/app/products/products-mix/products-mix.resolver.ts index ce5cd2395..cb96cd970 100644 --- a/src/app/products/products-mix/products-mix.resolver.ts +++ b/src/app/products/products-mix/products-mix.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; /** rxjs Imports */ import { Observable } from 'rxjs'; @@ -12,10 +12,7 @@ import { ProductsService } from '../products.service'; */ @Injectable() export class ProductsMixResolver { - /** - * @param {ProductsService} productsService Products service. - */ - constructor(private productsService: ProductsService) {} + private productsService = inject(ProductsService); /** * Returns the products mix data. diff --git a/src/app/products/products-mix/view-product-mix/view-product-mix.component.ts b/src/app/products/products-mix/view-product-mix/view-product-mix.component.ts index eae3ac7f5..a59317404 100644 --- a/src/app/products/products-mix/view-product-mix/view-product-mix.component.ts +++ b/src/app/products/products-mix/view-product-mix/view-product-mix.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, ViewChild } from '@angular/core'; +import { Component, OnInit, ViewChild, inject } from '@angular/core'; import { MatDialog } from '@angular/material/dialog'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort, MatSortHeader } from '@angular/material/sort'; @@ -53,6 +53,12 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ViewProductMixComponent implements OnInit { + private route = inject(ActivatedRoute); + private dialog = inject(MatDialog); + private productsService = inject(ProductsService); + private router = inject(Router); + private translateService = inject(TranslateService); + /** Product mix data. */ productMixData: any; /** Allowed products datasource. */ @@ -78,13 +84,7 @@ export class ViewProductMixComponent implements OnInit { * @param {ActivatedRoute} route Activated Route. * @param {TranslateService} translateService Translate Service. */ - constructor( - private route: ActivatedRoute, - private dialog: MatDialog, - private productsService: ProductsService, - private router: Router, - private translateService: TranslateService - ) { + constructor() { this.route.data.subscribe((data: { productMix: any }) => { this.productMixData = data.productMix; }); diff --git a/src/app/products/products-mix/view-product-mix/view-product-mix.resolver.ts b/src/app/products/products-mix/view-product-mix/view-product-mix.resolver.ts index 2e6869596..fa64da67a 100644 --- a/src/app/products/products-mix/view-product-mix/view-product-mix.resolver.ts +++ b/src/app/products/products-mix/view-product-mix/view-product-mix.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { ProductsService } from '../../products.service'; */ @Injectable() export class ViewProductMixResolver { - /** - * @param {ProductsService} productsService Products service. - */ - constructor(private productsService: ProductsService) {} + private productsService = inject(ProductsService); /** * Returns the product mix. diff --git a/src/app/products/products-routing.module.ts b/src/app/products/products-routing.module.ts index 56a2279c7..991b44cab 100644 --- a/src/app/products/products-routing.module.ts +++ b/src/app/products/products-routing.module.ts @@ -888,7 +888,6 @@ const routes: Routes = [ ] } ]) - ]; /** diff --git a/src/app/products/products.component.html b/src/app/products/products.component.html index 3c77d0000..803c6c8a6 100644 --- a/src/app/products/products.component.html +++ b/src/app/products/products.component.html @@ -12,24 +12,28 @@
    {{ 'labels.heading.Loan Products' | translate }} - + @if (arrowBooleans[0]) { + + }
    @@ -44,24 +48,28 @@
    {{ 'labels.heading.Savings Products' | translate }} - + @if (arrowBooleans[1]) { + + }
    @@ -76,24 +84,28 @@
    {{ 'labels.heading.Share Products' | translate }} - + @if (arrowBooleans[2]) { + + }
    @@ -108,27 +120,31 @@
    {{ 'labels.heading.Charges' | translate }} - + @if (arrowBooleans[3]) { + + }
    @@ -142,24 +158,28 @@
    {{ 'labels.heading.Collateral Management' | translate }} - + @if (arrowBooleans[4]) { + + }
    @@ -175,29 +195,28 @@
    {{ 'labels.heading.Delinquency Buckets' | translate }} - + @if (arrowBooleans[5]) { + + }
    @@ -214,24 +233,28 @@
    {{ 'labels.heading.Products Mix' | translate }} - + @if (arrowBooleans[6]) { + + }
    @@ -245,29 +268,28 @@
    {{ 'labels.heading.Fixed Deposit Products' | translate }} - + @if (arrowBooleans[7]) { + + }
    @@ -285,29 +307,28 @@
    {{ 'labels.heading.Recurring Deposit Products' | translate }} - + @if (arrowBooleans[8]) { + + }
    @@ -321,24 +342,28 @@
    {{ 'labels.heading.Manage Tax Configurations' | translate }} - + @if (arrowBooleans[9]) { + + }
    @@ -351,24 +376,28 @@
    {{ 'labels.heading.Floating Rates' | translate }} -

    - {{ 'labels.text.Define floating rates for loan products' | translate }} -

    + @if (arrowBooleans[10]) { +

    + {{ 'labels.text.Define floating rates for loan products' | translate }} +

    + }
    diff --git a/src/app/products/products.component.ts b/src/app/products/products.component.ts index 566d63df2..0f4c80959 100644 --- a/src/app/products/products.component.ts +++ b/src/app/products/products.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { AfterViewInit, Component, ElementRef, TemplateRef, ViewChild } from '@angular/core'; +import { AfterViewInit, Component, ElementRef, TemplateRef, ViewChild, inject } from '@angular/core'; import { Router, RouterLink } from '@angular/router'; /** Custom Services */ @@ -28,6 +28,10 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ProductsComponent implements AfterViewInit { + private router = inject(Router); + private configurationWizardService = inject(ConfigurationWizardService); + private popoverService = inject(PopoverService); + /* Reference of charges */ @ViewChild('charges') charges: ElementRef; /* Template for popover on charges */ @@ -55,17 +59,6 @@ export class ProductsComponent implements AfterViewInit { // Initialize an array of 11 boolean values, all set to false arrowBooleans: boolean[] = new Array(11).fill(false); - /** - * @param {Router} router Router. - * @param {ConfigurationWizardService} configurationWizardService ConfigurationWizard Service. - * @param {PopoverService} popoverService PopoverService. - */ - constructor( - private router: Router, - private configurationWizardService: ConfigurationWizardService, - private popoverService: PopoverService - ) {} - /** * To show popover. */ diff --git a/src/app/products/products.service.ts b/src/app/products/products.service.ts index 0da88bf65..30dfea51a 100644 --- a/src/app/products/products.service.ts +++ b/src/app/products/products.service.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { HttpClient, HttpParams } from '@angular/common/http'; /** rxjs Imports */ @@ -15,14 +15,8 @@ import { SettingsService } from 'app/settings/settings.service'; providedIn: 'root' }) export class ProductsService { - /** - * @param {HttpClient} http Http Client to send requests. - * @param {SettingsService} settingsService Settings Service. - */ - constructor( - private http: HttpClient, - private settingsService: SettingsService - ) {} + private http = inject(HttpClient); + private settingsService = inject(SettingsService); /** * @returns {Observable} Loan products data diff --git a/src/app/products/recurring-deposit-products/create-recurring-deposit-product/create-recurring-deposit-product.component.html b/src/app/products/recurring-deposit-products/create-recurring-deposit-product/create-recurring-deposit-product.component.html index a7fc8c94e..32e5dc73e 100644 --- a/src/app/products/recurring-deposit-products/create-recurring-deposit-product/create-recurring-deposit-product.component.html +++ b/src/app/products/recurring-deposit-products/create-recurring-deposit-product/create-recurring-deposit-product.component.html @@ -92,17 +92,18 @@ - - {{ 'labels.inputs.PREVIEW' | translate }} - - - - + @if (recurringDepositProductFormValid) { + + {{ 'labels.inputs.PREVIEW' | translate }} + + + + } diff --git a/src/app/products/recurring-deposit-products/create-recurring-deposit-product/create-recurring-deposit-product.component.ts b/src/app/products/recurring-deposit-products/create-recurring-deposit-product/create-recurring-deposit-product.component.ts index a2cbe7015..8d5c1c75c 100644 --- a/src/app/products/recurring-deposit-products/create-recurring-deposit-product/create-recurring-deposit-product.component.ts +++ b/src/app/products/recurring-deposit-products/create-recurring-deposit-product/create-recurring-deposit-product.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, ViewChild } from '@angular/core'; +import { Component, ViewChild, inject } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; /** Custom Components */ @@ -42,6 +42,12 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class CreateRecurringDepositProductComponent { + private route = inject(ActivatedRoute); + private productsService = inject(ProductsService); + private router = inject(Router); + private settingsService = inject(SettingsService); + private accounting = inject(Accounting); + @ViewChild(RecurringDepositProductDetailsStepComponent, { static: true }) recurringDepositProductDetailsStep: RecurringDepositProductDetailsStepComponent; @ViewChild(RecurringDepositProductCurrencyStepComponent, { static: true }) @@ -67,13 +73,7 @@ export class CreateRecurringDepositProductComponent { * @param {SettingsService} settingsService Settings Service. */ - constructor( - private route: ActivatedRoute, - private productsService: ProductsService, - private router: Router, - private settingsService: SettingsService, - private accounting: Accounting - ) { + constructor() { this.route.data.subscribe((data: { recurringDepositProductsTemplate: any }) => { this.recurringDepositProductsTemplate = data.recurringDepositProductsTemplate; }); diff --git a/src/app/products/recurring-deposit-products/edit-recurring-deposit-product/edit-recurring-deposit-product.component.html b/src/app/products/recurring-deposit-products/edit-recurring-deposit-product/edit-recurring-deposit-product.component.html index e5fddebd3..1e5ae88c5 100644 --- a/src/app/products/recurring-deposit-products/edit-recurring-deposit-product/edit-recurring-deposit-product.component.html +++ b/src/app/products/recurring-deposit-products/edit-recurring-deposit-product/edit-recurring-deposit-product.component.html @@ -92,17 +92,18 @@ - - {{ 'labels.inputs.PREVIEW' | translate }} - - - - + @if (recurringDepositProductFormValidAndNotPrinstine) { + + {{ 'labels.inputs.PREVIEW' | translate }} + + + + } diff --git a/src/app/products/recurring-deposit-products/edit-recurring-deposit-product/edit-recurring-deposit-product.component.ts b/src/app/products/recurring-deposit-products/edit-recurring-deposit-product/edit-recurring-deposit-product.component.ts index 3cf86db91..420a8c39e 100644 --- a/src/app/products/recurring-deposit-products/edit-recurring-deposit-product/edit-recurring-deposit-product.component.ts +++ b/src/app/products/recurring-deposit-products/edit-recurring-deposit-product/edit-recurring-deposit-product.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, ViewChild } from '@angular/core'; +import { Component, ViewChild, inject } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; /** Custom Components */ @@ -42,6 +42,12 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class EditRecurringDepositProductComponent { + private route = inject(ActivatedRoute); + private productsService = inject(ProductsService); + private router = inject(Router); + private settingsService = inject(SettingsService); + private accounting = inject(Accounting); + @ViewChild(RecurringDepositProductDetailsStepComponent, { static: true }) recurringDepositProductDetailsStep: RecurringDepositProductDetailsStepComponent; @ViewChild(RecurringDepositProductCurrencyStepComponent, { static: true }) @@ -67,13 +73,7 @@ export class EditRecurringDepositProductComponent { * @param {SettingsService} settingsService Settings Service. */ - constructor( - private route: ActivatedRoute, - private productsService: ProductsService, - private router: Router, - private settingsService: SettingsService, - private accounting: Accounting - ) { + constructor() { this.route.data.subscribe((data: { recurringDepositProductAndTemplate: any }) => { this.recurringDepositProductsTemplate = data.recurringDepositProductAndTemplate; }); diff --git a/src/app/products/recurring-deposit-products/edit-recurring-deposit-product/recurring-deposit-product-and-template.resolver.ts b/src/app/products/recurring-deposit-products/edit-recurring-deposit-product/recurring-deposit-product-and-template.resolver.ts index 57b0cf4df..6f6e37563 100644 --- a/src/app/products/recurring-deposit-products/edit-recurring-deposit-product/recurring-deposit-product-and-template.resolver.ts +++ b/src/app/products/recurring-deposit-products/edit-recurring-deposit-product/recurring-deposit-product-and-template.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { ProductsService } from '../../products.service'; */ @Injectable() export class RecurringDepositProductAndTemplateResolver { - /** - * @param {ProductsService} productsService Products service. - */ - constructor(private productsService: ProductsService) {} + private productsService = inject(ProductsService); /** * Returns the Recurring Deposits Product and Template. diff --git a/src/app/products/recurring-deposit-products/recurring-deposit-product-stepper/recurring-deposit-product-accounting-step/recurring-deposit-product-accounting-step.component.html b/src/app/products/recurring-deposit-products/recurring-deposit-product-stepper/recurring-deposit-product-accounting-step/recurring-deposit-product-accounting-step.component.html index 3480b088b..73e7b0f9d 100644 --- a/src/app/products/recurring-deposit-products/recurring-deposit-product-stepper/recurring-deposit-product-accounting-step/recurring-deposit-product-accounting-step.component.html +++ b/src/app/products/recurring-deposit-products/recurring-deposit-product-stepper/recurring-deposit-product-accounting-step/recurring-deposit-product-accounting-step.component.html @@ -4,290 +4,264 @@ class="flex-98 layout-row gap-5percent layout-column.lt-md radio-group-spacing" formControlName="accountingRule" > - - {{ 'labels.accounting.' + accountingRule | translate }} - + @for (accountingRule of accountingRuleData; track accountingRule; let i = $index) { + + {{ 'labels.accounting.' + accountingRule | translate }} + + } -
    -

    {{ 'labels.heading.Assets' | translate }}

    - - - - - - - - - - - - -

    {{ 'labels.heading.Liabilities' | translate }}

    - - - - - - - - - - - - -

    {{ 'labels.heading.Expenses' | translate }}

    - - - - - - -

    {{ 'labels.heading.Income' | translate }}

    - - - - - - - - - -

    {{ 'labels.heading.Advanced Accounting Rules' | translate }}

    - - - -
    -
    -

    - {{ 'labels.heading.Configure Fund Sources for Payment Channels' | translate }} -

    - -
    - -
    - - +

    {{ 'labels.heading.Assets' | translate }}

    + + + @if (isAccrualAccounting()) { + - - - - - - - - - - - - - - - - - -
    {{ 'labels.inputs.Payment Type' | translate }} - {{ paymentFundSource.paymentTypeId | find: paymentTypeData : 'id' : 'name' }} - {{ 'labels.inputs.Fund Source' | translate }} - {{ paymentFundSource.fundSourceAccountId | find: assetAccountData : 'id' : 'name' }} - {{ 'labels.inputs.Actions' | translate }} + + } + @if (isAccrualAccounting()) { + + + } + +

    {{ 'labels.heading.Liabilities' | translate }}

    + + + + + @if (isAccrualAccounting()) { + + + } + +

    {{ 'labels.heading.Expenses' | translate }}

    + + + +

    {{ 'labels.heading.Income' | translate }}

    + + + + + +

    {{ 'labels.heading.Advanced Accounting Rules' | translate }}

    + + @if (recurringDepositProductAccountingForm.value.advancedAccountingRules) { +
    +
    +

    + {{ 'labels.heading.Configure Fund Sources for Payment Channels' | translate }} +

    +
    - -
    -
    -
    -

    {{ 'labels.heading.Map Fees to Specific Income Accounts' | translate }}

    - -
    - -
    - - - - - - - - - - - - - - - - - - - -
    {{ 'labels.inputs.Fees' | translate }} - {{ feesIncome.chargeId | find: chargeData : 'id' : 'name' }} - {{ 'labels.inputs.Income Account' | translate }} - {{ feesIncome.incomeAccountId | find: incomeAccountData : 'id' : 'name' }} - {{ 'labels.inputs.Actions' | translate }} - - -
    -
    - -
    -

    - {{ 'labels.heading.Map Penalties to Specific Income Accounts' | translate }} -

    - -
    - -
    - - - - - - - - - - - - - - - + + + + + + + + + + + + +
    {{ 'labels.inputs.Penalty' | translate }} - {{ penaltyIncome.chargeId | find: penaltyData : 'id' : 'name' }} - {{ 'labels.inputs.Income Account' | translate }} - {{ penaltyIncome.incomeAccountId | find: incomeAccountData : 'id' : 'name' }} - {{ 'labels.inputs.Actions' | translate }} - {{ 'labels.inputs.Payment Type' | translate }} + {{ paymentFundSource.paymentTypeId | find: paymentTypeData : 'id' : 'name' }} + {{ 'labels.inputs.Fund Source' | translate }} + {{ paymentFundSource.fundSourceAccountId | find: assetAccountData : 'id' : 'name' }} + {{ 'labels.inputs.Actions' | translate }} + + +
    + } +
    + @if (existCharges()) { +
    +

    {{ 'labels.heading.Map Fees to Specific Income Accounts' | translate }}

    +
    + +
    + @if (feeToIncomeAccountMappings.value.length !== 0) { + + + + + + + + + + + + + + + +
    {{ 'labels.inputs.Fees' | translate }} + {{ feesIncome.chargeId | find: chargeData : 'id' : 'name' }} + {{ 'labels.inputs.Income Account' | translate }} + {{ feesIncome.incomeAccountId | find: incomeAccountData : 'id' : 'name' }} + {{ 'labels.inputs.Actions' | translate }} + + +
    + } +
    + } + @if (existCharges()) { +
    +

    + {{ 'labels.heading.Map Penalties to Specific Income Accounts' | translate }} +

    +
    + +
    + @if (penaltyToIncomeAccountMappings.value.length !== 0) { + + + + + + + + + + + + + + + +
    {{ 'labels.inputs.Penalty' | translate }} + {{ penaltyIncome.chargeId | find: penaltyData : 'id' : 'name' }} + {{ 'labels.inputs.Income Account' | translate }} + {{ penaltyIncome.incomeAccountId | find: incomeAccountData : 'id' : 'name' }} + {{ 'labels.inputs.Actions' | translate }} + + +
    + } +
    + } +
    + }
    - + }
    diff --git a/src/app/products/recurring-deposit-products/recurring-deposit-product-stepper/recurring-deposit-product-accounting-step/recurring-deposit-product-accounting-step.component.ts b/src/app/products/recurring-deposit-products/recurring-deposit-product-stepper/recurring-deposit-product-accounting-step/recurring-deposit-product-accounting-step.component.ts index 3b9b0c5db..0c03bdb1a 100644 --- a/src/app/products/recurring-deposit-products/recurring-deposit-product-stepper/recurring-deposit-product-accounting-step/recurring-deposit-product-accounting-step.component.ts +++ b/src/app/products/recurring-deposit-products/recurring-deposit-product-stepper/recurring-deposit-product-accounting-step/recurring-deposit-product-accounting-step.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit, Input } from '@angular/core'; +import { Component, OnInit, Input, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, @@ -67,6 +67,11 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class RecurringDepositProductAccountingStepComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private dialog = inject(MatDialog); + private accounting = inject(Accounting); + private translateService = inject(TranslateService); + @Input() recurringDepositProductsTemplate: any; @Input() accountingRuleData: any; @Input() recurringDepositProductFormValid: boolean; @@ -92,12 +97,7 @@ export class RecurringDepositProductAccountingStepComponent implements OnInit { 'actions' ]; - constructor( - private formBuilder: UntypedFormBuilder, - private dialog: MatDialog, - private accounting: Accounting, - private translateService: TranslateService - ) { + constructor() { this.createrecurringDepositProductAccountingForm(); this.setConditionalControls(); } @@ -388,7 +388,6 @@ export class RecurringDepositProductAccountingStepComponent implements OnInit { required: true, order: 2 }) - ]; return formfields; } @@ -411,7 +410,6 @@ export class RecurringDepositProductAccountingStepComponent implements OnInit { required: true, order: 2 }) - ]; return formfields; } @@ -434,7 +432,6 @@ export class RecurringDepositProductAccountingStepComponent implements OnInit { required: true, order: 2 }) - ]; return formfields; } diff --git a/src/app/products/recurring-deposit-products/recurring-deposit-product-stepper/recurring-deposit-product-charges-step/recurring-deposit-product-charges-step.component.html b/src/app/products/recurring-deposit-products/recurring-deposit-product-stepper/recurring-deposit-product-charges-step/recurring-deposit-product-charges-step.component.html index 94f5bad98..2ce77f498 100644 --- a/src/app/products/recurring-deposit-products/recurring-deposit-product-stepper/recurring-deposit-product-charges-step/recurring-deposit-product-charges-step.component.html +++ b/src/app/products/recurring-deposit-products/recurring-deposit-product-stepper/recurring-deposit-product-charges-step/recurring-deposit-product-charges-step.component.html @@ -2,12 +2,11 @@ {{ 'labels.inputs.Charge' | translate }} - - {{ charge.name }} - + @for (charge of chargeData | chargesFilter: chargesDataSource : currencyCode.value; track charge) { + + {{ charge.name }} + + } diff --git a/src/app/products/recurring-deposit-products/recurring-deposit-product-stepper/recurring-deposit-product-charges-step/recurring-deposit-product-charges-step.component.ts b/src/app/products/recurring-deposit-products/recurring-deposit-product-stepper/recurring-deposit-product-charges-step/recurring-deposit-product-charges-step.component.ts index 6fe08177a..9e290c4fe 100644 --- a/src/app/products/recurring-deposit-products/recurring-deposit-product-stepper/recurring-deposit-product-charges-step/recurring-deposit-product-charges-step.component.ts +++ b/src/app/products/recurring-deposit-products/recurring-deposit-product-stepper/recurring-deposit-product-charges-step/recurring-deposit-product-charges-step.component.ts @@ -1,4 +1,4 @@ -import { Component, Input, OnInit } from '@angular/core'; +import { Component, Input, OnInit, inject } from '@angular/core'; import { UntypedFormControl } from '@angular/forms'; import { MatDialog } from '@angular/material/dialog'; @@ -46,6 +46,9 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class RecurringDepositProductChargesStepComponent implements OnInit { + dialog = inject(MatDialog); + private translateService = inject(TranslateService); + @Input() recurringDepositProductsTemplate: any; @Input() currencyCode: UntypedFormControl; @@ -60,11 +63,6 @@ export class RecurringDepositProductChargesStepComponent implements OnInit { 'action' ]; - constructor( - public dialog: MatDialog, - private translateService: TranslateService - ) {} - ngOnInit() { this.chargeData = this.recurringDepositProductsTemplate.chargeOptions; if (!(this.recurringDepositProductsTemplate === undefined) && this.recurringDepositProductsTemplate.id) { diff --git a/src/app/products/recurring-deposit-products/recurring-deposit-product-stepper/recurring-deposit-product-currency-step/recurring-deposit-product-currency-step.component.html b/src/app/products/recurring-deposit-products/recurring-deposit-product-stepper/recurring-deposit-product-currency-step/recurring-deposit-product-currency-step.component.html index d31e9b6a2..e3445c970 100644 --- a/src/app/products/recurring-deposit-products/recurring-deposit-product-stepper/recurring-deposit-product-currency-step/recurring-deposit-product-currency-step.component.html +++ b/src/app/products/recurring-deposit-products/recurring-deposit-product-stepper/recurring-deposit-product-currency-step/recurring-deposit-product-currency-step.component.html @@ -7,9 +7,11 @@ matTooltip="{{ 'tooltips.The currency in which the deposit will be disbursed' | translate }}" required > - - {{ currency.name }} - + @for (currency of currencyData; track currency) { + + {{ currency.name }} + + } {{ 'labels.inputs.Currency' | translate }} {{ 'labels.commons.is' | translate }} diff --git a/src/app/products/recurring-deposit-products/recurring-deposit-product-stepper/recurring-deposit-product-currency-step/recurring-deposit-product-currency-step.component.ts b/src/app/products/recurring-deposit-products/recurring-deposit-product-stepper/recurring-deposit-product-currency-step/recurring-deposit-product-currency-step.component.ts index 896c34b33..c1cfbe4b4 100644 --- a/src/app/products/recurring-deposit-products/recurring-deposit-product-stepper/recurring-deposit-product-currency-step/recurring-deposit-product-currency-step.component.ts +++ b/src/app/products/recurring-deposit-products/recurring-deposit-product-stepper/recurring-deposit-product-currency-step/recurring-deposit-product-currency-step.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit, Input } from '@angular/core'; +import { Component, OnInit, Input, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, Validators, ReactiveFormsModule } from '@angular/forms'; import { MatTooltip } from '@angular/material/tooltip'; import { MatStepperPrevious, MatStepperNext } from '@angular/material/stepper'; @@ -18,13 +18,15 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class RecurringDepositProductCurrencyStepComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + @Input() recurringDepositProductsTemplate: any; recurringDepositProductCurrencyForm: UntypedFormGroup; currencyData: any; - constructor(private formBuilder: UntypedFormBuilder) { + constructor() { this.createrecurringDepositProductCurrencyForm(); } diff --git a/src/app/products/recurring-deposit-products/recurring-deposit-product-stepper/recurring-deposit-product-details-step/recurring-deposit-product-details-step.component.html b/src/app/products/recurring-deposit-products/recurring-deposit-product-stepper/recurring-deposit-product-details-step/recurring-deposit-product-details-step.component.html index d64b41c2f..35784aad1 100644 --- a/src/app/products/recurring-deposit-products/recurring-deposit-product-stepper/recurring-deposit-product-details-step/recurring-deposit-product-details-step.component.html +++ b/src/app/products/recurring-deposit-products/recurring-deposit-product-stepper/recurring-deposit-product-details-step/recurring-deposit-product-details-step.component.html @@ -8,10 +8,12 @@ matTooltip="{{ 'tooltips.Product name is a unique identifier' | translate }}" required /> - - {{ 'labels.inputs.Product Name' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (recurringDepositProductDetailsForm.controls.name.hasError('required')) { + + {{ 'labels.inputs.Product Name' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } @@ -23,10 +25,12 @@ matTooltip="{{ 'tooltips.Short name is a unique identifier' | translate }}" required /> - - {{ 'labels.inputs.Short Name' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (recurringDepositProductDetailsForm.controls.shortName.hasError('required')) { + + {{ 'labels.inputs.Short Name' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } @@ -40,10 +44,12 @@ cdkTextareaAutosize cdkAutosizeMinRows="2" > - - {{ 'labels.inputs.Description' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (recurringDepositProductDetailsForm.controls.description.hasError('required')) { + + {{ 'labels.inputs.Description' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + }
    diff --git a/src/app/products/recurring-deposit-products/recurring-deposit-product-stepper/recurring-deposit-product-details-step/recurring-deposit-product-details-step.component.ts b/src/app/products/recurring-deposit-products/recurring-deposit-product-stepper/recurring-deposit-product-details-step/recurring-deposit-product-details-step.component.ts index 7fd759aa3..6991dfcef 100644 --- a/src/app/products/recurring-deposit-products/recurring-deposit-product-stepper/recurring-deposit-product-details-step/recurring-deposit-product-details-step.component.ts +++ b/src/app/products/recurring-deposit-products/recurring-deposit-product-stepper/recurring-deposit-product-details-step/recurring-deposit-product-details-step.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit, Input } from '@angular/core'; +import { Component, OnInit, Input, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, Validators, ReactiveFormsModule } from '@angular/forms'; import { MatTooltip } from '@angular/material/tooltip'; import { CdkTextareaAutosize } from '@angular/cdk/text-field'; @@ -20,11 +20,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class RecurringDepositProductDetailsStepComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + @Input() recurringDepositProductsTemplate: any; recurringDepositProductDetailsForm: UntypedFormGroup; - constructor(private formBuilder: UntypedFormBuilder) { + constructor() { this.createrecurringDepositProductDetailsForm(); } diff --git a/src/app/products/recurring-deposit-products/recurring-deposit-product-stepper/recurring-deposit-product-interest-rate-chart-step/recurring-deposit-product-interest-rate-chart-step.component.html b/src/app/products/recurring-deposit-products/recurring-deposit-product-stepper/recurring-deposit-product-interest-rate-chart-step/recurring-deposit-product-interest-rate-chart-step.component.html index 980fdf562..17da0f507 100644 --- a/src/app/products/recurring-deposit-products/recurring-deposit-product-stepper/recurring-deposit-product-interest-rate-chart-step/recurring-deposit-product-interest-rate-chart-step.component.html +++ b/src/app/products/recurring-deposit-products/recurring-deposit-product-stepper/recurring-deposit-product-interest-rate-chart-step/recurring-deposit-product-interest-rate-chart-step.component.html @@ -9,277 +9,277 @@ -
    - - -
    -
    - -
    - - - {{ 'labels.inputs.Name' | translate }} - - - {{ 'labels.inputs.Name' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - - - {{ 'labels.inputs.Description' | translate }} - - - {{ 'labels.inputs.Description' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - - - {{ 'labels.inputs.From Date' | translate }} - - - - - {{ 'labels.inputs.From Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - - - {{ 'labels.inputs.End Date' | translate }} - - - - - -
    - - {{ 'labels.inputs.Is primary grouping by amount?' | translate }} - -
    -
    - -
    - -
    -

    {{ 'labels.heading.It is required to add at least one Slab' | translate }}

    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    {{ 'labels.inputs.Period' | translate }} - {{ - chartSlab.fromPeriod + - ' - ' + - chartSlab.toPeriod + - ' ' + - (chartSlab.periodType | find: periodTypeData : 'id' : 'value') - }} - {{ 'labels.inputs.Amount Range' | translate }} - {{ chartSlab.amountRangeFrom + ' - ' + chartSlab.amountRangeTo }} - {{ 'labels.inputs.Interest' | translate }} - {{ chartSlab.annualInterestRate }} - {{ 'labels.inputs.Description' | translate }} - {{ chartSlab.description }} - {{ 'labels.inputs.Actions' | translate }} - - - - + +
    +
    + -
    - - + + + + {{ 'labels.inputs.Name' | translate }} + + @if (chart.get('name')?.touched && chart.get('name')?.hasError('required')) { + + {{ 'labels.inputs.Name' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + + {{ 'labels.inputs.Description' | translate }} + + @if (chart.get('description')?.touched && chart.get('description')?.hasError('required')) { + + {{ 'labels.inputs.Description' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + + {{ 'labels.inputs.From Date' | translate }} + + + + + {{ 'labels.inputs.From Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + + + {{ 'labels.inputs.End Date' | translate }} + + + + +
    + + {{ 'labels.inputs.Is primary grouping by amount?' | translate }} + +
    +
    + +
    + @if (chart.value.chartSlabs.length === 0) { +
    +

    {{ 'labels.heading.It is required to add at least one Slab' | translate }}

    +
    + } + @if (chart.value.chartSlabs.length !== 0) { +
    + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + - - - - -
    {{ 'labels.inputs.Period' | translate }} + {{ + chartSlab.fromPeriod + + ' - ' + + chartSlab.toPeriod + + ' ' + + (chartSlab.periodType | find: periodTypeData : 'id' : 'value') + }} + {{ 'labels.inputs.Amount Range' | translate }} + {{ chartSlab.amountRangeFrom + ' - ' + chartSlab.amountRangeTo }} + {{ 'labels.inputs.Interest' | translate }} + {{ chartSlab.annualInterestRate }} + {{ 'labels.inputs.Description' | translate }} + {{ chartSlab.description }} + {{ 'labels.inputs.Actions' | translate }} + {{ 'labels.inputs.Entity Type' | translate }} - {{ incentive.entityType | find: entityTypeData : 'id' : 'value' }} - {{ 'labels.inputs.Attribute Name' | translate }} - {{ incentive.attributeName | find: attributeNameData : 'id' : 'value' }} - {{ 'labels.inputs.Condition Type' | translate }} - {{ incentive.conditionType | find: conditionTypeData : 'id' : 'value' }} - {{ 'labels.inputs.Attribute Value' | translate }} - {{ incentive.attributeValue | find: genderData : 'id' : 'name' }} - {{ incentive.attributeValue }} - {{ - incentive.attributeValue | find: clientTypeData : 'id' : 'name' - }} - {{ - incentive.attributeValue | find: clientClassificationData : 'id' : 'name' - }} - {{ 'labels.inputs.Incentive Type' | translate }} - {{ incentive.incentiveType | find: incentiveTypeData : 'id' : 'value' }} - {{ 'labels.inputs.Interest' | translate }} - {{ incentive.amount }} - {{ 'labels.inputs.Actions' | translate }} + + + + + +
    + +

    + {{ 'labels.heading.Incentives' | translate }} +

    +
    - -
    - -
    -
    +
    + @if (chartSlab.incentives.length) { + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {{ 'labels.inputs.Entity Type' | translate }} + {{ incentive.entityType | find: entityTypeData : 'id' : 'value' }} + {{ 'labels.inputs.Attribute Name' | translate }} + {{ incentive.attributeName | find: attributeNameData : 'id' : 'value' }} + {{ 'labels.inputs.Condition Type' | translate }} + {{ incentive.conditionType | find: conditionTypeData : 'id' : 'value' }} + {{ 'labels.inputs.Attribute Value' | translate }} + @switch (incentive.attributeName) { + @case (2) { + {{ incentive.attributeValue | find: genderData : 'id' : 'name' }} + } + @case (3) { + {{ incentive.attributeValue }} + } + @case (4) { + {{ incentive.attributeValue | find: clientTypeData : 'id' : 'name' }} + } + @case (5) { + {{ + incentive.attributeValue | find: clientClassificationData : 'id' : 'name' + }} + } + } + {{ 'labels.inputs.Incentive Type' | translate }} + {{ incentive.incentiveType | find: incentiveTypeData : 'id' : 'value' }} + {{ 'labels.inputs.Interest' | translate }} + {{ incentive.amount }} + {{ 'labels.inputs.Actions' | translate }} + + +
    + } + +
    + + + + + + + } + - + }
    diff --git a/src/app/products/recurring-deposit-products/recurring-deposit-product-stepper/recurring-deposit-product-interest-rate-chart-step/recurring-deposit-product-interest-rate-chart-step.component.ts b/src/app/products/recurring-deposit-products/recurring-deposit-product-stepper/recurring-deposit-product-interest-rate-chart-step/recurring-deposit-product-interest-rate-chart-step.component.ts index 64083bf3a..1ba039d15 100644 --- a/src/app/products/recurring-deposit-products/recurring-deposit-product-stepper/recurring-deposit-product-interest-rate-chart-step/recurring-deposit-product-interest-rate-chart-step.component.ts +++ b/src/app/products/recurring-deposit-products/recurring-deposit-product-stepper/recurring-deposit-product-interest-rate-chart-step/recurring-deposit-product-interest-rate-chart-step.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, Input } from '@angular/core'; +import { Component, OnInit, Input, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, @@ -25,7 +25,7 @@ import { Dates } from 'app/core/utils/dates'; import { TranslateService } from '@ngx-translate/core'; import { MatButton, MatIconButton } from '@angular/material/button'; import { FaIconComponent } from '@fortawesome/angular-fontawesome'; -import { NgFor, NgIf, NgSwitch, NgSwitchCase } from '@angular/common'; + import { MatDivider } from '@angular/material/divider'; import { MatTooltip } from '@angular/material/tooltip'; import { MatCheckbox } from '@angular/material/checkbox'; @@ -53,8 +53,8 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; trigger('expandChartSlab', [ state('collapsed', style({ height: '0px', minHeight: '0' })), state('expanded', style({ height: '*' })), - transition('expanded <=> collapsed', animate('225ms cubic-bezier(0.4, 0.0, 0.2, 1)'))]) - + transition('expanded <=> collapsed', animate('225ms cubic-bezier(0.4, 0.0, 0.2, 1)')) + ]) ], imports: [ ...STANDALONE_SHARED_IMPORTS, @@ -69,8 +69,6 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; MatHeaderCell, MatCellDef, MatCell, - NgSwitch, - NgSwitchCase, MatHeaderRowDef, MatHeaderRow, MatRowDef, @@ -81,6 +79,12 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class RecurringDepositProductInterestRateChartStepComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + dialog = inject(MatDialog); + private dateUtils = inject(Dates); + private settingsService = inject(SettingsService); + private translateService = inject(TranslateService); + @Input() recurringDepositProductsTemplate: any; recurringDepositProductInterestRateChartForm: UntypedFormGroup; @@ -120,13 +124,7 @@ export class RecurringDepositProductInterestRateChartStepComponent implements On * @param {SettingsService} settingsService Settings Service. */ - constructor( - private formBuilder: UntypedFormBuilder, - public dialog: MatDialog, - private dateUtils: Dates, - private settingsService: SettingsService, - private translateService: TranslateService - ) { + constructor() { this.createrecurringDepositProductInterestRateChartForm(); } @@ -500,7 +498,6 @@ export class RecurringDepositProductInterestRateChartStepComponent implements On required: true, order: 7 }) - ]; return formfields; } diff --git a/src/app/products/recurring-deposit-products/recurring-deposit-product-stepper/recurring-deposit-product-preview-step/recurring-deposit-product-preview-step.component.html b/src/app/products/recurring-deposit-products/recurring-deposit-product-stepper/recurring-deposit-product-preview-step/recurring-deposit-product-preview-step.component.html index 0fb571c6b..31ea3fcaf 100644 --- a/src/app/products/recurring-deposit-products/recurring-deposit-product-stepper/recurring-deposit-product-preview-step/recurring-deposit-product-preview-step.component.html +++ b/src/app/products/recurring-deposit-products/recurring-deposit-product-stepper/recurring-deposit-product-preview-step/recurring-deposit-product-preview-step.component.html @@ -10,10 +10,12 @@ {{ recurringDepositProduct.shortName }}
    -
    - {{ 'labels.inputs.Description' | translate }}: - {{ recurringDepositProduct.description }} -
    + @if (recurringDepositProduct.description) { +
    + {{ 'labels.inputs.Description' | translate }}: + {{ recurringDepositProduct.description }} +
    + }

    {{ 'labels.inputs.Currency' | translate }}

    @@ -89,15 +91,17 @@

    {{ 'labels.heading.Settings' | translate }}

    -
    - {{ 'labels.inputs.Lock-in Period' | translate }}: - {{ - recurringDepositProduct.lockinPeriodFrequency + - ' ' + - (recurringDepositProduct.lockinPeriodFrequencyType - | find: recurringDepositProductsTemplate.lockinPeriodFrequencyTypeOptions : 'id' : 'value') - }} -
    + @if (recurringDepositProduct.lockinPeriodFrequency) { +
    + {{ 'labels.inputs.Lock-in Period' | translate }}: + {{ + recurringDepositProduct.lockinPeriodFrequency + + ' ' + + (recurringDepositProduct.lockinPeriodFrequencyType + | find: recurringDepositProductsTemplate.lockinPeriodFrequencyTypeOptions : 'id' : 'value') + }} +
    + }
    {{ 'labels.inputs.Minimum Deposit Term' | translate }}: @@ -109,425 +113,443 @@ }}
    -
    - {{ 'labels.inputs.And thereafter, in Multiples of' | translate }}: - {{ - recurringDepositProduct.inMultiplesOfDepositTerm + - ' ' + - (recurringDepositProduct.inMultiplesOfDepositTermTypeId - | find: recurringDepositProductsTemplate.periodFrequencyTypeOptions : 'id' : 'value') - }} -
    + @if (recurringDepositProduct.inMultiplesOfDepositTerm) { +
    + {{ 'labels.inputs.And thereafter, in Multiples of' | translate }}: + {{ + recurringDepositProduct.inMultiplesOfDepositTerm + + ' ' + + (recurringDepositProduct.inMultiplesOfDepositTermTypeId + | find: recurringDepositProductsTemplate.periodFrequencyTypeOptions : 'id' : 'value') + }} +
    + } -
    - {{ 'labels.inputs.Minimum Deposit Term' | translate }}: - {{ - recurringDepositProduct.maxDepositTerm + - ' ' + - (recurringDepositProduct.maxDepositTermTypeId - | find: recurringDepositProductsTemplate.periodFrequencyTypeOptions : 'id' : 'value') - }} -
    + @if (recurringDepositProduct.maxDepositTerm) { +
    + {{ 'labels.inputs.Minimum Deposit Term' | translate }}: + {{ + recurringDepositProduct.maxDepositTerm + + ' ' + + (recurringDepositProduct.maxDepositTermTypeId + | find: recurringDepositProductsTemplate.periodFrequencyTypeOptions : 'id' : 'value') + }} +
    + }
    {{ 'labels.inputs.Apply Penal Interest (less)' | translate }}: {{ recurringDepositProduct.preClosurePenalApplicable | yesNo }}
    -
    - {{ 'labels.inputs.Penal Interest' | translate }} (%): - {{ - recurringDepositProduct.preClosurePenalInterest + - '% (' + - (recurringDepositProduct.preClosurePenalInterestOnTypeId - | find: recurringDepositProductsTemplate.preClosurePenalInterestOnTypeOptions : 'id' : 'value') + - ')' - }} -
    + @if (recurringDepositProduct.preClosurePenalApplicable) { +
    + {{ 'labels.inputs.Penal Interest' | translate }} (%): + {{ + recurringDepositProduct.preClosurePenalInterest + + '% (' + + (recurringDepositProduct.preClosurePenalInterestOnTypeId + | find: recurringDepositProductsTemplate.preClosurePenalInterestOnTypeOptions : 'id' : 'value') + + ')' + }} +
    + } -
    - {{ 'labels.inputs.Recurring Deposit Type' | translate }}: - - {{ 'labels.text.Mandatory' | translate }} - - - {{ 'labels.text.Voluntary' | translate }} - -
    + @if (recurringDepositProduct.isMandatoryDeposit !== undefined) { +
    + {{ 'labels.inputs.Recurring Deposit Type' | translate }}: + @if (recurringDepositProduct.isMandatoryDeposit) { + + {{ 'labels.text.Mandatory' | translate }} + + } + @if (!recurringDepositProduct.isMandatoryDeposit) { + + {{ 'labels.text.Voluntary' | translate }} + + } +
    + }
    {{ 'labels.inputs.Withhold Tax is Applicable' | translate }}: {{ recurringDepositProduct.withHoldTax | yesNo }}
    -
    - {{ 'labels.inputs.Tax Group' | translate }}: - {{ - recurringDepositProduct.taxGroupId | find: recurringDepositProductsTemplate.taxGroupOptions : 'id' : 'name' - }} -
    - -
    -

    {{ 'labels.heading.Interest Rate Charts' | translate }}

    - - -
    -
    - {{ 'labels.inputs.Name' | translate }}: - {{ chart.name }} -
    - -
    - {{ 'labels.inputs.From Date' | translate }}: - {{ chart.fromDate | dateFormat }} -
    - -
    - {{ 'labels.inputs.End Date' | translate }}: - {{ chart.endDate | dateFormat }} -
    - -
    - {{ 'labels.inputs.Description' | translate }}: - {{ chart.description }} -
    - -
    - {{ 'labels.inputs.Primary Grouping by Amount' | translate }}: - {{ recurringDepositProduct.isPrimaryGroupingByAmount | yesNo }} -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    {{ 'labels.inputs.Period' | translate }} - {{ - chartSlab.fromPeriod + - ' - ' + - chartSlab.toPeriod + - ' ' + - (chartSlab.periodType - | find: recurringDepositProductsTemplate.chartTemplate.periodTypes : 'id' : 'value') - }} - {{ 'labels.inputs.Amount Range' | translate }} - {{ chartSlab.amountRangeFrom + ' - ' + chartSlab.amountRangeTo }} - {{ 'labels.inputs.Interest' | translate }}{{ chartSlab.annualInterestRate | formatNumber }} %{{ 'labels.inputs.Description' | translate }} - {{ chartSlab.description }} - {{ 'labels.inputs.Actions' | translate }} - - -
    - -

    - {{ 'labels.heading.Incentives' | translate }} -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    {{ 'labels.inputs.Entity Type' | translate }} - {{ - incentive.entityType - | find: recurringDepositProductsTemplate.chartTemplate.entityTypeOptions : 'id' : 'value' - }} - {{ 'labels.inputs.Attribute Name' | translate }} - {{ - incentive.attributeName - | find: recurringDepositProductsTemplate.chartTemplate.attributeNameOptions : 'id' : 'value' - }} - {{ 'labels.inputs.Condition Type' | translate }} - {{ - incentive.conditionType - | find: recurringDepositProductsTemplate.chartTemplate.conditionTypeOptions : 'id' : 'value' - }} - {{ 'labels.inputs.Attribute Value' | translate }} - {{ - incentive.attributeValue - | find: recurringDepositProductsTemplate.chartTemplate.genderOptions : 'id' : 'name' - }} - {{ incentive.attributeValue }} - {{ - incentive.attributeValue - | find: recurringDepositProductsTemplate.chartTemplate.clientTypeOptions : 'id' : 'name' - }} - {{ - incentive.attributeValue - | find - : recurringDepositProductsTemplate.chartTemplate.clientClassificationOptions - : 'id' - : 'name' - }} - {{ 'labels.inputs.Incentive Type' | translate }} - {{ - incentive.incentiveType - | find: recurringDepositProductsTemplate.chartTemplate.incentiveTypeOptions : 'id' : 'value' - }} - {{ 'labels.inputs.Amount' | translate }} - {{ incentive.amount | formatNumber }} -
    -
    -
    -
    - - + @if (recurringDepositProduct.withHoldTax) { +
    + {{ 'labels.inputs.Tax Group' | translate }}: + {{ + recurringDepositProduct.taxGroupId | find: recurringDepositProductsTemplate.taxGroupOptions : 'id' : 'name' + }}
    -
    + } -
    -

    {{ 'labels.heading.Charges' | translate }}

    + @if (recurringDepositProduct.charts.length !== 0) { +
    +

    {{ 'labels.heading.Interest Rate Charts' | translate }}

    + + @for (chart of recurringDepositProduct.charts; track chart; let chartIndex = $index) { +
    + @if (chart.name) { +
    + {{ 'labels.inputs.Name' | translate }}: + {{ chart.name }} +
    + } +
    + {{ 'labels.inputs.From Date' | translate }}: + {{ chart.fromDate | dateFormat }} +
    + @if (chart.endDate) { +
    + {{ 'labels.inputs.End Date' | translate }}: + {{ chart.endDate | dateFormat }} +
    + } + @if (chart.description) { +
    + {{ 'labels.inputs.Description' | translate }}: + {{ chart.description }} +
    + } +
    + {{ 'labels.inputs.Primary Grouping by Amount' | translate }}: + {{ recurringDepositProduct.isPrimaryGroupingByAmount | yesNo }} +
    + @if (chart.chartSlabs.length !== 0) { + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {{ 'labels.inputs.Period' | translate }} + {{ + chartSlab.fromPeriod + + ' - ' + + chartSlab.toPeriod + + ' ' + + (chartSlab.periodType + | find: recurringDepositProductsTemplate.chartTemplate.periodTypes : 'id' : 'value') + }} + {{ 'labels.inputs.Amount Range' | translate }} + {{ chartSlab.amountRangeFrom + ' - ' + chartSlab.amountRangeTo }} + {{ 'labels.inputs.Interest' | translate }}{{ chartSlab.annualInterestRate | formatNumber }} %{{ 'labels.inputs.Description' | translate }} + {{ chartSlab.description }} + {{ 'labels.inputs.Actions' | translate }} + + +
    + +

    + {{ 'labels.heading.Incentives' | translate }} +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {{ 'labels.inputs.Entity Type' | translate }} + {{ + incentive.entityType + | find + : recurringDepositProductsTemplate.chartTemplate.entityTypeOptions + : 'id' + : 'value' + }} + {{ 'labels.inputs.Attribute Name' | translate }} + {{ + incentive.attributeName + | find + : recurringDepositProductsTemplate.chartTemplate.attributeNameOptions + : 'id' + : 'value' + }} + {{ 'labels.inputs.Condition Type' | translate }} + {{ + incentive.conditionType + | find + : recurringDepositProductsTemplate.chartTemplate.conditionTypeOptions + : 'id' + : 'value' + }} + {{ 'labels.inputs.Attribute Value' | translate }} + @switch (incentive.attributeName) { + @case (2) { + {{ + incentive.attributeValue + | find: recurringDepositProductsTemplate.chartTemplate.genderOptions : 'id' : 'name' + }} + } + @case (3) { + {{ incentive.attributeValue }} + } + @case (4) { + {{ + incentive.attributeValue + | find + : recurringDepositProductsTemplate.chartTemplate.clientTypeOptions + : 'id' + : 'name' + }} + } + @case (5) { + {{ + incentive.attributeValue + | find + : recurringDepositProductsTemplate.chartTemplate.clientClassificationOptions + : 'id' + : 'name' + }} + } + } + {{ 'labels.inputs.Incentive Type' | translate }} + {{ + incentive.incentiveType + | find + : recurringDepositProductsTemplate.chartTemplate.incentiveTypeOptions + : 'id' + : 'value' + }} + {{ 'labels.inputs.Amount' | translate }} + {{ incentive.amount | formatNumber }} +
    +
    +
    +
    + } + +
    + } +
    + } - - - - - - - - - - - - - - - - - - - - - - - - -
    {{ 'labels.inputs.Name' | translate }} - {{ charge.name + ', ' + charge.currency.displaySymbol }} - {{ 'labels.inputs.Type' | translate }} - {{ charge.chargeCalculationType.value }} - {{ 'labels.inputs.Amount' | translate }} - {{ charge.amount }} - {{ 'labels.inputs.Collected On' | translate }} - {{ charge.chargeTimeType.value }} -
    -
    + @if (recurringDepositProduct.charges.length) { +
    +

    {{ 'labels.heading.Charges' | translate }}

    + + + + + + + + + + + + + + + + + + + + +
    {{ 'labels.inputs.Name' | translate }} + {{ charge.name + ', ' + charge.currency.displaySymbol }} + {{ 'labels.inputs.Type' | translate }} + {{ charge.chargeCalculationType.value }} + {{ 'labels.inputs.Amount' | translate }} + {{ charge.amount }} + {{ 'labels.inputs.Collected On' | translate }} + {{ charge.chargeTimeType.value }} +
    +
    + }

    {{ 'labels.heading.Accounting' | translate }}

    - - + @if (!isNoneAccounting()) { + + + } -
    -

    {{ 'labels.heading.Advanced Accounting Rules' | translate }}

    - - -
    -

    {{ 'labels.heading.Fund Sources for Payment Channels' | translate }}

    - - - - - - - - - - - - - - -
    {{ 'labels.inputs.Payment Type' | translate }} - {{ - paymentFundSource.paymentTypeId - | find: recurringDepositProductsTemplate.paymentTypeOptions : 'id' : 'name' - }} - {{ 'labels.inputs.Fund Source' | translate }} - {{ - paymentFundSource.fundSourceAccountId - | find: recurringDepositProductsTemplate.accountingMappingOptions.assetAccountOptions : 'id' : 'name' - }} -
    + @if ( + recurringDepositProduct.advancedAccountingRules && + (recurringDepositProduct.paymentChannelToFundSourceMappings?.length || + recurringDepositProduct.feeToIncomeAccountMappings?.length || + recurringDepositProduct.penaltyToIncomeAccountMappings?.length) + ) { +
    +

    {{ 'labels.heading.Advanced Accounting Rules' | translate }}

    + + @if (recurringDepositProduct.paymentChannelToFundSourceMappings?.length) { +
    +

    {{ 'labels.heading.Fund Sources for Payment Channels' | translate }}

    + + + + + + + + + + + +
    {{ 'labels.inputs.Payment Type' | translate }} + {{ + paymentFundSource.paymentTypeId + | find: recurringDepositProductsTemplate.paymentTypeOptions : 'id' : 'name' + }} + {{ 'labels.inputs.Fund Source' | translate }} + {{ + paymentFundSource.fundSourceAccountId + | find + : recurringDepositProductsTemplate.accountingMappingOptions.assetAccountOptions + : 'id' + : 'name' + }} +
    +
    + } + @if (recurringDepositProduct.feeToIncomeAccountMappings?.length) { +
    +

    {{ 'labels.heading.Fees to Specific Income Accounts' | translate }}

    + + + + + + + + + + + +
    {{ 'labels.inputs.Fees' | translate }} + {{ feesIncome.chargeId | find: recurringDepositProductsTemplate.chargeOptions : 'id' : 'name' }} + {{ 'labels.inputs.Income Account' | translate }} + {{ + feesIncome.incomeAccountId + | find + : recurringDepositProductsTemplate.accountingMappingOptions.incomeAccountOptions + : 'id' + : 'name' + }} +
    +
    + } + @if (recurringDepositProduct.penaltyToIncomeAccountMappings?.length) { +
    +

    {{ 'labels.heading.Penalties to Specific Income Accounts' | translate }}

    + + + + + + + + + + + +
    {{ 'labels.inputs.Penalty' | translate }} + {{ penaltyIncome.chargeId | find: recurringDepositProductsTemplate.penaltyOptions : 'id' : 'name' }} + {{ 'labels.inputs.Income Account' | translate }} + {{ + penaltyIncome.incomeAccountId + | find + : recurringDepositProductsTemplate.accountingMappingOptions.incomeAccountOptions + : 'id' + : 'name' + }} +
    +
    + }
    - -
    -

    {{ 'labels.heading.Fees to Specific Income Accounts' | translate }}

    - - - - - - - - - - - - - - -
    {{ 'labels.inputs.Fees' | translate }} - {{ feesIncome.chargeId | find: recurringDepositProductsTemplate.chargeOptions : 'id' : 'name' }} - {{ 'labels.inputs.Income Account' | translate }} - {{ - feesIncome.incomeAccountId - | find: recurringDepositProductsTemplate.accountingMappingOptions.incomeAccountOptions : 'id' : 'name' - }} -
    -
    - -
    -

    {{ 'labels.heading.Penalties to Specific Income Accounts' | translate }}

    - - - - - - - - - - - - - - -
    {{ 'labels.inputs.Penalty' | translate }} - {{ penaltyIncome.chargeId | find: recurringDepositProductsTemplate.penaltyOptions : 'id' : 'name' }} - {{ 'labels.inputs.Income Account' | translate }} - {{ - penaltyIncome.incomeAccountId - | find: recurringDepositProductsTemplate.accountingMappingOptions.incomeAccountOptions : 'id' : 'name' - }} -
    -
    -
    + }
    diff --git a/src/app/products/recurring-deposit-products/recurring-deposit-product-stepper/recurring-deposit-product-preview-step/recurring-deposit-product-preview-step.component.ts b/src/app/products/recurring-deposit-products/recurring-deposit-product-stepper/recurring-deposit-product-preview-step/recurring-deposit-product-preview-step.component.ts index 965a30601..3984eb358 100644 --- a/src/app/products/recurring-deposit-products/recurring-deposit-product-stepper/recurring-deposit-product-preview-step/recurring-deposit-product-preview-step.component.ts +++ b/src/app/products/recurring-deposit-products/recurring-deposit-product-stepper/recurring-deposit-product-preview-step/recurring-deposit-product-preview-step.component.ts @@ -1,9 +1,9 @@ -import { Component, OnInit, Input, Output, EventEmitter, OnChanges, SimpleChanges } from '@angular/core'; +import { Component, OnInit, Input, Output, EventEmitter, OnChanges, SimpleChanges, inject } from '@angular/core'; import { trigger, state, transition, animate, style } from '@angular/animations'; import { OptionData } from 'app/shared/models/option-data.model'; import { Accounting } from 'app/core/utils/accounting'; import { MatDivider } from '@angular/material/divider'; -import { NgIf, NgFor, NgSwitch, NgSwitchCase } from '@angular/common'; + import { MatTable, MatColumnDef, @@ -33,8 +33,8 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; trigger('expandChartSlab', [ state('collapsed', style({ height: '0px', minHeight: '0' })), state('expanded', style({ height: '*' })), - transition('expanded <=> collapsed', animate('225ms cubic-bezier(0.4, 0.0, 0.2, 1)'))]) - + transition('expanded <=> collapsed', animate('225ms cubic-bezier(0.4, 0.0, 0.2, 1)')) + ]) ], imports: [ ...STANDALONE_SHARED_IMPORTS, @@ -46,8 +46,6 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; MatCellDef, MatCell, FaIconComponent, - NgSwitch, - NgSwitchCase, MatHeaderRowDef, MatHeaderRow, MatRowDef, @@ -61,6 +59,8 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class RecurringDepositProductPreviewStepComponent implements OnInit, OnChanges { + private accounting = inject(Accounting); + @Input() recurringDepositProductsTemplate: any; @Input() chartSlabsDisplayedColumns: any[]; @Input() accountingRuleData: any; @@ -96,8 +96,6 @@ export class RecurringDepositProductPreviewStepComponent implements OnInit, OnCh accountingMappings: any = {}; accountingRule: OptionData; - constructor(private accounting: Accounting) {} - ngOnInit() { this.setCurrentValues(); } diff --git a/src/app/products/recurring-deposit-products/recurring-deposit-product-stepper/recurring-deposit-product-settings-step/recurring-deposit-product-settings-step.component.html b/src/app/products/recurring-deposit-products/recurring-deposit-product-stepper/recurring-deposit-product-settings-step/recurring-deposit-product-settings-step.component.html index bc2f29478..4c2dad522 100644 --- a/src/app/products/recurring-deposit-products/recurring-deposit-product-stepper/recurring-deposit-product-settings-step/recurring-deposit-product-settings-step.component.html +++ b/src/app/products/recurring-deposit-products/recurring-deposit-product-stepper/recurring-deposit-product-settings-step/recurring-deposit-product-settings-step.component.html @@ -27,12 +27,11 @@ {{ 'labels.inputs.Type' | translate }} - - {{ lockinPeriodFrequencyType.value }} - + @for (lockinPeriodFrequencyType of lockinPeriodFrequencyTypeData; track lockinPeriodFrequencyType) { + + {{ lockinPeriodFrequencyType.value }} + + } @@ -56,9 +55,11 @@ {{ 'labels.inputs.Frequency Type' | translate }} - - {{ periodFrequencyType.value }} - + @for (periodFrequencyType of periodFrequencyTypeData; track periodFrequencyType) { + + {{ periodFrequencyType.value }} + + } {{ 'labels.inputs.Minimum Deposit Term Frequency Type' | translate }} {{ 'labels.commons.is' | translate }} @@ -81,9 +82,11 @@ {{ 'labels.inputs.Type' | translate }} - - {{ periodFrequencyType.value }} - + @for (periodFrequencyType of periodFrequencyTypeData; track periodFrequencyType) { + + {{ periodFrequencyType.value }} + + } @@ -102,9 +105,11 @@ {{ 'labels.inputs.Type' | translate }} - - {{ periodFrequencyType.value }} - + @for (periodFrequencyType of periodFrequencyTypeData; track periodFrequencyType) { + + {{ periodFrequencyType.value }} + + } @@ -124,12 +129,11 @@ {{ 'labels.inputs.Period' | translate }} - - {{ preClosurePenalInterestOnType.value }} - + @for (preClosurePenalInterestOnType of preClosurePenalInterestOnTypeData; track preClosurePenalInterestOnType) { + + {{ preClosurePenalInterestOnType.value }} + + } @@ -139,18 +143,22 @@ {{ 'labels.inputs.Is Withhold Tax Applicable' | translate }} - - {{ 'labels.inputs.Tax Group' | translate }} - - - {{ taxGroup.name }} - - - - {{ 'labels.inputs.Tax Group' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - + @if (recurringDepositProductSettingsForm.value.withHoldTax) { + + {{ 'labels.inputs.Tax Group' | translate }} + + @for (taxGroup of taxGroupData; track taxGroup) { + + {{ taxGroup.name }} + + } + + + {{ 'labels.inputs.Tax Group' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + + }
    diff --git a/src/app/products/recurring-deposit-products/recurring-deposit-product-stepper/recurring-deposit-product-settings-step/recurring-deposit-product-settings-step.component.ts b/src/app/products/recurring-deposit-products/recurring-deposit-product-stepper/recurring-deposit-product-settings-step/recurring-deposit-product-settings-step.component.ts index 1df538935..e0f0d57f8 100644 --- a/src/app/products/recurring-deposit-products/recurring-deposit-product-stepper/recurring-deposit-product-settings-step/recurring-deposit-product-settings-step.component.ts +++ b/src/app/products/recurring-deposit-products/recurring-deposit-product-stepper/recurring-deposit-product-settings-step/recurring-deposit-product-settings-step.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit, Input } from '@angular/core'; +import { Component, OnInit, Input, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, @@ -28,6 +28,8 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class RecurringDepositProductSettingsStepComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + @Input() recurringDepositProductsTemplate: any; recurringDepositProductSettingsForm: UntypedFormGroup; @@ -37,7 +39,7 @@ export class RecurringDepositProductSettingsStepComponent implements OnInit { preClosurePenalInterestOnTypeData: any; taxGroupData: any; - constructor(private formBuilder: UntypedFormBuilder) { + constructor() { this.createrecurringDepositProductSettingsForm(); this.setConditionalControls(); } diff --git a/src/app/products/recurring-deposit-products/recurring-deposit-product-stepper/recurring-deposit-product-terms-step/recurring-deposit-product-terms-step.component.html b/src/app/products/recurring-deposit-products/recurring-deposit-product-stepper/recurring-deposit-product-terms-step/recurring-deposit-product-terms-step.component.html index f2c181bd2..3a846e18f 100644 --- a/src/app/products/recurring-deposit-products/recurring-deposit-product-stepper/recurring-deposit-product-terms-step/recurring-deposit-product-terms-step.component.html +++ b/src/app/products/recurring-deposit-products/recurring-deposit-product-stepper/recurring-deposit-product-terms-step/recurring-deposit-product-terms-step.component.html @@ -26,12 +26,11 @@ {{ 'labels.inputs.Interest Compounding Period' | translate }} - - {{ interestCompoundingPeriodType.value }} - + @for (interestCompoundingPeriodType of interestCompoundingPeriodTypeData; track interestCompoundingPeriodType) { + + {{ interestCompoundingPeriodType.value }} + + } {{ 'labels.inputs.Interest Compounding Period' | translate }} {{ 'labels.commons.is' | translate }} @@ -42,12 +41,11 @@ {{ 'labels.inputs.Interest Posting Period' | translate }} - - {{ interestPostingPeriodType.value }} - + @for (interestPostingPeriodType of interestPostingPeriodTypeData; track interestPostingPeriodType) { + + {{ interestPostingPeriodType.value }} + + } {{ 'labels.inputs.Interest Posting Period' | translate }} {{ 'labels.commons.is' | translate }} @@ -58,12 +56,11 @@ {{ 'labels.inputs.Interest Calculated using' | translate }} - - {{ interestCalculationType.value }} - + @for (interestCalculationType of interestCalculationTypeData; track interestCalculationType) { + + {{ interestCalculationType.value }} + + } {{ 'labels.inputs.Interest Calculated using' | translate }} {{ 'labels.commons.is' | translate }} @@ -74,12 +71,14 @@ {{ 'labels.inputs.Days in Year' | translate }} - - {{ interestCalculationDaysInYearType.value }} - + @for ( + interestCalculationDaysInYearType of interestCalculationDaysInYearTypeData; + track interestCalculationDaysInYearType + ) { + + {{ interestCalculationDaysInYearType.value }} + + } {{ 'labels.inputs.Days in Year' | translate }} {{ 'labels.commons.is' | translate }} diff --git a/src/app/products/recurring-deposit-products/recurring-deposit-product-stepper/recurring-deposit-product-terms-step/recurring-deposit-product-terms-step.component.ts b/src/app/products/recurring-deposit-products/recurring-deposit-product-stepper/recurring-deposit-product-terms-step/recurring-deposit-product-terms-step.component.ts index fd38ece54..6d14e1766 100644 --- a/src/app/products/recurring-deposit-products/recurring-deposit-product-stepper/recurring-deposit-product-terms-step/recurring-deposit-product-terms-step.component.ts +++ b/src/app/products/recurring-deposit-products/recurring-deposit-product-stepper/recurring-deposit-product-terms-step/recurring-deposit-product-terms-step.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit, Input } from '@angular/core'; +import { Component, OnInit, Input, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, Validators, ReactiveFormsModule } from '@angular/forms'; import { MatDivider } from '@angular/material/divider'; import { MatStepperPrevious, MatStepperNext } from '@angular/material/stepper'; @@ -18,6 +18,8 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class RecurringDepositProductTermsStepComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + @Input() recurringDepositProductsTemplate: any; recurringDepositProductTermsForm: UntypedFormGroup; @@ -27,7 +29,7 @@ export class RecurringDepositProductTermsStepComponent implements OnInit { interestCalculationTypeData: any; interestCalculationDaysInYearTypeData: any; - constructor(private formBuilder: UntypedFormBuilder) { + constructor() { this.createrecurringDepositProductTermsForm(); } diff --git a/src/app/products/recurring-deposit-products/recurring-deposit-product.resolver.ts b/src/app/products/recurring-deposit-products/recurring-deposit-product.resolver.ts index 30d8f858b..45e4b4713 100644 --- a/src/app/products/recurring-deposit-products/recurring-deposit-product.resolver.ts +++ b/src/app/products/recurring-deposit-products/recurring-deposit-product.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { ProductsService } from '../products.service'; */ @Injectable() export class RecurringDepositProductResolver { - /** - * @param {ProductsService} productsService Products service. - */ - constructor(private productsService: ProductsService) {} + private productsService = inject(ProductsService); /** * Returns the recurring deposit product data. diff --git a/src/app/products/recurring-deposit-products/recurring-deposit-products-template.resolver.ts b/src/app/products/recurring-deposit-products/recurring-deposit-products-template.resolver.ts index d3b96a564..65e5451e1 100644 --- a/src/app/products/recurring-deposit-products/recurring-deposit-products-template.resolver.ts +++ b/src/app/products/recurring-deposit-products/recurring-deposit-products-template.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; /** rxjs Imports */ import { Observable } from 'rxjs'; @@ -9,7 +9,7 @@ import { ProductsService } from '../products.service'; @Injectable() export class RecurringDepositProductsTemplateResolver { - constructor(private productsService: ProductsService) {} + private productsService = inject(ProductsService); /** * Returns the recurring deposit products template data. diff --git a/src/app/products/recurring-deposit-products/recurring-deposit-products.component.ts b/src/app/products/recurring-deposit-products/recurring-deposit-products.component.ts index 7de5753b5..2a5751075 100644 --- a/src/app/products/recurring-deposit-products/recurring-deposit-products.component.ts +++ b/src/app/products/recurring-deposit-products/recurring-deposit-products.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, TemplateRef, ElementRef, ViewChild, AfterViewInit } from '@angular/core'; +import { Component, OnInit, TemplateRef, ElementRef, ViewChild, AfterViewInit, inject } from '@angular/core'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort, MatSortHeader } from '@angular/material/sort'; import { @@ -58,6 +58,12 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class RecurringDepositProductsComponent implements OnInit, AfterViewInit { + private route = inject(ActivatedRoute); + private router = inject(Router); + private dialog = inject(MatDialog); + private configurationWizardService = inject(ConfigurationWizardService); + private popoverService = inject(PopoverService); + /** Data table data. */ recurringDepositProductData: any; /** Columns to be displayed in recurring deposit products table. */ @@ -89,13 +95,7 @@ export class RecurringDepositProductsComponent implements OnInit, AfterViewInit * @param {ConfigurationWizardService} configurationWizardService ConfigurationWizard Service. * @param {PopoverService} popoverService PopoverService. */ - constructor( - private route: ActivatedRoute, - private router: Router, - private dialog: MatDialog, - private configurationWizardService: ConfigurationWizardService, - private popoverService: PopoverService - ) { + constructor() { this.route.data.subscribe((data: { recurringDepositProducts: any }) => { this.recurringDepositProductData = data.recurringDepositProducts; }); diff --git a/src/app/products/recurring-deposit-products/recurring-deposit-products.resolver.ts b/src/app/products/recurring-deposit-products/recurring-deposit-products.resolver.ts index de2985320..5b591327f 100644 --- a/src/app/products/recurring-deposit-products/recurring-deposit-products.resolver.ts +++ b/src/app/products/recurring-deposit-products/recurring-deposit-products.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; /** rxjs Imports */ import { Observable } from 'rxjs'; @@ -12,10 +12,7 @@ import { ProductsService } from '../products.service'; */ @Injectable() export class RecurringDepositProductsResolver { - /** - * @param {ProductsService} productsService Products service. - */ - constructor(private productsService: ProductsService) {} + private productsService = inject(ProductsService); /** * Returns the recurring deposit products data. diff --git a/src/app/products/recurring-deposit-products/view-recurring-deposit-product/recurring-deposit-datatable-tab/recurring-deposit-datatable-tab.component.ts b/src/app/products/recurring-deposit-products/view-recurring-deposit-product/recurring-deposit-datatable-tab/recurring-deposit-datatable-tab.component.ts index 600266028..4f4a8242e 100644 --- a/src/app/products/recurring-deposit-products/view-recurring-deposit-product/recurring-deposit-datatable-tab/recurring-deposit-datatable-tab.component.ts +++ b/src/app/products/recurring-deposit-products/view-recurring-deposit-product/recurring-deposit-datatable-tab/recurring-deposit-datatable-tab.component.ts @@ -1,4 +1,4 @@ -import { Component } from '@angular/core'; +import { Component, inject } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; import { EntityDatatableTabComponent } from '../../../../shared/tabs/entity-datatable-tab/entity-datatable-tab.component'; import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; @@ -13,11 +13,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class RecurringDepositDatatableTabComponent { + private route = inject(ActivatedRoute); + entityId: string; entityDatatable: any; multiRowDatatableFlag: boolean; - constructor(private route: ActivatedRoute) { + constructor() { this.entityId = this.route.parent.parent.snapshot.paramMap.get('productId'); this.route.data.subscribe((data: { recurringDepositDatatable: any }) => { diff --git a/src/app/products/recurring-deposit-products/view-recurring-deposit-product/recurring-deposit-general-tab/recurring-deposit-general-tab.component.html b/src/app/products/recurring-deposit-products/view-recurring-deposit-product/recurring-deposit-general-tab/recurring-deposit-general-tab.component.html index 126e68b2f..c2c0b42be 100644 --- a/src/app/products/recurring-deposit-products/view-recurring-deposit-product/recurring-deposit-general-tab/recurring-deposit-general-tab.component.html +++ b/src/app/products/recurring-deposit-products/view-recurring-deposit-product/recurring-deposit-general-tab/recurring-deposit-general-tab.component.html @@ -22,10 +22,12 @@ {{ recurringDepositProduct.shortName }}
    -
    - {{ 'labels.inputs.Description' | translate }}: - {{ recurringDepositProduct.description }} -
    + @if (recurringDepositProduct.description) { +
    + {{ 'labels.inputs.Description' | translate }}: + {{ recurringDepositProduct.description }} +
    + }

    {{ 'labels.inputs.Currency' | translate }}

    @@ -92,315 +94,350 @@ -
    - {{ 'labels.inputs.Lock-in Period' | translate }}: - - {{ recurringDepositProduct.lockinPeriodFrequency }} - {{ recurringDepositProduct.lockinPeriodFrequencyType.value }} -
    + @if (recurringDepositProduct.lockinPeriodFrequency) { +
    + {{ 'labels.inputs.Lock-in Period' | translate }}: + @if (recurringDepositProduct.lockinPeriodFrequency !== undefined) { + + {{ recurringDepositProduct.lockinPeriodFrequency }} + {{ recurringDepositProduct.lockinPeriodFrequencyType.value }} + } +
    + } -
    - {{ 'labels.inputs.Minimum Deposit Term' | translate }}: - {{ recurringDepositProduct.minDepositTerm }} -   - {{ recurringDepositProduct.minDepositTermType.value }} -
    + @if (recurringDepositProduct.minDepositTerm) { +
    + {{ 'labels.inputs.Minimum Deposit Term' | translate }}: + @if (recurringDepositProduct.minDepositTerm !== undefined) { + {{ recurringDepositProduct.minDepositTerm }} +   + {{ recurringDepositProduct.minDepositTermType.value }} + } +
    + } -
    - {{ 'labels.inputs.Maximum Deposit Term' | translate }}: - {{ recurringDepositProduct.maxDepositTerm }} -   - {{ recurringDepositProduct.maxDepositTermType.value }} -
    + @if (recurringDepositProduct.maxDepositTerm) { +
    + {{ 'labels.inputs.Maximum Deposit Term' | translate }}: + @if (recurringDepositProduct.maxDepositTerm !== undefined) { + {{ recurringDepositProduct.maxDepositTerm }} +   + {{ recurringDepositProduct.maxDepositTermType.value }} + } +
    + } -
    - {{ 'labels.inputs.Deposit Term In multiple of' | translate }}: - {{ recurringDepositProduct.inMultipleOfDepositTerm }} - - - {{ recurringDepositProduct.inMultipleOfDepositTermType.value }} -
    + @if (recurringDepositProduct.inMultipleOfDepositTerm) { +
    + {{ 'labels.inputs.Deposit Term In multiple of' | translate }}: + @if (recurringDepositProduct.inMultipleOfDepositTerm !== undefined) { + {{ recurringDepositProduct.inMultipleOfDepositTerm }} + - + {{ recurringDepositProduct.inMultipleOfDepositTermType.value }} + } +
    + } -
    - {{ 'labels.inputs.Recurring Deposit Type' | translate }}: - - {{ 'labels.text.Mandatory' | translate }} - - - {{ 'labels.text.Voluntary' | translate }} - -
    + @if (recurringDepositProduct.isMandatoryDeposit !== undefined) { +
    + {{ 'labels.inputs.Recurring Deposit Type' | translate }}: + @if (recurringDepositProduct.isMandatoryDeposit) { + + {{ 'labels.text.Mandatory' | translate }} + + } + @if (!recurringDepositProduct.isMandatoryDeposit) { + + {{ 'labels.text.Voluntary' | translate }} + + } +
    + } -
    - {{ 'labels.inputs.Apply penal interest (less)' | translate }}: - {{ recurringDepositProduct.preClosurePenalInterest }}%On - {{ recurringDepositProduct.preClosurePenalInterestOnType.value }} - -
    + @if (recurringDepositProduct.preClosurePenalInterest) { +
    + {{ 'labels.inputs.Apply penal interest (less)' | translate }}: + {{ recurringDepositProduct.preClosurePenalInterest }}%On + {{ recurringDepositProduct.preClosurePenalInterestOnType.value }} + +
    + }
    {{ 'labels.inputs.Withhold Tax is Applicable' | translate }}: {{ recurringDepositProduct.withHoldTax | yesNo }}
    -
    - {{ 'labels.inputs.Withhold Tax group' | translate }}: - {{ recurringDepositProduct.taxGroup.name }} -
    - -
    -

    {{ 'labels.heading.Interest Rate Charts' | translate }}

    - - - -
    -
    - {{ 'labels.inputs.Name' | translate }}: - {{ recurringDepositProduct.activeChart.name }} -
    - -
    - {{ 'labels.inputs.Valid from Date' | translate }}: - {{ recurringDepositProduct.activeChart.fromDate | dateFormat }} -
    - -
    - {{ 'labels.inputs.End Date' | translate }}: - {{ recurringDepositProduct.activeChart.endDate | dateFormat }} -
    - -
    - {{ 'labels.inputs.Description' | translate }}: - {{ recurringDepositProduct.activeChart.description }} -
    - -
    - {{ 'labels.inputs.Primary Grouping by Amount' | translate }}: - {{ recurringDepositProduct.activeChart.isPrimaryGroupingByAmount | yesNo }} -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    {{ 'labels.inputs.Period' | translate }} -
    - {{ chartSlab.fromPeriod }} - {{ chartSlab.toPeriod }} {{ chartSlab.periodType.value }} -
    -
     
    -
    {{ 'labels.inputs.Amount Range' | translate }} -
    - {{ chartSlab.amountRangeFrom }} - {{ chartSlab.amountRangeTo }} -
    - -
     
    -
    {{ 'labels.inputs.Interest' | translate }} - {{ chartSlab.annualInterestRate }} - {{ 'labels.inputs.Description' | translate }} - {{ chartSlab.description }} - {{ 'labels.inputs.Actions' | translate }} - - -
    - -

    - {{ 'labels.heading.Incentives' | translate }} -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    {{ 'labels.inputs.Entity Type' | translate }} - {{ - incentive.entityType - | find: recurringDepositProductTemplate.chartTemplate.entityTypeOptions : 'id' : 'value' - }} - {{ 'labels.inputs.Attribute Name' | translate }} - {{ - incentive.attributeName - | find - : recurringDepositProductTemplate.chartTemplate.attributeNameOptions - : 'id' - : 'value' - }} - {{ 'labels.inputs.Condition Type' | translate }} - {{ - incentive.conditionType - | find - : recurringDepositProductTemplate.chartTemplate.conditionTypeOptions - : 'id' - : 'value' - }} - {{ 'labels.inputs.Attribute Value' | translate }} - {{ - incentive.attributeValue - | find: recurringDepositProductTemplate.chartTemplate.genderOptions : 'id' : 'name' - }} - {{ incentive.attributeValue }} - {{ - incentive.attributeValue - | find: recurringDepositProductTemplate.chartTemplate.clientTypeOptions : 'id' : 'name' - }} - {{ - incentive.attributeValue - | find - : recurringDepositProductTemplate.chartTemplate.clientClassificationOptions - : 'id' - : 'name' - }} - {{ 'labels.inputs.Incentive Type' | translate }} - {{ - incentive.incentiveType - | find - : recurringDepositProductTemplate.chartTemplate.incentiveTypeOptions - : 'id' - : 'value' - }} - {{ 'labels.inputs.Amount' | translate }} - {{ incentive.amount }} -
    -
    -
    -
    - - + @if (recurringDepositProduct.withHoldTax) { +
    + {{ 'labels.inputs.Withhold Tax group' | translate }}: + {{ recurringDepositProduct.taxGroup.name }}
    -
    + } -
    -

    {{ 'labels.heading.Charges' | translate }}

    + @if (recurringDepositProduct.activeChart) { +
    +

    {{ 'labels.heading.Interest Rate Charts' | translate }}

    + +
    + @if (recurringDepositProduct.activeChart.name) { +
    + {{ 'labels.inputs.Name' | translate }}: + {{ recurringDepositProduct.activeChart.name }} +
    + } +
    + {{ 'labels.inputs.Valid from Date' | translate }}: + {{ recurringDepositProduct.activeChart.fromDate | dateFormat }} +
    + @if (recurringDepositProduct.activeChart.endDate) { +
    + {{ 'labels.inputs.End Date' | translate }}: + {{ recurringDepositProduct.activeChart.endDate | dateFormat }} +
    + } + @if (recurringDepositProduct.activeChart.description) { +
    + {{ 'labels.inputs.Description' | translate }}: + {{ recurringDepositProduct.activeChart.description }} +
    + } +
    + {{ 'labels.inputs.Primary Grouping by Amount' | translate }}: + {{ recurringDepositProduct.activeChart.isPrimaryGroupingByAmount | yesNo }} +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {{ 'labels.inputs.Period' | translate }} + @if (chartSlab.fromPeriod !== undefined) { +
    {{ chartSlab.fromPeriod }} - {{ chartSlab.toPeriod }} {{ chartSlab.periodType.value }}
    + } + @if (chartSlab.fromPeriod === undefined) { +
     
    + } +
    {{ 'labels.inputs.Amount Range' | translate }} + @if (chartSlab.amountRangeFrom !== undefined) { +
    {{ chartSlab.amountRangeFrom }} - {{ chartSlab.amountRangeTo }}
    + } + @if (chartSlab.amountRangeFrom === undefined) { +
     
    + } +
    {{ 'labels.inputs.Interest' | translate }} + {{ chartSlab.annualInterestRate }} + {{ 'labels.inputs.Description' | translate }} + {{ chartSlab.description }} + {{ 'labels.inputs.Actions' | translate }} + + +
    + +

    + {{ 'labels.heading.Incentives' | translate }} +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {{ 'labels.inputs.Entity Type' | translate }} + {{ + incentive.entityType + | find + : recurringDepositProductTemplate.chartTemplate.entityTypeOptions + : 'id' + : 'value' + }} + {{ 'labels.inputs.Attribute Name' | translate }} + {{ + incentive.attributeName + | find + : recurringDepositProductTemplate.chartTemplate.attributeNameOptions + : 'id' + : 'value' + }} + {{ 'labels.inputs.Condition Type' | translate }} + {{ + incentive.conditionType + | find + : recurringDepositProductTemplate.chartTemplate.conditionTypeOptions + : 'id' + : 'value' + }} + {{ 'labels.inputs.Attribute Value' | translate }} + @switch (incentive.attributeName) { + @case (2) { + {{ + incentive.attributeValue + | find + : recurringDepositProductTemplate.chartTemplate.genderOptions + : 'id' + : 'name' + }} + } + @case (3) { + {{ incentive.attributeValue }} + } + @case (4) { + {{ + incentive.attributeValue + | find + : recurringDepositProductTemplate.chartTemplate.clientTypeOptions + : 'id' + : 'name' + }} + } + @case (5) { + {{ + incentive.attributeValue + | find + : recurringDepositProductTemplate.chartTemplate.clientClassificationOptions + : 'id' + : 'name' + }} + } + } + {{ 'labels.inputs.Incentive Type' | translate }} + {{ + incentive.incentiveType + | find + : recurringDepositProductTemplate.chartTemplate.incentiveTypeOptions + : 'id' + : 'value' + }} + {{ 'labels.inputs.Amount' | translate }} + {{ incentive.amount }} +
    +
    +
    +
    + +
    +
    + } - - - - - - - - - - - - - - - - - - - - - - - - - -
    {{ 'labels.inputs.Name' | translate }} - {{ charge.name }} - {{ 'labels.inputs.Type' | translate }} - {{ charge.chargeCalculationType.value }} - {{ 'labels.inputs.Amount' | translate }} - {{ charge.amount | formatNumber }} - {{ 'labels.inputs.Collected On' | translate }} - {{ charge.chargeTimeType.value }} -
    -
    + @if (recurringDepositProduct.charges.length) { +
    +

    {{ 'labels.heading.Charges' | translate }}

    + + + + + + + + + + + + + + + + + + + + +
    {{ 'labels.inputs.Name' | translate }} + {{ charge.name }} + {{ 'labels.inputs.Type' | translate }} + {{ charge.chargeCalculationType.value }} + {{ 'labels.inputs.Amount' | translate }} + {{ charge.amount | formatNumber }} + {{ 'labels.inputs.Collected On' | translate }} + {{ charge.chargeTimeType.value }} +
    +
    + }

    {{ 'labels.heading.Accounting' | translate }}

    @@ -413,110 +450,93 @@ > -
    -

    {{ 'labels.inputs.Advanced Accounting Rules' | translate }}

    - - - -
    -

    - {{ 'labels.inputs.Configure Fund Sources for Payment Channels' | translate }} -

    - - - - - - - - - - - - - - -
    {{ 'labels.inputs.Payment Type' | translate }} - {{ paymentFundSource.paymentType.name }} - {{ 'labels.inputs.Fund Source' | translate }} - {{ paymentFundSource.fundSourceAccount.name }} -
    + @if ( + recurringDepositProduct.paymentChannelToFundSourceMappings?.length || + recurringDepositProduct.feeToIncomeAccountMappings?.length || + recurringDepositProduct.penaltyToIncomeAccountMappings?.length + ) { +
    +

    {{ 'labels.inputs.Advanced Accounting Rules' | translate }}

    + + @if (recurringDepositProduct.paymentChannelToFundSourceMappings?.length) { +
    +

    + {{ 'labels.inputs.Configure Fund Sources for Payment Channels' | translate }} +

    + + + + + + + + + + + +
    {{ 'labels.inputs.Payment Type' | translate }} + {{ paymentFundSource.paymentType.name }} + {{ 'labels.inputs.Fund Source' | translate }} + {{ paymentFundSource.fundSourceAccount.name }} +
    +
    + } + @if (recurringDepositProduct.feeToIncomeAccountMappings?.length) { +
    +

    {{ 'labels.inputs.Fees to Specific Income Accounts' | translate }}

    + + + + + + + + + + + +
    {{ 'labels.inputs.Fees' | translate }} + {{ feesIncome.charge.name }} + {{ 'labels.inputs.Income Account' | translate }} + {{ feesIncome.incomeAccount.name }} +
    +
    + } + @if (recurringDepositProduct.penaltyToIncomeAccountMappings?.length) { +
    +

    {{ 'labels.inputs.Penalties to Specific Income Accounts' | translate }}

    + + + + + + + + + + + +
    {{ 'labels.inputs.Penalty' | translate }} + {{ penaltyIncome.charge.name }} + {{ 'labels.inputs.Income Account' | translate }} + {{ penaltyIncome.incomeAccount.name }} +
    +
    + }
    - -
    -

    {{ 'labels.inputs.Fees to Specific Income Accounts' | translate }}

    - - - - - - - - - - - - - - -
    {{ 'labels.inputs.Fees' | translate }} - {{ feesIncome.charge.name }} - {{ 'labels.inputs.Income Account' | translate }} - {{ feesIncome.incomeAccount.name }} -
    -
    - -
    -

    {{ 'labels.inputs.Penalties to Specific Income Accounts' | translate }}

    - - - - - - - - - - - - - - -
    {{ 'labels.inputs.Penalty' | translate }} - {{ penaltyIncome.charge.name }} - {{ 'labels.inputs.Income Account' | translate }} - {{ penaltyIncome.incomeAccount.name }} -
    -
    -
    + }
    diff --git a/src/app/products/recurring-deposit-products/view-recurring-deposit-product/recurring-deposit-general-tab/recurring-deposit-general-tab.component.ts b/src/app/products/recurring-deposit-products/view-recurring-deposit-product/recurring-deposit-general-tab/recurring-deposit-general-tab.component.ts index 7fc623daf..c9350f6e0 100644 --- a/src/app/products/recurring-deposit-products/view-recurring-deposit-product/recurring-deposit-general-tab/recurring-deposit-general-tab.component.ts +++ b/src/app/products/recurring-deposit-products/view-recurring-deposit-product/recurring-deposit-general-tab/recurring-deposit-general-tab.component.ts @@ -1,9 +1,9 @@ -import { Component } from '@angular/core'; +import { Component, inject } from '@angular/core'; import { ActivatedRoute, RouterLink } from '@angular/router'; import { trigger, state, transition, animate, style } from '@angular/animations'; import { FaIconComponent } from '@fortawesome/angular-fontawesome'; import { MatDivider } from '@angular/material/divider'; -import { NgIf, NgSwitch, NgSwitchCase } from '@angular/common'; + import { MatTable, MatColumnDef, @@ -31,8 +31,8 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; trigger('expandChartSlab', [ state('collapsed', style({ height: '0px', minHeight: '0' })), state('expanded', style({ height: '*' })), - transition('expanded <=> collapsed', animate('225ms cubic-bezier(0.4, 0.0, 0.2, 1)'))]) - + transition('expanded <=> collapsed', animate('225ms cubic-bezier(0.4, 0.0, 0.2, 1)')) + ]) ], imports: [ ...STANDALONE_SHARED_IMPORTS, @@ -44,8 +44,6 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; MatHeaderCell, MatCellDef, MatCell, - NgSwitch, - NgSwitchCase, MatHeaderRowDef, MatHeaderRow, MatRowDef, @@ -58,6 +56,8 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class RecurringDepositGeneralTabComponent { + private route = inject(ActivatedRoute); + recurringDepositProduct: any; recurringDepositProductTemplate: any; @@ -92,7 +92,7 @@ export class RecurringDepositGeneralTabComponent { 'incomeAccountId' ]; - constructor(private route: ActivatedRoute) { + constructor() { this.route.data.subscribe((data: { recurringDepositProduct: any; recurringDepositProductsTemplate: any }) => { this.recurringDepositProduct = data.recurringDepositProduct; this.recurringDepositProductTemplate = data.recurringDepositProductsTemplate; diff --git a/src/app/products/recurring-deposit-products/view-recurring-deposit-product/view-recurring-deposit-product.component.html b/src/app/products/recurring-deposit-products/view-recurring-deposit-product/view-recurring-deposit-product.component.html index 0c56f4448..4e7ac5751 100644 --- a/src/app/products/recurring-deposit-products/view-recurring-deposit-product/view-recurring-deposit-product.component.html +++ b/src/app/products/recurring-deposit-products/view-recurring-deposit-product/view-recurring-deposit-product.component.html @@ -10,7 +10,7 @@ > {{ 'labels.heading.General' | translate }} - + @for (recurringDepositDatatable of recurringDepositDatatables; track recurringDepositDatatable) { {{ recurringDepositDatatable.registeredTableName }} - + } diff --git a/src/app/products/recurring-deposit-products/view-recurring-deposit-product/view-recurring-deposit-product.component.ts b/src/app/products/recurring-deposit-products/view-recurring-deposit-product/view-recurring-deposit-product.component.ts index 19840a914..e00d3e73a 100644 --- a/src/app/products/recurring-deposit-products/view-recurring-deposit-product/view-recurring-deposit-product.component.ts +++ b/src/app/products/recurring-deposit-products/view-recurring-deposit-product/view-recurring-deposit-product.component.ts @@ -1,4 +1,4 @@ -import { Component } from '@angular/core'; +import { Component, inject } from '@angular/core'; import { ActivatedRoute, RouterLinkActive, RouterLink, RouterOutlet } from '@angular/router'; import { MatTabNav, MatTabLink, MatTabNavPanel } from '@angular/material/tabs'; import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; @@ -17,9 +17,11 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ViewRecurringDepositProductComponent { + private route = inject(ActivatedRoute); + recurringDepositDatatables: any = []; - constructor(private route: ActivatedRoute) { + constructor() { this.route.data.subscribe((data: { recurringDepositDatatables: any }) => { this.recurringDepositDatatables = []; data.recurringDepositDatatables.forEach((datatable: any) => { diff --git a/src/app/products/saving-products/create-saving-product/create-saving-product.component.html b/src/app/products/saving-products/create-saving-product/create-saving-product.component.html index cccfae064..1c8cf8722 100644 --- a/src/app/products/saving-products/create-saving-product/create-saving-product.component.html +++ b/src/app/products/saving-products/create-saving-product/create-saving-product.component.html @@ -78,17 +78,18 @@ > - - {{ 'labels.inputs.PREVIEW' | translate }} - - - - + @if (savingProductFormValid) { + + {{ 'labels.inputs.PREVIEW' | translate }} + + + + }
    diff --git a/src/app/products/saving-products/create-saving-product/create-saving-product.component.ts b/src/app/products/saving-products/create-saving-product/create-saving-product.component.ts index 91ec17918..914ab6364 100644 --- a/src/app/products/saving-products/create-saving-product/create-saving-product.component.ts +++ b/src/app/products/saving-products/create-saving-product/create-saving-product.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, ViewChild } from '@angular/core'; +import { Component, ViewChild, inject } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; /** Custom Components */ @@ -40,6 +40,12 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class CreateSavingProductComponent { + private route = inject(ActivatedRoute); + private productsService = inject(ProductsService); + private router = inject(Router); + private settingsService = inject(SettingsService); + private accounting = inject(Accounting); + @ViewChild(SavingProductDetailsStepComponent, { static: true }) savingProductDetailsStep: SavingProductDetailsStepComponent; @ViewChild(SavingProductCurrencyStepComponent, { static: true }) @@ -62,13 +68,7 @@ export class CreateSavingProductComponent { * @param {SettingsService} settingsService Settings Service. */ - constructor( - private route: ActivatedRoute, - private productsService: ProductsService, - private router: Router, - private settingsService: SettingsService, - private accounting: Accounting - ) { + constructor() { this.route.data.subscribe((data: { savingProductsTemplate: any }) => { this.savingProductsTemplate = data.savingProductsTemplate; }); diff --git a/src/app/products/saving-products/edit-saving-product/edit-saving-product.component.html b/src/app/products/saving-products/edit-saving-product/edit-saving-product.component.html index 479a8d965..26c2e6ca3 100644 --- a/src/app/products/saving-products/edit-saving-product/edit-saving-product.component.html +++ b/src/app/products/saving-products/edit-saving-product/edit-saving-product.component.html @@ -81,17 +81,18 @@ - - {{ 'labels.inputs.PREVIEW' | translate }} - - - - + @if (savingProductFormValidAndNotPristine) { + + {{ 'labels.inputs.PREVIEW' | translate }} + + + + }
    diff --git a/src/app/products/saving-products/edit-saving-product/edit-saving-product.component.ts b/src/app/products/saving-products/edit-saving-product/edit-saving-product.component.ts index f462af8ea..5484b8023 100644 --- a/src/app/products/saving-products/edit-saving-product/edit-saving-product.component.ts +++ b/src/app/products/saving-products/edit-saving-product/edit-saving-product.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, ViewChild } from '@angular/core'; +import { Component, ViewChild, inject } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; /** Custom Components */ @@ -40,6 +40,12 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class EditSavingProductComponent { + private route = inject(ActivatedRoute); + private productsService = inject(ProductsService); + private router = inject(Router); + private settingsService = inject(SettingsService); + private accounting = inject(Accounting); + @ViewChild(SavingProductDetailsStepComponent, { static: true }) savingProductDetailsStep: SavingProductDetailsStepComponent; @ViewChild(SavingProductCurrencyStepComponent, { static: true }) @@ -62,13 +68,7 @@ export class EditSavingProductComponent { * @param {SettingsService} settingsService Settings Service. */ - constructor( - private route: ActivatedRoute, - private productsService: ProductsService, - private router: Router, - private settingsService: SettingsService, - private accounting: Accounting - ) { + constructor() { this.route.data.subscribe((data: { savingProductAndTemplate: any }) => { this.savingProductAndTemplate = data.savingProductAndTemplate; }); diff --git a/src/app/products/saving-products/edit-saving-product/saving-product-and-template.resolver.ts b/src/app/products/saving-products/edit-saving-product/saving-product-and-template.resolver.ts index bfe94b1e1..4cca64b4c 100644 --- a/src/app/products/saving-products/edit-saving-product/saving-product-and-template.resolver.ts +++ b/src/app/products/saving-products/edit-saving-product/saving-product-and-template.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { ProductsService } from '../../products.service'; */ @Injectable() export class SavingProductAndTemplateResolver { - /** - * @param {ProductsService} productsService Products service. - */ - constructor(private productsService: ProductsService) {} + private productsService = inject(ProductsService); /** * Returns the saving product and template data. diff --git a/src/app/products/saving-products/saving-product-datatable.resolver.ts b/src/app/products/saving-products/saving-product-datatable.resolver.ts index c020f4b5a..e29ab2125 100644 --- a/src/app/products/saving-products/saving-product-datatable.resolver.ts +++ b/src/app/products/saving-products/saving-product-datatable.resolver.ts @@ -1,4 +1,4 @@ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; import { SystemService } from 'app/system/system.service'; import { Observable } from 'rxjs'; @@ -7,10 +7,7 @@ import { Observable } from 'rxjs'; providedIn: 'root' }) export class SavingProductDatatableResolver { - /** - * @param {SystemService} systemService Products service. - */ - constructor(private systemService: SystemService) {} + private systemService = inject(SystemService); /** * Returns the loan product data. diff --git a/src/app/products/saving-products/saving-product-datatables.resolver.ts b/src/app/products/saving-products/saving-product-datatables.resolver.ts index 625fd08b6..2224eb90b 100644 --- a/src/app/products/saving-products/saving-product-datatables.resolver.ts +++ b/src/app/products/saving-products/saving-product-datatables.resolver.ts @@ -1,4 +1,4 @@ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { Router, RouterStateSnapshot, ActivatedRouteSnapshot } from '@angular/router'; import { SystemService } from 'app/system/system.service'; import { Observable, of } from 'rxjs'; @@ -7,10 +7,7 @@ import { Observable, of } from 'rxjs'; providedIn: 'root' }) export class SavingProductDatatablesResolver { - /** - * @param {SystemService} systemService Products service. - */ - constructor(private systemService: SystemService) {} + private systemService = inject(SystemService); /** * Returns the loan product data. diff --git a/src/app/products/saving-products/saving-product-stepper/saving-product-accounting-step/saving-product-accounting-step.component.html b/src/app/products/saving-products/saving-product-stepper/saving-product-accounting-step/saving-product-accounting-step.component.html index 6fea08bca..b8df35587 100644 --- a/src/app/products/saving-products/saving-product-stepper/saving-product-accounting-step/saving-product-accounting-step.component.html +++ b/src/app/products/saving-products/saving-product-stepper/saving-product-accounting-step/saving-product-accounting-step.component.html @@ -4,338 +4,312 @@ class="flex-98 layout-row gap-5percent layout-column.lt-md radio-group-spacing" formControlName="accountingRule" > - - {{ 'labels.accounting.' + accountingRule | translate }} - + @for (accountingRule of accountingRuleData; track accountingRule; let i = $index) { + + {{ 'labels.accounting.' + accountingRule | translate }} + + } -
    -

    {{ 'labels.heading.Assets' | translate }}

    - - - - - - - - - - - - - - - - - - -

    {{ 'labels.heading.Liabilities' | translate }}

    - - - - - - - - - - - - - -

    {{ 'labels.heading.Expenses' | translate }}

    - - - - - - - - - -

    {{ 'labels.heading.Income' | translate }}

    - - - - - - - - - - - - - {{ - 'labels.heading.Advanced Accounting Rules' | translate - }} - -
    -
    -

    - {{ 'labels.heading.Configure Fund Sources for Payment Channels' | translate }} -

    - -
    - -
    -
    - -
    - +

    {{ 'labels.heading.Assets' | translate }}

    + + + + + @if (isAccrualAccounting()) { + - - - - - - - - - - - - - - - - - -
    {{ 'labels.inputs.Payment Type' | translate }} - {{ paymentFundSource.paymentTypeId | find: paymentTypeData : 'id' : 'name' }} - {{ 'labels.inputs.Fund Source' | translate }} - {{ paymentFundSource.fundSourceAccountId | find: combinedAccountData : 'id' : 'name' }} - {{ 'labels.inputs.Actions' | translate }} + + } + @if (isAccrualAccounting()) { + + + } + @if (isAccrualAccounting() && allowOverdraft.value) { + + + } + +

    {{ 'labels.heading.Liabilities' | translate }}

    + + + + + @if (isAccrualAccounting()) { + + + } + @if (isDormancyTrackingActive.value) { + + + } +

    {{ 'labels.heading.Expenses' | translate }}

    + + + + + +

    {{ 'labels.heading.Income' | translate }}

    + + + + + + + + {{ + 'labels.heading.Advanced Accounting Rules' | translate + }} + @if (savingProductAccountingForm.value.advancedAccountingRules) { +
    +
    +

    + {{ 'labels.heading.Configure Fund Sources for Payment Channels' | translate }} +

    +
    - -
    -
    - -
    -

    {{ 'labels.heading.Map Fees to Specific Income Accounts' | translate }}

    - -
    - -
    - - - - - - - - - - - - - - - - - - - -
    {{ 'labels.inputs.Fees' | translate }} - {{ feesIncome.chargeId | find: chargeData : 'id' : 'name' }} - {{ 'labels.inputs.Income Account' | translate }} - {{ feesIncome.incomeAccountId | find: incomeAccountData : 'id' : 'name' }} - {{ 'labels.inputs.Actions' | translate }} - - -
    -
    - -
    -

    - {{ 'labels.heading.Map Penalties to Specific Income Accounts' | translate }} -

    - -
    - -
    - - - - - - - - - - - - - - - + + + + + + + + + + + + +
    {{ 'labels.inputs.Penalty' | translate }} - {{ penaltyIncome.chargeId | find: penaltyData : 'id' : 'name' }} - {{ 'labels.inputs.Income Account' | translate }} - {{ penaltyIncome.incomeAccountId | find: incomeAccountData : 'id' : 'name' }} - {{ 'labels.inputs.Actions' | translate }} - {{ 'labels.inputs.Payment Type' | translate }} + {{ paymentFundSource.paymentTypeId | find: paymentTypeData : 'id' : 'name' }} + {{ 'labels.inputs.Fund Source' | translate }} + {{ paymentFundSource.fundSourceAccountId | find: combinedAccountData : 'id' : 'name' }} + {{ 'labels.inputs.Actions' | translate }} + + +
    + } +
    + @if (existCharges()) { +
    +

    {{ 'labels.heading.Map Fees to Specific Income Accounts' | translate }}

    + @if (existCharges()) { +
    + +
    + } + @if (feeToIncomeAccountMappings.value.length !== 0) { + + + + + + + + + + + + + + + +
    {{ 'labels.inputs.Fees' | translate }} + {{ feesIncome.chargeId | find: chargeData : 'id' : 'name' }} + {{ 'labels.inputs.Income Account' | translate }} + {{ feesIncome.incomeAccountId | find: incomeAccountData : 'id' : 'name' }} + {{ 'labels.inputs.Actions' | translate }} + + +
    + } +
    + } + @if (existCharges()) { +
    +

    + {{ 'labels.heading.Map Penalties to Specific Income Accounts' | translate }} +

    +
    + +
    + @if (penaltyToIncomeAccountMappings.value.length !== 0) { + + + + + + + + + + + + + + + +
    {{ 'labels.inputs.Penalty' | translate }} + {{ penaltyIncome.chargeId | find: penaltyData : 'id' : 'name' }} + {{ 'labels.inputs.Income Account' | translate }} + {{ penaltyIncome.incomeAccountId | find: incomeAccountData : 'id' : 'name' }} + {{ 'labels.inputs.Actions' | translate }} + + +
    + } +
    + } +
    + }
    - + }
    diff --git a/src/app/products/saving-products/saving-product-stepper/saving-product-accounting-step/saving-product-accounting-step.component.ts b/src/app/products/saving-products/saving-product-stepper/saving-product-accounting-step/saving-product-accounting-step.component.ts index d74466481..3e9109180 100644 --- a/src/app/products/saving-products/saving-product-stepper/saving-product-accounting-step/saving-product-accounting-step.component.ts +++ b/src/app/products/saving-products/saving-product-stepper/saving-product-accounting-step/saving-product-accounting-step.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit, Input } from '@angular/core'; +import { Component, OnInit, Input, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, @@ -66,6 +66,10 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class SavingProductAccountingStepComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private dialog = inject(MatDialog); + private translateService = inject(TranslateService); + @Input() savingProductsTemplate: any; @Input() accountingRuleData: any; @Input() isDormancyTrackingActive: UntypedFormControl; @@ -95,11 +99,7 @@ export class SavingProductAccountingStepComponent implements OnInit { 'actions' ]; - constructor( - private formBuilder: UntypedFormBuilder, - private dialog: MatDialog, - private translateService: TranslateService - ) { + constructor() { this.createsavingProductAccountingForm(); this.setConditionalControls(); } @@ -426,7 +426,6 @@ export class SavingProductAccountingStepComponent implements OnInit { required: true, order: 2 }) - ]; return formfields; } @@ -449,7 +448,6 @@ export class SavingProductAccountingStepComponent implements OnInit { required: true, order: 2 }) - ]; return formfields; } @@ -472,7 +470,6 @@ export class SavingProductAccountingStepComponent implements OnInit { required: true, order: 2 }) - ]; return formfields; } diff --git a/src/app/products/saving-products/saving-product-stepper/saving-product-charges-step/saving-product-charges-step.component.html b/src/app/products/saving-products/saving-product-stepper/saving-product-charges-step/saving-product-charges-step.component.html index b7cccc440..88119b983 100644 --- a/src/app/products/saving-products/saving-product-stepper/saving-product-charges-step/saving-product-charges-step.component.html +++ b/src/app/products/saving-products/saving-product-stepper/saving-product-charges-step/saving-product-charges-step.component.html @@ -2,12 +2,11 @@ {{ 'labels.inputs.Charge' | translate }} - - {{ charge.name }} - + @for (charge of chargeData | chargesFilter: chargesDataSource : currencyCode.value; track charge) { + + {{ charge.name }} + + } diff --git a/src/app/products/saving-products/saving-product-stepper/saving-product-charges-step/saving-product-charges-step.component.ts b/src/app/products/saving-products/saving-product-stepper/saving-product-charges-step/saving-product-charges-step.component.ts index ccee9c8b0..de65bb921 100644 --- a/src/app/products/saving-products/saving-product-stepper/saving-product-charges-step/saving-product-charges-step.component.ts +++ b/src/app/products/saving-products/saving-product-stepper/saving-product-charges-step/saving-product-charges-step.component.ts @@ -1,4 +1,4 @@ -import { Component, Input, OnInit } from '@angular/core'; +import { Component, Input, OnInit, inject } from '@angular/core'; import { UntypedFormControl } from '@angular/forms'; import { MatDialog } from '@angular/material/dialog'; @@ -48,6 +48,9 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class SavingProductChargesStepComponent implements OnInit { + dialog = inject(MatDialog); + private translateService = inject(TranslateService); + @Input() savingProductsTemplate: any; @Input() currencyCode: UntypedFormControl; @@ -64,11 +67,6 @@ export class SavingProductChargesStepComponent implements OnInit { pristine = true; - constructor( - public dialog: MatDialog, - private translateService: TranslateService - ) {} - ngOnInit() { this.chargeData = this.savingProductsTemplate.chargeOptions; diff --git a/src/app/products/saving-products/saving-product-stepper/saving-product-currency-step/saving-product-currency-step.component.html b/src/app/products/saving-products/saving-product-stepper/saving-product-currency-step/saving-product-currency-step.component.html index cf1b23227..b2c8e2ec3 100644 --- a/src/app/products/saving-products/saving-product-stepper/saving-product-currency-step/saving-product-currency-step.component.html +++ b/src/app/products/saving-products/saving-product-stepper/saving-product-currency-step/saving-product-currency-step.component.html @@ -7,9 +7,11 @@ matTooltip="{{ 'tooltips.The currency to be used' | translate }}" required > - - {{ currency.name }} - + @for (currency of currencyData; track currency) { + + {{ currency.name }} + + } {{ 'labels.inputs.Currency' | translate }} {{ 'labels.commons.is' | translate }} diff --git a/src/app/products/saving-products/saving-product-stepper/saving-product-currency-step/saving-product-currency-step.component.ts b/src/app/products/saving-products/saving-product-stepper/saving-product-currency-step/saving-product-currency-step.component.ts index df8ef887a..2ced72d54 100644 --- a/src/app/products/saving-products/saving-product-stepper/saving-product-currency-step/saving-product-currency-step.component.ts +++ b/src/app/products/saving-products/saving-product-stepper/saving-product-currency-step/saving-product-currency-step.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit, Input } from '@angular/core'; +import { Component, OnInit, Input, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, Validators, ReactiveFormsModule } from '@angular/forms'; import { MatTooltip } from '@angular/material/tooltip'; import { MatStepperPrevious, MatStepperNext } from '@angular/material/stepper'; @@ -18,13 +18,15 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class SavingProductCurrencyStepComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + @Input() savingProductsTemplate: any; savingProductCurrencyForm: UntypedFormGroup; currencyData: any; - constructor(private formBuilder: UntypedFormBuilder) { + constructor() { this.createSavingProductCurrencyForm(); } diff --git a/src/app/products/saving-products/saving-product-stepper/saving-product-details-step/saving-product-details-step.component.ts b/src/app/products/saving-products/saving-product-stepper/saving-product-details-step/saving-product-details-step.component.ts index f4bceeef4..ed4e4c4b4 100644 --- a/src/app/products/saving-products/saving-product-stepper/saving-product-details-step/saving-product-details-step.component.ts +++ b/src/app/products/saving-products/saving-product-stepper/saving-product-details-step/saving-product-details-step.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit, Input } from '@angular/core'; +import { Component, OnInit, Input, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, Validators, ReactiveFormsModule } from '@angular/forms'; import { MatTooltip } from '@angular/material/tooltip'; import { CdkTextareaAutosize } from '@angular/cdk/text-field'; @@ -20,11 +20,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class SavingProductDetailsStepComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + @Input() savingProductsTemplate: any; savingProductDetailsForm: UntypedFormGroup; - constructor(private formBuilder: UntypedFormBuilder) { + constructor() { this.createSavingProductDetailsForm(); } diff --git a/src/app/products/saving-products/saving-product-stepper/saving-product-preview-step/saving-product-preview-step.component.html b/src/app/products/saving-products/saving-product-stepper/saving-product-preview-step/saving-product-preview-step.component.html index 4f5f93e8a..4ed8abcbc 100644 --- a/src/app/products/saving-products/saving-product-stepper/saving-product-preview-step/saving-product-preview-step.component.html +++ b/src/app/products/saving-products/saving-product-stepper/saving-product-preview-step/saving-product-preview-step.component.html @@ -10,10 +10,12 @@ {{ savingProduct.shortName }}
    -
    - {{ 'labels.inputs.Description' | translate }}: - {{ savingProduct.description }} -
    + @if (savingProduct.description) { +
    + {{ 'labels.inputs.Description' | translate }}: + {{ savingProduct.description }} +
    + }

    {{ 'labels.inputs.Currency' | translate }}

    @@ -82,124 +84,141 @@

    {{ 'labels.inputs.Settings' | translate }}

    -
    - {{ 'labels.inputs.Minimum Opening Balance' | translate }}: - {{ savingProduct.minRequiredOpeningBalance | formatNumber }} -
    + @if (savingProduct.minRequiredOpeningBalance) { +
    + {{ 'labels.inputs.Minimum Opening Balance' | translate }}: + {{ savingProduct.minRequiredOpeningBalance | formatNumber }} +
    + } -
    - {{ 'labels.inputs.Lock-in Period' | translate }}: - {{ - savingProduct.lockinPeriodFrequency + - ' ' + - (savingProduct.lockinPeriodFrequencyType - | find: savingProductsTemplate.lockinPeriodFrequencyTypeOptions : 'id' : 'value') | translateKey: 'catalogs' - }} -
    + @if (savingProduct.lockinPeriodFrequency) { +
    + {{ 'labels.inputs.Lock-in Period' | translate }}: + {{ + savingProduct.lockinPeriodFrequency + + ' ' + + (savingProduct.lockinPeriodFrequencyType + | find: savingProductsTemplate.lockinPeriodFrequencyTypeOptions : 'id' : 'value') | translateKey: 'catalogs' + }} +
    + }
    {{ 'labels.inputs.Apply Withdrawal Fee for Transfers' | translate }}: {{ savingProduct.withdrawalFeeForTransfers | yesNo }}
    -
    - {{ 'labels.inputs.Balance Required for Interest Calculation' | translate }}: - {{ savingProduct.minBalanceForInterestCalculation | formatNumber }} -
    + @if (savingProduct.minBalanceForInterestCalculation) { +
    + {{ 'labels.inputs.Balance Required for Interest Calculation' | translate }}: + {{ savingProduct.minBalanceForInterestCalculation | formatNumber }} +
    + }
    {{ 'labels.inputs.Enforce Minimum Balance' | translate }}: {{ savingProduct.enforceMinRequiredBalance | yesNo }}
    -
    - {{ 'labels.inputs.Minimum Balance' | translate }}: - {{ savingProduct.minRequiredBalance | formatNumber }} -
    + @if (savingProduct.minRequiredBalance) { +
    + {{ 'labels.inputs.Minimum Balance' | translate }}: + {{ savingProduct.minRequiredBalance | formatNumber }} +
    + }
    {{ 'labels.inputs.Withhold Tax is Applicable' | translate }}: {{ savingProduct.withHoldTax | yesNo }}
    -
    - {{ 'labels.inputs.Tax Group' | translate }}: - {{ - savingProduct.taxGroupId | find: savingProductsTemplate.taxGroupOptions : 'id' : 'name' - }} -
    + @if (savingProduct.withHoldTax) { +
    + {{ 'labels.inputs.Tax Group' | translate }}: + {{ + savingProduct.taxGroupId | find: savingProductsTemplate.taxGroupOptions : 'id' : 'name' + }} +
    + }
    {{ 'labels.inputs.Is Overdraft Allowed' | translate }}: {{ savingProduct.allowOverdraft | yesNo }}
    -
    - {{ 'labels.inputs.Minimum Overdraft Required for Interest Calculation' | translate }}: - {{ savingProduct.minOverdraftForInterestCalculation | formatNumber }} -
    + @if (savingProduct.minOverdraftForInterestCalculation) { +
    + {{ 'labels.inputs.Minimum Overdraft Required for Interest Calculation' | translate }}: + {{ savingProduct.minOverdraftForInterestCalculation | formatNumber }} +
    + } -
    - {{ 'labels.inputs.Nominal Annual Interest for Overdraft' | translate }}: - {{ savingProduct.nominalAnnualInterestRateOverdraft | formatNumber }} % -
    + @if (savingProduct.nominalAnnualInterestRateOverdraft) { +
    + {{ 'labels.inputs.Nominal Annual Interest for Overdraft' | translate }}: + {{ savingProduct.nominalAnnualInterestRateOverdraft | formatNumber }} % +
    + } -
    - {{ 'labels.inputs.Maximum Overdraft Amount Limit' | translate }}: - {{ savingProduct.overdraftLimit | formatNumber }} -
    + @if (savingProduct.overdraftLimit) { +
    + {{ 'labels.inputs.Maximum Overdraft Amount Limit' | translate }}: + {{ savingProduct.overdraftLimit | formatNumber }} +
    + }
    {{ 'labels.inputs.Enable Dormancy Tracking' | translate }}: {{ savingProduct.isDormancyTrackingActive | yesNo }}
    -
    - {{ 'labels.inputs.Number of Days to Inactive sub-status' | translate }}: - {{ savingProduct.daysToInactive }} - {{ 'labels.inputs.Number of Days to Dormant sub-status' | translate }}: - {{ savingProduct.daysToDormancy }} - {{ 'labels.inputs.Number of Days to Escheat' | translate }}: - {{ savingProduct.daysToEscheat }} -
    + @if (savingProduct.isDormancyTrackingActive) { +
    + {{ 'labels.inputs.Number of Days to Inactive sub-status' | translate }}: + {{ savingProduct.daysToInactive }} + {{ 'labels.inputs.Number of Days to Dormant sub-status' | translate }}: + {{ savingProduct.daysToDormancy }} + {{ 'labels.inputs.Number of Days to Escheat' | translate }}: + {{ savingProduct.daysToEscheat }} +
    + } -
    -

    {{ 'labels.inputs.Charges' | translate }}

    - - - - - - - - - - - - - - - - - - - - - - - - - -
    {{ 'labels.inputs.Name' | translate }} - {{ charge.name + ', ' + charge.currency.displaySymbol }} - {{ 'labels.inputs.Type' | translate }} - {{ charge.chargeCalculationType.value | translateKey: 'catalogs' }} - {{ 'labels.inputs.Amount' | translate }} - {{ charge.amount | formatNumber }} - {{ 'labels.inputs.Collected On' | translate }} - {{ charge.chargeTimeType.value | translateKey: 'catalogs' }} -
    -
    + @if (savingProduct.charges.length) { +
    +

    {{ 'labels.inputs.Charges' | translate }}

    + + + + + + + + + + + + + + + + + + + + +
    {{ 'labels.inputs.Name' | translate }} + {{ charge.name + ', ' + charge.currency.displaySymbol }} + {{ 'labels.inputs.Type' | translate }} + {{ charge.chargeCalculationType.value | translateKey: 'catalogs' }} + {{ 'labels.inputs.Amount' | translate }} + {{ charge.amount | formatNumber }} + {{ 'labels.inputs.Collected On' | translate }} + {{ charge.chargeTimeType.value | translateKey: 'catalogs' }} +
    +
    + }

    {{ 'labels.heading.Accounting' | translate }}

    @@ -208,106 +227,97 @@ -
    -

    {{ 'labels.heading.Advanced Accounting Rules' | translate }}

    - - -
    -

    {{ 'labels.heading.Fund Sources for Payment Channels' | translate }}

    - - - - - - - - - - - - - - -
    {{ 'labels.inputs.Payment Type' | translate }} - {{ paymentFundSource.paymentTypeId | find: savingProductsTemplate.paymentTypeOptions : 'id' : 'name' }} - {{ 'labels.inputs.Fund Source' | translate }} - {{ - paymentFundSource.fundSourceAccountId - | find: savingProductsTemplate.accountingMappingOptions.assetAccountOptions : 'id' : 'name' - }} -
    + @if ( + savingProduct.advancedAccountingRules && + (savingProduct.paymentChannelToFundSourceMappings?.length || + savingProduct.feeToIncomeAccountMappings?.length || + savingProduct.penaltyToIncomeAccountMappings?.length) + ) { +
    +

    {{ 'labels.heading.Advanced Accounting Rules' | translate }}

    + + @if (savingProduct.paymentChannelToFundSourceMappings?.length) { +
    +

    {{ 'labels.heading.Fund Sources for Payment Channels' | translate }}

    + + + + + + + + + + + +
    {{ 'labels.inputs.Payment Type' | translate }} + {{ paymentFundSource.paymentTypeId | find: savingProductsTemplate.paymentTypeOptions : 'id' : 'name' }} + {{ 'labels.inputs.Fund Source' | translate }} + {{ + paymentFundSource.fundSourceAccountId + | find: savingProductsTemplate.accountingMappingOptions.assetAccountOptions : 'id' : 'name' + }} +
    +
    + } + @if (savingProduct.feeToIncomeAccountMappings?.length) { +
    +

    {{ 'labels.heading.Fees to Specific Income Accounts' | translate }}

    + + + + + + + + + + + +
    {{ 'labels.inputs.Fees' | translate }} + {{ feesIncome.chargeId | find: savingProductsTemplate.chargeOptions : 'id' : 'name' }} + {{ 'labels.inputs.Income Account' | translate }} + {{ + feesIncome.incomeAccountId + | find: savingProductsTemplate.accountingMappingOptions.incomeAccountOptions : 'id' : 'name' + }} +
    +
    + } + @if (savingProduct.penaltyToIncomeAccountMappings?.length) { +
    +

    {{ 'labels.heading.Penalties to Specific Income Accounts' | translate }}

    + + + + + + + + + + + +
    {{ 'labels.inputs.Penalty' | translate }} + {{ penaltyIncome.chargeId | find: savingProductsTemplate.penaltyOptions : 'id' : 'name' }} + {{ 'labels.inputs.Income Account' | translate }} + {{ + penaltyIncome.incomeAccountId + | find: savingProductsTemplate.accountingMappingOptions.incomeAccountOptions : 'id' : 'name' + }} +
    +
    + }
    - -
    -

    {{ 'labels.heading.Fees to Specific Income Accounts' | translate }}

    - - - - - - - - - - - - - - -
    {{ 'labels.inputs.Fees' | translate }} - {{ feesIncome.chargeId | find: savingProductsTemplate.chargeOptions : 'id' : 'name' }} - {{ 'labels.inputs.Income Account' | translate }} - {{ - feesIncome.incomeAccountId - | find: savingProductsTemplate.accountingMappingOptions.incomeAccountOptions : 'id' : 'name' - }} -
    -
    - -
    -

    {{ 'labels.heading.Penalties to Specific Income Accounts' | translate }}

    - - - - - - - - - - - - - - -
    {{ 'labels.inputs.Penalty' | translate }} - {{ penaltyIncome.chargeId | find: savingProductsTemplate.penaltyOptions : 'id' : 'name' }} - {{ 'labels.inputs.Income Account' | translate }} - {{ - penaltyIncome.incomeAccountId - | find: savingProductsTemplate.accountingMappingOptions.incomeAccountOptions : 'id' : 'name' - }} -
    -
    -
    + }
    diff --git a/src/app/products/saving-products/saving-product-stepper/saving-product-preview-step/saving-product-preview-step.component.ts b/src/app/products/saving-products/saving-product-stepper/saving-product-preview-step/saving-product-preview-step.component.ts index 31a8f65fe..c1917a18c 100644 --- a/src/app/products/saving-products/saving-product-stepper/saving-product-preview-step/saving-product-preview-step.component.ts +++ b/src/app/products/saving-products/saving-product-stepper/saving-product-preview-step/saving-product-preview-step.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit, Input, Output, EventEmitter, OnChanges, SimpleChanges } from '@angular/core'; +import { Component, OnInit, Input, Output, EventEmitter, OnChanges, SimpleChanges, inject } from '@angular/core'; import { Accounting } from 'app/core/utils/accounting'; import { OptionData } from 'app/shared/models/option-data.model'; import { MatDivider } from '@angular/material/divider'; @@ -48,6 +48,8 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class SavingProductPreviewStepComponent implements OnInit, OnChanges { + private accounting = inject(Accounting); + @Input() savingProductsTemplate: any; @Input() accountingRuleData: any; @Input() savingProduct: any; @@ -72,8 +74,6 @@ export class SavingProductPreviewStepComponent implements OnInit, OnChanges { accountingMappings: any = {}; accountingRule: OptionData; - constructor(private accounting: Accounting) {} - ngOnInit() { this.setCurrentValues(); } diff --git a/src/app/products/saving-products/saving-product-stepper/saving-product-settings-step/saving-product-settings-step.component.html b/src/app/products/saving-products/saving-product-stepper/saving-product-settings-step/saving-product-settings-step.component.html index f05de0826..02edaa69d 100644 --- a/src/app/products/saving-products/saving-product-stepper/saving-product-settings-step/saving-product-settings-step.component.html +++ b/src/app/products/saving-products/saving-product-stepper/saving-product-settings-step/saving-product-settings-step.component.html @@ -24,12 +24,11 @@ - - {{ lockinPeriodFrequencyType.value | translateKey: 'catalogs' }} - + @for (lockinPeriodFrequencyType of lockinPeriodFrequencyTypeData; track lockinPeriodFrequencyType) { + + {{ lockinPeriodFrequencyType.value | translateKey: 'catalogs' }} + + } @@ -80,18 +79,22 @@ {{ 'labels.inputs.Is Withhold Tax Applicable' | translate }} - - {{ 'labels.inputs.Tax Group' | translate }} - - - {{ taxGroup.name }} - - - - {{ 'labels.inputs.Tax Group' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - + @if (savingProductSettingsForm.value.withHoldTax) { + + {{ 'labels.inputs.Tax Group' | translate }} + + @for (taxGroup of taxGroupData; track taxGroup) { + + {{ taxGroup.name }} + + } + + + {{ 'labels.inputs.Tax Group' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + + } @@ -106,40 +109,37 @@ {{ 'labels.inputs.Is Overdraft Allowed' | translate }} -
    - - {{ 'labels.inputs.Minimum Overdraft Required for Interest Calculation' | translate }} - - - - - {{ 'labels.inputs.Nominal Annual Interest for Overdraft' | translate }} - - - - - {{ 'labels.inputs.Maximum Overdraft Amount Limit' | translate }} - - -
    + @if (savingProductSettingsForm.value.allowOverdraft) { +
    + + {{ 'labels.inputs.Minimum Overdraft Required for Interest Calculation' | translate }} + + + + {{ 'labels.inputs.Nominal Annual Interest for Overdraft' | translate }} + + + + {{ 'labels.inputs.Maximum Overdraft Amount Limit' | translate }} + + +
    + } @@ -154,55 +154,53 @@ {{ 'labels.inputs.Enable Dormancy Tracking' | translate }} -
    - - {{ 'labels.inputs.Number of Days to Inactive sub-status' | translate }} - - - {{ 'labels.inputs.Number of Days to Inactive sub-status' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - - - {{ 'labels.inputs.Number of Days to Dormant sub-status' | translate }} - - - {{ 'labels.inputs.Number of Days to Dormant sub-status' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - - - {{ 'labels.inputs.Number of Days to Escheat' | translate }} - - - {{ 'labels.inputs.Number of Days to Escheat' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - -
    + @if (savingProductSettingsForm.value.isDormancyTrackingActive) { +
    + + {{ 'labels.inputs.Number of Days to Inactive sub-status' | translate }} + + + {{ 'labels.inputs.Number of Days to Inactive sub-status' | translate }} + {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + + + {{ 'labels.inputs.Number of Days to Dormant sub-status' | translate }} + + + {{ 'labels.inputs.Number of Days to Dormant sub-status' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + + + {{ 'labels.inputs.Number of Days to Escheat' | translate }} + + + {{ 'labels.inputs.Number of Days to Escheat' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + +
    + }
    diff --git a/src/app/products/saving-products/saving-product-stepper/saving-product-settings-step/saving-product-settings-step.component.ts b/src/app/products/saving-products/saving-product-stepper/saving-product-settings-step/saving-product-settings-step.component.ts index 85da9bd36..df5803eb6 100644 --- a/src/app/products/saving-products/saving-product-stepper/saving-product-settings-step/saving-product-settings-step.component.ts +++ b/src/app/products/saving-products/saving-product-stepper/saving-product-settings-step/saving-product-settings-step.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit, Input } from '@angular/core'; +import { Component, OnInit, Input, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, @@ -28,6 +28,8 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class SavingProductSettingsStepComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + @Input() savingProductsTemplate: any; savingProductSettingsForm: UntypedFormGroup; @@ -35,7 +37,7 @@ export class SavingProductSettingsStepComponent implements OnInit { lockinPeriodFrequencyTypeData: any; taxGroupData: any; - constructor(private formBuilder: UntypedFormBuilder) { + constructor() { this.createSavingProductSettingsForm(); this.setConditionalControls(); } diff --git a/src/app/products/saving-products/saving-product-stepper/saving-product-terms-step/saving-product-terms-step.component.html b/src/app/products/saving-products/saving-product-stepper/saving-product-terms-step/saving-product-terms-step.component.html index 7790e2640..225c72a65 100644 --- a/src/app/products/saving-products/saving-product-stepper/saving-product-terms-step/saving-product-terms-step.component.html +++ b/src/app/products/saving-products/saving-product-stepper/saving-product-terms-step/saving-product-terms-step.component.html @@ -24,12 +24,11 @@ matTooltip="{{ 'tooltips.The period at which interest rate' | translate }}" required > - - {{ interestCompoundingPeriodType.value | translateKey: 'catalogs' }} - + @for (interestCompoundingPeriodType of interestCompoundingPeriodTypeData; track interestCompoundingPeriodType) { + + {{ interestCompoundingPeriodType.value | translateKey: 'catalogs' }} + + } {{ 'labels.inputs.Interest Compounding Period' | translate }} {{ 'labels.commons.is' | translate }} @@ -44,12 +43,11 @@ matTooltip="{{ 'tooltips.Interest rate is posted or credited to a saving account' | translate }}" required > - - {{ interestPostingPeriodType.value | translateKey: 'catalogs' }} - + @for (interestPostingPeriodType of interestPostingPeriodTypeData; track interestPostingPeriodType) { + + {{ interestPostingPeriodType.value | translateKey: 'catalogs' }} + + } {{ 'labels.inputs.Interest Posting Period' | translate }} {{ 'labels.commons.is' | translate }} @@ -64,12 +62,11 @@ matTooltip="{{ 'tooltips.The method used to calculate interest' | translate }}" required > - - {{ interestCalculationType.value | translateKey: 'catalogs' }} - + @for (interestCalculationType of interestCalculationTypeData; track interestCalculationType) { + + {{ interestCalculationType.value | translateKey: 'catalogs' }} + + } {{ 'labels.inputs.Interest Calculated using' | translate }} {{ 'labels.commons.is' | translate }} @@ -84,12 +81,14 @@ matTooltip="{{ 'tooltips.To calculate interest' | translate }}" required > - - {{ interestCalculationDaysInYearType.value | translateKey: 'catalogs' }} - + @for ( + interestCalculationDaysInYearType of interestCalculationDaysInYearTypeData; + track interestCalculationDaysInYearType + ) { + + {{ interestCalculationDaysInYearType.value | translateKey: 'catalogs' }} + + } {{ 'labels.inputs.Days in Year' | translate }} {{ 'labels.commons.is' | translate }} diff --git a/src/app/products/saving-products/saving-product-stepper/saving-product-terms-step/saving-product-terms-step.component.ts b/src/app/products/saving-products/saving-product-stepper/saving-product-terms-step/saving-product-terms-step.component.ts index 60288417f..8dd483f3b 100644 --- a/src/app/products/saving-products/saving-product-stepper/saving-product-terms-step/saving-product-terms-step.component.ts +++ b/src/app/products/saving-products/saving-product-stepper/saving-product-terms-step/saving-product-terms-step.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit, Input } from '@angular/core'; +import { Component, OnInit, Input, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, Validators, ReactiveFormsModule } from '@angular/forms'; import { MatTooltip } from '@angular/material/tooltip'; import { MatStepperPrevious, MatStepperNext } from '@angular/material/stepper'; @@ -18,6 +18,8 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class SavingProductTermsStepComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + @Input() savingProductsTemplate: any; savingProductTermsForm: UntypedFormGroup; @@ -27,7 +29,7 @@ export class SavingProductTermsStepComponent implements OnInit { interestCalculationTypeData: any; interestCalculationDaysInYearTypeData: any; - constructor(private formBuilder: UntypedFormBuilder) { + constructor() { this.createSavingProductTermsForm(); } diff --git a/src/app/products/saving-products/saving-product.resolver.ts b/src/app/products/saving-products/saving-product.resolver.ts index 7b3364a3b..1dd2360a1 100644 --- a/src/app/products/saving-products/saving-product.resolver.ts +++ b/src/app/products/saving-products/saving-product.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { ProductsService } from '../products.service'; */ @Injectable() export class SavingProductResolver { - /** - * @param {ProductsService} productsService Products service. - */ - constructor(private productsService: ProductsService) {} + private productsService = inject(ProductsService); /** * Returns the saving product data. diff --git a/src/app/products/saving-products/saving-products-template.resolver.ts b/src/app/products/saving-products/saving-products-template.resolver.ts index d868b688d..e819c0087 100644 --- a/src/app/products/saving-products/saving-products-template.resolver.ts +++ b/src/app/products/saving-products/saving-products-template.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; /** rxjs Imports */ import { Observable } from 'rxjs'; @@ -9,7 +9,7 @@ import { ProductsService } from '../products.service'; @Injectable() export class SavingProductsTemplateResolver { - constructor(private productsService: ProductsService) {} + private productsService = inject(ProductsService); /** * Returns the saving products template data. diff --git a/src/app/products/saving-products/saving-products.component.ts b/src/app/products/saving-products/saving-products.component.ts index 746196bdb..2e91da2b5 100644 --- a/src/app/products/saving-products/saving-products.component.ts +++ b/src/app/products/saving-products/saving-products.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, TemplateRef, ElementRef, ViewChild, AfterViewInit } from '@angular/core'; +import { Component, OnInit, TemplateRef, ElementRef, ViewChild, AfterViewInit, inject } from '@angular/core'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort, MatSortHeader } from '@angular/material/sort'; import { @@ -46,6 +46,11 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class SavingProductsComponent implements OnInit, AfterViewInit { + private route = inject(ActivatedRoute); + private router = inject(Router); + private configurationWizardService = inject(ConfigurationWizardService); + private popoverService = inject(PopoverService); + savingProductsData: any; displayedColumns: string[] = [ 'name', @@ -71,12 +76,7 @@ export class SavingProductsComponent implements OnInit, AfterViewInit { * @param {ConfigurationWizardService} configurationWizardService ConfigurationWizard Service. * @param {PopoverService} popoverService PopoverService. */ - constructor( - private route: ActivatedRoute, - private router: Router, - private configurationWizardService: ConfigurationWizardService, - private popoverService: PopoverService - ) { + constructor() { this.route.data.subscribe((data: { savingProducts: any }) => { this.savingProductsData = data.savingProducts; }); diff --git a/src/app/products/saving-products/saving-products.resolver.ts b/src/app/products/saving-products/saving-products.resolver.ts index db747a977..d84f31182 100644 --- a/src/app/products/saving-products/saving-products.resolver.ts +++ b/src/app/products/saving-products/saving-products.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; /** rxjs Imports */ import { Observable } from 'rxjs'; @@ -12,11 +12,7 @@ import { ProductsService } from '../products.service'; */ @Injectable() export class SavingProductsResolver { - /** - * - * @param {ProductsService} productsService Products service. - */ - constructor(private productsService: ProductsService) {} + private productsService = inject(ProductsService); /** * Returns the saving products data. diff --git a/src/app/products/saving-products/view-saving-product/saving-product-datatable-tab/saving-product-datatable-tab.component.ts b/src/app/products/saving-products/view-saving-product/saving-product-datatable-tab/saving-product-datatable-tab.component.ts index d1d9c675e..1bf15eb78 100644 --- a/src/app/products/saving-products/view-saving-product/saving-product-datatable-tab/saving-product-datatable-tab.component.ts +++ b/src/app/products/saving-products/view-saving-product/saving-product-datatable-tab/saving-product-datatable-tab.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; import { EntityDatatableTabComponent } from '../../../../shared/tabs/entity-datatable-tab/entity-datatable-tab.component'; import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; @@ -13,11 +13,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class SavingProductDatatableTabComponent { + private route = inject(ActivatedRoute); + entityId: string; entityDatatable: any; multiRowDatatableFlag: boolean; - constructor(private route: ActivatedRoute) { + constructor() { this.entityId = this.route.parent.parent.snapshot.paramMap.get('productId'); this.route.data.subscribe((data: { savingProductDatatable: any }) => { diff --git a/src/app/products/saving-products/view-saving-product/saving-product-general-tab/saving-product-general-tab.component.html b/src/app/products/saving-products/view-saving-product/saving-product-general-tab/saving-product-general-tab.component.html index 846bf7f36..8c64dbd0e 100644 --- a/src/app/products/saving-products/view-saving-product/saving-product-general-tab/saving-product-general-tab.component.html +++ b/src/app/products/saving-products/view-saving-product/saving-product-general-tab/saving-product-general-tab.component.html @@ -25,10 +25,12 @@ {{ savingProduct.shortName }}
    -
    - {{ 'labels.inputs.Description' | translate }}: - {{ savingProduct.description }} -
    + @if (savingProduct.description) { +
    + {{ 'labels.inputs.Description' | translate }}: + {{ savingProduct.description }} +
    + }

    {{ 'labels.inputs.Currency' | translate }}

    @@ -84,122 +86,136 @@ -
    - {{ 'labels.inputs.Minimum Opening Balance' | translate }}: - {{ savingProduct.minRequiredOpeningBalance | formatNumber }} -
    + @if (savingProduct.minRequiredOpeningBalance) { +
    + {{ 'labels.inputs.Minimum Opening Balance' | translate }}: + {{ savingProduct.minRequiredOpeningBalance | formatNumber }} +
    + } -
    - {{ 'labels.inputs.Lock-in Period' | translate }}: - {{ - savingProduct.lockinPeriodFrequency + ' ' + savingProduct.lockinPeriodFrequencyType.value - }} -
    + @if (savingProduct.lockinPeriodFrequency) { +
    + {{ 'labels.inputs.Lock-in Period' | translate }}: + {{ + savingProduct.lockinPeriodFrequency + ' ' + savingProduct.lockinPeriodFrequencyType.value + }} +
    + }
    {{ 'labels.inputs.Apply Withdrawal Fee for Transfers' | translate }}: {{ savingProduct.withdrawalFeeForTransfers | yesNo }}
    -
    - {{ 'labels.inputs.Balance Required for Interest Calculation' | translate }}: - {{ savingProduct.minBalanceForInterestCalculation | formatNumber }} -
    + @if (savingProduct.minBalanceForInterestCalculation) { +
    + {{ 'labels.inputs.Balance Required for Interest Calculation' | translate }}: + {{ savingProduct.minBalanceForInterestCalculation | formatNumber }} +
    + }
    {{ 'labels.inputs.Enforce Minimum Balance' | translate }}: {{ savingProduct.enforceMinRequiredBalance | yesNo }}
    -
    - {{ 'labels.inputs.Minimum Balance' | translate }}: - {{ savingProduct.minRequiredBalance | formatNumber }} -
    + @if (savingProduct.minRequiredBalance) { +
    + {{ 'labels.inputs.Minimum Balance' | translate }}: + {{ savingProduct.minRequiredBalance | formatNumber }} +
    + }
    {{ 'labels.inputs.Withhold Tax is Applicable' | translate }}: {{ savingProduct.withHoldTax | yesNo }}
    -
    - {{ 'labels.inputs.Tax Group' | translate }}: - {{ savingProduct.taxGroup.name }} -
    + @if (savingProduct.withHoldTax) { +
    + {{ 'labels.inputs.Tax Group' | translate }}: + {{ savingProduct.taxGroup.name }} +
    + }
    {{ 'labels.inputs.Is Overdraft Allowed' | translate }}: {{ savingProduct.allowOverdraft | yesNo }}
    -
    - {{ 'labels.inputs.Minimum Overdraft Required for Interest Calculation' | translate }}: - {{ savingProduct.minOverdraftForInterestCalculation }} -
    + @if (savingProduct.minOverdraftForInterestCalculation) { +
    + {{ 'labels.inputs.Minimum Overdraft Required for Interest Calculation' | translate }}: + {{ savingProduct.minOverdraftForInterestCalculation }} +
    + } -
    - {{ 'labels.inputs.Nominal Annual Interest for Overdraft' | translate }}: - {{ savingProduct.nominalAnnualInterestRateOverdraft }} % -
    + @if (savingProduct.nominalAnnualInterestRateOverdraft) { +
    + {{ 'labels.inputs.Nominal Annual Interest for Overdraft' | translate }}: + {{ savingProduct.nominalAnnualInterestRateOverdraft }} % +
    + } -
    - {{ 'labels.inputs.Maximum Overdraft Amount Limit' | translate }}: - {{ savingProduct.overdraftLimit | formatNumber }} -
    + @if (savingProduct.overdraftLimit) { +
    + {{ 'labels.inputs.Maximum Overdraft Amount Limit' | translate }}: + {{ savingProduct.overdraftLimit | formatNumber }} +
    + }
    {{ 'labels.inputs.Enable Dormancy Tracking' | translate }}: {{ savingProduct.isDormancyTrackingActive | yesNo }}
    -
    - {{ 'labels.inputs.Number of Days to Inactive sub-status' | translate }}: - {{ savingProduct.daysToInactive }} - {{ 'labels.inputs.Number of Days to Dormant sub-status' | translate }}: - {{ savingProduct.daysToDormancy }} - {{ 'labels.inputs.Number of Days to Escheat' | translate }}: - {{ savingProduct.daysToEscheat }} -
    + @if (savingProduct.isDormancyTrackingActive) { +
    + {{ 'labels.inputs.Number of Days to Inactive sub-status' | translate }}: + {{ savingProduct.daysToInactive }} + {{ 'labels.inputs.Number of Days to Dormant sub-status' | translate }}: + {{ savingProduct.daysToDormancy }} + {{ 'labels.inputs.Number of Days to Escheat' | translate }}: + {{ savingProduct.daysToEscheat }} +
    + } -
    -

    {{ 'labels.heading.Charges' | translate }}

    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    {{ 'labels.inputs.Name' | translate }} - {{ charge.name + ', ' + charge.currency.displaySymbol }} - {{ 'labels.inputs.Type' | translate }} - {{ charge.chargeCalculationType.value | translateKey: 'catalogs' }} - {{ 'labels.inputs.Amount' | translate }} - {{ charge.amount | formatNumber }} - {{ 'labels.inputs.Collected On' | translate }} - {{ charge.chargeTimeType.value | translateKey: 'catalogs' }} -
    -
    + @if (savingProduct.charges.length) { +
    +

    {{ 'labels.heading.Charges' | translate }}

    + + + + + + + + + + + + + + + + + + + + +
    {{ 'labels.inputs.Name' | translate }} + {{ charge.name + ', ' + charge.currency.displaySymbol }} + {{ 'labels.inputs.Type' | translate }} + {{ charge.chargeCalculationType.value | translateKey: 'catalogs' }} + {{ 'labels.inputs.Amount' | translate }} + {{ charge.amount | formatNumber }} + {{ 'labels.inputs.Collected On' | translate }} + {{ charge.chargeTimeType.value | translateKey: 'catalogs' }} +
    +
    + }

    {{ 'labels.heading.Accounting' | translate }}

    @@ -212,96 +228,86 @@ > -
    -

    {{ 'labels.inputs.Advanced Accounting Rules' | translate }}

    - - - -
    -

    {{ 'labels.inputs.Fund Sources for Payment Channels' | translate }}

    - - - - - - - - - - - - - - -
    {{ 'labels.inputs.Payment Type' | translate }} - {{ paymentFundSource.paymentType.name }} - {{ 'labels.inputs.Fund Source' | translate }} - ({{ paymentFundSource.fundSourceAccount.glCode }}) {{ paymentFundSource.fundSourceAccount.name }} -
    + @if ( + savingProduct.paymentChannelToFundSourceMappings?.length || + savingProduct.feeToIncomeAccountMappings?.length || + savingProduct.penaltyToIncomeAccountMappings?.length + ) { +
    +

    {{ 'labels.inputs.Advanced Accounting Rules' | translate }}

    + + @if (savingProduct.paymentChannelToFundSourceMappings?.length) { +
    +

    {{ 'labels.inputs.Fund Sources for Payment Channels' | translate }}

    + + + + + + + + + + + +
    {{ 'labels.inputs.Payment Type' | translate }} + {{ paymentFundSource.paymentType.name }} + {{ 'labels.inputs.Fund Source' | translate }} + ({{ paymentFundSource.fundSourceAccount.glCode }}) {{ paymentFundSource.fundSourceAccount.name }} +
    +
    + } + @if (savingProduct.feeToIncomeAccountMappings?.length) { +
    +

    {{ 'labels.inputs.Fees to Specific Income Accounts' | translate }}

    + + + + + + + + + + + +
    {{ 'labels.inputs.Fees' | translate }} + {{ feesIncome.charge.name }} + {{ 'labels.inputs.Income Account' | translate }} + ({{ feesIncome.incomeAccount.glCode }}) {{ feesIncome.incomeAccount.name }} +
    +
    + } + @if (savingProduct.penaltyToIncomeAccountMappings?.length) { +
    +

    {{ 'labels.inputs.Penalties to Specific Income Accounts' | translate }}

    + + + + + + + + + + + +
    {{ 'labels.inputs.Penalty' | translate }} + {{ penaltyIncome.charge.name }} + {{ 'labels.inputs.Income Account' | translate }} + ({{ penaltyIncome.incomeAccount.glCode }}) {{ penaltyIncome.incomeAccount.name }} +
    +
    + }
    - -
    -

    {{ 'labels.inputs.Fees to Specific Income Accounts' | translate }}

    - - - - - - - - - - - - - - -
    {{ 'labels.inputs.Fees' | translate }} - {{ feesIncome.charge.name }} - {{ 'labels.inputs.Income Account' | translate }} - ({{ feesIncome.incomeAccount.glCode }}) {{ feesIncome.incomeAccount.name }} -
    -
    - -
    -

    {{ 'labels.inputs.Penalties to Specific Income Accounts' | translate }}

    - - - - - - - - - - - - - - -
    {{ 'labels.inputs.Penalty' | translate }} - {{ penaltyIncome.charge.name }} - {{ 'labels.inputs.Income Account' | translate }} - ({{ penaltyIncome.incomeAccount.glCode }}) {{ penaltyIncome.incomeAccount.name }} -
    -
    -
    + }
    diff --git a/src/app/products/saving-products/view-saving-product/saving-product-general-tab/saving-product-general-tab.component.ts b/src/app/products/saving-products/view-saving-product/saving-product-general-tab/saving-product-general-tab.component.ts index 3c1e6be6d..e594affcd 100644 --- a/src/app/products/saving-products/view-saving-product/saving-product-general-tab/saving-product-general-tab.component.ts +++ b/src/app/products/saving-products/view-saving-product/saving-product-general-tab/saving-product-general-tab.component.ts @@ -1,4 +1,4 @@ -import { Component } from '@angular/core'; +import { Component, inject } from '@angular/core'; import { ActivatedRoute, RouterLink } from '@angular/router'; import { Accounting } from 'app/core/utils/accounting'; import { FaIconComponent } from '@fortawesome/angular-fontawesome'; @@ -44,6 +44,9 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class SavingProductGeneralTabComponent { + private route = inject(ActivatedRoute); + private accounting = inject(Accounting); + savingProduct: any; chargesDisplayedColumns: string[] = [ @@ -61,10 +64,7 @@ export class SavingProductGeneralTabComponent { 'incomeAccountId' ]; - constructor( - private route: ActivatedRoute, - private accounting: Accounting - ) { + constructor() { this.route.data.subscribe((data: { savingProduct: any }) => { this.savingProduct = data.savingProduct; }); diff --git a/src/app/products/saving-products/view-saving-product/view-saving-product.component.html b/src/app/products/saving-products/view-saving-product/view-saving-product.component.html index 3038858b3..c9c0ec688 100644 --- a/src/app/products/saving-products/view-saving-product/view-saving-product.component.html +++ b/src/app/products/saving-products/view-saving-product/view-saving-product.component.html @@ -10,7 +10,7 @@ > {{ 'labels.heading.General' | translate }} - + @for (savingProductDatatable of savingProductDatatables; track savingProductDatatable) { {{ savingProductDatatable.registeredTableName }} - + } diff --git a/src/app/products/saving-products/view-saving-product/view-saving-product.component.ts b/src/app/products/saving-products/view-saving-product/view-saving-product.component.ts index 702936a0b..547f849da 100644 --- a/src/app/products/saving-products/view-saving-product/view-saving-product.component.ts +++ b/src/app/products/saving-products/view-saving-product/view-saving-product.component.ts @@ -1,4 +1,4 @@ -import { Component } from '@angular/core'; +import { Component, inject } from '@angular/core'; import { ActivatedRoute, RouterLinkActive, RouterLink, RouterOutlet } from '@angular/router'; import { MatTabNav, MatTabLink, MatTabNavPanel } from '@angular/material/tabs'; import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; @@ -17,9 +17,11 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ViewSavingProductComponent { + private route = inject(ActivatedRoute); + savingProductDatatables: any = []; - constructor(private route: ActivatedRoute) { + constructor() { this.route.data.subscribe((data: { savingProductDatatables: any }) => { this.savingProductDatatables = []; data.savingProductDatatables.forEach((datatable: any) => { diff --git a/src/app/products/share-products/create-dividend/create-dividend.component.html b/src/app/products/share-products/create-dividend/create-dividend.component.html index 8179b41dd..8ebb09bbd 100644 --- a/src/app/products/share-products/create-dividend/create-dividend.component.html +++ b/src/app/products/share-products/create-dividend/create-dividend.component.html @@ -15,10 +15,12 @@ /> - - {{ 'labels.inputs.Starting Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (createDividendForm.controls.dividendPeriodStartDate.hasError('required')) { + + {{ 'labels.inputs.Starting Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + }
    @@ -33,19 +35,23 @@ /> - - {{ 'labels.inputs.End Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (createDividendForm.controls.dividendPeriodEndDate.hasError('required')) { + + {{ 'labels.inputs.End Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Dividend Amount' | translate }} - - {{ 'labels.inputs.Amount' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (createDividendForm.controls.dividendAmount.hasError('required')) { + + {{ 'labels.inputs.Amount' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } diff --git a/src/app/products/share-products/create-dividend/create-dividend.component.ts b/src/app/products/share-products/create-dividend/create-dividend.component.ts index d8f325dff..93d2b00fd 100644 --- a/src/app/products/share-products/create-dividend/create-dividend.component.ts +++ b/src/app/products/share-products/create-dividend/create-dividend.component.ts @@ -1,5 +1,5 @@ /** Angular Imports. */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, Validators, ReactiveFormsModule } from '@angular/forms'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; import { Dates } from 'app/core/utils/dates'; @@ -21,6 +21,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class CreateDividendComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private route = inject(ActivatedRoute); + private dateUtils = inject(Dates); + private productService = inject(ProductsService); + private router = inject(Router); + private settingsService = inject(SettingsService); + /** Create Dividend Form. */ createDividendForm: UntypedFormGroup; /** Share Product data. */ @@ -39,14 +46,7 @@ export class CreateDividendComponent implements OnInit { * @param {Router} router Router. * @param {SettingsService} settingsService Settings Service. */ - constructor( - private formBuilder: UntypedFormBuilder, - private route: ActivatedRoute, - private dateUtils: Dates, - private productService: ProductsService, - private router: Router, - private settingsService: SettingsService - ) { + constructor() { this.route.data.subscribe((data: { shareProduct: any }) => { this.shareProductData = data.shareProduct; }); diff --git a/src/app/products/share-products/create-share-product/create-share-product.component.html b/src/app/products/share-products/create-share-product/create-share-product.component.html index a8d79daa0..72c51d60f 100644 --- a/src/app/products/share-products/create-share-product/create-share-product.component.html +++ b/src/app/products/share-products/create-share-product/create-share-product.component.html @@ -81,17 +81,18 @@ - - {{ 'labels.inputs.PREVIEW' | translate }} - - - - + @if (shareProductFormValid) { + + {{ 'labels.inputs.PREVIEW' | translate }} + + + + } diff --git a/src/app/products/share-products/create-share-product/create-share-product.component.ts b/src/app/products/share-products/create-share-product/create-share-product.component.ts index 552f4595b..ff1ab2eda 100644 --- a/src/app/products/share-products/create-share-product/create-share-product.component.ts +++ b/src/app/products/share-products/create-share-product/create-share-product.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, ViewChild } from '@angular/core'; +import { Component, ViewChild, inject } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; /** Custom Components */ @@ -42,6 +42,12 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class CreateShareProductComponent { + private route = inject(ActivatedRoute); + private productsService = inject(ProductsService); + private router = inject(Router); + private settingsService = inject(SettingsService); + private accounting = inject(Accounting); + @ViewChild(ShareProductDetailsStepComponent, { static: true }) shareProductDetailsStep: ShareProductDetailsStepComponent; @ViewChild(ShareProductCurrencyStepComponent, { static: true }) @@ -66,13 +72,7 @@ export class CreateShareProductComponent { * @param {SettingsService} settingsService Settings Service. */ - constructor( - private route: ActivatedRoute, - private productsService: ProductsService, - private router: Router, - private settingsService: SettingsService, - private accounting: Accounting - ) { + constructor() { this.route.data.subscribe((data: { shareProductsTemplate: any }) => { this.shareProductsTemplate = data.shareProductsTemplate; }); diff --git a/src/app/products/share-products/dividends-share-product/dividends.components.ts b/src/app/products/share-products/dividends-share-product/dividends.components.ts index ade7fc7cc..2d415df16 100644 --- a/src/app/products/share-products/dividends-share-product/dividends.components.ts +++ b/src/app/products/share-products/dividends-share-product/dividends.components.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, ViewChild } from '@angular/core'; +import { Component, OnInit, ViewChild, inject } from '@angular/core'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort, MatSortHeader } from '@angular/material/sort'; import { @@ -57,6 +57,9 @@ import { DateFormatPipe } from '../../../pipes/date-format.pipe'; ] }) export class ShareProductsDividendsComponent implements OnInit { + private route = inject(ActivatedRoute); + private router = inject(Router); + /** Dividends data. */ dividendData: any; /** Columns to be displayed in dividends table. */ @@ -79,10 +82,7 @@ export class ShareProductsDividendsComponent implements OnInit { * Retrieves the dividends data from `resolve`. * @param {ActivatedRoute} route Activated Route. */ - constructor( - private route: ActivatedRoute, - private router: Router - ) { + constructor() { this.route.data.subscribe((data: { dividends: any }) => { this.dividendData = data.dividends.pageItems; }); diff --git a/src/app/products/share-products/dividends-share-product/dividends.resolver.ts b/src/app/products/share-products/dividends-share-product/dividends.resolver.ts index 9b0f47065..f4dacab82 100644 --- a/src/app/products/share-products/dividends-share-product/dividends.resolver.ts +++ b/src/app/products/share-products/dividends-share-product/dividends.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { ProductsService } from '../../products.service'; */ @Injectable() export class DividendsResolver { - /** - * @param {ProductsService} productsService Products service. - */ - constructor(private productsService: ProductsService) {} + private productsService = inject(ProductsService); /** * Returns the share products data. diff --git a/src/app/products/share-products/edit-share-product/edit-share-product.component.html b/src/app/products/share-products/edit-share-product/edit-share-product.component.html index 2e0de9f4e..50bfa0354 100644 --- a/src/app/products/share-products/edit-share-product/edit-share-product.component.html +++ b/src/app/products/share-products/edit-share-product/edit-share-product.component.html @@ -87,17 +87,18 @@ - - {{ 'labels.inputs.PREVIEW' | translate }} - - - - + @if (shareProductFormValidAndNotPristine) { + + {{ 'labels.inputs.PREVIEW' | translate }} + + + + } diff --git a/src/app/products/share-products/edit-share-product/edit-share-product.component.ts b/src/app/products/share-products/edit-share-product/edit-share-product.component.ts index c8d20c2ab..0883f33db 100644 --- a/src/app/products/share-products/edit-share-product/edit-share-product.component.ts +++ b/src/app/products/share-products/edit-share-product/edit-share-product.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, ViewChild } from '@angular/core'; +import { Component, ViewChild, inject } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; /** Custom Components */ @@ -42,6 +42,12 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class EditShareProductComponent { + private route = inject(ActivatedRoute); + private productsService = inject(ProductsService); + private router = inject(Router); + private settingsService = inject(SettingsService); + private accounting = inject(Accounting); + @ViewChild(ShareProductDetailsStepComponent, { static: true }) shareProductDetailsStep: ShareProductDetailsStepComponent; @ViewChild(ShareProductCurrencyStepComponent, { static: true }) @@ -66,13 +72,7 @@ export class EditShareProductComponent { * @param {SettingsService} settingsService Settings Service. */ - constructor( - private route: ActivatedRoute, - private productsService: ProductsService, - private router: Router, - private settingsService: SettingsService, - private accounting: Accounting - ) { + constructor() { this.route.data.subscribe((data: { shareProductAndTemplate: any }) => { this.shareProductAndTemplate = data.shareProductAndTemplate; }); diff --git a/src/app/products/share-products/edit-share-product/share-product-and-template.resolver.ts b/src/app/products/share-products/edit-share-product/share-product-and-template.resolver.ts index efc1c6565..1716d9cfe 100644 --- a/src/app/products/share-products/edit-share-product/share-product-and-template.resolver.ts +++ b/src/app/products/share-products/edit-share-product/share-product-and-template.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { ProductsService } from '../../products.service'; */ @Injectable() export class ShareProductAndTemplateResolver { - /** - * @param {ProductsService} productsService Products service. - */ - constructor(private productsService: ProductsService) {} + private productsService = inject(ProductsService); /** * Returns the share product and template data. diff --git a/src/app/products/share-products/share-product-datatable.resolver.ts b/src/app/products/share-products/share-product-datatable.resolver.ts index 8e37eda26..6360faac1 100644 --- a/src/app/products/share-products/share-product-datatable.resolver.ts +++ b/src/app/products/share-products/share-product-datatable.resolver.ts @@ -1,4 +1,4 @@ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { Router, RouterStateSnapshot, ActivatedRouteSnapshot } from '@angular/router'; import { SystemService } from 'app/system/system.service'; import { Observable, of } from 'rxjs'; @@ -7,10 +7,7 @@ import { Observable, of } from 'rxjs'; providedIn: 'root' }) export class ShareProductDatatableResolver { - /** - * @param {SystemService} systemService Products service. - */ - constructor(private systemService: SystemService) {} + private systemService = inject(SystemService); /** * Returns the loan product data. diff --git a/src/app/products/share-products/share-product-datatables.resolver.ts b/src/app/products/share-products/share-product-datatables.resolver.ts index b1082e2a9..6e7e11d99 100644 --- a/src/app/products/share-products/share-product-datatables.resolver.ts +++ b/src/app/products/share-products/share-product-datatables.resolver.ts @@ -1,4 +1,4 @@ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { Router, RouterStateSnapshot, ActivatedRouteSnapshot } from '@angular/router'; import { SystemService } from 'app/system/system.service'; import { Observable, of } from 'rxjs'; @@ -7,10 +7,7 @@ import { Observable, of } from 'rxjs'; providedIn: 'root' }) export class ShareProductDatatablesResolver { - /** - * @param {SystemService} systemService Products service. - */ - constructor(private systemService: SystemService) {} + private systemService = inject(SystemService); /** * Returns the loan product data. diff --git a/src/app/products/share-products/share-product-resolver.ts b/src/app/products/share-products/share-product-resolver.ts index ec25d40c2..5998ff765 100644 --- a/src/app/products/share-products/share-product-resolver.ts +++ b/src/app/products/share-products/share-product-resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { ProductsService } from '../products.service'; */ @Injectable() export class ShareProductResolver { - /** - * @param {ProductsService} productsService Products service. - */ - constructor(private productsService: ProductsService) {} + private productsService = inject(ProductsService); /** * Returns the share product data. diff --git a/src/app/products/share-products/share-product-stepper/share-product-accounting-step/share-product-accounting-step.component.html b/src/app/products/share-products/share-product-stepper/share-product-accounting-step/share-product-accounting-step.component.html index f8b361bb8..52fca95f5 100644 --- a/src/app/products/share-products/share-product-stepper/share-product-accounting-step/share-product-accounting-step.component.html +++ b/src/app/products/share-products/share-product-stepper/share-product-accounting-step/share-product-accounting-step.component.html @@ -4,67 +4,58 @@ class="flex-98 layout-row gap-5percent layout-column.lt-md radio-group-spacing" formControlName="accountingRule" > - - {{ 'labels.accounting.' + accountingRule | translate }} - + @for (accountingRule of accountingRuleData; track accountingRule; let i = $index) { + + {{ 'labels.accounting.' + accountingRule | translate }} + + } -
    -

    {{ 'labels.heading.Assets' | translate }}

    - - - - - - -

    {{ 'labels.heading.Liabilities' | translate }}

    - - - - - - -

    {{ 'labels.heading.Share Equity' | translate }}

    - - - - - - -

    {{ 'labels.heading.Income' | translate }}

    - - - -
    + @if (shareProductAccountingForm.value.accountingRule === 2) { +
    +

    {{ 'labels.heading.Assets' | translate }}

    + + + +

    {{ 'labels.heading.Liabilities' | translate }}

    + + + +

    {{ 'labels.heading.Share Equity' | translate }}

    + + + +

    {{ 'labels.heading.Income' | translate }}

    + + +
    + }
    diff --git a/src/app/products/share-products/share-product-stepper/share-product-accounting-step/share-product-accounting-step.component.ts b/src/app/products/share-products/share-product-stepper/share-product-accounting-step/share-product-accounting-step.component.ts index 4f228235d..b74a2eabe 100644 --- a/src/app/products/share-products/share-product-stepper/share-product-accounting-step/share-product-accounting-step.component.ts +++ b/src/app/products/share-products/share-product-stepper/share-product-accounting-step/share-product-accounting-step.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit, Input } from '@angular/core'; +import { Component, OnInit, Input, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, @@ -29,6 +29,8 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ShareProductAccountingStepComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + @Input() shareProductsTemplate: any; @Input() accountingRuleData: any; @Input() shareProductFormValid: boolean; @@ -40,7 +42,7 @@ export class ShareProductAccountingStepComponent implements OnInit { equityAccountData: any; liabilityAccountData: any; - constructor(private formBuilder: UntypedFormBuilder) { + constructor() { this.createShareProductAccountingForm(); this.setConditionalControls(); } diff --git a/src/app/products/share-products/share-product-stepper/share-product-charges-step/share-product-charges-step.component.html b/src/app/products/share-products/share-product-stepper/share-product-charges-step/share-product-charges-step.component.html index b7cccc440..88119b983 100644 --- a/src/app/products/share-products/share-product-stepper/share-product-charges-step/share-product-charges-step.component.html +++ b/src/app/products/share-products/share-product-stepper/share-product-charges-step/share-product-charges-step.component.html @@ -2,12 +2,11 @@ {{ 'labels.inputs.Charge' | translate }} - - {{ charge.name }} - + @for (charge of chargeData | chargesFilter: chargesDataSource : currencyCode.value; track charge) { + + {{ charge.name }} + + } diff --git a/src/app/products/share-products/share-product-stepper/share-product-charges-step/share-product-charges-step.component.ts b/src/app/products/share-products/share-product-stepper/share-product-charges-step/share-product-charges-step.component.ts index 73bc5ccf1..de3480284 100644 --- a/src/app/products/share-products/share-product-stepper/share-product-charges-step/share-product-charges-step.component.ts +++ b/src/app/products/share-products/share-product-stepper/share-product-charges-step/share-product-charges-step.component.ts @@ -1,4 +1,4 @@ -import { Component, Input, OnInit } from '@angular/core'; +import { Component, Input, OnInit, inject } from '@angular/core'; import { UntypedFormControl } from '@angular/forms'; import { MatDialog } from '@angular/material/dialog'; @@ -48,6 +48,9 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ShareProductChargesStepComponent implements OnInit { + dialog = inject(MatDialog); + private translateService = inject(TranslateService); + @Input() shareProductsTemplate: any; @Input() currencyCode: UntypedFormControl; @@ -64,11 +67,6 @@ export class ShareProductChargesStepComponent implements OnInit { pristine = true; - constructor( - public dialog: MatDialog, - private translateService: TranslateService - ) {} - ngOnInit() { this.chargeData = this.shareProductsTemplate.chargeOptions; diff --git a/src/app/products/share-products/share-product-stepper/share-product-currency-step/share-product-currency-step.component.html b/src/app/products/share-products/share-product-stepper/share-product-currency-step/share-product-currency-step.component.html index d38e63ea4..b1ce564ce 100644 --- a/src/app/products/share-products/share-product-stepper/share-product-currency-step/share-product-currency-step.component.html +++ b/src/app/products/share-products/share-product-stepper/share-product-currency-step/share-product-currency-step.component.html @@ -7,9 +7,11 @@ formControlName="currencyCode" required > - - {{ currency.name }} - + @for (currency of currencyData; track currency) { + + {{ currency.name }} + + } {{ 'labels.inputs.Currency' | translate }} {{ 'labels.commons.is' | translate }} diff --git a/src/app/products/share-products/share-product-stepper/share-product-currency-step/share-product-currency-step.component.ts b/src/app/products/share-products/share-product-stepper/share-product-currency-step/share-product-currency-step.component.ts index 7d821466a..920c87ebe 100644 --- a/src/app/products/share-products/share-product-stepper/share-product-currency-step/share-product-currency-step.component.ts +++ b/src/app/products/share-products/share-product-stepper/share-product-currency-step/share-product-currency-step.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit, Input } from '@angular/core'; +import { Component, OnInit, Input, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, Validators, ReactiveFormsModule } from '@angular/forms'; import { MatTooltip } from '@angular/material/tooltip'; import { MatStepperPrevious, MatStepperNext } from '@angular/material/stepper'; @@ -18,13 +18,15 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ShareProductCurrencyStepComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + @Input() shareProductsTemplate: any; shareProductCurrencyForm: UntypedFormGroup; currencyData: any; - constructor(private formBuilder: UntypedFormBuilder) { + constructor() { this.createShareProductCurrencyForm(); } diff --git a/src/app/products/share-products/share-product-stepper/share-product-details-step/share-product-details-step.component.html b/src/app/products/share-products/share-product-stepper/share-product-details-step/share-product-details-step.component.html index d9f6f0d1a..5c07b7ce8 100644 --- a/src/app/products/share-products/share-product-stepper/share-product-details-step/share-product-details-step.component.html +++ b/src/app/products/share-products/share-product-stepper/share-product-details-step/share-product-details-step.component.html @@ -37,10 +37,12 @@ matTooltip="{{ 'tooltips.Provides additional information' | translate }}" required > - - {{ 'labels.inputs.Description' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (shareProductDetailsForm.get('description')?.hasError('required')) { + + {{ 'labels.inputs.Description' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + }
    diff --git a/src/app/products/share-products/share-product-stepper/share-product-details-step/share-product-details-step.component.ts b/src/app/products/share-products/share-product-stepper/share-product-details-step/share-product-details-step.component.ts index f07d32199..6abf1bb93 100644 --- a/src/app/products/share-products/share-product-stepper/share-product-details-step/share-product-details-step.component.ts +++ b/src/app/products/share-products/share-product-stepper/share-product-details-step/share-product-details-step.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit, Input } from '@angular/core'; +import { Component, OnInit, Input, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, Validators, ReactiveFormsModule } from '@angular/forms'; import { MatTooltip } from '@angular/material/tooltip'; import { MatStepperPrevious, MatStepperNext } from '@angular/material/stepper'; @@ -18,11 +18,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ShareProductDetailsStepComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + @Input() shareProductsTemplate: any; shareProductDetailsForm: UntypedFormGroup; - constructor(private formBuilder: UntypedFormBuilder) { + constructor() { this.createShareProductDetailsForm(); } diff --git a/src/app/products/share-products/share-product-stepper/share-product-market-price-step/share-product-market-price-step.component.html b/src/app/products/share-products/share-product-stepper/share-product-market-price-step/share-product-market-price-step.component.html index 7850b6857..1400826e5 100644 --- a/src/app/products/share-products/share-product-stepper/share-product-market-price-step/share-product-market-price-step.component.html +++ b/src/app/products/share-products/share-product-stepper/share-product-market-price-step/share-product-market-price-step.component.html @@ -13,41 +13,35 @@ - - - - - - - - - - - - - - - - - - -
    {{ 'labels.inputs.From Date' | translate }} - {{ marketPricePeriod.fromDate | dateFormat }} - {{ 'labels.inputs.Nominal/Unit Price' | translate }} - {{ marketPricePeriod.shareValue }} - {{ 'labels.inputs.Actions' | translate }} - - -
    + @if (marketPricePeriods.value.length) { + + + + + + + + + + + + + + + +
    {{ 'labels.inputs.From Date' | translate }} + {{ marketPricePeriod.fromDate | dateFormat }} + {{ 'labels.inputs.Nominal/Unit Price' | translate }} + {{ marketPricePeriod.shareValue }} + {{ 'labels.inputs.Actions' | translate }} + + +
    + }
    diff --git a/src/app/products/share-products/share-product-stepper/share-product-market-price-step/share-product-market-price-step.component.ts b/src/app/products/share-products/share-product-stepper/share-product-market-price-step/share-product-market-price-step.component.ts index 34cc97b41..31beb9fbf 100644 --- a/src/app/products/share-products/share-product-stepper/share-product-market-price-step/share-product-market-price-step.component.ts +++ b/src/app/products/share-products/share-product-stepper/share-product-market-price-step/share-product-market-price-step.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, Input } from '@angular/core'; +import { Component, OnInit, Input, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, UntypedFormArray } from '@angular/forms'; import { MatDialog } from '@angular/material/dialog'; @@ -58,6 +58,12 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ShareProductMarketPriceStepComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + dialog = inject(MatDialog); + private dateUtils = inject(Dates); + private settingsService = inject(SettingsService); + private translateService = inject(TranslateService); + @Input() shareProductsTemplate: any; shareProductMarketPriceForm: UntypedFormGroup; @@ -75,13 +81,7 @@ export class ShareProductMarketPriceStepComponent implements OnInit { * @param {SettingsService} settingsService Settings Service */ - constructor( - private formBuilder: UntypedFormBuilder, - public dialog: MatDialog, - private dateUtils: Dates, - private settingsService: SettingsService, - private translateService: TranslateService - ) { + constructor() { this.createShareProductMarketPriceForm(); } @@ -169,7 +169,6 @@ export class ShareProductMarketPriceStepComponent implements OnInit { required: true, order: 2 }) - ]; return formfields; } diff --git a/src/app/products/share-products/share-product-stepper/share-product-preview-step/share-product-preview-step.component.html b/src/app/products/share-products/share-product-stepper/share-product-preview-step/share-product-preview-step.component.html index 2ad9cef55..25d5cad5b 100644 --- a/src/app/products/share-products/share-product-stepper/share-product-preview-step/share-product-preview-step.component.html +++ b/src/app/products/share-products/share-product-stepper/share-product-preview-step/share-product-preview-step.component.html @@ -10,10 +10,12 @@ {{ shareProduct.shortName }}
    -
    - {{ 'labels.inputs.Description' | translate }}: - {{ shareProduct.description }} -
    + @if (shareProduct.description) { +
    + {{ 'labels.inputs.Description' | translate }}: + {{ shareProduct.description }} +
    + }

    {{ 'labels.heading.Currency' | translate }}

    @@ -73,92 +75,92 @@ }} -
    - {{ 'labels.inputs.Minimum Active Period' | translate }}: - {{ - shareProduct.minimumActivePeriodForDividends + - ' ' + - (shareProduct.minimumactiveperiodFrequencyType - | find: shareProductsTemplate.minimumActivePeriodFrequencyTypeOptions : 'id' : 'value') - }} -
    + @if (shareProduct.minimumActivePeriodForDividends) { +
    + {{ 'labels.inputs.Minimum Active Period' | translate }}: + {{ + shareProduct.minimumActivePeriodForDividends + + ' ' + + (shareProduct.minimumactiveperiodFrequencyType + | find: shareProductsTemplate.minimumActivePeriodFrequencyTypeOptions : 'id' : 'value') + }} +
    + } -
    - {{ 'labels.inputs.Lock-in Period' | translate }}: - {{ - shareProduct.lockinPeriodFrequency + - ' ' + - (shareProduct.lockinPeriodFrequencyType - | find: shareProductsTemplate.lockinPeriodFrequencyTypeOptions : 'id' : 'value') - }} -
    + @if (shareProduct.lockinPeriodFrequency) { +
    + {{ 'labels.inputs.Lock-in Period' | translate }}: + {{ + shareProduct.lockinPeriodFrequency + + ' ' + + (shareProduct.lockinPeriodFrequencyType + | find: shareProductsTemplate.lockinPeriodFrequencyTypeOptions : 'id' : 'value') + }} +
    + }
    {{ 'labels.inputs.Allow dividends for inactive clients' | translate }}: {{ shareProduct.allowDividendCalculationForInactiveClients | yesNo }}
    -
    -

    {{ 'labels.inputs.Market Price Period' | translate }}

    + @if (shareProduct.marketPricePeriods.length) { +
    +

    {{ 'labels.inputs.Market Price Period' | translate }}

    + + + + + + + + + + + + +
    {{ 'labels.inputs.From Date' | translate }} + {{ marketPricePeriod.fromDate | dateFormat }} + {{ 'labels.inputs.Nominal/Unit Price' | translate }} + {{ marketPricePeriod.shareValue | formatNumber }} +
    +
    + } - - - - - - - - - - - - - - -
    {{ 'labels.inputs.From Date' | translate }} - {{ marketPricePeriod.fromDate | dateFormat }} - {{ 'labels.inputs.Nominal/Unit Price' | translate }} - {{ marketPricePeriod.shareValue | formatNumber }} -
    -
    - -
    -

    {{ 'labels.heading.Charges' | translate }}

    - - - - - - - - - - - - - - - - - - - - - - - - - -
    {{ 'labels.inputs.Name' | translate }} - {{ charge.name + ', ' + charge.currency.displaySymbol }} - {{ 'labels.inputs.Type' | translate }} - {{ charge.chargeCalculationType.value | translateKey: 'catalogs' }} - {{ 'labels.inputs.Amount' | translate }} - {{ charge.amount | formatNumber }} - {{ 'labels.inputs.Collected On' | translate }} - {{ charge.chargeTimeType.value | translateKey: 'catalogs' }} -
    -
    + @if (shareProduct.chargesSelected.length) { +
    +

    {{ 'labels.heading.Charges' | translate }}

    + + + + + + + + + + + + + + + + + + + + +
    {{ 'labels.inputs.Name' | translate }} + {{ charge.name + ', ' + charge.currency.displaySymbol }} + {{ 'labels.inputs.Type' | translate }} + {{ charge.chargeCalculationType.value | translateKey: 'catalogs' }} + {{ 'labels.inputs.Amount' | translate }} + {{ charge.amount | formatNumber }} + {{ 'labels.inputs.Collected On' | translate }} + {{ charge.chargeTimeType.value | translateKey: 'catalogs' }} +
    +
    + }

    {{ 'labels.heading.Accounting' | translate }}

    @@ -168,47 +170,42 @@ {{ accountingRuleData[shareProduct.accountingRule - 1] }} -
    -

    {{ 'labels.heading.Assets' | translate }}

    - -
    - {{ 'labels.inputs.Share reference' | translate }}: - {{ - shareProduct.shareReferenceId - | find: shareProductsTemplate.accountingMappingOptions.assetAccountOptions : 'id' : 'name' - }} + @if (shareProduct.accountingRule === 2) { +
    +

    {{ 'labels.heading.Assets' | translate }}

    +
    + {{ 'labels.inputs.Share reference' | translate }}: + {{ + shareProduct.shareReferenceId + | find: shareProductsTemplate.accountingMappingOptions.assetAccountOptions : 'id' : 'name' + }} +
    +

    {{ 'labels.heading.Liabilities' | translate }}

    +
    + {{ 'labels.inputs.Share suspense control' | translate }}: + {{ + shareProduct.shareSuspenseId + | find: shareProductsTemplate.accountingMappingOptions.liabilityAccountOptions : 'id' : 'name' + }} +
    +

    {{ 'labels.heading.Share Equity' | translate }}

    +
    + {{ 'labels.inputs.Equity' | translate }}: + {{ + shareProduct.shareEquityId + | find: shareProductsTemplate.accountingMappingOptions.equityAccountOptions : 'id' : 'name' + }} +
    +

    {{ 'labels.heading.Income' | translate }}

    +
    + {{ 'labels.inputs.Income from fees' | translate }}: + {{ + shareProduct.incomeFromFeeAccountId + | find: shareProductsTemplate.accountingMappingOptions.incomeAccountOptions : 'id' : 'name' + }} +
    - -

    {{ 'labels.heading.Liabilities' | translate }}

    - -
    - {{ 'labels.inputs.Share suspense control' | translate }}: - {{ - shareProduct.shareSuspenseId - | find: shareProductsTemplate.accountingMappingOptions.liabilityAccountOptions : 'id' : 'name' - }} -
    - -

    {{ 'labels.heading.Share Equity' | translate }}

    - -
    - {{ 'labels.inputs.Equity' | translate }}: - {{ - shareProduct.shareEquityId - | find: shareProductsTemplate.accountingMappingOptions.equityAccountOptions : 'id' : 'name' - }} -
    - -

    {{ 'labels.heading.Income' | translate }}

    - -
    - {{ 'labels.inputs.Income from fees' | translate }}: - {{ - shareProduct.incomeFromFeeAccountId - | find: shareProductsTemplate.accountingMappingOptions.incomeAccountOptions : 'id' : 'name' - }} -
    -
    + }
    diff --git a/src/app/products/share-products/share-product-stepper/share-product-settings-step/share-product-settings-step.component.html b/src/app/products/share-products/share-product-stepper/share-product-settings-step/share-product-settings-step.component.html index 8ffe34b5b..07b523a44 100644 --- a/src/app/products/share-products/share-product-stepper/share-product-settings-step/share-product-settings-step.component.html +++ b/src/app/products/share-products/share-product-stepper/share-product-settings-step/share-product-settings-step.component.html @@ -45,12 +45,14 @@ {{ 'labels.inputs.Type' | translate }} - - {{ minimumActivePeriodFrequencyType.value | translateKey: 'catalogs' }} - + @for ( + minimumActivePeriodFrequencyType of minimumActivePeriodFrequencyTypeData; + track minimumActivePeriodFrequencyType + ) { + + {{ minimumActivePeriodFrequencyType.value | translateKey: 'catalogs' }} + + } @@ -67,12 +69,11 @@ {{ 'labels.inputs.Type' | translate }} - - {{ lockinPeriodFrequencyType.value | translateKey: 'catalogs' }} - + @for (lockinPeriodFrequencyType of lockinPeriodFrequencyTypeData; track lockinPeriodFrequencyType) { + + {{ lockinPeriodFrequencyType.value | translateKey: 'catalogs' }} + + } diff --git a/src/app/products/share-products/share-product-stepper/share-product-settings-step/share-product-settings-step.component.ts b/src/app/products/share-products/share-product-stepper/share-product-settings-step/share-product-settings-step.component.ts index b054d33c6..930f8b36a 100644 --- a/src/app/products/share-products/share-product-stepper/share-product-settings-step/share-product-settings-step.component.ts +++ b/src/app/products/share-products/share-product-stepper/share-product-settings-step/share-product-settings-step.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit, Input } from '@angular/core'; +import { Component, OnInit, Input, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, FormControl, Validators, ReactiveFormsModule } from '@angular/forms'; import { MatTooltip } from '@angular/material/tooltip'; import { MatCheckbox } from '@angular/material/checkbox'; @@ -20,6 +20,8 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ShareProductSettingsStepComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + @Input() shareProductsTemplate: any; shareProductSettingsForm: UntypedFormGroup; @@ -27,7 +29,7 @@ export class ShareProductSettingsStepComponent implements OnInit { minimumActivePeriodFrequencyTypeData: any; lockinPeriodFrequencyTypeData: any; - constructor(private formBuilder: UntypedFormBuilder) { + constructor() { this.createShareProductSettingsForm(); } diff --git a/src/app/products/share-products/share-product-stepper/share-product-terms-step/share-product-terms-step.component.html b/src/app/products/share-products/share-product-stepper/share-product-terms-step/share-product-terms-step.component.html index 14fe10bcf..3943751f9 100644 --- a/src/app/products/share-products/share-product-stepper/share-product-terms-step/share-product-terms-step.component.html +++ b/src/app/products/share-products/share-product-stepper/share-product-terms-step/share-product-terms-step.component.html @@ -10,13 +10,17 @@ required min="1" /> - - {{ 'labels.inputs.Total Number of Shares' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - {{ 'labels.inputs.Total Number of Shares' | translate }} must be at least 1 - + @if (shareProductTermsForm.get('totalShares').hasError('required')) { + + {{ 'labels.inputs.Total Number of Shares' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + @if (shareProductTermsForm.get('totalShares').hasError('min')) { + + {{ 'labels.inputs.Total Number of Shares' | translate }} must be at least 1 + + } @@ -29,13 +33,17 @@ required min="1" /> - - {{ 'labels.inputs.Shares to be Issued' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - {{ 'labels.inputs.Shares to be Issued' | translate }} must be at least 1 - + @if (shareProductTermsForm.get('sharesIssued').hasError('required')) { + + {{ 'labels.inputs.Shares to be Issued' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + @if (shareProductTermsForm.get('sharesIssued').hasError('min')) { + + {{ 'labels.inputs.Shares to be Issued' | translate }} must be at least 1 + + } @@ -48,13 +56,15 @@ required min="1" /> - - {{ 'labels.inputs.Nominal Price' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - {{ 'labels.inputs.Nominal Price' | translate }} must be at least 1 - + @if (shareProductTermsForm.get('unitPrice').hasError('required')) { + + {{ 'labels.inputs.Nominal Price' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + @if (shareProductTermsForm.get('unitPrice').hasError('min')) { + {{ 'labels.inputs.Nominal Price' | translate }} must be at least 1 + } diff --git a/src/app/products/share-products/share-product-stepper/share-product-terms-step/share-product-terms-step.component.ts b/src/app/products/share-products/share-product-stepper/share-product-terms-step/share-product-terms-step.component.ts index b0fb3766f..8b229089b 100644 --- a/src/app/products/share-products/share-product-stepper/share-product-terms-step/share-product-terms-step.component.ts +++ b/src/app/products/share-products/share-product-stepper/share-product-terms-step/share-product-terms-step.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit, Input } from '@angular/core'; +import { Component, OnInit, Input, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, Validators, ReactiveFormsModule } from '@angular/forms'; import { combineLatest } from 'rxjs'; import { MatFormField, MatLabel, MatError, MatHint } from '@angular/material/form-field'; @@ -21,11 +21,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ShareProductTermsStepComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + @Input() shareProductsTemplate: any; shareProductTermsForm: UntypedFormGroup; - constructor(private formBuilder: UntypedFormBuilder) { + constructor() { this.createShareProductTermsForm(); } @@ -58,19 +60,22 @@ export class ShareProductTermsStepComponent implements OnInit { '', [ Validators.required, - Validators.min(1)] + Validators.min(1) + ] ], sharesIssued: [ '', [ Validators.required, - Validators.min(1)] + Validators.min(1) + ] ], unitPrice: [ '', [ Validators.required, - Validators.min(1)] + Validators.min(1) + ] ], shareCapital: [''] }); diff --git a/src/app/products/share-products/share-products-template.resolver.ts b/src/app/products/share-products/share-products-template.resolver.ts index 5103ac388..97f70e4ca 100644 --- a/src/app/products/share-products/share-products-template.resolver.ts +++ b/src/app/products/share-products/share-products-template.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; /** rxjs Imports */ import { Observable } from 'rxjs'; @@ -9,7 +9,7 @@ import { ProductsService } from '../products.service'; @Injectable() export class ShareProductsTemplateResolver { - constructor(private productsService: ProductsService) {} + private productsService = inject(ProductsService); /** * Returns the share products template data. diff --git a/src/app/products/share-products/share-products.component.ts b/src/app/products/share-products/share-products.component.ts index 3c42ee60a..63720bd3d 100644 --- a/src/app/products/share-products/share-products.component.ts +++ b/src/app/products/share-products/share-products.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, TemplateRef, ElementRef, ViewChild, AfterViewInit } from '@angular/core'; +import { Component, OnInit, TemplateRef, ElementRef, ViewChild, AfterViewInit, inject } from '@angular/core'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort, MatSortHeader } from '@angular/material/sort'; import { @@ -46,6 +46,11 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ShareProductsComponent implements OnInit, AfterViewInit { + private route = inject(ActivatedRoute); + private router = inject(Router); + private configurationWizardService = inject(ConfigurationWizardService); + private popoverService = inject(PopoverService); + shareProductsData: any; displayedColumns: string[] = [ 'name', @@ -72,12 +77,7 @@ export class ShareProductsComponent implements OnInit, AfterViewInit { * @param {ConfigurationWizardService} configurationWizardService ConfigurationWizard Service. * @param {PopoverService} popoverService PopoverService. */ - constructor( - private route: ActivatedRoute, - private router: Router, - private configurationWizardService: ConfigurationWizardService, - private popoverService: PopoverService - ) { + constructor() { this.route.data.subscribe((data: { shareProducts: any }) => { this.shareProductsData = data.shareProducts.pageItems; }); diff --git a/src/app/products/share-products/share-products.resolver.ts b/src/app/products/share-products/share-products.resolver.ts index f25fc24ca..00404c044 100644 --- a/src/app/products/share-products/share-products.resolver.ts +++ b/src/app/products/share-products/share-products.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; /** rxjs Imports */ import { Observable } from 'rxjs'; @@ -12,11 +12,7 @@ import { ProductsService } from '../products.service'; */ @Injectable() export class ShareProductsResolver { - /** - * - * @param {ProductsService} productsService Products service. - */ - constructor(private productsService: ProductsService) {} + private productsService = inject(ProductsService); /** * Returns the share products data. diff --git a/src/app/products/share-products/view-dividend/view-dividend-data.resolver.ts b/src/app/products/share-products/view-dividend/view-dividend-data.resolver.ts index 7bd1625bc..323a618fe 100644 --- a/src/app/products/share-products/view-dividend/view-dividend-data.resolver.ts +++ b/src/app/products/share-products/view-dividend/view-dividend-data.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { ProductsService } from '../../products.service'; */ @Injectable() export class ViewDividendDataResolver { - /** - * @param {ProductsService} productsService Products service. - */ - constructor(private productsService: ProductsService) {} + private productsService = inject(ProductsService); /** * Returns the share products data. diff --git a/src/app/products/share-products/view-dividend/view-dividend.component.html b/src/app/products/share-products/view-dividend/view-dividend.component.html index fba495713..078ecb01c 100644 --- a/src/app/products/share-products/view-dividend/view-dividend.component.html +++ b/src/app/products/share-products/view-dividend/view-dividend.component.html @@ -1,9 +1,11 @@ -
    - -
    +@if (!isdividendPosted) { +
    + +
    +}
    diff --git a/src/app/products/share-products/view-dividend/view-dividend.component.ts b/src/app/products/share-products/view-dividend/view-dividend.component.ts index cd2c79018..9df1c370d 100644 --- a/src/app/products/share-products/view-dividend/view-dividend.component.ts +++ b/src/app/products/share-products/view-dividend/view-dividend.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit, ViewChild } from '@angular/core'; +import { Component, OnInit, ViewChild, inject } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort, MatSortHeader } from '@angular/material/sort'; @@ -42,6 +42,10 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ViewDividendComponent implements OnInit { + private route = inject(ActivatedRoute); + private productsService = inject(ProductsService); + private router = inject(Router); + dividendData: any; status: any; isdividendPosted = false; @@ -56,11 +60,7 @@ export class ViewDividendComponent implements OnInit { ]; dataSource: MatTableDataSource; - constructor( - private route: ActivatedRoute, - private productsService: ProductsService, - private router: Router - ) { + constructor() { this.route.data.subscribe((data: { dividendData: any }) => { this.dividendData = data.dividendData; }); diff --git a/src/app/products/share-products/view-share-product/share-product-datatable-tab/share-product-datatable-tab.component.ts b/src/app/products/share-products/view-share-product/share-product-datatable-tab/share-product-datatable-tab.component.ts index 1d964d524..e05642ef9 100644 --- a/src/app/products/share-products/view-share-product/share-product-datatable-tab/share-product-datatable-tab.component.ts +++ b/src/app/products/share-products/view-share-product/share-product-datatable-tab/share-product-datatable-tab.component.ts @@ -1,4 +1,4 @@ -import { Component } from '@angular/core'; +import { Component, inject } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; import { EntityDatatableTabComponent } from '../../../../shared/tabs/entity-datatable-tab/entity-datatable-tab.component'; import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; @@ -13,11 +13,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ShareProductDatatableTabComponent { + private route = inject(ActivatedRoute); + entityId: string; entityDatatable: any; multiRowDatatableFlag: boolean; - constructor(private route: ActivatedRoute) { + constructor() { this.entityId = this.route.parent.parent.snapshot.paramMap.get('productId'); this.route.data.subscribe((data: { shareProductDatatable: any }) => { diff --git a/src/app/products/share-products/view-share-product/share-product-general-tab/share-product-general-tab.component.html b/src/app/products/share-products/view-share-product/share-product-general-tab/share-product-general-tab.component.html index 7c4576c53..2e3a716a2 100644 --- a/src/app/products/share-products/view-share-product/share-product-general-tab/share-product-general-tab.component.html +++ b/src/app/products/share-products/view-share-product/share-product-general-tab/share-product-general-tab.component.html @@ -16,7 +16,7 @@
    + -->

    {{ shareProduct.name }}

    @@ -31,10 +31,12 @@ {{ shareProduct.shortName }}
    -
    - {{ 'labels.inputs.Description' | translate }}: - {{ shareProduct.description }} -
    + @if (shareProduct.description) { +
    + {{ 'labels.inputs.Description' | translate }}: + {{ shareProduct.description }} +
    + }

    {{ 'labels.heading.Currency' | translate }}

    @@ -95,89 +97,87 @@ }}
    -
    - {{ 'labels.inputs.Minimum Active Period' | translate }}: - {{ shareProduct.minimumActivePeriod }} - {{ shareProduct.minimumActivePeriodForDividendsTypeEnum.value | translateKey: 'catalogs' }} -
    + @if (shareProduct.minimumActivePeriod) { +
    + {{ 'labels.inputs.Minimum Active Period' | translate }}: + {{ shareProduct.minimumActivePeriod }} + {{ shareProduct.minimumActivePeriodForDividendsTypeEnum.value | translateKey: 'catalogs' }} +
    + } -
    - {{ 'labels.inputs.Lock-in Period' | translate }}: - {{ shareProduct.lockinPeriod }} {{ shareProduct.lockPeriodTypeEnum.value | translateKey: 'catalogs' }} -
    + @if (shareProduct.lockinPeriod) { +
    + {{ 'labels.inputs.Lock-in Period' | translate }}: + {{ shareProduct.lockinPeriod }} {{ shareProduct.lockPeriodTypeEnum.value | translateKey: 'catalogs' }} +
    + }
    {{ 'labels.inputs.Allow dividends for inactive clients' | translate }}: {{ shareProduct.allowDividendCalculationForInactiveClients | yesNo }}
    -
    -

    {{ 'labels.inputs.Market Price Period' | translate }}

    + @if (shareProduct.marketPrice?.length) { +
    +

    {{ 'labels.inputs.Market Price Period' | translate }}

    + + + + + + + + + + + + +
    {{ 'labels.inputs.From Date' | translate }} + {{ marketPrice.fromDate | dateFormat }} + {{ 'labels.inputs.Nominal/Unit Price' | translate }} + {{ marketPrice.shareValue | formatNumber }} +
    +
    + } - - - - - - - - - - - - - - - -
    {{ 'labels.inputs.From Date' | translate }} - {{ marketPrice.fromDate | dateFormat }} - {{ 'labels.inputs.Nominal/Unit Price' | translate }} - {{ marketPrice.shareValue | formatNumber }} -
    -
    - -
    -

    {{ 'labels.heading.Charges' | translate }}

    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    {{ 'labels.inputs.Name' | translate }} - {{ charge.name + ', ' + charge.currency.displaySymbol }} - {{ 'labels.inputs.Type' | translate }} - {{ charge.chargeCalculationType.value | translateKey: 'catalogs' }} - {{ 'labels.inputs.Amount' | translate }} - {{ charge.amount | numberFormat }} - {{ 'labels.inputs.Collected On' | translate }} - {{ charge.chargeTimeType.value | translateKey: 'catalogs' }} -
    -
    + @if (shareProduct.charges.length) { +
    +

    {{ 'labels.heading.Charges' | translate }}

    + + + + + + + + + + + + + + + + + + + + +
    {{ 'labels.inputs.Name' | translate }} + {{ charge.name + ', ' + charge.currency.displaySymbol }} + {{ 'labels.inputs.Type' | translate }} + {{ charge.chargeCalculationType.value | translateKey: 'catalogs' }} + {{ 'labels.inputs.Amount' | translate }} + {{ charge.amount | numberFormat }} + {{ 'labels.inputs.Collected On' | translate }} + {{ charge.chargeTimeType.value | translateKey: 'catalogs' }} +
    +
    + }

    {{ 'labels.heading.Accounting' | translate }}

    @@ -190,55 +190,50 @@ }}
    -
    -

    {{ 'labels.heading.Assets' | translate }}

    - -
    - - + @if (shareProduct.accountingRule.id === 2) { +
    +

    {{ 'labels.heading.Assets' | translate }}

    +
    + + +
    +

    {{ 'labels.heading.Liabilities' | translate }}

    +
    + + +
    +

    {{ 'labels.heading.Share Equity' | translate }}

    +
    + + +
    +

    {{ 'labels.heading.Income' | translate }}

    +
    + + +
    - -

    {{ 'labels.heading.Liabilities' | translate }}

    - -
    - - -
    - -

    {{ 'labels.heading.Share Equity' | translate }}

    - -
    - - -
    - -

    {{ 'labels.heading.Income' | translate }}

    - -
    - - -
    -
    + } diff --git a/src/app/products/share-products/view-share-product/share-product-general-tab/share-product-general-tab.component.ts b/src/app/products/share-products/view-share-product/share-product-general-tab/share-product-general-tab.component.ts index 1b5b08b18..d40d19fea 100644 --- a/src/app/products/share-products/view-share-product/share-product-general-tab/share-product-general-tab.component.ts +++ b/src/app/products/share-products/view-share-product/share-product-general-tab/share-product-general-tab.component.ts @@ -1,4 +1,4 @@ -import { Component } from '@angular/core'; +import { Component, inject } from '@angular/core'; import { ActivatedRoute, RouterLink } from '@angular/router'; import { Accounting } from 'app/core/utils/accounting'; import { FaIconComponent } from '@fortawesome/angular-fontawesome'; @@ -46,6 +46,9 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ShareProductGeneralTabComponent { + private route = inject(ActivatedRoute); + private accounting = inject(Accounting); + shareProduct: any; marketPriceDisplayedColumns: string[] = [ @@ -59,10 +62,7 @@ export class ShareProductGeneralTabComponent { 'chargeTimeType' ]; - constructor( - private route: ActivatedRoute, - private accounting: Accounting - ) { + constructor() { this.route.data.subscribe((data: { shareProduct: any }) => { this.shareProduct = data.shareProduct; }); diff --git a/src/app/products/share-products/view-share-product/view-share-product.component.html b/src/app/products/share-products/view-share-product/view-share-product.component.html index fb95239ad..7640e466c 100644 --- a/src/app/products/share-products/view-share-product/view-share-product.component.html +++ b/src/app/products/share-products/view-share-product/view-share-product.component.html @@ -10,7 +10,7 @@ > {{ 'labels.inputs.General' | translate }} - + @for (shareProductDatatable of shareProductDatatables; track shareProductDatatable) { {{ shareProductDatatable.registeredTableName }} - + } diff --git a/src/app/products/share-products/view-share-product/view-share-product.component.ts b/src/app/products/share-products/view-share-product/view-share-product.component.ts index 9f2298498..915605811 100644 --- a/src/app/products/share-products/view-share-product/view-share-product.component.ts +++ b/src/app/products/share-products/view-share-product/view-share-product.component.ts @@ -1,4 +1,4 @@ -import { Component } from '@angular/core'; +import { Component, inject } from '@angular/core'; import { ActivatedRoute, RouterLinkActive, RouterLink, RouterOutlet } from '@angular/router'; import { MatTabNav, MatTabLink, MatTabNavPanel } from '@angular/material/tabs'; import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; @@ -17,9 +17,11 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ViewShareProductComponent { + private route = inject(ActivatedRoute); + shareProductDatatables: any = []; - constructor(private route: ActivatedRoute) { + constructor() { this.route.data.subscribe((data: { shareProductDatatables: any }) => { this.shareProductDatatables = []; data.shareProductDatatables.forEach((datatable: any) => { diff --git a/src/app/profile/profile-routing.module.ts b/src/app/profile/profile-routing.module.ts index cfdda83e8..9c86f5515 100644 --- a/src/app/profile/profile-routing.module.ts +++ b/src/app/profile/profile-routing.module.ts @@ -17,7 +17,6 @@ const routes: Routes = [ data: { title: 'Profile', breadcrumb: 'Profile' } } ]) - ]; /** diff --git a/src/app/profile/profile.component.ts b/src/app/profile/profile.component.ts index 3c11986b8..fcadff29b 100644 --- a/src/app/profile/profile.component.ts +++ b/src/app/profile/profile.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { MatDialog } from '@angular/material/dialog'; import { MatTableDataSource, @@ -46,6 +46,11 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ProfileComponent implements OnInit { + private authenticationService = inject(AuthenticationService); + private settingsService = inject(SettingsService); + private router = inject(Router); + dialog = inject(MatDialog); + /** Profile Data */ profileData: any; /** Language, TODO: Update when df, locale settings are setup */ @@ -65,12 +70,9 @@ export class ProfileComponent implements OnInit { * @param {Router} router Router * @param {MatDialog} dialog Mat Dialog */ - constructor( - private authenticationService: AuthenticationService, - private settingsService: SettingsService, - private router: Router, - public dialog: MatDialog - ) { + constructor() { + const authenticationService = this.authenticationService; + this.profileData = authenticationService.getCredentials(); } diff --git a/src/app/reports/common-resolvers/reports.resolver.ts b/src/app/reports/common-resolvers/reports.resolver.ts index c17d9fe34..8fbf1de98 100644 --- a/src/app/reports/common-resolvers/reports.resolver.ts +++ b/src/app/reports/common-resolvers/reports.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; /** rxjs Imports */ import { Observable } from 'rxjs'; @@ -12,10 +12,7 @@ import { ReportsService } from '../reports.service'; */ @Injectable() export class ReportsResolver { - /** - * @param {ReportsService} reportsService Reports service. - */ - constructor(private reportsService: ReportsService) {} + private reportsService = inject(ReportsService); /** * Returns the reports data. diff --git a/src/app/reports/common-resolvers/run-report.resolver.ts b/src/app/reports/common-resolvers/run-report.resolver.ts index 7de92cd33..b991f9502 100644 --- a/src/app/reports/common-resolvers/run-report.resolver.ts +++ b/src/app/reports/common-resolvers/run-report.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { ReportsService } from '../reports.service'; */ @Injectable() export class RunReportResolver { - /** - * @param {ReportsService} reportsService Reports service. - */ - constructor(private reportsService: ReportsService) {} + private reportsService = inject(ReportsService); /** * Returns the report parameters data. diff --git a/src/app/reports/reports-routing.module.ts b/src/app/reports/reports-routing.module.ts index 126c07e40..80b7ff42b 100644 --- a/src/app/reports/reports-routing.module.ts +++ b/src/app/reports/reports-routing.module.ts @@ -46,7 +46,6 @@ const routes: Routes = [ ] } ]) - ]; /** diff --git a/src/app/reports/reports.component.ts b/src/app/reports/reports.component.ts index b2057414f..7b035528f 100644 --- a/src/app/reports/reports.component.ts +++ b/src/app/reports/reports.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, ViewChild } from '@angular/core'; +import { Component, OnInit, ViewChild, inject } from '@angular/core'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort, MatSortHeader } from '@angular/material/sort'; import { @@ -43,6 +43,9 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ReportsComponent implements OnInit { + private route = inject(ActivatedRoute); + private router = inject(Router); + /** Reports data. */ reportsData: any; /** Report category filter. */ @@ -67,10 +70,7 @@ export class ReportsComponent implements OnInit { * Prevents reuse of route parameter `filter`. * @param {Router} router: Router. */ - constructor( - private route: ActivatedRoute, - private router: Router - ) { + constructor() { this.router.routeReuseStrategy.shouldReuseRoute = () => false; this.route.data.subscribe((data: { reports: any }) => { this.reportsData = data.reports; diff --git a/src/app/reports/reports.service.ts b/src/app/reports/reports.service.ts index a3337e350..a36d0dd91 100644 --- a/src/app/reports/reports.service.ts +++ b/src/app/reports/reports.service.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { HttpClient, HttpParams } from '@angular/common/http'; /** rxjs Imports */ @@ -18,10 +18,7 @@ import { ChartData } from './common-models/chart-data.model'; providedIn: 'root' }) export class ReportsService { - /** - * @param {HttpClient} http Http Client to send requests. - */ - constructor(private http: HttpClient) {} + private http = inject(HttpClient); /** * @returns {Observable} Reports data diff --git a/src/app/reports/run-report/chart/chart.component.ts b/src/app/reports/run-report/chart/chart.component.ts index 48bc2a1ef..8fa599126 100644 --- a/src/app/reports/run-report/chart/chart.component.ts +++ b/src/app/reports/run-report/chart/chart.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnChanges, Input } from '@angular/core'; +import { Component, OnChanges, Input, inject } from '@angular/core'; /** Custom Services */ import { ReportsService } from '../../reports.service'; @@ -31,6 +31,8 @@ Chart.register(...registerables); ] }) export class ChartComponent implements OnChanges { + private reportsService = inject(ReportsService); + /** Run Report Data */ @Input() dataObject: any; @@ -41,11 +43,6 @@ export class ChartComponent implements OnChanges { /** Data object for witching charts in view. */ inputData: ChartData; - /** - * @param {ReportsService} reportsService Reports Service - */ - constructor(private reportsService: ReportsService) {} - /** * Fetches run report data post changes in run report form. */ diff --git a/src/app/reports/run-report/pentaho/pentaho.component.html b/src/app/reports/run-report/pentaho/pentaho.component.html index f4ae97fb1..cc955b276 100644 --- a/src/app/reports/run-report/pentaho/pentaho.component.html +++ b/src/app/reports/run-report/pentaho/pentaho.component.html @@ -1 +1,3 @@ - +@if (!hideOutput) { + +} diff --git a/src/app/reports/run-report/pentaho/pentaho.component.ts b/src/app/reports/run-report/pentaho/pentaho.component.ts index 2bf2a6afd..9b6205a67 100644 --- a/src/app/reports/run-report/pentaho/pentaho.component.ts +++ b/src/app/reports/run-report/pentaho/pentaho.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnChanges, Input } from '@angular/core'; +import { Component, OnChanges, Input, inject } from '@angular/core'; import { DomSanitizer } from '@angular/platform-browser'; /** Custom Services */ @@ -20,6 +20,11 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class PentahoComponent implements OnChanges { + private sanitizer = inject(DomSanitizer); + private reportsService = inject(ReportsService); + private settingsService = inject(SettingsService); + private progressBarService = inject(ProgressBarService); + /** Run Report Data */ @Input() dataObject: any; @@ -28,18 +33,6 @@ export class PentahoComponent implements OnChanges { /** trusted resource url for pentaho output */ pentahoUrl: any; - /** - * @param {DomSanitizer} sanitizer DOM Sanitizer - * @param {ReportsService} reportsService Reports Service - * @param {SettingsService} settingsService Settings Service - */ - constructor( - private sanitizer: DomSanitizer, - private reportsService: ReportsService, - private settingsService: SettingsService, - private progressBarService: ProgressBarService - ) {} - /** * Fetches run report data post changes in run report form. */ diff --git a/src/app/reports/run-report/run-report.component.ts b/src/app/reports/run-report/run-report.component.ts index 5e99afa6a..fc4b360a9 100644 --- a/src/app/reports/run-report/run-report.component.ts +++ b/src/app/reports/run-report/run-report.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { ActivatedRoute, RouterLink } from '@angular/router'; import { AbstractControl, @@ -49,6 +49,12 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class RunReportComponent implements OnInit { + private route = inject(ActivatedRoute); + private reportsService = inject(ReportsService); + private settingsService = inject(SettingsService); + private alertService = inject(AlertService); + private dateUtils = inject(Dates); + /** Minimum date allowed. */ minDate = new Date(2000, 0, 1); /** Maximum date allowed. */ @@ -94,13 +100,7 @@ export class RunReportComponent implements OnInit { * @param {SettingsService} settingsService Settings Service * @param {Dates} dateUtils Date Utils */ - constructor( - private route: ActivatedRoute, - private reportsService: ReportsService, - private settingsService: SettingsService, - private alertService: AlertService, - private dateUtils: Dates - ) { + constructor() { this.report.name = this.route.snapshot.params['name']; this.route.queryParams.subscribe((queryParams: { type: any; id: any }) => { this.report.type = queryParams.type; diff --git a/src/app/reports/run-report/table-and-sms/table-and-sms.component.html b/src/app/reports/run-report/table-and-sms/table-and-sms.component.html index 2da12c546..5d15003d3 100644 --- a/src/app/reports/run-report/table-and-sms/table-and-sms.component.html +++ b/src/app/reports/run-report/table-and-sms/table-and-sms.component.html @@ -1,65 +1,79 @@
    -
    -
    - - -
    - -
    - -
    - -
    - - + @if (!hideOutput && !toBeExportedToRepo) { +
    + @if (dataObject.report.type === 'Table') { +
    + + +
    + } +
    +
    {{ column }} - {{ toDecimal(param.row[i]) }} - {{ param.row[i] }} -
    + @for (column of displayedColumns; track column; let i = $index) { +
    + +
    + + + + } + + +
    {{ column }} + @if (isDecimal(i)) { + {{ toDecimal(param.row[i]) }} + } + @if (!isDecimal(i)) { + {{ param.row[i] }} + } +
    + +
    +
    +
    + + {{ 'labels.text.No report data was generated' | translate }}
    - - - - -
    - -
    -
    - - {{ 'labels.text.No report data was generated' | translate }}
    -
    + } -
    -
    - - {{ 'labels.text.The report request' | translate }} + @if (!hideOutput && toBeExportedToRepo) { +
    +
    + + {{ 'labels.text.The report request' | translate }} +
    -
    + } -
    -
    -
    + @if (hideOutput) { +
    +
    +
    + } -
    - -
    + @if (!hideOutput) { +
    + +
    + }
    diff --git a/src/app/reports/run-report/table-and-sms/table-and-sms.component.ts b/src/app/reports/run-report/table-and-sms/table-and-sms.component.ts index 88cdddc31..55c2281b2 100644 --- a/src/app/reports/run-report/table-and-sms/table-and-sms.component.ts +++ b/src/app/reports/run-report/table-and-sms/table-and-sms.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, Input, ViewChild, OnChanges } from '@angular/core'; +import { Component, Input, ViewChild, OnChanges, inject } from '@angular/core'; import { MatPaginator } from '@angular/material/paginator'; import { MatTableDataSource, @@ -14,7 +14,7 @@ import { MatRowDef, MatRow } from '@angular/material/table'; -import { DecimalPipe, NgIf, NgFor } from '@angular/common'; +import { DecimalPipe } from '@angular/common'; /** Custom Servies */ import { ReportsService } from '../../reports.service'; @@ -54,6 +54,11 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class TableAndSmsComponent implements OnChanges { + private reportsService = inject(ReportsService); + dialog = inject(MatDialog); + private decimalPipe = inject(DecimalPipe); + private progressBarService = inject(ProgressBarService); + /** Run Report Data */ @Input() dataObject: any; @@ -73,17 +78,6 @@ export class TableAndSmsComponent implements OnChanges { /** Paginator for run-report table. */ @ViewChild(MatPaginator) paginator: MatPaginator; - /** - * @param {ReportsService} reportsService Reports Service - * @param {DecimalPipe} decimalPipe Decimal Pipe - */ - constructor( - private reportsService: ReportsService, - public dialog: MatDialog, - private decimalPipe: DecimalPipe, - private progressBarService: ProgressBarService - ) {} - /** * Fetches run report data post changes in run report form. */ @@ -154,7 +148,6 @@ export class TableAndSmsComponent implements OnChanges { required: true, order: 2 }) - ]; const data = { title: 'Export data to File', diff --git a/src/app/savings/common-resolvers/saving-documents.resolver.ts b/src/app/savings/common-resolvers/saving-documents.resolver.ts index 3cc0ad858..49ef37266 100644 --- a/src/app/savings/common-resolvers/saving-documents.resolver.ts +++ b/src/app/savings/common-resolvers/saving-documents.resolver.ts @@ -1,4 +1,4 @@ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; import { Observable } from 'rxjs'; import { SavingsService } from '../savings.service'; @@ -7,10 +7,7 @@ import { SavingsService } from '../savings.service'; providedIn: 'root' }) export class SavingDocumentsResolver { - /** - * @param {SavingsService} savingsService Savings service. - */ - constructor(private savingsService: SavingsService) {} + private savingsService = inject(SavingsService); /** * Returns the Savings data. diff --git a/src/app/savings/common-resolvers/saving-notes.resolver.ts b/src/app/savings/common-resolvers/saving-notes.resolver.ts index 7bcddb1ed..bde741168 100644 --- a/src/app/savings/common-resolvers/saving-notes.resolver.ts +++ b/src/app/savings/common-resolvers/saving-notes.resolver.ts @@ -1,4 +1,4 @@ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; import { Observable } from 'rxjs'; import { SavingsService } from '../savings.service'; @@ -7,10 +7,7 @@ import { SavingsService } from '../savings.service'; providedIn: 'root' }) export class SavingNotesResolver { - /** - * @param {SavingsService} savingsService Savings service. - */ - constructor(private savingsService: SavingsService) {} + private savingsService = inject(SavingsService); /** * Returns the Savings data. diff --git a/src/app/savings/common-resolvers/savings-account-actions.resolver.ts b/src/app/savings/common-resolvers/savings-account-actions.resolver.ts index cabbc7a74..c95649660 100644 --- a/src/app/savings/common-resolvers/savings-account-actions.resolver.ts +++ b/src/app/savings/common-resolvers/savings-account-actions.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { SavingsService } from '../savings.service'; */ @Injectable() export class SavingsAccountActionsResolver { - /** - * @param {SavingsService} SavingsService Savings service. - */ - constructor(private savingsService: SavingsService) {} + private savingsService = inject(SavingsService); /** * Returns the Savings account actions data. @@ -39,7 +36,8 @@ export class SavingsAccountActionsResolver { case 'Close': return forkJoin([ this.savingsService.getSavingsTransactionTemplateResource(savingAccountId), - this.savingsService.getSavingsAccountData(savingAccountId)]); + this.savingsService.getSavingsAccountData(savingAccountId) + ]); case 'Apply Annual Fees': return this.savingsService.getSavingsAccountData(savingAccountId); default: diff --git a/src/app/savings/common-resolvers/savings-account-and-template.resolver.ts b/src/app/savings/common-resolvers/savings-account-and-template.resolver.ts index 2e76f3b83..e83586ea1 100644 --- a/src/app/savings/common-resolvers/savings-account-and-template.resolver.ts +++ b/src/app/savings/common-resolvers/savings-account-and-template.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { SavingsService } from '../savings.service'; */ @Injectable() export class SavingsAccountAndTemplateResolver { - /** - * @param {SavingsService} SavingsService Savings service. - */ - constructor(private savingsService: SavingsService) {} + private savingsService = inject(SavingsService); /** * Returns the Savings Account data and template. diff --git a/src/app/savings/common-resolvers/savings-account-charge.resolver.ts b/src/app/savings/common-resolvers/savings-account-charge.resolver.ts index 0fef92e1e..728af907c 100644 --- a/src/app/savings/common-resolvers/savings-account-charge.resolver.ts +++ b/src/app/savings/common-resolvers/savings-account-charge.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { SavingsService } from '../savings.service'; */ @Injectable() export class SavingsAccountChargeResolver { - /** - * @param {SavingsService} SavingsService Savings service. - */ - constructor(private savingsService: SavingsService) {} + private savingsService = inject(SavingsService); /** * Returns the Savings Account Charge data. diff --git a/src/app/savings/common-resolvers/savings-account-template.resolver.ts b/src/app/savings/common-resolvers/savings-account-template.resolver.ts index 6ad4c3117..19a6125df 100644 --- a/src/app/savings/common-resolvers/savings-account-template.resolver.ts +++ b/src/app/savings/common-resolvers/savings-account-template.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { SavingsService } from '../savings.service'; */ @Injectable() export class SavingsAccountTemplateResolver { - /** - * @param {savingsService} SavingsService Savings service. - */ - constructor(private savingsService: SavingsService) {} + private savingsService = inject(SavingsService); /** * Returns the Shares Account Template. diff --git a/src/app/savings/common-resolvers/savings-account-transaction-template.resolver.ts b/src/app/savings/common-resolvers/savings-account-transaction-template.resolver.ts index e21566a8e..51a62659c 100644 --- a/src/app/savings/common-resolvers/savings-account-transaction-template.resolver.ts +++ b/src/app/savings/common-resolvers/savings-account-transaction-template.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { SavingsService } from '../savings.service'; */ @Injectable() export class SavingsAccountTransactionTemplateResolver { - /** - * @param {SavingsService} SavingsService Savings service. - */ - constructor(private savingsService: SavingsService) {} + private savingsService = inject(SavingsService); /** * Returns the Savings Account Transaction Template data. diff --git a/src/app/savings/common-resolvers/savings-account-transaction.resolver.ts b/src/app/savings/common-resolvers/savings-account-transaction.resolver.ts index 538be0d02..c870c5270 100644 --- a/src/app/savings/common-resolvers/savings-account-transaction.resolver.ts +++ b/src/app/savings/common-resolvers/savings-account-transaction.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { SavingsService } from '../savings.service'; */ @Injectable() export class SavingsAccountTransactionResolver { - /** - * @param {SavingsService} SavingsService Savings service. - */ - constructor(private savingsService: SavingsService) {} + private savingsService = inject(SavingsService); /** * Returns the Savings Account Transaction data. diff --git a/src/app/savings/common-resolvers/savings-account-view.resolver.ts b/src/app/savings/common-resolvers/savings-account-view.resolver.ts index b95cadcba..7a85e7cdd 100644 --- a/src/app/savings/common-resolvers/savings-account-view.resolver.ts +++ b/src/app/savings/common-resolvers/savings-account-view.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { SavingsService } from '../savings.service'; */ @Injectable() export class SavingsAccountViewResolver { - /** - * @param {SavingsService} SavingsService Savings service. - */ - constructor(private savingsService: SavingsService) {} + private savingsService = inject(SavingsService); /** * Returns the Savings Account data. diff --git a/src/app/savings/common-resolvers/savings-datatable.resolver.ts b/src/app/savings/common-resolvers/savings-datatable.resolver.ts index 6ea418d8e..9be707540 100644 --- a/src/app/savings/common-resolvers/savings-datatable.resolver.ts +++ b/src/app/savings/common-resolvers/savings-datatable.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { SavingsService } from '../savings.service'; */ @Injectable() export class SavingsDatatableResolver { - /** - * @param {SavingsService} SavingsService Savings service. - */ - constructor(private savingsService: SavingsService) {} + private savingsService = inject(SavingsService); /** * Returns the Savings Account's Datatable data. diff --git a/src/app/savings/common-resolvers/savings-datatables.resolver.ts b/src/app/savings/common-resolvers/savings-datatables.resolver.ts index a68cdb06f..11d5f851c 100644 --- a/src/app/savings/common-resolvers/savings-datatables.resolver.ts +++ b/src/app/savings/common-resolvers/savings-datatables.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { SavingsService } from '../savings.service'; */ @Injectable() export class SavingsDatatablesResolver { - /** - * @param {SavingsService} SavingsService Savings service. - */ - constructor(private savingsService: SavingsService) {} + private savingsService = inject(SavingsService); /** * Returns the Saving Account's Datatables data. diff --git a/src/app/savings/common-resolvers/savings-transaction-reciept.resolver.ts b/src/app/savings/common-resolvers/savings-transaction-reciept.resolver.ts index f7feaaaa1..3218d9a42 100644 --- a/src/app/savings/common-resolvers/savings-transaction-reciept.resolver.ts +++ b/src/app/savings/common-resolvers/savings-transaction-reciept.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -14,14 +14,8 @@ import { SettingsService } from 'app/settings/settings.service'; */ @Injectable() export class SavingsTransactionRecieptResolver { - /** - * @param {ReportsService} reportsService Reports service. - * @param {SettingsService} settingsService Settings Service. - */ - constructor( - private reportsService: ReportsService, - private settingsService: SettingsService - ) {} + private reportsService = inject(ReportsService); + private settingsService = inject(SettingsService); /** * Returns the Savings Transaction Reciept diff --git a/src/app/savings/common-resolvers/transaction-datatable.resolver.ts b/src/app/savings/common-resolvers/transaction-datatable.resolver.ts index 8799f9753..f46825f00 100644 --- a/src/app/savings/common-resolvers/transaction-datatable.resolver.ts +++ b/src/app/savings/common-resolvers/transaction-datatable.resolver.ts @@ -1,5 +1,5 @@ // Angular Imports -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; // rxjs Imports @@ -10,11 +10,8 @@ import { SavingsService } from '../savings.service'; @Injectable() export class TransactionDatatableResolver { - /** - * - * @param {SavingsService} savingsService - */ - constructor(private savingsService: SavingsService) {} + private savingsService = inject(SavingsService); + /** * Returns the Transactions Account's Datatable data. * @returns {Observable} diff --git a/src/app/savings/common-resolvers/transaction-datatables.resolver.ts b/src/app/savings/common-resolvers/transaction-datatables.resolver.ts index eef095be5..8bb3d7164 100644 --- a/src/app/savings/common-resolvers/transaction-datatables.resolver.ts +++ b/src/app/savings/common-resolvers/transaction-datatables.resolver.ts @@ -1,5 +1,5 @@ // Angular Imports -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; // rxjs Imports @@ -10,11 +10,8 @@ import { SavingsService } from '../savings.service'; @Injectable() export class TransactionDatatablesResolver { - /** - * - * @param savingsService Savings Service - */ - constructor(private savingsService: SavingsService) {} + private savingsService = inject(SavingsService); + /** * * @param route diff --git a/src/app/savings/create-savings-account/create-savings-account.component.html b/src/app/savings/create-savings-account/create-savings-account.component.html index cd98bc558..e1fb0d9c4 100644 --- a/src/app/savings/create-savings-account/create-savings-account.component.html +++ b/src/app/savings/create-savings-account/create-savings-account.component.html @@ -55,17 +55,18 @@ - - {{ 'labels.inputs.PREVIEW' | translate }} - - - - + @if (savingsAccountFormValid) { + + {{ 'labels.inputs.PREVIEW' | translate }} + + + + }
    diff --git a/src/app/savings/create-savings-account/create-savings-account.component.ts b/src/app/savings/create-savings-account/create-savings-account.component.ts index e1511acd3..4cfa384cb 100644 --- a/src/app/savings/create-savings-account/create-savings-account.component.ts +++ b/src/app/savings/create-savings-account/create-savings-account.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, ViewChild } from '@angular/core'; +import { Component, ViewChild, inject } from '@angular/core'; import { Router, ActivatedRoute } from '@angular/router'; /** Custom Components */ @@ -37,6 +37,12 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class CreateSavingsAccountComponent { + private route = inject(ActivatedRoute); + private router = inject(Router); + private dateUtils = inject(Dates); + private savingsService = inject(SavingsService); + private settingsService = inject(SettingsService); + /** Savings Account Template */ savingsAccountTemplate: any; /** Savings Account Product Template */ @@ -60,13 +66,7 @@ export class CreateSavingsAccountComponent { * @param {SavingsService} savingsService Savings Service * @param {SettingsService} settingsService Settings Service */ - constructor( - private route: ActivatedRoute, - private router: Router, - private dateUtils: Dates, - private savingsService: SavingsService, - private settingsService: SettingsService - ) { + constructor() { this.route.data.subscribe((data: { savingsAccountTemplate: any }) => { this.savingsAccountTemplate = data.savingsAccountTemplate; }); diff --git a/src/app/savings/edit-savings-account/edit-savings-account.component.html b/src/app/savings/edit-savings-account/edit-savings-account.component.html index 2eaff20c6..f0785d68b 100644 --- a/src/app/savings/edit-savings-account/edit-savings-account.component.html +++ b/src/app/savings/edit-savings-account/edit-savings-account.component.html @@ -56,17 +56,18 @@ - - {{ 'labels.inputs.PREVIEW' | translate }} - - - - + @if (savingsAccountFormValidAndNotPristine) { + + {{ 'labels.inputs.PREVIEW' | translate }} + + + + }
    diff --git a/src/app/savings/edit-savings-account/edit-savings-account.component.ts b/src/app/savings/edit-savings-account/edit-savings-account.component.ts index 015288e35..da72e1493 100644 --- a/src/app/savings/edit-savings-account/edit-savings-account.component.ts +++ b/src/app/savings/edit-savings-account/edit-savings-account.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, ViewChild } from '@angular/core'; +import { Component, ViewChild, inject } from '@angular/core'; import { Router, ActivatedRoute } from '@angular/router'; /** Custom Components */ @@ -37,6 +37,12 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class EditSavingsAccountComponent { + private route = inject(ActivatedRoute); + private router = inject(Router); + private dateUtils = inject(Dates); + private savingsService = inject(SavingsService); + private settingsService = inject(SettingsService); + /** Savings Account Template */ savingsAccountAndTemplate: any; /** Savings Account Product Template */ @@ -60,13 +66,7 @@ export class EditSavingsAccountComponent { * @param {SavingsService} savingsService Savings Service * @param {SettingsService} settingsService Settings Service */ - constructor( - private route: ActivatedRoute, - private router: Router, - private dateUtils: Dates, - private savingsService: SavingsService, - private settingsService: SettingsService - ) { + constructor() { this.route.data.subscribe((data: { savingsAccountAndTemplate: any }) => { this.savingsAccountAndTemplate = data.savingsAccountAndTemplate; }); diff --git a/src/app/savings/gsim-account/create-gsim-account/create-gsim-account.component.html b/src/app/savings/gsim-account/create-gsim-account/create-gsim-account.component.html index 9e101818c..075dd6bd9 100644 --- a/src/app/savings/gsim-account/create-gsim-account/create-gsim-account.component.html +++ b/src/app/savings/gsim-account/create-gsim-account/create-gsim-account.component.html @@ -63,18 +63,19 @@ - - {{ 'labels.inputs.PREVIEW' | translate }} - - - - + @if (savingsAccountFormValid) { + + {{ 'labels.inputs.PREVIEW' | translate }} + + + + }
    diff --git a/src/app/savings/gsim-account/create-gsim-account/create-gsim-account.component.ts b/src/app/savings/gsim-account/create-gsim-account/create-gsim-account.component.ts index 654b120bb..dcbc076ef 100644 --- a/src/app/savings/gsim-account/create-gsim-account/create-gsim-account.component.ts +++ b/src/app/savings/gsim-account/create-gsim-account/create-gsim-account.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, ViewChild } from '@angular/core'; +import { Component, ViewChild, inject } from '@angular/core'; import { Router, ActivatedRoute } from '@angular/router'; /** Custom Components */ @@ -39,6 +39,12 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class CreateGsimAccountComponent { + private route = inject(ActivatedRoute); + private router = inject(Router); + private dateUtils = inject(Dates); + private savingsService = inject(SavingsService); + private settingsService = inject(SettingsService); + /** Savings Account Template */ savingsAccountTemplate: any; /** Savings Account Product Template */ @@ -69,13 +75,7 @@ export class CreateGsimAccountComponent { * @param {SavingsService} savingsService Savings Service * @param {SettingsService} settingsService Settings Service */ - constructor( - private route: ActivatedRoute, - private router: Router, - private dateUtils: Dates, - private savingsService: SavingsService, - private settingsService: SettingsService - ) { + constructor() { this.route.data.subscribe((data: { savingsAccountTemplate: any; groupsData: any }) => { this.savingsAccountTemplate = data.savingsAccountTemplate; this.dataSource = data.groupsData.activeClientMembers; diff --git a/src/app/savings/gsim-account/gsim-account.component.html b/src/app/savings/gsim-account/gsim-account.component.html index 3d9c70577..8304c0d78 100644 --- a/src/app/savings/gsim-account/gsim-account.component.html +++ b/src/app/savings/gsim-account/gsim-account.component.html @@ -33,56 +33,61 @@ {{ 'labels.inputs.Actions' | translate }} - - - - - + @if (element.status.active) { + + } + @if (element.status.active) { + + } + @if (element.status.submittedAndPendingApproval) { + + } + @if (!element.status.submittedAndPendingApproval && !element.status.active) { + + } + @if (!element.status.submittedAndPendingApproval && !element.status.active) { + + } diff --git a/src/app/savings/gsim-account/gsim-account.component.ts b/src/app/savings/gsim-account/gsim-account.component.ts index 25be3c355..0bc42e7d0 100644 --- a/src/app/savings/gsim-account/gsim-account.component.ts +++ b/src/app/savings/gsim-account/gsim-account.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit, ViewChild } from '@angular/core'; +import { Component, OnInit, ViewChild, inject } from '@angular/core'; import { MatDialog } from '@angular/material/dialog'; import { MatPaginator } from '@angular/material/paginator'; import { @@ -15,7 +15,7 @@ import { MatRow } from '@angular/material/table'; import { ActivatedRoute, RouterLink } from '@angular/router'; -import { NgClass, NgIf } from '@angular/common'; +import { NgClass } from '@angular/common'; import { MatTooltip } from '@angular/material/tooltip'; import { StatusLookupPipe } from '../../pipes/status-lookup.pipe'; import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; @@ -46,6 +46,9 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class GsimAccountComponent implements OnInit { + private route = inject(ActivatedRoute); + dialog = inject(MatDialog); + /** Columns to be displayed in charge overview table. */ displayedColumns: string[] = [ 'clientDetails', @@ -71,10 +74,7 @@ export class GsimAccountComponent implements OnInit { * @param {ActivatedRoute} route Activated Route. * @param {MatDialog} dialog Dialog reference. */ - constructor( - private route: ActivatedRoute, - public dialog: MatDialog - ) { + constructor() { this.route.data.subscribe((data: { gsimData: any; savingAccountData: any; groupsData: any }) => { this.gsimOverviewData = data.gsimData[0].childGSIMAccounts; this.savingAccountData = data.savingAccountData; diff --git a/src/app/savings/gsim-account/gsim-account.resolver.ts b/src/app/savings/gsim-account/gsim-account.resolver.ts index ebe8d26b6..c44b9ca2d 100644 --- a/src/app/savings/gsim-account/gsim-account.resolver.ts +++ b/src/app/savings/gsim-account/gsim-account.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { SavingsService } from '../savings.service'; */ @Injectable() export class GSIMViewResolver { - /** - * @param {SavingsService} savingsService Savings service. - */ - constructor(private savingsService: SavingsService) {} + private savingsService = inject(SavingsService); /** * Returns the Savings Account data. diff --git a/src/app/savings/saving-account-actions/activate-savings-account/activate-savings-account.component.html b/src/app/savings/saving-account-actions/activate-savings-account/activate-savings-account.component.html index d4d0fb725..0958b88b0 100644 --- a/src/app/savings/saving-account-actions/activate-savings-account/activate-savings-account.component.html +++ b/src/app/savings/saving-account-actions/activate-savings-account/activate-savings-account.component.html @@ -15,10 +15,12 @@ /> - - {{ 'labels.inputs.Activated On Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (activateSavingsAccountForm.controls.activatedOnDate.hasError('required')) { + + {{ 'labels.inputs.Activated On Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } diff --git a/src/app/savings/saving-account-actions/activate-savings-account/activate-savings-account.component.ts b/src/app/savings/saving-account-actions/activate-savings-account/activate-savings-account.component.ts index e5b96869e..e02d1e384 100644 --- a/src/app/savings/saving-account-actions/activate-savings-account/activate-savings-account.component.ts +++ b/src/app/savings/saving-account-actions/activate-savings-account/activate-savings-account.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, Validators, ReactiveFormsModule } from '@angular/forms'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; import { Dates } from 'app/core/utils/dates'; @@ -21,6 +21,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ActivateSavingsAccountComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private savingsService = inject(SavingsService); + private dateUtils = inject(Dates); + private route = inject(ActivatedRoute); + private router = inject(Router); + private settingsService = inject(SettingsService); + /** Minimum date allowed. */ minDate = new Date(2000, 0, 1); /** Maximum date allowed. */ @@ -38,14 +45,7 @@ export class ActivateSavingsAccountComponent implements OnInit { * @param {Router} router Router * @param {SettingsService} settingsService Setting service */ - constructor( - private formBuilder: UntypedFormBuilder, - private savingsService: SavingsService, - private dateUtils: Dates, - private route: ActivatedRoute, - private router: Router, - private settingsService: SettingsService - ) { + constructor() { this.accountId = this.route.snapshot.params['savingAccountId']; } diff --git a/src/app/savings/saving-account-actions/add-charge-savings-account/add-charge-savings-account.component.html b/src/app/savings/saving-account-actions/add-charge-savings-account/add-charge-savings-account.component.html index bad85f108..26dc79cd6 100644 --- a/src/app/savings/saving-account-actions/add-charge-savings-account/add-charge-savings-account.component.html +++ b/src/app/savings/saving-account-actions/add-charge-savings-account/add-charge-savings-account.component.html @@ -6,88 +6,102 @@ {{ 'labels.inputs.Charge' | translate }} - - {{ savingsCharge.name + ' (' + savingsCharge.currency.name + ')' }} - + @for (savingsCharge of savingsChargeOptions; track savingsCharge) { + + {{ savingsCharge.name + ' (' + savingsCharge.currency.name + ')' }} + + } - - {{ 'labels.inputs.Charge' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (savingsChargeForm.controls.chargeId.hasError('required')) { + + {{ 'labels.inputs.Charge' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } -
    - - {{ 'labels.inputs.Amount' | translate }} - - - {{ 'labels.inputs.Amount' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - - - {{ 'labels.inputs.Charge Calculation' | translate }} - - - {{ chargeCalculation.value }} - - - - - - {{ 'labels.inputs.Charge time type' | translate }} - - - {{ chargeTime.value }} - - - - - - {{ 'labels.inputs.Due for collection on' | translate }} - - - - - {{ 'labels.inputs.Due for collection on' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - - - {{ 'labels.inputs.Due On' | translate }} - - - - - {{ 'labels.inputs.Due Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - - - {{ 'labels.inputs.Repeats Every' | translate }} - - -
    + @if (chargeDetails) { +
    + + {{ 'labels.inputs.Amount' | translate }} + + @if (savingsChargeForm.controls.amount.hasError('required')) { + + {{ 'labels.inputs.Amount' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + + {{ 'labels.inputs.Charge Calculation' | translate }} + + @for (chargeCalculation of chargeDetails.chargeCalculationTypeOptions; track chargeCalculation) { + + {{ chargeCalculation.value }} + + } + + + + {{ 'labels.inputs.Charge time type' | translate }} + + @for (chargeTime of chargeDetails.chargeTimeTypeOptions; track chargeTime) { + + {{ chargeTime.value }} + + } + + + @if (savingsChargeForm.contains('dueDate')) { + + {{ 'labels.inputs.Due for collection on' | translate }} + + + + @if (savingsChargeForm.controls.dueDate.hasError('required')) { + + {{ 'labels.inputs.Due for collection on' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + } + @if (savingsChargeForm.contains('feeOnMonthDay')) { + + {{ 'labels.inputs.Due On' | translate }} + + + + @if (savingsChargeForm.controls.feeOnMonthDay.hasError('required')) { + + {{ 'labels.inputs.Due Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + } + @if (savingsChargeForm.contains('feeInterval')) { + + {{ 'labels.inputs.Repeats Every' | translate }} + + + } +
    + } diff --git a/src/app/savings/saving-account-actions/add-charge-savings-account/add-charge-savings-account.component.ts b/src/app/savings/saving-account-actions/add-charge-savings-account/add-charge-savings-account.component.ts index aee8073fe..90ce1a52a 100644 --- a/src/app/savings/saving-account-actions/add-charge-savings-account/add-charge-savings-account.component.ts +++ b/src/app/savings/saving-account-actions/add-charge-savings-account/add-charge-savings-account.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, @@ -27,6 +27,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class AddChargeSavingsAccountComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private route = inject(ActivatedRoute); + private router = inject(Router); + private dateUtils = inject(Dates); + private savingsService = inject(SavingsService); + private settingsService = inject(SettingsService); + /** Minimum Due Date allowed. */ minDate = new Date(2000, 0, 1); /** Maximum Due Date allowed. */ @@ -49,14 +56,7 @@ export class AddChargeSavingsAccountComponent implements OnInit { * @param {SavingsService} savingsService Savings Service * @param {SettingsService} settingsService Settings Service */ - constructor( - private formBuilder: UntypedFormBuilder, - private route: ActivatedRoute, - private router: Router, - private dateUtils: Dates, - private savingsService: SavingsService, - private settingsService: SettingsService - ) { + constructor() { this.route.data.subscribe((data: { savingsAccountActionData: any }) => { this.savingsChargeOptions = data.savingsAccountActionData.chargeOptions; }); diff --git a/src/app/savings/saving-account-actions/apply-annual-fees-savings-account/apply-annual-fees-savings-account.component.html b/src/app/savings/saving-account-actions/apply-annual-fees-savings-account/apply-annual-fees-savings-account.component.html index b201c347c..150f0f33f 100644 --- a/src/app/savings/saving-account-actions/apply-annual-fees-savings-account/apply-annual-fees-savings-account.component.html +++ b/src/app/savings/saving-account-actions/apply-annual-fees-savings-account/apply-annual-fees-savings-account.component.html @@ -15,19 +15,23 @@ /> - - {{ 'labels.inputs.Due Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (applyAnnualFeesForm.controls.dueDate.hasError('required')) { + + {{ 'labels.inputs.Due Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Amount' | translate }} - - {{ 'labels.inputs.Amount' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (applyAnnualFeesForm.controls.amount.hasError('required')) { + + {{ 'labels.inputs.Amount' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } diff --git a/src/app/savings/saving-account-actions/apply-annual-fees-savings-account/apply-annual-fees-savings-account.component.ts b/src/app/savings/saving-account-actions/apply-annual-fees-savings-account/apply-annual-fees-savings-account.component.ts index a2e195ca0..34509045b 100644 --- a/src/app/savings/saving-account-actions/apply-annual-fees-savings-account/apply-annual-fees-savings-account.component.ts +++ b/src/app/savings/saving-account-actions/apply-annual-fees-savings-account/apply-annual-fees-savings-account.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, Validators, ReactiveFormsModule } from '@angular/forms'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; import { Dates } from 'app/core/utils/dates'; @@ -21,6 +21,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ApplyAnnualFeesSavingsAccountComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private savingsService = inject(SavingsService); + private dateUtils = inject(Dates); + private route = inject(ActivatedRoute); + private router = inject(Router); + private settingsService = inject(SettingsService); + /** Minimum date allowed. */ minDate = new Date(2000, 0, 1); /** Maximum date allowed. */ @@ -42,14 +49,7 @@ export class ApplyAnnualFeesSavingsAccountComponent implements OnInit { * @param {Router} router Router * @param {SettingsService} settingsService Setting service */ - constructor( - private formBuilder: UntypedFormBuilder, - private savingsService: SavingsService, - private dateUtils: Dates, - private route: ActivatedRoute, - private router: Router, - private settingsService: SettingsService - ) { + constructor() { this.accountId = this.route.snapshot.params['savingAccountId']; this.route.data.subscribe((data: { savingsAccountActionData: any }) => { this.savingsAccountData = data.savingsAccountActionData; diff --git a/src/app/savings/saving-account-actions/approve-savings-account/approve-savings-account.component.html b/src/app/savings/saving-account-actions/approve-savings-account/approve-savings-account.component.html index d42204f99..38837153e 100644 --- a/src/app/savings/saving-account-actions/approve-savings-account/approve-savings-account.component.html +++ b/src/app/savings/saving-account-actions/approve-savings-account/approve-savings-account.component.html @@ -15,10 +15,12 @@ /> - - {{ 'labels.inputs.Approved On Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (approveSavingsAccountForm.controls.approvedOnDate.hasError('required')) { + + {{ 'labels.inputs.Approved On Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } diff --git a/src/app/savings/saving-account-actions/approve-savings-account/approve-savings-account.component.ts b/src/app/savings/saving-account-actions/approve-savings-account/approve-savings-account.component.ts index 9a3c59b9c..6b6c2ccbd 100644 --- a/src/app/savings/saving-account-actions/approve-savings-account/approve-savings-account.component.ts +++ b/src/app/savings/saving-account-actions/approve-savings-account/approve-savings-account.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, Validators, ReactiveFormsModule } from '@angular/forms'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; import { Dates } from 'app/core/utils/dates'; @@ -23,6 +23,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ApproveSavingsAccountComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private savingsService = inject(SavingsService); + private dateUtils = inject(Dates); + private route = inject(ActivatedRoute); + private router = inject(Router); + private settingsService = inject(SettingsService); + /** Minimum date allowed. */ minDate = new Date(2000, 0, 1); /** Maximum date allowed. */ @@ -40,14 +47,7 @@ export class ApproveSavingsAccountComponent implements OnInit { * @param {Router} router Router * @param {SettingsService} settingsService Setting service */ - constructor( - private formBuilder: UntypedFormBuilder, - private savingsService: SavingsService, - private dateUtils: Dates, - private route: ActivatedRoute, - private router: Router, - private settingsService: SettingsService - ) { + constructor() { this.accountId = this.route.snapshot.params['savingAccountId']; } diff --git a/src/app/savings/saving-account-actions/close-savings-account/close-savings-account.component.html b/src/app/savings/saving-account-actions/close-savings-account/close-savings-account.component.html index 3fa57d3a7..453922ad2 100644 --- a/src/app/savings/saving-account-actions/close-savings-account/close-savings-account.component.html +++ b/src/app/savings/saving-account-actions/close-savings-account/close-savings-account.component.html @@ -15,10 +15,12 @@ /> - - {{ 'labels.inputs.Closed On Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (closeSavingsAccountForm.controls.closedOnDate.hasError('required')) { + + {{ 'labels.inputs.Closed On Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } @@ -29,56 +31,67 @@ {{ 'labels.inputs.Is Interest Posting required on closure date' | translate }}? -
    - - {{ 'labels.inputs.Transaction Amount' | translate }} - - - - - {{ 'labels.inputs.Payment Type' | translate }} - - - {{ paymentType.name }} - - - - -
    - - -
    - {{ 'labels.inputs.Show Payment Details' | translate }} -
    -
    -
    + @if (closeSavingsAccountForm.controls['withdrawBalance'].value) { +
    + @if (closeSavingsAccountForm.controls['amount']) { + + {{ 'labels.inputs.Transaction Amount' | translate }} + + + } + @if (closeSavingsAccountForm.controls['paymentTypeId']) { + + {{ 'labels.inputs.Payment Type' | translate }} + + @for (paymentType of paymentTypeOptions; track paymentType) { + + {{ paymentType.name }} + + } + + + } +
    + + +
    + {{ 'labels.inputs.Show Payment Details' | translate }} +
    +
    +
    +
    + @if (closeSavingsAccountForm.controls['accountNumber']) { + + {{ 'labels.inputs.Account Number' | translate }} + + + } + @if (closeSavingsAccountForm.controls['checkNumber']) { + + {{ 'labels.inputs.Cheque' | translate }} + + + } + @if (closeSavingsAccountForm.controls['routingCode']) { + + {{ 'labels.inputs.Routing Code' | translate }} + + + } + @if (closeSavingsAccountForm.controls['receiptNumber']) { + + {{ 'labels.inputs.Receipt Number' | translate }} + + + } + @if (closeSavingsAccountForm.controls['bankNumber']) { + + {{ 'labels.inputs.Bank' | translate }} + + + }
    - - - {{ 'labels.inputs.Account Number' | translate }} - - - - - {{ 'labels.inputs.Cheque' | translate }} - - - - - {{ 'labels.inputs.Routing Code' | translate }} - - - - - {{ 'labels.inputs.Receipt Number' | translate }} - - - - - {{ 'labels.inputs.Bank' | translate }} - - -
    + } {{ 'labels.inputs.Note' | translate }} diff --git a/src/app/savings/saving-account-actions/close-savings-account/close-savings-account.component.ts b/src/app/savings/saving-account-actions/close-savings-account/close-savings-account.component.ts index b0e0761d2..61dc272b6 100644 --- a/src/app/savings/saving-account-actions/close-savings-account/close-savings-account.component.ts +++ b/src/app/savings/saving-account-actions/close-savings-account/close-savings-account.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, @@ -33,6 +33,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class CloseSavingsAccountComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private savingsService = inject(SavingsService); + private dateUtils = inject(Dates); + private route = inject(ActivatedRoute); + private router = inject(Router); + private settingsService = inject(SettingsService); + /** Minimum date allowed. */ minDate = new Date(2000, 0, 1); /** Maximum date allowed. */ @@ -56,14 +63,7 @@ export class CloseSavingsAccountComponent implements OnInit { * @param {Router} router Router * @param {SettingsService} settingsService Setting service */ - constructor( - private formBuilder: UntypedFormBuilder, - private savingsService: SavingsService, - private dateUtils: Dates, - private route: ActivatedRoute, - private router: Router, - private settingsService: SettingsService - ) { + constructor() { this.route.data.subscribe((data: { savingsAccountActionData: any }) => { this.paymentTypeOptions = data.savingsAccountActionData[0].paymentTypeOptions; this.transactionAmount = data.savingsAccountActionData[1].summary.accountBalance; diff --git a/src/app/savings/saving-account-actions/manage-savings-account/manage-savings-account.component.html b/src/app/savings/saving-account-actions/manage-savings-account/manage-savings-account.component.html index 0d66b0e7a..6dd9ef829 100644 --- a/src/app/savings/saving-account-actions/manage-savings-account/manage-savings-account.component.html +++ b/src/app/savings/saving-account-actions/manage-savings-account/manage-savings-account.component.html @@ -1,52 +1,63 @@
    - {{ 'labels.heading.Hold Amount' | translate }} - {{ - 'labels.heading.Block Savings Account' | translate - }} + @if (transactionType.holdamount) { + {{ 'labels.heading.Hold Amount' | translate }} + } + @if (transactionType.blockaccount) { + {{ 'labels.heading.Block Savings Account' | translate }} + }
    {{ 'labels.inputs.Reason' | translate }} - - {{ codeValue.name }} - + @for (codeValue of reasonOptions; track codeValue) { + + {{ codeValue.name }} + + } - - {{ 'labels.inputs.Reason' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (manageSavingsAccountForm.controls.reasonForBlock.hasError('required')) { + + {{ 'labels.inputs.Reason' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } - - {{ 'labels.inputs.Transaction Date' | translate }} - - - - - {{ 'labels.inputs.Transaction Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - + @if (transactionType.holdamount) { + + {{ 'labels.inputs.Transaction Date' | translate }} + + + + @if (manageSavingsAccountForm.controls.transactionDate.hasError('required')) { + + {{ 'labels.inputs.Transaction Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + } - - + @if (transactionType.holdamount) { + + + } diff --git a/src/app/savings/saving-account-actions/manage-savings-account/manage-savings-account.component.ts b/src/app/savings/saving-account-actions/manage-savings-account/manage-savings-account.component.ts index 1c544b260..11ab9dfd3 100644 --- a/src/app/savings/saving-account-actions/manage-savings-account/manage-savings-account.component.ts +++ b/src/app/savings/saving-account-actions/manage-savings-account/manage-savings-account.component.ts @@ -1,4 +1,4 @@ -import { Component, Input, OnInit } from '@angular/core'; +import { Component, Input, OnInit, inject } from '@angular/core'; import { UntypedFormBuilder, UntypedFormGroup, Validators, ReactiveFormsModule } from '@angular/forms'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; import { Dates } from 'app/core/utils/dates'; @@ -30,6 +30,14 @@ interface TransactionType { ] }) export class ManageSavingsAccountComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private savingsService = inject(SavingsService); + private dateUtils = inject(Dates); + private route = inject(ActivatedRoute); + private router = inject(Router); + private systemService = inject(SystemService); + private settingsService = inject(SettingsService); + @Input() currency: Currency; /** Minimum date allowed. */ minDate = new Date(2000, 0, 1); @@ -58,15 +66,7 @@ export class ManageSavingsAccountComponent implements OnInit { * @param {Router} router Router * @param {SettingsService} settingsService Setting service */ - constructor( - private formBuilder: UntypedFormBuilder, - private savingsService: SavingsService, - private dateUtils: Dates, - private route: ActivatedRoute, - private router: Router, - private systemService: SystemService, - private settingsService: SettingsService - ) { + constructor() { this.transactionCommand = this.route.snapshot.params['name'].toLowerCase().replaceAll(' ', ''); this.transactionType[this.transactionCommand] = true; this.savingAccountId = this.route.snapshot.params['savingAccountId']; diff --git a/src/app/savings/saving-account-actions/post-interest-as-on-savings-account/post-interest-as-on-savings-account.component.html b/src/app/savings/saving-account-actions/post-interest-as-on-savings-account/post-interest-as-on-savings-account.component.html index ab4680ba9..059ef8f3b 100644 --- a/src/app/savings/saving-account-actions/post-interest-as-on-savings-account/post-interest-as-on-savings-account.component.html +++ b/src/app/savings/saving-account-actions/post-interest-as-on-savings-account/post-interest-as-on-savings-account.component.html @@ -14,10 +14,12 @@ /> - - {{ 'labels.inputs.Transaction Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (postInterestSavingsAccountForm.controls.transactionDate.hasError('required')) { + + {{ 'labels.inputs.Transaction Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } diff --git a/src/app/savings/saving-account-actions/post-interest-as-on-savings-account/post-interest-as-on-savings-account.component.ts b/src/app/savings/saving-account-actions/post-interest-as-on-savings-account/post-interest-as-on-savings-account.component.ts index 23d11d8ff..f10c7dcd1 100644 --- a/src/app/savings/saving-account-actions/post-interest-as-on-savings-account/post-interest-as-on-savings-account.component.ts +++ b/src/app/savings/saving-account-actions/post-interest-as-on-savings-account/post-interest-as-on-savings-account.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, Validators, ReactiveFormsModule } from '@angular/forms'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; import { Dates } from 'app/core/utils/dates'; @@ -21,6 +21,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class PostInterestAsOnSavingsAccountComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private savingsService = inject(SavingsService); + private dateUtils = inject(Dates); + private route = inject(ActivatedRoute); + private router = inject(Router); + private settingsService = inject(SettingsService); + /** Minimum date allowed. */ minDate = new Date(2000, 0, 1); /** Maximum date allowed. */ @@ -38,14 +45,7 @@ export class PostInterestAsOnSavingsAccountComponent implements OnInit { * @param {Router} router Router * @param {SettingsService} settingsService Setting service */ - constructor( - private formBuilder: UntypedFormBuilder, - private savingsService: SavingsService, - private dateUtils: Dates, - private route: ActivatedRoute, - private router: Router, - private settingsService: SettingsService - ) { + constructor() { this.accountId = this.route.snapshot.params['savingAccountId']; } diff --git a/src/app/savings/saving-account-actions/reject-savings-account/reject-savings-account.component.html b/src/app/savings/saving-account-actions/reject-savings-account/reject-savings-account.component.html index 22750700c..c9216fabe 100644 --- a/src/app/savings/saving-account-actions/reject-savings-account/reject-savings-account.component.html +++ b/src/app/savings/saving-account-actions/reject-savings-account/reject-savings-account.component.html @@ -15,10 +15,12 @@ /> - - {{ 'labels.inputs.Rejected On Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (rejectSavingsAccountForm.controls.rejectedOnDate.hasError('required')) { + + {{ 'labels.inputs.Rejected On Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } diff --git a/src/app/savings/saving-account-actions/reject-savings-account/reject-savings-account.component.ts b/src/app/savings/saving-account-actions/reject-savings-account/reject-savings-account.component.ts index 82526ca86..2b6c0cce5 100644 --- a/src/app/savings/saving-account-actions/reject-savings-account/reject-savings-account.component.ts +++ b/src/app/savings/saving-account-actions/reject-savings-account/reject-savings-account.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, Validators, ReactiveFormsModule } from '@angular/forms'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; import { Dates } from 'app/core/utils/dates'; @@ -23,6 +23,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class RejectSavingsAccountComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private savingsService = inject(SavingsService); + private dateUtils = inject(Dates); + private route = inject(ActivatedRoute); + private router = inject(Router); + private settingsService = inject(SettingsService); + /** Minimum date allowed. */ minDate = new Date(2000, 0, 1); /** Maximum date allowed. */ @@ -40,14 +47,7 @@ export class RejectSavingsAccountComponent implements OnInit { * @param {Router} router Router * @param {SettingsService} settingsService Setting service */ - constructor( - private formBuilder: UntypedFormBuilder, - private savingsService: SavingsService, - private dateUtils: Dates, - private route: ActivatedRoute, - private router: Router, - private settingsService: SettingsService - ) { + constructor() { this.accountId = this.route.snapshot.params['savingAccountId']; } diff --git a/src/app/savings/saving-account-actions/saving-account-actions.component.html b/src/app/savings/saving-account-actions/saving-account-actions.component.html index ff99afec4..a857dbca1 100644 --- a/src/app/savings/saving-account-actions/saving-account-actions.component.html +++ b/src/app/savings/saving-account-actions/saving-account-actions.component.html @@ -1,23 +1,39 @@ - - - - - - - - - - - - - - +@if (actions['Approve']) { + +} +@if (actions['Reject']) { + +} +@if (actions['Activate']) { + +} +@if (actions['Undo Approval']) { + +} +@if (actions['Post Interest As On']) { + +} +@if (actions['Assign Staff']) { + +} +@if (actions['Unassign Staff']) { + +} +@if (actions['Withdrawn by Client']) { + +} +@if (actions['Add Charge']) { + +} +@if (actions['Withdrawal'] || actions['Deposit']) { + +} +@if (actions['Close']) { + +} +@if (actions['Apply Annual Fees']) { + +} +@if (actions['Hold Amount'] || actions['Block Account'] || actions['Block Deposit'] || actions['Block Withdrawal']) { + +} diff --git a/src/app/savings/saving-account-actions/saving-account-actions.component.ts b/src/app/savings/saving-account-actions/saving-account-actions.component.ts index e5f6fa8c4..fe5f22c9a 100644 --- a/src/app/savings/saving-account-actions/saving-account-actions.component.ts +++ b/src/app/savings/saving-account-actions/saving-account-actions.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component } from '@angular/core'; +import { Component, inject } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; import { Currency } from 'app/shared/models/general.model'; import { ApproveSavingsAccountComponent } from './approve-savings-account/approve-savings-account.component'; @@ -42,6 +42,8 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class SavingAccountActionsComponent { + private route = inject(ActivatedRoute); + /** Flag object to store possible actions and render appropriate UI to the user */ actions: { Approve: boolean; @@ -92,7 +94,7 @@ export class SavingAccountActionsComponent { /** * @param {ActivatedRoute} route Activated Route */ - constructor(private route: ActivatedRoute) { + constructor() { this.route.data.subscribe((data: { savingsAccountActionData: any }) => { if (data.savingsAccountActionData) { this.currency = data.savingsAccountActionData.currency; diff --git a/src/app/savings/saving-account-actions/savings-account-assign-staff/savings-account-assign-staff.component.html b/src/app/savings/saving-account-actions/savings-account-assign-staff/savings-account-assign-staff.component.html index 89fc1679d..d50f24fff 100644 --- a/src/app/savings/saving-account-actions/savings-account-assign-staff/savings-account-assign-staff.component.html +++ b/src/app/savings/saving-account-actions/savings-account-assign-staff/savings-account-assign-staff.component.html @@ -6,9 +6,11 @@ {{ 'labels.inputs.To Savings Officer' | translate }} - - {{ officer.displayName }} - + @for (officer of fieldOfficerData; track officer) { + + {{ officer.displayName }} + + } @@ -24,10 +26,12 @@ /> - - {{ 'labels.inputs.Assignment Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (savingsAssignStaffForm.controls.assignmentDate.hasError('required')) { + + {{ 'labels.inputs.Assignment Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + }
    diff --git a/src/app/savings/saving-account-actions/savings-account-assign-staff/savings-account-assign-staff.component.ts b/src/app/savings/saving-account-actions/savings-account-assign-staff/savings-account-assign-staff.component.ts index 510c86992..83763c1bb 100644 --- a/src/app/savings/saving-account-actions/savings-account-assign-staff/savings-account-assign-staff.component.ts +++ b/src/app/savings/saving-account-actions/savings-account-assign-staff/savings-account-assign-staff.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, Input } from '@angular/core'; +import { Component, OnInit, Input, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, Validators, ReactiveFormsModule } from '@angular/forms'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; import { Dates } from 'app/core/utils/dates'; @@ -21,6 +21,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class SavingsAccountAssignStaffComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private savingsService = inject(SavingsService); + private dateUtils = inject(Dates); + private route = inject(ActivatedRoute); + private router = inject(Router); + private settingsService = inject(SettingsService); + /** Minimum date allowed. */ minDate = new Date(2000, 0, 1); /** Maximum date allowed. */ @@ -42,14 +49,7 @@ export class SavingsAccountAssignStaffComponent implements OnInit { * @param {Router} router Router * @param {SettingsService} settingsService Setting service */ - constructor( - private formBuilder: UntypedFormBuilder, - private savingsService: SavingsService, - private dateUtils: Dates, - private route: ActivatedRoute, - private router: Router, - private settingsService: SettingsService - ) { + constructor() { this.accountId = this.route.snapshot.params['savingAccountId']; this.route.data.subscribe((data: { savingsAccountActionData: any }) => { this.savingsAccountData = data.savingsAccountActionData; diff --git a/src/app/savings/saving-account-actions/savings-account-transactions/savings-account-transactions.component.html b/src/app/savings/saving-account-actions/savings-account-transactions/savings-account-transactions.component.html index 37303a661..292aa1940 100644 --- a/src/app/savings/saving-account-actions/savings-account-transactions/savings-account-transactions.component.html +++ b/src/app/savings/saving-account-actions/savings-account-transactions/savings-account-transactions.component.html @@ -1,11 +1,15 @@
    -

    - {{ 'labels.heading.Withdraw Money From Saving Account' | translate }} -

    -

    - {{ 'labels.heading.Deposit Money To Saving Account' | translate }} -

    + @if (transactionType.withdrawal) { +

    + {{ 'labels.heading.Withdraw Money From Saving Account' | translate }} +

    + } + @if (transactionType.deposit) { +

    + {{ 'labels.heading.Deposit Money To Saving Account' | translate }} +

    + } @@ -22,10 +26,12 @@ /> - - {{ 'labels.inputs.Transaction Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (savingAccountTransactionForm.controls.transactionDate.hasError('required')) { + + {{ 'labels.inputs.Transaction Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Payment Type' | translate }} - - {{ paymentType.name }} - + @for (paymentType of paymentTypeOptions; track paymentType) { + + {{ paymentType.name }} + + } @@ -55,30 +63,40 @@
    - - {{ 'labels.inputs.Account Number' | translate }} - - + @if (addPaymentDetailsFlag) { + + {{ 'labels.inputs.Account Number' | translate }} + + + } - - {{ 'labels.inputs.Cheque' | translate }} - - + @if (addPaymentDetailsFlag) { + + {{ 'labels.inputs.Cheque' | translate }} + + + } - - {{ 'labels.inputs.Routing Code' | translate }} - - + @if (addPaymentDetailsFlag) { + + {{ 'labels.inputs.Routing Code' | translate }} + + + } - - {{ 'labels.inputs.Receipt Number' | translate }} - - + @if (addPaymentDetailsFlag) { + + {{ 'labels.inputs.Receipt Number' | translate }} + + + } - - {{ 'labels.inputs.Bank' | translate }} - - + @if (addPaymentDetailsFlag) { + + {{ 'labels.inputs.Bank' | translate }} + + + } {{ 'labels.inputs.Notes' | translate }} diff --git a/src/app/savings/saving-account-actions/savings-account-transactions/savings-account-transactions.component.ts b/src/app/savings/saving-account-actions/savings-account-transactions/savings-account-transactions.component.ts index fd754247a..7bf624659 100644 --- a/src/app/savings/saving-account-actions/savings-account-transactions/savings-account-transactions.component.ts +++ b/src/app/savings/saving-account-actions/savings-account-transactions/savings-account-transactions.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, @@ -34,6 +34,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class SavingsAccountTransactionsComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private route = inject(ActivatedRoute); + private router = inject(Router); + private dateUtils = inject(Dates); + private savingsService = inject(SavingsService); + private settingsService = inject(SettingsService); + /** Minimum Due Date allowed. */ minDate = new Date(2000, 0, 1); /** Maximum Due Date allowed. */ @@ -67,14 +74,7 @@ export class SavingsAccountTransactionsComponent implements OnInit { * @param {Router} router Router for navigation. * @param {SettingsService} settingsService Settings Service */ - constructor( - private formBuilder: UntypedFormBuilder, - private route: ActivatedRoute, - private router: Router, - private dateUtils: Dates, - private savingsService: SavingsService, - private settingsService: SettingsService - ) { + constructor() { this.route.data.subscribe((data: { savingsAccountActionData: any }) => { this.paymentTypeOptions = data.savingsAccountActionData.paymentTypeOptions; if (data.savingsAccountActionData.currency) { diff --git a/src/app/savings/saving-account-actions/savings-account-unassign-staff/savings-account-unassign-staff.component.html b/src/app/savings/saving-account-actions/savings-account-unassign-staff/savings-account-unassign-staff.component.html index 43eb26573..e4a6baa19 100644 --- a/src/app/savings/saving-account-actions/savings-account-unassign-staff/savings-account-unassign-staff.component.html +++ b/src/app/savings/saving-account-actions/savings-account-unassign-staff/savings-account-unassign-staff.component.html @@ -14,10 +14,12 @@ /> - - {{ 'labels.inputs.Unassignment Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (savingsUnassignStaffForm.controls.unassignedDate.hasError('required')) { + + {{ 'labels.inputs.Unassignment Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } diff --git a/src/app/savings/saving-account-actions/savings-account-unassign-staff/savings-account-unassign-staff.component.ts b/src/app/savings/saving-account-actions/savings-account-unassign-staff/savings-account-unassign-staff.component.ts index 9f75abb96..8739bb854 100644 --- a/src/app/savings/saving-account-actions/savings-account-unassign-staff/savings-account-unassign-staff.component.ts +++ b/src/app/savings/saving-account-actions/savings-account-unassign-staff/savings-account-unassign-staff.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, Input } from '@angular/core'; +import { Component, OnInit, Input, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, Validators, ReactiveFormsModule } from '@angular/forms'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; import { Dates } from 'app/core/utils/dates'; @@ -21,6 +21,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class SavingsAccountUnassignStaffComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private savingsService = inject(SavingsService); + private dateUtils = inject(Dates); + private route = inject(ActivatedRoute); + private router = inject(Router); + private settingsService = inject(SettingsService); + /** Minimum date allowed. */ minDate = new Date(2000, 0, 1); /** Maximum date allowed. */ @@ -38,14 +45,7 @@ export class SavingsAccountUnassignStaffComponent implements OnInit { * @param {Router} router Router * @param {SettingsService} settingsService Setting service */ - constructor( - private formBuilder: UntypedFormBuilder, - private savingsService: SavingsService, - private dateUtils: Dates, - private route: ActivatedRoute, - private router: Router, - private settingsService: SettingsService - ) { + constructor() { this.accountId = this.route.snapshot.params['savingAccountId']; } diff --git a/src/app/savings/saving-account-actions/undo-approval-savings-account/undo-approval-savings-account.component.ts b/src/app/savings/saving-account-actions/undo-approval-savings-account/undo-approval-savings-account.component.ts index d033837c5..ee1d867d1 100644 --- a/src/app/savings/saving-account-actions/undo-approval-savings-account/undo-approval-savings-account.component.ts +++ b/src/app/savings/saving-account-actions/undo-approval-savings-account/undo-approval-savings-account.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, ReactiveFormsModule } from '@angular/forms'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; @@ -21,6 +21,11 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class UndoApprovalSavingsAccountComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private savingsService = inject(SavingsService); + private route = inject(ActivatedRoute); + private router = inject(Router); + /** Undo Approval Savings Account form. */ undoApprovalSavingsAccountForm: UntypedFormGroup; /** Savings Account Id */ @@ -32,12 +37,7 @@ export class UndoApprovalSavingsAccountComponent implements OnInit { * @param {ActivatedRoute} route Activated Route * @param {Router} router Router */ - constructor( - private formBuilder: UntypedFormBuilder, - private savingsService: SavingsService, - private route: ActivatedRoute, - private router: Router - ) { + constructor() { this.accountId = this.route.snapshot.params['savingAccountId']; } diff --git a/src/app/savings/saving-account-actions/withdraw-by-client-savings-account/withdraw-by-client-savings-account.component.html b/src/app/savings/saving-account-actions/withdraw-by-client-savings-account/withdraw-by-client-savings-account.component.html index e1c8d594d..a2e7882b4 100644 --- a/src/app/savings/saving-account-actions/withdraw-by-client-savings-account/withdraw-by-client-savings-account.component.html +++ b/src/app/savings/saving-account-actions/withdraw-by-client-savings-account/withdraw-by-client-savings-account.component.html @@ -15,10 +15,12 @@ /> - - {{ 'labels.inputs.Withdrawn On Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (withdrawSavingsAccountForm.controls.withdrawnOnDate.hasError('required')) { + + {{ 'labels.inputs.Withdrawn On Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + }
    diff --git a/src/app/savings/saving-account-actions/withdraw-by-client-savings-account/withdraw-by-client-savings-account.component.ts b/src/app/savings/saving-account-actions/withdraw-by-client-savings-account/withdraw-by-client-savings-account.component.ts index defefd0a5..4514a34d1 100644 --- a/src/app/savings/saving-account-actions/withdraw-by-client-savings-account/withdraw-by-client-savings-account.component.ts +++ b/src/app/savings/saving-account-actions/withdraw-by-client-savings-account/withdraw-by-client-savings-account.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, Validators, ReactiveFormsModule } from '@angular/forms'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; import { Dates } from 'app/core/utils/dates'; @@ -23,6 +23,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class WithdrawByClientSavingsAccountComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private savingsService = inject(SavingsService); + private dateUtils = inject(Dates); + private route = inject(ActivatedRoute); + private router = inject(Router); + private settingsService = inject(SettingsService); + /** Minimum date allowed. */ minDate = new Date(2000, 0, 1); /** Maximum date allowed. */ @@ -40,14 +47,7 @@ export class WithdrawByClientSavingsAccountComponent implements OnInit { * @param {Router} router Router * @param {SettingsService} settingsService Setting service */ - constructor( - private formBuilder: UntypedFormBuilder, - private savingsService: SavingsService, - private dateUtils: Dates, - private route: ActivatedRoute, - private router: Router, - private settingsService: SettingsService - ) { + constructor() { this.accountId = this.route.snapshot.params['savingAccountId']; } diff --git a/src/app/savings/savings-account-stepper/savings-account-charges-step/savings-account-charges-step.component.html b/src/app/savings/savings-account-stepper/savings-account-charges-step/savings-account-charges-step.component.html index fba5d8ef6..73601f161 100644 --- a/src/app/savings/savings-account-stepper/savings-account-charges-step/savings-account-charges-step.component.html +++ b/src/app/savings/savings-account-stepper/savings-account-charges-step/savings-account-charges-step.component.html @@ -2,12 +2,11 @@ {{ 'labels.inputs.Charge' | translate }} - - {{ charge.name }} - + @for (charge of chargeData | chargesFilter: chargesDataSource : currencyCode.value; track charge) { + + {{ charge.name }} + + } @@ -18,110 +17,98 @@
    - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - -
    {{ 'labels.inputs.Name' | translate }} - {{ charge.name + ', ' + charge.currency.displaySymbol }} - {{ 'labels.inputs.Type' | translate }} - {{ charge.chargeCalculationType.value }} - {{ 'labels.inputs.Amount' | translate }} - {{ charge.amount | formatNumber }} - - {{ 'labels.inputs.Collected On' | translate }} - {{ charge.chargeTimeType.value | translateKey: 'catalogs' }} - {{ 'labels.inputs.Date' | translate }} - - {{ (charge.dueDate | dateFormat) || 'Unassigned' }} - - - {{ (charge.feeOnMonthDay | dateFormat) || 'Unassigned' }} - - + + {{ 'labels.inputs.Name' | translate }} + {{ charge.name + ', ' + charge.currency.displaySymbol }} + {{ 'labels.inputs.Type' | translate }} + {{ charge.chargeCalculationType.value }} + {{ 'labels.inputs.Amount' | translate }} + {{ charge.amount | formatNumber }} + + {{ 'labels.inputs.Collected On' | translate }} + {{ charge.chargeTimeType.value | translateKey: 'catalogs' }} + {{ 'labels.inputs.Date' | translate }} + @if (charge.chargeTimeType.value === 'Specified due date' || charge.chargeTimeType.value === 'Weekly Fee') { + + {{ (charge.dueDate | dateFormat) || 'Unassigned' }} + + } + @if (charge.chargeTimeType.value === 'Monthly Fee' || charge.chargeTimeType.value === 'Annual Fee') { + + {{ (charge.feeOnMonthDay | dateFormat) || 'Unassigned' }} + + } + @if ( !( charge.chargeTimeType.value === 'Monthly Fee' || charge.chargeTimeType.value === 'Annual Fee' || charge.chargeTimeType.value === 'Specified due date' || charge.chargeTimeType.value === 'Weekly Fee' ) - " - > - N/A - - - {{ 'labels.inputs.Repayments Every' | translate }} - {{ charge.feeInterval }} - {{ 'labels.inputs.Not Provided' | translate }} - - {{ 'labels.inputs.Actions' | translate }} - -
    + ) { + + } + + + + {{ 'labels.inputs.Repayments Every' | translate }} + + @if (charge.feeInterval) { + {{ charge.feeInterval }} + } + @if (!charge.feeInterval) { + {{ 'labels.inputs.Not Provided' | translate }} + } + @if (charge.chargeTimeType.value === 'Weekly Fee' || charge.chargeTimeType.value === 'Monthly Fee') { + + } + + + + {{ 'labels.inputs.Actions' | translate }} + + + + + + + + }
    diff --git a/src/app/savings/savings-account-stepper/savings-account-details-step/savings-account-details-step.component.ts b/src/app/savings/savings-account-stepper/savings-account-details-step/savings-account-details-step.component.ts index ebc1230cf..9f37e83f5 100644 --- a/src/app/savings/savings-account-stepper/savings-account-details-step/savings-account-details-step.component.ts +++ b/src/app/savings/savings-account-stepper/savings-account-details-step/savings-account-details-step.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core'; +import { Component, OnInit, Input, Output, EventEmitter, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, Validators, ReactiveFormsModule } from '@angular/forms'; /** Custom Services */ @@ -24,6 +24,10 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class SavingsAccountDetailsStepComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private savingsService = inject(SavingsService); + private settingsService = inject(SettingsService); + /** Savings Account Template */ @Input() savingsAccountTemplate: any; @@ -51,11 +55,7 @@ export class SavingsAccountDetailsStepComponent implements OnInit { * @param {SavingsService} savingsService Savings Service. * @param {SettingsService} settingsService Setting service */ - constructor( - private formBuilder: UntypedFormBuilder, - private savingsService: SavingsService, - private settingsService: SettingsService - ) { + constructor() { this.createSavingsAccountDetailsForm(); } diff --git a/src/app/savings/savings-account-stepper/savings-account-preview-step/savings-account-preview-step.component.html b/src/app/savings/savings-account-stepper/savings-account-preview-step/savings-account-preview-step.component.html index c38ffd20e..e07880aa3 100644 --- a/src/app/savings/savings-account-stepper/savings-account-preview-step/savings-account-preview-step.component.html +++ b/src/app/savings/savings-account-stepper/savings-account-preview-step/savings-account-preview-step.component.html @@ -16,12 +16,16 @@
    {{ 'labels.inputs.External Id' | translate }} - - - - - {{ 'labels.inputs.Unassigned' | translate }} - + @if (savingsAccount.externalId) { + + + + } + @if (!savingsAccount.externalId) { + + {{ 'labels.inputs.Unassigned' | translate }} + + }
    @@ -31,7 +35,7 @@ }}
    - + @if (activeClientMembers) {

    {{ 'labels.heading.Client Members' | translate }}

    @@ -41,18 +45,16 @@ {{ 'labels.inputs.Client ID' | translate }} {{ element.id }} - {{ 'labels.inputs.Client Name' | translate }} {{ element.displayName }} -
    -
    + }

    {{ 'labels.heading.Terms' | translate }}

    @@ -112,128 +114,137 @@ }}
    -
    - {{ 'labels.inputs.Minimum Opening Balance' | translate }}: - {{ savingsAccount.minRequiredOpeningBalance | formatNumber }} -
    + @if (savingsAccount.minRequiredOpeningBalance) { +
    + {{ 'labels.inputs.Minimum Opening Balance' | translate }}: + {{ savingsAccount.minRequiredOpeningBalance | formatNumber }} +
    + }
    {{ 'labels.inputs.Apply Withdrawal Fee for Transfers' | translate }}: {{ savingsAccount.withdrawalFeeForTransfers | yesNo }}
    -
    - {{ 'labels.inputs.Lock-in Period' | translate }}: - {{ - getCatalogTranslation( - savingsAccount.lockinPeriodFrequency + - ' ' + - (savingsAccount.lockinPeriodFrequencyType - | find: savingsAccountProductTemplate.lockinPeriodFrequencyTypeOptions : 'id' : 'value') - ) - }} -
    + @if (savingsAccount.lockinPeriodFrequency) { +
    + {{ 'labels.inputs.Lock-in Period' | translate }}: + {{ + getCatalogTranslation( + savingsAccount.lockinPeriodFrequency + + ' ' + + (savingsAccount.lockinPeriodFrequencyType + | find: savingsAccountProductTemplate.lockinPeriodFrequencyTypeOptions : 'id' : 'value') + ) + }} +
    + }
    {{ 'labels.inputs.Is Overdraft Allowed' | translate }}: {{ savingsAccount.allowOverdraft | yesNo }}
    -
    - {{ 'labels.inputs.Minimum Overdraft Required for Interest Calculation' | translate }}: - {{ savingsAccount.minOverdraftForInterestCalculation | formatNumber }} -
    + @if (savingsAccount.minOverdraftForInterestCalculation) { +
    + {{ 'labels.inputs.Minimum Overdraft Required for Interest Calculation' | translate }}: + {{ savingsAccount.minOverdraftForInterestCalculation | formatNumber }} +
    + } -
    - {{ 'labels.inputs.Nominal Annual Interest for Overdraft' | translate }}: - {{ savingsAccount.nominalAnnualInterestRateOverdraft | formatNumber }} % -
    + @if (savingsAccount.nominalAnnualInterestRateOverdraft) { +
    + {{ 'labels.inputs.Nominal Annual Interest for Overdraft' | translate }}: + {{ savingsAccount.nominalAnnualInterestRateOverdraft | formatNumber }} % +
    + } -
    - {{ 'labels.inputs.Maximum Overdraft Amount Limit' | translate }}: - {{ savingsAccount.overdraftLimit | formatNumber }} -
    + @if (savingsAccount.overdraftLimit) { +
    + {{ 'labels.inputs.Maximum Overdraft Amount Limit' | translate }}: + {{ savingsAccount.overdraftLimit | formatNumber }} +
    + }
    {{ 'labels.inputs.Enforce Minimum Balance' | translate }}: {{ savingsAccount.enforceMinRequiredBalance | yesNo }}
    -
    - {{ 'labels.inputs.Minimum Balance' | translate }}: - {{ savingsAccount.minRequiredBalance }} -
    + @if (savingsAccount.minRequiredBalance) { +
    + {{ 'labels.inputs.Minimum Balance' | translate }}: + {{ savingsAccount.minRequiredBalance }} +
    + } -
    -

    {{ 'labels.inputs.Charges' | translate }}

    - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + +
    {{ 'labels.inputs.Name' | translate }} - {{ charge.name + ', ' + charge.currency.displaySymbol }} - {{ 'labels.inputs.Type' | translate }} - {{ charge.chargeCalculationType.value | translateKey: 'catalogs' }} - {{ 'labels.inputs.Amount' | translate }} - {{ charge.amount | formatNumber }} - {{ 'labels.inputs.Date' | translate }} - - {{ (charge.dueDate | dateFormat) || 'Unassigned' }} - - - {{ (charge.feeOnMonthDay | dateFormat) || 'Unassigned' }} - - +

    {{ 'labels.inputs.Charges' | translate }}

    + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - -
    {{ 'labels.inputs.Name' | translate }} + {{ charge.name + ', ' + charge.currency.displaySymbol }} + {{ 'labels.inputs.Type' | translate }} + {{ charge.chargeCalculationType.value | translateKey: 'catalogs' }} + {{ 'labels.inputs.Amount' | translate }} + {{ charge.amount | formatNumber }} + {{ 'labels.inputs.Date' | translate }} + @if (charge.chargeTimeType.value === 'Specified due date' || charge.chargeTimeType.value === 'Weekly Fee') { + + {{ (charge.dueDate | dateFormat) || 'Unassigned' }} + + } + @if (charge.chargeTimeType.value === 'Monthly Fee' || charge.chargeTimeType.value === 'Annual Fee') { + + {{ (charge.feeOnMonthDay | dateFormat) || 'Unassigned' }} + + } + @if ( !( charge.chargeTimeType.value === 'Monthly Fee' || charge.chargeTimeType.value === 'Annual Fee' || charge.chargeTimeType.value === 'Specified due date' || charge.chargeTimeType.value === 'Weekly Fee' ) - " - > - N/A - - {{ 'labels.inputs.Repayments Every' | translate }} - {{ charge.feeInterval || 'Not Provided' }} - {{ 'labels.inputs.Collected On' | translate }} - {{ charge.chargeTimeType.value }} -
    - + ) { + N/A + } +
    {{ 'labels.inputs.Repayments Every' | translate }} + {{ charge.feeInterval || 'Not Provided' }} + {{ 'labels.inputs.Collected On' | translate }} + {{ charge.chargeTimeType.value }} +
    +
    + }
    diff --git a/src/app/savings/savings-account-stepper/savings-account-preview-step/savings-account-preview-step.component.ts b/src/app/savings/savings-account-stepper/savings-account-preview-step/savings-account-preview-step.component.ts index fd60c70ca..32390eb07 100644 --- a/src/app/savings/savings-account-stepper/savings-account-preview-step/savings-account-preview-step.component.ts +++ b/src/app/savings/savings-account-stepper/savings-account-preview-step/savings-account-preview-step.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, Input, Output, EventEmitter, OnChanges } from '@angular/core'; +import { Component, Input, Output, EventEmitter, OnChanges, inject } from '@angular/core'; import { TranslateService } from '@ngx-translate/core'; import { MatTableDataSource, @@ -54,6 +54,8 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class SavingsAccountPreviewStepComponent implements OnChanges { + private translateService = inject(TranslateService); + /** Savings Account Product Template */ @Input() savingsAccountProductTemplate: any; /** Savings Account Template */ @@ -86,8 +88,6 @@ export class SavingsAccountPreviewStepComponent implements OnChanges { /** Form submission event */ @Output() submitEvent = new EventEmitter(); - constructor(private translateService: TranslateService) {} - ngOnChanges(): void { if (this.activeClientMembers?.length > 0) { this.dataSource = new MatTableDataSource(this.activeClientMembers.filter((member: any) => member.selected)); diff --git a/src/app/savings/savings-account-stepper/savings-account-terms-step/savings-account-terms-step.component.html b/src/app/savings/savings-account-stepper/savings-account-terms-step/savings-account-terms-step.component.html index d725dc13a..2970713e5 100644 --- a/src/app/savings/savings-account-stepper/savings-account-terms-step/savings-account-terms-step.component.html +++ b/src/app/savings/savings-account-stepper/savings-account-terms-step/savings-account-terms-step.component.html @@ -22,12 +22,11 @@ {{ 'labels.inputs.Interest Compounding Period' | translate }} - - {{ interestCompoundingPeriodType.value | translateKey: 'catalogs' }} - + @for (interestCompoundingPeriodType of interestCompoundingPeriodTypeData; track interestCompoundingPeriodType) { + + {{ interestCompoundingPeriodType.value | translateKey: 'catalogs' }} + + } {{ 'labels.inputs.Interest Compounding Period' | translate }} {{ 'labels.commons.is' | translate }} @@ -38,12 +37,11 @@ {{ 'labels.inputs.Interest Posting Period' | translate }} - - {{ interestPostingPeriodType.value | translateKey: 'catalogs' }} - + @for (interestPostingPeriodType of interestPostingPeriodTypeData; track interestPostingPeriodType) { + + {{ interestPostingPeriodType.value | translateKey: 'catalogs' }} + + } {{ 'labels.inputs.Interest Posting Period' | translate }} {{ 'labels.commons.is' | translate }} @@ -54,12 +52,11 @@ {{ 'labels.inputs.Interest Calculated using' | translate }} - - {{ interestCalculationType.value | translateKey: 'catalogs' }} - + @for (interestCalculationType of interestCalculationTypeData; track interestCalculationType) { + + {{ interestCalculationType.value | translateKey: 'catalogs' }} + + } {{ 'labels.inputs.Interest Calculated using' | translate }} {{ 'labels.commons.is' | translate }} @@ -70,12 +67,14 @@ {{ 'labels.inputs.Days in Year' | translate }} - - {{ interestCalculationDaysInYearType.value | translateKey: 'catalogs' }} - + @for ( + interestCalculationDaysInYearType of interestCalculationDaysInYearTypeData; + track interestCalculationDaysInYearType + ) { + + {{ interestCalculationDaysInYearType.value | translateKey: 'catalogs' }} + + } {{ 'labels.inputs.Days in Year' | translate }} {{ 'labels.commons.is' | translate }} @@ -102,12 +101,11 @@ {{ 'labels.inputs.Type' | translate }} - - {{ lockinPeriodFrequencyType.value | translateKey: 'catalogs' }} - + @for (lockinPeriodFrequencyType of lockinPeriodFrequencyTypeData; track lockinPeriodFrequencyType) { + + {{ lockinPeriodFrequencyType.value | translateKey: 'catalogs' }} + + } @@ -119,25 +117,22 @@ {{ 'labels.inputs.Is Overdraft Allowed' | translate }} -
    - - {{ 'labels.inputs.Minimum Overdraft Required for Interest Calculation' | translate }} - - - - - {{ 'labels.inputs.Nominal Annual Interest for Overdraft' | translate }} - - - - - {{ 'labels.inputs.Maximum Overdraft Amount Limit' | translate }} - - -
    + @if (savingsAccountTermsForm.value.allowOverdraft) { +
    + + {{ 'labels.inputs.Minimum Overdraft Required for Interest Calculation' | translate }} + + + + {{ 'labels.inputs.Nominal Annual Interest for Overdraft' | translate }} + + + + {{ 'labels.inputs.Maximum Overdraft Amount Limit' | translate }} + + +
    + } @@ -150,10 +145,12 @@
    - - {{ 'labels.inputs.Balance Required for Interest Calculation' | translate }} - - + @if (savingsAccountTermsForm.controls.minBalanceForInterestCalculation.value) { + + {{ 'labels.inputs.Balance Required for Interest Calculation' | translate }} + + + }
    diff --git a/src/app/savings/savings-account-stepper/savings-account-terms-step/savings-account-terms-step.component.ts b/src/app/savings/savings-account-stepper/savings-account-terms-step/savings-account-terms-step.component.ts index d218f68a6..70b6bc4e0 100644 --- a/src/app/savings/savings-account-stepper/savings-account-terms-step/savings-account-terms-step.component.ts +++ b/src/app/savings/savings-account-stepper/savings-account-terms-step/savings-account-terms-step.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnChanges, OnInit, Input } from '@angular/core'; +import { Component, OnChanges, OnInit, Input, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, @@ -31,6 +31,9 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class SavingsAccountTermsStepComponent implements OnChanges, OnInit { + private formBuilder = inject(UntypedFormBuilder); + private settingsService = inject(SettingsService); + /** Savings Account and Product Template */ @Input() savingsAccountProductTemplate: any; /** Savings Account Template */ @@ -57,10 +60,7 @@ export class SavingsAccountTermsStepComponent implements OnChanges, OnInit { * @param {FormBuilder} formBuilder Form Builder * @param {SettingsService} settingsService Setting service */ - constructor( - private formBuilder: UntypedFormBuilder, - private settingsService: SettingsService - ) { + constructor() { this.createSavingsAccountTermsForm(); this.buildDependencies(); } diff --git a/src/app/savings/savings-account-stepper/savings-active-client-members/savings-active-client-members.component.html b/src/app/savings/savings-account-stepper/savings-active-client-members/savings-active-client-members.component.html index 59030eab2..9fbec5dc0 100644 --- a/src/app/savings/savings-account-stepper/savings-active-client-members/savings-active-client-members.component.html +++ b/src/app/savings/savings-account-stepper/savings-active-client-members/savings-active-client-members.component.html @@ -1,32 +1,30 @@ -
    - - - - - - - - - - - - - - - - - - - - - - -
    - - - - {{ 'labels.inputs.Client ID' | translate }}{{ element.id }}{{ 'labels.inputs.Client Name' | translate }}{{ element.displayName }}
    -
    +@if (activeClientMembers) { +
    + + + + + + + + + + + + + + + + + + +
    + + + + {{ 'labels.inputs.Client ID' | translate }}{{ element.id }}{{ 'labels.inputs.Client Name' | translate }}{{ element.displayName }}
    +
    +}
    -
    + @if (this.chargesData) { +
    + +
    + }
    @@ -77,62 +79,66 @@ {{ 'labels.inputs.Actions' | translate }} - - - - - - - - + @if (savingsAccountData.status.value === 'Submitted and pending approval') { + - - + + + } + @if (savingsAccountData.status.value === 'Active' && charge.amountOutstanding !== 0) { + + + + @if (isRecurringCharge(charge)) { + + } + + } diff --git a/src/app/savings/savings-account-view/charges-tab/charges-tab.component.ts b/src/app/savings/savings-account-view/charges-tab/charges-tab.component.ts index e784122c9..09fbcd878 100644 --- a/src/app/savings/savings-account-view/charges-tab/charges-tab.component.ts +++ b/src/app/savings/savings-account-view/charges-tab/charges-tab.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, ViewChild } from '@angular/core'; +import { Component, OnInit, ViewChild, inject } from '@angular/core'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; import { MatDialog } from '@angular/material/dialog'; import { @@ -32,7 +32,7 @@ import { InputBase } from 'app/shared/form-dialog/formfield/model/input-base'; import { DatepickerBase } from 'app/shared/form-dialog/formfield/model/datepicker-base'; import { Dates } from 'app/core/utils/dates'; import { TranslateService } from '@ngx-translate/core'; -import { NgIf, CurrencyPipe } from '@angular/common'; +import { CurrencyPipe } from '@angular/common'; import { MatTooltip } from '@angular/material/tooltip'; import { DateFormatPipe } from '../../../pipes/date-format.pipe'; import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; @@ -62,6 +62,14 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ChargesTabComponent implements OnInit { + private savingsService = inject(SavingsService); + private route = inject(ActivatedRoute); + private dateUtils = inject(Dates); + private router = inject(Router); + private dialog = inject(MatDialog); + private settingsService = inject(SettingsService); + private translateService = inject(TranslateService); + /** Savings Account Data */ savingsAccountData: any; /** Charges Data */ @@ -97,15 +105,7 @@ export class ChargesTabComponent implements OnInit { * @param {Dates} dateUtils Date Utils. * @param {SettingsService} settingsService Setting service */ - constructor( - private savingsService: SavingsService, - private route: ActivatedRoute, - private dateUtils: Dates, - private router: Router, - private dialog: MatDialog, - private settingsService: SettingsService, - private translateService: TranslateService - ) { + constructor() { this.route.parent.data.subscribe((data: { savingsAccountData: any }) => { this.savingsAccountData = data.savingsAccountData; this.chargesData = this.savingsAccountData.charges; @@ -152,7 +152,6 @@ export class ChargesTabComponent implements OnInit { type: 'date', required: true }) - ]; const data = { title: `Pay Charge ${chargeId}`, @@ -226,7 +225,6 @@ export class ChargesTabComponent implements OnInit { type: 'number', required: true }) - ]; const data = { title: `Edit Charge ${charge.id}`, diff --git a/src/app/savings/savings-account-view/custom-dialogs/calculate-interest-dialog/calculate-interest-dialog.component.ts b/src/app/savings/savings-account-view/custom-dialogs/calculate-interest-dialog/calculate-interest-dialog.component.ts index 3c269b931..f87980545 100644 --- a/src/app/savings/savings-account-view/custom-dialogs/calculate-interest-dialog/calculate-interest-dialog.component.ts +++ b/src/app/savings/savings-account-view/custom-dialogs/calculate-interest-dialog/calculate-interest-dialog.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component } from '@angular/core'; +import { Component, inject } from '@angular/core'; import { MatDialogRef, MatDialogTitle, @@ -27,8 +27,5 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class CalculateInterestDialogComponent { - /** - * @param {MatDialogRef} dialogRef Component reference to dialog. - */ - constructor(public dialogRef: MatDialogRef) {} + dialogRef = inject>(MatDialogRef); } diff --git a/src/app/savings/savings-account-view/custom-dialogs/inactivate-charge-dialog/inactivate-charge-dialog.component.ts b/src/app/savings/savings-account-view/custom-dialogs/inactivate-charge-dialog/inactivate-charge-dialog.component.ts index f228f6323..b08730ba0 100644 --- a/src/app/savings/savings-account-view/custom-dialogs/inactivate-charge-dialog/inactivate-charge-dialog.component.ts +++ b/src/app/savings/savings-account-view/custom-dialogs/inactivate-charge-dialog/inactivate-charge-dialog.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, Inject } from '@angular/core'; +import { Component, inject } from '@angular/core'; import { MatDialogRef, MAT_DIALOG_DATA, @@ -28,12 +28,6 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class InactivateChargeDialogComponent { - /** - * @param {MatDialogRef} dialogRef Component reference to dialog. - * @param {any} data. - */ - constructor( - public dialogRef: MatDialogRef, - @Inject(MAT_DIALOG_DATA) public data: any - ) {} + dialogRef = inject>(MatDialogRef); + data = inject(MAT_DIALOG_DATA); } diff --git a/src/app/savings/savings-account-view/custom-dialogs/post-interest-dialog/post-interest-dialog.component.ts b/src/app/savings/savings-account-view/custom-dialogs/post-interest-dialog/post-interest-dialog.component.ts index 894cf6df9..7b8d59a17 100644 --- a/src/app/savings/savings-account-view/custom-dialogs/post-interest-dialog/post-interest-dialog.component.ts +++ b/src/app/savings/savings-account-view/custom-dialogs/post-interest-dialog/post-interest-dialog.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component } from '@angular/core'; +import { Component, inject } from '@angular/core'; import { MatDialogRef, MatDialogTitle, @@ -27,8 +27,5 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class PostInterestDialogComponent { - /** - * @param {MatDialogRef} dialogRef Component reference to dialog. - */ - constructor(public dialogRef: MatDialogRef) {} + dialogRef = inject>(MatDialogRef); } diff --git a/src/app/savings/savings-account-view/custom-dialogs/release-amount-dialog/release-amount-dialog.component.ts b/src/app/savings/savings-account-view/custom-dialogs/release-amount-dialog/release-amount-dialog.component.ts index bade3f592..a772ca3c3 100644 --- a/src/app/savings/savings-account-view/custom-dialogs/release-amount-dialog/release-amount-dialog.component.ts +++ b/src/app/savings/savings-account-view/custom-dialogs/release-amount-dialog/release-amount-dialog.component.ts @@ -1,4 +1,4 @@ -import { Component } from '@angular/core'; +import { Component, inject } from '@angular/core'; import { MatDialogRef, MatDialogTitle, @@ -23,8 +23,5 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ReleaseAmountDialogComponent { - /** - * @param {MatDialogRef} dialogRef Component reference to dialog. - */ - constructor(public dialogRef: MatDialogRef) {} + dialogRef = inject>(MatDialogRef); } diff --git a/src/app/savings/savings-account-view/custom-dialogs/toggle-withhold-tax-dialog/toggle-withhold-tax-dialog.component.ts b/src/app/savings/savings-account-view/custom-dialogs/toggle-withhold-tax-dialog/toggle-withhold-tax-dialog.component.ts index d53f653f1..4980fc0fb 100644 --- a/src/app/savings/savings-account-view/custom-dialogs/toggle-withhold-tax-dialog/toggle-withhold-tax-dialog.component.ts +++ b/src/app/savings/savings-account-view/custom-dialogs/toggle-withhold-tax-dialog/toggle-withhold-tax-dialog.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, Inject } from '@angular/core'; +import { Component, inject } from '@angular/core'; import { MatDialogRef, MAT_DIALOG_DATA, @@ -28,12 +28,6 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ToggleWithholdTaxDialogComponent { - /** - * @param {MatDialogRef} dialogRef Component reference to dialog. - * @param {any} data. - */ - constructor( - public dialogRef: MatDialogRef, - @Inject(MAT_DIALOG_DATA) public data: any - ) {} + dialogRef = inject>(MatDialogRef); + data = inject(MAT_DIALOG_DATA); } diff --git a/src/app/savings/savings-account-view/custom-dialogs/undo-transaction-dialog/undo-transaction-dialog.component.ts b/src/app/savings/savings-account-view/custom-dialogs/undo-transaction-dialog/undo-transaction-dialog.component.ts index e04e0c33b..6197059ce 100644 --- a/src/app/savings/savings-account-view/custom-dialogs/undo-transaction-dialog/undo-transaction-dialog.component.ts +++ b/src/app/savings/savings-account-view/custom-dialogs/undo-transaction-dialog/undo-transaction-dialog.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component } from '@angular/core'; +import { Component, inject } from '@angular/core'; import { MatDialogRef, MatDialogTitle, @@ -26,8 +26,5 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class UndoTransactionDialogComponent { - /** - * @param {MatDialogRef} dialogRef Component reference to dialog. - */ - constructor(public dialogRef: MatDialogRef) {} + dialogRef = inject>(MatDialogRef); } diff --git a/src/app/savings/savings-account-view/custom-dialogs/waive-charge-dialog/waive-charge-dialog.component.ts b/src/app/savings/savings-account-view/custom-dialogs/waive-charge-dialog/waive-charge-dialog.component.ts index df4e9b488..f920ad900 100644 --- a/src/app/savings/savings-account-view/custom-dialogs/waive-charge-dialog/waive-charge-dialog.component.ts +++ b/src/app/savings/savings-account-view/custom-dialogs/waive-charge-dialog/waive-charge-dialog.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, Inject } from '@angular/core'; +import { Component, inject } from '@angular/core'; import { MatDialogRef, MAT_DIALOG_DATA, @@ -28,12 +28,6 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class WaiveChargeDialogComponent { - /** - * @param {MatDialogRef} dialogRef Component reference to dialog. - * @param {any} data. - */ - constructor( - public dialogRef: MatDialogRef, - @Inject(MAT_DIALOG_DATA) public data: any - ) {} + dialogRef = inject>(MatDialogRef); + data = inject(MAT_DIALOG_DATA); } diff --git a/src/app/savings/savings-account-view/datatable-tabs/datatable-tabs.component.ts b/src/app/savings/savings-account-view/datatable-tabs/datatable-tabs.component.ts index c067dc759..2b7fa10d0 100644 --- a/src/app/savings/savings-account-view/datatable-tabs/datatable-tabs.component.ts +++ b/src/app/savings/savings-account-view/datatable-tabs/datatable-tabs.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component } from '@angular/core'; +import { Component, inject } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; import { EntityDatatableTabComponent } from '../../../shared/tabs/entity-datatable-tab/entity-datatable-tab.component'; import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; @@ -17,6 +17,8 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class DatatableTabsComponent { + private route = inject(ActivatedRoute); + entityId: string; /** Savings Datatable */ entityDatatable: any; @@ -27,7 +29,7 @@ export class DatatableTabsComponent { * Fetches Savings and datatables data from `resolve` * @param {ActivatedRoute} route Activated Route. */ - constructor(private route: ActivatedRoute) { + constructor() { this.entityId = this.route.parent.parent.snapshot.paramMap.get('savingAccountId'); this.route.data.subscribe((data: { savingsDatatable: any }) => { diff --git a/src/app/savings/savings-account-view/general-tab/general-tab.component.html b/src/app/savings/savings-account-view/general-tab/general-tab.component.html index 7504f12f0..5504c9595 100644 --- a/src/app/savings/savings-account-view/general-tab/general-tab.component.html +++ b/src/app/savings/savings-account-view/general-tab/general-tab.component.html @@ -1,279 +1,359 @@ -
    -
    -
    +@if (isLoading) { +
    +
    +
    +} - @@ -78,25 +83,27 @@ - + @for (item of buttonConfig.singleButtons; track item) { - + } - + @if (buttonConfig.options.length) { - - - + @for (option of buttonConfig.options; track option) { + + + + } - + } diff --git a/src/app/shares/shares-account-view/shares-account-view.component.ts b/src/app/shares/shares-account-view/shares-account-view.component.ts index 51b3b9527..60c6f5f58 100644 --- a/src/app/shares/shares-account-view/shares-account-view.component.ts +++ b/src/app/shares/shares-account-view/shares-account-view.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { ActivatedRoute, Router, RouterLinkActive, RouterLink, RouterOutlet } from '@angular/router'; import { MatDialog } from '@angular/material/dialog'; @@ -20,7 +20,7 @@ import { MatCardContent } from '@angular/material/card'; import { MatTooltip } from '@angular/material/tooltip'; -import { NgClass, NgIf, NgFor } from '@angular/common'; +import { NgClass } from '@angular/common'; import { LongTextComponent } from '../../shared/long-text/long-text.component'; import { AccountNumberComponent } from '../../shared/account-number/account-number.component'; import { MatIconButton } from '@angular/material/button'; @@ -65,6 +65,11 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class SharesAccountViewComponent implements OnInit { + private route = inject(ActivatedRoute); + private router = inject(Router); + private sharesService = inject(SharesService); + dialog = inject(MatDialog); + /** Shares Account Data */ sharesAccountData: any; /** Button Configurations */ @@ -79,12 +84,7 @@ export class SharesAccountViewComponent implements OnInit { * @param {SharesService} sharesService Shares Service * @param {MatDialog} dialog Mat Dialog */ - constructor( - private route: ActivatedRoute, - private router: Router, - private sharesService: SharesService, - public dialog: MatDialog - ) { + constructor() { this.route.data.subscribe((data: { sharesAccountData: any }) => { this.sharesAccountData = data.sharesAccountData; }); diff --git a/src/app/shares/shares-account-view/transactions-tab/transactions-tab.component.ts b/src/app/shares/shares-account-view/transactions-tab/transactions-tab.component.ts index fdd28c943..39d6eaf67 100644 --- a/src/app/shares/shares-account-view/transactions-tab/transactions-tab.component.ts +++ b/src/app/shares/shares-account-view/transactions-tab/transactions-tab.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { MatTableDataSource, MatTable, @@ -40,6 +40,8 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class TransactionsTabComponent implements OnInit { + private route = inject(ActivatedRoute); + /** Shares Account Data */ shareAccountData: any; /** Transactions Data */ @@ -60,7 +62,7 @@ export class TransactionsTabComponent implements OnInit { * Retrieves shares account data from `resolve`. * @param {ActivatedRoute} route Activated Route. */ - constructor(private route: ActivatedRoute) { + constructor() { this.route.parent.data.subscribe((data: { sharesAccountData: any }) => { this.shareAccountData = data.sharesAccountData; this.transactionsData = this.shareAccountData.purchasedShares; diff --git a/src/app/shares/shares.service.ts b/src/app/shares/shares.service.ts index bffbe39d3..59d435836 100644 --- a/src/app/shares/shares.service.ts +++ b/src/app/shares/shares.service.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { HttpClient, HttpParams } from '@angular/common/http'; /** rxjs Imports */ @@ -12,10 +12,7 @@ import { Observable } from 'rxjs'; providedIn: 'root' }) export class SharesService { - /** - * @param {HttpClient} http Http Client - */ - constructor(private http: HttpClient) {} + private http = inject(HttpClient); /** * @param {string} accountId Shares Account Id of account to get data for. diff --git a/src/app/system/account-number-preferences/account-number-preferences.component.ts b/src/app/system/account-number-preferences/account-number-preferences.component.ts index 6b9db27ed..23f5bb399 100644 --- a/src/app/system/account-number-preferences/account-number-preferences.component.ts +++ b/src/app/system/account-number-preferences/account-number-preferences.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, ViewChild } from '@angular/core'; +import { Component, OnInit, ViewChild, inject } from '@angular/core'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort, MatSortHeader } from '@angular/material/sort'; import { @@ -45,6 +45,8 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class AccountNumberPreferencesComponent implements OnInit { + private route = inject(ActivatedRoute); + /** Account Number Preferences data. */ accountNumberPreferencesData: any; /** Columns to be displayed in account number preferences table. */ @@ -61,7 +63,7 @@ export class AccountNumberPreferencesComponent implements OnInit { * Retrieves the account number preferences data from `resolve`. * @param {ActivatedRoute} route Activated Route. */ - constructor(private route: ActivatedRoute) { + constructor() { this.route.data.subscribe((data: { accountNumberPreferences: any }) => { this.accountNumberPreferencesData = data.accountNumberPreferences; }); diff --git a/src/app/system/account-number-preferences/account-number-preferences.resolver.ts b/src/app/system/account-number-preferences/account-number-preferences.resolver.ts index 80af3b997..e9be70a38 100644 --- a/src/app/system/account-number-preferences/account-number-preferences.resolver.ts +++ b/src/app/system/account-number-preferences/account-number-preferences.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; /** rxjs Imports */ import { Observable } from 'rxjs'; @@ -12,10 +12,7 @@ import { SystemService } from '../system.service'; */ @Injectable() export class AccountNumberPreferencesResolver { - /** - * @param {SystemService} systemService System service. - */ - constructor(private systemService: SystemService) {} + private systemService = inject(SystemService); /** * Returns the Account Number Preferences data. diff --git a/src/app/system/account-number-preferences/create-account-number-preference/account-number-preferences-template.resolver.ts b/src/app/system/account-number-preferences/create-account-number-preference/account-number-preferences-template.resolver.ts index 0a681edeb..dd3420764 100644 --- a/src/app/system/account-number-preferences/create-account-number-preference/account-number-preferences-template.resolver.ts +++ b/src/app/system/account-number-preferences/create-account-number-preference/account-number-preferences-template.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; /** rxjs Imports */ import { Observable } from 'rxjs'; @@ -12,10 +12,7 @@ import { SystemService } from '../../system.service'; */ @Injectable() export class AccountNumberPreferencesTemplateResolver { - /** - * @param {SystemService} systemService System service. - */ - constructor(private systemService: SystemService) {} + private systemService = inject(SystemService); /** * Returns the Account Number Preferences Template data. diff --git a/src/app/system/account-number-preferences/create-account-number-preference/create-account-number-preference.component.html b/src/app/system/account-number-preferences/create-account-number-preference/create-account-number-preference.component.html index 676836bf4..fd973b5e5 100644 --- a/src/app/system/account-number-preferences/create-account-number-preference/create-account-number-preference.component.html +++ b/src/app/system/account-number-preferences/create-account-number-preference/create-account-number-preference.component.html @@ -6,25 +6,28 @@ {{ 'labels.inputs.Account Type' | translate }} - - {{ accountType.value | translateKey: 'catalogs' }} - + @for (accountType of accountNumberPreferencesTemplateData.accountTypeOptions; track accountType) { + + {{ accountType.value | translateKey: 'catalogs' }} + + } - - {{ 'labels.inputs.Account Type' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (accountNumberPreferenceForm.controls.accountType.hasError('required')) { + + {{ 'labels.inputs.Account Type' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Prefix Field' | translate }} - - {{ prefixType.value }} - + @for (prefixType of prefixTypeData; track prefixType) { + + {{ prefixType.value }} + + }
    diff --git a/src/app/system/account-number-preferences/create-account-number-preference/create-account-number-preference.component.ts b/src/app/system/account-number-preferences/create-account-number-preference/create-account-number-preference.component.ts index 02bf01f01..1939fd424 100644 --- a/src/app/system/account-number-preferences/create-account-number-preference/create-account-number-preference.component.ts +++ b/src/app/system/account-number-preferences/create-account-number-preference/create-account-number-preference.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormBuilder, UntypedFormGroup, Validators, ReactiveFormsModule } from '@angular/forms'; import { Router, ActivatedRoute, RouterLink } from '@angular/router'; @@ -19,6 +19,11 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class CreateAccountNumberPreferenceComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private systemService = inject(SystemService); + private route = inject(ActivatedRoute); + private router = inject(Router); + /** Account Number Preferences Form */ accountNumberPreferenceForm: UntypedFormGroup; /** Account Number Preferences Template Data */ @@ -33,12 +38,7 @@ export class CreateAccountNumberPreferenceComponent implements OnInit { * @param {ActivatedRoute} route Activated Route. * @param {Router} router Router for navigation. */ - constructor( - private formBuilder: UntypedFormBuilder, - private systemService: SystemService, - private route: ActivatedRoute, - private router: Router - ) { + constructor() { this.route.data.subscribe((data: { accountNumberPreferencesTemplate: any }) => { this.accountNumberPreferencesTemplateData = data.accountNumberPreferencesTemplate; }); diff --git a/src/app/system/account-number-preferences/edit-account-number-preference/edit-account-number-preference.component.html b/src/app/system/account-number-preferences/edit-account-number-preference/edit-account-number-preference.component.html index ec2d899b7..cb6398e78 100644 --- a/src/app/system/account-number-preferences/edit-account-number-preference/edit-account-number-preference.component.html +++ b/src/app/system/account-number-preferences/edit-account-number-preference/edit-account-number-preference.component.html @@ -6,25 +6,28 @@ {{ 'labels.inputs.Account Type' | translate }} - - {{ accountType.value | translateKey: 'catalogs' }} - + @for (accountType of accountNumberPreferencesTemplateData.accountTypeOptions; track accountType) { + + {{ accountType.value | translateKey: 'catalogs' }} + + } - - {{ 'labels.inputs.Account Type' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (accountNumberPreferenceForm.controls.accountType.hasError('required')) { + + {{ 'labels.inputs.Account Type' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Prefix Field' | translate }} - - {{ prefixType.value }} - + @for (prefixType of prefixTypeData; track prefixType) { + + {{ prefixType.value }} + + } diff --git a/src/app/system/account-number-preferences/edit-account-number-preference/edit-account-number-preference.component.ts b/src/app/system/account-number-preferences/edit-account-number-preference/edit-account-number-preference.component.ts index 0a74f9e31..93176569a 100644 --- a/src/app/system/account-number-preferences/edit-account-number-preference/edit-account-number-preference.component.ts +++ b/src/app/system/account-number-preferences/edit-account-number-preference/edit-account-number-preference.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, Validators, ReactiveFormsModule } from '@angular/forms'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; @@ -19,6 +19,11 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class EditAccountNumberPreferenceComponent implements OnInit { + private route = inject(ActivatedRoute); + private formBuilder = inject(UntypedFormBuilder); + private systemService = inject(SystemService); + private router = inject(Router); + /** Account Number Preference Form */ accountNumberPreferenceForm: UntypedFormGroup; /** Account Number Preference Data */ @@ -35,12 +40,7 @@ export class EditAccountNumberPreferenceComponent implements OnInit { * @param {ActivatedRoute} route Activated Route. * @param {Router} router Router for navigation. */ - constructor( - private route: ActivatedRoute, - private formBuilder: UntypedFormBuilder, - private systemService: SystemService, - private router: Router - ) { + constructor() { this.route.data.subscribe((data: { accountNumberPreference: any; accountNumberPreferencesTemplate: any }) => { this.accountNumberPreferenceData = data.accountNumberPreference; this.accountNumberPreferencesTemplateData = data.accountNumberPreferencesTemplate; diff --git a/src/app/system/account-number-preferences/view-account-number-preference/account-number-preference.resolver.ts b/src/app/system/account-number-preferences/view-account-number-preference/account-number-preference.resolver.ts index 93da45027..9a618f3f0 100644 --- a/src/app/system/account-number-preferences/view-account-number-preference/account-number-preference.resolver.ts +++ b/src/app/system/account-number-preferences/view-account-number-preference/account-number-preference.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { SystemService } from '../../system.service'; */ @Injectable() export class AccountNumberPreferenceResolver { - /** - * @param {SystemService} systemService System service. - */ - constructor(private systemService: SystemService) {} + private systemService = inject(SystemService); /** * Returns the Account Number Preference data. diff --git a/src/app/system/account-number-preferences/view-account-number-preference/view-account-number-preference.component.html b/src/app/system/account-number-preferences/view-account-number-preference/view-account-number-preference.component.html index 7bcacef64..93f615fb7 100644 --- a/src/app/system/account-number-preferences/view-account-number-preference/view-account-number-preference.component.html +++ b/src/app/system/account-number-preferences/view-account-number-preference/view-account-number-preference.component.html @@ -22,13 +22,17 @@ {{ accountNumberPreferenceData.accountType.value | translateKey: 'catalogs' }} -
    - {{ 'labels.inputs.Prefix Type' | translate }} -
    + @if (accountNumberPreferenceData.prefixType) { +
    + {{ 'labels.inputs.Prefix Type' | translate }} +
    + } -
    - {{ accountNumberPreferenceData.prefixType.value }} -
    + @if (accountNumberPreferenceData.prefixType) { +
    + {{ accountNumberPreferenceData.prefixType.value }} +
    + } diff --git a/src/app/system/account-number-preferences/view-account-number-preference/view-account-number-preference.component.ts b/src/app/system/account-number-preferences/view-account-number-preference/view-account-number-preference.component.ts index 8b6030c12..a78f52205 100644 --- a/src/app/system/account-number-preferences/view-account-number-preference/view-account-number-preference.component.ts +++ b/src/app/system/account-number-preferences/view-account-number-preference/view-account-number-preference.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component } from '@angular/core'; +import { Component, inject } from '@angular/core'; import { MatDialog } from '@angular/material/dialog'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; @@ -25,6 +25,12 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ViewAccountNumberPreferenceComponent { + private route = inject(ActivatedRoute); + private systemService = inject(SystemService); + private router = inject(Router); + private dialog = inject(MatDialog); + private translateService = inject(TranslateService); + /** Account Number Preference Data */ accountNumberPreferenceData: any; @@ -36,13 +42,7 @@ export class ViewAccountNumberPreferenceComponent { * @param {MatDialog} dialog Dialog reference. * @param {TranslateService} translateService Translate Service. */ - constructor( - private route: ActivatedRoute, - private systemService: SystemService, - private router: Router, - private dialog: MatDialog, - private translateService: TranslateService - ) { + constructor() { this.route.data.subscribe((data: { accountNumberPreference: any }) => { this.accountNumberPreferenceData = data.accountNumberPreference; }); diff --git a/src/app/system/audit-trails/audit-trail-search-template.resolver.ts b/src/app/system/audit-trails/audit-trail-search-template.resolver.ts index 465e17710..e0a87b3f7 100644 --- a/src/app/system/audit-trails/audit-trail-search-template.resolver.ts +++ b/src/app/system/audit-trails/audit-trail-search-template.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; /** rxjs Imports */ import { Observable } from 'rxjs'; @@ -12,10 +12,7 @@ import { SystemService } from '../system.service'; */ @Injectable() export class AuditTrailSearchTemplateResolver { - /** - * @param {SystemService} systemService System service. - */ - constructor(private systemService: SystemService) {} + private systemService = inject(SystemService); /** * Returns the Audit Trail Search Template data. diff --git a/src/app/system/audit-trails/audit-trails.component.html b/src/app/system/audit-trails/audit-trails.component.html index e6e078e81..18f45b877 100644 --- a/src/app/system/audit-trails/audit-trails.component.html +++ b/src/app/system/audit-trails/audit-trails.component.html @@ -14,12 +14,11 @@ {{ 'labels.inputs.Status' | translate }} - - {{ processingResult.processingResult }} - + @for (processingResult of auditTrailSearchTemplateData.processingResults; track processingResult) { + + {{ processingResult.processingResult }} + + } @@ -52,7 +51,7 @@ [max]="maxDate" [matDatepicker]="fromDatePicker" [formControl]="fromDate" - placeholder="YYYY-MM-DD" + placeholder="yyyy-MM-dd" /> @@ -73,7 +72,7 @@ [max]="maxDate" [matDatepicker]="toDatePicker" [formControl]="toDate" - placeholder="YYYY-MM-DD" + placeholder="yyyy-MM-dd" /> @@ -94,7 +93,7 @@ [max]="maxDate" [matDatepicker]="checkedFromDatePicker" [formControl]="checkedFromDate" - placeholder="YYYY-MM-DD" + placeholder="yyyy-MM-dd" /> @@ -115,7 +114,7 @@ [max]="maxDate" [matDatepicker]="checkedToDatePicker" [formControl]="checkedToDate" - placeholder="YYYY-MM-DD" + placeholder="yyyy-MM-dd" /> @@ -130,98 +129,100 @@ - - {{ user.username }} - + @for (user of filteredUserData | async; track user) { + + {{ user.username }} + + } - - {{ action }} - + @for (action of filteredActionData | async; track action) { + + {{ action }} + + } - - {{ entity }} - + @for (entity of filteredEntityData | async; track entity) { + + {{ entity }} + + } - - {{ user.username }} - + @for (user of filteredCheckerData | async; track user) { + + {{ user.username }} + + }
    -
    - -
    - - - - - + @if (isLoading) { +
    + +
    + } + @if (!isLoading) { +
    {{ 'labels.inputs.Trail ID' | translate }}{{ auditTrail.id }}
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {{ 'labels.inputs.Trail ID' | translate }}{{ auditTrail.id }}{{ 'labels.inputs.Resource ID' | translate }}{{ auditTrail.resourceId }}{{ 'labels.inputs.Status' | translate }}{{ auditTrail.processingResult }}{{ 'labels.inputs.Made By' | translate }}{{ auditTrail.maker }}{{ 'labels.inputs.Action' | translate }}{{ auditTrail.actionName }}{{ 'labels.inputs.Entity' | translate }}{{ auditTrail.entityName }}{{ 'labels.inputs.Office' | translate }}{{ auditTrail.officeName }}{{ 'labels.inputs.Made Date' | translate }}{{ auditTrail.madeOnDate | datetimeFormat }}{{ 'labels.inputs.Checker' | translate }}{{ auditTrail.checker }}{{ 'labels.inputs.Checked Date' | translate }}{{ auditTrail.checkedOnDate | datetimeFormat }}{{ 'labels.inputs.Client Ip' | translate }}{{ auditTrail.ip }}
    + } - - {{ 'labels.inputs.Resource ID' | translate }} - {{ auditTrail.resourceId }} - - - - {{ 'labels.inputs.Status' | translate }} - {{ auditTrail.processingResult }} - - - - {{ 'labels.inputs.Made By' | translate }} - {{ auditTrail.maker }} - - - - {{ 'labels.inputs.Action' | translate }} - {{ auditTrail.actionName }} - - - - {{ 'labels.inputs.Entity' | translate }} - {{ auditTrail.entityName }} - - - - {{ 'labels.inputs.Office' | translate }} - {{ auditTrail.officeName }} - - - - {{ 'labels.inputs.Made Date' | translate }} - {{ auditTrail.madeOnDate | datetimeFormat }} - - - - {{ 'labels.inputs.Checker' | translate }} - {{ auditTrail.checker }} - - - - {{ 'labels.inputs.Checked Date' | translate }} - {{ auditTrail.checkedOnDate | datetimeFormat }} - - - - {{ 'labels.inputs.Client Ip' | translate }} - {{ auditTrail.ip }} - - - - - - - + @if (!isLoading) { + + }
    diff --git a/src/app/system/audit-trails/audit-trails.component.ts b/src/app/system/audit-trails/audit-trails.component.ts index 24ce9f8e3..996c82f6b 100644 --- a/src/app/system/audit-trails/audit-trails.component.ts +++ b/src/app/system/audit-trails/audit-trails.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, ViewChild, AfterViewInit } from '@angular/core'; +import { Component, OnInit, ViewChild, AfterViewInit, inject } from '@angular/core'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort, MatSortHeader } from '@angular/material/sort'; import { ActivatedRoute, RouterLink } from '@angular/router'; @@ -17,7 +17,7 @@ import { merge } from 'rxjs'; import { tap, debounceTime, distinctUntilChanged, startWith, map } from 'rxjs/operators'; import { Dates } from 'app/core/utils/dates'; import { FaIconComponent } from '@fortawesome/angular-fontawesome'; -import { NgFor, NgIf, AsyncPipe } from '@angular/common'; +import { AsyncPipe } from '@angular/common'; import { MatOption, MatAutocompleteTrigger, MatAutocomplete } from '@angular/material/autocomplete'; import { MatProgressBar } from '@angular/material/progress-bar'; import { @@ -66,6 +66,11 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class AuditTrailsComponent implements OnInit, AfterViewInit { + private route = inject(ActivatedRoute); + private systemService = inject(SystemService); + private dateUtils = inject(Dates); + private settingsService = inject(SettingsService); + /** Minimum date allowed. */ minDate = new Date(2000, 0, 1); /** Maximum date allowed. */ @@ -192,12 +197,7 @@ export class AuditTrailsComponent implements OnInit, AfterViewInit { * @param {Dates} dateUtils Dates utils * @param {SettingsService} settingsService Settings Service */ - constructor( - private route: ActivatedRoute, - private systemService: SystemService, - private dateUtils: Dates, - private settingsService: SettingsService - ) { + constructor() { this.route.data.subscribe((data: { auditTrailSearchTemplate: any }) => { this.auditTrailSearchTemplateData = data.auditTrailSearchTemplate; }); @@ -556,7 +556,7 @@ export class AuditTrailsComponent implements OnInit, AfterViewInit { (fieldName === 'madeOnDate' || fieldName === 'checkedOnDate') && row[fieldName] != null && row[fieldName] !== '' - ? JSON.stringify(this.dateUtils.formatDate(row[fieldName], 'YYYY-MM-DDTHH:mm:ssZ')) + ? JSON.stringify(this.dateUtils.formatDate(row[fieldName], 'yyyy-MM-ddTHH:mm:ssZ')) : JSON.stringify(row[fieldName], replacer) ) ); @@ -598,6 +598,6 @@ export class AuditTrailsComponent implements OnInit, AfterViewInit { result.setMinutes(minutes || 0); result.setSeconds(seconds || 0); } - return this.dateUtils.formatDate(result, 'YYYY-MM-DDTHH:mm:ssZ'); + return this.dateUtils.formatDate(result, 'yyyy-MM-ddTHH:mm:ssZ'); } } diff --git a/src/app/system/audit-trails/view-audit/audit-trail.resolver.ts b/src/app/system/audit-trails/view-audit/audit-trail.resolver.ts index 24747ce2c..b06c45c60 100644 --- a/src/app/system/audit-trails/view-audit/audit-trail.resolver.ts +++ b/src/app/system/audit-trails/view-audit/audit-trail.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { SystemService } from '../../system.service'; */ @Injectable() export class AuditTrailResolver { - /** - * @param {SystemService} systemService System service. - */ - constructor(private systemService: SystemService) {} + private systemService = inject(SystemService); /** * Returns the Audit Trail data. diff --git a/src/app/system/audit-trails/view-audit/view-audit.component.html b/src/app/system/audit-trails/view-audit/view-audit.component.html index d76dcc241..c8be4d8b8 100644 --- a/src/app/system/audit-trails/view-audit/view-audit.component.html +++ b/src/app/system/audit-trails/view-audit/view-audit.component.html @@ -60,38 +60,54 @@ {{ auditTrailData.madeOnDate | datetimeFormat }} -
    - {{ 'labels.inputs.Office' | translate }} -
    + @if (auditTrailData.officeName) { +
    + {{ 'labels.inputs.Office' | translate }} +
    + } -
    - {{ auditTrailData.officeName }} -
    + @if (auditTrailData.officeName) { +
    + {{ auditTrailData.officeName }} +
    + } -
    - {{ 'labels.inputs.Savings Account No' | translate }} -
    + @if (auditTrailData.savingsAccountNo) { +
    + {{ 'labels.inputs.Savings Account No' | translate }} +
    + } -
    - {{ auditTrailData.savingsAccountNo }} -
    + @if (auditTrailData.savingsAccountNo) { +
    + {{ auditTrailData.savingsAccountNo }} +
    + } -
    - {{ 'labels.inputs.Group Level' | translate }} -
    + @if (auditTrailData.groupLevelName) { +
    + {{ 'labels.inputs.Group Level' | translate }} +
    + } -
    - {{ auditTrailData.groupLevelName }} -
    + @if (auditTrailData.groupLevelName) { +
    + {{ auditTrailData.groupLevelName }} +
    + } -
    - {{ 'labels.inputs.Client Ip' | translate }} -
    + @if (auditTrailData.ip) { +
    + {{ 'labels.inputs.Client Ip' | translate }} +
    + } -
    - {{ auditTrailData.ip }} -
    + @if (auditTrailData.ip) { +
    + {{ auditTrailData.ip }} +
    + }
    diff --git a/src/app/system/audit-trails/view-audit/view-audit.component.ts b/src/app/system/audit-trails/view-audit/view-audit.component.ts index 45d12172b..d0b22e47c 100644 --- a/src/app/system/audit-trails/view-audit/view-audit.component.ts +++ b/src/app/system/audit-trails/view-audit/view-audit.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, ViewChild } from '@angular/core'; +import { Component, OnInit, ViewChild, inject } from '@angular/core'; import { ActivatedRoute, RouterLink } from '@angular/router'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort, MatSortHeader } from '@angular/material/sort'; @@ -44,6 +44,8 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ViewAuditComponent implements OnInit { + private route = inject(ActivatedRoute); + /** Audit Trail Data. */ auditTrailData: any; /** Columns to be displayed in audit trail table. */ @@ -63,7 +65,7 @@ export class ViewAuditComponent implements OnInit { * Retrieves the audit trail data from `resolve`. * @param {ActivatedRoute} route Activated Route. */ - constructor(private route: ActivatedRoute) { + constructor() { this.route.data.subscribe((data: { auditTrail: any }) => { this.auditTrailData = data.auditTrail; }); diff --git a/src/app/system/codes/code.resolver.ts b/src/app/system/codes/code.resolver.ts index d059b7501..00660a6e1 100644 --- a/src/app/system/codes/code.resolver.ts +++ b/src/app/system/codes/code.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { SystemService } from '../system.service'; */ @Injectable() export class CodeResolver { - /** - * @param {SystemService} systemService System service. - */ - constructor(private systemService: SystemService) {} + private systemService = inject(SystemService); /** * Returns the Code data. diff --git a/src/app/system/codes/codes.component.html b/src/app/system/codes/codes.component.html index d3b296564..90a4701d8 100644 --- a/src/app/system/codes/codes.component.html +++ b/src/app/system/codes/codes.component.html @@ -25,22 +25,24 @@ {{ 'labels.inputs.System Defined' | translate }} - - + @if (code.systemDefined) { + + } + @if (!code.systemDefined) { + + } diff --git a/src/app/system/codes/codes.component.ts b/src/app/system/codes/codes.component.ts index 487d37235..20f4c564b 100644 --- a/src/app/system/codes/codes.component.ts +++ b/src/app/system/codes/codes.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, TemplateRef, ElementRef, ViewChild, AfterViewInit } from '@angular/core'; +import { Component, OnInit, TemplateRef, ElementRef, ViewChild, AfterViewInit, inject } from '@angular/core'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort, MatSortHeader } from '@angular/material/sort'; import { @@ -48,6 +48,11 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class CodesComponent implements OnInit, AfterViewInit { + private route = inject(ActivatedRoute); + private router = inject(Router); + private configurationWizardService = inject(ConfigurationWizardService); + private popoverService = inject(PopoverService); + /** Codes data. */ codesData: any; /** Columns to be displayed in codes table. */ @@ -79,12 +84,7 @@ export class CodesComponent implements OnInit, AfterViewInit { * @param {ConfigurationWizardService} configurationWizardService ConfigurationWizard Service. * @param {PopoverService} popoverService PopoverService. */ - constructor( - private route: ActivatedRoute, - private router: Router, - private configurationWizardService: ConfigurationWizardService, - private popoverService: PopoverService - ) { + constructor() { this.route.data.subscribe((data: { codes: any }) => { this.codesData = data.codes; }); diff --git a/src/app/system/codes/codes.resolver.ts b/src/app/system/codes/codes.resolver.ts index 8de813bad..f17074cb6 100644 --- a/src/app/system/codes/codes.resolver.ts +++ b/src/app/system/codes/codes.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; /** rxjs Imports */ import { Observable } from 'rxjs'; @@ -12,10 +12,7 @@ import { SystemService } from '../system.service'; */ @Injectable() export class CodesResolver { - /** - * @param {SystemService} systemService System service. - */ - constructor(private systemService: SystemService) {} + private systemService = inject(SystemService); /** * Returns the Codes data. diff --git a/src/app/system/codes/create-code/create-code.component.html b/src/app/system/codes/create-code/create-code.component.html index ca4b4be58..f0417a533 100644 --- a/src/app/system/codes/create-code/create-code.component.html +++ b/src/app/system/codes/create-code/create-code.component.html @@ -6,10 +6,12 @@ {{ 'labels.inputs.Code Name' | translate }} - - {{ 'labels.inputs.Code Name' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (codeForm.controls.name.hasError('required')) { + + {{ 'labels.inputs.Code Name' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + }
    diff --git a/src/app/system/codes/create-code/create-code.component.ts b/src/app/system/codes/create-code/create-code.component.ts index b5babaa63..32a209434 100644 --- a/src/app/system/codes/create-code/create-code.component.ts +++ b/src/app/system/codes/create-code/create-code.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, TemplateRef, ElementRef, ViewChild, AfterViewInit } from '@angular/core'; +import { Component, OnInit, TemplateRef, ElementRef, ViewChild, AfterViewInit, inject } from '@angular/core'; import { UntypedFormBuilder, UntypedFormGroup, Validators, ReactiveFormsModule } from '@angular/forms'; import { Router, ActivatedRoute, RouterLink } from '@angular/router'; @@ -19,6 +19,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class CreateCodeComponent implements OnInit, AfterViewInit { + private formBuilder = inject(UntypedFormBuilder); + private systemService = inject(SystemService); + private route = inject(ActivatedRoute); + private router = inject(Router); + private configurationWizardService = inject(ConfigurationWizardService); + private popoverService = inject(PopoverService); + /** Code form. */ codeForm: UntypedFormGroup; @@ -27,23 +34,6 @@ export class CreateCodeComponent implements OnInit, AfterViewInit { /* Template for popover on create code form */ @ViewChild('templateCodeFormRef') templateCodeFormRef: TemplateRef; - /** - * @param {FormBuilder} formBuilder Form Builder. - * @param {SystemService} systemService Accounting Service. - * @param {ActivatedRoute} route Activated Route. - * @param {Router} router Router for navigation. - * @param {ConfigurationWizardService} configurationWizardService ConfigurationWizard Service. - * @param {PopoverService} popoverService PopoverService. - */ - constructor( - private formBuilder: UntypedFormBuilder, - private systemService: SystemService, - private route: ActivatedRoute, - private router: Router, - private configurationWizardService: ConfigurationWizardService, - private popoverService: PopoverService - ) {} - /** * Creates the code form. */ diff --git a/src/app/system/codes/edit-code/edit-code.component.html b/src/app/system/codes/edit-code/edit-code.component.html index 5a841fe61..67efb1b8f 100644 --- a/src/app/system/codes/edit-code/edit-code.component.html +++ b/src/app/system/codes/edit-code/edit-code.component.html @@ -6,10 +6,12 @@ {{ 'labels.inputs.Code Name' | translate }} - - {{ 'labels.inputs.Code Name' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (codeForm.controls.name.hasError('required')) { + + {{ 'labels.inputs.Code Name' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } diff --git a/src/app/system/codes/edit-code/edit-code.component.ts b/src/app/system/codes/edit-code/edit-code.component.ts index 228cd0e22..d0ca1180d 100644 --- a/src/app/system/codes/edit-code/edit-code.component.ts +++ b/src/app/system/codes/edit-code/edit-code.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, Validators, ReactiveFormsModule } from '@angular/forms'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; @@ -19,6 +19,11 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class EditCodeComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private systemService = inject(SystemService); + private route = inject(ActivatedRoute); + private router = inject(Router); + /** Code Form */ codeForm: UntypedFormGroup; /** Code Data */ @@ -31,12 +36,7 @@ export class EditCodeComponent implements OnInit { * @param {ActivatedRoute} route Activated Route. * @param {Router} router Router for navigation. */ - constructor( - private formBuilder: UntypedFormBuilder, - private systemService: SystemService, - private route: ActivatedRoute, - private router: Router - ) { + constructor() { this.route.data.subscribe((data: { code: any }) => { this.codeData = data.code; }); diff --git a/src/app/system/codes/view-code/code-values.resolver.ts b/src/app/system/codes/view-code/code-values.resolver.ts index b49434112..ffbe9672f 100644 --- a/src/app/system/codes/view-code/code-values.resolver.ts +++ b/src/app/system/codes/view-code/code-values.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { SystemService } from '../../system.service'; */ @Injectable() export class CodeValuesResolver { - /** - * @param {SystemService} systemService System service. - */ - constructor(private systemService: SystemService) {} + private systemService = inject(SystemService); /** * Returns the Code Values data. diff --git a/src/app/system/codes/view-code/view-code.component.html b/src/app/system/codes/view-code/view-code.component.html index 186bf8b15..96188f8d0 100644 --- a/src/app/system/codes/view-code/view-code.component.html +++ b/src/app/system/codes/view-code/view-code.component.html @@ -4,19 +4,23 @@ {{ 'labels.buttons.Add Code Value' | translate }} - - - + @if (!codeData.systemDefined) { + + + + } - - - + @if (!codeData.systemDefined) { + + + + }
    @@ -27,103 +31,111 @@
    -
    -
    - - {{ 'labels.inputs.name' | translate }} - - - {{ 'labels.inputs.name' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - - - {{ 'labels.inputs.Description' | translate }} - - - - - {{ 'labels.inputs.Position' | translate }} - - - {{ 'labels.inputs.name' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - -
    - {{ - 'labels.inputs.Active' | translate - }} -
    - -
    - + @for (codeValue of codeValues.controls; track codeValue; let i = $index) { +
    +
    + + {{ 'labels.inputs.name' | translate }} + + @if (codeValues.at(i).controls.name.hasError('required')) { + + {{ 'labels.inputs.name' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + + {{ 'labels.inputs.Description' | translate }} + + + + {{ 'labels.inputs.Position' | translate }} + + @if (codeValues.at(i).controls.position.hasError('required')) { + + {{ 'labels.inputs.name' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + +
    + {{ + 'labels.inputs.Active' | translate + }} +
    +
    + @if (codeValueRowStatus[i] === 'edit') { + + + + } + @if (codeValueRowStatus[i] === 'edit') { + + } + @if (codeValueRowStatus[i] === 'new') { + + } + @if (codeValueRowStatus[i] === 'disabled') { + + } - - - - - +
    -
    + } diff --git a/src/app/system/codes/view-code/view-code.component.ts b/src/app/system/codes/view-code/view-code.component.ts index f3683e992..728e27ca6 100644 --- a/src/app/system/codes/view-code/view-code.component.ts +++ b/src/app/system/codes/view-code/view-code.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormArray, UntypedFormBuilder, @@ -40,6 +40,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ViewCodeComponent implements OnInit { + private route = inject(ActivatedRoute); + private systemService = inject(SystemService); + private router = inject(Router); + private formBuilder = inject(UntypedFormBuilder); + private dialog = inject(MatDialog); + private translateService = inject(TranslateService); + /** Code Data */ codeData: any; /** Code Values Data */ @@ -58,14 +65,7 @@ export class ViewCodeComponent implements OnInit { * @param {MatDialog} dialog Dialog reference. * @param {TranslateService} translateService Translate Service. */ - constructor( - private route: ActivatedRoute, - private systemService: SystemService, - private router: Router, - private formBuilder: UntypedFormBuilder, - private dialog: MatDialog, - private translateService: TranslateService - ) { + constructor() { this.route.data.subscribe((data: { code: any; codeValues: any }) => { this.codeData = data.code; this.codeValuesData = data.codeValues; diff --git a/src/app/system/configurations/business-date-tab/business-date-tab.component.html b/src/app/system/configurations/business-date-tab/business-date-tab.component.html index 3e6f97422..c660e96df 100644 --- a/src/app/system/configurations/business-date-tab/business-date-tab.component.html +++ b/src/app/system/configurations/business-date-tab/business-date-tab.component.html @@ -1,130 +1,149 @@
    -
    -

    - {{ 'labels.text.Business Date functionality is not enabled' | translate }}: {{ configurationName }} -

    -
    + @if (!isBusinessDateEnabled) { +
    +

    + {{ 'labels.text.Business Date functionality is not enabled' | translate }}: + {{ configurationName }} +

    +
    + } -
    - -
    - -
    -
    - {{ 'labels.inputs.User date format' | translate }}: - {{ userDateFormat }} + @if (isBusinessDateEnabled) { +
    + + + +
    +
    + {{ 'labels.inputs.User date format' | translate }}: + {{ userDateFormat }} +
    -
    - - -
    -
    - {{ 'labels.inputs.Business Date' | translate }}: - {{ businessDate | dateFormat }} + +
    + @if (!isEditInProgress) { +
    + {{ 'labels.inputs.Business Date' | translate }}: + {{ businessDate | dateFormat }} +
    + } + @if (isEditInProgress && dateIndex === 0) { + + {{ 'labels.inputs.Business Date' | translate }} + + + + @if (businessDateForm.controls.businessDate.hasError('required')) { + + {{ 'labels.inputs.Business Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + } +
    + @if (isEditInProgress && dateIndex === 0) { + + + + + } + @if (!isEditInProgress) { + + } +
    - - - {{ 'labels.inputs.Business Date' | translate }} - - - - - {{ 'labels.inputs.Business Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - -
    - - - - - + +
    + @if (!isEditInProgress) { +
    + {{ 'labels.inputs.COB Date' | translate }}: + {{ cobDate | dateFormat }} +
    + } + @if (isEditInProgress && dateIndex === 1) { + + {{ 'labels.inputs.COB Date' | translate }} + + + + @if (businessDateForm.controls.cobDate.hasError('required')) { + + {{ 'labels.inputs.COB Date' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + } +
    + @if (isEditInProgress && dateIndex === 1) { + + + + } + @if (isEditInProgress && dateIndex === 1) { + + } + @if (!isEditInProgress) { + + } +
    -
    - - -
    -
    - {{ 'labels.inputs.COB Date' | translate }}: - {{ cobDate | dateFormat }} -
    - - - {{ 'labels.inputs.COB Date' | translate }} - - - - - {{ 'labels.inputs.COB Date' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - -
    - - - - - -
    -
    - - - -
    + + + +
    + }
    diff --git a/src/app/system/configurations/business-date-tab/business-date-tab.component.ts b/src/app/system/configurations/business-date-tab/business-date-tab.component.ts index 0fbbd7d98..0cafa1aa4 100644 --- a/src/app/system/configurations/business-date-tab/business-date-tab.component.ts +++ b/src/app/system/configurations/business-date-tab/business-date-tab.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormBuilder, UntypedFormGroup, Validators, ReactiveFormsModule } from '@angular/forms'; import { Alert } from 'app/core/alert/alert.model'; @@ -29,6 +29,12 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class BusinessDateTabComponent implements OnInit { + private systemService = inject(SystemService); + private settingsService = inject(SettingsService); + private formBuilder = inject(UntypedFormBuilder); + private dateUtils = inject(Dates); + private alertService = inject(AlertService); + /** Subscription to alerts. */ alert$: Subscription; @@ -50,21 +56,6 @@ export class BusinessDateTabComponent implements OnInit { isBusinessDateEnabled = false; isEditInProgress = false; - /** - * Retrieves the configurations data from `resolve`. - * @param {SystemService} systemService System Service. - * @param {SettingsService} settingsService Settings Service. - * @param {FormBuilder} formBuilder Form Builder. - * @param {Dates} dateUtils Date Utils. - */ - constructor( - private systemService: SystemService, - private settingsService: SettingsService, - private formBuilder: UntypedFormBuilder, - private dateUtils: Dates, - private alertService: AlertService - ) {} - ngOnInit(): void { this.alert$ = this.alertService.alertEvent.subscribe((alertEvent: Alert) => { const alertType = alertEvent.type; diff --git a/src/app/system/configurations/configurations.component.html b/src/app/system/configurations/configurations.component.html index 9cfb6ec13..98c995dca 100644 --- a/src/app/system/configurations/configurations.component.html +++ b/src/app/system/configurations/configurations.component.html @@ -4,9 +4,11 @@ - - - + @if (isBusinessDateEnabled) { + + + + }
    diff --git a/src/app/system/configurations/configurations.component.ts b/src/app/system/configurations/configurations.component.ts index b718e3047..8569b3822 100644 --- a/src/app/system/configurations/configurations.component.ts +++ b/src/app/system/configurations/configurations.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { Alert } from 'app/core/alert/alert.model'; import { AlertService } from 'app/core/alert/alert.service'; import { SettingsService } from 'app/settings/settings.service'; @@ -22,16 +22,14 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ConfigurationsComponent implements OnInit { + private alertService = inject(AlertService); + private systemService = inject(SystemService); + /** Subscription to alerts. */ alert$: Subscription; isBusinessDateEnabled = false; - constructor( - private alertService: AlertService, - private systemService: SystemService - ) {} - ngOnInit(): void { this.alert$ = this.alertService.alertEvent.subscribe((alertEvent: Alert) => { const alertType = alertEvent.type; diff --git a/src/app/system/configurations/global-configurations-tab/edit-configuration/edit-configuration.component.ts b/src/app/system/configurations/global-configurations-tab/edit-configuration/edit-configuration.component.ts index a5db5ed60..557240ed9 100644 --- a/src/app/system/configurations/global-configurations-tab/edit-configuration/edit-configuration.component.ts +++ b/src/app/system/configurations/global-configurations-tab/edit-configuration/edit-configuration.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormBuilder, UntypedFormGroup, Validators, ReactiveFormsModule } from '@angular/forms'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; import { SettingsService } from 'app/settings/settings.service'; @@ -22,6 +22,12 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class EditConfigurationComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private systemService = inject(SystemService); + private settingsService = inject(SettingsService); + private route = inject(ActivatedRoute); + private router = inject(Router); + /** Minimum transaction date allowed. */ minDate = new Date(2000, 0, 1); /** Maximum transaction date allowed. */ @@ -40,13 +46,7 @@ export class EditConfigurationComponent implements OnInit { * @param {ActivatedRoute} route Activated Route. * @param {Router} router Router for navigation. */ - constructor( - private formBuilder: UntypedFormBuilder, - private systemService: SystemService, - private settingsService: SettingsService, - private route: ActivatedRoute, - private router: Router - ) { + constructor() { this.route.data.subscribe((data: { configuration: any }) => { this.configuration = data.configuration; }); diff --git a/src/app/system/configurations/global-configurations-tab/global-configuration.resolver.ts b/src/app/system/configurations/global-configurations-tab/global-configuration.resolver.ts index 45cf20d1b..1ee3df43b 100644 --- a/src/app/system/configurations/global-configurations-tab/global-configuration.resolver.ts +++ b/src/app/system/configurations/global-configurations-tab/global-configuration.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { SystemService } from '../../system.service'; */ @Injectable() export class GlobalConfigurationResolver { - /** - * @param {SystemService} systemService System service. - */ - constructor(private systemService: SystemService) {} + private systemService = inject(SystemService); /** * Returns the Configuration data. diff --git a/src/app/system/configurations/global-configurations-tab/global-configurations-tab.component.html b/src/app/system/configurations/global-configurations-tab/global-configurations-tab.component.html index dfe5186c8..6107df820 100644 --- a/src/app/system/configurations/global-configurations-tab/global-configurations-tab.component.html +++ b/src/app/system/configurations/global-configurations-tab/global-configurations-tab.component.html @@ -12,12 +12,13 @@ {{ 'labels.inputs.name' | translate }} {{ configuration.name }} - + @if (configuration.description) { + + } @@ -30,8 +31,12 @@ (click)="toggleStatus(configuration)" >
    - {{ 'labels.inputs.Enabled' | translate }} - {{ 'labels.inputs.Disabled' | translate }} + @if (configuration.enabled) { + {{ 'labels.inputs.Enabled' | translate }} + } + @if (!configuration.enabled) { + {{ 'labels.inputs.Disabled' | translate }} + }
    diff --git a/src/app/system/configurations/global-configurations-tab/global-configurations-tab.component.ts b/src/app/system/configurations/global-configurations-tab/global-configurations-tab.component.ts index 9805828d2..79ed86c6d 100644 --- a/src/app/system/configurations/global-configurations-tab/global-configurations-tab.component.ts +++ b/src/app/system/configurations/global-configurations-tab/global-configurations-tab.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, TemplateRef, ElementRef, ViewChild, AfterViewInit } from '@angular/core'; +import { Component, OnInit, TemplateRef, ElementRef, ViewChild, AfterViewInit, inject } from '@angular/core'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort, MatSortHeader } from '@angular/material/sort'; import { @@ -57,6 +57,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class GlobalConfigurationsTabComponent implements OnInit, AfterViewInit { + private route = inject(ActivatedRoute); + private alertService = inject(AlertService); + private systemService = inject(SystemService); + private router = inject(Router); + private configurationWizardService = inject(ConfigurationWizardService); + private popoverService = inject(PopoverService); + /** Configuration data. */ configurationData: any; /** Columns to be displayed in configurations table. */ @@ -93,14 +100,7 @@ export class GlobalConfigurationsTabComponent implements OnInit, AfterViewInit { * @param {ConfigurationWizardService} configurationWizardService ConfigurationWizard Service. * @param {PopoverService} popoverService PopoverService. */ - constructor( - private route: ActivatedRoute, - private alertService: AlertService, - private systemService: SystemService, - private router: Router, - private configurationWizardService: ConfigurationWizardService, - private popoverService: PopoverService - ) { + constructor() { this.route.data.subscribe((data: { configurations: any }) => { this.configurationData = data.configurations; }); diff --git a/src/app/system/configurations/global-configurations-tab/global-configurations.resolver.ts b/src/app/system/configurations/global-configurations-tab/global-configurations.resolver.ts index 4ce53d1d7..556ea71c9 100644 --- a/src/app/system/configurations/global-configurations-tab/global-configurations.resolver.ts +++ b/src/app/system/configurations/global-configurations-tab/global-configurations.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; /** rxjs Imports */ import { Observable } from 'rxjs'; @@ -12,10 +12,7 @@ import { SystemService } from '../../system.service'; */ @Injectable() export class GlobalConfigurationsResolver { - /** - * @param {SystemService} systemService System service. - */ - constructor(private systemService: SystemService) {} + private systemService = inject(SystemService); /** * Returns the configurations data. diff --git a/src/app/system/configure-maker-checker-tasks/configure-maker-checker-tasks.component.html b/src/app/system/configure-maker-checker-tasks/configure-maker-checker-tasks.component.html index d8ea1e8cb..5d39742b2 100644 --- a/src/app/system/configure-maker-checker-tasks/configure-maker-checker-tasks.component.html +++ b/src/app/system/configure-maker-checker-tasks/configure-maker-checker-tasks.component.html @@ -18,15 +18,16 @@
    - - - {{ formatName(grouping) }} - - + @for (grouping of groupings; track grouping) { + + + {{ formatName(grouping) }} + + + }
    @@ -34,29 +35,33 @@
    -
    -
    - - {{ permissionName(permission.code) }} - + @for (permission of permissions.permissions; track permission; let i = $index) { +
    +
    + + {{ permissionName(permission.code) }} + +
    -
    + }
    -
    - - - - -
    + @if (!isDisabled) { +
    + + + + +
    + }
    diff --git a/src/app/system/configure-maker-checker-tasks/configure-maker-checker-tasks.component.ts b/src/app/system/configure-maker-checker-tasks/configure-maker-checker-tasks.component.ts index f1fa64182..520af2b0c 100644 --- a/src/app/system/configure-maker-checker-tasks/configure-maker-checker-tasks.component.ts +++ b/src/app/system/configure-maker-checker-tasks/configure-maker-checker-tasks.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit, TemplateRef, ElementRef, ViewChild, AfterViewInit } from '@angular/core'; +import { Component, OnInit, TemplateRef, ElementRef, ViewChild, AfterViewInit, inject } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; import { UntypedFormGroup, UntypedFormBuilder, Validators, ReactiveFormsModule } from '@angular/forms'; import * as _ from 'lodash'; @@ -9,7 +9,7 @@ import { ConfigurationWizardService } from '../../configuration-wizard/configura import { SystemService } from '../system.service'; import { FaIconComponent } from '@fortawesome/angular-fontawesome'; import { MatList, MatListItem } from '@angular/material/list'; -import { NgFor, NgClass, NgIf } from '@angular/common'; +import { NgClass } from '@angular/common'; import { MatDivider } from '@angular/material/divider'; import { MatCheckbox } from '@angular/material/checkbox'; import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; @@ -50,6 +50,13 @@ interface SubmitPermissionData { ] }) export class ConfigureMakerCheckerTasksComponent implements OnInit, AfterViewInit { + private route = inject(ActivatedRoute); + private systemService = inject(SystemService); + private formBuilder = inject(UntypedFormBuilder); + private router = inject(Router); + private configurationWizardService = inject(ConfigurationWizardService); + private popoverService = inject(PopoverService); + permissionsData: Permission[] = []; groupings: string[] = []; currentGrouping = ''; @@ -82,14 +89,7 @@ export class ConfigureMakerCheckerTasksComponent implements OnInit, AfterViewIni * @param {ConfigurationWizardService} configurationWizardService ConfigurationWizard Service. * @param {PopoverService} popoverService PopoverService. */ - constructor( - private route: ActivatedRoute, - private systemService: SystemService, - private formBuilder: UntypedFormBuilder, - private router: Router, - private configurationWizardService: ConfigurationWizardService, - private popoverService: PopoverService - ) { + constructor() { this.route.data.subscribe((data: { permissions: any }) => { this.permissionsData = data.permissions; }); diff --git a/src/app/system/configure-maker-checker-tasks/configure-maker-checker-tasks.resolver.ts b/src/app/system/configure-maker-checker-tasks/configure-maker-checker-tasks.resolver.ts index 3eb5976e1..210f9450b 100644 --- a/src/app/system/configure-maker-checker-tasks/configure-maker-checker-tasks.resolver.ts +++ b/src/app/system/configure-maker-checker-tasks/configure-maker-checker-tasks.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; /** rxjs Imports */ import { Observable } from 'rxjs'; @@ -12,10 +12,7 @@ import { SystemService } from '../system.service'; */ @Injectable() export class MakerCheckerTasksResolver { - /** - * @param {SystemService} systemService System service. - */ - constructor(private systemService: SystemService) {} + private systemService = inject(SystemService); /** * Returns all the Configurable Maker Checker Tasks. diff --git a/src/app/system/entity-to-entity-mapping/entity-to-entity-mapping.component.html b/src/app/system/entity-to-entity-mapping/entity-to-entity-mapping.component.html index d89a9f8ed..f23d1f490 100644 --- a/src/app/system/entity-to-entity-mapping/entity-to-entity-mapping.component.html +++ b/src/app/system/entity-to-entity-mapping/entity-to-entity-mapping.component.html @@ -4,21 +4,31 @@ {{ 'labels.inputs.Mapping Between Entities' | translate }} - - {{ 'labels.inputs.Offices Loan Products' | translate }} - - - {{ 'labels.inputs.Offices Savings Products' | translate }} - - - {{ 'labels.inputs.Offices Charges/Fees' | translate }} - - - {{ 'labels.inputs.Roles Loan Products' | translate }} - - - {{ 'labels.inputs.Roles Savings Products' | translate }} - + @if (mappingType.mappingTypes === 'office_access_to_loan_products') { + + {{ 'labels.inputs.Offices Loan Products' | translate }} + + } + @if (mappingType.mappingTypes === 'office_access_to_savings_products') { + + {{ 'labels.inputs.Offices Savings Products' | translate }} + + } + @if (mappingType.mappingTypes === 'office_access_to_fees/charges') { + + {{ 'labels.inputs.Offices Charges/Fees' | translate }} + + } + @if (mappingType.mappingTypes === 'role_access_to_loan_products') { + + {{ 'labels.inputs.Roles Loan Products' | translate }} + + } + @if (mappingType.mappingTypes === 'role_access_to_savings_products') { + + {{ 'labels.inputs.Roles Savings Products' | translate }} + + } @@ -27,7 +37,7 @@ - + @if (selectedMappingType > 0) {
    @@ -42,73 +52,71 @@ {{ 'labels.inputs.All' | translate }} - - {{ firstEntity.name }} - + @for (firstEntity of firstEntityData; track firstEntity) { + + {{ firstEntity.name }} + + } - - {{ firstMappingEntity | translateKey: 'inputs' }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (filterPreferenceForm.controls.mappingFirstParamId.hasError('required')) { + + {{ firstMappingEntity | translateKey: 'inputs' }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } - {{ secondMappingEntity | translateKey: 'text' }} {{ 'labels.inputs.All' | translate }} - - {{ secondEntity.name }} - + @for (secondEntity of secondEntityData; track secondEntity) { + + {{ secondEntity.name }} + + } - - {{ secondMappingEntity | translateKey: 'text' }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (filterPreferenceForm.controls.mappingSecondParamId.hasError('required')) { + + {{ secondMappingEntity | translateKey: 'text' }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } - - + @if (hasClickedFilters) { + + }
    - - + @if (hasClickedFilters) {
    - - - - - -
    {{ firstMappingEntity | translateKey: 'inputs' }} {{ listdata.fromEntity }} {{ secondMappingEntity | translateKey: 'text' }} {{ listdata.toEntity }} {{ 'labels.inputs.Start Date' | translate }} {{ listdata.startDate | dateFormat }} {{ 'labels.inputs.End Date' | translate }} {{ listdata.endDate | dateFormat }} @@ -125,7 +133,6 @@ @@ -142,14 +149,13 @@
    -
    + } - + }
    diff --git a/src/app/system/entity-to-entity-mapping/entity-to-entity-mapping.component.ts b/src/app/system/entity-to-entity-mapping/entity-to-entity-mapping.component.ts index 156320552..cf269fed3 100644 --- a/src/app/system/entity-to-entity-mapping/entity-to-entity-mapping.component.ts +++ b/src/app/system/entity-to-entity-mapping/entity-to-entity-mapping.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, ViewChild } from '@angular/core'; +import { Component, OnInit, ViewChild, inject } from '@angular/core'; import { MatDialog } from '@angular/material/dialog'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort } from '@angular/material/sort'; @@ -66,6 +66,14 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class EntityToEntityMappingComponent implements OnInit { + private route = inject(ActivatedRoute); + private formBuilder = inject(UntypedFormBuilder); + private systemService = inject(SystemService); + private dateUtils = inject(Dates); + private dialog = inject(MatDialog); + private settingsService = inject(SettingsService); + private translateService = inject(TranslateService); + /** Stores entity to entity mapping data */ entityMappings: string[] = []; /** Stores Id of selected mapping type */ @@ -123,15 +131,7 @@ export class EntityToEntityMappingComponent implements OnInit { * @param {ActivatedRoute} route Activated Route. * @param {TranslateService} translateService Translate Service. */ - constructor( - private route: ActivatedRoute, - private formBuilder: UntypedFormBuilder, - private systemService: SystemService, - private dateUtils: Dates, - private dialog: MatDialog, - private settingsService: SettingsService, - private translateService: TranslateService - ) { + constructor() { this.route.data.subscribe((data: { entityMappings: any }) => { this.entityMappings = data.entityMappings; }); @@ -290,7 +290,6 @@ export class EntityToEntityMappingComponent implements OnInit { type: 'date', required: false }) - ]; const data = { title: @@ -345,7 +344,6 @@ export class EntityToEntityMappingComponent implements OnInit { type: 'date', required: false }) - ]; const data = { title: diff --git a/src/app/system/entity-to-entity-mapping/entity-to-entity-mapping.resolver.ts b/src/app/system/entity-to-entity-mapping/entity-to-entity-mapping.resolver.ts index dac85c387..1f30acfed 100644 --- a/src/app/system/entity-to-entity-mapping/entity-to-entity-mapping.resolver.ts +++ b/src/app/system/entity-to-entity-mapping/entity-to-entity-mapping.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; /** rxjs Imports */ import { Observable } from 'rxjs'; @@ -12,10 +12,7 @@ import { SystemService } from '../system.service'; */ @Injectable() export class EntityToEntityMappingResolver { - /** - * @param {SystemService} systemService System service. - */ - constructor(private systemService: SystemService) {} + private systemService = inject(SystemService); /** * Returns the Mapping data. diff --git a/src/app/system/external-services/amazon-s3/amazon-s3.component.ts b/src/app/system/external-services/amazon-s3/amazon-s3.component.ts index 378d4ec7b..604ab2ce8 100644 --- a/src/app/system/external-services/amazon-s3/amazon-s3.component.ts +++ b/src/app/system/external-services/amazon-s3/amazon-s3.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, ViewChild } from '@angular/core'; +import { Component, OnInit, ViewChild, inject } from '@angular/core'; import { MatSort, MatSortHeader } from '@angular/material/sort'; import { MatTableDataSource, @@ -43,6 +43,8 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class AmazonS3Component implements OnInit { + private route = inject(ActivatedRoute); + /** Amazon S3 configuration data. */ amazonS3ConfigurationData: any; /** Columns to be displayed in Amazon S3 configuration table. */ @@ -60,7 +62,7 @@ export class AmazonS3Component implements OnInit { * Retrieves the Amazon S3 configuration data from `resolve`. * @param {ActivatedRoute} route Activated Route. */ - constructor(private route: ActivatedRoute) { + constructor() { this.route.data.subscribe((data: { amazonS3Configuration: any }) => { this.amazonS3ConfigurationData = data.amazonS3Configuration; }); diff --git a/src/app/system/external-services/amazon-s3/amazon-s3.resolver.ts b/src/app/system/external-services/amazon-s3/amazon-s3.resolver.ts index 2e5ee5be7..8a6d8f571 100644 --- a/src/app/system/external-services/amazon-s3/amazon-s3.resolver.ts +++ b/src/app/system/external-services/amazon-s3/amazon-s3.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; /** rxjs Imports */ import { Observable } from 'rxjs'; @@ -12,10 +12,7 @@ import { SystemService } from '../../system.service'; */ @Injectable() export class AmazonS3ConfigurationResolver { - /** - * @param {SystemService} systemService System service. - */ - constructor(private systemService: SystemService) {} + private systemService = inject(SystemService); /** * Returns the Amazon S3 Configuration data. diff --git a/src/app/system/external-services/amazon-s3/edit-amazon-s3/edit-amazon-s3.component.html b/src/app/system/external-services/amazon-s3/edit-amazon-s3/edit-amazon-s3.component.html index 6520bfa4d..ad245100b 100644 --- a/src/app/system/external-services/amazon-s3/edit-amazon-s3/edit-amazon-s3.component.html +++ b/src/app/system/external-services/amazon-s3/edit-amazon-s3/edit-amazon-s3.component.html @@ -6,50 +6,66 @@ {{ 'labels.inputs.S3 Bucket Name' | translate }} - - {{ 'labels.inputs.S3 Bucket Name' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (amazonS3ConfigurationForm.controls.s3_bucket_name.hasError('required')) { + + {{ 'labels.inputs.S3 Bucket Name' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.S3 Access Key' | translate }} - - - {{ 'labels.inputs.S3 Access Key' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (amazonS3ConfigurationForm.controls.s3_access_key.value) { + + } + @if (amazonS3ConfigurationForm.controls.s3_access_key.hasError('required')) { + + {{ 'labels.inputs.S3 Access Key' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.S3 Secret Key' | translate }} - - - {{ 'labels.inputs.S3 Secret Key' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (amazonS3ConfigurationForm.controls.s3_secret_key.value) { + + } + @if (amazonS3ConfigurationForm.controls.s3_secret_key.hasError('required')) { + + {{ 'labels.inputs.S3 Secret Key' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + }
    diff --git a/src/app/system/external-services/amazon-s3/edit-amazon-s3/edit-amazon-s3.component.ts b/src/app/system/external-services/amazon-s3/edit-amazon-s3/edit-amazon-s3.component.ts index d5a83653b..780bd1492 100644 --- a/src/app/system/external-services/amazon-s3/edit-amazon-s3/edit-amazon-s3.component.ts +++ b/src/app/system/external-services/amazon-s3/edit-amazon-s3/edit-amazon-s3.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; import { UntypedFormGroup, UntypedFormBuilder, Validators, ReactiveFormsModule } from '@angular/forms'; @@ -23,6 +23,11 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class EditAmazonS3Component implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private systemService = inject(SystemService); + private route = inject(ActivatedRoute); + private router = inject(Router); + /** Amazon S3 Configuration data */ amazonS3ConfigurationData: any; /** Amazon S3 Configuration Form */ @@ -39,12 +44,7 @@ export class EditAmazonS3Component implements OnInit { * @param {ActivatedRoute} route Activated Route. * @param {Router} router Router for navigation. */ - constructor( - private formBuilder: UntypedFormBuilder, - private systemService: SystemService, - private route: ActivatedRoute, - private router: Router - ) { + constructor() { this.route.data.subscribe((data: { amazonS3Configuration: any }) => { this.amazonS3ConfigurationData = data.amazonS3Configuration; }); diff --git a/src/app/system/external-services/email/edit-email/edit-email.component.html b/src/app/system/external-services/email/edit-email/edit-email.component.html index db140c922..0d1d10e07 100644 --- a/src/app/system/external-services/email/edit-email/edit-email.component.html +++ b/src/app/system/external-services/email/edit-email/edit-email.component.html @@ -6,48 +6,61 @@ {{ 'labels.inputs.Username' | translate }} - - {{ 'labels.inputs.Username' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (emailConfigurationForm.controls.username.hasError('required')) { + + {{ 'labels.inputs.Username' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Password' | translate }} - - - {{ 'labels.inputs.Password' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (emailConfigurationForm.controls.password.value) { + + } + @if (emailConfigurationForm.controls.password.hasError('required')) { + + {{ 'labels.inputs.Password' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Host' | translate }} - - {{ 'labels.inputs.Host' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (emailConfigurationForm.controls.host.hasError('required')) { + + {{ 'labels.inputs.Host' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Port' | translate }} - - {{ 'labels.inputs.Port' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (emailConfigurationForm.controls.port.hasError('required')) { + + {{ 'labels.inputs.Port' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } @@ -57,19 +70,23 @@ {{ 'labels.inputs.From Email' | translate }} - - {{ 'labels.inputs.From Email' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (emailConfigurationForm.controls.fromEmail.hasError('required')) { + + {{ 'labels.inputs.From Email' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.From Name' | translate }} - - {{ 'labels.inputs.From Name' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (emailConfigurationForm.controls.fromName.hasError('required')) { + + {{ 'labels.inputs.From Name' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + }
    diff --git a/src/app/system/external-services/email/edit-email/edit-email.component.ts b/src/app/system/external-services/email/edit-email/edit-email.component.ts index 86c8cb1e5..8380f15e0 100644 --- a/src/app/system/external-services/email/edit-email/edit-email.component.ts +++ b/src/app/system/external-services/email/edit-email/edit-email.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; import { UntypedFormGroup, UntypedFormBuilder, Validators, ReactiveFormsModule } from '@angular/forms'; @@ -25,6 +25,11 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class EditEmailComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private systemService = inject(SystemService); + private route = inject(ActivatedRoute); + private router = inject(Router); + /** Password input field type. */ passwordInputType: string; /** Email Configuration data */ @@ -39,12 +44,7 @@ export class EditEmailComponent implements OnInit { * @param {ActivatedRoute} route Activated Route. * @param {Router} router Router for navigation. */ - constructor( - private formBuilder: UntypedFormBuilder, - private systemService: SystemService, - private route: ActivatedRoute, - private router: Router - ) { + constructor() { this.route.data.subscribe((data: { emailConfiguration: any }) => { this.emailConfigurationData = data.emailConfiguration; }); diff --git a/src/app/system/external-services/email/email.component.ts b/src/app/system/external-services/email/email.component.ts index faf1c4d51..5a3f8dbf0 100644 --- a/src/app/system/external-services/email/email.component.ts +++ b/src/app/system/external-services/email/email.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, ViewChild } from '@angular/core'; +import { Component, OnInit, ViewChild, inject } from '@angular/core'; import { ActivatedRoute, RouterLink } from '@angular/router'; import { MatSort, MatSortHeader } from '@angular/material/sort'; import { @@ -43,6 +43,8 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class EmailComponent implements OnInit { + private route = inject(ActivatedRoute); + /** Email configuration data. */ emailConfigurationData: any; /** Columns to be displayed in Email configuration table. */ @@ -60,7 +62,7 @@ export class EmailComponent implements OnInit { * Retrieves the Email configuration data from `resolve`. * @param {ActivatedRoute} route Activated Route. */ - constructor(private route: ActivatedRoute) { + constructor() { this.route.data.subscribe((data: { emailConfiguration: any }) => { this.emailConfigurationData = data.emailConfiguration; }); diff --git a/src/app/system/external-services/email/email.resolver.ts b/src/app/system/external-services/email/email.resolver.ts index e7237b2f5..55f2eb143 100644 --- a/src/app/system/external-services/email/email.resolver.ts +++ b/src/app/system/external-services/email/email.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; /** rxjs Imports */ import { Observable } from 'rxjs'; @@ -12,10 +12,7 @@ import { SystemService } from '../../system.service'; */ @Injectable() export class EmailConfigurationResolver { - /** - * @param {SystemService} systemService System service. - */ - constructor(private systemService: SystemService) {} + private systemService = inject(SystemService); /** * Returns the Email Configuration data. diff --git a/src/app/system/external-services/external-services.component.html b/src/app/system/external-services/external-services.component.html index 2dfa8ca40..5965d0b02 100644 --- a/src/app/system/external-services/external-services.component.html +++ b/src/app/system/external-services/external-services.component.html @@ -8,21 +8,17 @@

    {{ 'labels.heading.S3 Amazon External Service' | translate }}

    - - -

    - {{ 'labels.text.S3 Amazon Service Configuration' | translate }} -

    + @if (!arrowBooleans[0]) { + + } + @if (arrowBooleans[0]) { + + } + @if (arrowBooleans[0]) { +

    + {{ 'labels.text.S3 Amazon Service Configuration' | translate }} +

    + } @@ -30,21 +26,17 @@

    {{ 'labels.heading.SMS External Service' | translate }}

    - - -

    - {{ 'labels.text.SMS Service Configuration' | translate }} -

    + @if (!arrowBooleans[1]) { + + } + @if (arrowBooleans[1]) { + + } + @if (arrowBooleans[1]) { +

    + {{ 'labels.text.SMS Service Configuration' | translate }} +

    + }
    @@ -56,21 +48,17 @@

    {{ 'labels.heading.Email External Service' | translate }}

    - - -

    - {{ 'labels.text.Email Service Configuration' | translate }} -

    + @if (!arrowBooleans[2]) { + + } + @if (arrowBooleans[2]) { + + } + @if (arrowBooleans[2]) { +

    + {{ 'labels.text.Email Service Configuration' | translate }} +

    + } @@ -80,21 +68,17 @@

    {{ 'labels.heading.Notification External Service' | translate }}

    - - -

    - {{ 'labels.text.Notification Service Configuration' | translate }} -

    + @if (!arrowBooleans[3]) { + + } + @if (arrowBooleans[3]) { + + } + @if (arrowBooleans[3]) { +

    + {{ 'labels.text.Notification Service Configuration' | translate }} +

    + }
    diff --git a/src/app/system/external-services/notification/edit-notification/edit-notification.component.html b/src/app/system/external-services/notification/edit-notification/edit-notification.component.html index 29a2f5b3f..775bef934 100644 --- a/src/app/system/external-services/notification/edit-notification/edit-notification.component.html +++ b/src/app/system/external-services/notification/edit-notification/edit-notification.component.html @@ -6,28 +6,34 @@ {{ 'labels.inputs.Server Key' | translate }} - - {{ 'labels.inputs.Server Key' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (notificationConfigurationForm.controls.server_key.hasError('required')) { + + {{ 'labels.inputs.Server Key' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.GCM End Point' | translate }} - - {{ 'labels.inputs.GCM End Point' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (notificationConfigurationForm.controls.gcm_end_point.hasError('required')) { + + {{ 'labels.inputs.GCM End Point' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.FCM End Point' | translate }} - - {{ 'labels.inputs.FCM End Point' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (notificationConfigurationForm.controls.fcm_end_point.hasError('required')) { + + {{ 'labels.inputs.FCM End Point' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } diff --git a/src/app/system/external-services/notification/edit-notification/edit-notification.component.ts b/src/app/system/external-services/notification/edit-notification/edit-notification.component.ts index ab24de9fe..10a7ad643 100644 --- a/src/app/system/external-services/notification/edit-notification/edit-notification.component.ts +++ b/src/app/system/external-services/notification/edit-notification/edit-notification.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; import { UntypedFormGroup, UntypedFormBuilder, Validators, ReactiveFormsModule } from '@angular/forms'; @@ -19,6 +19,11 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class EditNotificationComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private systemService = inject(SystemService); + private route = inject(ActivatedRoute); + private router = inject(Router); + /** Notification Configuration data */ notificationConfigurationData: any; /** Notification Configuration Form */ @@ -31,12 +36,7 @@ export class EditNotificationComponent implements OnInit { * @param {ActivatedRoute} route Activated Route. * @param {Router} router Router for navigation. */ - constructor( - private formBuilder: UntypedFormBuilder, - private systemService: SystemService, - private route: ActivatedRoute, - private router: Router - ) { + constructor() { this.route.data.subscribe((data: { notificationConfiguration: any }) => { this.notificationConfigurationData = data.notificationConfiguration; }); diff --git a/src/app/system/external-services/notification/notification.component.ts b/src/app/system/external-services/notification/notification.component.ts index 317405fbf..0dc84bf30 100644 --- a/src/app/system/external-services/notification/notification.component.ts +++ b/src/app/system/external-services/notification/notification.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, ViewChild } from '@angular/core'; +import { Component, OnInit, ViewChild, inject } from '@angular/core'; import { ActivatedRoute, RouterLink } from '@angular/router'; import { MatSort, MatSortHeader } from '@angular/material/sort'; import { @@ -43,6 +43,8 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class NotificationComponent implements OnInit { + private route = inject(ActivatedRoute); + /** Notification configuration data. */ notificationConfigurationData: any; /** Columns to be displayed in Notification configuration table. */ @@ -60,7 +62,7 @@ export class NotificationComponent implements OnInit { * Retrieves the Notification configuration data from `resolve`. * @param {ActivatedRoute} route Activated Route. */ - constructor(private route: ActivatedRoute) { + constructor() { this.route.data.subscribe((data: { notificationConfiguration: any }) => { this.notificationConfigurationData = data.notificationConfiguration; }); diff --git a/src/app/system/external-services/notification/notification.resolver.ts b/src/app/system/external-services/notification/notification.resolver.ts index ab3cadd65..939df291b 100644 --- a/src/app/system/external-services/notification/notification.resolver.ts +++ b/src/app/system/external-services/notification/notification.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; /** rxjs Imports */ import { Observable } from 'rxjs'; @@ -12,10 +12,7 @@ import { SystemService } from '../../system.service'; */ @Injectable() export class NotificationConfigurationResolver { - /** - * @param {SystemService} systemService System service. - */ - constructor(private systemService: SystemService) {} + private systemService = inject(SystemService); /** * Returns the Notification Configuration data. diff --git a/src/app/system/external-services/sms/edit-sms/edit-sms.component.html b/src/app/system/external-services/sms/edit-sms/edit-sms.component.html index 5df13aa5b..19ce1ca1b 100644 --- a/src/app/system/external-services/sms/edit-sms/edit-sms.component.html +++ b/src/app/system/external-services/sms/edit-sms/edit-sms.component.html @@ -6,37 +6,45 @@ {{ 'labels.inputs.Host Name' | translate }} - - {{ 'labels.inputs.Host Name' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (smsConfigurationForm.controls.host_name.hasError('required')) { + + {{ 'labels.inputs.Host Name' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Port Number' | translate }} - - {{ 'labels.inputs.Port Number' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (smsConfigurationForm.controls.port_number.hasError('required')) { + + {{ 'labels.inputs.Port Number' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.End Point' | translate }} - - {{ 'labels.inputs.End Point' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (smsConfigurationForm.controls.end_point.hasError('required')) { + + {{ 'labels.inputs.End Point' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Tenant App Key' | translate }} - - {{ 'labels.inputs.Tenant App Key' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (smsConfigurationForm.controls.tenant_app_key.hasError('required')) { + + {{ 'labels.inputs.Tenant App Key' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } diff --git a/src/app/system/external-services/sms/edit-sms/edit-sms.component.ts b/src/app/system/external-services/sms/edit-sms/edit-sms.component.ts index 2e0728401..a7e062c37 100644 --- a/src/app/system/external-services/sms/edit-sms/edit-sms.component.ts +++ b/src/app/system/external-services/sms/edit-sms/edit-sms.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; import { UntypedFormGroup, UntypedFormBuilder, Validators, ReactiveFormsModule } from '@angular/forms'; @@ -19,6 +19,11 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class EditSMSComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private systemService = inject(SystemService); + private route = inject(ActivatedRoute); + private router = inject(Router); + /** SMS Configuration data */ smsConfigurationData: any; /** SMS Configuration Form */ @@ -31,12 +36,7 @@ export class EditSMSComponent implements OnInit { * @param {ActivatedRoute} route Activated Route. * @param {Router} router Router for navigation. */ - constructor( - private formBuilder: UntypedFormBuilder, - private systemService: SystemService, - private route: ActivatedRoute, - private router: Router - ) { + constructor() { this.route.data.subscribe((data: { smsConfiguration: any }) => { this.smsConfigurationData = data.smsConfiguration; }); diff --git a/src/app/system/external-services/sms/sms.component.ts b/src/app/system/external-services/sms/sms.component.ts index 50094931f..5c20fe7bc 100644 --- a/src/app/system/external-services/sms/sms.component.ts +++ b/src/app/system/external-services/sms/sms.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, ViewChild } from '@angular/core'; +import { Component, OnInit, ViewChild, inject } from '@angular/core'; import { ActivatedRoute, RouterLink } from '@angular/router'; import { MatSort, MatSortHeader } from '@angular/material/sort'; import { @@ -43,6 +43,8 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class SMSComponent implements OnInit { + private route = inject(ActivatedRoute); + /** SMS configuration data. */ smsConfigurationData: any; /** Columns to be displayed in SMS configuration table. */ @@ -60,7 +62,7 @@ export class SMSComponent implements OnInit { * Retrieves the SMS configuration data from `resolve`. * @param {ActivatedRoute} route Activated Route. */ - constructor(private route: ActivatedRoute) { + constructor() { this.route.data.subscribe((data: { smsConfiguration: any }) => { this.smsConfigurationData = data.smsConfiguration; }); diff --git a/src/app/system/external-services/sms/sms.resolver.ts b/src/app/system/external-services/sms/sms.resolver.ts index 719700abb..b9bb93ee9 100644 --- a/src/app/system/external-services/sms/sms.resolver.ts +++ b/src/app/system/external-services/sms/sms.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; /** rxjs Imports */ import { Observable } from 'rxjs'; @@ -12,10 +12,7 @@ import { SystemService } from '../../system.service'; */ @Injectable() export class SMSConfigurationResolver { - /** - * @param {SystemService} systemService System service. - */ - constructor(private systemService: SystemService) {} + private systemService = inject(SystemService); /** * Returns the SMS Configuration data. diff --git a/src/app/system/manage-data-tables/column-dialog/column-dialog.component.html b/src/app/system/manage-data-tables/column-dialog/column-dialog.component.html index 495bcbda4..aa48796bc 100644 --- a/src/app/system/manage-data-tables/column-dialog/column-dialog.component.html +++ b/src/app/system/manage-data-tables/column-dialog/column-dialog.component.html @@ -9,44 +9,56 @@ {{ 'labels.inputs.Column Name' | translate }} - - {{ 'labels.inputs.Column Name' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (columnForm.controls.name.hasError('required')) { + + {{ 'labels.inputs.Column Name' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Column Type' | translate }} - - {{ columnType.displayValue | translateKey: 'inputs' }} - + @for (columnType of columnTypeData; track columnType) { + + {{ columnType.displayValue | translateKey: 'inputs' }} + + } - - {{ 'labels.inputs.Column Type' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (columnForm.controls.type.hasError('required')) { + + {{ 'labels.inputs.Column Type' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } - - {{ 'labels.inputs.Column Length' | translate }} - - + @if (columnForm.value.type === 'String') { + + {{ 'labels.inputs.Column Length' | translate }} + + + } - - {{ 'labels.inputs.Column Code' | translate }} - - - {{ columnCode.name }} - - - + @if (columnForm.value.type === 'Dropdown') { + + {{ 'labels.inputs.Column Code' | translate }} + + @for (columnCode of data.columnCodes; track columnCode) { + + {{ columnCode.name }} + + } + + + }
    {{ diff --git a/src/app/system/manage-data-tables/column-dialog/column-dialog.component.ts b/src/app/system/manage-data-tables/column-dialog/column-dialog.component.ts index 4fa3934a1..35a460cc9 100644 --- a/src/app/system/manage-data-tables/column-dialog/column-dialog.component.ts +++ b/src/app/system/manage-data-tables/column-dialog/column-dialog.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, Inject } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { MAT_DIALOG_DATA, MatDialogRef, @@ -34,22 +34,15 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ColumnDialogComponent implements OnInit { + dialogRef = inject>(MatDialogRef); + formBuilder = inject(UntypedFormBuilder); + data = inject(MAT_DIALOG_DATA); + /** Column Form. */ columnForm: UntypedFormGroup; /** Column Type Data */ columnTypeData = columnTypeData; - /** - * @param {MatDialogRef} dialogRef Component reference to dialog. - * @param {FormBuilder} formBuilder Form Builder. - * @param {any} data Provides the column codes and values for the form (if available). - */ - constructor( - public dialogRef: MatDialogRef, - public formBuilder: UntypedFormBuilder, - @Inject(MAT_DIALOG_DATA) public data: any - ) {} - /** * Creates the add column form. */ @@ -69,7 +62,6 @@ export class ColumnDialogComponent implements OnInit { disabled: this.data.type === 'existing' }, Validators.required - ], length: [ { @@ -77,7 +69,6 @@ export class ColumnDialogComponent implements OnInit { disabled: this.getColumnType(this.data.columnDisplayType) !== 'String' || this.data.type === 'existing' }, Validators.required - ], mandatory: [{ value: this.data.isColumnNullable, disabled: this.data.type === 'existing' }], unique: [ @@ -89,7 +80,6 @@ export class ColumnDialogComponent implements OnInit { disabled: this.getColumnType(this.data.columnDisplayType) !== 'Dropdown' || this.data.type === 'existing' }, Validators.required - ] }); this.onColumnTypeChanges(); diff --git a/src/app/system/manage-data-tables/create-data-table/create-data-table.component.html b/src/app/system/manage-data-tables/create-data-table/create-data-table.component.html index 277ff04f4..bad2b5ea3 100644 --- a/src/app/system/manage-data-tables/create-data-table/create-data-table.component.html +++ b/src/app/system/manage-data-tables/create-data-table/create-data-table.component.html @@ -6,42 +6,56 @@ {{ 'labels.inputs.Data Table Name' | translate }} - - {{ 'labels.inputs.Data Table Name' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (dataTableForm.controls.datatableName.hasError('required')) { + + {{ 'labels.inputs.Data Table Name' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Entity Type' | translate }} - - {{ appTable.displayValue | translateKey: 'inputs' }} - + @for (appTable of appTableData; track appTable) { + + {{ appTable.displayValue | translateKey: 'inputs' }} + + } - - {{ 'labels.inputs.Application Table Name' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (dataTableForm.controls.apptableName.hasError('required')) { + + {{ 'labels.inputs.Application Table Name' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } - - {{ 'labels.inputs.Entity SubType' | translate }} - - - {{ entitySubType.displayValue | translateKey: 'inputs' }} - - - + @if (showEntitySubType) { + + {{ 'labels.inputs.Entity SubType' | translate }} + + @for (entitySubType of entitySubTypeData; track entitySubType) { + + {{ entitySubType.displayValue | translateKey: 'inputs' }} + + } + + + } - - {{ 'labels.inputs.Savings SubType' | translate }} - - - {{ savingsSubType.displayValue | translateKey: 'inputs' }} - - - + @if (showSavingsSubType) { + + {{ 'labels.inputs.Savings SubType' | translate }} + + @for (savingsSubType of savingsSubTypeData; track savingsSubType) { + + {{ savingsSubType.displayValue | translateKey: 'inputs' }} + + } + + + }
    {{ @@ -67,14 +81,15 @@ {{ 'labels.inputs.Name' | translate }} {{ column.columnName }} - + @if (column.isColumnPrimaryKey) { + + } @@ -96,22 +111,24 @@ {{ 'labels.text.Mandatory' | translate }} - - + @if (!column.isColumnNullable) { + + } + @if (column.isColumnNullable) { + + } @@ -120,22 +137,24 @@ {{ 'labels.inputs.Unique' | translate }} - - + @if (column.isColumnUnique) { + + } + @if (!column.isColumnUnique) { + + } @@ -144,22 +163,24 @@ {{ 'labels.inputs.Indexed' | translate }} - - + @if (column.isColumnIndexed) { + + } + @if (!column.isColumnIndexed) { + + } diff --git a/src/app/system/manage-data-tables/create-data-table/create-data-table.component.ts b/src/app/system/manage-data-tables/create-data-table/create-data-table.component.ts index 5894f3bf9..6cab96aa3 100644 --- a/src/app/system/manage-data-tables/create-data-table/create-data-table.component.ts +++ b/src/app/system/manage-data-tables/create-data-table/create-data-table.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { AfterViewInit, Component, ElementRef, OnInit, TemplateRef, ViewChild } from '@angular/core'; +import { AfterViewInit, Component, ElementRef, OnInit, TemplateRef, ViewChild, inject } from '@angular/core'; import { UntypedFormBuilder, UntypedFormGroup, Validators, ReactiveFormsModule } from '@angular/forms'; import { MatDialog } from '@angular/material/dialog'; import { MatPaginator } from '@angular/material/paginator'; @@ -70,6 +70,15 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class CreateDataTableComponent implements OnInit, AfterViewInit { + private formBuilder = inject(UntypedFormBuilder); + private systemService = inject(SystemService); + private route = inject(ActivatedRoute); + private router = inject(Router); + private dialog = inject(MatDialog); + private configurationWizardService = inject(ConfigurationWizardService); + private popoverService = inject(PopoverService); + private translateService = inject(TranslateService); + /** Data Table Form */ dataTableForm: UntypedFormGroup; /** Application Table Data */ @@ -126,16 +135,7 @@ export class CreateDataTableComponent implements OnInit, AfterViewInit { * @param {PopoverService} popoverService PopoverService. * @param {TranslateService} translateService Translate Service. */ - constructor( - private formBuilder: UntypedFormBuilder, - private systemService: SystemService, - private route: ActivatedRoute, - private router: Router, - private dialog: MatDialog, - private configurationWizardService: ConfigurationWizardService, - private popoverService: PopoverService, - private translateService: TranslateService - ) { + constructor() { this.route.data.subscribe((data: { columnCodes: any }) => { this.dataForDialog.columnCodes = data.columnCodes; }); diff --git a/src/app/system/manage-data-tables/data-table.resolver.ts b/src/app/system/manage-data-tables/data-table.resolver.ts index fb748f1fa..29fa54004 100644 --- a/src/app/system/manage-data-tables/data-table.resolver.ts +++ b/src/app/system/manage-data-tables/data-table.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { SystemService } from '../system.service'; */ @Injectable() export class DataTableResolver { - /** - * @param {SystemService} systemService System service. - */ - constructor(private systemService: SystemService) {} + private systemService = inject(SystemService); /** * Returns the Data Table data. diff --git a/src/app/system/manage-data-tables/edit-data-table/edit-data-table.component.html b/src/app/system/manage-data-tables/edit-data-table/edit-data-table.component.html index cacad64d9..eac1a584f 100644 --- a/src/app/system/manage-data-tables/edit-data-table/edit-data-table.component.html +++ b/src/app/system/manage-data-tables/edit-data-table/edit-data-table.component.html @@ -11,24 +11,32 @@ {{ 'labels.inputs.Application Table Name' | translate }} - - {{ appTable.displayValue | translateKey: 'inputs' }} - + @for (appTable of appTableData; track appTable) { + + {{ appTable.displayValue | translateKey: 'inputs' }} + + } - - {{ 'labels.inputs.Application Table Name' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (dataTableForm.controls.apptableName.hasError('required')) { + + {{ 'labels.inputs.Application Table Name' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } - - {{ 'labels.inputs.Entity SubType' | translate }} - - - {{ entitySubType.displayValue | translateKey: 'inputs' }} - - - + @if (showEntitySubType) { + + {{ 'labels.inputs.Entity SubType' | translate }} + + @for (entitySubType of entitySubTypeData; track entitySubType) { + + {{ entitySubType.displayValue | translateKey: 'inputs' }} + + } + + + }

    @@ -78,22 +86,24 @@ {{ 'labels.text.Mandatory' | translate }} - - + @if (!column.isColumnNullable) { + + } + @if (column.isColumnNullable) { + + } @@ -102,22 +112,24 @@ {{ 'labels.inputs.Unique' | translate }} - - + @if (column.isColumnUnique) { + + } + @if (!column.isColumnUnique) { + + } @@ -126,22 +138,24 @@ {{ 'labels.inputs.Indexed' | translate }} - - + @if (column.isColumnIndexed) { + + } + @if (!column.isColumnIndexed) { + + } @@ -150,12 +164,16 @@ {{ 'labels.inputs.Actions' | translate }} - - + @if (!column.system) { + + } + @if (!column.system) { + + } diff --git a/src/app/system/manage-data-tables/edit-data-table/edit-data-table.component.ts b/src/app/system/manage-data-tables/edit-data-table/edit-data-table.component.ts index 671cf7c61..4b8e07448 100644 --- a/src/app/system/manage-data-tables/edit-data-table/edit-data-table.component.ts +++ b/src/app/system/manage-data-tables/edit-data-table/edit-data-table.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, ViewChild } from '@angular/core'; +import { Component, OnInit, ViewChild, inject } from '@angular/core'; import { UntypedFormBuilder, UntypedFormGroup, Validators, ReactiveFormsModule } from '@angular/forms'; import { MatDialog } from '@angular/material/dialog'; import { MatPaginator } from '@angular/material/paginator'; @@ -63,6 +63,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class EditDataTableComponent implements OnInit { + private systemService = inject(SystemService); + private formBuilder = inject(UntypedFormBuilder); + private route = inject(ActivatedRoute); + private router = inject(Router); + private dialog = inject(MatDialog); + private translateService = inject(TranslateService); + /** Data Table Form. */ dataTableForm: UntypedFormGroup; /** Data Table Data. */ @@ -144,14 +151,7 @@ export class EditDataTableComponent implements OnInit { * @param {FormBuilder} formBuilder Form Builder. * @param {MatDialog} dialog Dialog Reference. */ - constructor( - private systemService: SystemService, - private formBuilder: UntypedFormBuilder, - private route: ActivatedRoute, - private router: Router, - private dialog: MatDialog, - private translateService: TranslateService - ) { + constructor() { this.route.data.subscribe((data: { dataTable: any; columnCodes: any }) => { this.dataTableData = data.dataTable; diff --git a/src/app/system/manage-data-tables/manage-data-tables.component.ts b/src/app/system/manage-data-tables/manage-data-tables.component.ts index 18c2d47ce..85b976a90 100644 --- a/src/app/system/manage-data-tables/manage-data-tables.component.ts +++ b/src/app/system/manage-data-tables/manage-data-tables.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, TemplateRef, ElementRef, ViewChild, AfterViewInit } from '@angular/core'; +import { Component, OnInit, TemplateRef, ElementRef, ViewChild, AfterViewInit, inject } from '@angular/core'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort, MatSortHeader } from '@angular/material/sort'; import { @@ -52,6 +52,11 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ManageDataTablesComponent implements OnInit, AfterViewInit { + private route = inject(ActivatedRoute); + private router = inject(Router); + private configurationWizardService = inject(ConfigurationWizardService); + private popoverService = inject(PopoverService); + /** Data table data. */ dataTableData: any; /** Columns to be displayed in manage data tables table. */ @@ -84,12 +89,7 @@ export class ManageDataTablesComponent implements OnInit, AfterViewInit { * @param {ConfigurationWizardService} configurationWizardService ConfigurationWizard Service. * @param {PopoverService} popoverService PopoverService. */ - constructor( - private route: ActivatedRoute, - private router: Router, - private configurationWizardService: ConfigurationWizardService, - private popoverService: PopoverService - ) { + constructor() { this.route.data.subscribe((data: { dataTables: any }) => { this.dataTableData = data.dataTables; }); diff --git a/src/app/system/manage-data-tables/manage-data-tables.resolver.ts b/src/app/system/manage-data-tables/manage-data-tables.resolver.ts index 877230b16..cba343e7e 100644 --- a/src/app/system/manage-data-tables/manage-data-tables.resolver.ts +++ b/src/app/system/manage-data-tables/manage-data-tables.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; /** rxjs Imports */ import { Observable } from 'rxjs'; @@ -12,10 +12,7 @@ import { SystemService } from '../system.service'; */ @Injectable() export class ManageDataTablesResolver { - /** - * @param {SystemService} systemService System service. - */ - constructor(private systemService: SystemService) {} + private systemService = inject(SystemService); /** * Returns the manage data tables data. diff --git a/src/app/system/manage-data-tables/view-data-table/view-data-table.component.html b/src/app/system/manage-data-tables/view-data-table/view-data-table.component.html index 84c2d72b8..738d54d97 100644 --- a/src/app/system/manage-data-tables/view-data-table/view-data-table.component.html +++ b/src/app/system/manage-data-tables/view-data-table/view-data-table.component.html @@ -54,44 +54,48 @@ {{ 'labels.text.Mandatory' | translate }} - - + @if (!dataTable.isColumnNullable) { + + } + @if (dataTable.isColumnNullable) { + + } {{ 'labels.inputs.Unique' | translate }} - - + @if (dataTable.isColumnUnique) { + + } + @if (!dataTable.isColumnUnique) { + + } @@ -100,22 +104,24 @@ {{ 'labels.inputs.Indexed' | translate }} - - + @if (dataTable.isColumnIndexed) { + + } + @if (!dataTable.isColumnIndexed) { + + } diff --git a/src/app/system/manage-data-tables/view-data-table/view-data-table.component.ts b/src/app/system/manage-data-tables/view-data-table/view-data-table.component.ts index 1e999d14f..108adf6ca 100644 --- a/src/app/system/manage-data-tables/view-data-table/view-data-table.component.ts +++ b/src/app/system/manage-data-tables/view-data-table/view-data-table.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, ViewChild } from '@angular/core'; +import { Component, OnInit, ViewChild, inject } from '@angular/core'; import { MatDialog } from '@angular/material/dialog'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort, MatSortHeader } from '@angular/material/sort'; @@ -55,6 +55,12 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ViewDataTableComponent implements OnInit { + private route = inject(ActivatedRoute); + private systemService = inject(SystemService); + private router = inject(Router); + private dialog = inject(MatDialog); + private translateService = inject(TranslateService); + /** Data Table Data */ dataTableData: any; /** Column Data */ @@ -85,13 +91,7 @@ export class ViewDataTableComponent implements OnInit { * @param {MatDialog} dialog Dialog reference. * @param {TranslateService} translateService Translate Service. */ - constructor( - private route: ActivatedRoute, - private systemService: SystemService, - private router: Router, - private dialog: MatDialog, - private translateService: TranslateService - ) { + constructor() { this.route.data.subscribe((data: { dataTable: any }) => { this.dataTableData = data.dataTable; this.columnsData = this.dataTableData.columnHeaderData; diff --git a/src/app/system/manage-external-events/manage-external-events.component.html b/src/app/system/manage-external-events/manage-external-events.component.html index 3a9f5563b..7254bdb32 100644 --- a/src/app/system/manage-external-events/manage-external-events.component.html +++ b/src/app/system/manage-external-events/manage-external-events.component.html @@ -30,8 +30,12 @@
    - {{ 'labels.inputs.Enabled' | translate }} - {{ 'labels.inputs.Disabled' | translate }} + @if (event.enabled) { + {{ 'labels.inputs.Enabled' | translate }} + } + @if (!event.enabled) { + {{ 'labels.inputs.Disabled' | translate }} + }
    diff --git a/src/app/system/manage-external-events/manage-external-events.component.ts b/src/app/system/manage-external-events/manage-external-events.component.ts index c74b8c9fd..5a2ad5161 100644 --- a/src/app/system/manage-external-events/manage-external-events.component.ts +++ b/src/app/system/manage-external-events/manage-external-events.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit, ViewChild } from '@angular/core'; +import { Component, OnInit, ViewChild, inject } from '@angular/core'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort, MatSortHeader } from '@angular/material/sort'; import { @@ -44,6 +44,9 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ManageExternalEventsComponent implements OnInit { + private route = inject(ActivatedRoute); + private systemService = inject(SystemService); + /** Events Data. */ eventsData: any; externalEventConfigurations: any = {}; @@ -63,10 +66,7 @@ export class ManageExternalEventsComponent implements OnInit { /** Sorter for reports table. */ @ViewChild(MatSort, { static: true }) sort: MatSort; - constructor( - private route: ActivatedRoute, - private systemService: SystemService - ) { + constructor() { this.route.data.subscribe((data: { events: any }) => { this.eventsData = data.events.externalEventConfiguration; }); diff --git a/src/app/system/manage-external-events/manage-external-events.resolver.ts b/src/app/system/manage-external-events/manage-external-events.resolver.ts index 6f8855e16..5c1486016 100644 --- a/src/app/system/manage-external-events/manage-external-events.resolver.ts +++ b/src/app/system/manage-external-events/manage-external-events.resolver.ts @@ -1,4 +1,4 @@ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { Router, RouterStateSnapshot, ActivatedRouteSnapshot } from '@angular/router'; import { Observable, of } from 'rxjs'; import { SystemService } from '../system.service'; @@ -7,10 +7,7 @@ import { SystemService } from '../system.service'; providedIn: 'root' }) export class ManageExternalEventsResolver { - /** - * @param {SystemService} systemService System service. - */ - constructor(private systemService: SystemService) {} + private systemService = inject(SystemService); /** * Returns the Configuration data. diff --git a/src/app/system/manage-hooks/add-event-dialog/add-event-dialog.component.html b/src/app/system/manage-hooks/add-event-dialog/add-event-dialog.component.html index bdf3864bf..0c3be6799 100644 --- a/src/app/system/manage-hooks/add-event-dialog/add-event-dialog.component.html +++ b/src/app/system/manage-hooks/add-event-dialog/add-event-dialog.component.html @@ -6,40 +6,52 @@ {{ 'labels.inputs.Select Grouping' | translate }} - - {{ grouping.name | translateKey: 'catalogs' }} - + @for (grouping of data.groupings; track grouping) { + + {{ grouping.name | translateKey: 'catalogs' }} + + } - - {{ 'labels.inputs.Grouping' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (eventForm.controls.grouping.hasError('required')) { + + {{ 'labels.inputs.Grouping' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Select Entity' | translate }} - - {{ entity.name }} - + @for (entity of entityData; track entity) { + + {{ entity.name }} + + } - - {{ 'labels.inputs.Entity' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (eventForm.controls.entity.hasError('required')) { + + {{ 'labels.inputs.Entity' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Select Action' | translate }} - - {{ action }} - + @for (action of actionData; track action) { + + {{ action }} + + } - - {{ 'labels.inputs.Action' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (eventForm.controls.action.hasError('required')) { + + {{ 'labels.inputs.Action' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + }
    diff --git a/src/app/system/manage-hooks/add-event-dialog/add-event-dialog.component.ts b/src/app/system/manage-hooks/add-event-dialog/add-event-dialog.component.ts index 134430683..9aa03364b 100644 --- a/src/app/system/manage-hooks/add-event-dialog/add-event-dialog.component.ts +++ b/src/app/system/manage-hooks/add-event-dialog/add-event-dialog.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, Inject } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { MatDialogRef, MAT_DIALOG_DATA, @@ -29,6 +29,10 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class AddEventDialogComponent implements OnInit { + dialogRef = inject>(MatDialogRef); + formBuilder = inject(UntypedFormBuilder); + data = inject(MAT_DIALOG_DATA); + /** Event Form. */ eventForm: UntypedFormGroup; /** Entity Data. */ @@ -36,17 +40,6 @@ export class AddEventDialogComponent implements OnInit { /** Action Data. */ actionData: Array = new Array(); - /** - * @param {MatDialogRef} dialogRef Component reference to dialog. - * @param {FormBuilder} formBuilder Form Builder. - * @param {any} data Provides grouping, entities and actions data to fill dropdowns. - */ - constructor( - public dialogRef: MatDialogRef, - public formBuilder: UntypedFormBuilder, - @Inject(MAT_DIALOG_DATA) public data: any - ) {} - /** * Creates add event form. */ diff --git a/src/app/system/manage-hooks/create-hook/create-hook.component.html b/src/app/system/manage-hooks/create-hook/create-hook.component.html index 7e9ffcaef..dea94ab65 100644 --- a/src/app/system/manage-hooks/create-hook/create-hook.component.html +++ b/src/app/system/manage-hooks/create-hook/create-hook.component.html @@ -6,94 +6,113 @@ {{ 'labels.inputs.Hook Template' | translate }} - - {{ hookTemplate.name | translateKey: 'text' }} - + @for (hookTemplate of hooksTemplateData.templates; track hookTemplate) { + + {{ hookTemplate.name | translateKey: 'text' }} + + } - - {{ 'labels.inputs.Hook Template' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (hookForm.controls.name.hasError('required')) { + + {{ 'labels.inputs.Hook Template' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Display Name' | translate }} - - {{ 'labels.inputs.Display Name' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (hookForm.controls.displayName.hasError('required')) { + + {{ 'labels.inputs.Display Name' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + }
    - - {{ 'labels.inputs.Content Type' | translate }} - - - {{ 'labels.inputs.json' | translate }} - - - {{ 'labels.inputs.form' | translate }} - - - - {{ 'labels.inputs.Content Type' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - + @if (hookForm.controls.name.value === 'Web') { + + {{ 'labels.inputs.Content Type' | translate }} + + + {{ 'labels.inputs.json' | translate }} + + + {{ 'labels.inputs.form' | translate }} + + + @if (hookForm.controls.contentType.hasError('required')) { + + {{ 'labels.inputs.Content Type' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + } - - {{ 'labels.inputs.Phone Number' | translate }} - - {{ input.value?.length || 0 }}/10 - - {{ 'labels.inputs.Payload URL' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - + @if (hookForm.controls.name.value === 'SMS Bridge') { + + {{ 'labels.inputs.Phone Number' | translate }} + + {{ input.value?.length || 0 }}/10 + @if (hookForm.controls.phoneNumber.hasError('required')) { + + {{ 'labels.inputs.Payload URL' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + } {{ 'labels.inputs.Payload URL' | translate }} - - {{ 'labels.inputs.Payload URL' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (hookForm.controls.payloadUrl.hasError('required')) { + + {{ 'labels.inputs.Payload URL' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + }
    -
    - - {{ 'labels.inputs.SMS Provider' | translate }} - - - {{ 'labels.inputs.SMS Provider' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - - - {{ 'labels.inputs.SMS Provider Account ID' | translate }} - - - {{ 'labels.inputs.SMS Provider Account ID' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - - - {{ 'labels.inputs.SMS Provider Token' | translate }} - - - {{ 'labels.inputs.SMS Provider Token' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - -
    + @if (hookForm.controls.name.value === 'SMS Bridge') { +
    + + {{ 'labels.inputs.SMS Provider' | translate }} + + @if (hookForm.controls.smsProvider.hasError('required')) { + + {{ 'labels.inputs.SMS Provider' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + + {{ 'labels.inputs.SMS Provider Account ID' | translate }} + + @if (hookForm.controls.smsProviderAccountId.hasError('required')) { + + {{ 'labels.inputs.SMS Provider Account ID' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + + {{ 'labels.inputs.SMS Provider Token' | translate }} + + @if (hookForm.controls.smsProviderToken.hasError('required')) { + + {{ 'labels.inputs.SMS Provider Token' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + +
    + }
    diff --git a/src/app/system/manage-hooks/create-hook/create-hook.component.ts b/src/app/system/manage-hooks/create-hook/create-hook.component.ts index 5d72a9f41..f9f0ca9de 100644 --- a/src/app/system/manage-hooks/create-hook/create-hook.component.ts +++ b/src/app/system/manage-hooks/create-hook/create-hook.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, ViewChild } from '@angular/core'; +import { Component, OnInit, ViewChild, inject } from '@angular/core'; import { UntypedFormBuilder, UntypedFormGroup, Validators, ReactiveFormsModule } from '@angular/forms'; import { MatDialog } from '@angular/material/dialog'; import { MatSort, MatSortHeader } from '@angular/material/sort'; @@ -59,6 +59,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class CreateHookComponent implements OnInit { + private route = inject(ActivatedRoute); + private systemService = inject(SystemService); + private router = inject(Router); + private formBuilder = inject(UntypedFormBuilder); + private dialog = inject(MatDialog); + private translateService = inject(TranslateService); + /** Hooks Template Data. */ hooksTemplateData: any; /** Hook Form. */ @@ -85,14 +92,7 @@ export class CreateHookComponent implements OnInit { * @param {MatDialog} dialog Dialog Reference. * @param {TranslateService} translateService Translate Service. */ - constructor( - private route: ActivatedRoute, - private systemService: SystemService, - private router: Router, - private formBuilder: UntypedFormBuilder, - private dialog: MatDialog, - private translateService: TranslateService - ) { + constructor() { this.route.data.subscribe((data: { hooksTemplate: any }) => { this.hooksTemplateData = data.hooksTemplate; }); diff --git a/src/app/system/manage-hooks/edit-hook/edit-hook.component.html b/src/app/system/manage-hooks/edit-hook/edit-hook.component.html index 83973670e..9351c6edd 100644 --- a/src/app/system/manage-hooks/edit-hook/edit-hook.component.html +++ b/src/app/system/manage-hooks/edit-hook/edit-hook.component.html @@ -6,23 +6,29 @@ {{ 'labels.inputs.Hook Template' | translate }} - - {{ hookTemplate.name | translateKey: 'text' }} - + @for (hookTemplate of hooksTemplateData.templates; track hookTemplate) { + + {{ hookTemplate.name | translateKey: 'text' }} + + } - - {{ 'labels.inputs.Hook Template' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (hookForm.controls.name.hasError('required')) { + + {{ 'labels.inputs.Hook Template' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Display Name' | translate }} - - {{ 'labels.inputs.Display Name' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (hookForm.controls.displayName.hasError('required')) { + + {{ 'labels.inputs.Display Name' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + }
    @@ -33,73 +39,86 @@
    - - {{ 'labels.inputs.Content Type' | translate }} - - - {{ 'labels.inputs.json' | translate }} - - - {{ 'labels.inputs.form' | translate }} - - - - {{ 'labels.inputs.Content Type' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - + @if (hookForm.controls.name.value === 'Web') { + + {{ 'labels.inputs.Content Type' | translate }} + + + {{ 'labels.inputs.json' | translate }} + + + {{ 'labels.inputs.form' | translate }} + + + @if (hookForm.controls.contentType.hasError('required')) { + + {{ 'labels.inputs.Content Type' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + } - - {{ 'labels.inputs.Phone Number' | translate }} - - {{ input.value?.length || 0 }}/10 - - {{ 'labels.inputs.Payload URL' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - + @if (hookForm.controls.name.value === 'SMS Bridge') { + + {{ 'labels.inputs.Phone Number' | translate }} + + {{ input.value?.length || 0 }}/10 + @if (hookForm.controls.phoneNumber.hasError('required')) { + + {{ 'labels.inputs.Payload URL' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + } {{ 'labels.inputs.Payload URL' | translate }} - - {{ 'labels.inputs.Payload URL' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (hookForm.controls.payloadUrl.hasError('required')) { + + {{ 'labels.inputs.Payload URL' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + }
    -
    - - {{ 'labels.inputs.SMS Provider' | translate }} - - - {{ 'labels.inputs.SMS Provider' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - - - {{ 'labels.inputs.SMS Provider Account ID' | translate }} - - - {{ 'labels.inputs.SMS Provider Account ID' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - - - {{ 'labels.inputs.SMS Provider Token' | translate }} - - - {{ 'labels.inputs.SMS Provider Token' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - -
    + @if (hookForm.controls.name.value === 'SMS Bridge') { +
    + + {{ 'labels.inputs.SMS Provider' | translate }} + + @if (hookForm.controls.smsProvider.hasError('required')) { + + {{ 'labels.inputs.SMS Provider' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + + {{ 'labels.inputs.SMS Provider Account ID' | translate }} + + @if (hookForm.controls.smsProviderAccountId.hasError('required')) { + + {{ 'labels.inputs.SMS Provider Account ID' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + + {{ 'labels.inputs.SMS Provider Token' | translate }} + + @if (hookForm.controls.smsProviderToken.hasError('required')) { + + {{ 'labels.inputs.SMS Provider Token' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + +
    + }
    @@ -129,9 +148,11 @@ {{ event.actionName }} -
    -

    At least one event is required. Cannot delete the last event.

    -
    + @if (cannotDeleteLastEvent) { +
    +

    At least one event is required. Cannot delete the last event.

    +
    + } {{ 'labels.inputs.Actions' | translate }} diff --git a/src/app/system/manage-hooks/edit-hook/edit-hook.component.ts b/src/app/system/manage-hooks/edit-hook/edit-hook.component.ts index e7e1b5dd2..de89eb430 100644 --- a/src/app/system/manage-hooks/edit-hook/edit-hook.component.ts +++ b/src/app/system/manage-hooks/edit-hook/edit-hook.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, ViewChild } from '@angular/core'; +import { Component, OnInit, ViewChild, inject } from '@angular/core'; import { UntypedFormBuilder, UntypedFormGroup, Validators, ReactiveFormsModule } from '@angular/forms'; import { MatDialog } from '@angular/material/dialog'; import { MatSort, MatSortHeader } from '@angular/material/sort'; @@ -67,6 +67,15 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class EditHookComponent implements OnInit { + private route = inject(ActivatedRoute); + private systemService = inject(SystemService); + private router = inject(Router); + private formBuilder = inject(UntypedFormBuilder); + private dialog = inject(MatDialog); + private translateService = inject(TranslateService); + private snackBar = inject(MatSnackBar); + private cdr = inject(ChangeDetectorRef); + @NgModule({ imports: [ MatSnackBarModule @@ -103,16 +112,7 @@ export class EditHookComponent implements OnInit { * @param {MatDialog} dialog Dialog Reference. * @param {TranslateService} translateService Translate Service. */ - constructor( - private route: ActivatedRoute, - private systemService: SystemService, - private router: Router, - private formBuilder: UntypedFormBuilder, - private dialog: MatDialog, - private translateService: TranslateService, - private snackBar: MatSnackBar, - private cdr: ChangeDetectorRef - ) { + constructor() { this.route.data.subscribe((data: { hooksTemplate: any; hook: any }) => { this.hooksTemplateData = data.hooksTemplate; this.hookData = data.hook; @@ -156,7 +156,6 @@ export class EditHookComponent implements OnInit { disabled: this.hookData.name !== 'SMS Bridge' }, Validators.required - ], smsProvider: [ { @@ -164,7 +163,6 @@ export class EditHookComponent implements OnInit { disabled: this.hookData.name !== 'SMS Bridge' }, Validators.required - ], smsProviderAccountId: [ { @@ -172,7 +170,6 @@ export class EditHookComponent implements OnInit { disabled: this.hookData.name !== 'SMS Bridge' }, Validators.required - ], smsProviderToken: [ { @@ -180,7 +177,6 @@ export class EditHookComponent implements OnInit { disabled: this.hookData.name !== 'SMS Bridge' }, Validators.required - ], contentType: [ { @@ -188,7 +184,6 @@ export class EditHookComponent implements OnInit { disabled: this.hookData.name !== 'Web' }, Validators.required - ], payloadUrl: [ this.hookData.name === 'Web' ? this.hookData.config[1].fieldValue : this.hookData.config[0].fieldValue, diff --git a/src/app/system/manage-hooks/hooks-template.resolver.ts b/src/app/system/manage-hooks/hooks-template.resolver.ts index ed42198b7..81e08dc75 100644 --- a/src/app/system/manage-hooks/hooks-template.resolver.ts +++ b/src/app/system/manage-hooks/hooks-template.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; /** rxjs Imports */ import { Observable } from 'rxjs'; @@ -12,10 +12,7 @@ import { SystemService } from '../system.service'; */ @Injectable() export class HooksTemplateResolver { - /** - * @param {SystemService} systemService System service. - */ - constructor(private systemService: SystemService) {} + private systemService = inject(SystemService); /** * Returns the hooks template data. diff --git a/src/app/system/manage-hooks/manage-hooks.component.ts b/src/app/system/manage-hooks/manage-hooks.component.ts index 903bc77d1..fb0c90735 100644 --- a/src/app/system/manage-hooks/manage-hooks.component.ts +++ b/src/app/system/manage-hooks/manage-hooks.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, ViewChild } from '@angular/core'; +import { Component, OnInit, ViewChild, inject } from '@angular/core'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort, MatSortHeader } from '@angular/material/sort'; import { @@ -47,6 +47,8 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ManageHooksComponent implements OnInit { + private route = inject(ActivatedRoute); + /** Hook data. */ hookData: any; /** Columns to be displayed in manage hooks table. */ @@ -67,7 +69,7 @@ export class ManageHooksComponent implements OnInit { * Retrieves the hooks data from `resolve`. * @param {ActivatedRoute} route Activated Route. */ - constructor(private route: ActivatedRoute) { + constructor() { this.route.data.subscribe((data: { hooks: any }) => { this.hookData = data.hooks; }); diff --git a/src/app/system/manage-hooks/manage-hooks.resolver.ts b/src/app/system/manage-hooks/manage-hooks.resolver.ts index 06fa2829a..9b1df17c3 100644 --- a/src/app/system/manage-hooks/manage-hooks.resolver.ts +++ b/src/app/system/manage-hooks/manage-hooks.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; /** rxjs Imports */ import { Observable } from 'rxjs'; @@ -12,10 +12,7 @@ import { SystemService } from '../system.service'; */ @Injectable() export class ManageHooksResolver { - /** - * @param {SystemService} systemService System service. - */ - constructor(private systemService: SystemService) {} + private systemService = inject(SystemService); /** * Returns the hooks data. diff --git a/src/app/system/manage-hooks/view-hook/hook.resolver.ts b/src/app/system/manage-hooks/view-hook/hook.resolver.ts index a8a070cd2..dab00e02b 100644 --- a/src/app/system/manage-hooks/view-hook/hook.resolver.ts +++ b/src/app/system/manage-hooks/view-hook/hook.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { SystemService } from '../../system.service'; */ @Injectable() export class HookResolver { - /** - * @param {SystemService} systemService System service. - */ - constructor(private systemService: SystemService) {} + private systemService = inject(SystemService); /** * Returns the manage hooks data. diff --git a/src/app/system/manage-hooks/view-hook/view-hook.component.html b/src/app/system/manage-hooks/view-hook/view-hook.component.html index 67f4fe9f0..81d3bcc09 100644 --- a/src/app/system/manage-hooks/view-hook/view-hook.component.html +++ b/src/app/system/manage-hooks/view-hook/view-hook.component.html @@ -41,62 +41,77 @@
    {{ 'labels.inputs.Events' | translate }}:
    - - {{ event.actionName + ' - ' + event.entityName }} - -
    -
    + @for (event of hookData.events; track event) { + + {{ event.actionName + ' - ' + event.entityName }} +
    +
    + }
    -
    - {{ 'labels.inputs.Content Type' | translate }}: -
    + @if (hookData.name === 'Web') { +
    {{ 'labels.inputs.Content Type' | translate }}:
    + } -
    - {{ hookData.config[0].fieldValue }} -
    + @if (hookData.name === 'Web') { +
    + {{ hookData.config[0].fieldValue }} +
    + }
    {{ 'labels.inputs.Payload URL' | translate }}:
    -
    - {{ hookData.config[1].fieldValue }} -
    + @if (hookData.name === 'Web') { +
    + {{ hookData.config[1].fieldValue }} +
    + } -
    - {{ hookData.config[0].fieldValue }} -
    + @if (hookData.name === 'SMS Bridge') { +
    + {{ hookData.config[0].fieldValue }} +
    + } -
    - {{ 'labels.inputs.Phone Number' | translate }}: -
    + @if (hookData.name === 'SMS Bridge') { +
    {{ 'labels.inputs.Phone Number' | translate }}:
    + } -
    - {{ hookData.config[1].fieldValue }} -
    + @if (hookData.name === 'SMS Bridge') { +
    + {{ hookData.config[1].fieldValue }} +
    + } -
    - {{ 'labels.inputs.SMS Provider' | translate }}: -
    + @if (hookData.name === 'SMS Bridge') { +
    {{ 'labels.inputs.SMS Provider' | translate }}:
    + } -
    - {{ hookData.config[2].fieldValue }} -
    + @if (hookData.name === 'SMS Bridge') { +
    + {{ hookData.config[2].fieldValue }} +
    + } -
    - {{ 'labels.inputs.SMS Provider Account ID' | translate }}: -
    + @if (hookData.name === 'SMS Bridge') { +
    {{ 'labels.inputs.SMS Provider Account ID' | translate }}:
    + } -
    - {{ hookData.config[3].fieldValue }} -
    + @if (hookData.name === 'SMS Bridge') { +
    + {{ hookData.config[3].fieldValue }} +
    + } -
    - {{ 'labels.inputs.SMS Provider Token' | translate }}: -
    + @if (hookData.name === 'SMS Bridge') { +
    {{ 'labels.inputs.SMS Provider Token' | translate }}:
    + } -
    - {{ hookData.config[4].fieldValue }} -
    + @if (hookData.name === 'SMS Bridge') { +
    + {{ hookData.config[4].fieldValue }} +
    + } diff --git a/src/app/system/manage-hooks/view-hook/view-hook.component.ts b/src/app/system/manage-hooks/view-hook/view-hook.component.ts index b8a459f1f..32f392a2e 100644 --- a/src/app/system/manage-hooks/view-hook/view-hook.component.ts +++ b/src/app/system/manage-hooks/view-hook/view-hook.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component } from '@angular/core'; +import { Component, inject } from '@angular/core'; import { MatDialog } from '@angular/material/dialog'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; @@ -27,6 +27,12 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ViewHookComponent { + private route = inject(ActivatedRoute); + private dialog = inject(MatDialog); + private systemService = inject(SystemService); + private router = inject(Router); + private translateService = inject(TranslateService); + /** Hook Data. */ hookData: any; @@ -38,13 +44,7 @@ export class ViewHookComponent { * @param {Router} router Router for navigation. * @param {TranslateService} translateService Translate Service. */ - constructor( - private route: ActivatedRoute, - private dialog: MatDialog, - private systemService: SystemService, - private router: Router, - private translateService: TranslateService - ) { + constructor() { this.route.data.subscribe((data: { hook: any }) => { this.hookData = data.hook; }); diff --git a/src/app/system/manage-jobs/cob-workflow/cob-workflow.component.html b/src/app/system/manage-jobs/cob-workflow/cob-workflow.component.html index a912a26a4..2671a8d03 100644 --- a/src/app/system/manage-jobs/cob-workflow/cob-workflow.component.html +++ b/src/app/system/manage-jobs/cob-workflow/cob-workflow.component.html @@ -6,10 +6,12 @@ }} - + @if (!isCatchUpRunning) { + + }
    diff --git a/src/app/system/manage-jobs/cob-workflow/cob-workflow.component.ts b/src/app/system/manage-jobs/cob-workflow/cob-workflow.component.ts index 28f4fd43a..44990e8a4 100644 --- a/src/app/system/manage-jobs/cob-workflow/cob-workflow.component.ts +++ b/src/app/system/manage-jobs/cob-workflow/cob-workflow.component.ts @@ -1,4 +1,4 @@ -import { Component, Input, OnDestroy, OnInit } from '@angular/core'; +import { Component, Input, OnDestroy, OnInit, inject } from '@angular/core'; import { SystemService } from 'app/system/system.service'; import { environment } from '../../../../environments/environment'; import { FaIconComponent } from '@fortawesome/angular-fontawesome'; @@ -16,6 +16,8 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class CobWorkflowComponent implements OnInit, OnDestroy { + private systemService = inject(SystemService); + /** Wait time between API status calls 30 seg */ waitTime = environment.waitTimeForCOBCatchUp || 30; /** Process running flag */ @@ -23,8 +25,6 @@ export class CobWorkflowComponent implements OnInit, OnDestroy { /** Timer to refetch COB Catch-Up status every 5 seconds */ timer: any; - constructor(private systemService: SystemService) {} - ngOnInit(): void { this.getCOBCatchUpStatus(); } diff --git a/src/app/system/manage-jobs/cob-workflow/loan-locked/loan-locked.component.html b/src/app/system/manage-jobs/cob-workflow/loan-locked/loan-locked.component.html index 1757a931e..a2303b130 100644 --- a/src/app/system/manage-jobs/cob-workflow/loan-locked/loan-locked.component.html +++ b/src/app/system/manage-jobs/cob-workflow/loan-locked/loan-locked.component.html @@ -1,100 +1,103 @@ -
    -
    - - - + @if (schedulerActive) { + + } + @if (!schedulerActive) { + + }
    @@ -52,14 +56,15 @@ - - + @if (!row.currentlyRunning) { + + + } @@ -85,27 +90,31 @@ {{ 'labels.inputs.Previous Run' | translate }} -
    - - - - {{ job.lastRunHistory.jobRunStartTime | datetimeFormat }} -
    + @if (job.lastRunHistory) { +
    + @if (job.lastRunHistory.status === 'success') { + + } + @if (!(job.lastRunHistory.status === 'success')) { + + } + @if (job.lastRunHistory) { + {{ job.lastRunHistory.jobRunStartTime | datetimeFormat }} + } +
    + }
    @@ -131,16 +140,17 @@ {{ 'labels.inputs.Error Log' | translate }} - + @if (jobWithError(job)) { + + } diff --git a/src/app/system/manage-jobs/scheduler-jobs/manage-scheduler-jobs.component.ts b/src/app/system/manage-jobs/scheduler-jobs/manage-scheduler-jobs.component.ts index c7f35200f..927f8f9fd 100644 --- a/src/app/system/manage-jobs/scheduler-jobs/manage-scheduler-jobs.component.ts +++ b/src/app/system/manage-jobs/scheduler-jobs/manage-scheduler-jobs.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, TemplateRef, ElementRef, ViewChild, AfterViewInit } from '@angular/core'; +import { Component, OnInit, TemplateRef, ElementRef, ViewChild, AfterViewInit, inject } from '@angular/core'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort, MatSortHeader } from '@angular/material/sort'; import { @@ -32,7 +32,7 @@ import { CustomParametersPopoverComponent } from './custom-parameters-popover/cu import { SchedulerJob } from './models/scheduler-job.model'; import { ErrorLogPopoverComponent } from './error-log-popover/error-log-popover.component'; import { RunSelectedJobsPopoverComponent } from './run-selected-jobs-popover/run-selected-jobs-popover.component'; -import { NgIf, NgClass } from '@angular/common'; +import { NgClass } from '@angular/common'; import { MatButton, MatIconButton } from '@angular/material/button'; import { FaIconComponent } from '@fortawesome/angular-fontawesome'; import { MatCheckbox } from '@angular/material/checkbox'; @@ -73,6 +73,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ManageSchedulerJobsComponent implements OnInit, AfterViewInit { + private route = inject(ActivatedRoute); + private systemService = inject(SystemService); + private router = inject(Router); + private dialog = inject(MatDialog); + private configurationWizardService = inject(ConfigurationWizardService); + private popoverService = inject(PopoverService); + /** Jobs data. */ jobData: any; /** Scheduler data */ @@ -118,14 +125,7 @@ export class ManageSchedulerJobsComponent implements OnInit, AfterViewInit { * @param {ConfigurationWizardService} configurationWizardService ConfigurationWizard Service. * @param {PopoverService} popoverService PopoverService. */ - constructor( - private route: ActivatedRoute, - private systemService: SystemService, - private router: Router, - private dialog: MatDialog, - private configurationWizardService: ConfigurationWizardService, - private popoverService: PopoverService - ) { + constructor() { this.route.data.subscribe((data: { jobsScheduler: any }) => { if (data.jobsScheduler) { this.jobData = data.jobsScheduler[0]; diff --git a/src/app/system/manage-jobs/scheduler-jobs/manage-scheduler-jobs.resolver.ts b/src/app/system/manage-jobs/scheduler-jobs/manage-scheduler-jobs.resolver.ts index 3c696669b..6d6b8feee 100644 --- a/src/app/system/manage-jobs/scheduler-jobs/manage-scheduler-jobs.resolver.ts +++ b/src/app/system/manage-jobs/scheduler-jobs/manage-scheduler-jobs.resolver.ts @@ -6,7 +6,7 @@ import { Resolve } from '@angular/router'; import { Observable, forkJoin } from 'rxjs'; /** Custom Services */ -import { SystemService } from '../system.service'; +import { SystemService } from '../../system.service'; /** * Manage Scheduler Jobs data resolver. @@ -16,6 +16,7 @@ export class ManageSchedulerJobsResolver implements Resolve { /** * @param {SystemService} systemService System service. */ + // eslint-disable-next-line @angular-eslint/prefer-inject constructor(private systemService: SystemService) {} /** diff --git a/src/app/system/manage-jobs/scheduler-jobs/run-selected-jobs-popover/run-selected-jobs-popover.component.html b/src/app/system/manage-jobs/scheduler-jobs/run-selected-jobs-popover/run-selected-jobs-popover.component.html index 30c4adc00..c3e143ddb 100644 --- a/src/app/system/manage-jobs/scheduler-jobs/run-selected-jobs-popover/run-selected-jobs-popover.component.html +++ b/src/app/system/manage-jobs/scheduler-jobs/run-selected-jobs-popover/run-selected-jobs-popover.component.html @@ -8,9 +8,11 @@ - - {{ message.message }} - + @for (message of messages; track message) { + + {{ message.message }} + + } + @if (!(jobHistoryData.status === 'success')) { + + } diff --git a/src/app/system/manage-jobs/scheduler-jobs/view-history-scheduler-job/view-history-scheduler-job.component.ts b/src/app/system/manage-jobs/scheduler-jobs/view-history-scheduler-job/view-history-scheduler-job.component.ts index a969bdce4..fbf7f0ce7 100644 --- a/src/app/system/manage-jobs/scheduler-jobs/view-history-scheduler-job/view-history-scheduler-job.component.ts +++ b/src/app/system/manage-jobs/scheduler-jobs/view-history-scheduler-job/view-history-scheduler-job.component.ts @@ -1,5 +1,5 @@ /** Angular Imports. */ -import { Component, OnInit, ViewChild } from '@angular/core'; +import { Component, OnInit, ViewChild, inject } from '@angular/core'; import { MatPaginator } from '@angular/material/paginator'; import { MatTableDataSource, @@ -50,6 +50,10 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ViewHistorySchedulerJobComponent implements OnInit { + private route = inject(ActivatedRoute); + private dialog = inject(MatDialog); + private router = inject(Router); + /** Job History data. */ jobHistoryData: any; /** Columns to be displayed in Scheduler Job History. */ @@ -73,11 +77,7 @@ export class ViewHistorySchedulerJobComponent implements OnInit { * Retrieves the scheduler Job History data from `resolve`. * @param {ActivatedRoute} route Activated Route. */ - constructor( - private route: ActivatedRoute, - private dialog: MatDialog, - private router: Router - ) { + constructor() { this.route.data.subscribe((data: { jobsSchedulerHistory: any }) => { this.jobHistoryData = data.jobsSchedulerHistory; }); diff --git a/src/app/system/manage-jobs/scheduler-jobs/view-history-scheduler-job/view-history-scheduler-job.resolver.ts b/src/app/system/manage-jobs/scheduler-jobs/view-history-scheduler-job/view-history-scheduler-job.resolver.ts index 29c2b17da..a34d8f458 100644 --- a/src/app/system/manage-jobs/scheduler-jobs/view-history-scheduler-job/view-history-scheduler-job.resolver.ts +++ b/src/app/system/manage-jobs/scheduler-jobs/view-history-scheduler-job/view-history-scheduler-job.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { SystemService } from '../../../system.service'; */ @Injectable() export class ViewHistorySchedulerJobsResolver { - /** - * @param {SystemService} systemService System service. - */ - constructor(private systemService: SystemService) {} + private systemService = inject(SystemService); /** * Returns the Scheduler Jobs History data. diff --git a/src/app/system/manage-jobs/scheduler-jobs/view-scheduler-job/view-scheduler-job.component.ts b/src/app/system/manage-jobs/scheduler-jobs/view-scheduler-job/view-scheduler-job.component.ts index 7c79c74c0..b55bf09de 100644 --- a/src/app/system/manage-jobs/scheduler-jobs/view-scheduler-job/view-scheduler-job.component.ts +++ b/src/app/system/manage-jobs/scheduler-jobs/view-scheduler-job/view-scheduler-job.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component } from '@angular/core'; +import { Component, inject } from '@angular/core'; import { ActivatedRoute, RouterLink } from '@angular/router'; import { FaIconComponent } from '@fortawesome/angular-fontawesome'; import { YesnoPipe } from '../../../../pipes/yesno.pipe'; @@ -19,6 +19,8 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ViewSchedulerJobComponent { + private route = inject(ActivatedRoute); + /** Job Data. */ jobData: any; @@ -26,7 +28,7 @@ export class ViewSchedulerJobComponent { * Retrieves the selected job data from `resolve`. * @param {ActivatedRoute} route Activated Route. */ - constructor(private route: ActivatedRoute) { + constructor() { this.route.data.subscribe((data: { selectedJob: any }) => { this.jobData = data.selectedJob; }); diff --git a/src/app/system/manage-jobs/scheduler-jobs/view-scheduler-job/view-scheduler-job.resolver.ts b/src/app/system/manage-jobs/scheduler-jobs/view-scheduler-job/view-scheduler-job.resolver.ts index a1e403ae3..770c62117 100644 --- a/src/app/system/manage-jobs/scheduler-jobs/view-scheduler-job/view-scheduler-job.resolver.ts +++ b/src/app/system/manage-jobs/scheduler-jobs/view-scheduler-job/view-scheduler-job.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { SystemService } from '../../../system.service'; */ @Injectable() export class ViewSchedulerJobResolver { - /** - * @param {SystemService} systemService System service. - */ - constructor(private systemService: SystemService) {} + private systemService = inject(SystemService); /** * Returns the selected scheduler job data. diff --git a/src/app/system/manage-jobs/workflow-jobs/workflow-diagram/workflow-diagram.component.html b/src/app/system/manage-jobs/workflow-jobs/workflow-diagram/workflow-diagram.component.html index 1a8e84f66..33889d181 100644 --- a/src/app/system/manage-jobs/workflow-jobs/workflow-diagram/workflow-diagram.component.html +++ b/src/app/system/manage-jobs/workflow-jobs/workflow-diagram/workflow-diagram.component.html @@ -40,13 +40,11 @@ - - - {{ link.data.linkText | translateKey: 'text' }} - + @if (link.midPoint) { + + + {{ link.data.linkText | translateKey: 'text' }} + + } diff --git a/src/app/system/manage-jobs/workflow-jobs/workflow-jobs.component.html b/src/app/system/manage-jobs/workflow-jobs/workflow-jobs.component.html index bf08a1673..d9454412d 100644 --- a/src/app/system/manage-jobs/workflow-jobs/workflow-jobs.component.html +++ b/src/app/system/manage-jobs/workflow-jobs/workflow-jobs.component.html @@ -2,71 +2,75 @@ {{ 'labels.inputs.Job Name' | translate }} - - {{ job | translateKey: 'catalogs' }} - + @for (job of jobNameOptions; track job) { + + {{ job | translateKey: 'catalogs' }} + + } -
    - -
    + @if (jobStepName) { +
    + +
    + } -
    - - - - - + @if (jobStepsData.length > 0) { +
    +
    {{ 'labels.inputs.Step Name' | translate }}{{ jobStep.stepName }}
    + + + + + + + + + + + + + + +
    {{ 'labels.inputs.Step Name' | translate }}{{ jobStep.stepName }}{{ 'labels.inputs.Order' | translate }}{{ jobStep.order }}{{ 'labels.inputs.Actions' | translate }} + +
    +
    + } - - {{ 'labels.inputs.Order' | translate }} - {{ jobStep.order }} - + @if (stepOrderHasChanged) { +
    + + +
    + } - - {{ 'labels.inputs.Actions' | translate }} - - - - - - - - - - -
    - - -
    - -
    - -
    + @if (jobStepsData.length > 0 && !stepOrderHasChanged) { +
    + +
    + } diff --git a/src/app/system/manage-jobs/workflow-jobs/workflow-jobs.component.ts b/src/app/system/manage-jobs/workflow-jobs/workflow-jobs.component.ts index c14d39be2..823e521e4 100644 --- a/src/app/system/manage-jobs/workflow-jobs/workflow-jobs.component.ts +++ b/src/app/system/manage-jobs/workflow-jobs/workflow-jobs.component.ts @@ -1,5 +1,5 @@ import { CdkDragDrop, moveItemInArray, CdkDropList, CdkDrag } from '@angular/cdk/drag-drop'; -import { Component, OnInit, ViewChild } from '@angular/core'; +import { Component, OnInit, ViewChild, inject } from '@angular/core'; import { UntypedFormControl, Validators, ReactiveFormsModule } from '@angular/forms'; import { MatDialog } from '@angular/material/dialog'; import { @@ -57,6 +57,10 @@ export interface JobStep { ] }) export class WorkflowJobsComponent implements OnInit { + private systemService = inject(SystemService); + dialog = inject(MatDialog); + private translateService = inject(TranslateService); + stepOrderHasChanged = false; jobNameOptions: any = []; @@ -76,12 +80,6 @@ export class WorkflowJobsComponent implements OnInit { 'actions' ]; - constructor( - private systemService: SystemService, - public dialog: MatDialog, - private translateService: TranslateService - ) {} - ngOnInit(): void { this.systemService .getWorkflowJobNames() @@ -171,7 +169,6 @@ export class WorkflowJobsComponent implements OnInit { options: { label: 'stepDescription', value: 'stepName', data: this.jobAvailableStepsData }, order: 1 }) - ]; const data = { title: this.translateService.instant('labels.text.Add Job Step to Workflow'), diff --git a/src/app/system/manage-jobs/workflow-jobs/workflow-jobs.resolver.ts b/src/app/system/manage-jobs/workflow-jobs/workflow-jobs.resolver.ts index fd97badec..6d8ae31ff 100644 --- a/src/app/system/manage-jobs/workflow-jobs/workflow-jobs.resolver.ts +++ b/src/app/system/manage-jobs/workflow-jobs/workflow-jobs.resolver.ts @@ -10,6 +10,7 @@ export class WorkflowJobResolver { /** * @param {SystemService} systemService System service. */ + // eslint-disable-next-line @angular-eslint/prefer-inject constructor(private systemService: SystemService) {} /** diff --git a/src/app/system/manage-reports/create-report/create-report.component.html b/src/app/system/manage-reports/create-report/create-report.component.html index 46fc4e4b2..970c757cb 100644 --- a/src/app/system/manage-reports/create-report/create-report.component.html +++ b/src/app/system/manage-reports/create-report/create-report.component.html @@ -6,46 +6,50 @@ {{ 'labels.inputs.Report Name' | translate }} - - {{ 'labels.inputs.Report Name' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (reportForm.controls.reportName.hasError('required')) { + + {{ 'labels.inputs.Report Name' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Report Type' | translate }} - - {{ allowedReportType | translateKey: 'text' }} - + @for (allowedReportType of reportTemplateData.allowedReportTypes; track allowedReportType) { + + {{ allowedReportType | translateKey: 'text' }} + + } - - {{ 'labels.inputs.Report Type' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (reportForm.controls.reportType.hasError('required')) { + + {{ 'labels.inputs.Report Type' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Report Sub Type' | translate }} - - {{ allowedReportSubType | translateKey: 'text' }} - + @for (allowedReportSubType of reportTemplateData.allowedReportSubTypes; track allowedReportSubType) { + + {{ allowedReportSubType | translateKey: 'text' }} + + } {{ 'labels.inputs.Report Category' | translate }} - - {{ reportCategoryType | translateKey: 'catalogs' }} - + @for (reportCategoryType of reportCategoryTypeOptions; track reportCategoryType) { + + {{ reportCategoryType | translateKey: 'catalogs' }} + + } @@ -69,10 +73,12 @@ cdkTextareaAutosize cdkAutosizeMinRows="6" > - - {{ 'labels.inputs.SQL' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (reportForm.controls.reportSql.hasError('required')) { + + {{ 'labels.inputs.SQL' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } diff --git a/src/app/system/manage-reports/create-report/create-report.component.ts b/src/app/system/manage-reports/create-report/create-report.component.ts index 9ec6794fc..4dd1f7bd9 100644 --- a/src/app/system/manage-reports/create-report/create-report.component.ts +++ b/src/app/system/manage-reports/create-report/create-report.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, ViewChild } from '@angular/core'; +import { Component, OnInit, ViewChild, inject } from '@angular/core'; import { UntypedFormBuilder, UntypedFormGroup, Validators, ReactiveFormsModule } from '@angular/forms'; import { MatDialog } from '@angular/material/dialog'; import { MatPaginator } from '@angular/material/paginator'; @@ -61,6 +61,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class CreateReportComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private systemService = inject(SystemService); + private route = inject(ActivatedRoute); + private router = inject(Router); + private dialog = inject(MatDialog); + private translateServices = inject(TranslateService); + /** Report Form. */ reportForm: UntypedFormGroup; /** Report Template Data. */ @@ -103,14 +110,7 @@ export class CreateReportComponent implements OnInit { * @param {MatDialog} dialog Dialog Reference. * @param {TranslateService} translateService Translate Service. */ - constructor( - private formBuilder: UntypedFormBuilder, - private systemService: SystemService, - private route: ActivatedRoute, - private router: Router, - private dialog: MatDialog, - private translateServices: TranslateService - ) { + constructor() { this.route.data.subscribe((data: { reportTemplate: any }) => { this.reportTemplateData = data.reportTemplate; this.dataForDialog.allowedParameters = this.reportTemplateData.allowedParameters; diff --git a/src/app/system/manage-reports/edit-report/edit-report.component.html b/src/app/system/manage-reports/edit-report/edit-report.component.html index 40dac37aa..49168cf51 100644 --- a/src/app/system/manage-reports/edit-report/edit-report.component.html +++ b/src/app/system/manage-reports/edit-report/edit-report.component.html @@ -6,43 +6,50 @@ {{ 'labels.inputs.Report Name' | translate }} - - {{ 'labels.inputs.Report Name' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (reportForm.controls.reportName.hasError('required')) { + + {{ 'labels.inputs.Report Name' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Report Type' | translate }} - - {{ allowedReportType | translateKey: 'text' }} - + @for (allowedReportType of reportData.allowedReportTypes; track allowedReportType) { + + {{ allowedReportType | translateKey: 'text' }} + + } - - {{ 'labels.inputs.Report Type' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (reportForm.controls.reportType.hasError('required')) { + + {{ 'labels.inputs.Report Type' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Report Sub Type' | translate }} - - {{ allowedReportSubType | translateKey: 'text' }} - + @for (allowedReportSubType of reportData.allowedReportSubTypes; track allowedReportSubType) { + + {{ allowedReportSubType | translateKey: 'text' }} + + } {{ 'labels.inputs.Report Category' | translate }} - - {{ reportCategoryType | translateKey: 'catalogs' }} - + @for (reportCategoryType of reportCategoryTypeOptions; track reportCategoryType) { + + {{ reportCategoryType | translateKey: 'catalogs' }} + + } @@ -66,10 +73,12 @@ cdkTextareaAutosize cdkAutosizeMinRows="6" > - - {{ 'labels.inputs.SQL' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (reportForm.controls.reportSql.hasError('required')) { + + {{ 'labels.inputs.SQL' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } @@ -78,17 +87,12 @@

    {{ 'labels.inputs.Report Parameters' | translate }}

    - + @if (!reportData.coreReport) { + + }
    @@ -107,26 +111,28 @@ diff --git a/src/app/system/manage-reports/edit-report/edit-report.component.ts b/src/app/system/manage-reports/edit-report/edit-report.component.ts index ceb2b42d2..7f0e9d9b3 100644 --- a/src/app/system/manage-reports/edit-report/edit-report.component.ts +++ b/src/app/system/manage-reports/edit-report/edit-report.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, ViewChild } from '@angular/core'; +import { Component, OnInit, ViewChild, inject } from '@angular/core'; import { UntypedFormBuilder, UntypedFormGroup, Validators, ReactiveFormsModule } from '@angular/forms'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; import { MatDialog } from '@angular/material/dialog'; @@ -60,6 +60,12 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class EditReportComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private route = inject(ActivatedRoute); + private router = inject(Router); + private systemService = inject(SystemService); + private dialog = inject(MatDialog); + /** Report Data. */ reportData: any; /** Report Template Data. */ @@ -106,13 +112,7 @@ export class EditReportComponent implements OnInit { * @param {Router} router Router for navigation. * @param {MatDialog} dialog Dialog Reference. */ - constructor( - private formBuilder: UntypedFormBuilder, - private route: ActivatedRoute, - private router: Router, - private systemService: SystemService, - private dialog: MatDialog - ) { + constructor() { this.route.data.subscribe((data: { report: any; reportTemplate: any }) => { this.reportData = data.report; this.reportParametersData = data.report.reportParameters ? data.report.reportParameters : []; @@ -177,7 +177,6 @@ export class EditReportComponent implements OnInit { disabled: this.reportData.coreReport || this.reportData.reportType === 'Pentaho' }, Validators.required - ] }); } diff --git a/src/app/system/manage-reports/manage-reports.component.html b/src/app/system/manage-reports/manage-reports.component.html index 4276d79af..6944eb3a4 100644 --- a/src/app/system/manage-reports/manage-reports.component.html +++ b/src/app/system/manage-reports/manage-reports.component.html @@ -40,44 +40,48 @@ diff --git a/src/app/system/manage-reports/manage-reports.component.ts b/src/app/system/manage-reports/manage-reports.component.ts index 6b92d9511..f1335a4f8 100644 --- a/src/app/system/manage-reports/manage-reports.component.ts +++ b/src/app/system/manage-reports/manage-reports.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, TemplateRef, ElementRef, ViewChild, AfterViewInit } from '@angular/core'; +import { Component, OnInit, TemplateRef, ElementRef, ViewChild, AfterViewInit, inject } from '@angular/core'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort, MatSortHeader } from '@angular/material/sort'; import { @@ -55,6 +55,12 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ManageReportsComponent implements OnInit, AfterViewInit { + private route = inject(ActivatedRoute); + private router = inject(Router); + private configurationWizardService = inject(ConfigurationWizardService); + private popoverService = inject(PopoverService); + private dialog = inject(MatDialog); + /** Reports Data. */ reportsData: any; /** Columns to be displayed in reports table. */ @@ -87,13 +93,7 @@ export class ManageReportsComponent implements OnInit, AfterViewInit { * @param {PopoverService} popoverService PopoverService. * @param {Matdialog} matdialog Matdialog. */ - constructor( - private route: ActivatedRoute, - private router: Router, - private configurationWizardService: ConfigurationWizardService, - private popoverService: PopoverService, - private dialog: MatDialog - ) { + constructor() { this.route.data.subscribe((data: { reports: any }) => { this.reportsData = data.reports; }); diff --git a/src/app/system/manage-reports/report-parameter-dialog/report-parameter-dialog.component.html b/src/app/system/manage-reports/report-parameter-dialog/report-parameter-dialog.component.html index 53565c01d..33fbbff20 100644 --- a/src/app/system/manage-reports/report-parameter-dialog/report-parameter-dialog.component.html +++ b/src/app/system/manage-reports/report-parameter-dialog/report-parameter-dialog.component.html @@ -9,14 +9,18 @@ {{ 'labels.inputs.Select allowed parameter' | translate }} - - {{ allowedParameter.parameterName }} - + @for (allowedParameter of data.allowedParameters; track allowedParameter) { + + {{ allowedParameter.parameterName }} + + } - - {{ 'labels.inputs.Report Parameters' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (reportParameterForm.controls.parameterName.hasError('required')) { + + {{ 'labels.inputs.Report Parameters' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } diff --git a/src/app/system/manage-reports/report-parameter-dialog/report-parameter-dialog.component.ts b/src/app/system/manage-reports/report-parameter-dialog/report-parameter-dialog.component.ts index 84a0a8658..6ba946c9d 100644 --- a/src/app/system/manage-reports/report-parameter-dialog/report-parameter-dialog.component.ts +++ b/src/app/system/manage-reports/report-parameter-dialog/report-parameter-dialog.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, Inject } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { MAT_DIALOG_DATA, MatDialogRef, @@ -29,20 +29,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ReportParameterDialogComponent implements OnInit { + dialogRef = inject>(MatDialogRef); + formBuilder = inject(UntypedFormBuilder); + data = inject(MAT_DIALOG_DATA); + /** Report Parameter Form. */ reportParameterForm: UntypedFormGroup; - /** - * @param {MatDialogRef} dialogRef Component reference to dialog. - * @param {FormBuilder} formBuilder Form Builder. - * @param {any} data Provides the allowed parameters and values for the form (if available). - */ - constructor( - public dialogRef: MatDialogRef, - public formBuilder: UntypedFormBuilder, - @Inject(MAT_DIALOG_DATA) public data: any - ) {} - /** * Creates the add report parameter form. */ diff --git a/src/app/system/manage-reports/report-template.resolver.ts b/src/app/system/manage-reports/report-template.resolver.ts index ef6eb4744..2a5793a49 100644 --- a/src/app/system/manage-reports/report-template.resolver.ts +++ b/src/app/system/manage-reports/report-template.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; /** rxjs Imports */ import { Observable } from 'rxjs'; @@ -12,10 +12,7 @@ import { SystemService } from '../system.service'; */ @Injectable() export class ReportTemplateResolver { - /** - * @param {SystemService} systemService System service. - */ - constructor(private systemService: SystemService) {} + private systemService = inject(SystemService); /** * Returns the Report Template data. diff --git a/src/app/system/manage-reports/report.resolver.ts b/src/app/system/manage-reports/report.resolver.ts index c3f8cb229..6b8f60b34 100644 --- a/src/app/system/manage-reports/report.resolver.ts +++ b/src/app/system/manage-reports/report.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { SystemService } from '../system.service'; */ @Injectable() export class ReportResolver { - /** - * @param {SystemService} systemService System service. - */ - constructor(private systemService: SystemService) {} + private systemService = inject(SystemService); /** * Returns the Report data. diff --git a/src/app/system/manage-reports/reports.resolver.ts b/src/app/system/manage-reports/reports.resolver.ts index 03cd427b8..fc0960753 100644 --- a/src/app/system/manage-reports/reports.resolver.ts +++ b/src/app/system/manage-reports/reports.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; /** rxjs Imports */ import { Observable } from 'rxjs'; @@ -12,10 +12,7 @@ import { SystemService } from '../system.service'; */ @Injectable() export class ReportsResolver { - /** - * @param {SystemService} systemService System service. - */ - constructor(private systemService: SystemService) {} + private systemService = inject(SystemService); /** * Returns the Reports data. diff --git a/src/app/system/manage-reports/view-report/view-report.component.html b/src/app/system/manage-reports/view-report/view-report.component.html index 0ea090b11..840314341 100644 --- a/src/app/system/manage-reports/view-report/view-report.component.html +++ b/src/app/system/manage-reports/view-report/view-report.component.html @@ -4,12 +4,14 @@ {{ 'labels.buttons.Edit' | translate }} - - - + @if (!reportData.coreReport) { + + + + }
    @@ -28,13 +30,15 @@ {{ reportData.reportType | translateKey: 'text' }}
    -
    - {{ 'labels.inputs.Report Sub Type' | translate }}: -
    + @if (reportData.reportSubType) { +
    {{ 'labels.inputs.Report Sub Type' | translate }}:
    + } -
    - {{ reportData.reportSubType | translateKey: 'text' }} -
    + @if (reportData.reportSubType) { +
    + {{ reportData.reportSubType | translateKey: 'text' }} +
    + }
    {{ 'labels.inputs.Report Category' | translate }}:
    diff --git a/src/app/system/manage-reports/view-report/view-report.component.ts b/src/app/system/manage-reports/view-report/view-report.component.ts index f6d1b1f98..de559a157 100644 --- a/src/app/system/manage-reports/view-report/view-report.component.ts +++ b/src/app/system/manage-reports/view-report/view-report.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component } from '@angular/core'; +import { Component, inject } from '@angular/core'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; import { MatDialog } from '@angular/material/dialog'; @@ -28,6 +28,11 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ViewReportComponent { + private route = inject(ActivatedRoute); + private systemService = inject(SystemService); + private dialog = inject(MatDialog); + private router = inject(Router); + /** Report Data. */ reportData: any; @@ -38,12 +43,7 @@ export class ViewReportComponent { * @param {MatDialog} dialog Dialog Reference. * @param {Router} router Router for navigation. */ - constructor( - private route: ActivatedRoute, - private systemService: SystemService, - private dialog: MatDialog, - private router: Router - ) { + constructor() { this.route.data.subscribe((data: { report: any }) => { this.reportData = data.report; }); diff --git a/src/app/system/manage-surveys/create-survey/create-survey.component.html b/src/app/system/manage-surveys/create-survey/create-survey.component.html index 8fec713b9..96e8bf1cb 100644 --- a/src/app/system/manage-surveys/create-survey/create-survey.component.html +++ b/src/app/system/manage-surveys/create-survey/create-survey.component.html @@ -7,32 +7,40 @@ {{ 'labels.inputs.Key' | translate }} - - {{ 'labels.inputs.Key' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (surveyForm.controls.key.hasError('required')) { + + {{ 'labels.inputs.Key' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Name' | translate }} - - {{ 'labels.inputs.Name' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (surveyForm.controls.name.hasError('required')) { + + {{ 'labels.inputs.Name' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Country Code' | translate }} - - {{ 'labels.inputs.Country Code' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - {{ 'labels.inputs.Country Code' | translate }} - {{ 'labels.commons.must consist of 2 alphabetic characters' | translate }} - + @if (surveyForm.controls.countryCode.hasError('required')) { + + {{ 'labels.inputs.Country Code' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + @if (surveyForm.controls.countryCode.hasError('pattern')) { + + {{ 'labels.inputs.Country Code' | translate }} + {{ 'labels.commons.must consist of 2 alphabetic characters' | translate }} + + } @@ -40,159 +48,170 @@ -
    - - -
    + @if (!questionDatas.length) { +
    + + +
    + }
    - - -
    -
    -

    {{ 'labels.heading.Question' | translate }} {{ questionIndex + 1 }}

    - -
    - - - {{ 'labels.inputs.Key' | translate }} - - - {{ 'labels.inputs.Key' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - - - {{ 'labels.inputs.Text' | translate }} - - - {{ 'labels.inputs.Text' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - - - {{ 'labels.inputs.Description' | translate }} - - - - - -
    -

    {{ 'labels.heading.Options' | translate }}

    - -
    - -
    + @for (question of questionDatas.controls; track question; let questionIndex = $index; let isLast = $last) { + + +
    +
    +

    {{ 'labels.heading.Question' | translate }} {{ questionIndex + 1 }}

    + +
    + + {{ 'labels.inputs.Key' | translate }} + + @if (question.controls.key.hasError('required')) { + + {{ 'labels.inputs.Key' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + + {{ 'labels.inputs.Text' | translate }} + + @if (question.controls.text.hasError('required')) { + + {{ 'labels.inputs.Text' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + + {{ 'labels.inputs.Description' | translate }} + + + +
    +

    {{ 'labels.heading.Options' | translate }}

    + +
    -
    - - {{ 'labels.inputs.Text' | translate }} - - - {{ 'labels.inputs.Text' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - - - {{ 'labels.inputs.Value' | translate }} - - - {{ 'labels.inputs.Value' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - {{ 'labels.inputs.Value' | translate }} - {{ 'labels.commons.must be an integer between -9999 and 9999' | translate }} - - - -
    -
    - + @for ( + response of getResponseDatas(questionIndex).controls; + track response; + let responseIndex = $index + ) { +
    +
    + + {{ 'labels.inputs.Text' | translate }} + + @if (response.controls.text.hasError('required')) { + + {{ 'labels.inputs.Text' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + + {{ 'labels.inputs.Value' | translate }} + + @if (response.controls.value.hasError('required')) { + + {{ 'labels.inputs.Value' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + @if (response.controls.value.hasError('pattern')) { + + {{ 'labels.inputs.Value' | translate }} + {{ + 'labels.commons.must be an integer between -9999 and 9999' | translate + }} + + } + +
    +
    + +
    +
    -
    + }
    + +
    + @if (isLast) { + + + + + + }
    - - -
    - - - - - -
    - + + }
    diff --git a/src/app/system/manage-surveys/create-survey/create-survey.component.ts b/src/app/system/manage-surveys/create-survey/create-survey.component.ts index 30b6a1f6d..d5867a238 100644 --- a/src/app/system/manage-surveys/create-survey/create-survey.component.ts +++ b/src/app/system/manage-surveys/create-survey/create-survey.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, @@ -42,24 +42,15 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class CreateSurveyComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private systemService = inject(SystemService); + private route = inject(ActivatedRoute); + private router = inject(Router); + dialog = inject(MatDialog); + /** Survey form. */ surveyForm: UntypedFormGroup; - /** - * @param {FormBuilder} formBuilder Form Builder. - * @param {SystemService} systemService System Service. - * @param {ActivatedRoute} route Activated Route. - * @param {Router} router Router for navigation. - * @param {MatDialog} dialog Dialog reference. - */ - constructor( - private formBuilder: UntypedFormBuilder, - private systemService: SystemService, - private route: ActivatedRoute, - private router: Router, - public dialog: MatDialog - ) {} - /** * Creates the survey form. */ @@ -84,7 +75,8 @@ export class CreateSurveyComponent implements OnInit { '', [ Validators.required, - Validators.pattern('^\\s*([A-Za-z]{2})?\\s*$')] + Validators.pattern('^\\s*([A-Za-z]{2})?\\s*$') + ] ], description: [''], questionDatas: this.formBuilder.array([]) @@ -163,7 +155,8 @@ export class CreateSurveyComponent implements OnInit { '', [ Validators.required, - Validators.pattern('^\\s*[-]?\\d{0,4}\\s*$')] + Validators.pattern('^\\s*[-]?\\d{0,4}\\s*$') + ] ], sequenceNo: [''] }); diff --git a/src/app/system/manage-surveys/edit-survey/edit-survey.component.html b/src/app/system/manage-surveys/edit-survey/edit-survey.component.html index 9dc21b0a3..bfccd4503 100644 --- a/src/app/system/manage-surveys/edit-survey/edit-survey.component.html +++ b/src/app/system/manage-surveys/edit-survey/edit-survey.component.html @@ -7,32 +7,40 @@ {{ 'labels.inputs.Key' | translate }} - - {{ 'labels.inputs.Key' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (surveyForm.controls.key.hasError('required')) { + + {{ 'labels.inputs.Key' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Name' | translate }} - - {{ 'labels.inputs.Name' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (surveyForm.controls.name.hasError('required')) { + + {{ 'labels.inputs.Name' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Country Code' | translate }} - - {{ 'labels.inputs.Country Code' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - {{ 'labels.inputs.Country Code' | translate }} - {{ 'labels.commons.must consist of 2 alphabetic characters' | translate }} - + @if (surveyForm.controls.countryCode.hasError('required')) { + + {{ 'labels.inputs.Country Code' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + @if (surveyForm.controls.countryCode.hasError('pattern')) { + + {{ 'labels.inputs.Country Code' | translate }} + {{ 'labels.commons.must consist of 2 alphabetic characters' | translate }} + + } @@ -44,131 +52,143 @@
    - - -
    -
    -

    {{ 'labels.heading.Question' | translate }} {{ questionIndex + 1 }}

    - -
    - - - {{ 'labels.inputs.Key' | translate }} - - - {{ 'labels.inputs.Key' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - - - {{ 'labels.inputs.Text' | translate }} - - - {{ 'labels.inputs.Text' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - - - {{ 'labels.inputs.Description' | translate }} - - - - - -
    -

    {{ 'labels.heading.Options' | translate }}

    - -
    - -
    + @for (question of questionDatas.controls; track question; let questionIndex = $index; let isLast = $last) { + + +
    +
    +

    {{ 'labels.heading.Question' | translate }} {{ questionIndex + 1 }}

    + +
    + + {{ 'labels.inputs.Key' | translate }} + + @if (question.get('key').hasError('required')) { + + {{ 'labels.inputs.Key' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + + {{ 'labels.inputs.Text' | translate }} + + @if (question.get('text').hasError('required')) { + + {{ 'labels.inputs.Text' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + + {{ 'labels.inputs.Description' | translate }} + + + +
    +

    {{ 'labels.heading.Options' | translate }}

    + +
    -
    - - {{ 'labels.inputs.Text' | translate }} - - - {{ 'labels.inputs.Text' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - - - {{ 'labels.inputs.Value' | translate }} - - - {{ 'labels.inputs.Value' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - - - {{ 'labels.inputs.Value' | translate - }}{{ 'labels.commons.must be an integer between -9999 and 9999' | translate }} - - - -
    -
    - + @for ( + response of getResponseDatas(questionIndex).controls; + track response; + let responseIndex = $index + ) { +
    +
    + + {{ 'labels.inputs.Text' | translate }} + + @if (response.get('text').hasError('required')) { + + {{ 'labels.inputs.Text' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + + + {{ 'labels.inputs.Value' | translate }} + + @if (response.get('value').hasError('required')) { + + {{ 'labels.inputs.Value' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } + @if (response.get('value').hasError('pattern')) { + + {{ 'labels.inputs.Value' | translate + }}{{ + 'labels.commons.must be an integer between -9999 and 9999' | translate + }} + + } + +
    +
    + +
    +
    -
    + }
    + +
    + @if (isLast) { + + + + + + }
    - - -
    - - - - - -
    - + + }
    diff --git a/src/app/system/manage-surveys/edit-survey/edit-survey.component.ts b/src/app/system/manage-surveys/edit-survey/edit-survey.component.ts index 4b60874c5..2a31e719a 100644 --- a/src/app/system/manage-surveys/edit-survey/edit-survey.component.ts +++ b/src/app/system/manage-surveys/edit-survey/edit-survey.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component } from '@angular/core'; +import { Component, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, @@ -46,6 +46,12 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class EditSurveyComponent { + private formBuilder = inject(UntypedFormBuilder); + private systemService = inject(SystemService); + private route = inject(ActivatedRoute); + private router = inject(Router); + dialog = inject(MatDialog); + /** Survey form. */ surveyForm: UntypedFormGroup; @@ -56,13 +62,7 @@ export class EditSurveyComponent { * @param {Router} router Router for navigation. * @param {MatDialog} dialog Dialog reference. */ - constructor( - private formBuilder: UntypedFormBuilder, - private systemService: SystemService, - private route: ActivatedRoute, - private router: Router, - public dialog: MatDialog - ) { + constructor() { this.createSurveyForm(); this.route.data.subscribe((data: { survey: any }) => { this.prepareSurveyForm(data.survey); @@ -128,7 +128,8 @@ export class EditSurveyComponent { '', [ Validators.required, - Validators.pattern('^\\s*([A-Za-z]{2})?\\s*$')] + Validators.pattern('^\\s*([A-Za-z]{2})?\\s*$') + ] ], description: [''], questionDatas: this.formBuilder.array([]) @@ -207,7 +208,8 @@ export class EditSurveyComponent { '', [ Validators.required, - Validators.pattern('^\\s*[-]?\\d{0,4}\\s*$')] + Validators.pattern('^\\s*[-]?\\d{0,4}\\s*$') + ] ], sequenceNo: [''] }); diff --git a/src/app/system/manage-surveys/manage-surveys.component.html b/src/app/system/manage-surveys/manage-surveys.component.html index 88248bbd6..fd8ff11fe 100644 --- a/src/app/system/manage-surveys/manage-surveys.component.html +++ b/src/app/system/manage-surveys/manage-surveys.component.html @@ -56,22 +56,16 @@
    diff --git a/src/app/system/manage-surveys/manage-surveys.component.ts b/src/app/system/manage-surveys/manage-surveys.component.ts index 7da6be00e..c108126de 100644 --- a/src/app/system/manage-surveys/manage-surveys.component.ts +++ b/src/app/system/manage-surveys/manage-surveys.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, ViewChild } from '@angular/core'; +import { Component, OnInit, ViewChild, inject } from '@angular/core'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort, MatSortHeader } from '@angular/material/sort'; import { @@ -50,6 +50,9 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ManageSurveysComponent implements OnInit { + private route = inject(ActivatedRoute); + private systemService = inject(SystemService); + /* Surveys data */ surveysData: any; /* Columns to be displayed in manage surveys data table */ @@ -73,10 +76,7 @@ export class ManageSurveysComponent implements OnInit { * Retrieves the surveys data from `resolve`. * @param {ActivatedRoute} route Activated Route. */ - constructor( - private route: ActivatedRoute, - private systemService: SystemService - ) { + constructor() { this.route.data.subscribe((data: { surveys: any }) => { this.surveysData = data.surveys; }); diff --git a/src/app/system/manage-surveys/manage-surveys.resolver.ts b/src/app/system/manage-surveys/manage-surveys.resolver.ts index 4ca08b814..147ef6117 100644 --- a/src/app/system/manage-surveys/manage-surveys.resolver.ts +++ b/src/app/system/manage-surveys/manage-surveys.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; /** rxjs Imports */ import { Observable } from 'rxjs'; @@ -12,10 +12,7 @@ import { SystemService } from '../system.service'; */ @Injectable() export class ManageSurveysResolver { - /** - * @param {SystemService} systemService System service. - */ - constructor(private systemService: SystemService) {} + private systemService = inject(SystemService); /** * Returns the Surveys data. diff --git a/src/app/system/manage-surveys/survey.resolver.ts b/src/app/system/manage-surveys/survey.resolver.ts index 4cf3733ce..0310336dc 100644 --- a/src/app/system/manage-surveys/survey.resolver.ts +++ b/src/app/system/manage-surveys/survey.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { SystemService } from '../system.service'; */ @Injectable() export class SurveyResolver { - /** - * @param {SystemService} systemService System service. - */ - constructor(private systemService: SystemService) {} + private systemService = inject(SystemService); /** * Returns the Survey data. diff --git a/src/app/system/manage-surveys/view-survey/view-survey.component.html b/src/app/system/manage-surveys/view-survey/view-survey.component.html index 13b2cdf40..a5c968398 100644 --- a/src/app/system/manage-surveys/view-survey/view-survey.component.html +++ b/src/app/system/manage-surveys/view-survey/view-survey.component.html @@ -56,53 +56,58 @@ -
    - - -
    {{ 'labels.heading.Question' | translate }}: {{ i + 1 }}
    -
    -
    - {{ 'labels.inputs.Key' | translate }}: + @for (questionData of surveyData.questionDatas; track questionData; let i = $index) { +
    + + +
    {{ 'labels.heading.Question' | translate }}: {{ i + 1 }}
    +
    +
    + {{ 'labels.inputs.Key' | translate }}: +
    +
    + {{ questionData.key }} +
    +
    + {{ 'labels.inputs.Text' | translate }}: +
    +
    + {{ questionData.text }} +
    - -
    - {{ questionData.key }} +
    +
    + {{ 'labels.inputs.Description' | translate }}: +
    +
    + {{ questionData.description }} +
    -
    - {{ 'labels.inputs.Text' | translate }}: +
    +
    + {{ 'labels.inputs.Option' | translate }}: +
    +
    {{ 'labels.inputs.Actions' | translate }} - - + @if (!reportData.coreReport) { + + } + @if (!reportData.coreReport) { + + } {{ 'labels.inputs.Core Report' | translate }} - - + @if (report.coreReport) { + + } + @if (!report.coreReport) { + + } {{ 'labels.inputs.User Report' | translate }} - - + @if (report.useReport) { + + } + @if (!report.useReport) { + + } {{ 'labels.inputs.Action' | translate }} - - + @if (!isActive(survey.validFrom, survey.validTo)) { + + } + @if (isActive(survey.validFrom, survey.validTo)) { + + }
    + + @for (column of displayedColumns; track column) { + + } + + @for (row of questionData.responseDatas; track row) { + + @for (column of displayedColumns; track column) { + + } + + } +
    {{ column | titlecase }}
    + {{ row[column] }} +
    - -
    - {{ questionData.text }} -
    - -
    -
    - {{ 'labels.inputs.Description' | translate }}: -
    - -
    - {{ questionData.description }} -
    -
    -
    -
    - {{ 'labels.inputs.Option' | translate }}: -
    - - - - - - - -
    {{ column | titlecase }}
    - {{ row[column] }} -
    -
    - - - + + + + } diff --git a/src/app/system/manage-surveys/view-survey/view-survey.component.ts b/src/app/system/manage-surveys/view-survey/view-survey.component.ts index 0c744ff48..7a58f0874 100644 --- a/src/app/system/manage-surveys/view-survey/view-survey.component.ts +++ b/src/app/system/manage-surveys/view-survey/view-survey.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component } from '@angular/core'; +import { Component, inject } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; import { MatDialog } from '@angular/material/dialog'; @@ -8,7 +8,7 @@ import { SystemService } from 'app/system/system.service'; import { FaIconComponent } from '@fortawesome/angular-fontawesome'; import { MatCard, MatCardHeader, MatCardTitle, MatCardContent } from '@angular/material/card'; import { MatDivider } from '@angular/material/divider'; -import { NgFor, TitleCasePipe } from '@angular/common'; +import { TitleCasePipe } from '@angular/common'; import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; /** @@ -28,6 +28,11 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class ViewSurveyComponent { + private route = inject(ActivatedRoute); + private systemService = inject(SystemService); + private dialog = inject(MatDialog); + private router = inject(Router); + /** Survey Data */ surveyData: any; @@ -44,12 +49,7 @@ export class ViewSurveyComponent { * @param {MatDialog} dialog Dialog Reference. * @param {Router} router Router for navigation. */ - constructor( - private route: ActivatedRoute, - private systemService: SystemService, - private dialog: MatDialog, - private router: Router - ) { + constructor() { this.route.data.subscribe((data: { survey: any }) => { this.surveyData = data.survey; }); diff --git a/src/app/system/roles-and-permissions/add-role/add-role.component.html b/src/app/system/roles-and-permissions/add-role/add-role.component.html index 0a24fd21b..ca7978e58 100644 --- a/src/app/system/roles-and-permissions/add-role/add-role.component.html +++ b/src/app/system/roles-and-permissions/add-role/add-role.component.html @@ -6,19 +6,23 @@ {{ 'labels.inputs.Name' | translate }} - - {{ 'labels.inputs.Role Name' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (roleForm.controls.name.hasError('required')) { + + {{ 'labels.inputs.Role Name' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } {{ 'labels.inputs.Description' | translate }} - - {{ 'labels.inputs.Role Description' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (roleForm.controls.description.hasError('required')) { + + {{ 'labels.inputs.Role Description' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } diff --git a/src/app/system/roles-and-permissions/add-role/add-role.component.ts b/src/app/system/roles-and-permissions/add-role/add-role.component.ts index c29c055f0..6e2156d2c 100644 --- a/src/app/system/roles-and-permissions/add-role/add-role.component.ts +++ b/src/app/system/roles-and-permissions/add-role/add-role.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormBuilder, UntypedFormGroup, Validators, ReactiveFormsModule } from '@angular/forms'; import { Router, ActivatedRoute, RouterLink } from '@angular/router'; @@ -23,23 +23,14 @@ import { AuthService } from 'app/zitadel/auth.service'; ] }) export class AddRoleComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private systemService = inject(SystemService); + private route = inject(ActivatedRoute); + private router = inject(Router); + private authService = inject(AuthService); + /** Role form. */ roleForm: UntypedFormGroup; - /** Add role zitadel */ - - /** - * @param {FormBuilder} formBuilder Form Builder. - * @param {SystemService} systemService System Service. - * @param {ActivatedRoute} route Activated Route. - * @param {Router} router Router for navigation. - */ - constructor( - private formBuilder: UntypedFormBuilder, - private systemService: SystemService, - private route: ActivatedRoute, - private router: Router, - private authService: AuthService - ) {} /** * Creates the role form. diff --git a/src/app/system/roles-and-permissions/edit-role/edit-role.component.html b/src/app/system/roles-and-permissions/edit-role/edit-role.component.html index 0be390e26..06c57bfa4 100644 --- a/src/app/system/roles-and-permissions/edit-role/edit-role.component.html +++ b/src/app/system/roles-and-permissions/edit-role/edit-role.component.html @@ -11,10 +11,12 @@ {{ 'labels.inputs.Role Description' | translate }} - - {{ 'labels.inputs.Description' | translate }} {{ 'labels.commons.is' | translate }} - {{ 'labels.commons.required' | translate }} - + @if (roleForm.controls.description.hasError('required')) { + + {{ 'labels.inputs.Description' | translate }} {{ 'labels.commons.is' | translate }} + {{ 'labels.commons.required' | translate }} + + } diff --git a/src/app/system/roles-and-permissions/edit-role/edit-role.component.ts b/src/app/system/roles-and-permissions/edit-role/edit-role.component.ts index 609dccf84..c88994555 100644 --- a/src/app/system/roles-and-permissions/edit-role/edit-role.component.ts +++ b/src/app/system/roles-and-permissions/edit-role/edit-role.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, Validators, ReactiveFormsModule } from '@angular/forms'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; @@ -23,6 +23,12 @@ import { AuthService } from 'app/zitadel/auth.service'; ] }) export class EditRoleComponent implements OnInit { + private formBuilder = inject(UntypedFormBuilder); + private systemService = inject(SystemService); + private route = inject(ActivatedRoute); + private router = inject(Router); + private authService = inject(AuthService); + /** Role Form */ roleForm: UntypedFormGroup; /** Role Data */ @@ -35,13 +41,7 @@ export class EditRoleComponent implements OnInit { * @param {ActivatedRoute} route Activated Route. * @param {Router} router Router for navigation. */ - constructor( - private formBuilder: UntypedFormBuilder, - private systemService: SystemService, - private route: ActivatedRoute, - private router: Router, - private authService: AuthService - ) { + constructor() { this.route.data.subscribe((data: { role: any }) => { this.roleData = data.role; }); diff --git a/src/app/system/roles-and-permissions/roles-and-permissions.component.html b/src/app/system/roles-and-permissions/roles-and-permissions.component.html index 29095166e..b3f90870c 100644 --- a/src/app/system/roles-and-permissions/roles-and-permissions.component.html +++ b/src/app/system/roles-and-permissions/roles-and-permissions.component.html @@ -46,15 +46,11 @@ {{ 'labels.inputs.Actions' | translate }} - + @if (role.name !== 'Super user') { + + } diff --git a/src/app/system/roles-and-permissions/roles-and-permissions.component.ts b/src/app/system/roles-and-permissions/roles-and-permissions.component.ts index ee5d792ad..9b2578e6a 100644 --- a/src/app/system/roles-and-permissions/roles-and-permissions.component.ts +++ b/src/app/system/roles-and-permissions/roles-and-permissions.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit, TemplateRef, ElementRef, ViewChild, AfterViewInit } from '@angular/core'; +import { Component, OnInit, TemplateRef, ElementRef, ViewChild, AfterViewInit, inject } from '@angular/core'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort, MatSortHeader } from '@angular/material/sort'; import { @@ -56,6 +56,11 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class RolesAndPermissionsComponent implements OnInit, AfterViewInit { + private route = inject(ActivatedRoute); + private router = inject(Router); + private configurationWizardService = inject(ConfigurationWizardService); + private popoverService = inject(PopoverService); + /** Role data. */ roleData: any; /** Columns to be displayed in roles and permissions table. */ @@ -88,12 +93,7 @@ export class RolesAndPermissionsComponent implements OnInit, AfterViewInit { * @param {ConfigurationWizardService} configurationWizardService ConfigurationWizard Service. * @param {PopoverService} popoverService PopoverService. */ - constructor( - private route: ActivatedRoute, - private router: Router, - private configurationWizardService: ConfigurationWizardService, - private popoverService: PopoverService - ) { + constructor() { this.route.data.subscribe((data: { roles: any }) => { this.roleData = data.roles; }); diff --git a/src/app/system/roles-and-permissions/roles-and-permissions.resolver.ts b/src/app/system/roles-and-permissions/roles-and-permissions.resolver.ts index 3798e75c9..f05ef6ff6 100644 --- a/src/app/system/roles-and-permissions/roles-and-permissions.resolver.ts +++ b/src/app/system/roles-and-permissions/roles-and-permissions.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; /** rxjs Imports */ import { Observable } from 'rxjs'; @@ -12,10 +12,7 @@ import { SystemService } from '../system.service'; */ @Injectable() export class RolesAndPermissionsResolver { - /** - * @param {SystemService} systemService System service. - */ - constructor(private systemService: SystemService) {} + private systemService = inject(SystemService); /** * Returns the roles and permissions data. diff --git a/src/app/system/roles-and-permissions/view-role/view-role.component.html b/src/app/system/roles-and-permissions/view-role/view-role.component.html index 8f055d48d..b4c77f113 100644 --- a/src/app/system/roles-and-permissions/view-role/view-role.component.html +++ b/src/app/system/roles-and-permissions/view-role/view-role.component.html @@ -9,27 +9,29 @@ {{ 'labels.text.Edit Role' | translate }} - + @if (!isRoleEnable(rolePermissionService.disabled)) { + + } - + @if (isRoleEnable(rolePermissionService.disabled)) { + + } - - + @if (!isDisabled) { +
    + + +
    + }
    - - - {{ formatName(grouping) }} - - + @for (grouping of groupings; track grouping) { + + + {{ formatName(grouping) }} + + + }
    @@ -105,27 +110,33 @@
    -
    -
    -
    - - {{ permissionName(permission.code) }} - + @for (permission of permissions.permissions; track permission) { +
    +
    +
    + + {{ permissionName(permission.code) }} + +
    -
    + }
    -
    - - - - -
    + @if (!isDisabled) { +
    + + + + +
    + }
    diff --git a/src/app/system/roles-and-permissions/view-role/view-role.component.ts b/src/app/system/roles-and-permissions/view-role/view-role.component.ts index de66bac4f..48cddbecf 100644 --- a/src/app/system/roles-and-permissions/view-role/view-role.component.ts +++ b/src/app/system/roles-and-permissions/view-role/view-role.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormBuilder, UntypedFormGroup, Validators, FormArray, ReactiveFormsModule } from '@angular/forms'; import { MatDialog } from '@angular/material/dialog'; import { ActivatedRoute, Router } from '@angular/router'; @@ -12,7 +12,7 @@ import { DeleteDialogComponent } from '../../../shared/delete-dialog/delete-dial import { DisableDialogComponent } from '../../../shared/disable-dialog/disable-dialog.component'; import { EnableDialogComponent } from '../../../shared/enable-dialog/enable-dialog.component'; import { FaIconComponent } from '@fortawesome/angular-fontawesome'; -import { NgIf, NgFor, NgClass } from '@angular/common'; +import { NgClass } from '@angular/common'; import { MatList, MatListItem } from '@angular/material/list'; import { MatDivider } from '@angular/material/divider'; import { MatCheckbox } from '@angular/material/checkbox'; @@ -40,6 +40,14 @@ import { AuthService } from 'app/zitadel/auth.service'; ] }) export class ViewRoleComponent implements OnInit { + private route = inject(ActivatedRoute); + private systemService = inject(SystemService); + private router = inject(Router); + private formBuilder = inject(UntypedFormBuilder); + private translateService = inject(TranslateService); + dialog = inject(MatDialog); + private authService = inject(AuthService); + /** Role Permissions Data */ rolePermissionService: any; /** Stores the current grouping */ @@ -83,15 +91,7 @@ export class ViewRoleComponent implements OnInit { * @param {MatDialog} dialog Shared Dialog Boxes. * @param {TranslateService} translateService Translate Service. */ - constructor( - private route: ActivatedRoute, - private systemService: SystemService, - private router: Router, - private formBuilder: UntypedFormBuilder, - private translateService: TranslateService, - public dialog: MatDialog, - private authService: AuthService - ) { + constructor() { this.route.data.subscribe((data: { roledetails: any }) => { this.rolePermissionService = data.roledetails; }); diff --git a/src/app/system/roles-and-permissions/view-role/view-role.resolver.ts b/src/app/system/roles-and-permissions/view-role/view-role.resolver.ts index 36dea86e8..b776db26d 100644 --- a/src/app/system/roles-and-permissions/view-role/view-role.resolver.ts +++ b/src/app/system/roles-and-permissions/view-role/view-role.resolver.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ @@ -13,10 +13,7 @@ import { SystemService } from '../../system.service'; */ @Injectable() export class ViewRoleResolver { - /** - * @param {SystemService} systemService System service. - */ - constructor(private systemService: SystemService) {} + private systemService = inject(SystemService); /** * Returns the roles and permissions data. diff --git a/src/app/system/system-routing.module.ts b/src/app/system/system-routing.module.ts index 209a7f7c5..ebe081fa7 100644 --- a/src/app/system/system-routing.module.ts +++ b/src/app/system/system-routing.module.ts @@ -598,7 +598,6 @@ const routes: Routes = [ ] } ]) - ]; @NgModule({ diff --git a/src/app/system/system.component.html b/src/app/system/system.component.html index a41aa9dd9..36a719e12 100644 --- a/src/app/system/system.component.html +++ b/src/app/system/system.component.html @@ -12,24 +12,28 @@
    {{ 'labels.heading.Manage Data tables' | translate }} - + @if (arrowBooleans[0]) { + + }
    @@ -44,24 +48,28 @@
    {{ 'labels.heading.Manage Codes' | translate }} - + @if (arrowBooleans[1]) { + + }
    @@ -76,29 +84,28 @@
    {{ 'labels.heading.Manage Roles and Permissions' | translate }} - + @if (arrowBooleans[2]) { + + }
    @@ -113,24 +120,28 @@
    {{ 'labels.heading.Configure Maker Checker Tasks' | translate }} - + @if (arrowBooleans[3]) { + + }
    @@ -144,24 +155,28 @@
    {{ 'labels.heading.Manage Hooks' | translate }} - + @if (arrowBooleans[4]) { + + }
    @@ -174,29 +189,28 @@
    {{ 'labels.heading.Entity to Entity Mapping' | translate }} - + @if (arrowBooleans[5]) { + + }
    @@ -209,24 +223,28 @@
    {{ 'labels.heading.Manage Surveys' | translate }} - + @if (arrowBooleans[6]) { + + }
    @@ -239,24 +257,28 @@
    {{ 'labels.heading.Manage External Events' | translate }} - + @if (arrowBooleans[7]) { + + }
    @@ -273,24 +295,28 @@
    {{ 'labels.heading.Audit Trails' | translate }} - + @if (arrowBooleans[8]) { + + }
    @@ -304,24 +330,28 @@
    {{ 'labels.heading.Manage Reports' | translate }} - + @if (arrowBooleans[9]) { + + }
    @@ -335,24 +365,28 @@
    {{ 'labels.heading.Manage Jobs' | translate }} - + @if (arrowBooleans[10]) { + + }
    @@ -365,24 +399,28 @@
    {{ 'labels.heading.Configurations' | translate }} - + @if (arrowBooleans[11]) { + + }
    @@ -395,29 +433,28 @@
    {{ 'labels.heading.Account Number Preferences' | translate }} - + @if (arrowBooleans[12]) { + + }
    @@ -430,24 +467,28 @@
    {{ 'labels.heading.External Services' | translate }} - + @if (arrowBooleans[13]) { + + }
    @@ -460,24 +501,28 @@
    {{ 'labels.heading.Two-Factor Authentication' | translate }} - + @if (arrowBooleans[14]) { + + }
    diff --git a/src/app/system/system.component.ts b/src/app/system/system.component.ts index 84dd99c3b..09beebaca 100644 --- a/src/app/system/system.component.ts +++ b/src/app/system/system.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { AfterViewInit, Component, ElementRef, TemplateRef, ViewChild } from '@angular/core'; +import { AfterViewInit, Component, ElementRef, TemplateRef, ViewChild, inject } from '@angular/core'; import { Router, RouterLink } from '@angular/router'; /** Custom Services */ @@ -9,7 +9,7 @@ import { MatNavList, MatListItem } from '@angular/material/list'; import { MatIcon } from '@angular/material/icon'; import { FaIconComponent } from '@fortawesome/angular-fontawesome'; import { MatLine } from '@angular/material/grid-list'; -import { NgIf, NgClass } from '@angular/common'; +import { NgClass } from '@angular/common'; import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; @Component({ @@ -27,6 +27,10 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class SystemComponent implements AfterViewInit { + private router = inject(Router); + private configurationWizardService = inject(ConfigurationWizardService); + private popoverService = inject(PopoverService); + /* Reference of manage datatables */ @ViewChild('datatables') datatables: ElementRef; /* Template for popover on manage datables */ @@ -59,17 +63,6 @@ export class SystemComponent implements AfterViewInit { isDisabled: boolean = true; arrowBooleans: boolean[] = new Array(15).fill(false); - /** - * @param {Router} router Router. - * @param {ConfigurationWizardService} configurationWizardService ConfigurationWizard Service. - * @param {PopoverService} popoverService PopoverService. - */ - constructor( - private router: Router, - private configurationWizardService: ConfigurationWizardService, - private popoverService: PopoverService - ) {} - /** * Popover function * @param template TemplateRef. diff --git a/src/app/system/system.service.ts b/src/app/system/system.service.ts index 2e62da272..2c77d37e3 100644 --- a/src/app/system/system.service.ts +++ b/src/app/system/system.service.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { HttpClient, HttpParams } from '@angular/common/http'; /** rxjs Imports */ @@ -13,15 +13,12 @@ import { RunJobWithParamPayloadType } from './manage-jobs/scheduler-jobs/custom- providedIn: 'root' }) export class SystemService { + private http = inject(HttpClient); + public static CONFIG_ASSET_EXTERNALIZATION = 'asset-externalization-of-non-active-loans'; emptyPayload: any = {}; - /** - * @param {HttpClient} http Http Client to send requests. - */ - constructor(private http: HttpClient) {} - /** * @returns {Observable} Data tables. */ diff --git a/src/app/system/version.service.ts b/src/app/system/version.service.ts index 8e3ecc02e..2af264e4c 100644 --- a/src/app/system/version.service.ts +++ b/src/app/system/version.service.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { HttpClient } from '@angular/common/http'; /** rxjs Imports */ @@ -9,7 +9,7 @@ import { Observable } from 'rxjs'; providedIn: 'root' }) export class VersionService { - constructor(private http: HttpClient) {} + private http = inject(HttpClient); getBackendInfo(): Observable { return this.http.get('/fineract-provider/actuator/info'); diff --git a/src/app/tasks/checker-inbox-and-tasks-tabs/checker-inbox/checker-inbox.component.html b/src/app/tasks/checker-inbox-and-tasks-tabs/checker-inbox/checker-inbox.component.html index c130951ba..0695d12a5 100644 --- a/src/app/tasks/checker-inbox-and-tasks-tabs/checker-inbox/checker-inbox.component.html +++ b/src/app/tasks/checker-inbox-and-tasks-tabs/checker-inbox/checker-inbox.component.html @@ -1,151 +1,153 @@ -
    -
    - -
    - - - +@if (checkerData) { +
    +
    + +
    + + + +
    +
    +
    + + {{ 'labels.inputs.From Date' | translate }} + + + + + + {{ 'labels.inputs.To Date' | translate }} + + + + + + {{ 'labels.inputs.Action' | translate }} + + @for (action of makerCheckerTemplate.actionNames; track action) { + + {{ action }} + + } + + + + {{ 'labels.inputs.Entity' | translate }} + + @for (entity of makerCheckerTemplate.entityNames; track entity) { + + {{ entity }} + + } + + + + {{ 'labels.inputs.Resource ID' | translate }} + + + +
    +
    + @if (!noSearchedData) { + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + {{ 'labels.inputs.ID' | translate }}{{ makerChecker.id }}{{ 'labels.inputs.Made on Date' | translate }}{{ makerChecker.madeOnDate | dateFormat }}{{ 'labels.inputs.Status' | translate }}{{ makerChecker.processingResult }}{{ 'labels.inputs.User' | translate }}{{ makerChecker.maker }}{{ 'labels.inputs.Action' | translate }}{{ makerChecker.actionName }}{{ 'labels.inputs.Entity' | translate }}{{ makerChecker.entityName }}
    + } + @if (noSearchedData) { +
    +
    + + {{ 'labels.text.No checker inbox data available for this search' | translate }} +
    +
    + }
    +} -
    -
    - - {{ 'labels.inputs.From Date' | translate }} - - - - - - - {{ 'labels.inputs.To Date' | translate }} - - - - - - - {{ 'labels.inputs.Action' | translate }} - - - {{ action }} - - - - - - {{ 'labels.inputs.Entity' | translate }} - - - {{ entity }} - - - - - - {{ 'labels.inputs.Resource ID' | translate }} - - - - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - - - - - {{ 'labels.inputs.ID' | translate }}{{ makerChecker.id }}{{ 'labels.inputs.Made on Date' | translate }}{{ makerChecker.madeOnDate | dateFormat }}{{ 'labels.inputs.Status' | translate }}{{ makerChecker.processingResult }}{{ 'labels.inputs.User' | translate }}{{ makerChecker.maker }}{{ 'labels.inputs.Action' | translate }}{{ makerChecker.actionName }}{{ 'labels.inputs.Entity' | translate }}{{ makerChecker.entityName }}
    - -
    +@if (!checkerData) { +
    - {{ 'labels.text.No checker inbox data available for this search' | translate }} + {{ 'labels.text.No checker inbox data available for this account' | translate }}
    -
    - -
    -
    - - {{ 'labels.text.No checker inbox data available for this account' | translate }} -
    -
    +} diff --git a/src/app/tasks/checker-inbox-and-tasks-tabs/checker-inbox/checker-inbox.component.ts b/src/app/tasks/checker-inbox-and-tasks-tabs/checker-inbox/checker-inbox.component.ts index 4bfd52dc6..e82a4f3bb 100644 --- a/src/app/tasks/checker-inbox-and-tasks-tabs/checker-inbox/checker-inbox.component.ts +++ b/src/app/tasks/checker-inbox-and-tasks-tabs/checker-inbox/checker-inbox.component.ts @@ -1,5 +1,5 @@ /** Angular Imports */ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, inject } from '@angular/core'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; import { SelectionModel } from '@angular/cdk/collections'; import { UntypedFormBuilder, UntypedFormGroup, ReactiveFormsModule } from '@angular/forms'; @@ -53,6 +53,15 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; ] }) export class CheckerInboxComponent implements OnInit { + private route = inject(ActivatedRoute); + private dialog = inject(MatDialog); + private dateUtils = inject(Dates); + private router = inject(Router); + private translateService = inject(TranslateService); + private tasksService = inject(TasksService); + private settingsService = inject(SettingsService); + private formBuilder = inject(UntypedFormBuilder); + /** Data to be displayed */ searchData: any; /** Maker Checker Template */ @@ -92,16 +101,7 @@ export class CheckerInboxComponent implements OnInit { * @param {TasksService} tasksService Tasks Service. * @param {FormBuilder} formBuilder Form Builder. */ - constructor( - private route: ActivatedRoute, - private dialog: MatDialog, - private dateUtils: Dates, - private router: Router, - private translateService: TranslateService, - private tasksService: TasksService, - private settingsService: SettingsService, - private formBuilder: UntypedFormBuilder - ) { + constructor() { this.route.data.subscribe((data: { makerCheckerResource: any; makerCheckerTemplate: any }) => { this.searchData = data.makerCheckerResource; if (this.searchData.length > 0) { diff --git a/src/app/tasks/checker-inbox-and-tasks-tabs/client-approval/client-approval.component.html b/src/app/tasks/checker-inbox-and-tasks-tabs/client-approval/client-approval.component.html index 10918a6f5..9eea26cc3 100644 --- a/src/app/tasks/checker-inbox-and-tasks-tabs/client-approval/client-approval.component.html +++ b/src/app/tasks/checker-inbox-and-tasks-tabs/client-approval/client-approval.component.html @@ -1,78 +1,76 @@ -
    -
    -