diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 763e62539..95b5fba70 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -23,13 +23,13 @@ "@start9labs/argon2": "^0.1.0", "@start9labs/emver": "^0.1.5", "@start9labs/start-sdk": "0.4.0-rev0.lib0.rc8.beta2", - "@taiga-ui/addon-charts": "3.49.1", - "@taiga-ui/cdk": "3.49.1", - "@taiga-ui/core": "3.49.1", - "@taiga-ui/experimental": "3.491.1-canary.5e01f6f\n", - "@taiga-ui/icons": "3.49.1", - "@taiga-ui/kit": "3.49.1", - "@taiga-ui/styles": "3.49.1", + "@taiga-ui/addon-charts": "3.52.0", + "@taiga-ui/cdk": "3.52.0", + "@taiga-ui/core": "3.52.0", + "@taiga-ui/experimental": "3.52.0", + "@taiga-ui/icons": "3.52.0", + "@taiga-ui/kit": "3.52.0", + "@taiga-ui/styles": "3.52.0", "@tinkoff/ng-dompurify": "4.0.0", "ansi-to-html": "^0.7.2", "base64-js": "^1.5.1", @@ -3670,9 +3670,9 @@ "dev": true }, "node_modules/@maskito/angular": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@maskito/angular/-/angular-1.7.0.tgz", - "integrity": "sha512-RcBEXkuUf5zyaNQZv26LxOZ2DrILR34Ci1OWRaeI0JfHSslKdMlbQMdWXvGKga6ChGY5Sfl64AsmQ1D2kMvGlQ==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@maskito/angular/-/angular-1.8.1.tgz", + "integrity": "sha512-iT9/YK+lTRd8ofU1Qd2pJHofshi/QnSGXS9MBIjt8Mk034pLCYutB5ua+2kiZYMdPk7kyuaSXYZOSL/Pt5cBuA==", "dependencies": { "tslib": "2.6.2" }, @@ -3680,21 +3680,21 @@ "@angular/common": ">=12.0.0", "@angular/core": ">=12.0.0", "@angular/forms": ">=12.0.0", - "@maskito/core": "^1.7.0", + "@maskito/core": "^1.8.1", "rxjs": ">=6.0.0" } }, "node_modules/@maskito/core": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@maskito/core/-/core-1.7.0.tgz", - "integrity": "sha512-sjdv1MSJnWWor/Qy1u1+ZZtqejzfVt6zqMUfy5RToEPZSBWlsCg1JSfjRu9WRb3yirpZnj3j80JkTGCicFrvuw==" + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@maskito/core/-/core-1.8.1.tgz", + "integrity": "sha512-h9+Z91WASHQ6z6kDP7uIHyMUPxNwA1mOIPsFxdg2MHq1RASFUNKHj66uU5xuR0OJu17qcCCzUu7ixZ43QQ/HYg==" }, "node_modules/@maskito/kit": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@maskito/kit/-/kit-1.7.0.tgz", - "integrity": "sha512-LX/ngWFnPKWnQfvU9m5fss8NIBO261DlQdXOtlbhoXgyscVoR8RVeUHRVuRKEhJgd1I+dvlP1vUxms2qltFTjw==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@maskito/kit/-/kit-1.8.1.tgz", + "integrity": "sha512-eevH2iyqRjxw8kzt7gmLETrlkPTj4Mq1mbIOOD2VQ+O33ocNFl1a87s02mRQGk6UmSJBmHLT/2EaVfUEswBmWA==", "peerDependencies": { - "@maskito/core": "^1.7.0" + "@maskito/core": "^1.8.1" } }, "node_modules/@materia-ui/ngx-monaco-editor": { @@ -3710,9 +3710,9 @@ } }, "node_modules/@ng-web-apis/common": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@ng-web-apis/common/-/common-3.0.3.tgz", - "integrity": "sha512-CJm/NYQ4JrN0qNVbPcKeRnZ5nL0zL6RrJrNwBW/LnZEGp9t0mxgLYKw52fM4xRm0OVXOXoRwCbjr8gSUD6vstQ==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@ng-web-apis/common/-/common-3.0.5.tgz", + "integrity": "sha512-rCaOxTKNQ0w0SFeH1Zdw+D8s2igE1QKRdVKDgAeZ7i4utQlSJWHP3de4k4lVEFM1cRiJh3Oq6QX2IOuLrgxEdw==", "dependencies": { "tslib": "^2.2.0" }, @@ -3723,9 +3723,9 @@ } }, "node_modules/@ng-web-apis/intersection-observer": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@ng-web-apis/intersection-observer/-/intersection-observer-3.1.3.tgz", - "integrity": "sha512-mGxUcPOJ/y8oXY85c9k2UnZpGElu1wgAwN66brfFNKswwCYM8GLbrIOm0Zsdb6vyJiNFgaoZ+tG+dEZPobCzGQ==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@ng-web-apis/intersection-observer/-/intersection-observer-3.1.5.tgz", + "integrity": "sha512-+79rkKa7Ce1h6qcnDxvNITIjMjnVSaHZ1TlR5y57cOWhh2kyX5bBwgBx+lTa702o27oO3HOYrS3YnJidDiiPsQ==", "dependencies": { "tslib": "^2.2.0" }, @@ -3735,9 +3735,9 @@ } }, "node_modules/@ng-web-apis/mutation-observer": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@ng-web-apis/mutation-observer/-/mutation-observer-3.0.3.tgz", - "integrity": "sha512-gl2OGn7+N8w0VuBLzGP5Ypw2nMqbnV3TgNdnQSyCC5I7+3Rz/Q3OzQqciTNUPAqd5HWWwW/IKFPvgI6ePYWXog==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@ng-web-apis/mutation-observer/-/mutation-observer-3.0.5.tgz", + "integrity": "sha512-pr8cxdNa+6VwZDAt7SWKrsuxr1yaTvbct9KG0dONl7zFLQf6n6yvpwgNTOz/PZQyReQxn8W7eHKPo4Q0aAwy/g==", "dependencies": { "tslib": "^2.2.0" }, @@ -3747,9 +3747,9 @@ } }, "node_modules/@ng-web-apis/resize-observer": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@ng-web-apis/resize-observer/-/resize-observer-3.0.3.tgz", - "integrity": "sha512-2EVqcl/HTzObQmIgtXEs2KHrPUXC8r6ePPfbAAUbuVdlDAZm6vKsXYHvH+Zkm/JKNp1MZJb/3kb6UkkZtf8ewA==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@ng-web-apis/resize-observer/-/resize-observer-3.0.5.tgz", + "integrity": "sha512-nmOpNL7c+RAxsnsmF2TvSuyWGQMqCTJ7MYVzSrDdNDFVqkEX5yQGu0UC+JM/8sEBcePjqju6OkJDWOLGF7uhOQ==", "dependencies": { "tslib": "^2.2.0" }, @@ -4133,9 +4133,9 @@ } }, "node_modules/@taiga-ui/addon-charts": { - "version": "3.49.1", - "resolved": "https://registry.npmjs.org/@taiga-ui/addon-charts/-/addon-charts-3.49.1.tgz", - "integrity": "sha512-Y2b421JSEOboB+wbLcf0uPeYWGtMtc4ZmqSF4cT8DPB8vA8QsG2HWj+JrOVjwnsryiuTieiFHE3txk1w4sjTVA==", + "version": "3.52.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/addon-charts/-/addon-charts-3.52.0.tgz", + "integrity": "sha512-qu2p6Uo5qMTdh1hfnEB4xLHF0vsOw2YhDcq1bcqNWmI6Su2K090P2lsd9mCNyNHWAIrejjcCqBKRwJDopVm0hw==", "dependencies": { "tslib": ">=2.0.0" }, @@ -4143,25 +4143,51 @@ "@angular/common": ">=12.0.0", "@angular/core": ">=12.0.0", "@ng-web-apis/common": ">=3.0.0", - "@taiga-ui/cdk": ">=3.49.1", - "@taiga-ui/core": ">=3.49.1", + "@taiga-ui/cdk": ">=3.52.0", + "@taiga-ui/core": ">=3.52.0", "@tinkoff/ng-polymorpheus": ">=4.0.0" } }, - "node_modules/@taiga-ui/cdk": { - "version": "3.49.1", - "resolved": "https://registry.npmjs.org/@taiga-ui/cdk/-/cdk-3.49.1.tgz", - "integrity": "sha512-Mo+o/ey7WJYvXh/4hQiUca0VRVmGtEn13PMWY+wAE+243F8KeoMca/CGpzV3DhpK3WTUbFyURvmNV0pR78Qmzw==", + "node_modules/@taiga-ui/addon-commerce": { + "version": "3.52.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/addon-commerce/-/addon-commerce-3.52.0.tgz", + "integrity": "sha512-4oRmYhTsaN34L37MpwLder8eF3/WgsP/36qQWxsyhKCRN+H/ltpw7Yp16JO0Tg+nkj0ErtGOzZ4vZMl4+xJnAA==", + "peer": true, "dependencies": { - "@ng-web-apis/common": "3.0.3", - "@ng-web-apis/mutation-observer": "3.0.3", - "@ng-web-apis/resize-observer": "3.0.3", + "tslib": ">=2.0.0" + }, + "peerDependencies": { + "@angular/common": ">=12.0.0", + "@angular/core": ">=12.0.0", + "@angular/forms": ">=12.0.0", + "@maskito/angular": ">=1.3.0", + "@maskito/core": ">=1.3.0", + "@maskito/kit": ">=1.3.0", + "@ng-web-apis/common": ">=3.0.0", + "@taiga-ui/cdk": ">=3.52.0", + "@taiga-ui/core": ">=3.52.0", + "@taiga-ui/i18n": ">=3.52.0", + "@taiga-ui/kit": ">=3.52.0", + "@tinkoff/ng-polymorpheus": ">=4.0.0", + "rxjs": ">=6.0.0" + } + }, + "node_modules/@taiga-ui/cdk": { + "version": "3.52.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/cdk/-/cdk-3.52.0.tgz", + "integrity": "sha512-fZ9HGUu1rpJXf9yq8SH0K5qLugErtaoCQErGd0Waa6zEV9jb0bm4XoCwSAUKTAUutJ1iQCzj34F5oDoDTG2ydA==", + "dependencies": { + "@angular-devkit/schematics": "12.2.18", + "@ng-web-apis/common": "3.0.5", + "@ng-web-apis/mutation-observer": "3.0.5", + "@ng-web-apis/resize-observer": "3.0.5", + "@schematics/angular": "12.2.18", "@tinkoff/ng-event-plugins": "3.1.0", "@tinkoff/ng-polymorpheus": "4.2.0", "tslib": "2.6.2" }, "optionalDependencies": { - "ng-morph": "2.2.5", + "ng-morph": "4.0.0", "parse5": "6.0.1" }, "peerDependencies": { @@ -4172,12 +4198,144 @@ "rxjs": ">=6.0.0" } }, - "node_modules/@taiga-ui/core": { - "version": "3.49.1", - "resolved": "https://registry.npmjs.org/@taiga-ui/core/-/core-3.49.1.tgz", - "integrity": "sha512-rup9I5GVtbv5QNGj6jw2w1J2sHPRLwlmokI+/ceTzTlL4h1SvwH0vNm1hcQu4/nlsoYE4m3f8TyXs/1rM3lzxw==", + "node_modules/@taiga-ui/cdk/node_modules/@angular-devkit/core": { + "version": "12.2.18", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-12.2.18.tgz", + "integrity": "sha512-GDLHGe9HEY5SRS+NrKr14C8aHsRCiBFkBFSSbeohgLgcgSXzZHFoU84nDWrl3KZNP8oqcUSv5lHu6dLcf2fnww==", "dependencies": { - "@taiga-ui/i18n": "^3.49.1", + "ajv": "8.6.2", + "ajv-formats": "2.1.0", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.6.7", + "source-map": "0.7.3" + }, + "engines": { + "node": "^12.14.1 || >=14.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@taiga-ui/cdk/node_modules/@angular-devkit/core/node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/@taiga-ui/cdk/node_modules/@angular-devkit/core/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@taiga-ui/cdk/node_modules/@angular-devkit/schematics": { + "version": "12.2.18", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-12.2.18.tgz", + "integrity": "sha512-bZ9NS5PgoVfetRC6WeQBHCY5FqPZ9y2TKHUo12sOB2YSL3tgWgh1oXyP8PtX34gasqsLjNULxEQsAQYEsiX/qQ==", + "dependencies": { + "@angular-devkit/core": "12.2.18", + "ora": "5.4.1", + "rxjs": "6.6.7" + }, + "engines": { + "node": "^12.14.1 || >=14.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@taiga-ui/cdk/node_modules/@angular-devkit/schematics/node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/@taiga-ui/cdk/node_modules/@angular-devkit/schematics/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@taiga-ui/cdk/node_modules/@schematics/angular": { + "version": "12.2.18", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-12.2.18.tgz", + "integrity": "sha512-niRS9Ly9y8uI0YmTSbo8KpdqCCiZ/ATMZWeS2id5M8JZvfXbngwiqJvojdSol0SWU+n1W4iA+lJBdt4gSKlD5w==", + "dependencies": { + "@angular-devkit/core": "12.2.18", + "@angular-devkit/schematics": "12.2.18", + "jsonc-parser": "3.0.0" + }, + "engines": { + "node": "^12.14.1 || >=14.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@taiga-ui/cdk/node_modules/ajv": { + "version": "8.6.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.2.tgz", + "integrity": "sha512-9807RlWAgT564wT+DjeyU5OFMPjmzxVobvDFmNAhY+5zD6A2ly3jDp6sgnfyDtlIQ+7H97oc/DGCzzfu9rjw9w==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@taiga-ui/cdk/node_modules/ajv-formats": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.0.tgz", + "integrity": "sha512-USH2jBb+C/hIpwD2iRjp0pe0k+MvzG0mlSn/FIdCgQhUb9ALPRjt2KIQdfZDS9r0ZIeUAg7gOu9KL0PFqGqr5Q==", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/@taiga-ui/cdk/node_modules/jsonc-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz", + "integrity": "sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==" + }, + "node_modules/@taiga-ui/cdk/node_modules/magic-string": { + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", + "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", + "dependencies": { + "sourcemap-codec": "^1.4.4" + } + }, + "node_modules/@taiga-ui/cdk/node_modules/source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@taiga-ui/core": { + "version": "3.52.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/core/-/core-3.52.0.tgz", + "integrity": "sha512-KstWj5idjABd4qj7kvv7qRRRCogGKlT90LaAHZ/ha6sR8/nLDXtLcLJkLrWSSI6LFQXXTLtj/SDeMxdMvkCTSw==", + "dependencies": { + "@taiga-ui/i18n": "^3.52.0", "tslib": ">=2.0.0" }, "peerDependencies": { @@ -4189,34 +4347,35 @@ "@angular/router": ">=12.0.0", "@ng-web-apis/common": ">=3.0.0", "@ng-web-apis/mutation-observer": ">=3.0.0", - "@taiga-ui/cdk": ">=3.49.1", - "@taiga-ui/i18n": ">=3.49.1", + "@taiga-ui/cdk": ">=3.52.0", + "@taiga-ui/i18n": ">=3.52.0", "@tinkoff/ng-event-plugins": ">=3.1.0", "@tinkoff/ng-polymorpheus": ">=4.0.0", "rxjs": ">=6.0.0" } }, "node_modules/@taiga-ui/experimental": { - "version": "3.491.1-canary.5e01f6f", - "resolved": "https://registry.npmjs.org/@taiga-ui/experimental/-/experimental-3.491.1-canary.5e01f6f.tgz", - "integrity": "sha512-bQCGK8DKYzMZ+0SZNJkplmZ/EhyJoaWsQk0F/P/WefA6SrjupHTUq3K35P1hT1Ixr0vADONOcEDFd5DgziTZ5g==", + "version": "3.52.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/experimental/-/experimental-3.52.0.tgz", + "integrity": "sha512-oql9ctZ0eXeQ6f4n525sL4xI2N5r9+qu4sEvuJaS9Qv008hyxKdgdqLRB4CmG4qIphfukHm2Q1cU+lsDM7+ENg==", "dependencies": { "tslib": ">=2.0.0" }, "peerDependencies": { "@angular/common": ">=12.0.0", "@angular/core": ">=12.0.0", - "@taiga-ui/cdk": ">=3.49.1", - "@taiga-ui/core": ">=3.49.1", - "@taiga-ui/kit": ">=3.49.1", + "@taiga-ui/addon-commerce": ">=3.52.0", + "@taiga-ui/cdk": ">=3.52.0", + "@taiga-ui/core": ">=3.52.0", + "@taiga-ui/kit": ">=3.52.0", "@tinkoff/ng-polymorpheus": ">=4.0.0", "rxjs": ">=6.0.0" } }, "node_modules/@taiga-ui/i18n": { - "version": "3.49.1", - "resolved": "https://registry.npmjs.org/@taiga-ui/i18n/-/i18n-3.49.1.tgz", - "integrity": "sha512-x85DI7iuMUlKbvH+M/kuyYT7jmaV2ILxFXeCjrLs93iHilLisF3o9Zz+z+2pKgyjkBdnx0t2M3Bme2J3N6mXYA==", + "version": "3.52.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/i18n/-/i18n-3.52.0.tgz", + "integrity": "sha512-182Yf1QQXEjKSqEScuH01DZMBIyCa2/yOe6qtvmlAHjl67DRjaajtd0N7ehrNl8C9TyN4HsAbcGRtyMP0/0xgQ==", "dependencies": { "tslib": ">=2.0.0" }, @@ -4227,25 +4386,25 @@ } }, "node_modules/@taiga-ui/icons": { - "version": "3.49.1", - "resolved": "https://registry.npmjs.org/@taiga-ui/icons/-/icons-3.49.1.tgz", - "integrity": "sha512-TVllWirA7FIaGMGJuQqEPG5NbGvbxuxJaq7oNGV88+mBLaZtMIsIuWrG+ojCCwYYN+AztDFcfwG1BtSEpaGqww==", + "version": "3.52.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/icons/-/icons-3.52.0.tgz", + "integrity": "sha512-0DjCqzCgk5FGh64NCf1tNgbXVR8TEVn9kUyhdaoEVd3K38eVyKtx/6DWjB0oV5+a1ZG1uq+oP6ixNurC4C6x8g==", "dependencies": { "tslib": ">=2.0.0" }, "peerDependencies": { - "@taiga-ui/cdk": ">=3.49.1" + "@taiga-ui/cdk": ">=3.52.0" } }, "node_modules/@taiga-ui/kit": { - "version": "3.49.1", - "resolved": "https://registry.npmjs.org/@taiga-ui/kit/-/kit-3.49.1.tgz", - "integrity": "sha512-CwK3iWXQsgx8Hn5yIc42ndZbtm2oS5C5byo40B8ex+vYQeoOj7NTRmrBJ/XIhWi66vpSbbYY7+d8b/5g6vgfXg==", + "version": "3.52.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/kit/-/kit-3.52.0.tgz", + "integrity": "sha512-T5DR6Np7RiMGX+xMmeGisCc33Js5X2nztObW5VfprU3C7eCp15Z7rw3J3+NdJtf90IJ4EijcbEP8HPxE2sJIVQ==", "dependencies": { - "@maskito/angular": "1.7.0", - "@maskito/core": "1.7.0", - "@maskito/kit": "1.7.0", - "@ng-web-apis/intersection-observer": "3.1.3", + "@maskito/angular": "1.8.1", + "@maskito/core": "1.8.1", + "@maskito/kit": "1.8.1", + "@ng-web-apis/intersection-observer": "3.1.5", "text-mask-core": "5.1.2", "tslib": ">=2.0.0" }, @@ -4257,19 +4416,19 @@ "@ng-web-apis/common": ">=3.0.0", "@ng-web-apis/mutation-observer": ">=3.0.0", "@ng-web-apis/resize-observer": ">=3.0.0", - "@taiga-ui/cdk": ">=3.49.1", - "@taiga-ui/core": ">=3.49.1", - "@taiga-ui/i18n": ">=3.49.1", + "@taiga-ui/cdk": ">=3.52.0", + "@taiga-ui/core": ">=3.52.0", + "@taiga-ui/i18n": ">=3.52.0", "@tinkoff/ng-polymorpheus": ">=4.0.0", "rxjs": ">=6.0.0" } }, "node_modules/@taiga-ui/styles": { - "version": "3.49.1", - "resolved": "https://registry.npmjs.org/@taiga-ui/styles/-/styles-3.49.1.tgz", - "integrity": "sha512-J1SEVKY/UUyM97M7HyzMbgbmRS3EZwqeTyRStezejpg/kBJrbOQaBx76cUCoBvVJ6PZ5S5N/AapnrutW1RTkfg==", + "version": "3.52.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/styles/-/styles-3.52.0.tgz", + "integrity": "sha512-VabK+8cV2DErI8cENyy2u/xjX2U0bg8J0fL/A9PrCu8LS9VZGXuH7m7AbMbo05ADpmkqDYDt9N0eBzik3+pVxw==", "peerDependencies": { - "@taiga-ui/cdk": ">=3.49.1", + "@taiga-ui/cdk": ">=3.52.0", "tslib": ">=2.0.0" } }, @@ -4322,17 +4481,56 @@ } }, "node_modules/@ts-morph/common": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.9.2.tgz", - "integrity": "sha512-IPyg+c3Am0EBoa63W0f/AKeLrJhvzMzQ4BIvD1baxLopmiHOj1HFTXYxC6e8iTZ+UYtN+/WFM9UyGRnoA20b8g==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.20.0.tgz", + "integrity": "sha512-7uKjByfbPpwuzkstL3L5MQyuXPSKdoNG93Fmi2JoDcTf3pEP731JdRFAduRVkOs8oqxPsXKA+ScrWkdQ8t/I+Q==", "optional": true, "dependencies": { - "fast-glob": "^3.2.5", - "minimatch": "^3.0.4", - "mkdirp": "^1.0.4", + "fast-glob": "^3.2.12", + "minimatch": "^7.4.3", + "mkdirp": "^2.1.6", "path-browserify": "^1.0.1" } }, + "node_modules/@ts-morph/common/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "optional": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@ts-morph/common/node_modules/minimatch": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.6.tgz", + "integrity": "sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==", + "optional": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@ts-morph/common/node_modules/mkdirp": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-2.1.6.tgz", + "integrity": "sha512-+hEnITedc8LAtIP9u3HJDFIdcLV2vXP33sqLLIzkv1Db1zO/1OxbvYf0Y1OC/S/Qo5dxHXepofhmxL02PsKe+A==", + "optional": true, + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@tsconfig/node10": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", @@ -6110,9 +6308,9 @@ } }, "node_modules/code-block-writer": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-10.1.1.tgz", - "integrity": "sha512-67ueh2IRGst/51p0n6FvPrnRjAGHY5F8xdjkgrYE7DDzpJe6qA07RYQ9VcoUeo5ATOjSOiWpSL3SWBRRbempMw==", + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-12.0.0.tgz", + "integrity": "sha512-q4dMFMlXtKR3XNBHyMHt/3pwYNA69EDk00lloMOaaUMKPUXBw6lpXtbu3MMVG6/uOihGnRDOlkyqsONEUj60+w==", "optional": true }, "node_modules/color-convert": { @@ -7675,8 +7873,7 @@ "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, "node_modules/fast-levenshtein": { "version": "2.0.6", @@ -11069,25 +11266,78 @@ } }, "node_modules/ng-morph": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/ng-morph/-/ng-morph-2.2.5.tgz", - "integrity": "sha512-plxrHfcz7aNRcTCxS9tUxI1F5Vfx5CZAAw8NAnJCyCb41Js6S+EyPDvn2v7H2QyfZzXU1H0BAqtiRQv/rE2zTA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/ng-morph/-/ng-morph-4.0.0.tgz", + "integrity": "sha512-+opfMF/33fMQRt38oSPT+fnexZm8c635LaTDKOlAnkaDGRWcOM4EllqLf73m+5+D8gurwYXOkimIzj6Jmpx1cA==", "optional": true, "dependencies": { - "jsonc-parser": "3.0.0", - "minimatch": "3.0.5", + "jsonc-parser": "3.2.0", + "minimatch": "9.0.1", "multimatch": "5.0.0", - "ts-morph": "10.0.2" + "semver": "7.4.0", + "ts-morph": "19.0.0" }, "peerDependencies": { "@angular-devkit/core": ">=11.0.0", - "@angular-devkit/schematics": ">=11.0.0" + "@angular-devkit/schematics": ">=11.0.0", + "tslib": "2.5.3" } }, - "node_modules/ng-morph/node_modules/jsonc-parser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz", - "integrity": "sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==", + "node_modules/ng-morph/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "optional": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/ng-morph/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "optional": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ng-morph/node_modules/minimatch": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz", + "integrity": "sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==", + "optional": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ng-morph/node_modules/semver": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.4.0.tgz", + "integrity": "sha512-RgOxM8Mw+7Zus0+zcLEUn8+JfoLpj/huFTItQy2hsM4khuC1HYRDp0cU482Ewn/Fcy6bCjufD8vAj7voC66KQw==", + "optional": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ng-morph/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "optional": true }, "node_modules/ng-packagr": { @@ -14608,6 +14858,12 @@ "node": ">=0.10.0" } }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "deprecated": "Please use @jridgewell/sourcemap-codec instead" + }, "node_modules/spdx-correct": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", @@ -15294,13 +15550,13 @@ "integrity": "sha512-kXrY75F0s0WD15N2bWKDScKlKgwnusN6dTRzGs1N7LlxQRnazrsBISC1HL4sy2adsyk65Zbx3Ui3IGN8leAFOQ==" }, "node_modules/ts-morph": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-10.0.2.tgz", - "integrity": "sha512-TVuIfEqtr9dW25K3Jajqpqx7t/zLRFxKu2rXQZSDjTm4MO4lfmuj1hn8WEryjeDDBFcNOCi+yOmYUYR4HucrAg==", + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-19.0.0.tgz", + "integrity": "sha512-D6qcpiJdn46tUqV45vr5UGM2dnIEuTGNxVhg0sk5NX11orcouwj6i1bMqZIz2mZTZB1Hcgy7C3oEVhAT+f6mbQ==", "optional": true, "dependencies": { - "@ts-morph/common": "~0.9.0", - "code-block-writer": "^10.1.1" + "@ts-morph/common": "~0.20.0", + "code-block-writer": "^12.0.0" } }, "node_modules/ts-node": { diff --git a/frontend/package.json b/frontend/package.json index d3f6d2edb..1a0980626 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -44,13 +44,13 @@ "@materia-ui/ngx-monaco-editor": "^6.0.0", "@start9labs/argon2": "^0.1.0", "@start9labs/emver": "^0.1.5", - "@taiga-ui/addon-charts": "3.49.1", - "@taiga-ui/cdk": "3.49.1", - "@taiga-ui/core": "3.49.1", - "@taiga-ui/experimental": "3.491.1-canary.5e01f6f\n", - "@taiga-ui/icons": "3.49.1", - "@taiga-ui/kit": "3.49.1", - "@taiga-ui/styles": "3.49.1", + "@taiga-ui/addon-charts": "3.52.0", + "@taiga-ui/cdk": "3.52.0", + "@taiga-ui/core": "3.52.0", + "@taiga-ui/experimental": "3.52.0", + "@taiga-ui/icons": "3.52.0", + "@taiga-ui/kit": "3.52.0", + "@taiga-ui/styles": "3.52.0", "@tinkoff/ng-dompurify": "4.0.0", "ansi-to-html": "^0.7.2", "base64-js": "^1.5.1", diff --git a/frontend/projects/marketplace/src/pages/show/package/package.component.html b/frontend/projects/marketplace/src/pages/show/package/package.component.html index 6007ce65b..cec0c1f95 100644 --- a/frontend/projects/marketplace/src/pages/show/package/package.component.html +++ b/frontend/projects/marketplace/src/pages/show/package/package.component.html @@ -1,11 +1,9 @@ -
- -
-

{{ pkg.manifest.title }}

-

{{ pkg.manifest.version | displayEmver }}

-

- Released: {{ published | date : 'medium' }} -

- -
+ +
+

{{ pkg.manifest.title }}

+

{{ pkg.manifest.version | displayEmver }}

+

+ Released: {{ published | date : 'medium' }} +

+
diff --git a/frontend/projects/marketplace/src/pages/show/package/package.component.scss b/frontend/projects/marketplace/src/pages/show/package/package.component.scss index 9e75cfd41..52859a076 100644 --- a/frontend/projects/marketplace/src/pages/show/package/package.component.scss +++ b/frontend/projects/marketplace/src/pages/show/package/package.component.scss @@ -1,7 +1,8 @@ -.header { +:host { display: flex; align-items: flex-start; padding: 16px; + line-height: 2; } .text { diff --git a/frontend/projects/marketplace/src/pipes/mime-type.pipe.ts b/frontend/projects/marketplace/src/pipes/mime-type.pipe.ts index a0dc14a00..14715ec29 100644 --- a/frontend/projects/marketplace/src/pipes/mime-type.pipe.ts +++ b/frontend/projects/marketplace/src/pipes/mime-type.pipe.ts @@ -6,6 +6,8 @@ import { MarketplacePkg } from '../types' }) export class MimeTypePipe implements PipeTransform { transform(pkg: MarketplacePkg): string { + if (pkg.icon.startsWith('data:')) return pkg.icon + if (pkg.manifest.assets.icon) { switch (pkg.manifest.assets.icon.split('.').pop()) { case 'png': diff --git a/frontend/projects/shared/styles/taiga.scss b/frontend/projects/shared/styles/taiga.scss index ed482baf7..ea9cd857b 100644 --- a/frontend/projects/shared/styles/taiga.scss +++ b/frontend/projects/shared/styles/taiga.scss @@ -39,6 +39,13 @@ color: var(--tui-error-fill); } +[tuiWrapper][data-appearance='input-file'] { + &:hover, + &:active { + background: transparent !important; + } +} + tui-dialog { transform: translate3d(0, 0, 0); } diff --git a/frontend/projects/ui/src/app/app.providers.ts b/frontend/projects/ui/src/app/app.providers.ts index eb4515ad7..e6b52a1f6 100644 --- a/frontend/projects/ui/src/app/app.providers.ts +++ b/frontend/projects/ui/src/app/app.providers.ts @@ -4,10 +4,10 @@ import { Router, RouteReuseStrategy } from '@angular/router' import { IonicRouteStrategy, IonNav } from '@ionic/angular' import { TUI_DATE_FORMAT, TUI_DATE_SEPARATOR } from '@taiga-ui/cdk' import { - tuiButtonOptionsProvider, tuiNumberFormatProvider, tuiTextfieldOptionsProvider, } from '@taiga-ui/core' +import { tuiButtonOptionsProvider } from '@taiga-ui/experimental' import { TUI_DATE_TIME_VALUE_TRANSFORMER, TUI_DATE_VALUE_TRANSFORMER, diff --git a/frontend/projects/ui/src/app/app/snek/snek.module.ts b/frontend/projects/ui/src/app/app/snek/snek.module.ts index 8bb81a01e..a678b8395 100644 --- a/frontend/projects/ui/src/app/app/snek/snek.module.ts +++ b/frontend/projects/ui/src/app/app/snek/snek.module.ts @@ -1,10 +1,10 @@ import { NgModule } from '@angular/core' import { CommonModule } from '@angular/common' import { IonicModule } from '@ionic/angular' +import { TuiButtonModule } from '@taiga-ui/experimental' import { SnekDirective } from './snek.directive' import { SnakePage } from './snake.page' -import { TuiButtonModule } from '@taiga-ui/core' @NgModule({ imports: [CommonModule, IonicModule, TuiButtonModule], diff --git a/frontend/projects/ui/src/app/apps/diagnostic/home/home.module.ts b/frontend/projects/ui/src/app/apps/diagnostic/home/home.module.ts index 62f6394e5..530fccaa2 100644 --- a/frontend/projects/ui/src/app/apps/diagnostic/home/home.module.ts +++ b/frontend/projects/ui/src/app/apps/diagnostic/home/home.module.ts @@ -1,7 +1,7 @@ import { NgModule } from '@angular/core' import { CommonModule } from '@angular/common' import { RouterModule, Routes } from '@angular/router' -import { TuiButtonModule } from '@taiga-ui/core' +import { TuiButtonModule } from '@taiga-ui/experimental' import { HomePage } from './home.page' const ROUTES: Routes = [ diff --git a/frontend/projects/ui/src/app/apps/portal/components/card/card.component.html b/frontend/projects/ui/src/app/apps/portal/components/card/card.component.html index d6da51049..17f8fe9f2 100644 --- a/frontend/projects/ui/src/app/apps/portal/components/card/card.component.html +++ b/frontend/projects/ui/src/app/apps/portal/components/card/card.component.html @@ -24,9 +24,9 @@ diff --git a/frontend/projects/ui/src/app/apps/portal/components/card/card.component.ts b/frontend/projects/ui/src/app/apps/portal/components/card/card.component.ts index 06ac33daa..df7b39038 100644 --- a/frontend/projects/ui/src/app/apps/portal/components/card/card.component.ts +++ b/frontend/projects/ui/src/app/apps/portal/components/card/card.component.ts @@ -9,11 +9,11 @@ import { import { TuiBadgedContentModule, TuiBadgeNotificationModule, + TuiButtonModule, } from '@taiga-ui/experimental' import { RouterLink } from '@angular/router' import { TickerModule } from '@start9labs/shared' import { - TuiButtonModule, TuiDataListModule, TuiHostedDropdownModule, TuiSvgModule, diff --git a/frontend/projects/ui/src/app/apps/portal/components/header/header-menu/header-menu.component.ts b/frontend/projects/ui/src/app/apps/portal/components/header/header-menu/header-menu.component.ts index 4d7483e40..5a08d4ba9 100644 --- a/frontend/projects/ui/src/app/apps/portal/components/header/header-menu/header-menu.component.ts +++ b/frontend/projects/ui/src/app/apps/portal/components/header/header-menu/header-menu.component.ts @@ -1,10 +1,10 @@ import { ChangeDetectionStrategy, Component, inject } from '@angular/core' import { - TuiButtonModule, TuiDataListModule, TuiHostedDropdownModule, TuiSvgModule, } from '@taiga-ui/core' +import { TuiButtonModule } from '@taiga-ui/experimental' import { ApiService } from 'src/app/services/api/embassy-api.service' import { AuthService } from 'src/app/services/auth.service' diff --git a/frontend/projects/ui/src/app/apps/portal/components/header/header.component.html b/frontend/projects/ui/src/app/apps/portal/components/header/header.component.html index f6f904187..5a0c60aa5 100644 --- a/frontend/projects/ui/src/app/apps/portal/components/header/header.component.html +++ b/frontend/projects/ui/src/app/apps/portal/components/header/header.component.html @@ -1,10 +1,11 @@
- - - diff --git a/frontend/projects/ui/src/app/apps/portal/components/header/header.component.ts b/frontend/projects/ui/src/app/apps/portal/components/header/header.component.ts index c8005f68d..1ef1c3005 100644 --- a/frontend/projects/ui/src/app/apps/portal/components/header/header.component.ts +++ b/frontend/projects/ui/src/app/apps/portal/components/header/header.component.ts @@ -1,11 +1,14 @@ import { ChangeDetectionStrategy, Component } from '@angular/core' -import { TuiBadgedContentModule } from '@taiga-ui/kit' import { - TuiButtonModule, TuiDataListModule, TuiHostedDropdownModule, TuiSvgModule, } from '@taiga-ui/core' +import { + TuiBadgedContentModule, + TuiBadgeNotificationModule, + TuiButtonModule, +} from '@taiga-ui/experimental' import { HeaderMenuComponent } from './header-menu/header-menu.component' @Component({ @@ -16,6 +19,7 @@ import { HeaderMenuComponent } from './header-menu/header-menu.component' changeDetection: ChangeDetectionStrategy.OnPush, imports: [ TuiBadgedContentModule, + TuiBadgeNotificationModule, TuiButtonModule, TuiHostedDropdownModule, TuiDataListModule, diff --git a/frontend/projects/ui/src/app/apps/portal/components/navigation/navigation.component.html b/frontend/projects/ui/src/app/apps/portal/components/navigation/navigation.component.html index ba901e01c..4b9705b98 100644 --- a/frontend/projects/ui/src/app/apps/portal/components/navigation/navigation.component.html +++ b/frontend/projects/ui/src/app/apps/portal/components/navigation/navigation.component.html @@ -25,7 +25,7 @@
@@ -65,14 +64,14 @@ import { EDIT } from './edit.component' tuiIconButton appearance="icon" size="xs" - icon="tuiIconEdit2" + iconLeft="tuiIconEdit2" (click)="update(job)" > diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/recover.component.ts b/frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/recover.component.ts index e6837b31d..4a72d8a4d 100644 --- a/frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/recover.component.ts +++ b/frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/recover.component.ts @@ -2,11 +2,8 @@ import { CommonModule } from '@angular/common' import { ChangeDetectionStrategy, Component, inject } from '@angular/core' import { FormsModule } from '@angular/forms' import { ErrorService, LoadingService } from '@start9labs/shared' -import { - TuiButtonModule, - TuiDialogContext, - TuiGroupModule, -} from '@taiga-ui/core' +import { TuiDialogContext, TuiGroupModule } from '@taiga-ui/core' +import { TuiButtonModule } from '@taiga-ui/experimental' import { TuiCheckboxBlockModule } from '@taiga-ui/kit' import { POLYMORPHEUS_CONTEXT, diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/target.component.ts b/frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/target.component.ts index ff9cb8b62..fd3458023 100644 --- a/frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/target.component.ts +++ b/frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/target.component.ts @@ -2,8 +2,8 @@ import { CommonModule } from '@angular/common' import { ChangeDetectionStrategy, Component, inject } from '@angular/core' import { ErrorService } from '@start9labs/shared' import { TuiForModule } from '@taiga-ui/cdk' +import { TuiButtonModule } from '@taiga-ui/experimental' import { - TuiButtonModule, TuiDialogContext, TuiDialogOptions, TuiDialogService, diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/targets.component.ts b/frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/targets.component.ts index 737e1d9c8..4c93e3a0d 100644 --- a/frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/targets.component.ts +++ b/frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/targets.component.ts @@ -5,18 +5,10 @@ import { unionSelectKey, unionValueKey, } from '@start9labs/start-sdk/lib/config/configTypes' -import { TuiButtonModule, TuiNotificationModule } from '@taiga-ui/core' +import { TuiNotificationModule } from '@taiga-ui/core' +import { TuiButtonModule, TuiFadeModule } from '@taiga-ui/experimental' import { PolymorpheusComponent } from '@tinkoff/ng-polymorpheus' -import { - BehaviorSubject, - catchError, - from, - Observable, - of, - share, - startWith, - switchMap, -} from 'rxjs' +import { BehaviorSubject } from 'rxjs' import { FormPage } from 'src/app/apps/ui/modals/form/form.page' import { configBuilderToSpec } from 'src/app/util/configBuilderToSpec' import { @@ -37,7 +29,6 @@ import { ApiService } from 'src/app/services/api/embassy-api.service' import { BackupConfig } from '../types/backup-config' import { BackupsPhysicalComponent } from '../components/physical.component' import { BackupsTargetsComponent } from '../components/targets.component' -import { TuiFadeModule } from '@taiga-ui/experimental' @Component({ template: ` diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/sideload/dependencies.component.ts b/frontend/projects/ui/src/app/apps/portal/routes/system/sideload/dependencies.component.ts new file mode 100644 index 000000000..e3d23f944 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/system/sideload/dependencies.component.ts @@ -0,0 +1,58 @@ +import { CommonModule } from '@angular/common' +import { ChangeDetectionStrategy, Component, Input } from '@angular/core' +import { MarketplacePkg } from '@start9labs/marketplace' +import { EmverPipesModule } from '@start9labs/shared' +import { + TuiAvatarModule, + TuiCellModule, + TuiTitleModule, +} from '@taiga-ui/experimental' + +@Component({ + selector: 'sideload-dependencies', + template: ` +

Dependencies

+
+ +
+
+ {{ getTitle(dep.key) }}  + + (required) + (required by default) + (optional) + +
+
+ {{ dep.value.version | displayEmver }} +
+
+ {{ dep.value.description }} +
+
+
+ `, + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: true, + imports: [ + CommonModule, + TuiTitleModule, + EmverPipesModule, + TuiAvatarModule, + TuiCellModule, + ], +}) +export class SideloadDependenciesComponent { + @Input({ required: true }) + package!: MarketplacePkg + + getTitle(key: string): string { + return this.package['dependency-metadata'][key]?.title || key + } + + getImage(key: string): string { + const icon = this.package['dependency-metadata'][key]?.icon + + return icon ? `data:image/png;base64,${icon}` : key.substring(0, 2) + } +} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/sideload/package.component.ts b/frontend/projects/ui/src/app/apps/portal/routes/system/sideload/package.component.ts new file mode 100644 index 000000000..68a41b30f --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/system/sideload/package.component.ts @@ -0,0 +1,131 @@ +import { CommonModule } from '@angular/common' +import { Component, inject, Input } from '@angular/core' +import { Router, RouterLink } from '@angular/router' +import { + AboutModule, + AdditionalModule, + MarketplacePkg, + PackageModule, +} from '@start9labs/marketplace' +import { + Emver, + ErrorService, + LoadingService, + SharedPipesModule, +} from '@start9labs/shared' +import { TuiLetModule } from '@taiga-ui/cdk' +import { TuiAlertService } from '@taiga-ui/core' +import { TuiButtonModule } from '@taiga-ui/experimental' +import { PatchDB } from 'patch-db-client' +import { combineLatest, map } from 'rxjs' +import { DataModel } from 'src/app/services/patch-db/data-model' +import { ApiService } from 'src/app/services/api/embassy-api.service' +import { ClientStorageService } from 'src/app/services/client-storage.service' + +import { toDesktopItem } from '../../../utils/to-desktop-item' +import { NavigationService } from '../../../services/navigation.service' +import { SideloadDependenciesComponent } from './dependencies.component' + +@Component({ + selector: 'sideload-package', + template: ` + + + + View installed + + + + + + + `, + standalone: true, + imports: [ + CommonModule, + RouterLink, + SharedPipesModule, + AboutModule, + AdditionalModule, + PackageModule, + TuiButtonModule, + TuiLetModule, + SideloadDependenciesComponent, + ], +}) +export class SideloadPackageComponent { + private readonly loader = inject(LoadingService) + private readonly api = inject(ApiService) + private readonly errorService = inject(ErrorService) + private readonly router = inject(Router) + private readonly navigation = inject(NavigationService) + private readonly alerts = inject(TuiAlertService) + private readonly emver = inject(Emver) + + readonly button$ = combineLatest([ + inject(ClientStorageService).showDevTools$, + inject(PatchDB) + .watch$('package-data') + .pipe( + map(local => + local[this.package.manifest.id] + ? this.emver.compare( + local[this.package.manifest.id].manifest.version, + this.package.manifest.version, + ) + : null, + ), + ), + ]).pipe( + map(([devtools, version]) => { + switch (version) { + case null: + return 'Install' + case 1: + return 'Update' + case -1: + return devtools ? 'Downgrade' : '' + default: + return '' + } + }), + ) + + @Input({ required: true }) + package!: MarketplacePkg + + @Input({ required: true }) + file!: File + + async upload() { + const loader = this.loader.open('Uploading package').subscribe() + const { manifest, icon } = this.package + const { size } = this.file + + try { + const pkg = await this.api.sideloadPackage({ manifest, icon, size }) + + await this.api.uploadPackage(pkg, this.file) + await this.router.navigate(['/portal/service', manifest.id]) + + this.navigation.removeTab(toDesktopItem('/portal/system/sideload')) + this.alerts + .open('Package uploaded successfully', { status: 'success' }) + .subscribe() + } catch (e: any) { + this.errorService.handleError(e) + } finally { + loader.unsubscribe() + } + } +} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/sideload/sideload.component.ts b/frontend/projects/ui/src/app/apps/portal/routes/system/sideload/sideload.component.ts new file mode 100644 index 000000000..040e4453a --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/system/sideload/sideload.component.ts @@ -0,0 +1,119 @@ +import { CommonModule } from '@angular/common' +import { ChangeDetectionStrategy, Component, inject } from '@angular/core' +import { FormsModule } from '@angular/forms' +import { MarketplacePkg } from '@start9labs/marketplace' +import { TuiLinkModule, TuiWrapperModule } from '@taiga-ui/core' +import { TuiAvatarModule, TuiButtonModule } from '@taiga-ui/experimental' +import { + TuiInputFilesModule, + tuiInputFilesOptionsProvider, +} from '@taiga-ui/kit' +import { Subject } from 'rxjs' +import { ConfigService } from 'src/app/services/config.service' + +import { parseS9pk, validateS9pk } from './sideload.utils' +import { SideloadPackageComponent } from './package.component' + +@Component({ + template: ` + + + + + + + + +
+ +

Invalid package file

+ +
+ +
+ +

Upload .s9pk package file

+

+ Tip: switch to LAN for faster uploads +

+ +
+
+
+
+
+ `, + host: { class: 'g-page', '[style.padding-top.rem]': '2' }, + styles: [ + ` + tui-input-files { + height: 100%; + max-width: 40rem; + margin: 0 auto; + } + `, + ], + changeDetection: ChangeDetectionStrategy.OnPush, + providers: [tuiInputFilesOptionsProvider({ maxFileSize: Infinity })], + standalone: true, + imports: [ + CommonModule, + FormsModule, + TuiInputFilesModule, + TuiLinkModule, + TuiAvatarModule, + TuiWrapperModule, + TuiButtonModule, + SideloadPackageComponent, + ], +}) +export class SideloadComponent { + readonly refresh$ = new Subject() + readonly isTor = inject(ConfigService).isTor() + + invalid = false + file: File | null = null + package: MarketplacePkg | null = null + + clear() { + this.invalid = false + this.file = null + this.package = null + } + + async onFile(file: File | null) { + if (!file || !(await validateS9pk(file))) { + this.invalid = true + } else { + this.package = await parseS9pk(file) + this.file = file + } + + this.refresh$.next() + } +} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/sideload/sideload.utils.ts b/frontend/projects/ui/src/app/apps/portal/routes/system/sideload/sideload.utils.ts new file mode 100644 index 000000000..b302658d3 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/system/sideload/sideload.utils.ts @@ -0,0 +1,162 @@ +import { Manifest, MarketplacePkg } from '@start9labs/marketplace' +import cbor from 'cbor' + +interface Positions { + [key: string]: [bigint, bigint] // [position, length] +} + +const MAGIC = new Uint8Array([59, 59]) +const VERSION = new Uint8Array([1]) + +export async function validateS9pk(file: File): Promise { + const magic = new Uint8Array(await blobToBuffer(file.slice(0, 2))) + const version = new Uint8Array(await blobToBuffer(file.slice(2, 3))) + + return compare(magic, MAGIC) && compare(version, VERSION) +} + +export async function parseS9pk(file: File): Promise { + const positions: Positions = {} + // magic=2bytes, version=1bytes, pubkey=32bytes, signature=64bytes, toc_length=4bytes = 103byte is starting point + let start = 103 + let end = start + 1 // 104 + const tocLength = new DataView( + await blobToBuffer(file.slice(99, 103) ?? new Blob()), + ).getUint32(0, false) + await getPositions(start, end, file, positions, tocLength as any) + + const manifest = await getAsset(positions, file, 'manifest') + const [icon] = await Promise.all([ + await getIcon(positions, file, manifest), + // getAsset(positions, file, 'license'), + // getAsset(positions, file, 'instructions'), + ]) + + return { + manifest, + icon, + license: '', + instructions: '', + categories: [], + versions: [], + 'dependency-metadata': {}, + 'published-at': '', + } +} + +async function getPositions( + initialStart: number, + initialEnd: number, + file: Blob, + positions: Positions, + tocLength: number, +) { + let start = initialStart + let end = initialEnd + const titleLength = new Uint8Array( + await blobToBuffer(file.slice(start, end)), + )[0] + const tocTitle = await file.slice(end, end + titleLength).text() + start = end + titleLength + end = start + 8 + const chapterPosition = new DataView( + await blobToBuffer(file.slice(start, end)), + ).getBigUint64(0, false) + start = end + end = start + 8 + const chapterLength = new DataView( + await blobToBuffer(file.slice(start, end)), + ).getBigUint64(0, false) + + positions[tocTitle] = [chapterPosition, chapterLength] + start = end + end = start + 1 + if (end <= tocLength + (initialStart - 1)) { + await getPositions(start, end, file, positions, tocLength) + } +} + +async function readBlobAsDataURL( + f: Blob | File, +): Promise { + const reader = new FileReader() + return new Promise((resolve, reject) => { + reader.onloadend = () => { + resolve(reader.result) + } + reader.readAsDataURL(f) + reader.onerror = _ => reject(new Error('error reading blob')) + }) +} + +async function blobToDataURL(data: Blob | File): Promise { + const res = await readBlobAsDataURL(data) + if (res instanceof ArrayBuffer) { + throw new Error('readBlobAsDataURL response should not be an array buffer') + } + if (res == null) { + throw new Error('readBlobAsDataURL response should not be null') + } + if (typeof res === 'string') return res + throw new Error('no possible blob to data url resolution found') +} + +async function blobToBuffer(data: Blob | File): Promise { + const res = await readBlobToArrayBuffer(data) + if (res instanceof String) { + throw new Error('readBlobToArrayBuffer response should not be a string') + } + if (res == null) { + throw new Error('readBlobToArrayBuffer response should not be null') + } + if (res instanceof ArrayBuffer) return res + throw new Error('no possible blob to array buffer resolution found') +} + +async function readBlobToArrayBuffer( + f: Blob | File, +): Promise { + const reader = new FileReader() + return new Promise((resolve, reject) => { + reader.onloadend = () => { + resolve(reader.result) + } + reader.readAsArrayBuffer(f) + reader.onerror = _ => reject(new Error('error reading blob')) + }) +} + +function compare(a: Uint8Array, b: Uint8Array) { + for (let i = 0; i < a.length; i++) { + if (a[i] !== b[i]) return false + } + return true +} + +async function getAsset( + positions: Positions, + file: Blob, + asset: 'manifest' | 'license' | 'instructions', +): Promise { + const data = await blobToBuffer( + file.slice( + Number(positions[asset][0]), + Number(positions[asset][0]) + Number(positions[asset][1]), + ), + ) + return cbor.decode(data, true) +} + +async function getIcon( + positions: Positions, + file: Blob, + manifest: Manifest, +): Promise { + const contentType = `image/${manifest.assets.icon.split('.').pop()}` + const data = file.slice( + Number(positions['icon'][0]), + Number(positions['icon'][0]) + Number(positions['icon'][1]), + contentType, + ) + return blobToDataURL(data) +} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/system.module.ts b/frontend/projects/ui/src/app/apps/portal/routes/system/system.module.ts index 645ffc063..e0ea03716 100644 --- a/frontend/projects/ui/src/app/apps/portal/routes/system/system.module.ts +++ b/frontend/projects/ui/src/app/apps/portal/routes/system/system.module.ts @@ -11,6 +11,13 @@ const ROUTES: Routes = [ import('./backups/backups.component').then(m => m.BackupsComponent), data: toDesktopItem('/portal/system/backups'), }, + { + title: systemTabResolver, + path: 'sideload', + loadComponent: () => + import('./sideload/sideload.component').then(m => m.SideloadComponent), + data: toDesktopItem('/portal/system/sideload'), + }, { title: systemTabResolver, path: 'updates', diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/updates/components/item.component.ts b/frontend/projects/ui/src/app/apps/portal/routes/system/updates/components/item.component.ts index 007e4e473..fe52087a2 100644 --- a/frontend/projects/ui/src/app/apps/portal/routes/system/updates/components/item.component.ts +++ b/frontend/projects/ui/src/app/apps/portal/routes/system/updates/components/item.component.ts @@ -15,13 +15,12 @@ import { SharedPipesModule, } from '@start9labs/shared' import { - TuiButtonModule, TuiDialogService, TuiLinkModule, TuiLoaderModule, TuiSvgModule, } from '@taiga-ui/core' -import { TuiAvatarModule } from '@taiga-ui/experimental' +import { TuiAvatarModule, TuiButtonModule } from '@taiga-ui/experimental' import { TUI_PROMPT, TuiAccordionModule, diff --git a/frontend/projects/ui/src/app/apps/portal/services/navigation.service.ts b/frontend/projects/ui/src/app/apps/portal/services/navigation.service.ts index 57b7b1d8a..1c91b9585 100644 --- a/frontend/projects/ui/src/app/apps/portal/services/navigation.service.ts +++ b/frontend/projects/ui/src/app/apps/portal/services/navigation.service.ts @@ -12,8 +12,8 @@ export class NavigationService { return this.tabs } - removeTab(tab: NavigationItem) { - this.tabs.next(this.tabs.value.filter(t => t !== tab)) + removeTab({ routerLink }: NavigationItem) { + this.tabs.next(this.tabs.value.filter(t => t.routerLink !== routerLink)) } addTab(tab: NavigationItem) { diff --git a/frontend/projects/ui/src/app/apps/ui/modals/form/form.module.ts b/frontend/projects/ui/src/app/apps/ui/modals/form/form.module.ts index 464f60770..4b7009137 100644 --- a/frontend/projects/ui/src/app/apps/ui/modals/form/form.module.ts +++ b/frontend/projects/ui/src/app/apps/ui/modals/form/form.module.ts @@ -3,7 +3,8 @@ import { CommonModule } from '@angular/common' import { ReactiveFormsModule } from '@angular/forms' import { RouterModule } from '@angular/router' import { TuiValueChangesModule } from '@taiga-ui/cdk' -import { TuiButtonModule, TuiModeModule } from '@taiga-ui/core' +import { TuiButtonModule } from '@taiga-ui/experimental' +import { TuiModeModule } from '@taiga-ui/core' import { FormModule } from 'src/app/common/form/form.module' import { FormPage } from './form.page' diff --git a/frontend/projects/ui/src/app/apps/ui/modals/prompt/prompt.component.html b/frontend/projects/ui/src/app/apps/ui/modals/prompt/prompt.component.html index b407d3dfa..daf261009 100644 --- a/frontend/projects/ui/src/app/apps/ui/modals/prompt/prompt.component.html +++ b/frontend/projects/ui/src/app/apps/ui/modals/prompt/prompt.component.html @@ -34,7 +34,7 @@ title="Toggle masking" size="xs" class="button" - [icon]="masked ? 'tuiIconEye' : 'tuiIconEyeOff'" + [iconLeft]="masked ? 'tuiIconEye' : 'tuiIconEyeOff'" (click)="masked = !masked" > diff --git a/frontend/projects/ui/src/app/apps/ui/modals/prompt/prompt.module.ts b/frontend/projects/ui/src/app/apps/ui/modals/prompt/prompt.module.ts index 12cd96f6b..d872cb565 100644 --- a/frontend/projects/ui/src/app/apps/ui/modals/prompt/prompt.module.ts +++ b/frontend/projects/ui/src/app/apps/ui/modals/prompt/prompt.module.ts @@ -1,7 +1,8 @@ import { CommonModule } from '@angular/common' import { NgModule } from '@angular/core' import { FormsModule } from '@angular/forms' -import { TuiButtonModule, TuiTextfieldControllerModule } from '@taiga-ui/core' +import { TuiTextfieldControllerModule } from '@taiga-ui/core' +import { TuiButtonModule } from '@taiga-ui/experimental' import { TuiInputModule } from '@taiga-ui/kit' import { TuiAutoFocusModule } from '@taiga-ui/cdk' import { PromptComponent } from './prompt.component' diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/backup-select/backup-select.module.ts b/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/backup-select/backup-select.module.ts index bcb9ed156..4d5d6dbcd 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/backup-select/backup-select.module.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/backup-select/backup-select.module.ts @@ -1,7 +1,8 @@ import { NgModule } from '@angular/core' import { CommonModule } from '@angular/common' import { FormsModule } from '@angular/forms' -import { TuiButtonModule, TuiGroupModule } from '@taiga-ui/core' +import { TuiGroupModule } from '@taiga-ui/core' +import { TuiButtonModule } from '@taiga-ui/experimental' import { TuiCheckboxBlockModule } from '@taiga-ui/kit' import { BackupSelectPage } from './backup-select.page' diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/recover-select/recover-select.module.ts b/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/recover-select/recover-select.module.ts index 0f7e63288..ab1eabf6b 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/recover-select/recover-select.module.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/recover-select/recover-select.module.ts @@ -1,7 +1,8 @@ import { NgModule } from '@angular/core' import { CommonModule } from '@angular/common' import { FormsModule } from '@angular/forms' -import { TuiButtonModule, TuiGroupModule } from '@taiga-ui/core' +import { TuiGroupModule } from '@taiga-ui/core' +import { TuiButtonModule } from '@taiga-ui/experimental' import { TuiCheckboxBlockModule } from '@taiga-ui/kit' import { RecoverSelectPage } from './recover-select.page' import { ToOptionsPipe } from './to-options.pipe' diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/target-select/target-select.module.ts b/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/target-select/target-select.module.ts index 3b88319de..6ea234db5 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/target-select/target-select.module.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/target-select/target-select.module.ts @@ -1,7 +1,7 @@ import { NgModule } from '@angular/core' import { CommonModule } from '@angular/common' import { IonicModule } from '@ionic/angular' -import { TuiButtonModule } from '@taiga-ui/core' +import { TuiButtonModule } from '@taiga-ui/experimental' import { TargetSelectPage, TargetStatusComponent } from './target-select.page' import { TargetPipesModule } from '../../pipes/target-pipes.module' import { TextSpinnerComponentModule } from '@start9labs/shared' diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/backup-jobs.module.ts b/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/backup-jobs.module.ts index 12f9f5929..f5c833049 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/backup-jobs.module.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/backup-jobs.module.ts @@ -3,11 +3,8 @@ import { NgModule } from '@angular/core' import { FormsModule } from '@angular/forms' import { RouterModule, Routes } from '@angular/router' import { IonicModule } from '@ionic/angular' -import { - TuiButtonModule, - TuiNotificationModule, - TuiWrapperModule, -} from '@taiga-ui/core' +import { TuiNotificationModule, TuiWrapperModule } from '@taiga-ui/core' +import { TuiButtonModule } from '@taiga-ui/experimental' import { TuiInputModule, TuiToggleModule } from '@taiga-ui/kit' import { BackupJobsPage } from './backup-jobs.page' import { EditJobComponent } from './edit-job/edit-job.component' diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/modals/app-config/app-config.module.ts b/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/modals/app-config/app-config.module.ts index c7caf81ad..3279dd8bb 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/modals/app-config/app-config.module.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/modals/app-config/app-config.module.ts @@ -2,11 +2,11 @@ import { NgModule } from '@angular/core' import { CommonModule } from '@angular/common' import { ReactiveFormsModule } from '@angular/forms' import { - TuiButtonModule, TuiLoaderModule, TuiModeModule, TuiNotificationModule, } from '@taiga-ui/core' +import { TuiButtonModule } from '@taiga-ui/experimental' import { FormPageModule } from 'src/app/apps/ui/modals/form/form.module' import { AppConfigPage } from './app-config.page' diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/email/email.module.ts b/frontend/projects/ui/src/app/apps/ui/pages/system/email/email.module.ts index 2bcbd043b..f86ad248a 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/system/email/email.module.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/system/email/email.module.ts @@ -1,7 +1,8 @@ import { NgModule } from '@angular/core' import { CommonModule } from '@angular/common' import { IonicModule } from '@ionic/angular' -import { TuiButtonModule, TuiNotificationModule } from '@taiga-ui/core' +import { TuiNotificationModule } from '@taiga-ui/core' +import { TuiButtonModule } from '@taiga-ui/experimental' import { EmailPage } from './email.page' import { Routes, RouterModule } from '@angular/router' import { FormsModule, ReactiveFormsModule } from '@angular/forms' diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/proxies/proxies.module.ts b/frontend/projects/ui/src/app/apps/ui/pages/system/proxies/proxies.module.ts index fe6410830..a18c8cbbe 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/system/proxies/proxies.module.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/system/proxies/proxies.module.ts @@ -4,13 +4,13 @@ import { FormsModule } from '@angular/forms' import { RouterModule, Routes } from '@angular/router' import { IonicModule } from '@ionic/angular' import { - TuiButtonModule, TuiDataListModule, TuiHostedDropdownModule, TuiNotificationModule, TuiSvgModule, TuiWrapperModule, } from '@taiga-ui/core' +import { TuiButtonModule } from '@taiga-ui/experimental' import { TuiBadgeModule, TuiInputModule, TuiToggleModule } from '@taiga-ui/kit' import { ProxiesPage } from './proxies.page' diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/proxies/proxies.page.html b/frontend/projects/ui/src/app/apps/ui/pages/system/proxies/proxies.page.html index b358ad465..2e15ce50f 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/system/proxies/proxies.page.html +++ b/frontend/projects/ui/src/app/apps/ui/pages/system/proxies/proxies.page.html @@ -102,11 +102,8 @@ appearance="flat" tuiHostedDropdownHost size="s" - [icon]="icon" + iconLeft="tuiIconMoreHorizontal" > - - - diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/server-show/os-update/os-update.page.module.ts b/frontend/projects/ui/src/app/apps/ui/pages/system/server-show/os-update/os-update.page.module.ts index 141055614..95c7c02d2 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/system/server-show/os-update/os-update.page.module.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/system/server-show/os-update/os-update.page.module.ts @@ -1,7 +1,8 @@ import { NgModule } from '@angular/core' import { CommonModule } from '@angular/common' import { MarkdownPipeModule, SafeLinksDirective } from '@start9labs/shared' -import { TuiButtonModule, TuiScrollbarModule } from '@taiga-ui/core' +import { TuiScrollbarModule } from '@taiga-ui/core' +import { TuiButtonModule } from '@taiga-ui/experimental' import { TuiAutoFocusModule } from '@taiga-ui/cdk' import { NgDompurifyModule } from '@tinkoff/ng-dompurify' import { OSUpdatePage } from './os-update.page' diff --git a/frontend/projects/ui/src/app/common/form/form-array/form-array.component.html b/frontend/projects/ui/src/app/common/form/form-array/form-array.component.html index 25afe7012..d66387fb5 100644 --- a/frontend/projects/ui/src/app/common/form/form-array/form-array.component.html +++ b/frontend/projects/ui/src/app/common/form/form-array/form-array.component.html @@ -48,7 +48,7 @@ tuiIconButton type="button" class="remove" - icon="tuiIconTrash" + iconLeft="tuiIconTrash" appearance="icon" size="m" title="Remove" diff --git a/frontend/projects/ui/src/app/common/form/form-object/form-object.component.html b/frontend/projects/ui/src/app/common/form/form-object/form-object.component.html index 763e4386f..aa9e85f19 100644 --- a/frontend/projects/ui/src/app/common/form/form-object/form-object.component.html +++ b/frontend/projects/ui/src/app/common/form/form-object/form-object.component.html @@ -2,11 +2,11 @@ diff --git a/frontend/projects/ui/src/app/common/form/form-text/form-text.component.html b/frontend/projects/ui/src/app/common/form/form-text/form-text.component.html index e466d16aa..0db900238 100644 --- a/frontend/projects/ui/src/app/common/form/form-text/form-text.component.html +++ b/frontend/projects/ui/src/app/common/form/form-text/form-text.component.html @@ -27,7 +27,7 @@ title="Generate" size="xs" class="button" - icon="tuiIconRefreshCcw" + iconLeft="tuiIconRefreshCcw" (click)="generate()" > diff --git a/frontend/projects/ui/src/app/common/form/form.module.ts b/frontend/projects/ui/src/app/common/form/form.module.ts index 29e63a629..b4cf2756a 100644 --- a/frontend/projects/ui/src/app/common/form/form.module.ts +++ b/frontend/projects/ui/src/app/common/form/form.module.ts @@ -4,7 +4,6 @@ import { FormsModule, ReactiveFormsModule } from '@angular/forms' import { MaskitoModule } from '@maskito/angular' import { TuiMapperPipeModule, TuiValueChangesModule } from '@taiga-ui/cdk' import { - TuiButtonModule, TuiErrorModule, TuiExpandModule, TuiHintModule, @@ -15,6 +14,7 @@ import { TuiTooltipModule, TuiWrapperModule, } from '@taiga-ui/core' +import { TuiButtonModule } from '@taiga-ui/experimental' import { TuiElasticContainerModule, TuiFieldErrorPipeModule, diff --git a/frontend/projects/ui/src/app/common/os-welcome/os-welcome.module.ts b/frontend/projects/ui/src/app/common/os-welcome/os-welcome.module.ts index 3597aab3e..907d358a6 100644 --- a/frontend/projects/ui/src/app/common/os-welcome/os-welcome.module.ts +++ b/frontend/projects/ui/src/app/common/os-welcome/os-welcome.module.ts @@ -1,5 +1,5 @@ import { NgModule } from '@angular/core' -import { TuiButtonModule } from '@taiga-ui/core' +import { TuiButtonModule } from '@taiga-ui/experimental' import { OSWelcomePage } from './os-welcome.page' @NgModule({ diff --git a/frontend/projects/ui/src/app/common/toast-container/toast-container.module.ts b/frontend/projects/ui/src/app/common/toast-container/toast-container.module.ts index 0029ddada..bf24027d3 100644 --- a/frontend/projects/ui/src/app/common/toast-container/toast-container.module.ts +++ b/frontend/projects/ui/src/app/common/toast-container/toast-container.module.ts @@ -2,11 +2,8 @@ import { CommonModule } from '@angular/common' import { NgModule } from '@angular/core' import { RouterModule } from '@angular/router' import { TuiAutoFocusModule } from '@taiga-ui/cdk' -import { - TuiAlertModule, - TuiButtonModule, - TuiDialogModule, -} from '@taiga-ui/core' +import { TuiAlertModule, TuiDialogModule } from '@taiga-ui/core' +import { TuiButtonModule } from '@taiga-ui/experimental' import { ToastContainerComponent } from './toast-container.component' import { NotificationsToastComponent } from './notifications-toast/notifications-toast.component' diff --git a/frontend/projects/ui/src/styles.scss b/frontend/projects/ui/src/styles.scss index 5ee831568..789e4f7df 100644 --- a/frontend/projects/ui/src/styles.scss +++ b/frontend/projects/ui/src/styles.scss @@ -375,6 +375,7 @@ ul { padding: 1px 2rem 3rem; box-sizing: border-box; overflow: auto; + isolation: isolate; // TODO: Theme background: #373a3f;