From a42d5ff26c7cca70ade7d5709edb644af59ac57b Mon Sep 17 00:00:00 2001 From: Rinat Arsaev <11846445+A77AY@users.noreply.github.com> Date: Mon, 16 Sep 2024 13:14:56 +0500 Subject: [PATCH] Optimize payments table (#387) --- package-lock.json | 397 ++++++++++-------- package.json | 31 +- .../stores/domain-store.service.ts | 44 +- .../domain-config/utils/create-object-hash.ts | 5 + .../domain-objects-table.component.ts | 2 +- .../payments-table.component.ts | 3 +- .../domain-object-card.component.ts | 2 +- .../domain/utils/get-domain-object-details.ts | 6 +- .../domain-secret.service.ts | 5 + .../utils/table2/create-currency-column.ts | 16 +- .../table2/create-domain-object-column.ts | 10 +- .../utils/table2/create-party-column.ts | 7 +- 12 files changed, 297 insertions(+), 231 deletions(-) create mode 100644 src/app/api/domain-config/utils/create-object-hash.ts diff --git a/package-lock.json b/package-lock.json index 3d98107f..9c581df3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,17 +8,17 @@ "name": "control-center", "version": "0.0.0", "dependencies": { - "@angular/animations": "18.2.2", - "@angular/cdk": "18.2.2", - "@angular/common": "18.2.2", - "@angular/compiler": "18.2.2", - "@angular/core": "18.2.2", - "@angular/forms": "18.2.2", - "@angular/material": "18.2.2", - "@angular/platform-browser": "18.2.2", - "@angular/platform-browser-dynamic": "18.2.2", - "@angular/platform-server": "18.2.2", - "@angular/router": "18.2.2", + "@angular/animations": "18.2.4", + "@angular/cdk": "18.2.4", + "@angular/common": "18.2.4", + "@angular/compiler": "18.2.4", + "@angular/core": "18.2.4", + "@angular/forms": "18.2.4", + "@angular/material": "18.2.4", + "@angular/platform-browser": "18.2.4", + "@angular/platform-browser-dynamic": "18.2.4", + "@angular/platform-server": "18.2.4", + "@angular/router": "18.2.4", "@ngneat/input-mask": "6.0.0", "@vality/deanonimus-proto": "2.0.1-2a02d87.0", "@vality/domain-proto": "2.0.1-e5d3c83.0", @@ -26,7 +26,7 @@ "@vality/fistful-proto": "2.0.1-88e69a5.0", "@vality/machinegun-proto": "1.0.0", "@vality/magista-proto": "2.0.2-ec1bdb9.0", - "@vality/ng-core": "18.3.1-pr-67-675080b.0", + "@vality/ng-core": "18.3.1-pr-68-2c4891d.0", "@vality/ng-thrift": "18.0.1-pr-13-bdb6d51.0", "@vality/payout-manager-proto": "2.0.1-eb4091a.0", "@vality/repairer-proto": "2.0.2-07b73e9.0", @@ -49,11 +49,11 @@ "zone.js": "0.14.10" }, "devDependencies": { - "@angular-devkit/build-angular": "18.2.2", + "@angular-devkit/build-angular": "18.2.4", "@angular-eslint/builder": "18.0.1", "@angular-eslint/schematics": "18.0.1", - "@angular/cli": "18.2.2", - "@angular/compiler-cli": "18.2.2", + "@angular/cli": "18.2.4", + "@angular/compiler-cli": "18.2.4", "@types/inputmask": "5.0.3", "@types/jasmine": "4.0.3", "@types/jwt-decode": "2.2.1", @@ -101,12 +101,12 @@ } }, "node_modules/@angular-devkit/architect": { - "version": "0.1802.2", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1802.2.tgz", - "integrity": "sha512-LPRl9jhcf0NgshaL6RoUy1uL/cAyNt7oxctoZ9EHUu8eh5E9W/jZGhVowjOLpirwqYhmEzKJJIeS49Ssqs3RQg==", + "version": "0.1802.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1802.4.tgz", + "integrity": "sha512-VH7AwGng1zuWPTJoH1IgHYeNhqZIgzlwDx39JPmArZAW/WZHDILWB7ipbTNw0R4U4VncrXJqDmMVex7NdHP6sg==", "dev": true, "dependencies": { - "@angular-devkit/core": "18.2.2", + "@angular-devkit/core": "18.2.4", "rxjs": "7.8.1" }, "engines": { @@ -116,16 +116,16 @@ } }, "node_modules/@angular-devkit/build-angular": { - "version": "18.2.2", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-18.2.2.tgz", - "integrity": "sha512-7HEnTN2T1jnjuItXKcApOsoYGgfou4+POju3ZbwIQukDZ3B2COskvQkVTxqPNrQ0ZjT2mxZYoVlmGW9M+7N25g==", + "version": "18.2.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-18.2.4.tgz", + "integrity": "sha512-zLDstS95Yb7iBA1ZCYe3LsOLpIhr0ZC3sZ03PhVvAGbVRGSbQNnhQRZLKMk+LDhYJiG+eNFQGLfU3RfZrGds7A==", "dev": true, "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.1802.2", - "@angular-devkit/build-webpack": "0.1802.2", - "@angular-devkit/core": "18.2.2", - "@angular/build": "18.2.2", + "@angular-devkit/architect": "0.1802.4", + "@angular-devkit/build-webpack": "0.1802.4", + "@angular-devkit/core": "18.2.4", + "@angular/build": "18.2.4", "@babel/core": "7.25.2", "@babel/generator": "7.25.0", "@babel/helper-annotate-as-pure": "7.24.7", @@ -136,7 +136,7 @@ "@babel/preset-env": "7.25.3", "@babel/runtime": "7.25.0", "@discoveryjs/json-ext": "0.6.1", - "@ngtools/webpack": "18.2.2", + "@ngtools/webpack": "18.2.4", "@vitejs/plugin-basic-ssl": "1.1.0", "ansi-colors": "4.1.3", "autoprefixer": "10.4.20", @@ -179,7 +179,7 @@ "vite": "5.4.0", "watchpack": "2.4.1", "webpack": "5.94.0", - "webpack-dev-middleware": "7.3.0", + "webpack-dev-middleware": "7.4.2", "webpack-dev-server": "5.0.4", "webpack-merge": "6.0.1", "webpack-subresource-integrity": "5.1.0" @@ -325,12 +325,12 @@ "dev": true }, "node_modules/@angular-devkit/build-webpack": { - "version": "0.1802.2", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1802.2.tgz", - "integrity": "sha512-Pj+YmKh0nJOKl6QAsqYh3SqfuVJrFqjyp5WrG9BgfsMD9GCMD+5teMHNYJlp+vG/C8e7VdZp4rqOon8K9Xn4Mw==", + "version": "0.1802.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1802.4.tgz", + "integrity": "sha512-juaDoguYccObm2xnzRDRlOtiL7ZyZcSAyiyls6QuO8hoo/h6phdHALJkUhI9+SIhCRQ6eUQtolC7hN3J+FZKnA==", "dev": true, "dependencies": { - "@angular-devkit/architect": "0.1802.2", + "@angular-devkit/architect": "0.1802.4", "rxjs": "7.8.1" }, "engines": { @@ -344,9 +344,9 @@ } }, "node_modules/@angular-devkit/core": { - "version": "18.2.2", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-18.2.2.tgz", - "integrity": "sha512-Zz0tGptI/QQnUBDdp+1G5wGwQWMjpfe2oO+UohkrDVgFS71yVj4VDnOy51kMTxBvzw+36evTgthPpmzqPIfxBw==", + "version": "18.2.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-18.2.4.tgz", + "integrity": "sha512-svlgZ0vbLrfNJAQE5WePAutcYIyA7C0OfzKSTMsfV2X1I+1blYDaZIu/ocnHqofMHu6ZqdSaaU/p/rieqU8fcA==", "dev": true, "dependencies": { "ajv": "8.17.1", @@ -406,12 +406,12 @@ } }, "node_modules/@angular-devkit/schematics": { - "version": "18.2.2", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-18.2.2.tgz", - "integrity": "sha512-PU6+3nX+gQ3gofR7BGwXuvNUNeeV2raURaZjlPfGpBqjyTBxukMV71QsTTWptAZT4WibCWkTFp6X1gvsOGbjMg==", + "version": "18.2.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-18.2.4.tgz", + "integrity": "sha512-s2WdUhyLlKj5kOjb6vrvJg9/31KvgyRJGjy7PnzS43tpwF9MLuM3AYhuJsXHPhx+i0nyWn/Jnd8ZLjMzXljSxg==", "dev": true, "dependencies": { - "@angular-devkit/core": "18.2.2", + "@angular-devkit/core": "18.2.4", "jsonc-parser": "3.3.1", "magic-string": "0.30.11", "ora": "5.4.1", @@ -554,9 +554,9 @@ } }, "node_modules/@angular/animations": { - "version": "18.2.2", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-18.2.2.tgz", - "integrity": "sha512-jh/dGrY77HGm54HdTiQsxmvoRfFeJgHeWAK2+nWCPoc4b7OHcWxy/04cYffs0/27ThmABmppP7ERAyZ0f60uow==", + "version": "18.2.4", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-18.2.4.tgz", + "integrity": "sha512-ajjXpLD+SyxbHnmhj2ZvYpXneviOjcBgU9L2UX4OVS0jVWxCNHLhJrcMqtqFHA6U5fPnhPNR9cmnt6tmqri0rA==", "dependencies": { "tslib": "^2.3.0" }, @@ -564,17 +564,17 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "18.2.2" + "@angular/core": "18.2.4" } }, "node_modules/@angular/build": { - "version": "18.2.2", - "resolved": "https://registry.npmjs.org/@angular/build/-/build-18.2.2.tgz", - "integrity": "sha512-okaDdTMXnDhvnnnih6rPQnexL6htfEAPr19bB1Ci9d31gEjVuKZCjlcw2sPZ6BUyilwC9nZlCI5vbH1Ljf6mzA==", + "version": "18.2.4", + "resolved": "https://registry.npmjs.org/@angular/build/-/build-18.2.4.tgz", + "integrity": "sha512-GVs7O7wxNMJCkqh6Vv2u9GEArWg9jyEt8Fofd6CJGzxKBYQ4hR5gjzL/lU6kNFiMcioS1wm1f6qtJtgilUO+9A==", "dev": true, "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.1802.2", + "@angular-devkit/architect": "0.1802.4", "@babel/core": "7.25.2", "@babel/helper-annotate-as-pure": "7.24.7", "@babel/helper-split-export-declaration": "7.24.7", @@ -660,9 +660,9 @@ } }, "node_modules/@angular/cdk": { - "version": "18.2.2", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-18.2.2.tgz", - "integrity": "sha512-+u7ZcMA24WO03vDzlBJJWq+okZLFDeW9JrtHzrdiT09FDt4sdUp+7PddXaZcRHIXjJL+CaCLQ6slaqPNEufqgg==", + "version": "18.2.4", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-18.2.4.tgz", + "integrity": "sha512-o+TuxZDqStfkviEkCR05pVyP6R2RIruEs/45Cms76hlsIheMoxRaxir/yrHdh4tZESJJhcO/EVE+aymNIRWAfg==", "dependencies": { "tslib": "^2.3.0" }, @@ -676,17 +676,17 @@ } }, "node_modules/@angular/cli": { - "version": "18.2.2", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-18.2.2.tgz", - "integrity": "sha512-HVVaMxnbID0q+V3KE+JqzGbPHcBUFo1RKhBZ/jxY7USZNzgtyYbRc0IYqPWNdr99UT5QefTJrjVazJo1nqQZvQ==", + "version": "18.2.4", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-18.2.4.tgz", + "integrity": "sha512-n+Y2xlgcpTZ+MZmycf2b3ceVvANDJFkDEodobVtyG63WvGOhkZ3aGhT7sHguKpAQwJLicSf8zF2z+v1Yi0DvRw==", "dev": true, "dependencies": { - "@angular-devkit/architect": "0.1802.2", - "@angular-devkit/core": "18.2.2", - "@angular-devkit/schematics": "18.2.2", + "@angular-devkit/architect": "0.1802.4", + "@angular-devkit/core": "18.2.4", + "@angular-devkit/schematics": "18.2.4", "@inquirer/prompts": "5.3.8", "@listr2/prompt-adapter-inquirer": "2.0.15", - "@schematics/angular": "18.2.2", + "@schematics/angular": "18.2.4", "@yarnpkg/lockfile": "1.1.0", "ini": "4.1.3", "jsonc-parser": "3.3.1", @@ -736,9 +736,9 @@ } }, "node_modules/@angular/common": { - "version": "18.2.2", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-18.2.2.tgz", - "integrity": "sha512-AQe4xnnNNch/sXRnV82C8FmhijxPATKfPGojC2qbAG2o6VkWKgt5Lbj0O8WxvSIOS5Syedv+O2kLY/JMGWHNtw==", + "version": "18.2.4", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-18.2.4.tgz", + "integrity": "sha512-flUaKhdr8KvtjH0cLC6Rrjirt8GsiFlrmZLZplr784O3Gkei2VBBNFoopgmlEzbVGPiIG5QlFZH9yvah6JPQZw==", "dependencies": { "tslib": "^2.3.0" }, @@ -746,14 +746,14 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "18.2.2", + "@angular/core": "18.2.4", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "18.2.2", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-18.2.2.tgz", - "integrity": "sha512-gmVNCXZiv/CIk2eKRLnH19N9VsPuE2s3Oxm0MNi003zk1cLy7D4YEm4fSrjKXtPY8MMpRXiu5f63W94hLwWEVw==", + "version": "18.2.4", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-18.2.4.tgz", + "integrity": "sha512-o3ngFr1Bjt7cKOu4DSZJGCUF9YPTxJee97wFon2eNFj6FFNTmnGwAvsnJjHBMmk90fmZLC2/HpPdhYz7WprMZQ==", "dependencies": { "tslib": "^2.3.0" }, @@ -761,7 +761,7 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "18.2.2" + "@angular/core": "18.2.4" }, "peerDependenciesMeta": { "@angular/core": { @@ -770,9 +770,9 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "18.2.2", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-18.2.2.tgz", - "integrity": "sha512-fF7lDrTA12YGqVjF4LyMi4hm58cv9G6CWmzSlvun0nMYCwrbRNnakZsj19dOfiIqqu4MwHaF4w3PTmUSxkMuiw==", + "version": "18.2.4", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-18.2.4.tgz", + "integrity": "sha512-BIp5zr+npqSs/4KWPxwKdn7+sjo008ieNOQDlXyQms9BKlxx/gDnj7W2TsxhrkDTYCIHF73fJZ7u2U8Qy4JWfw==", "dev": true, "dependencies": { "@babel/core": "7.25.2", @@ -793,14 +793,14 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/compiler": "18.2.2", + "@angular/compiler": "18.2.4", "typescript": ">=5.4 <5.6" } }, "node_modules/@angular/core": { - "version": "18.2.2", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-18.2.2.tgz", - "integrity": "sha512-Rx6XajL0Ydj9hXUSPDvL2Q/kMzWtbiE3VxZFJnkE+fLQiWvr0GncB+NTb/nQ6QlPQ0ly60DvuI3KLcGDuFtGVA==", + "version": "18.2.4", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-18.2.4.tgz", + "integrity": "sha512-ulYmYpI/ZVQ5BL38rBy4DS/9wgGWmVD9Uo6tcrLqCzt1G1G2nKwseZv009536pHfk6dj2HdPSkpcerhWh57DWw==", "dependencies": { "tslib": "^2.3.0" }, @@ -813,9 +813,9 @@ } }, "node_modules/@angular/forms": { - "version": "18.2.2", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-18.2.2.tgz", - "integrity": "sha512-K8cv0w6o7+ocQfUrdSA3XaKrYfa1+2TlmtyxPHjEd2mCu2R+Yqo5RqJ3P8keFewJ1+bSLhz6xnn6mumwl0RnUQ==", + "version": "18.2.4", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-18.2.4.tgz", + "integrity": "sha512-rlLhReauUz6jhLCEkGabLqqF6xLaTfvxafuj2ojzcqoKGSZcXDIM/UOSoWX756B8NtrpsuglpGBZjZlsrAZGsg==", "dependencies": { "tslib": "^2.3.0" }, @@ -823,22 +823,22 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "18.2.2", - "@angular/core": "18.2.2", - "@angular/platform-browser": "18.2.2", + "@angular/common": "18.2.4", + "@angular/core": "18.2.4", + "@angular/platform-browser": "18.2.4", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/material": { - "version": "18.2.2", - "resolved": "https://registry.npmjs.org/@angular/material/-/material-18.2.2.tgz", - "integrity": "sha512-c+EQo1GEvM2w3qasgV/BGxB0bpJeSGs2WcMVTXCYVMcqEk8nwpALwfZiCAYl8JoKoiC5k993zz19xP2Eu14qkQ==", + "version": "18.2.4", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-18.2.4.tgz", + "integrity": "sha512-F09145mI/EAHY9ngdnQTo3pFRmUoU/50i6cmddtL4cse0WidatoodQr0gZCksxhmpJgRy5mTcjh/LU2hShOgcA==", "dependencies": { "tslib": "^2.3.0" }, "peerDependencies": { "@angular/animations": "^18.0.0 || ^19.0.0", - "@angular/cdk": "18.2.2", + "@angular/cdk": "18.2.4", "@angular/common": "^18.0.0 || ^19.0.0", "@angular/core": "^18.0.0 || ^19.0.0", "@angular/forms": "^18.0.0 || ^19.0.0", @@ -847,22 +847,22 @@ } }, "node_modules/@angular/material-date-fns-adapter": { - "version": "18.2.2", - "resolved": "https://registry.npmjs.org/@angular/material-date-fns-adapter/-/material-date-fns-adapter-18.2.2.tgz", - "integrity": "sha512-zmd6fDNjTa6+dIfCXX43fT0qDJYz7N2kH29I56UQcwprDhrQq/uhrkqwly4UEZnO1jO1NLGMGbMq02JC20jzgQ==", + "version": "18.2.4", + "resolved": "https://registry.npmjs.org/@angular/material-date-fns-adapter/-/material-date-fns-adapter-18.2.4.tgz", + "integrity": "sha512-8WYx86Eh8BmI3LoiXZbdFwkCTAX2X3X1nqXvNgHpC1ucNROytu4Op4ns2QabS3Nru7xXiL5cKd8wMC1FEh3fFA==", "dependencies": { "tslib": "^2.3.0" }, "peerDependencies": { "@angular/core": "^18.0.0 || ^19.0.0", - "@angular/material": "18.2.2", + "@angular/material": "18.2.4", "date-fns": ">2.20.0 <4.0" } }, "node_modules/@angular/platform-browser": { - "version": "18.2.2", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-18.2.2.tgz", - "integrity": "sha512-Bfvl8elCFxyJ9vlwamr4X5sVMcp/tSwBal2coyl0WR+/PH2PAAtf+/WMYxIN90yZmPiJx6RZWUSJRlHOFiFp3A==", + "version": "18.2.4", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-18.2.4.tgz", + "integrity": "sha512-ddzq5MyPvFyTv0kUe8U9fbhE1nZtLYBCFKDqICrzHXiVRAdqLv6qtE5PtbURrdspSy1u/YEGV4LdkNJK3UgnZQ==", "dependencies": { "tslib": "^2.3.0" }, @@ -870,9 +870,9 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/animations": "18.2.2", - "@angular/common": "18.2.2", - "@angular/core": "18.2.2" + "@angular/animations": "18.2.4", + "@angular/common": "18.2.4", + "@angular/core": "18.2.4" }, "peerDependenciesMeta": { "@angular/animations": { @@ -881,9 +881,9 @@ } }, "node_modules/@angular/platform-browser-dynamic": { - "version": "18.2.2", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-18.2.2.tgz", - "integrity": "sha512-UM/+1nY4iIj1v4lxAmV3XRHPAh/4qfNKScCLq8tJGot64rPCbtCl0Rl8rFFGqxAFvTErVDaJycUgWNZSfVl/hw==", + "version": "18.2.4", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-18.2.4.tgz", + "integrity": "sha512-0nA04zJueGzdnl37TJ7guDCrzxYS4fjqgvYKiOpFktpMHPuNrBlAQo5YA7u20HGFG3i47PQh7hEWhQaqcXXpQw==", "dependencies": { "tslib": "^2.3.0" }, @@ -891,16 +891,16 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "18.2.2", - "@angular/compiler": "18.2.2", - "@angular/core": "18.2.2", - "@angular/platform-browser": "18.2.2" + "@angular/common": "18.2.4", + "@angular/compiler": "18.2.4", + "@angular/core": "18.2.4", + "@angular/platform-browser": "18.2.4" } }, "node_modules/@angular/platform-server": { - "version": "18.2.2", - "resolved": "https://registry.npmjs.org/@angular/platform-server/-/platform-server-18.2.2.tgz", - "integrity": "sha512-35YXd+oyNDVOy84T3GugU1zRC0BTQwTglQXHtEjP+l9Jc0E7te1Z/GdCswrK3ZiQ5XSz1vYXtxgN4z4pFCsuDQ==", + "version": "18.2.4", + "resolved": "https://registry.npmjs.org/@angular/platform-server/-/platform-server-18.2.4.tgz", + "integrity": "sha512-ix4jyN+rzkeJ/aEiWcstRHy7C4j/Q+KrXGumRLwpCkNgFRaO8YKFGGivXuPQsViCJoUzPtHu0zptJa6zSVLxyw==", "dependencies": { "tslib": "^2.3.0", "xhr2": "^0.2.0" @@ -909,17 +909,17 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/animations": "18.2.2", - "@angular/common": "18.2.2", - "@angular/compiler": "18.2.2", - "@angular/core": "18.2.2", - "@angular/platform-browser": "18.2.2" + "@angular/animations": "18.2.4", + "@angular/common": "18.2.4", + "@angular/compiler": "18.2.4", + "@angular/core": "18.2.4", + "@angular/platform-browser": "18.2.4" } }, "node_modules/@angular/router": { - "version": "18.2.2", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-18.2.2.tgz", - "integrity": "sha512-tBHwuNtZNjzYAoVdveTI1ke/ZnQjKhc7gqDk9HCH2JUpdQhGbTvCKwDM51ktJpPMPcZlA263lQyy7VIyvdtK0A==", + "version": "18.2.4", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-18.2.4.tgz", + "integrity": "sha512-kYNHD3K1Xou2PRMqbG2tVahtMobgDlhwHdMB7G5oFHg6K13gQ2TmopF1U5A2wYtIMdsC+AkVGIJEOxQN8fmgcA==", "dependencies": { "tslib": "^2.3.0" }, @@ -927,9 +927,9 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "18.2.2", - "@angular/core": "18.2.2", - "@angular/platform-browser": "18.2.2", + "@angular/common": "18.2.4", + "@angular/core": "18.2.4", + "@angular/platform-browser": "18.2.4", "rxjs": "^6.5.3 || ^7.4.0" } }, @@ -4406,9 +4406,9 @@ ] }, "node_modules/@ng-matero/extensions": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/@ng-matero/extensions/-/extensions-18.2.0.tgz", - "integrity": "sha512-f7ZOOSCh7F+uzNR4wuoiLIDwnm9QsS+bhCZ8jXVqG2JRT+oyHtf/JjrRLM2Mc5LCFhyO7fGaOl56qHTWu7e12g==", + "version": "18.2.1", + "resolved": "https://registry.npmjs.org/@ng-matero/extensions/-/extensions-18.2.1.tgz", + "integrity": "sha512-UdxH5cmkN0S4OxubXIbTvBzwo9JQCm869MkA2oQrZx4MQ85P+pZy1VCdlmPoqIoHkY+rki/R1YVUbayvOIlzWA==", "dependencies": { "@ng-select/ng-select": "^13.7.0", "ngx-color": "^9.0.0", @@ -4429,9 +4429,9 @@ "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==" }, "node_modules/@ng-select/ng-select": { - "version": "13.7.0", - "resolved": "https://registry.npmjs.org/@ng-select/ng-select/-/ng-select-13.7.0.tgz", - "integrity": "sha512-GMNu3bLYxWAbgy9pXZ4RgnWp/cxRcrWRQdxLLyg8p9gMCLpim1p4TXR8laXJKK25MKG/LEaWgs+90yCVOoWgZA==", + "version": "13.7.1", + "resolved": "https://registry.npmjs.org/@ng-select/ng-select/-/ng-select-13.7.1.tgz", + "integrity": "sha512-v/GwSBpuHd31DyoYFQECh+rCwn7xmCBpwMQTcwWerKaDQSr1egpGPSnCq2SzvfHqiJ5e1ckx7ZNTuk+swBweag==", "dependencies": { "tslib": "^2.3.1" }, @@ -4458,9 +4458,9 @@ } }, "node_modules/@ngtools/webpack": { - "version": "18.2.2", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-18.2.2.tgz", - "integrity": "sha512-YhADmc+lVjLt3kze07A+yLry2yzcghdclu+7D3EDfa6fG2Pk33HK3MY2I0Z0BO+Ivoq7cV7yxm+naR+Od0Y5ng==", + "version": "18.2.4", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-18.2.4.tgz", + "integrity": "sha512-JVDRexu3q7lg2oqJG36RtX7cqTheoZRwg2HhMV8hYXUDL0fyOrv2galwTCgXrx7vAjlx45L2uR2kuWbgW0VVcQ==", "dev": true, "engines": { "node": "^18.19.1 || ^20.11.1 || >=22.0.0", @@ -5273,13 +5273,13 @@ } }, "node_modules/@schematics/angular": { - "version": "18.2.2", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-18.2.2.tgz", - "integrity": "sha512-0uPA1kQ38RnbNrzMlveX/QAqQIDu2INl5IYd3EUbJZRfYSp1VVyOSyuIBJ+1iUl5Y5VUa2uylaVZXhFdKWprXw==", + "version": "18.2.4", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-18.2.4.tgz", + "integrity": "sha512-GxrPv4eOPrjMKoAVhch9eprW8H/DFhBy5Zgp7CgGui9NprYkkubxw/yyo11WfR5CFZ/q5AfsjV76dPCkhLwLmA==", "dev": true, "dependencies": { - "@angular-devkit/core": "18.2.2", - "@angular-devkit/schematics": "18.2.2", + "@angular-devkit/core": "18.2.4", + "@angular-devkit/schematics": "18.2.4", "jsonc-parser": "3.3.1" }, "engines": { @@ -5622,9 +5622,9 @@ } }, "node_modules/@types/qs": { - "version": "6.9.15", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.15.tgz", - "integrity": "sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==", + "version": "6.9.16", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.16.tgz", + "integrity": "sha512-7i+zxXdPD0T4cKDuxCUXJ4wHcsJLwENa6Z3dCu8cfCK743OGy5Nu1RmAGqDPsoTDINVEcdXKRvR/zre+P2Ku1A==", "dev": true }, "node_modules/@types/range-parser": { @@ -5970,9 +5970,9 @@ "integrity": "sha512-XWF7qM/CARRAey0scGVhfGU6jNq+UdlGE2mg3jn4eIFDuIWQJqsT+Bah300RBUrl+XgFsmj95C6HWRfeA5Q8kw==" }, "node_modules/@vality/ng-core": { - "version": "18.3.1-pr-67-675080b.0", - "resolved": "https://registry.npmjs.org/@vality/ng-core/-/ng-core-18.3.1-pr-67-675080b.0.tgz", - "integrity": "sha512-NoVNoNLsghYwGcEpFu/+Ex2Rr0sbJPMf1pA8pYvskSKop6ryVSRXlrPAfapePSgk/Onbf5N+qthUdKL4BFmRkg==", + "version": "18.3.1-pr-68-2c4891d.0", + "resolved": "https://registry.npmjs.org/@vality/ng-core/-/ng-core-18.3.1-pr-68-2c4891d.0.tgz", + "integrity": "sha512-1oDGn1YooeI/2EeWLbPIG0YyhbtyxITAwDXRk52eWWAHdFyvMcDmALZg89/EM3ATn+WQbV7jN/iNZGBhgmaAKw==", "dependencies": { "@angular/material-date-fns-adapter": "^18.2.2", "@ng-matero/extensions": "^18.2.0", @@ -7072,9 +7072,9 @@ } }, "node_modules/body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "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==", "dev": true, "dependencies": { "bytes": "3.1.2", @@ -7085,7 +7085,7 @@ "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", - "qs": "6.11.0", + "qs": "6.13.0", "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" @@ -9963,37 +9963,37 @@ "dev": true }, "node_modules/express": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", - "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.0.tgz", + "integrity": "sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng==", "dev": true, "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.2", + "body-parser": "1.20.3", "content-disposition": "0.5.4", "content-type": "~1.0.4", "cookie": "0.6.0", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.2.0", + "finalhandler": "1.3.1", "fresh": "0.5.2", "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", + "merge-descriptors": "1.0.3", "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", + "path-to-regexp": "0.1.10", "proxy-addr": "~2.0.7", - "qs": "6.11.0", + "qs": "6.13.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", + "send": "0.19.0", + "serve-static": "1.16.2", "setprototypeof": "1.2.0", "statuses": "2.0.1", "type-is": "~1.6.18", @@ -10022,14 +10022,23 @@ "ms": "2.0.0" } }, + "node_modules/express/node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/express/node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", "dev": true, "dependencies": { "debug": "2.6.9", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "on-finished": "2.4.1", "parseurl": "~1.3.3", @@ -12532,9 +12541,9 @@ } }, "node_modules/launch-editor": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.8.2.tgz", - "integrity": "sha512-eF5slEUZXmi6WvFzI3dYcv+hA24/iKnROf24HztcURJpSz9RBmBgz5cNCVOeguouf1llrwy6Yctl4C4HM+xI8g==", + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.9.1.tgz", + "integrity": "sha512-Gcnl4Bd+hRO9P9icCP/RVVT2o8SFlPXofuCxvA2SaZuH45whSvf5p8x5oih5ftLiVhEI4sp5xDY+R+b3zJBh5w==", "dev": true, "dependencies": { "picocolors": "^1.0.0", @@ -13294,10 +13303,13 @@ } }, "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", - "dev": true + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/merge-stream": { "version": "2.0.0", @@ -15035,9 +15047,9 @@ } }, "node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", + "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==", "dev": true }, "node_modules/path-type": { @@ -15050,9 +15062,9 @@ } }, "node_modules/photoviewer": { - "version": "3.10.2", - "resolved": "https://registry.npmjs.org/photoviewer/-/photoviewer-3.10.2.tgz", - "integrity": "sha512-liikwlwe3jsqgQPeaNR4FkM/9siAmxA9+DQB3iwO56Idg+Rxu1/t8fJDsLSza6mXZuyA6eBl/jtaCOeGlQSupg==", + "version": "3.10.3", + "resolved": "https://registry.npmjs.org/photoviewer/-/photoviewer-3.10.3.tgz", + "integrity": "sha512-6RqhMOiPVMsgfMTP/j/lQLGGj2glzBWIDnrTpx2rcACOcO8ig+bnBAfofEPXBmLOgKxsu+HIiLQudVtloS9GEA==", "dependencies": { "domq.js": "^0.7.0" } @@ -15492,12 +15504,12 @@ } }, "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", "dev": true, "dependencies": { - "side-channel": "^1.0.4" + "side-channel": "^1.0.6" }, "engines": { "node": ">=0.6" @@ -16101,9 +16113,9 @@ } }, "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", "dev": true, "dependencies": { "debug": "2.6.9", @@ -16245,20 +16257,29 @@ "dev": true }, "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", "dev": true, "dependencies": { - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.18.0" + "send": "0.19.0" }, "engines": { "node": ">= 0.8.0" } }, + "node_modules/serve-static/node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -16357,14 +16378,18 @@ } }, "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "dev": true, "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -18237,9 +18262,9 @@ } }, "node_modules/webpack-dev-middleware": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.3.0.tgz", - "integrity": "sha512-xD2qnNew+F6KwOGZR7kWdbIou/ud7cVqLEXeK1q0nHcNsX/u7ul/fSdlOTX4ntSL5FNFy7ZJJXbf0piF591JYw==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.4.2.tgz", + "integrity": "sha512-xOO8n6eggxnwYpy1NlzUKpvrjfJTvae5/D6WOK0S2LSo7vjmo5gCM1DbLUmFqrMTJP+W/0YZNctm7jasWvLuBA==", "dev": true, "dependencies": { "colorette": "^2.0.10", diff --git a/package.json b/package.json index ab4eaf6a..c315caf9 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,7 @@ "private": true, "scripts": { "start": "ng serve --port 4200", + "prod": "cross-env NODE_ENV=stage ng serve --port 4200 --configuration=production", "stage": "cross-env NODE_ENV=stage ng serve --port 4201 --configuration=stage", "build": "ng build", "test": "ng test", @@ -16,17 +17,17 @@ "fix": "npm run lint:fix && npm run format:fix && npm run spell:fix" }, "dependencies": { - "@angular/animations": "18.2.2", - "@angular/cdk": "18.2.2", - "@angular/common": "18.2.2", - "@angular/compiler": "18.2.2", - "@angular/core": "18.2.2", - "@angular/forms": "18.2.2", - "@angular/material": "18.2.2", - "@angular/platform-browser": "18.2.2", - "@angular/platform-browser-dynamic": "18.2.2", - "@angular/platform-server": "18.2.2", - "@angular/router": "18.2.2", + "@angular/animations": "18.2.4", + "@angular/cdk": "18.2.4", + "@angular/common": "18.2.4", + "@angular/compiler": "18.2.4", + "@angular/core": "18.2.4", + "@angular/forms": "18.2.4", + "@angular/material": "18.2.4", + "@angular/platform-browser": "18.2.4", + "@angular/platform-browser-dynamic": "18.2.4", + "@angular/platform-server": "18.2.4", + "@angular/router": "18.2.4", "@ngneat/input-mask": "6.0.0", "@vality/deanonimus-proto": "2.0.1-2a02d87.0", "@vality/domain-proto": "2.0.1-e5d3c83.0", @@ -34,7 +35,7 @@ "@vality/fistful-proto": "2.0.1-88e69a5.0", "@vality/machinegun-proto": "1.0.0", "@vality/magista-proto": "2.0.2-ec1bdb9.0", - "@vality/ng-core": "18.3.1-pr-67-675080b.0", + "@vality/ng-core": "18.3.1-pr-68-2c4891d.0", "@vality/ng-thrift": "18.0.1-pr-13-bdb6d51.0", "@vality/payout-manager-proto": "2.0.1-eb4091a.0", "@vality/repairer-proto": "2.0.2-07b73e9.0", @@ -57,11 +58,11 @@ "zone.js": "0.14.10" }, "devDependencies": { - "@angular-devkit/build-angular": "18.2.2", + "@angular-devkit/build-angular": "18.2.4", "@angular-eslint/builder": "18.0.1", "@angular-eslint/schematics": "18.0.1", - "@angular/cli": "18.2.2", - "@angular/compiler-cli": "18.2.2", + "@angular/cli": "18.2.4", + "@angular/compiler-cli": "18.2.4", "@types/inputmask": "5.0.3", "@types/jasmine": "4.0.3", "@types/jwt-decode": "2.2.1", diff --git a/src/app/api/domain-config/stores/domain-store.service.ts b/src/app/api/domain-config/stores/domain-store.service.ts index 93a9b747..210b7487 100644 --- a/src/app/api/domain-config/stores/domain-store.service.ts +++ b/src/app/api/domain-config/stores/domain-store.service.ts @@ -1,23 +1,27 @@ import { Injectable, DestroyRef } from '@angular/core'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; -import { Domain, DomainObject, Reference } from '@vality/domain-proto/domain'; +import { DomainObject, Reference } from '@vality/domain-proto/domain'; import { Commit, Snapshot, Version } from '@vality/domain-proto/domain_config'; import { NotifyLogService, handleError, inProgressFrom, progressTo } from '@vality/ng-core'; import { getUnionKey } from '@vality/ng-thrift'; -import isEqual from 'lodash-es/isEqual'; import { BehaviorSubject, defer, Observable, of, ReplaySubject, filter, combineLatest } from 'rxjs'; import { map, shareReplay, startWith, switchMap, take, tap } from 'rxjs/operators'; import { DomainSecretService } from '../../../shared/services'; import { RepositoryService } from '../repository.service'; +import { createObjectHash } from '../utils/create-object-hash'; @Injectable({ providedIn: 'root', }) export class DomainStoreService { - version$ = combineLatest([defer(() => this.snapshot$), defer(() => this.progress$)]).pipe( - filter(([, p]) => !p), + domain$ = defer(() => this.rawDomain$).pipe( + map((d) => this.domainSecretService.reduceDomain(d)), + shareReplay({ refCount: true, bufferSize: 1 }), + ); + version$ = defer(() => this.loadedSnapshot$).pipe( map(([s]) => s.version), + shareReplay({ refCount: true, bufferSize: 1 }), ); isLoading$ = inProgressFrom( () => this.progress$, @@ -34,8 +38,23 @@ export class DomainStoreService { takeUntilDestroyed(this.destroyRef), shareReplay(1), ); + private loadedSnapshot$ = combineLatest([ + defer(() => this.snapshot$), + defer(() => this.progress$), + ]).pipe( + filter(([, p]) => !p), + shareReplay({ refCount: true, bufferSize: 1 }), + ); private reload$ = new ReplaySubject(1); private progress$ = new BehaviorSubject(0); + private rawDomain$ = this.loadedSnapshot$.pipe( + map(([s]) => s?.domain), + shareReplay({ refCount: true, bufferSize: 1 }), + ); + private objects$ = this.rawDomain$.pipe( + map((domain) => new Map(Array.from(domain).map(([r, d]) => [createObjectHash(r), d]))), + shareReplay({ refCount: true, bufferSize: 1 }), + ); constructor( private repositoryService: RepositoryService, @@ -48,17 +67,12 @@ export class DomainStoreService { this.reload$.next(); } - getDomain(raw = false): Observable { - return combineLatest([defer(() => this.snapshot$), defer(() => this.progress$)]).pipe( - filter(([, p]) => !p), - map(([s]) => s?.domain), - map((d) => (raw ? d : this.domainSecretService.reduceDomain(d))), - ); - } - getObject(ref: Reference, raw = false): Observable { - return this.getDomain(raw).pipe( - map((domain) => Array.from(domain).find(([r]) => isEqual(ref, r))?.[1]), + return this.objects$.pipe( + map((objects) => { + const res = objects.get(createObjectHash(ref)); + return raw || !this.domainSecretService.isExcludedObject(res) ? res : undefined; + }), ); } @@ -69,7 +83,7 @@ export class DomainStoreService { getObjectsRefs( objectType: T, ): Observable<[Reference, DomainObject][]> { - return this.getDomain().pipe( + return this.domain$.pipe( map((d) => Array.from(d).filter(([, o]) => getUnionKey(o) === objectType)), ); } diff --git a/src/app/api/domain-config/utils/create-object-hash.ts b/src/app/api/domain-config/utils/create-object-hash.ts new file mode 100644 index 00000000..a158dd3c --- /dev/null +++ b/src/app/api/domain-config/utils/create-object-hash.ts @@ -0,0 +1,5 @@ +import { toJson } from '@vality/ng-thrift'; + +export function createObjectHash(obj: unknown): string { + return JSON.stringify(toJson(obj)); +} diff --git a/src/app/sections/domain/domain-info/domain-objects-table/domain-objects-table.component.ts b/src/app/sections/domain/domain-info/domain-objects-table/domain-objects-table.component.ts index c9387c50..9aa7ecec 100644 --- a/src/app/sections/domain/domain-info/domain-objects-table/domain-objects-table.component.ts +++ b/src/app/sections/domain/domain-info/domain-objects-table/domain-objects-table.component.ts @@ -59,7 +59,7 @@ export class DomainObjectsTableComponent implements OnInit { (this.qp.params.types as (keyof DomainObject)[]) || [], ); objects$: Observable = combineLatest([ - this.domainStoreService.getDomain(), + this.domainStoreService.domain$, this.typesControl.valueChanges.pipe(startWith(this.typesControl.value)), ]).pipe( switchMap(([objects, types]) => diff --git a/src/app/sections/payments/components/payments-table/payments-table.component.ts b/src/app/sections/payments/components/payments-table/payments-table.component.ts index 6c3a77e4..bb316ac6 100644 --- a/src/app/sections/payments/components/payments-table/payments-table.component.ts +++ b/src/app/sections/payments/components/payments-table/payments-table.component.ts @@ -34,11 +34,10 @@ export class PaymentsTableComponent { { field: 'id', cell: (d) => ({ - value: `${d.invoice_id}.${d.id}`, click: () => this.toDetails(d), }), - sticky: 'start', }, + { field: 'invoice_id', sticky: 'start' }, { field: 'external_id' }, createCurrencyColumn((d) => ({ amount: d.amount, code: d.currency_symbolic_code }), { field: 'amount', diff --git a/src/app/shared/components/thrift-api-crud/domain/domain-object-card/domain-object-card.component.ts b/src/app/shared/components/thrift-api-crud/domain/domain-object-card/domain-object-card.component.ts index 4e7a3adb..2009b9eb 100644 --- a/src/app/shared/components/thrift-api-crud/domain/domain-object-card/domain-object-card.component.ts +++ b/src/app/shared/components/thrift-api-crud/domain/domain-object-card/domain-object-card.component.ts @@ -35,7 +35,7 @@ export class DomainObjectCardComponent implements OnChanges { ref$ = new ReplaySubject(1); progress$ = this.domainStoreService.isLoading$; - domainObject$ = combineLatest([this.domainStoreService.getDomain(), this.ref$]).pipe( + domainObject$ = combineLatest([this.domainStoreService.domain$, this.ref$]).pipe( map(([domain, ref]) => domain.get(Array.from(domain.keys()).find((k) => isEqualThrift(k, ref))), ), diff --git a/src/app/shared/components/thrift-api-crud/domain/utils/get-domain-object-details.ts b/src/app/shared/components/thrift-api-crud/domain/utils/get-domain-object-details.ts index b8c2dc02..4228c56b 100644 --- a/src/app/shared/components/thrift-api-crud/domain/utils/get-domain-object-details.ts +++ b/src/app/shared/components/thrift-api-crud/domain/utils/get-domain-object-details.ts @@ -1,6 +1,7 @@ import { DomainObject } from '@vality/domain-proto/domain'; import { inlineJson } from '@vality/ng-core'; import { getUnionKey, getUnionValue } from '@vality/ng-thrift'; +import isNil from 'lodash-es/isNil'; import startCase from 'lodash-es/startCase'; import { PickByValue, ValuesType } from 'utility-types'; @@ -81,7 +82,10 @@ export function getDomainObjectDetails(o: DomainObject): DomainObjectDetails { const result = getDomainObjectValueDetailsFn(getUnionKey(o))(getUnionValue(o)); return { id: result.id, - label: result.label || result.description || String(result.id) || startCase(getUnionKey(o)), + label: + result.label || + result.description || + `${startCase(getUnionKey(o))}${isNil(result.id) ? '' : ' ' + result.id}`, description: result.label ? result.description : '', type: startCase(getUnionKey(o)), }; diff --git a/src/app/shared/services/domain-secret-service/domain-secret.service.ts b/src/app/shared/services/domain-secret-service/domain-secret.service.ts index c1407ce9..c2f100ae 100644 --- a/src/app/shared/services/domain-secret-service/domain-secret.service.ts +++ b/src/app/shared/services/domain-secret-service/domain-secret.service.ts @@ -1,5 +1,6 @@ import { Injectable } from '@angular/core'; import { Domain, DomainObject } from '@vality/domain-proto/domain'; +import { getUnionKey } from '@vality/ng-thrift'; import { KeycloakService } from 'keycloak-angular'; import cloneDeep from 'lodash-es/cloneDeep'; import isNil from 'lodash-es/isNil'; @@ -21,6 +22,10 @@ export class DomainSecretService { constructor(private keycloakService: KeycloakService) {} + isExcludedObject(obj: DomainObject) { + return !this.hasDominantSecretRole && EXCLUDE_OBJECTS.includes(getUnionKey(obj)); + } + reduceDomain(domain: Domain): Domain { if (this.hasDominantSecretRole) { return domain; diff --git a/src/app/shared/utils/table2/create-currency-column.ts b/src/app/shared/utils/table2/create-currency-column.ts index 5bc7902e..1d6bdb91 100644 --- a/src/app/shared/utils/table2/create-currency-column.ts +++ b/src/app/shared/utils/table2/create-currency-column.ts @@ -1,7 +1,7 @@ import { inject } from '@angular/core'; import { createColumn } from '@vality/ng-core'; import isNil from 'lodash-es/isNil'; -import { of } from 'rxjs'; +import { of, concat, EMPTY } from 'rxjs'; import { map } from 'rxjs/operators'; import { AmountCurrencyService } from '../../services'; @@ -9,13 +9,19 @@ import { AmountCurrencyService } from '../../services'; export const createCurrencyColumn = createColumn( ({ amount, code }: { amount: number; code: string }) => { const amountCurrencyService = inject(AmountCurrencyService); - return (isNil(amount) ? of(undefined) : amountCurrencyService.toMajor(amount, code)).pipe( - map((value) => ({ - value, + if (isNil(amount)) { + return of(undefined); + } + return concat( + amount === 0 ? of(0) : EMPTY, + amountCurrencyService.getCurrency(code).pipe(map((c) => c?.data?.exponent)), + ).pipe( + map((exponent) => ({ + value: amount, type: 'currency', params: { code, - major: true, + exponent, }, })), ); diff --git a/src/app/shared/utils/table2/create-domain-object-column.ts b/src/app/shared/utils/table2/create-domain-object-column.ts index 63b5cec2..9994b906 100644 --- a/src/app/shared/utils/table2/create-domain-object-column.ts +++ b/src/app/shared/utils/table2/create-domain-object-column.ts @@ -1,7 +1,8 @@ import { inject } from '@angular/core'; import { Reference } from '@vality/domain-proto/internal/domain'; import { createColumn } from '@vality/ng-core'; -import { map } from 'rxjs/operators'; +import { getUnionKey, getUnionValue } from '@vality/ng-thrift'; +import { map, startWith } from 'rxjs/operators'; import { DomainStoreService } from '../../../api/domain-config'; import { SidenavInfoService } from '../../components/sidenav-info'; @@ -14,9 +15,12 @@ export const createDomainObjectColumn = createColumn(({ ref }: { ref: Reference return inject(DomainStoreService) .getObject(ref) .pipe( + startWith({ + [getUnionKey(ref)]: { ref: getUnionValue(ref), data: {} }, + }), map((obj) => ({ - value: getDomainObjectDetails(obj).label, - description: getDomainObjectDetails(obj).id, + value: getDomainObjectDetails(obj).label || '', + description: getDomainObjectDetails(obj).id || '', click: () => { inject(SidenavInfoService).toggle(DomainObjectCardComponent, { ref }); }, diff --git a/src/app/shared/utils/table2/create-party-column.ts b/src/app/shared/utils/table2/create-party-column.ts index 9ada46fe..c85ec26b 100644 --- a/src/app/shared/utils/table2/create-party-column.ts +++ b/src/app/shared/utils/table2/create-party-column.ts @@ -2,7 +2,7 @@ import { inject } from '@angular/core'; import { Router } from '@angular/router'; import { createColumn } from '@vality/ng-core'; import { of } from 'rxjs'; -import { map } from 'rxjs/operators'; +import { map, startWith } from 'rxjs/operators'; import { PartiesStoreService } from '../../../api/payment-processing'; @@ -13,7 +13,10 @@ export const createPartyColumn = createColumn( ? of(params.partyName) : inject(PartiesStoreService) .get(id) - .pipe(map((party) => party.contact_info.registration_email)); + .pipe( + map((party) => party.contact_info.registration_email), + startWith(''), + ); return partyName$.pipe( map((partyName) => ({ value: partyName,