From 0bbc9c7c492a59443f38848a462968971a061fdf Mon Sep 17 00:00:00 2001 From: Max Peintner Date: Thu, 8 Oct 2020 10:09:10 +0200 Subject: [PATCH] fix(console): cleanup user detail and member components, user/me redirect, permission guards, filter, org policy guard, user table, scss cleanup (#808) * fix: remove user.write guard for filtering * border color * fix user routing from member tables * idp detail layout * generic contact component * fix redirect to auth user, user grant disable * disable policy action without permission, i18n * user-create flex fix, contact ng-content * rm unused styles * sidenav divider * lint * chore(deps-dev): bump @angular/cli from 10.1.3 to 10.1.4 in /console (#806) * fix: user session with external login (#797) * fix: user session with external login * fix: tests * fix: tests * fix: change idp config name * fix(container): stop copying / and instead only copy zitadel (#691) * chore: stop copying / and instead only copy zitadel * Update Dockerfile * Update release.yml * enable anchors debug * fix(container): don't copy alpine content into scratch execpt pwd * chore: remove need step * merge master * chore(deps-dev): bump @angular/cli from 10.1.3 to 10.1.4 in /console Bumps [@angular/cli](https://github.com/angular/angular-cli) from 10.1.3 to 10.1.4. - [Release notes](https://github.com/angular/angular-cli/releases) - [Commits](https://github.com/angular/angular-cli/compare/v10.1.3...v10.1.4) Signed-off-by: dependabot[bot] Co-authored-by: Fabi <38692350+fgerschwiler@users.noreply.github.com> Co-authored-by: Florian Forster Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps-dev): bump @angular/language-service from 10.1.3 to 10.1.4 in /console (#805) * fix: user session with external login (#797) * fix: user session with external login * fix: tests * fix: tests * fix: change idp config name * fix(container): stop copying / and instead only copy zitadel (#691) * chore: stop copying / and instead only copy zitadel * Update Dockerfile * Update release.yml * enable anchors debug * fix(container): don't copy alpine content into scratch execpt pwd * chore: remove need step * merge master * chore(deps-dev): bump @angular/language-service in /console Bumps [@angular/language-service](https://github.com/angular/angular/tree/HEAD/packages/language-service) from 10.1.3 to 10.1.4. - [Release notes](https://github.com/angular/angular/releases) - [Changelog](https://github.com/angular/angular/blob/master/CHANGELOG.md) - [Commits](https://github.com/angular/angular/commits/10.1.4/packages/language-service) Signed-off-by: dependabot[bot] Co-authored-by: Fabi <38692350+fgerschwiler@users.noreply.github.com> Co-authored-by: Florian Forster Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps-dev): bump codelyzer from 6.0.0 to 6.0.1 in /console (#804) * fix: user session with external login (#797) * fix: user session with external login * fix: tests * fix: tests * fix: change idp config name * fix(container): stop copying / and instead only copy zitadel (#691) * chore: stop copying / and instead only copy zitadel * Update Dockerfile * Update release.yml * enable anchors debug * fix(container): don't copy alpine content into scratch execpt pwd * chore: remove need step * merge master * chore(deps-dev): bump codelyzer from 6.0.0 to 6.0.1 in /console Bumps [codelyzer](https://github.com/mgechev/codelyzer) from 6.0.0 to 6.0.1. - [Release notes](https://github.com/mgechev/codelyzer/releases) - [Changelog](https://github.com/mgechev/codelyzer/blob/master/CHANGELOG.md) - [Commits](https://github.com/mgechev/codelyzer/commits/6.0.1) Signed-off-by: dependabot[bot] Co-authored-by: Fabi <38692350+fgerschwiler@users.noreply.github.com> Co-authored-by: Florian Forster Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps-dev): bump @angular-devkit/build-angular from 0.1000.8 to 0.1001.4 in /console (#803) * fix: user session with external login (#797) * fix: user session with external login * fix: tests * fix: tests * fix: change idp config name * fix(container): stop copying / and instead only copy zitadel (#691) * chore: stop copying / and instead only copy zitadel * Update Dockerfile * Update release.yml * enable anchors debug * fix(container): don't copy alpine content into scratch execpt pwd * chore: remove need step * merge master * chore(deps-dev): bump @angular-devkit/build-angular in /console Bumps [@angular-devkit/build-angular](https://github.com/angular/angular-cli) from 0.1000.8 to 0.1001.4. - [Release notes](https://github.com/angular/angular-cli/releases) - [Commits](https://github.com/angular/angular-cli/commits) Signed-off-by: dependabot[bot] Co-authored-by: Fabi <38692350+fgerschwiler@users.noreply.github.com> Co-authored-by: Florian Forster Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Max Peintner * chore(deps): bump uuid from 8.3.0 to 8.3.1 in /console (#802) * fix: user session with external login (#797) * fix: user session with external login * fix: tests * fix: tests * fix: change idp config name * fix(container): stop copying / and instead only copy zitadel (#691) * chore: stop copying / and instead only copy zitadel * Update Dockerfile * Update release.yml * enable anchors debug * fix(container): don't copy alpine content into scratch execpt pwd * chore: remove need step * merge master * chore(deps): bump uuid from 8.3.0 to 8.3.1 in /console Bumps [uuid](https://github.com/uuidjs/uuid) from 8.3.0 to 8.3.1. - [Release notes](https://github.com/uuidjs/uuid/releases) - [Changelog](https://github.com/uuidjs/uuid/blob/master/CHANGELOG.md) - [Commits](https://github.com/uuidjs/uuid/compare/v8.3.0...v8.3.1) Signed-off-by: dependabot[bot] Co-authored-by: Fabi <38692350+fgerschwiler@users.noreply.github.com> Co-authored-by: Florian Forster Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * create memberstable as common component * iam member cleanup * iam + org m table, user table service user avatar * toast config * fix selection emitter * fix project grant table width * project grant members refactor * theme optimizations * member table col delete * lint * fix table row color * refactor grey color * lint scss * org list redirect on click, fix user table undef * refresh table after grant add Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Fabi <38692350+fgerschwiler@users.noreply.github.com> Co-authored-by: Florian Forster --- console/package-lock.json | 1248 ++++++++++------- console/package.json | 10 +- console/src/app/app.component.scss | 8 +- console/src/app/guards/user.guard.ts | 28 + .../accounts-card.component.html | 4 +- .../accounts-card.component.scss | 8 +- .../member-create-dialog.component.scss | 2 +- .../member-create-dialog.component.ts | 1 - .../member-create-dialog.module.ts | 3 +- .../src/app/modules/card/card.component.scss | 2 +- console/src/app/modules/card/card.scss | 2 +- .../modules/changes/changes.component.scss | 8 +- .../contributors/contributors.component.html | 10 +- .../contributors/contributors.component.scss | 13 +- .../detail-layout.component.scss | 6 +- .../idp-create/idp-create.component.scss | 2 +- .../idp-table/idp-table.component.scss | 2 +- .../src/app/modules/idp/idp.component.html | 172 +-- .../src/app/modules/idp/idp.component.scss | 28 +- .../members-table.component.html | 98 ++ .../members-table.component.scss} | 30 +- .../members-table.component.spec.ts} | 12 +- .../members-table/members-table.component.ts | 83 ++ .../members-table/members-table.module.ts | 45 + .../meta-layout/meta-layout.component.scss | 2 +- .../password-complexity-view.component.scss | 5 +- .../add-idp-dialog.component.scss | 2 +- .../login-policy/login-policy.component.scss | 4 +- .../password-age-policy.component.scss | 2 +- .../password-complexity-policy.component.scss | 2 +- .../password-iam-policy.component.scss | 2 +- .../password-lockout-policy.component.scss | 2 +- .../project-members.component.html | 96 +- .../project-members.component.scss | 39 +- .../project-members.component.ts | 97 +- .../project-members/project-members.module.ts | 27 +- .../project-role-detail.component.scss | 2 +- .../refresh-table.component.scss | 11 +- .../search-project-autocomplete.component.ts | 15 +- .../search-project-autocomplete.module.ts | 6 +- .../search-roles-autocomplete.component.ts | 18 +- .../search-user-autocomplete.component.scss | 4 +- .../search-user-autocomplete.module.ts | 2 + .../user-grants/user-grants.component.html | 12 +- .../user-grants/user-grants.component.scss | 2 +- .../user-grants/user-grants.component.ts | 2 +- .../warn-dialog/warn-dialog.component.scss | 2 +- .../src/app/pages/home/home.component.scss | 8 +- .../iam-members/iam-members.component.html | 107 +- .../iam-members/iam-members.component.scss | 38 +- .../iam/iam-members/iam-members.component.ts | 67 +- .../iam/iam-members/iam-members.module.ts | 25 +- .../iam-policy-grid.component.scss | 4 +- console/src/app/pages/iam/iam.component.scss | 2 +- .../orgs/org-create/org-create.component.scss | 6 +- .../add-domain-dialog.component.scss | 2 +- .../domain-verification.component.scss | 2 +- .../orgs/org-detail/org-detail.component.html | 7 +- .../orgs/org-detail/org-detail.component.scss | 12 +- .../orgs/org-list/org-list.component.html | 5 +- .../orgs/org-list/org-list.component.scss | 2 +- .../pages/orgs/org-list/org-list.component.ts | 24 + .../org-members/org-members.component.html | 84 +- .../org-members/org-members.component.scss | 38 +- .../orgs/org-members/org-members.component.ts | 73 +- .../orgs/org-members/org-members.module.ts | 23 +- .../policy-grid/policy-grid.component.html | 12 +- .../policy-grid/policy-grid.component.scss | 4 +- .../apps/app-create/app-create.component.scss | 8 +- .../apps/app-detail/app-detail.component.scss | 6 +- .../app-secret-dialog.component.scss | 2 +- .../granted-project-detail.component.html | 2 +- .../granted-project-detail.component.scss | 4 +- .../granted-project-grid.component.scss | 68 +- .../granted-projects.component.scss | 2 +- .../application-grid.component.scss | 3 +- .../owned-project-detail.component.html | 2 +- .../owned-project-detail.component.scss | 2 +- .../project-grants.component.html | 2 +- .../owned-project-grid.component.scss | 28 +- .../owned-project-list.component.scss | 2 +- .../owned-projects.component.scss | 2 +- .../project-grant-detail-datasource.ts | 59 - .../project-grant-detail.component.html | 20 +- .../project-grant-detail.component.scss | 8 +- .../project-grant-detail.component.ts | 98 +- .../project-grant-detail.module.ts | 11 +- ...grant-members-create-dialog.component.html | 0 ...grant-members-create-dialog.component.scss | 0 ...nt-members-create-dialog.component.spec.ts | 0 ...t-grant-members-create-dialog.component.ts | 0 ...ject-grant-members-create-dialog.module.ts | 0 .../project-grant-members-datasource.ts | 1 + .../project-grant-members.component.html | 84 -- .../project-grant-members.component.ts | 149 -- .../project-grant-members.module.ts | 58 - .../pages/signedout/signedout.component.scss | 2 +- .../user-grant-create.component.scss | 2 +- .../user-create-machine.component.scss | 5 +- .../user-create/user-create.component.scss | 5 +- .../auth-user-detail.component.html | 107 +- .../auth-user-detail.component.scss | 63 +- .../auth-user-detail.component.ts | 86 +- .../theme-setting/theme-card.scss | 2 +- .../theme-setting.component.scss | 2 +- .../contact/contact.component.html | 97 ++ .../contact/contact.component.scss | 47 + .../contact/contact.component.spec.ts | 25 + .../user-detail/contact/contact.component.ts | 70 + .../detail-form/detail-form.component.ts | 4 +- .../add-key-dialog.component.scss | 2 +- .../show-key-dialog.component.scss | 2 +- .../memberships/memberships.component.scss | 4 +- .../user-detail/user-detail-routing.module.ts | 3 +- .../users/user-detail/user-detail.module.ts | 2 + .../user-detail/user-detail.component.html | 123 +- .../user-detail/user-detail.component.scss | 63 - .../user-detail/user-detail.component.ts | 36 +- .../users/user-list/user-list.component.scss | 2 +- .../user-table/user-table.component.html | 26 +- .../user-table/user-table.component.scss | 18 +- .../user-table/user-table.component.ts | 10 + console/src/app/services/refresh.service.ts | 1 - console/src/app/services/toast.service.ts | 8 +- console/src/assets/i18n/de.json | 11 +- console/src/assets/i18n/en.json | 11 +- console/src/styles.scss | 13 +- console/src/styles/sidenav-list.scss | 4 +- console/src/styles/table.scss | 7 +- 129 files changed, 2002 insertions(+), 2208 deletions(-) create mode 100644 console/src/app/guards/user.guard.ts create mode 100644 console/src/app/modules/members-table/members-table.component.html rename console/src/app/{pages/projects/owned-projects/project-grant-detail/project-grant-members/project-grant-members.component.scss => modules/members-table/members-table.component.scss} (56%) rename console/src/app/{pages/projects/owned-projects/project-grant-detail/project-grant-members/project-grant-members.component.spec.ts => modules/members-table/members-table.component.spec.ts} (68%) create mode 100644 console/src/app/modules/members-table/members-table.component.ts create mode 100644 console/src/app/modules/members-table/members-table.module.ts delete mode 100644 console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-detail-datasource.ts rename console/src/app/pages/projects/owned-projects/project-grant-detail/{project-grant-members => }/project-grant-members-create-dialog/project-grant-members-create-dialog.component.html (100%) rename console/src/app/pages/projects/owned-projects/project-grant-detail/{project-grant-members => }/project-grant-members-create-dialog/project-grant-members-create-dialog.component.scss (100%) rename console/src/app/pages/projects/owned-projects/project-grant-detail/{project-grant-members => }/project-grant-members-create-dialog/project-grant-members-create-dialog.component.spec.ts (100%) rename console/src/app/pages/projects/owned-projects/project-grant-detail/{project-grant-members => }/project-grant-members-create-dialog/project-grant-members-create-dialog.component.ts (100%) rename console/src/app/pages/projects/owned-projects/project-grant-detail/{project-grant-members => }/project-grant-members-create-dialog/project-grant-members-create-dialog.module.ts (100%) rename console/src/app/pages/projects/owned-projects/project-grant-detail/{project-grant-members => }/project-grant-members-datasource.ts (97%) delete mode 100644 console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members/project-grant-members.component.html delete mode 100644 console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members/project-grant-members.component.ts delete mode 100644 console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members/project-grant-members.module.ts create mode 100644 console/src/app/pages/users/user-detail/contact/contact.component.html create mode 100644 console/src/app/pages/users/user-detail/contact/contact.component.scss create mode 100644 console/src/app/pages/users/user-detail/contact/contact.component.spec.ts create mode 100644 console/src/app/pages/users/user-detail/contact/contact.component.ts diff --git a/console/package-lock.json b/console/package-lock.json index 50d0e6d185..6e80a9ff84 100644 --- a/console/package-lock.json +++ b/console/package-lock.json @@ -5,19 +5,19 @@ "requires": true, "dependencies": { "@angular-devkit/architect": { - "version": "0.1000.8", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1000.8.tgz", - "integrity": "sha512-2AqPbiEugtPxNz4MGhLh+imUVelhW9h1cdJs2AbxZosIxftPb5DNDQUSAwVmRGp4CtcXVrlvcDwc0f4Fw1aiIA==", + "version": "0.1001.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1001.4.tgz", + "integrity": "sha512-0U/w+61vWxnEe9Ln/hNOH6O27FVcU+s/sbJAuPREbP875R4bQzK2PX0eYRlISzkDtQyw16GzlsikLWOoJ3vjTA==", "dev": true, "requires": { - "@angular-devkit/core": "10.0.8", - "rxjs": "6.5.5" + "@angular-devkit/core": "10.1.4", + "rxjs": "6.6.2" }, "dependencies": { "rxjs": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz", - "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==", + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.2.tgz", + "integrity": "sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg==", "dev": true, "requires": { "tslib": "^1.9.0" @@ -32,130 +32,258 @@ } }, "@angular-devkit/build-angular": { - "version": "0.1000.8", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-0.1000.8.tgz", - "integrity": "sha512-wwDN2oadQvYPL7lDmvGsoWQjW++0ZnxWk1QVlABGhBSIs8Uxs26Hjd5YNUSsvJavBkqb1UZIOilqzb4dig5MIA==", + "version": "0.1001.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-0.1001.4.tgz", + "integrity": "sha512-R2E9AJ3e7OwFEzStShW5W9F/tGz/JxYCzBdf8e7GkfujZjCVPRE3twRooFGfMlGEruUm/nC+Y0iFRnV0BLRKfw==", "dev": true, "requires": { - "@angular-devkit/architect": "0.1000.8", - "@angular-devkit/build-optimizer": "0.1000.8", - "@angular-devkit/build-webpack": "0.1000.8", - "@angular-devkit/core": "10.0.8", - "@babel/core": "7.9.6", - "@babel/generator": "7.9.6", - "@babel/plugin-transform-runtime": "7.9.6", - "@babel/preset-env": "7.9.6", - "@babel/runtime": "7.9.6", - "@babel/template": "7.8.6", - "@jsdevtools/coverage-istanbul-loader": "3.0.3", - "@ngtools/webpack": "10.0.8", - "ajv": "6.12.3", - "autoprefixer": "9.8.0", + "@angular-devkit/architect": "0.1001.4", + "@angular-devkit/build-optimizer": "0.1001.4", + "@angular-devkit/build-webpack": "0.1001.4", + "@angular-devkit/core": "10.1.4", + "@babel/core": "7.11.1", + "@babel/generator": "7.11.0", + "@babel/plugin-transform-runtime": "7.11.0", + "@babel/preset-env": "7.11.0", + "@babel/runtime": "7.11.2", + "@babel/template": "7.10.4", + "@jsdevtools/coverage-istanbul-loader": "3.0.5", + "@ngtools/webpack": "10.1.4", + "autoprefixer": "9.8.6", "babel-loader": "8.1.0", "browserslist": "^4.9.1", - "cacache": "15.0.3", + "cacache": "15.0.5", "caniuse-lite": "^1.0.30001032", "circular-dependency-plugin": "5.2.0", "copy-webpack-plugin": "6.0.3", "core-js": "3.6.4", - "css-loader": "3.5.3", + "css-loader": "4.2.2", "cssnano": "4.1.10", "file-loader": "6.0.0", "find-cache-dir": "3.3.1", "glob": "7.1.6", - "jest-worker": "26.0.0", + "jest-worker": "26.3.0", "karma-source-map-support": "1.4.0", - "less-loader": "6.1.0", - "license-webpack-plugin": "2.2.0", + "less-loader": "6.2.0", + "license-webpack-plugin": "2.3.0", "loader-utils": "2.0.0", - "mini-css-extract-plugin": "0.9.0", + "mini-css-extract-plugin": "0.10.0", "minimatch": "3.0.4", - "open": "7.0.4", - "parse5": "4.0.0", + "open": "7.2.0", + "parse5": "6.0.1", + "parse5-htmlparser2-tree-adapter": "6.0.1", "pnp-webpack-plugin": "1.6.4", - "postcss": "7.0.31", + "postcss": "7.0.32", "postcss-import": "12.0.1", "postcss-loader": "3.0.0", "raw-loader": "4.0.1", - "regenerator-runtime": "0.13.5", + "regenerator-runtime": "0.13.7", "resolve-url-loader": "3.1.1", "rimraf": "3.0.2", - "rollup": "2.10.9", - "rxjs": "6.5.5", - "sass": "1.26.5", - "sass-loader": "8.0.2", + "rollup": "2.26.5", + "rxjs": "6.6.2", + "sass": "1.26.10", + "sass-loader": "10.0.1", "semver": "7.3.2", "source-map": "0.7.3", - "source-map-loader": "1.0.0", + "source-map-loader": "1.0.2", "source-map-support": "0.5.19", "speed-measure-webpack-plugin": "1.3.3", "style-loader": "1.2.1", - "stylus": "0.54.7", + "stylus": "0.54.8", "stylus-loader": "3.0.2", - "terser": "4.7.0", - "terser-webpack-plugin": "3.0.1", + "terser": "5.3.0", + "terser-webpack-plugin": "4.1.0", "tree-kill": "1.2.2", - "webpack": "4.43.0", + "webpack": "4.44.1", "webpack-dev-middleware": "3.7.2", "webpack-dev-server": "3.11.0", "webpack-merge": "4.2.2", "webpack-sources": "1.4.3", "webpack-subresource-integrity": "1.4.1", - "worker-plugin": "4.0.3" + "worker-plugin": "5.0.0" }, "dependencies": { - "ajv": { - "version": "6.12.3", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz", - "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==", + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "dev": true, "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "@babel/highlight": "^7.10.4" } }, - "autoprefixer": { - "version": "9.8.0", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.0.tgz", - "integrity": "sha512-D96ZiIHXbDmU02dBaemyAg53ez+6F5yZmapmgKcjm35yEe1uVDYI8hGW3VYoGRaG290ZFf91YxHrR518vC0u/A==", + "@babel/core": { + "version": "7.11.1", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.11.1.tgz", + "integrity": "sha512-XqF7F6FWQdKGGWAzGELL+aCO1p+lRY5Tj5/tbT3St1G8NaH70jhhDIKknIZaDans0OQBG5wRAldROLHSt44BgQ==", "dev": true, "requires": { - "browserslist": "^4.12.0", - "caniuse-lite": "^1.0.30001061", - "chalk": "^2.4.2", - "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "postcss": "^7.0.30", - "postcss-value-parser": "^4.1.0" - } - }, - "parse5": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", - "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", - "dev": true - }, - "postcss": { - "version": "7.0.31", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.31.tgz", - "integrity": "sha512-a937VDHE1ftkjk+8/7nj/mrjtmkn69xxzJgRETXdAUU+IgOYPQNJF17haGWbeDxSyk++HA14UA98FurvPyBJOA==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.11.0", + "@babel/helper-module-transforms": "^7.11.0", + "@babel/helpers": "^7.10.4", + "@babel/parser": "^7.11.1", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.11.0", + "@babel/types": "^7.11.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" }, "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", "dev": true } } }, + "@babel/generator": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.0.tgz", + "integrity": "sha512-fEm3Uzw7Mc9Xi//qU20cBKatTfs2aOtKqmvy/Vm7RkJEGFQ4xc9myCfbXxqK//ZS8MR/ciOHw6meGASJuKmDfQ==", + "dev": true, + "requires": { + "@babel/types": "^7.11.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/helper-module-transforms": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz", + "integrity": "sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-simple-access": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/template": "^7.10.4", + "@babel/types": "^7.11.0", + "lodash": "^4.17.19" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", + "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", + "dev": true, + "requires": { + "@babel/types": "^7.11.0" + } + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.11.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.5.tgz", + "integrity": "sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q==", + "dev": true + }, + "@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/traverse": { + "version": "7.11.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.5.tgz", + "integrity": "sha512-EjiPXt+r7LiCZXEfRpSJd+jUMnBd4/9OUv7Nx3+0u9+eimMwJmG0Q98lw4/289JCoxSE8OolDMNZaaF/JZ69WQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.11.5", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.11.5", + "@babel/types": "^7.11.5", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + }, + "dependencies": { + "@babel/generator": { + "version": "7.11.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.6.tgz", + "integrity": "sha512-DWtQ1PV3r+cLbySoHrwn9RWEgKMBLLma4OBQloPRyDYvc5msJM9kvTLo1YnlJd1P/ZuKbdli3ijr5q3FvAF3uA==", + "dev": true, + "requires": { + "@babel/types": "^7.11.5", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/types": { + "version": "7.11.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", + "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + }, "rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -166,9 +294,9 @@ } }, "rxjs": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz", - "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==", + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.2.tgz", + "integrity": "sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg==", "dev": true, "requires": { "tslib": "^1.9.0" @@ -186,15 +314,6 @@ "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", "dev": true }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, "tslib": { "version": "1.13.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", @@ -204,14 +323,15 @@ } }, "@angular-devkit/build-optimizer": { - "version": "0.1000.8", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.1000.8.tgz", - "integrity": "sha512-esODHuTGEEMx1SmLUq03VAMly8gZUd1vRuvZeKS5HqKwDg8ZzcI7/25BuuUSlyST+6BEdjo2gnmagQnG0VBdQw==", + "version": "0.1001.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.1001.4.tgz", + "integrity": "sha512-ZBJF87QFOBq1zQOXDQOEHxCGSZeIgzyddQKNVuVqlPklJHBHYSaUiCKU4Dd+ZdAHQ5FqFlgO3gnYuyy6zaJU6Q==", "dev": true, "requires": { "loader-utils": "2.0.0", "source-map": "0.7.3", - "tslib": "2.0.0", + "tslib": "2.0.1", + "typescript": "4.0.2", "webpack-sources": "1.4.3" }, "dependencies": { @@ -221,29 +341,29 @@ "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", "dev": true }, - "tslib": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.0.tgz", - "integrity": "sha512-lTqkx847PI7xEDYJntxZH89L2/aXInsyF2luSafe/+0fHOMjlBNXdH6th7f70qxLDhul7KZK0zC8V5ZIyHl0/g==", + "typescript": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.2.tgz", + "integrity": "sha512-e4ERvRV2wb+rRZ/IQeb3jm2VxBsirQLpQhdxplZ2MEzGvDkkMmPglecnNDfSUBivMjP93vRbngYYDQqQ/78bcQ==", "dev": true } } }, "@angular-devkit/build-webpack": { - "version": "0.1000.8", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1000.8.tgz", - "integrity": "sha512-y/U+dV5N8W7KECncGSKQWoUH/DFNZCseczyl6LAd8bc0fMr8Z0TAIe8OXj+5CSRRdejWfRIxGtNWM+L2kTCU8A==", + "version": "0.1001.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1001.4.tgz", + "integrity": "sha512-4n9pcBD7JE2Cpg3zFBPEOr2r//c3EwnAqFOcDLA3rXt0AUsbnm9H8xPTwb6MHOEMyWS/fscNqYLFGHnVZiunEg==", "dev": true, "requires": { - "@angular-devkit/architect": "0.1000.8", - "@angular-devkit/core": "10.0.8", - "rxjs": "6.5.5" + "@angular-devkit/architect": "0.1001.4", + "@angular-devkit/core": "10.1.4", + "rxjs": "6.6.2" }, "dependencies": { "rxjs": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz", - "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==", + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.2.tgz", + "integrity": "sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg==", "dev": true, "requires": { "tslib": "^1.9.0" @@ -258,22 +378,22 @@ } }, "@angular-devkit/core": { - "version": "10.0.8", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-10.0.8.tgz", - "integrity": "sha512-d9S8VQuqaYg0c/Y2kl/MtICtZ+UKlH5bLm8y2fb2WfSL4A5XIqMGdEVxzFSiR0b1Bnt4NAoQMcBec1blHAqMSQ==", + "version": "10.1.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-10.1.4.tgz", + "integrity": "sha512-B1cwVcfChBvmEacydE2uqZ1UC2ez1G+KY0GyVnCQKpAb/DdfDgtaYjTx9JLvGQjE/BlVklEj8YCKDjVV0WPE5g==", "dev": true, "requires": { - "ajv": "6.12.3", + "ajv": "6.12.4", "fast-json-stable-stringify": "2.1.0", "magic-string": "0.25.7", - "rxjs": "6.5.5", + "rxjs": "6.6.2", "source-map": "0.7.3" }, "dependencies": { "ajv": { - "version": "6.12.3", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz", - "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==", + "version": "6.12.4", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz", + "integrity": "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -283,9 +403,9 @@ } }, "rxjs": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz", - "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==", + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.2.tgz", + "integrity": "sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg==", "dev": true, "requires": { "tslib": "^1.9.0" @@ -306,20 +426,20 @@ } }, "@angular-devkit/schematics": { - "version": "10.1.3", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-10.1.3.tgz", - "integrity": "sha512-5+E2bBBsphuz1KfloC5yA+hXSEbxMokkp5UEp+X9VC7zUGTXV8sxuvcbBo+JVutaoNHezJGu2JUx/LqNrKd58w==", + "version": "10.1.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-10.1.4.tgz", + "integrity": "sha512-NIueJQYZ8OY3Yr3TGfxcGgP9ZGGsbtM7sa7sf9hSqxEAXdiGQdDJk5nChhtGtoGxUImterwqR8OiGmLcK5lg5g==", "dev": true, "requires": { - "@angular-devkit/core": "10.1.3", + "@angular-devkit/core": "10.1.4", "ora": "5.0.0", "rxjs": "6.6.2" }, "dependencies": { "@angular-devkit/core": { - "version": "10.1.3", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-10.1.3.tgz", - "integrity": "sha512-Ub31/eqFtSuQy3V+B74Jt0jAUw8fs8sbd0ZL2UHYUJyrwm20iIRam+mOD3Sj8HFrDGLR8m56KsxJ12KvC1oxtQ==", + "version": "10.1.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-10.1.4.tgz", + "integrity": "sha512-B1cwVcfChBvmEacydE2uqZ1UC2ez1G+KY0GyVnCQKpAb/DdfDgtaYjTx9JLvGQjE/BlVklEj8YCKDjVV0WPE5g==", "dev": true, "requires": { "ajv": "6.12.4", @@ -382,16 +502,16 @@ } }, "@angular/cli": { - "version": "10.1.3", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-10.1.3.tgz", - "integrity": "sha512-wj+ZcTLRzM94asLUZRO5U96CLEsnWosa3Iqub+1AH1/C8Wv2w/2njUKDM7ifQeebYzjPb5EcN4EIAGcHAGyeWw==", + "version": "10.1.4", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-10.1.4.tgz", + "integrity": "sha512-Q61cqx3qMAtMugE28aWAtAaj+c31pRjGlq7xSH2LhQSmaGyoAq7v6qah6gqH1Ik8nlpF9T7jBIozKyqX9aXysg==", "dev": true, "requires": { - "@angular-devkit/architect": "0.1001.3", - "@angular-devkit/core": "10.1.3", - "@angular-devkit/schematics": "10.1.3", - "@schematics/angular": "10.1.3", - "@schematics/update": "0.1001.3", + "@angular-devkit/architect": "0.1001.4", + "@angular-devkit/core": "10.1.4", + "@angular-devkit/schematics": "10.1.4", + "@schematics/angular": "10.1.4", + "@schematics/update": "0.1001.4", "@yarnpkg/lockfile": "1.1.0", "ansi-colors": "4.1.1", "debug": "4.1.1", @@ -410,19 +530,19 @@ }, "dependencies": { "@angular-devkit/architect": { - "version": "0.1001.3", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1001.3.tgz", - "integrity": "sha512-WS5IAN6I73jKapiHKYz3U05Kka4eVRmwCk++GWM2uGChluiZsI87eK8vxMS3KWDIqTnAOuMpDt3XWxlASv1nlQ==", + "version": "0.1001.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1001.4.tgz", + "integrity": "sha512-0U/w+61vWxnEe9Ln/hNOH6O27FVcU+s/sbJAuPREbP875R4bQzK2PX0eYRlISzkDtQyw16GzlsikLWOoJ3vjTA==", "dev": true, "requires": { - "@angular-devkit/core": "10.1.3", + "@angular-devkit/core": "10.1.4", "rxjs": "6.6.2" } }, "@angular-devkit/core": { - "version": "10.1.3", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-10.1.3.tgz", - "integrity": "sha512-Ub31/eqFtSuQy3V+B74Jt0jAUw8fs8sbd0ZL2UHYUJyrwm20iIRam+mOD3Sj8HFrDGLR8m56KsxJ12KvC1oxtQ==", + "version": "10.1.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-10.1.4.tgz", + "integrity": "sha512-B1cwVcfChBvmEacydE2uqZ1UC2ez1G+KY0GyVnCQKpAb/DdfDgtaYjTx9JLvGQjE/BlVklEj8YCKDjVV0WPE5g==", "dev": true, "requires": { "ajv": "6.12.4", @@ -504,6 +624,12 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", "dev": true + }, + "uuid": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.0.tgz", + "integrity": "sha512-fX6Z5o4m6XsXBdli9g7DtWgAx+osMsRRZFKma1mIUsLCz6vRvv+pz5VNbyu9UEDzpMWulZfvpgb/cmDXVulYFQ==", + "dev": true } } }, @@ -738,9 +864,9 @@ } }, "@angular/language-service": { - "version": "10.1.3", - "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-10.1.3.tgz", - "integrity": "sha512-BdRlbmVC9frtvqMZ9kaxMlgm3OIypTuB1z3cRwJVCnvBVsWz6+QishTdSCvYI7USFNU5EwGH6dCBWwl53spBLw==", + "version": "10.1.4", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-10.1.4.tgz", + "integrity": "sha512-+CsL/HWlja9mxqyvTTqP/rpxjVeuICmTHyfAKxqpq0488N7KTRRLvWXDoL5uwc+lzqhMsaXDasReMO+ATUAUrg==", "dev": true }, "@angular/material": { @@ -896,6 +1022,20 @@ "semver": "^5.5.0" } }, + "@babel/helper-create-class-features-plugin": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.5.tgz", + "integrity": "sha512-0nkdeijB7VlZoLT3r/mY3bUkw3T8WG/hNw+FATs/6+pG2039IJWjTYL0VTISqsNHMUTEnwbVnc89WIJX9Qed0A==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-member-expression-to-functions": "^7.10.5", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4" + } + }, "@babel/helper-create-regexp-features-plugin": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.4.tgz", @@ -1333,6 +1473,16 @@ "@babel/plugin-syntax-async-generators": "^7.8.0" } }, + "@babel/plugin-proposal-class-properties": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.4.tgz", + "integrity": "sha512-vhwkEROxzcHGNu2mzUC0OFFNXdZ4M23ib8aRRcJSsW8BZK9pQMD7QB7csl97NBbgGZO7ZyHUyKDnxzOaP4IrCg==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, "@babel/plugin-proposal-dynamic-import": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.4.tgz", @@ -1343,6 +1493,16 @@ "@babel/plugin-syntax-dynamic-import": "^7.8.0" } }, + "@babel/plugin-proposal-export-namespace-from": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.10.4.tgz", + "integrity": "sha512-aNdf0LY6/3WXkhh0Fdb6Zk9j1NMD8ovj3F6r0+3j837Pn1S1PdNtcwJ5EG9WkVPNHPxyJDaxMaAOVq4eki0qbg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + } + }, "@babel/plugin-proposal-json-strings": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.4.tgz", @@ -1353,6 +1513,16 @@ "@babel/plugin-syntax-json-strings": "^7.8.0" } }, + "@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.11.0.tgz", + "integrity": "sha512-/f8p4z+Auz0Uaf+i8Ekf1iM7wUNLcViFUGiPxKeXvxTSl63B875YPiVdUDdem7hREcI0E0kSpEhS8tF5RphK7Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + } + }, "@babel/plugin-proposal-nullish-coalescing-operator": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.4.tgz", @@ -1405,6 +1575,16 @@ "@babel/plugin-syntax-optional-chaining": "^7.8.0" } }, + "@babel/plugin-proposal-private-methods": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.4.tgz", + "integrity": "sha512-wh5GJleuI8k3emgTg5KkJK6kHNsGEr0uBTDBuQUBJwckk9xs1ez79ioheEVVxMLyPscB0LfkbVHslQqIzWV6Bw==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, "@babel/plugin-proposal-unicode-property-regex": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.4.tgz", @@ -1424,6 +1604,15 @@ "@babel/helper-plugin-utils": "^7.8.0" } }, + "@babel/plugin-syntax-class-properties": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.4.tgz", + "integrity": "sha512-GCSBF7iUle6rNugfURwNmCGG3Z/2+opxAMLs1nND4bhEG5PuxTIggDBoeYYSujAlLtsupzOHYJQgPS3pivwXIA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, "@babel/plugin-syntax-dynamic-import": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", @@ -1433,6 +1622,15 @@ "@babel/helper-plugin-utils": "^7.8.0" } }, + "@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, "@babel/plugin-syntax-json-strings": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", @@ -1442,6 +1640,15 @@ "@babel/helper-plugin-utils": "^7.8.0" } }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, "@babel/plugin-syntax-nullish-coalescing-operator": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", @@ -1745,13 +1952,13 @@ } }, "@babel/plugin-transform-runtime": { - "version": "7.9.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.9.6.tgz", - "integrity": "sha512-qcmiECD0mYOjOIt8YHNsAP1SxPooC/rDmfmiSK9BNY72EitdSc7l44WTEklaWuFtbOEBjNhWWyph/kOImbNJ4w==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.11.0.tgz", + "integrity": "sha512-LFEsP+t3wkYBlis8w6/kmnd6Kb1dxTd+wGJ8MlxTGzQo//ehtqlVL4S9DNUa53+dtPSQobN2CXx4d81FqC58cw==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", "resolve": "^1.8.1", "semver": "^5.5.1" } @@ -1804,6 +2011,15 @@ "@babel/helper-plugin-utils": "^7.10.4" } }, + "@babel/plugin-transform-unicode-escapes": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.10.4.tgz", + "integrity": "sha512-y5XJ9waMti2J+e7ij20e+aH+fho7Wb7W8rNuu72aKRwCHFqQdhkdU2lo3uZ9tQuboEJcUFayXdARhcxLQ3+6Fg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, "@babel/plugin-transform-unicode-regex": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.4.tgz", @@ -1815,71 +2031,92 @@ } }, "@babel/preset-env": { - "version": "7.9.6", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.9.6.tgz", - "integrity": "sha512-0gQJ9RTzO0heXOhzftog+a/WyOuqMrAIugVYxMYf83gh1CQaQDjMtsOpqOwXyDL/5JcWsrCm8l4ju8QC97O7EQ==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.11.0.tgz", + "integrity": "sha512-2u1/k7rG/gTh02dylX2kL3S0IJNF+J6bfDSp4DI2Ma8QN6Y9x9pmAax59fsCk6QUQG0yqH47yJWA+u1I1LccAg==", "dev": true, "requires": { - "@babel/compat-data": "^7.9.6", - "@babel/helper-compilation-targets": "^7.9.6", - "@babel/helper-module-imports": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-proposal-async-generator-functions": "^7.8.3", - "@babel/plugin-proposal-dynamic-import": "^7.8.3", - "@babel/plugin-proposal-json-strings": "^7.8.3", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-proposal-numeric-separator": "^7.8.3", - "@babel/plugin-proposal-object-rest-spread": "^7.9.6", - "@babel/plugin-proposal-optional-catch-binding": "^7.8.3", - "@babel/plugin-proposal-optional-chaining": "^7.9.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.8.3", + "@babel/compat-data": "^7.11.0", + "@babel/helper-compilation-targets": "^7.10.4", + "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-proposal-async-generator-functions": "^7.10.4", + "@babel/plugin-proposal-class-properties": "^7.10.4", + "@babel/plugin-proposal-dynamic-import": "^7.10.4", + "@babel/plugin-proposal-export-namespace-from": "^7.10.4", + "@babel/plugin-proposal-json-strings": "^7.10.4", + "@babel/plugin-proposal-logical-assignment-operators": "^7.11.0", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.4", + "@babel/plugin-proposal-numeric-separator": "^7.10.4", + "@babel/plugin-proposal-object-rest-spread": "^7.11.0", + "@babel/plugin-proposal-optional-catch-binding": "^7.10.4", + "@babel/plugin-proposal-optional-chaining": "^7.11.0", + "@babel/plugin-proposal-private-methods": "^7.10.4", + "@babel/plugin-proposal-unicode-property-regex": "^7.10.4", "@babel/plugin-syntax-async-generators": "^7.8.0", + "@babel/plugin-syntax-class-properties": "^7.10.4", "@babel/plugin-syntax-dynamic-import": "^7.8.0", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", "@babel/plugin-syntax-json-strings": "^7.8.0", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", - "@babel/plugin-syntax-numeric-separator": "^7.8.0", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", "@babel/plugin-syntax-object-rest-spread": "^7.8.0", "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", "@babel/plugin-syntax-optional-chaining": "^7.8.0", - "@babel/plugin-syntax-top-level-await": "^7.8.3", - "@babel/plugin-transform-arrow-functions": "^7.8.3", - "@babel/plugin-transform-async-to-generator": "^7.8.3", - "@babel/plugin-transform-block-scoped-functions": "^7.8.3", - "@babel/plugin-transform-block-scoping": "^7.8.3", - "@babel/plugin-transform-classes": "^7.9.5", - "@babel/plugin-transform-computed-properties": "^7.8.3", - "@babel/plugin-transform-destructuring": "^7.9.5", - "@babel/plugin-transform-dotall-regex": "^7.8.3", - "@babel/plugin-transform-duplicate-keys": "^7.8.3", - "@babel/plugin-transform-exponentiation-operator": "^7.8.3", - "@babel/plugin-transform-for-of": "^7.9.0", - "@babel/plugin-transform-function-name": "^7.8.3", - "@babel/plugin-transform-literals": "^7.8.3", - "@babel/plugin-transform-member-expression-literals": "^7.8.3", - "@babel/plugin-transform-modules-amd": "^7.9.6", - "@babel/plugin-transform-modules-commonjs": "^7.9.6", - "@babel/plugin-transform-modules-systemjs": "^7.9.6", - "@babel/plugin-transform-modules-umd": "^7.9.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.8.3", - "@babel/plugin-transform-new-target": "^7.8.3", - "@babel/plugin-transform-object-super": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.9.5", - "@babel/plugin-transform-property-literals": "^7.8.3", - "@babel/plugin-transform-regenerator": "^7.8.7", - "@babel/plugin-transform-reserved-words": "^7.8.3", - "@babel/plugin-transform-shorthand-properties": "^7.8.3", - "@babel/plugin-transform-spread": "^7.8.3", - "@babel/plugin-transform-sticky-regex": "^7.8.3", - "@babel/plugin-transform-template-literals": "^7.8.3", - "@babel/plugin-transform-typeof-symbol": "^7.8.4", - "@babel/plugin-transform-unicode-regex": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.10.4", + "@babel/plugin-transform-arrow-functions": "^7.10.4", + "@babel/plugin-transform-async-to-generator": "^7.10.4", + "@babel/plugin-transform-block-scoped-functions": "^7.10.4", + "@babel/plugin-transform-block-scoping": "^7.10.4", + "@babel/plugin-transform-classes": "^7.10.4", + "@babel/plugin-transform-computed-properties": "^7.10.4", + "@babel/plugin-transform-destructuring": "^7.10.4", + "@babel/plugin-transform-dotall-regex": "^7.10.4", + "@babel/plugin-transform-duplicate-keys": "^7.10.4", + "@babel/plugin-transform-exponentiation-operator": "^7.10.4", + "@babel/plugin-transform-for-of": "^7.10.4", + "@babel/plugin-transform-function-name": "^7.10.4", + "@babel/plugin-transform-literals": "^7.10.4", + "@babel/plugin-transform-member-expression-literals": "^7.10.4", + "@babel/plugin-transform-modules-amd": "^7.10.4", + "@babel/plugin-transform-modules-commonjs": "^7.10.4", + "@babel/plugin-transform-modules-systemjs": "^7.10.4", + "@babel/plugin-transform-modules-umd": "^7.10.4", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.10.4", + "@babel/plugin-transform-new-target": "^7.10.4", + "@babel/plugin-transform-object-super": "^7.10.4", + "@babel/plugin-transform-parameters": "^7.10.4", + "@babel/plugin-transform-property-literals": "^7.10.4", + "@babel/plugin-transform-regenerator": "^7.10.4", + "@babel/plugin-transform-reserved-words": "^7.10.4", + "@babel/plugin-transform-shorthand-properties": "^7.10.4", + "@babel/plugin-transform-spread": "^7.11.0", + "@babel/plugin-transform-sticky-regex": "^7.10.4", + "@babel/plugin-transform-template-literals": "^7.10.4", + "@babel/plugin-transform-typeof-symbol": "^7.10.4", + "@babel/plugin-transform-unicode-escapes": "^7.10.4", + "@babel/plugin-transform-unicode-regex": "^7.10.4", "@babel/preset-modules": "^0.1.3", - "@babel/types": "^7.9.6", - "browserslist": "^4.11.1", + "@babel/types": "^7.11.0", + "browserslist": "^4.12.0", "core-js-compat": "^3.6.2", "invariant": "^2.2.2", "levenary": "^1.1.1", "semver": "^5.5.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.11.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", + "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/preset-modules": { @@ -1896,9 +2133,9 @@ } }, "@babel/runtime": { - "version": "7.9.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.6.tgz", - "integrity": "sha512-64AF1xY3OAkFHqOb9s4jpgk1Mm5vDZ4L3acHvAml+53nO1XbXLuDodsVpO4OIUsmemlUHMxNdYMNJmsvOwLrvQ==", + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", + "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", "dev": true, "requires": { "regenerator-runtime": "^0.13.4" @@ -1998,67 +2235,27 @@ "dev": true }, "@jsdevtools/coverage-istanbul-loader": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@jsdevtools/coverage-istanbul-loader/-/coverage-istanbul-loader-3.0.3.tgz", - "integrity": "sha512-TAdNkeGB5Fe4Og+ZkAr1Kvn9by2sfL44IAHFtxlh1BA1XJ5cLpO9iSNki5opWESv3l3vSHsZ9BNKuqFKbEbFaA==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@jsdevtools/coverage-istanbul-loader/-/coverage-istanbul-loader-3.0.5.tgz", + "integrity": "sha512-EUCPEkaRPvmHjWAAZkWMT7JDzpw7FKB00WTISaiXsbNOd5hCHg77XLA8sLYLFDo1zepYLo2w7GstN8YBqRXZfA==", "dev": true, "requires": { "convert-source-map": "^1.7.0", - "istanbul-lib-instrument": "^4.0.1", - "loader-utils": "^1.4.0", + "istanbul-lib-instrument": "^4.0.3", + "loader-utils": "^2.0.0", "merge-source-map": "^1.1.0", - "schema-utils": "^2.6.4" - }, - "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - } - } + "schema-utils": "^2.7.0" } }, "@ngtools/webpack": { - "version": "10.0.8", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-10.0.8.tgz", - "integrity": "sha512-Qv4v7O4VGeWuXjRThd/mdC2I4cJOgQ7kDrVN7vkDB2EW5xtRB+/4hghvFeO3bD11FLuFvCxBMb0HbwyKoVQgEQ==", + "version": "10.1.4", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-10.1.4.tgz", + "integrity": "sha512-t1KFgA6XSOtp0KuE81fWgTYksjJnMcFeKSIuaUPeG3XQQj8ghlMTIsrUx+5/TfGaDO2U/bobsAsvx9qbtyuzNA==", "dev": true, "requires": { - "@angular-devkit/core": "10.0.8", - "enhanced-resolve": "4.1.1", - "rxjs": "6.5.5", + "@angular-devkit/core": "10.1.4", + "enhanced-resolve": "4.3.0", "webpack-sources": "1.4.3" - }, - "dependencies": { - "rxjs": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz", - "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", - "dev": true - } } }, "@ngx-translate/core": { @@ -2175,20 +2372,20 @@ "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=" }, "@schematics/angular": { - "version": "10.1.3", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-10.1.3.tgz", - "integrity": "sha512-X3tNnpfF/jkl1KcyCC8PaOYogQlTZ9s7Yuz0va0DAVOptIqorpf8e6+lY0PPLKshaK9TSiFUcQ8SYYnjAVKcdA==", + "version": "10.1.4", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-10.1.4.tgz", + "integrity": "sha512-MWxyrKEiXqNCZ0Uh3zM/iWouQTOWalGy2gFn6Fx6UBgm7nPYgeXoX7wYiCAKIryoehaOFfs/Pw3zfCGgp/gUOw==", "dev": true, "requires": { - "@angular-devkit/core": "10.1.3", - "@angular-devkit/schematics": "10.1.3", + "@angular-devkit/core": "10.1.4", + "@angular-devkit/schematics": "10.1.4", "jsonc-parser": "2.3.0" }, "dependencies": { "@angular-devkit/core": { - "version": "10.1.3", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-10.1.3.tgz", - "integrity": "sha512-Ub31/eqFtSuQy3V+B74Jt0jAUw8fs8sbd0ZL2UHYUJyrwm20iIRam+mOD3Sj8HFrDGLR8m56KsxJ12KvC1oxtQ==", + "version": "10.1.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-10.1.4.tgz", + "integrity": "sha512-B1cwVcfChBvmEacydE2uqZ1UC2ez1G+KY0GyVnCQKpAb/DdfDgtaYjTx9JLvGQjE/BlVklEj8YCKDjVV0WPE5g==", "dev": true, "requires": { "ajv": "6.12.4", @@ -2234,13 +2431,13 @@ } }, "@schematics/update": { - "version": "0.1001.3", - "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.1001.3.tgz", - "integrity": "sha512-ah4YHjEXACmpX0i3cAn5OguH5S430HD+zbxlMu4AC93A8W52ll97vqvUVF8NLZ6RKcOV/8tXmzgzvJDe07i8yQ==", + "version": "0.1001.4", + "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.1001.4.tgz", + "integrity": "sha512-E2xIPWQoHgv+CRAYWV0LSNoa8JmOcgyxlrQvn44f6A80ySNDyrfcRP8VNzpk1UnGkBcjwEVhYeLuY+F0aguC3g==", "dev": true, "requires": { - "@angular-devkit/core": "10.1.3", - "@angular-devkit/schematics": "10.1.3", + "@angular-devkit/core": "10.1.4", + "@angular-devkit/schematics": "10.1.4", "@yarnpkg/lockfile": "1.1.0", "ini": "1.3.5", "npm-package-arg": "^8.0.0", @@ -2250,9 +2447,9 @@ }, "dependencies": { "@angular-devkit/core": { - "version": "10.1.3", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-10.1.3.tgz", - "integrity": "sha512-Ub31/eqFtSuQy3V+B74Jt0jAUw8fs8sbd0ZL2UHYUJyrwm20iIRam+mOD3Sj8HFrDGLR8m56KsxJ12KvC1oxtQ==", + "version": "10.1.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-10.1.4.tgz", + "integrity": "sha512-B1cwVcfChBvmEacydE2uqZ1UC2ez1G+KY0GyVnCQKpAb/DdfDgtaYjTx9JLvGQjE/BlVklEj8YCKDjVV0WPE5g==", "dev": true, "requires": { "ajv": "6.12.4", @@ -3652,22 +3849,22 @@ "dev": true }, "cacache": { - "version": "15.0.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.3.tgz", - "integrity": "sha512-bc3jKYjqv7k4pWh7I/ixIjfcjPul4V4jme/WbjvwGS5LzoPL/GzXr4C5EgPNLO/QEZl9Oi61iGitYEdwcrwLCQ==", + "version": "15.0.5", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.5.tgz", + "integrity": "sha512-lloiL22n7sOjEEXdL8NAjTgv9a1u43xICE9/203qonkZUCj5X1UEWIdf2/Y0d6QcCtMzbKQyhrcDbdvlZTs/+A==", "dev": true, "requires": { + "@npmcli/move-file": "^1.0.1", "chownr": "^2.0.0", "fs-minipass": "^2.0.0", "glob": "^7.1.4", "infer-owner": "^1.0.4", - "lru-cache": "^5.1.1", + "lru-cache": "^6.0.0", "minipass": "^3.1.1", "minipass-collect": "^1.0.2", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.2", "mkdirp": "^1.0.3", - "move-file": "^2.0.0", "p-map": "^4.0.0", "promise-inflight": "^1.0.1", "rimraf": "^3.0.2", @@ -3682,6 +3879,15 @@ "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", "dev": true }, + "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==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, "mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", @@ -4017,17 +4223,6 @@ "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", "dev": true }, - "clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - } - }, "clone-regexp": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clone-regexp/-/clone-regexp-2.2.0.tgz", @@ -4054,9 +4249,9 @@ "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" }, "codelyzer": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-6.0.0.tgz", - "integrity": "sha512-edJIQCIcxD9DhVSyBEdJ38AbLikm515Wl91t5RDGNT88uA6uQdTm4phTWfn9JhzAI8kXNUcfYyAE90lJElpGtA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-6.0.1.tgz", + "integrity": "sha512-cOyGQgMdhnRYtW2xrJUNrNYDjEgwQ+BrE2y93Bwz3h4DJ6vJRLfupemU5N3pbYsUlBHJf0u1j1UGk+NLW4d97g==", "dev": true, "requires": { "@angular/compiler": "9.0.0", @@ -4466,52 +4661,6 @@ "webpack-sources": "^1.4.3" }, "dependencies": { - "cacache": { - "version": "15.0.5", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.5.tgz", - "integrity": "sha512-lloiL22n7sOjEEXdL8NAjTgv9a1u43xICE9/203qonkZUCj5X1UEWIdf2/Y0d6QcCtMzbKQyhrcDbdvlZTs/+A==", - "dev": true, - "requires": { - "@npmcli/move-file": "^1.0.1", - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", - "infer-owner": "^1.0.4", - "lru-cache": "^6.0.0", - "minipass": "^3.1.1", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^1.0.3", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^8.0.0", - "tar": "^6.0.2", - "unique-filename": "^1.1.1" - } - }, - "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, "p-limit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.0.2.tgz", @@ -4520,15 +4669,6 @@ "requires": { "p-try": "^2.0.0" } - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } } } }, @@ -4707,56 +4847,35 @@ } }, "css-loader": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.5.3.tgz", - "integrity": "sha512-UEr9NH5Lmi7+dguAm+/JSPovNjYbm2k3TK58EiwQHzOHH5Jfq1Y+XoP2bQO6TMn7PptMd0opxxedAWcaSTRKHw==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-4.2.2.tgz", + "integrity": "sha512-omVGsTkZPVwVRpckeUnLshPp12KsmMSLqYxs12+RzM9jRR5Y+Idn/tBffjXRvOE+qW7if24cuceFJqYR5FmGBg==", "dev": true, "requires": { - "camelcase": "^5.3.1", + "camelcase": "^6.0.0", "cssesc": "^3.0.0", "icss-utils": "^4.1.1", - "loader-utils": "^1.2.3", - "normalize-path": "^3.0.0", - "postcss": "^7.0.27", + "loader-utils": "^2.0.0", + "postcss": "^7.0.32", "postcss-modules-extract-imports": "^2.0.0", - "postcss-modules-local-by-default": "^3.0.2", + "postcss-modules-local-by-default": "^3.0.3", "postcss-modules-scope": "^2.2.0", "postcss-modules-values": "^3.0.0", - "postcss-value-parser": "^4.0.3", - "schema-utils": "^2.6.6", - "semver": "^6.3.0" + "postcss-value-parser": "^4.1.0", + "schema-utils": "^2.7.0", + "semver": "^7.3.2" }, "dependencies": { "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.0.0.tgz", + "integrity": "sha512-8KMDF1Vz2gzOq54ONPJS65IvTUaB1cHJ2DMM7MbPmLZljDH1qpzzLsWdiN9pHh6qvkRVDTi/07+eNGch/oLU4w==", "dev": true }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - } - }, "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", "dev": true } } @@ -4789,14 +4908,13 @@ "dev": true }, "css-selector-tokenizer": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.2.tgz", - "integrity": "sha512-yj856NGuAymN6r8bn8/Jl46pR+OC3eEvAhfGYDUe7YPtTPAYrSSw4oAniZ9Y8T5B92hjhwTBLUen0/vKPxf6pw==", + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.3.tgz", + "integrity": "sha512-jWQv3oCEL5kMErj4wRnK/OPoBi0D+P1FR2cDCKYPaMeD2eW3/mttav8HT4hT1CKopiJI/psEULjkClhvJo4Lvg==", "dev": true, "requires": { "cssesc": "^3.0.0", - "fastparse": "^1.1.2", - "regexpu-core": "^4.6.0" + "fastparse": "^1.1.2" } }, "css-tree": { @@ -4810,9 +4928,9 @@ } }, "css-what": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.3.0.tgz", - "integrity": "sha512-pv9JPyatiPaQ6pf4OvD/dbfm0o5LviWmwxNWzblYf/1u9QZd0ihV+PMwy5jdQWQ3349kZmKEx9WXuSka2dM4cg==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.1.tgz", + "integrity": "sha512-wHOppVDKl4vTAOWzJt5Ek37Sgd9qq1Bmj/T1OjvicWbU5W7ru7Pqbn0Jdqii3Drx/h+dixHKXNhZYx7blthL7g==", "dev": true }, "cssauron": { @@ -5635,9 +5753,9 @@ } }, "enhanced-resolve": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz", - "integrity": "sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz", + "integrity": "sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ==", "dev": true, "requires": { "graceful-fs": "^4.1.2", @@ -7514,12 +7632,11 @@ "dev": true }, "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, @@ -7832,6 +7949,12 @@ "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", "dev": true }, + "is-negative-zero": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz", + "integrity": "sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE=", + "dev": true + }, "is-number": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", @@ -8181,11 +8304,12 @@ "dev": true }, "jest-worker": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.0.0.tgz", - "integrity": "sha512-pPaYa2+JnwmiZjK9x7p9BoZht+47ecFCDFA/CJxspHzeDvQcfVBLWzCiWyo+EGrSiQMWZtCFo9iSvMZnAAo8vw==", + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.3.0.tgz", + "integrity": "sha512-Vmpn2F6IASefL+DVBhPzI2J9/GJUsqzomdeN+P+dK8/jKxbh8R3BtFnx3FIta7wYlPU62cpJMJQo4kuOowcMnw==", "dev": true, "requires": { + "@types/node": "*", "merge-stream": "^2.0.0", "supports-color": "^7.0.0" }, @@ -8639,6 +8763,12 @@ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true }, + "klona": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.4.tgz", + "integrity": "sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA==", + "dev": true + }, "known-css-properties": { "version": "0.19.0", "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.19.0.tgz", @@ -8678,15 +8808,15 @@ } }, "less-loader": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-6.1.0.tgz", - "integrity": "sha512-/jLzOwLyqJ7Kt3xg5sHHkXtOyShWwFj410K9Si9WO+/h8rmYxxkSR0A3/hFEntWudE20zZnWMtpMYnLzqTVdUA==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-6.2.0.tgz", + "integrity": "sha512-Cl5h95/Pz/PWub/tCBgT1oNMFeH1WTD33piG80jn5jr12T4XbxZcjThwNXDQ7AG649WEynuIzO4b0+2Tn9Qolg==", "dev": true, "requires": { "clone": "^2.1.2", - "less": "^3.11.1", + "less": "^3.11.3", "loader-utils": "^2.0.0", - "schema-utils": "^2.6.6" + "schema-utils": "^2.7.0" } }, "leven": { @@ -8705,9 +8835,9 @@ } }, "license-webpack-plugin": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-2.2.0.tgz", - "integrity": "sha512-XPsdL/0brSHf+7dXIlRqotnCQ58RX2au6otkOg4U3dm8uH+Ka/fW4iukEs95uXm+qKe/SBs+s1Ll/aQddKG+tg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-2.3.0.tgz", + "integrity": "sha512-JK/DXrtN6UeYQSgkg5q1+pgJ8aiKPL9tnz9Wzw+Ikkf+8mJxG56x6t8O+OH/tAeF/5NREnelTEMyFtbJNkjH4w==", "dev": true, "requires": { "@types/webpack-sources": "^0.1.5", @@ -9261,9 +9391,9 @@ "dev": true }, "mini-css-extract-plugin": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.9.0.tgz", - "integrity": "sha512-lp3GeY7ygcgAmVIcRPBVhIkf8Us7FZjA+ILpal44qLdSu11wmjKQ3d9k15lfD7pO4esu9eUIAW7qiYIBppv40A==", + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.10.0.tgz", + "integrity": "sha512-QgKgJBjaJhxVPwrLNqqwNS0AGkuQQ31Hp4xGXEK/P7wehEg6qmNtReHKai3zRXqY60wGVWLYcOMJK2b98aGc3A==", "dev": true, "requires": { "loader-utils": "^1.1.0", @@ -9465,23 +9595,6 @@ "run-queue": "^1.0.3" } }, - "move-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/move-file/-/move-file-2.0.0.tgz", - "integrity": "sha512-cdkdhNCgbP5dvS4tlGxZbD+nloio9GIimP57EjqFhwLcMjnU+XJKAZzlmg/TN/AK1LuNAdTSvm3CPPP4Xkv0iQ==", - "dev": true, - "requires": { - "path-exists": "^4.0.0" - }, - "dependencies": { - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - } - } - }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -10047,13 +10160,62 @@ "dev": true }, "object-is": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.2.tgz", - "integrity": "sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.3.tgz", + "integrity": "sha512-teyqLvFWzLkq5B9ki8FVWA902UER2qkxmdA4nLf+wjOLAWgxzCWZNCxpDq9MvE8MmhWNr+I8w3BN49Vx36Y6Xg==", "dev": true, "requires": { "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" + "es-abstract": "^1.18.0-next.1" + }, + "dependencies": { + "es-abstract": { + "version": "1.18.0-next.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", + "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-negative-zero": "^2.0.0", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + }, + "is-callable": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", + "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", + "dev": true + }, + "is-regex": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", + "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "object.assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.1.tgz", + "integrity": "sha512-VT/cxmx5yaoHSOTSyrCygIDFco+RsibY2NM0a4RdEeY/4KgqezwFtK1yr3U67xYhqJSlASm2pKhLVzPj2lr4bA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.0", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + } } }, "object-keys": { @@ -10159,9 +10321,9 @@ } }, "open": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/open/-/open-7.0.4.tgz", - "integrity": "sha512-brSA+/yq+b08Hsr4c8fsEW2CRzk1BmfN3SAK/5VCHQ9bdoZJ4qa/+AfR0xHjlbbZUyPkUHs1b8x1RqdyZdkVqQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/open/-/open-7.2.0.tgz", + "integrity": "sha512-4HeyhxCvBTI5uBePsAdi55C5fmqnWZ2e2MlmvWi5KW5tdH5rxoiv/aMtbeVxKZc3eWkT1GymMnLG8XC4Rq4TDQ==", "dev": true, "requires": { "is-docker": "^2.0.0", @@ -10213,12 +10375,11 @@ "dev": true }, "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, @@ -10622,6 +10783,23 @@ "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", "optional": true }, + "parse5-htmlparser2-tree-adapter": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", + "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "dev": true, + "requires": { + "parse5": "^6.0.1" + }, + "dependencies": { + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + } + } + }, "parseqs": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", @@ -10813,9 +10991,9 @@ } }, "postcss-calc": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.4.tgz", - "integrity": "sha512-0I79VRAd1UTkaHzY9w83P39YGO/M3bG7/tNLrHGEunBolfoGM0hSjrGvjoeaj0JE/zIw5GsI2KZ0UwDJqv5hjw==", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.5.tgz", + "integrity": "sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==", "dev": true, "requires": { "postcss": "^7.0.27", @@ -12371,9 +12549,9 @@ } }, "regenerator-runtime": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", - "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==", + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==", "dev": true }, "regenerator-transform": { @@ -12780,9 +12958,9 @@ } }, "rollup": { - "version": "2.10.9", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.10.9.tgz", - "integrity": "sha512-dY/EbjiWC17ZCUSyk14hkxATAMAShkMsD43XmZGWjLrgFj15M3Dw2kEkA9ns64BiLFm9PKN6vTQw8neHwK74eg==", + "version": "2.26.5", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.26.5.tgz", + "integrity": "sha512-rCyFG3ZtQdnn9YwfuAVH0l/Om34BdO5lwCA0W6Hq+bNB21dVEBbCRxhaHOmu1G7OBFDWytbzAC104u7rxHwGjA==", "dev": true, "requires": { "fsevents": "~2.1.2" @@ -12844,51 +13022,31 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "sass": { - "version": "1.26.5", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.26.5.tgz", - "integrity": "sha512-FG2swzaZUiX53YzZSjSakzvGtlds0lcbF+URuU9mxOv7WBh7NhXEVDa4kPKN4hN6fC2TkOTOKqiqp6d53N9X5Q==", + "version": "1.26.10", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.26.10.tgz", + "integrity": "sha512-bzN0uvmzfsTvjz0qwccN1sPm2HxxpNI/Xa+7PlUEMS+nQvbyuEK7Y0qFqxlPHhiNHb1Ze8WQJtU31olMObkAMw==", "dev": true, "requires": { "chokidar": ">=2.0.0 <4.0.0" } }, "sass-loader": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-8.0.2.tgz", - "integrity": "sha512-7o4dbSK8/Ol2KflEmSco4jTjQoV988bM82P9CZdmo9hR3RLnvNc0ufMNdMrB0caq38JQ/FgF4/7RcbcfKzxoFQ==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-10.0.1.tgz", + "integrity": "sha512-b2PSldKVTS3JcFPHSrEXh3BeAfR7XknGiGCAO5aHruR3Pf3kqLP3Gb2ypXLglRrAzgZkloNxLZ7GXEGDX0hBUQ==", "dev": true, "requires": { - "clone-deep": "^4.0.1", - "loader-utils": "^1.2.3", - "neo-async": "^2.6.1", - "schema-utils": "^2.6.1", - "semver": "^6.3.0" + "klona": "^2.0.3", + "loader-utils": "^2.0.0", + "neo-async": "^2.6.2", + "schema-utils": "^2.7.0", + "semver": "^7.3.2" }, "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - } - }, "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", "dev": true } } @@ -13172,15 +13330,6 @@ "safe-buffer": "^5.0.1" } }, - "shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dev": true, - "requires": { - "kind-of": "^6.0.2" - } - }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", @@ -13637,25 +13786,25 @@ "dev": true }, "source-map-loader": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-1.0.0.tgz", - "integrity": "sha512-ZayyQCSCrQazN50aCvuS84lJT4xc1ZAcykH5blHaBdVveSwjiFK8UGMPvao0ho54DTb0Jf7m57uRRG/YYUZ2Fg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-1.0.2.tgz", + "integrity": "sha512-oX8d6ndRjN+tVyjj6PlXSyFPhDdVAPsZA30nD3/II8g4uOv8fCz0DMn5sy8KtVbDfKQxOpGwGJnK3xIW3tauDw==", "dev": true, "requires": { "data-urls": "^2.0.0", - "iconv-lite": "^0.5.1", + "iconv-lite": "^0.6.2", "loader-utils": "^2.0.0", - "schema-utils": "^2.6.6", - "source-map": "^0.6.0" + "schema-utils": "^2.7.0", + "source-map": "^0.6.1" }, "dependencies": { "iconv-lite": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.5.2.tgz", - "integrity": "sha512-kERHXvpSaB4aU3eANwidg79K8FlrN77m8G9V+0vOR3HYaRifrlwMEpT7ZBJqLSEIHnEgJTHcWK82wwLwwKwtag==", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.2.tgz", + "integrity": "sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==", "dev": true, "requires": { - "safer-buffer": ">= 2.1.2 < 3" + "safer-buffer": ">= 2.1.2 < 3.0.0" } } } @@ -14342,18 +14491,18 @@ } }, "stylus": { - "version": "0.54.7", - "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.7.tgz", - "integrity": "sha512-Yw3WMTzVwevT6ZTrLCYNHAFmanMxdylelL3hkWNgPMeTCpMwpV3nXjpOHuBXtFv7aiO2xRuQS6OoAdgkNcSNug==", + "version": "0.54.8", + "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.8.tgz", + "integrity": "sha512-vr54Or4BZ7pJafo2mpf0ZcwA74rpuYCZbxrHBsH8kbcXOwSfvBFwsRfpGO5OD5fhG5HDCFW737PKaawI7OqEAg==", "dev": true, "requires": { "css-parse": "~2.0.0", "debug": "~3.1.0", - "glob": "^7.1.3", - "mkdirp": "~0.5.x", + "glob": "^7.1.6", + "mkdirp": "~1.0.4", "safer-buffer": "^2.1.2", "sax": "~1.2.4", - "semver": "^6.0.0", + "semver": "^6.3.0", "source-map": "^0.7.3" }, "dependencies": { @@ -14366,6 +14515,12 @@ "ms": "2.0.0" } }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -14569,9 +14724,9 @@ } }, "terser": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.7.0.tgz", - "integrity": "sha512-Lfb0RiZcjRDXCC3OSHJpEkxJ9Qeqs6mp2v4jf2MHfy8vGERmVDuvjXdd/EnP5Deme5F2yBRBymKmKHCBg2echw==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.3.0.tgz", + "integrity": "sha512-XTT3D3AwxC54KywJijmY2mxZ8nJiEjBHVYzq8l9OaYuRFWeQNBwvipuzzYEP4e+/AVcd1hqG/CqgsdIRyT45Fg==", "dev": true, "requires": { "commander": "^2.20.0", @@ -14580,29 +14735,29 @@ } }, "terser-webpack-plugin": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-3.0.1.tgz", - "integrity": "sha512-eFDtq8qPUEa9hXcUzTwKXTnugIVtlqc1Z/ZVhG8LmRT3lgRY13+pQTnFLY2N7ATB6TKCHuW/IGjoAnZz9wOIqw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-4.1.0.tgz", + "integrity": "sha512-0ZWDPIP8BtEDZdChbufcXUigOYk6dOX/P/X0hWxqDDcVAQLb8Yy/0FAaemSfax3PAA67+DJR778oz8qVbmy4hA==", "dev": true, "requires": { - "cacache": "^15.0.3", + "cacache": "^15.0.5", "find-cache-dir": "^3.3.1", - "jest-worker": "^26.0.0", - "p-limit": "^2.3.0", + "jest-worker": "^26.3.0", + "p-limit": "^3.0.2", "schema-utils": "^2.6.6", - "serialize-javascript": "^3.0.0", + "serialize-javascript": "^4.0.0", "source-map": "^0.6.1", - "terser": "^4.6.13", + "terser": "^5.0.0", "webpack-sources": "^1.4.3" }, "dependencies": { - "serialize-javascript": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.1.0.tgz", - "integrity": "sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg==", + "p-limit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.0.2.tgz", + "integrity": "sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg==", "dev": true, "requires": { - "randombytes": "^2.1.0" + "p-try": "^2.0.0" } } } @@ -15354,9 +15509,9 @@ "dev": true }, "uuid": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.0.tgz", - "integrity": "sha512-fX6Z5o4m6XsXBdli9g7DtWgAx+osMsRRZFKma1mIUsLCz6vRvv+pz5VNbyu9UEDzpMWulZfvpgb/cmDXVulYFQ==" + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.1.tgz", + "integrity": "sha512-FOmRr+FmWEIG8uhZv6C2bTgEVXsHk08kE7mPlrBbEe+c3r9pjceVPgupIfNIhc4yx55H69OXANrUaSuu9eInKg==" }, "v8-compile-cache": { "version": "2.1.1", @@ -15776,9 +15931,9 @@ "dev": true }, "webpack": { - "version": "4.43.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.43.0.tgz", - "integrity": "sha512-GW1LjnPipFW2Y78OOab8NJlCflB7EFskMih2AHdvjbpKMeDJqEgSx24cXXXiPS65+WSwVyxtDsJH6jGX2czy+g==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.44.1.tgz", + "integrity": "sha512-4UOGAohv/VGUNQJstzEywwNxqX417FnjZgZJpJQegddzPmTvph37eBIRbRTfdySXzVtJXLJfbMN3mMYhM6GdmQ==", "dev": true, "requires": { "@webassemblyjs/ast": "1.9.0", @@ -15789,7 +15944,7 @@ "ajv": "^6.10.2", "ajv-keywords": "^3.4.1", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^4.1.0", + "enhanced-resolve": "^4.3.0", "eslint-scope": "^4.0.3", "json-parse-better-errors": "^1.0.2", "loader-runner": "^2.4.0", @@ -15802,7 +15957,7 @@ "schema-utils": "^1.0.0", "tapable": "^1.1.3", "terser-webpack-plugin": "^1.4.3", - "watchpack": "^1.6.1", + "watchpack": "^1.7.4", "webpack-sources": "^1.4.1" }, "dependencies": { @@ -15999,6 +16154,17 @@ "safe-buffer": "~5.1.0" } }, + "terser": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", + "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + } + }, "terser-webpack-plugin": { "version": "1.4.5", "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", @@ -16567,9 +16733,9 @@ "dev": true }, "whatwg-url": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.2.2.tgz", - "integrity": "sha512-PcVnO6NiewhkmzV0qn7A+UZ9Xx4maNTI+O+TShmfE4pqjoCMwUMjkvoNhNHPTvgR7QH9Xt3R13iHuWy2sToFxQ==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.3.0.tgz", + "integrity": "sha512-BQRf/ej5Rp3+n7k0grQXZj9a1cHtsp4lqj01p59xBWFKdezR8sO37XnpafwNqiFac/v2Il12EIMjX/Y4VZtT8Q==", "dev": true, "requires": { "lodash.sortby": "^4.7.0", @@ -16620,9 +16786,9 @@ } }, "worker-plugin": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/worker-plugin/-/worker-plugin-4.0.3.tgz", - "integrity": "sha512-7hFDYWiKcE3yHZvemsoM9lZis/PzurHAEX1ej8PLCu818Rt6QqUAiDdxHPCKZctzmhqzPpcFSgvMCiPbtooqAg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/worker-plugin/-/worker-plugin-5.0.0.tgz", + "integrity": "sha512-AXMUstURCxDD6yGam2r4E34aJg6kW85IiaeX72hi+I1cxyaMUtrvVY6sbfpGKAj5e7f68Acl62BjQF5aOOx2IQ==", "dev": true, "requires": { "loader-utils": "^1.1.0" diff --git a/console/package.json b/console/package.json index 2cad452d88..a73721c1ad 100644 --- a/console/package.json +++ b/console/package.json @@ -41,18 +41,18 @@ "rxjs": "~6.6.3", "ts-protoc-gen": "^0.13.0", "tslib": "^2.0.1", - "uuid": "^8.3.0", + "uuid": "^8.3.1", "zone.js": "~0.11.1" }, "devDependencies": { - "@angular/cli": "~10.1.3", - "@angular-devkit/build-angular": "~0.1000.8", + "@angular-devkit/build-angular": "~0.1001.4", + "@angular/cli": "~10.1.4", "@angular/compiler-cli": "~10.0.11", "@types/jasmine": "~3.5.13", - "@angular/language-service": "~10.1.3", + "@angular/language-service": "~10.1.4", "@types/jasminewd2": "~2.0.3", "@types/node": "^14.11.2", - "codelyzer": "^6.0.0", + "codelyzer": "^6.0.1", "jasmine-core": "~3.6.0", "jasmine-spec-reporter": "~6.0.0", "karma": "~5.2.3", diff --git a/console/src/app/app.component.scss b/console/src/app/app.component.scss index f5bf60738c..34c84ede69 100644 --- a/console/src/app/app.component.scss +++ b/console/src/app/app.component.scss @@ -208,16 +208,16 @@ margin: .5rem 0; span { - border: 1px solid #ffffff10; + border: 1px solid #81868a40; padding: 2px 1rem; border-radius: 50vw; - color: #8795a1; + color: var(--grey); font-size: 12px; } .line { display: block; - background-color: #ffffff10; + background-color: #81868a40; height: 1px; margin: .5rem 0; flex: 1; @@ -236,7 +236,7 @@ .show-all { $primary: map-get($theme, primary); color: mat-color($primary, 300) !important; - border-bottom: 2px solid #8795a1; + border-bottom: 2px solid var(--grey); margin-bottom: .5rem; } /* stylelint-enable */ diff --git a/console/src/app/guards/user.guard.ts b/console/src/app/guards/user.guard.ts new file mode 100644 index 0000000000..f0cdb66c0f --- /dev/null +++ b/console/src/app/guards/user.guard.ts @@ -0,0 +1,28 @@ +import { Injectable } from '@angular/core'; +import { ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot } from '@angular/router'; +import { Observable } from 'rxjs'; +import { map, tap } from 'rxjs/operators'; + +import { GrpcAuthService } from '../services/grpc-auth.service'; + + +@Injectable({ + providedIn: 'root', +}) +export class UserGuard implements CanActivate { + constructor(private authService: GrpcAuthService, private router: Router) { } + + public canActivate( + route: ActivatedRouteSnapshot, + state: RouterStateSnapshot, + ): Observable | Promise | boolean { + return this.authService.user.pipe( + map(user => user.id !== route.params.id), + tap((isNotMe) => { + if (!isNotMe) { + this.router.navigate(['/users', 'me']); + } + }), + ); + } +} diff --git a/console/src/app/modules/accounts-card/accounts-card.component.html b/console/src/app/modules/accounts-card/accounts-card.component.html index 32efb56047..4a8b6cdd2d 100644 --- a/console/src/app/modules/accounts-card/accounts-card.component.html +++ b/console/src/app/modules/accounts-card/accounts-card.component.html @@ -16,7 +16,7 @@
- {{user.displayName ? user.displayName : user.userName}} + {{user.displayName ? user.displayName : user.userName}} {{user.loginName}}
@@ -28,7 +28,7 @@ - {{'USER.ADDACCOUNT' | translate}} + {{'USER.ADDACCOUNT' | translate}} keyboard_arrow_right diff --git a/console/src/app/modules/accounts-card/accounts-card.component.scss b/console/src/app/modules/accounts-card/accounts-card.component.scss index 445547d05e..2494389039 100644 --- a/console/src/app/modules/accounts-card/accounts-card.component.scss +++ b/console/src/app/modules/accounts-card/accounts-card.component.scss @@ -41,9 +41,9 @@ display: flex; flex-direction: column; width: 100%; - border-top: 1px solid #ffffff30; - border-bottom: 1px solid #ffffff30; padding: .5rem 0; + border-top: 1px solid rgba(#8795a1, .3); + border-bottom: 1px solid rgba(#8795a1, .3); .row { padding: .5rem; @@ -84,7 +84,7 @@ display: flex; flex-direction: column; - .title { + .user-title { font-weight: 500; font-size: .9rem; line-height: 1rem; @@ -92,7 +92,7 @@ .email, .loginname { - color: #8795a1; + color: var(--grey); font-size: .8rem; line-height: 1rem; } diff --git a/console/src/app/modules/add-member-dialog/member-create-dialog.component.scss b/console/src/app/modules/add-member-dialog/member-create-dialog.component.scss index 2ef92e72a4..90e113d36a 100644 --- a/console/src/app/modules/add-member-dialog/member-create-dialog.component.scss +++ b/console/src/app/modules/add-member-dialog/member-create-dialog.component.scss @@ -3,7 +3,7 @@ } .desc { - color: #8795a1; + color: var(--grey); font-size: .9rem; } diff --git a/console/src/app/modules/add-member-dialog/member-create-dialog.component.ts b/console/src/app/modules/add-member-dialog/member-create-dialog.component.ts index 61fd2bdbf7..615358307d 100644 --- a/console/src/app/modules/add-member-dialog/member-create-dialog.component.ts +++ b/console/src/app/modules/add-member-dialog/member-create-dialog.component.ts @@ -23,7 +23,6 @@ export class MemberCreateDialogComponent { private grantId: string = ''; public preselectedUsers: Array = []; - public creationType!: CreationType; public creationTypes: CreationType[] = [ CreationType.IAM, diff --git a/console/src/app/modules/add-member-dialog/member-create-dialog.module.ts b/console/src/app/modules/add-member-dialog/member-create-dialog.module.ts index 8dabfb2438..9c2671c6b4 100644 --- a/console/src/app/modules/add-member-dialog/member-create-dialog.module.ts +++ b/console/src/app/modules/add-member-dialog/member-create-dialog.module.ts @@ -1,6 +1,6 @@ import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; -import { FormsModule } from '@angular/forms'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { MatButtonModule } from '@angular/material/button'; import { MatDialogModule } from '@angular/material/dialog'; import { MatFormFieldModule } from '@angular/material/form-field'; @@ -25,6 +25,7 @@ import { MemberCreateDialogComponent } from './member-create-dialog.component'; MatFormFieldModule, MatSelectModule, FormsModule, + ReactiveFormsModule, SearchUserAutocompleteModule, SearchRolesAutocompleteModule, SearchProjectAutocompleteModule, diff --git a/console/src/app/modules/card/card.component.scss b/console/src/app/modules/card/card.component.scss index 2766951543..f8067632c5 100644 --- a/console/src/app/modules/card/card.component.scss +++ b/console/src/app/modules/card/card.component.scss @@ -34,7 +34,7 @@ .desc { font-size: .9rem; - color: #8795a1; + color: var(--grey); } } diff --git a/console/src/app/modules/card/card.scss b/console/src/app/modules/card/card.scss index 1ee7b20dbd..ed053a208f 100644 --- a/console/src/app/modules/card/card.scss +++ b/console/src/app/modules/card/card.scss @@ -11,7 +11,7 @@ .card { background-color: $primary-dark; - transition: background-color .4s ease-in-out; + transition: background-color .3s cubic-bezier(.645, .045, .355, 1); border: 1px solid rgba($border-color, .2); box-sizing: border-box; border-radius: .5rem; diff --git a/console/src/app/modules/changes/changes.component.scss b/console/src/app/modules/changes/changes.component.scss index ddaf483c4d..7a4b9ad7fe 100644 --- a/console/src/app/modules/changes/changes.component.scss +++ b/console/src/app/modules/changes/changes.component.scss @@ -21,13 +21,13 @@ flex-direction: column; .editor { - color: #8795a1; + color: var(--grey); font-size: 12px; align-self: flex-end; } .seq { - color: #8795a1; + color: var(--grey); font-size: 12px; align-self: flex-end; } @@ -43,7 +43,7 @@ &.change-item-back { background-color: rgba($primary-dark, .93); - transition: background-color .4s ease-in-out; + transition: background-color .3s cubic-bezier(.645, .045, .355, 1); } } @@ -55,7 +55,7 @@ .end-container { font-size: 12px; - color: #8795a1; + color: var(--grey); } } } diff --git a/console/src/app/modules/contributors/contributors.component.html b/console/src/app/modules/contributors/contributors.component.html index 31e742cf8a..03d75a1f84 100644 --- a/console/src/app/modules/contributors/contributors.component.html +++ b/console/src/app/modules/contributors/contributors.component.html @@ -8,13 +8,19 @@
- + +
+ +
+
diff --git a/console/src/app/modules/contributors/contributors.component.scss b/console/src/app/modules/contributors/contributors.component.scss index 86a3021697..6df27398fd 100644 --- a/console/src/app/modules/contributors/contributors.component.scss +++ b/console/src/app/modules/contributors/contributors.component.scss @@ -9,7 +9,7 @@ .sub-header { font-size: .8rem; - color: #8795a1; + color: var(--grey); } .people { @@ -65,6 +65,17 @@ .avatar { pointer-events: none; } + + .sa-icon { + display: block; + width: 32px; + margin: 0 .5rem; + + i { + margin: auto; + font-size: 1.2rem; + } + } } .margin-neg { diff --git a/console/src/app/modules/detail-layout/detail-layout.component.scss b/console/src/app/modules/detail-layout/detail-layout.component.scss index 765a95b225..65abe29721 100644 --- a/console/src/app/modules/detail-layout/detail-layout.component.scss +++ b/console/src/app/modules/detail-layout/detail-layout.component.scss @@ -37,20 +37,16 @@ } .head { - display: flex; - align-items: center; margin-bottom: 2rem; - flex-wrap: wrap; h1 { font-size: 1.2rem; } .desc { - width: 100%; display: block; font-size: .9rem; - color: #8795a1; + color: var(--grey); } } } diff --git a/console/src/app/modules/idp-create/idp-create.component.scss b/console/src/app/modules/idp-create/idp-create.component.scss index c13ab1c069..9b44629fe5 100644 --- a/console/src/app/modules/idp-create/idp-create.component.scss +++ b/console/src/app/modules/idp-create/idp-create.component.scss @@ -37,7 +37,7 @@ flex-basis: 100%; margin: 0 .5rem; margin-bottom: 1rem; - color: #8795a1; + color: var(--grey); } .formfield { diff --git a/console/src/app/modules/idp-table/idp-table.component.scss b/console/src/app/modules/idp-table/idp-table.component.scss index f90b8aa3ec..20c8b2f27e 100644 --- a/console/src/app/modules/idp-table/idp-table.component.scss +++ b/console/src/app/modules/idp-table/idp-table.component.scss @@ -26,7 +26,7 @@ tr { outline: none; &.disabled * { - color: #8795a1; + color: var(--grey); } } diff --git a/console/src/app/modules/idp/idp.component.html b/console/src/app/modules/idp/idp.component.html index f9a94e0697..4001b9b91e 100644 --- a/console/src/app/modules/idp/idp.component.html +++ b/console/src/app/modules/idp/idp.component.html @@ -1,91 +1,95 @@ -
-
- -
- - {{ 'IDP.ID' | translate }} - - - - {{ 'IDP.NAME' | translate }} - - - +
+
+ +
+
+
+ + +

{{'IDP.DETAIL.OIDC.TITLE' | translate}}

+

{{'IDP.DETAIL.OIDC.DESCRIPTION' | translate}}

+ +
+ +
+ + {{ 'IDP.ISSUER' | translate }} + + + + {{ 'IDP.CLIENTID' | translate }} + + + + Update Client Secret + + + {{ 'IDP.CLIENTSECRET' | translate }} + + + + {{ 'IDP.SCOPESLIST' | translate }} + + + {{scope}} cancel + + + + + + + {{ 'IDP.IDPDISPLAYNAMMAPPING' | translate }} + + + {{ 'IDP.MAPPINTFIELD.'+field | translate }} + + + + + {{ 'IDP.USERNAMEMAPPING' | translate }} + + + {{ 'IDP.MAPPINTFIELD.'+field | translate }} + + + +
+
+ +
+ +
+
+
- - - -

{{'IDP.DETAIL.OIDC.TITLE' | translate}}

- -
- -
- - {{ 'IDP.ISSUER' | translate }} - - -
-
- - {{ 'IDP.CLIENTID' | translate }} - - -
-
- - Update Client Secret - - - {{ 'IDP.CLIENTSECRET' | translate }} - - -
-
- - {{ 'IDP.SCOPESLIST' | translate }} - - - {{scope}} cancel - - - - -
-
- - {{ 'IDP.IDPDISPLAYNAMMAPPING' | translate }} - - - {{ 'IDP.MAPPINTFIELD.'+field | translate }} - - - - - {{ 'IDP.USERNAMEMAPPING' | translate }} - - - {{ 'IDP.MAPPINTFIELD.'+field | translate }} - - - -
-
- - -
- - -
+ \ No newline at end of file diff --git a/console/src/app/modules/idp/idp.component.scss b/console/src/app/modules/idp/idp.component.scss index b09e939862..f176cdc6d2 100644 --- a/console/src/app/modules/idp/idp.component.scss +++ b/console/src/app/modules/idp/idp.component.scss @@ -9,6 +9,7 @@ .content { display: flex; + flex-direction: row; margin: 0 -.5rem; flex-wrap: wrap; @@ -16,26 +17,35 @@ flex-basis: 100%; margin: 0 .5rem; margin-bottom: 1rem; - color: #8795a1; + color: var(--grey); } .formfield { - flex: 1 0 auto; + flex: 1 1 auto; margin: 0 .5rem; + &.fullwidth { + flex-basis: 100%; + } + @media only screen and (max-width: 450px) { flex-basis: 100%; } } } -.continue-button { - margin-bottom: 4rem; - display: block; - padding: .5rem 4rem; +.btn-wrapper { + display: flex; + justify-content: flex-end; - @media only screen and (max-width: 450px) { - margin-top: 1rem; - margin-bottom: 2rem; + .continue-button { + margin-bottom: 4rem; + display: block; + padding: .5rem 4rem; + + @media only screen and (max-width: 450px) { + margin-top: 1rem; + margin-bottom: 2rem; + } } } diff --git a/console/src/app/modules/members-table/members-table.component.html b/console/src/app/modules/members-table/members-table.component.html new file mode 100644 index 0000000000..e371dd64a2 --- /dev/null +++ b/console/src/app/modules/members-table/members-table.component.html @@ -0,0 +1,98 @@ + + + + + + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + +
+ +
+
+
+
{{ 'PROJECT.MEMBER.USERID' | translate }} + {{member.userId}} {{ 'PROJECT.MEMBER.FIRSTNAME' | translate }} + {{member.firstName}} {{ 'PROJECT.MEMBER.LASTNAME' | translate }} + {{member.lastName}} {{ 'PROJECT.MEMBER.USERNAME' | translate }} + {{member.userName}} {{ 'PROJECT.MEMBER.EMAIL' | translate }} + {{member.email}} + + + {{ 'ROLESLABEL' | translate }} + + {{ 'ROLESLABEL' | translate }} + + + {{ role }} + + + +
+
+ + +
\ No newline at end of file diff --git a/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members/project-grant-members.component.scss b/console/src/app/modules/members-table/members-table.component.scss similarity index 56% rename from console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members/project-grant-members.component.scss rename to console/src/app/modules/members-table/members-table.component.scss index 12c28926cc..91ac8176b6 100644 --- a/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members/project-grant-members.component.scss +++ b/console/src/app/modules/members-table/members-table.component.scss @@ -1,9 +1,14 @@ +.icon-button { + margin-right: .5rem; +} .table-wrapper { - overflow: auto; + overflow-x: auto; .table, .paginator { + width: 100%; + td, th { padding: .5rem; @@ -26,10 +31,27 @@ width: 50px; max-width: 50px; } + } - .role { - display: inline-block; - margin: .25rem; + tr { + button { + visibility: hidden; + } + + &:hover { + button { + visibility: visible; + } + } + } + + .sa-icon { + display: block; + width: 32px; + margin: 0 .5rem; + + i { + margin: auto; } } } diff --git a/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members/project-grant-members.component.spec.ts b/console/src/app/modules/members-table/members-table.component.spec.ts similarity index 68% rename from console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members/project-grant-members.component.spec.ts rename to console/src/app/modules/members-table/members-table.component.spec.ts index ebe06195e3..7c2daf9de5 100644 --- a/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members/project-grant-members.component.spec.ts +++ b/console/src/app/modules/members-table/members-table.component.spec.ts @@ -4,15 +4,15 @@ import { MatSortModule } from '@angular/material/sort'; import { MatTableModule } from '@angular/material/table'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; -import { ProjectGrantMembersComponent } from './project-grant-members.component'; +import { MembersTableComponent } from './members-table.component'; -describe('ProjectMembersComponent', () => { - let component: ProjectGrantMembersComponent; - let fixture: ComponentFixture; +describe('MembersTableComponent', () => { + let component: MembersTableComponent; + let fixture: ComponentFixture; beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [ProjectGrantMembersComponent], + declarations: [MembersTableComponent], imports: [ NoopAnimationsModule, MatPaginatorModule, @@ -23,7 +23,7 @@ describe('ProjectMembersComponent', () => { })); beforeEach(() => { - fixture = TestBed.createComponent(ProjectGrantMembersComponent); + fixture = TestBed.createComponent(MembersTableComponent); component = fixture.componentInstance; fixture.detectChanges(); }); diff --git a/console/src/app/modules/members-table/members-table.component.ts b/console/src/app/modules/members-table/members-table.component.ts new file mode 100644 index 0000000000..5d61d82b42 --- /dev/null +++ b/console/src/app/modules/members-table/members-table.component.ts @@ -0,0 +1,83 @@ +import { SelectionModel } from '@angular/cdk/collections'; +import { Component, EventEmitter, Input, OnDestroy, OnInit, Output, ViewChild } from '@angular/core'; +import { MatPaginator, PageEvent } from '@angular/material/paginator'; +import { MatSelectChange } from '@angular/material/select'; +import { MatTable } from '@angular/material/table'; +import { Observable, Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; +import { IamMembersDataSource } from 'src/app/pages/iam/iam-members/iam-members-datasource'; +import { OrgMembersDataSource } from 'src/app/pages/orgs/org-members/org-members-datasource'; +import { IamMemberView } from 'src/app/proto/generated/admin_pb'; +import { OrgMemberView, ProjectMemberView } from 'src/app/proto/generated/management_pb'; + +import { ProjectMembersDataSource } from '../project-members/project-members-datasource'; + +type View = OrgMemberView.AsObject | ProjectMemberView.AsObject | IamMemberView.AsObject; +type MemberDatasource = OrgMembersDataSource | ProjectMembersDataSource | IamMembersDataSource; + +@Component({ + selector: 'app-members-table', + templateUrl: './members-table.component.html', + styleUrls: ['./members-table.component.scss'], +}) +export class MembersTableComponent implements OnInit, OnDestroy { + public INITIALPAGESIZE: number = 25; + @Input() public disableWrite: boolean = false; + @Input() public canDelete: boolean = false; + @ViewChild(MatPaginator) public paginator!: MatPaginator; + @ViewChild(MatTable) public table!: MatTable; + @Input() public dataSource!: MemberDatasource; + public selection: SelectionModel = new SelectionModel(true, []); + @Input() public memberRoleOptions: string[] = []; + @Input() public factoryLoadFunc!: Function; + @Input() public refreshTrigger!: Observable; + @Output() public updateRoles: EventEmitter<{ member: View, change: MatSelectChange; }> = new EventEmitter(); + @Output() public changedSelection: EventEmitter = new EventEmitter(); + @Output() public deleteMember: EventEmitter = new EventEmitter(); + + private destroyed: Subject = new Subject(); + + /** Columns displayed in the table. Columns IDs can be added, removed, or reordered. */ + public displayedColumns: string[] = ['select', 'userId', 'firstname', 'lastname', 'username', 'email', 'roles']; + + constructor() { + this.selection.changed.pipe(takeUntil(this.destroyed)).subscribe(_ => { + this.changedSelection.emit(this.selection.selected); + }); + } + + public ngOnInit(): void { + this.refreshTrigger.pipe(takeUntil(this.destroyed)).subscribe(() => { + this.changePage(this.paginator); + }); + + if (this.canDelete) { + this.displayedColumns.push('actions'); + } + } + + public ngOnDestroy(): void { + this.destroyed.next(); + } + + public isAllSelected(): boolean { + const numSelected = this.selection.selected.length; + const numRows = this.dataSource.membersSubject.value.length; + return numSelected === numRows; + } + + public masterToggle(): void { + this.isAllSelected() ? + this.selection.clear() : + this.dataSource.membersSubject.value.forEach(row => this.selection.select(row)); + } + + public changePage(event?: PageEvent | MatPaginator): any { + this.selection.clear(); + return this.factoryLoadFunc(event ?? this.paginator); + } + + public triggerDeleteMember(member: any): void { + this.deleteMember.emit(member); + } +} diff --git a/console/src/app/modules/members-table/members-table.module.ts b/console/src/app/modules/members-table/members-table.module.ts new file mode 100644 index 0000000000..8af969284d --- /dev/null +++ b/console/src/app/modules/members-table/members-table.module.ts @@ -0,0 +1,45 @@ +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { MatButtonModule } from '@angular/material/button'; +import { MatCheckboxModule } from '@angular/material/checkbox'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatIconModule } from '@angular/material/icon'; +import { MatPaginatorModule } from '@angular/material/paginator'; +import { MatSelectModule } from '@angular/material/select'; +import { MatSortModule } from '@angular/material/sort'; +import { MatTableModule } from '@angular/material/table'; +import { MatTooltipModule } from '@angular/material/tooltip'; +import { RouterModule } from '@angular/router'; +import { TranslateModule } from '@ngx-translate/core'; + +import { AvatarModule } from '../avatar/avatar.module'; +import { RefreshTableModule } from '../refresh-table/refresh-table.module'; +import { MembersTableComponent } from './members-table.component'; + +@NgModule({ + declarations: [ + MembersTableComponent, + ], + imports: [ + CommonModule, + MatFormFieldModule, + MatSelectModule, + MatCheckboxModule, + MatIconModule, + MatTableModule, + MatPaginatorModule, + MatSortModule, + MatTooltipModule, + FormsModule, + TranslateModule, + RefreshTableModule, + RouterModule, + AvatarModule, + MatButtonModule, + ], + exports: [ + MembersTableComponent, + ], +}) +export class MembersTableModule { } diff --git a/console/src/app/modules/meta-layout/meta-layout.component.scss b/console/src/app/modules/meta-layout/meta-layout.component.scss index f485742e46..261731a654 100644 --- a/console/src/app/modules/meta-layout/meta-layout.component.scss +++ b/console/src/app/modules/meta-layout/meta-layout.component.scss @@ -2,7 +2,7 @@ display: flex; height: 100%; overflow-x: hidden; - transition: all .2s ease-in-out; + transition: all .3s cubic-bezier(.645, .045, .355, 1); .main-content { display: relative; diff --git a/console/src/app/modules/password-complexity-view/password-complexity-view.component.scss b/console/src/app/modules/password-complexity-view/password-complexity-view.component.scss index e8cafc26a5..e72abd1180 100644 --- a/console/src/app/modules/password-complexity-view/password-complexity-view.component.scss +++ b/console/src/app/modules/password-complexity-view/password-complexity-view.component.scss @@ -1,6 +1,7 @@ .validation-col { - display: flex wrap; + display: flex; + flex-wrap: wrap; padding: 1rem 0; width: 100%; @@ -16,7 +17,7 @@ span { font-size: 14px; - color: #8795a1; + color: var(--grey); } .sp-wrapper { diff --git a/console/src/app/modules/policies/login-policy/add-idp-dialog/add-idp-dialog.component.scss b/console/src/app/modules/policies/login-policy/add-idp-dialog/add-idp-dialog.component.scss index 2ef92e72a4..90e113d36a 100644 --- a/console/src/app/modules/policies/login-policy/add-idp-dialog/add-idp-dialog.component.scss +++ b/console/src/app/modules/policies/login-policy/add-idp-dialog/add-idp-dialog.component.scss @@ -3,7 +3,7 @@ } .desc { - color: #8795a1; + color: var(--grey); font-size: .9rem; } diff --git a/console/src/app/modules/policies/login-policy/login-policy.component.scss b/console/src/app/modules/policies/login-policy/login-policy.component.scss index 0cfa35ea61..145f6994ca 100644 --- a/console/src/app/modules/policies/login-policy/login-policy.component.scss +++ b/console/src/app/modules/policies/login-policy/login-policy.component.scss @@ -10,7 +10,7 @@ padding: .5rem 0; .left-desc { - color: #8795a1; + color: var(--grey); font-size: .9rem; } @@ -52,7 +52,7 @@ justify-content: center; margin: .5rem; padding: 10px; - border: 1px solid #8795a1; + border: 1px solid var(--grey); border-radius: .5rem; cursor: pointer; position: relative; diff --git a/console/src/app/modules/policies/password-age-policy/password-age-policy.component.scss b/console/src/app/modules/policies/password-age-policy/password-age-policy.component.scss index adba0f7aeb..3e48cbe4cd 100644 --- a/console/src/app/modules/policies/password-age-policy/password-age-policy.component.scss +++ b/console/src/app/modules/policies/password-age-policy/password-age-policy.component.scss @@ -10,7 +10,7 @@ padding: .5rem 0; .left-desc { - color: #8795a1; + color: var(--grey); font-size: .9rem; } diff --git a/console/src/app/modules/policies/password-complexity-policy/password-complexity-policy.component.scss b/console/src/app/modules/policies/password-complexity-policy/password-complexity-policy.component.scss index adba0f7aeb..3e48cbe4cd 100644 --- a/console/src/app/modules/policies/password-complexity-policy/password-complexity-policy.component.scss +++ b/console/src/app/modules/policies/password-complexity-policy/password-complexity-policy.component.scss @@ -10,7 +10,7 @@ padding: .5rem 0; .left-desc { - color: #8795a1; + color: var(--grey); font-size: .9rem; } diff --git a/console/src/app/modules/policies/password-iam-policy/password-iam-policy.component.scss b/console/src/app/modules/policies/password-iam-policy/password-iam-policy.component.scss index adba0f7aeb..3e48cbe4cd 100644 --- a/console/src/app/modules/policies/password-iam-policy/password-iam-policy.component.scss +++ b/console/src/app/modules/policies/password-iam-policy/password-iam-policy.component.scss @@ -10,7 +10,7 @@ padding: .5rem 0; .left-desc { - color: #8795a1; + color: var(--grey); font-size: .9rem; } diff --git a/console/src/app/modules/policies/password-lockout-policy/password-lockout-policy.component.scss b/console/src/app/modules/policies/password-lockout-policy/password-lockout-policy.component.scss index c99cf37f26..f6454c0be3 100644 --- a/console/src/app/modules/policies/password-lockout-policy/password-lockout-policy.component.scss +++ b/console/src/app/modules/policies/password-lockout-policy/password-lockout-policy.component.scss @@ -11,7 +11,7 @@ padding: .5rem 0; .left-desc { - color: #8795a1; + color: var(--grey); font-size: .9rem; } diff --git a/console/src/app/modules/project-members/project-members.component.html b/console/src/app/modules/project-members/project-members.component.html index 65086ab28f..5f8cce98b6 100644 --- a/console/src/app/modules/project-members/project-members.component.html +++ b/console/src/app/modules/project-members/project-members.component.html @@ -1,95 +1,25 @@ - - + - - + add{{ 'ACTIONS.NEW' | translate }} - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - {{ 'PROJECT.MEMBER.USERID' | translate }} - {{member.userId}} {{ 'PROJECT.MEMBER.FIRSTNAME' | translate }} - {{member.firstName}} {{ 'PROJECT.MEMBER.LASTNAME' | translate }} - {{member.lastName}} {{ 'PROJECT.MEMBER.USERNAME' | translate }} - {{member.userName}} {{ 'PROJECT.MEMBER.EMAIL' | translate }} - {{member.email}} - {{ 'ROLESLABEL' | translate }} - - {{ 'ROLESLABEL' | translate }} - - - {{ role }} - - - -
- - - -
-
-
\ No newline at end of file + + + \ No newline at end of file diff --git a/console/src/app/modules/project-members/project-members.component.scss b/console/src/app/modules/project-members/project-members.component.scss index 6e1f1650b6..b6256fca23 100644 --- a/console/src/app/modules/project-members/project-members.component.scss +++ b/console/src/app/modules/project-members/project-members.component.scss @@ -1,40 +1,7 @@ -.icon-button { +.del-button { margin-right: .5rem; } -.table-wrapper { - overflow-x: auto; - - .table, - .paginator { - width: 100%; - - td, - th { - padding: .5rem; - - &:first-child { - padding-left: 0; - padding-right: 1rem; - } - - &:last-child { - padding-right: 0; - } - } - - .action { - width: 40px; - } - - .selection { - width: 50px; - max-width: 50px; - } - } -} - -.pointer { - outline: none; - cursor: pointer; +:root { + width: 100%; } diff --git a/console/src/app/modules/project-members/project-members.component.ts b/console/src/app/modules/project-members/project-members.component.ts index 47f985ffef..5cde0de798 100644 --- a/console/src/app/modules/project-members/project-members.component.ts +++ b/console/src/app/modules/project-members/project-members.component.ts @@ -1,12 +1,18 @@ -import { SelectionModel } from '@angular/cdk/collections'; -import { Component, ViewChild } from '@angular/core'; +import { Component, EventEmitter } from '@angular/core'; import { MatDialog } from '@angular/material/dialog'; -import { MatPaginator, PageEvent } from '@angular/material/paginator'; +import { PageEvent } from '@angular/material/paginator'; import { MatSelectChange } from '@angular/material/select'; -import { MatTable } from '@angular/material/table'; import { ActivatedRoute } from '@angular/router'; import { take } from 'rxjs/operators'; -import { ProjectGrantView, ProjectMember, ProjectType, ProjectView, UserView } from 'src/app/proto/generated/management_pb'; +import { + ProjectGrantMemberView, + ProjectGrantView, + ProjectMember, + ProjectMemberView, + ProjectType, + ProjectView, + UserView, +} from 'src/app/proto/generated/management_pb'; import { ManagementService } from 'src/app/services/mgmt.service'; import { ToastService } from 'src/app/services/toast.service'; @@ -23,18 +29,14 @@ export class ProjectMembersComponent { public INITIALPAGESIZE: number = 25; public project!: ProjectView.AsObject | ProjectGrantView.AsObject; public projectType: ProjectType = ProjectType.PROJECTTYPE_OWNED; - public disabled: boolean = false; public grantId: string = ''; public projectName: string = ''; - @ViewChild(MatPaginator) public paginator!: MatPaginator; - @ViewChild(MatTable) public table!: MatTable; public dataSource!: ProjectMembersDataSource; - public selection: SelectionModel = new SelectionModel(true, []); public memberRoleOptions: string[] = []; - /** Columns displayed in the table. Columns IDs can be added, removed, or reordered. */ - public displayedColumns: string[] = ['select', 'userId', 'firstname', 'lastname', 'username', 'email', 'roles']; - + public changePageFactory!: Function; + public changePage: EventEmitter = new EventEmitter(); + public selection: Array = []; constructor( private mgmtService: ManagementService, private dialog: MatDialog, @@ -53,6 +55,16 @@ export class ProjectMembersComponent { this.projectName = this.project.name; this.dataSource = new ProjectMembersDataSource(this.mgmtService); this.dataSource.loadMembers(this.project.projectId, this.projectType, 0, this.INITIALPAGESIZE); + + this.changePageFactory = (event?: PageEvent) => { + return this.dataSource.loadMembers( + this.project.projectId, + this.projectType, + event?.pageIndex ?? 0, + event?.pageSize ?? this.INITIALPAGESIZE, + this.grantId, + ); + }; }); } else if (this.projectType === ProjectType.PROJECTTYPE_GRANTED) { this.mgmtService.GetGrantedProjectByID(params.projectid, params.grantid).then(project => { @@ -65,6 +77,16 @@ export class ProjectMembersComponent { this.INITIALPAGESIZE, this.grantId, ); + + this.changePageFactory = (event?: PageEvent) => { + return this.dataSource.loadMembers( + this.project.projectId, + this.projectType, + event?.pageIndex ?? 0, + event?.pageSize ?? this.INITIALPAGESIZE, + this.grantId, + ); + }; }); } }); @@ -88,7 +110,7 @@ export class ProjectMembersComponent { } public removeProjectMemberSelection(): void { - Promise.all(this.selection.selected.map(member => { + Promise.all(this.selection.map(member => { if (this.projectType === ProjectType.PROJECTTYPE_OWNED) { return this.mgmtService.RemoveProjectMember(this.project.projectId, member.userId).then(() => { this.toast.showInfo('PROJECT.TOAST.MEMBERREMOVED', true); @@ -105,21 +127,32 @@ export class ProjectMembersComponent { } })).then(() => { setTimeout(() => { - this.changePage(); + this.changePage.emit(); }, 1000); }); } - public isAllSelected(): boolean { - const numSelected = this.selection.selected.length; - const numRows = this.dataSource.membersSubject.value.length; - return numSelected === numRows; - } - - public masterToggle(): void { - this.isAllSelected() ? - this.selection.clear() : - this.dataSource.membersSubject.value.forEach(row => this.selection.select(row)); + public removeProjectMember(member: ProjectMemberView.AsObject | ProjectGrantMemberView.AsObject): void { + if (this.projectType === ProjectType.PROJECTTYPE_OWNED) { + this.mgmtService.RemoveProjectMember(this.project.projectId, member.userId).then(() => { + setTimeout(() => { + this.changePage.emit(); + }, 1000); + this.toast.showInfo('PROJECT.TOAST.MEMBERREMOVED', true); + }).catch(error => { + this.toast.showError(error); + }); + } else if (this.projectType === ProjectType.PROJECTTYPE_GRANTED) { + this.mgmtService.RemoveProjectGrantMember(this.project.projectId, this.grantId, + member.userId).then(() => { + setTimeout(() => { + this.changePage.emit(); + }, 1000); + this.toast.showInfo('PROJECT.TOAST.MEMBERREMOVED', true); + }).catch(error => { + this.toast.showError(error); + }); + } } public openAddMember(): void { @@ -146,7 +179,7 @@ export class ProjectMembersComponent { } })).then(() => { setTimeout(() => { - this.changePage(); + this.changePage.emit(); }, 1000); this.toast.showInfo('PROJECT.TOAST.MEMBERSADDED', true); }).catch(error => { @@ -160,7 +193,7 @@ export class ProjectMembersComponent { updateRoles(member: ProjectMember.AsObject, selectionChange: MatSelectChange): void { if (this.projectType === ProjectType.PROJECTTYPE_OWNED) { this.mgmtService.ChangeProjectMember(this.project.projectId, member.userId, selectionChange.value) - .then((newmember: ProjectMember) => { + .then((_: ProjectMember) => { this.toast.showInfo('PROJECT.TOAST.MEMBERCHANGED', true); }).catch(error => { this.toast.showError(error); @@ -168,21 +201,11 @@ export class ProjectMembersComponent { } else if (this.projectType === ProjectType.PROJECTTYPE_GRANTED) { this.mgmtService.ChangeProjectGrantMember(this.project.projectId, this.grantId, member.userId, selectionChange.value) - .then((newmember: ProjectMember) => { + .then((_: ProjectMember) => { this.toast.showInfo('PROJECT.TOAST.MEMBERCHANGED', true); }).catch(error => { this.toast.showError(error); }); } } - - public changePage(event?: PageEvent): void { - this.dataSource.loadMembers( - this.project.projectId, - this.projectType, - event?.pageIndex ?? this.paginator.pageIndex, - event?.pageSize ?? this.paginator.pageSize, - this.grantId, - ); - } } diff --git a/console/src/app/modules/project-members/project-members.module.ts b/console/src/app/modules/project-members/project-members.module.ts index 9413c46808..ae644b9f7b 100644 --- a/console/src/app/modules/project-members/project-members.module.ts +++ b/console/src/app/modules/project-members/project-members.module.ts @@ -1,25 +1,15 @@ import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { MatAutocompleteModule } from '@angular/material/autocomplete'; import { MatButtonModule } from '@angular/material/button'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { MatChipsModule } from '@angular/material/chips'; import { MatDialogModule } from '@angular/material/dialog'; -import { MatFormFieldModule } from '@angular/material/form-field'; import { MatIconModule } from '@angular/material/icon'; -import { MatPaginatorModule } from '@angular/material/paginator'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatSelectModule } from '@angular/material/select'; -import { MatSortModule } from '@angular/material/sort'; -import { MatTableModule } from '@angular/material/table'; import { MatTooltipModule } from '@angular/material/tooltip'; import { TranslateModule } from '@ngx-translate/core'; import { HasRoleModule } from 'src/app/directives/has-role/has-role.module'; import { DetailLayoutModule } from 'src/app/modules/detail-layout/detail-layout.module'; +import { MembersTableModule } from 'src/app/modules/members-table/members-table.module'; import { HasRolePipeModule } from 'src/app/pipes/has-role-pipe/has-role-pipe.module'; -import { RefreshTableModule } from '../refresh-table/refresh-table.module'; import { ProjectMembersRoutingModule } from './project-members-routing.module'; import { ProjectMembersComponent } from './project-members.component'; @@ -28,26 +18,15 @@ import { ProjectMembersComponent } from './project-members.component'; imports: [ ProjectMembersRoutingModule, CommonModule, - MatAutocompleteModule, HasRoleModule, - MatChipsModule, MatButtonModule, - MatFormFieldModule, - MatSelectModule, - MatCheckboxModule, MatIconModule, - MatTableModule, - MatPaginatorModule, - MatSortModule, MatTooltipModule, - ReactiveFormsModule, - MatProgressSpinnerModule, - FormsModule, TranslateModule, - HasRolePipeModule, - RefreshTableModule, DetailLayoutModule, MatDialogModule, + MembersTableModule, + HasRolePipeModule, ], }) export class ProjectMembersModule { } diff --git a/console/src/app/modules/project-roles/project-role-detail/project-role-detail.component.scss b/console/src/app/modules/project-roles/project-role-detail/project-role-detail.component.scss index 4200e417ec..0cc56d5e92 100644 --- a/console/src/app/modules/project-roles/project-role-detail/project-role-detail.component.scss +++ b/console/src/app/modules/project-roles/project-role-detail/project-role-detail.component.scss @@ -3,7 +3,7 @@ } .desc { - color: #8795a1; + color: var(--grey); font-size: .9rem; } diff --git a/console/src/app/modules/refresh-table/refresh-table.component.scss b/console/src/app/modules/refresh-table/refresh-table.component.scss index b54fb898ae..7988eb57f1 100644 --- a/console/src/app/modules/refresh-table/refresh-table.component.scss +++ b/console/src/app/modules/refresh-table/refresh-table.component.scss @@ -9,7 +9,7 @@ .desc { font-size: .8rem; - color: #8795a1; + color: var(--grey); } .count { @@ -20,6 +20,7 @@ .spinner { margin-top: 2px; margin-bottom: 1px; + margin-right: 1rem; } .fill-space { @@ -31,7 +32,7 @@ } } -.table-wrapper { - width: 100%; - overflow-x: auto; -} +// .table-wrapper { +// width: 100%; +// overflow-x: auto; +// } diff --git a/console/src/app/modules/search-project-autocomplete/search-project-autocomplete.component.ts b/console/src/app/modules/search-project-autocomplete/search-project-autocomplete.component.ts index e61b0c15c3..6847950379 100644 --- a/console/src/app/modules/search-project-autocomplete/search-project-autocomplete.component.ts +++ b/console/src/app/modules/search-project-autocomplete/search-project-autocomplete.component.ts @@ -1,10 +1,10 @@ import { COMMA, ENTER } from '@angular/cdk/keycodes'; -import { Component, ElementRef, EventEmitter, Input, Output, ViewChild } from '@angular/core'; +import { Component, ElementRef, EventEmitter, Input, OnDestroy, Output, ViewChild } from '@angular/core'; import { FormControl } from '@angular/forms'; import { MatAutocomplete, MatAutocompleteSelectedEvent } from '@angular/material/autocomplete'; import { MatChipInputEvent } from '@angular/material/chips'; -import { forkJoin, from } from 'rxjs'; -import { debounceTime, switchMap, tap } from 'rxjs/operators'; +import { forkJoin, from, Subject } from 'rxjs'; +import { debounceTime, switchMap, takeUntil, tap } from 'rxjs/operators'; import { ProjectGrantSearchResponse, ProjectGrantView, @@ -27,7 +27,7 @@ export enum ProjectAutocompleteType { templateUrl: './search-project-autocomplete.component.html', styleUrls: ['./search-project-autocomplete.component.scss'], }) -export class SearchProjectAutocompleteComponent { +export class SearchProjectAutocompleteComponent implements OnDestroy { public selectable: boolean = true; public removable: boolean = true; public addOnBlur: boolean = true; @@ -47,9 +47,12 @@ export class SearchProjectAutocompleteComponent { | ProjectView.AsObject | ProjectView.AsObject[] > = new EventEmitter(); + + private unsubscribed$: Subject = new Subject(); constructor(private mgmtService: ManagementService) { this.myControl.valueChanges .pipe( + takeUntil(this.unsubscribed$), debounceTime(200), tap(() => this.isLoading = true), switchMap(value => { @@ -93,6 +96,10 @@ export class SearchProjectAutocompleteComponent { }); } + public ngOnDestroy(): void { + this.unsubscribed$.next(); + } + public displayFn(project?: any): string | undefined { return (project && project.projectName) ? `${project.projectName}` : (project && project.name) ? `${project.name}` : undefined; diff --git a/console/src/app/modules/search-project-autocomplete/search-project-autocomplete.module.ts b/console/src/app/modules/search-project-autocomplete/search-project-autocomplete.module.ts index 0a563812ed..202651628a 100644 --- a/console/src/app/modules/search-project-autocomplete/search-project-autocomplete.module.ts +++ b/console/src/app/modules/search-project-autocomplete/search-project-autocomplete.module.ts @@ -8,12 +8,15 @@ import { MatFormFieldModule } from '@angular/material/form-field'; import { MatIconModule } from '@angular/material/icon'; import { MatInputModule } from '@angular/material/input'; import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { MatSelectModule } from '@angular/material/select'; import { TranslateModule } from '@ngx-translate/core'; import { SearchProjectAutocompleteComponent } from './search-project-autocomplete.component'; @NgModule({ - declarations: [SearchProjectAutocompleteComponent], + declarations: [ + SearchProjectAutocompleteComponent, + ], imports: [ CommonModule, MatAutocompleteModule, @@ -26,6 +29,7 @@ import { SearchProjectAutocompleteComponent } from './search-project-autocomplet MatProgressSpinnerModule, FormsModule, TranslateModule, + MatSelectModule, ], exports: [ SearchProjectAutocompleteComponent, diff --git a/console/src/app/modules/search-roles-autocomplete/search-roles-autocomplete.component.ts b/console/src/app/modules/search-roles-autocomplete/search-roles-autocomplete.component.ts index 3bcde33236..f97568a0aa 100644 --- a/console/src/app/modules/search-roles-autocomplete/search-roles-autocomplete.component.ts +++ b/console/src/app/modules/search-roles-autocomplete/search-roles-autocomplete.component.ts @@ -1,10 +1,10 @@ import { COMMA, ENTER } from '@angular/cdk/keycodes'; -import { Component, ElementRef, EventEmitter, Input, Output, ViewChild } from '@angular/core'; +import { Component, ElementRef, EventEmitter, Input, OnDestroy, Output, ViewChild } from '@angular/core'; import { FormControl } from '@angular/forms'; import { MatAutocomplete, MatAutocompleteSelectedEvent } from '@angular/material/autocomplete'; import { MatChipInputEvent } from '@angular/material/chips'; -import { from } from 'rxjs'; -import { debounceTime, switchMap, tap } from 'rxjs/operators'; +import { from, Subject } from 'rxjs'; +import { debounceTime, switchMap, takeUntil, tap } from 'rxjs/operators'; import { ProjectRole, ProjectRoleSearchKey, @@ -12,7 +12,6 @@ import { SearchMethod, } from 'src/app/proto/generated/management_pb'; import { ManagementService } from 'src/app/services/mgmt.service'; -import { ToastService } from 'src/app/services/toast.service'; @Component({ @@ -20,7 +19,7 @@ import { ToastService } from 'src/app/services/toast.service'; templateUrl: './search-roles-autocomplete.component.html', styleUrls: ['./search-roles-autocomplete.component.scss'], }) -export class SearchRolesAutocompleteComponent { +export class SearchRolesAutocompleteComponent implements OnDestroy { public selectable: boolean = true; public removable: boolean = true; public addOnBlur: boolean = true; @@ -35,9 +34,12 @@ export class SearchRolesAutocompleteComponent { @Input() public projectId: string = ''; @Input() public singleOutput: boolean = false; @Output() public selectionChanged: EventEmitter = new EventEmitter(); - constructor(private mgmtService: ManagementService, private toast: ToastService) { + + private unsubscribed$: Subject = new Subject(); + constructor(private mgmtService: ManagementService) { this.myControl.valueChanges .pipe( + takeUntil(this.unsubscribed$), debounceTime(200), tap(() => this.isLoading = true), switchMap(value => { @@ -55,6 +57,10 @@ export class SearchRolesAutocompleteComponent { }); } + public ngOnDestroy(): void { + this.unsubscribed$.next(); + } + public displayFn(project?: ProjectRole.AsObject): string | undefined { return project ? `${project.displayName}` : undefined; } diff --git a/console/src/app/modules/search-user-autocomplete/search-user-autocomplete.component.scss b/console/src/app/modules/search-user-autocomplete/search-user-autocomplete.component.scss index bbf315323d..45077bc907 100644 --- a/console/src/app/modules/search-user-autocomplete/search-user-autocomplete.component.scss +++ b/console/src/app/modules/search-user-autocomplete/search-user-autocomplete.component.scss @@ -3,7 +3,7 @@ } .target-desc { - color: #8795a1; + color: var(--grey); font-size: .8rem; margin: 0; margin-bottom: 1rem; @@ -44,5 +44,5 @@ .found-label { font-size: .9rem; - color: #8795a1; + color: var(--grey); } diff --git a/console/src/app/modules/search-user-autocomplete/search-user-autocomplete.module.ts b/console/src/app/modules/search-user-autocomplete/search-user-autocomplete.module.ts index 7a30876e94..4933dcee87 100644 --- a/console/src/app/modules/search-user-autocomplete/search-user-autocomplete.module.ts +++ b/console/src/app/modules/search-user-autocomplete/search-user-autocomplete.module.ts @@ -8,6 +8,7 @@ import { MatFormFieldModule } from '@angular/material/form-field'; import { MatIconModule } from '@angular/material/icon'; import { MatInputModule } from '@angular/material/input'; import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { MatSelectModule } from '@angular/material/select'; import { TranslateModule } from '@ngx-translate/core'; import { SearchUserAutocompleteComponent } from './search-user-autocomplete.component'; @@ -27,6 +28,7 @@ import { SearchUserAutocompleteComponent } from './search-user-autocomplete.comp MatProgressSpinnerModule, FormsModule, TranslateModule, + MatSelectModule, ], exports: [SearchUserAutocompleteComponent], }) diff --git a/console/src/app/modules/user-grants/user-grants.component.html b/console/src/app/modules/user-grants/user-grants.component.html index a300548a94..be733be1f5 100644 --- a/console/src/app/modules/user-grants/user-grants.component.html +++ b/console/src/app/modules/user-grants/user-grants.component.html @@ -5,7 +5,7 @@ (click)="deleteGrantSelection()" *ngIf="selection.hasValue() && allowDelete"> - add{{ 'GRANTS.ADD_BTN' | translate }} @@ -14,13 +14,13 @@ - +
- - @@ -82,7 +82,7 @@ {{ 'PROJECT.GRANT.ROLENAMESLIST' | translate }} - {{role.key}} @@ -94,7 +94,7 @@ {{ 'PROJECT.GRANT.ROLENAMESLIST' | translate }} - {{role}} diff --git a/console/src/app/modules/user-grants/user-grants.component.scss b/console/src/app/modules/user-grants/user-grants.component.scss index 6ac48cc4fc..e248c76d30 100644 --- a/console/src/app/modules/user-grants/user-grants.component.scss +++ b/console/src/app/modules/user-grants/user-grants.component.scss @@ -40,5 +40,5 @@ .no-roles { font-size: 14px; - color: #8795a1; + color: var(--grey); } diff --git a/console/src/app/modules/user-grants/user-grants.component.ts b/console/src/app/modules/user-grants/user-grants.component.ts index a01e0a7d57..cfa66602d5 100644 --- a/console/src/app/modules/user-grants/user-grants.component.ts +++ b/console/src/app/modules/user-grants/user-grants.component.ts @@ -32,7 +32,7 @@ export class UserGrantsComponent implements OnInit, AfterViewInit { @ViewChild(MatPaginator) public paginator!: MatPaginator; @ViewChild(MatTable) public table!: MatTable; - @Input() allowCreate: boolean = false; + @Input() allowWrite: boolean = false; @Input() allowDelete: boolean = false; @Input() userId: string = ''; diff --git a/console/src/app/modules/warn-dialog/warn-dialog.component.scss b/console/src/app/modules/warn-dialog/warn-dialog.component.scss index 19e5334cf2..be97648b32 100644 --- a/console/src/app/modules/warn-dialog/warn-dialog.component.scss +++ b/console/src/app/modules/warn-dialog/warn-dialog.component.scss @@ -4,7 +4,7 @@ } .desc { - color: #8795a1; + color: var(--grey); font-size: .9rem; } diff --git a/console/src/app/pages/home/home.component.scss b/console/src/app/pages/home/home.component.scss index 56e439f683..c3084fa70b 100644 --- a/console/src/app/pages/home/home.component.scss +++ b/console/src/app/pages/home/home.component.scss @@ -5,7 +5,7 @@ .header { display: flex; flex-direction: column; - margin: 4rem 0; + margin-bottom: 4rem; align-items: center; h3 { @@ -15,7 +15,7 @@ } .wlc_stnce { - color: #8795a1; + color: var(--grey); font-size: 16px; } @@ -46,7 +46,7 @@ p { display: block; - color: #8795a1; + color: var(--grey); font-size: .9rem; } @@ -75,7 +75,7 @@ } .disclaimer { - color: #8795a1; + color: var(--grey); font-size: 14px; margin-top: 3rem; } diff --git a/console/src/app/pages/iam/iam-members/iam-members.component.html b/console/src/app/pages/iam/iam-members/iam-members.component.html index 90b2f56950..55b46e1a69 100644 --- a/console/src/app/pages/iam/iam-members/iam-members.component.html +++ b/console/src/app/pages/iam/iam-members/iam-members.component.html @@ -1,86 +1,23 @@ - +
+ + - - - - - - - - add{{ 'ACTIONS.NEW' | translate }} - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - {{ 'PROJECT.MEMBER.FIRSTNAME' | translate }} - {{member.firstName}} {{ 'PROJECT.MEMBER.LASTNAME' | translate }} - {{member.lastName}} {{ 'PROJECT.MEMBER.USERNAME' | translate }} - {{member.userName}} {{ 'PROJECT.MEMBER.EMAIL' | translate }} - {{member.email}} - {{ 'ROLESLABEL' | translate }} - - {{ 'ROLESLABEL' | translate }} - - - {{ role }} - - - -
- - - -
-
-
\ No newline at end of file + + + + + + add{{ 'ACTIONS.NEW' | translate }} + + + + +
\ No newline at end of file diff --git a/console/src/app/pages/iam/iam-members/iam-members.component.scss b/console/src/app/pages/iam/iam-members/iam-members.component.scss index aa860c5b2b..b8780b1717 100644 --- a/console/src/app/pages/iam/iam-members/iam-members.component.scss +++ b/console/src/app/pages/iam/iam-members/iam-members.component.scss @@ -1,37 +1,7 @@ -.table-wrapper { - overflow: auto; - width: 100%; - - .table, - .paginator { - width: 100%; - - td, - th { - padding: .5rem; - - &:first-child { - padding-left: 0; - padding-right: 1rem; - } - - &:last-child { - padding-right: 0; - } - } - - .action { - width: 40px; - } - - .selection { - width: 50px; - max-width: 50px; - } - } +.wrapp { + width: 100% !important; } -.pointer { - outline: none; - cursor: pointer; +.del-button { + margin-right: .5rem; } diff --git a/console/src/app/pages/iam/iam-members/iam-members.component.ts b/console/src/app/pages/iam/iam-members/iam-members.component.ts index 90bb70b99d..4ce1a5a511 100644 --- a/console/src/app/pages/iam/iam-members/iam-members.component.ts +++ b/console/src/app/pages/iam/iam-members/iam-members.component.ts @@ -1,10 +1,7 @@ -import { SelectionModel } from '@angular/cdk/collections'; -import { AfterViewInit, Component, ViewChild } from '@angular/core'; +import { Component, EventEmitter } from '@angular/core'; import { MatDialog } from '@angular/material/dialog'; -import { MatPaginator } from '@angular/material/paginator'; +import { PageEvent } from '@angular/material/paginator'; import { MatSelectChange } from '@angular/material/select'; -import { MatTable } from '@angular/material/table'; -import { tap } from 'rxjs/operators'; import { CreationType, MemberCreateDialogComponent } from 'src/app/modules/add-member-dialog/member-create-dialog.component'; import { IamMember, IamMemberView } from 'src/app/proto/generated/admin_pb'; import { ProjectMember, ProjectType, UserView } from 'src/app/proto/generated/management_pb'; @@ -18,17 +15,15 @@ import { IamMembersDataSource } from './iam-members-datasource'; templateUrl: './iam-members.component.html', styleUrls: ['./iam-members.component.scss'], }) -export class IamMembersComponent implements AfterViewInit { +export class IamMembersComponent { + public INITIALPAGESIZE: number = 25; public projectType: ProjectType = ProjectType.PROJECTTYPE_OWNED; - public disabled: boolean = false; - @ViewChild(MatPaginator) public paginator!: MatPaginator; - @ViewChild(MatTable) public table!: MatTable; public dataSource!: IamMembersDataSource; - public selection: SelectionModel = new SelectionModel(true, []); public memberRoleOptions: string[] = []; - /** Columns displayed in the table. Columns IDs can be added, removed, or reordered. */ - public displayedColumns: string[] = ['select', 'firstname', 'lastname', 'username', 'email', 'roles']; + public changePageFactory!: Function; + public changePage: EventEmitter = new EventEmitter(); + public selection: Array = []; constructor(private adminService: AdminService, private dialog: MatDialog, @@ -37,21 +32,13 @@ export class IamMembersComponent implements AfterViewInit { this.dataSource = new IamMembersDataSource(this.adminService); this.dataSource.loadMembers(0, 25); this.getRoleOptions(); - } - public ngAfterViewInit(): void { - this.paginator.page - .pipe( - tap(() => this.loadMembersPage()), - ) - .subscribe(); - } - - private loadMembersPage(): void { - this.dataSource.loadMembers( - this.paginator.pageIndex, - this.paginator.pageSize, - ); + this.changePageFactory = (event?: PageEvent) => { + return this.dataSource.loadMembers( + event?.pageIndex ?? 0, + event?.pageSize ?? this.INITIALPAGESIZE, + ); + }; } public getRoleOptions(): void { @@ -71,11 +58,12 @@ export class IamMembersComponent implements AfterViewInit { }); } - - public removeProjectMemberSelection(): void { - Promise.all(this.selection.selected.map(member => { + public removeMemberSelection(): void { + console.log(this.selection); + Promise.all(this.selection.map(member => { return this.adminService.RemoveIamMember(member.userId).then(() => { this.toast.showInfo('IAM.TOAST.MEMBERREMOVED', true); + this.changePage.emit(); }).catch(error => { this.toast.showError(error); }); @@ -86,25 +74,13 @@ export class IamMembersComponent implements AfterViewInit { this.adminService.RemoveIamMember(member.userId).then(() => { this.toast.showInfo('IAM.TOAST.MEMBERREMOVED', true); setTimeout(() => { - this.refreshPage(); + this.changePage.emit(); }, 1000); }).catch(error => { this.toast.showError(error); }); } - public isAllSelected(): boolean { - const numSelected = this.selection.selected.length; - const numRows = this.dataSource.membersSubject.value.length; - return numSelected === numRows; - } - - public masterToggle(): void { - this.isAllSelected() ? - this.selection.clear() : - this.dataSource.membersSubject.value.forEach(row => this.selection.select(row)); - } - public openAddMember(): void { const dialogRef = this.dialog.open(MemberCreateDialogComponent, { data: { @@ -124,7 +100,7 @@ export class IamMembersComponent implements AfterViewInit { })).then(() => { this.toast.showInfo('IAM.TOAST.MEMBERADDED', true); setTimeout(() => { - this.refreshPage(); + this.changePage.emit(); }, 1000); }).catch(error => { this.toast.showError(error); @@ -133,9 +109,4 @@ export class IamMembersComponent implements AfterViewInit { } }); } - - public refreshPage(): void { - this.selection.clear(); - this.dataSource.loadMembers(this.paginator.pageIndex, this.paginator.pageSize); - } } diff --git a/console/src/app/pages/iam/iam-members/iam-members.module.ts b/console/src/app/pages/iam/iam-members/iam-members.module.ts index 7502f9a421..e3f8398b87 100644 --- a/console/src/app/pages/iam/iam-members/iam-members.module.ts +++ b/console/src/app/pages/iam/iam-members/iam-members.module.ts @@ -1,22 +1,12 @@ import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { MatAutocompleteModule } from '@angular/material/autocomplete'; import { MatButtonModule } from '@angular/material/button'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { MatChipsModule } from '@angular/material/chips'; -import { MatFormFieldModule } from '@angular/material/form-field'; import { MatIconModule } from '@angular/material/icon'; -import { MatPaginatorModule } from '@angular/material/paginator'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatSelectModule } from '@angular/material/select'; -import { MatSortModule } from '@angular/material/sort'; -import { MatTableModule } from '@angular/material/table'; import { MatTooltipModule } from '@angular/material/tooltip'; import { TranslateModule } from '@ngx-translate/core'; import { HasRoleModule } from 'src/app/directives/has-role/has-role.module'; import { DetailLayoutModule } from 'src/app/modules/detail-layout/detail-layout.module'; -import { RefreshTableModule } from 'src/app/modules/refresh-table/refresh-table.module'; +import { MembersTableModule } from 'src/app/modules/members-table/members-table.module'; import { HasRolePipeModule } from 'src/app/pipes/has-role-pipe/has-role-pipe.module'; import { IamMembersRoutingModule } from './iam-members-routing.module'; @@ -29,24 +19,13 @@ import { IamMembersComponent } from './iam-members.component'; IamMembersRoutingModule, DetailLayoutModule, CommonModule, - MatAutocompleteModule, - MatChipsModule, HasRoleModule, MatButtonModule, - MatCheckboxModule, MatIconModule, - MatTableModule, - MatPaginatorModule, - MatSortModule, MatTooltipModule, - ReactiveFormsModule, - MatProgressSpinnerModule, - FormsModule, TranslateModule, - MatFormFieldModule, - MatSelectModule, + MembersTableModule, HasRolePipeModule, - RefreshTableModule, ], }) export class IamMembersModule { } diff --git a/console/src/app/pages/iam/iam-policy-grid/iam-policy-grid.component.scss b/console/src/app/pages/iam/iam-policy-grid/iam-policy-grid.component.scss index 2412226823..31f1d5e39c 100644 --- a/console/src/app/pages/iam/iam-policy-grid/iam-policy-grid.component.scss +++ b/console/src/app/pages/iam/iam-policy-grid/iam-policy-grid.component.scss @@ -3,7 +3,7 @@ h1 { } .top-desc { - color: #8795a1; + color: var(--grey); } .row-lyt { @@ -57,7 +57,7 @@ h1 { .desc { font-size: .9rem; - color: #8795a1; + color: var(--grey); } .fill-space { diff --git a/console/src/app/pages/iam/iam.component.scss b/console/src/app/pages/iam/iam.component.scss index 000376cdba..8b74ff1ee6 100644 --- a/console/src/app/pages/iam/iam.component.scss +++ b/console/src/app/pages/iam/iam.component.scss @@ -3,7 +3,7 @@ } .sub { - color: #8795a1; + color: var(--grey); margin-bottom: 2rem; } diff --git a/console/src/app/pages/orgs/org-create/org-create.component.scss b/console/src/app/pages/orgs/org-create/org-create.component.scss index a9eb778c33..4d425341b9 100644 --- a/console/src/app/pages/orgs/org-create/org-create.component.scss +++ b/console/src/app/pages/orgs/org-create/org-create.component.scss @@ -39,7 +39,7 @@ h1 { } .desc { - color: #8795a1; + color: var(--grey); font-size: .9rem; margin: 1rem 0; } @@ -70,7 +70,7 @@ h1 { width: 100%; display: block; font-size: .9rem; - color: #8795a1; + color: var(--grey); } } @@ -97,7 +97,7 @@ h1 { .section { padding: .5rem; flex-basis: 100%; - color: #8795a1; + color: var(--grey); font-size: .9rem; } diff --git a/console/src/app/pages/orgs/org-detail/add-domain-dialog/add-domain-dialog.component.scss b/console/src/app/pages/orgs/org-detail/add-domain-dialog/add-domain-dialog.component.scss index 48211d84a2..132f28cfd4 100644 --- a/console/src/app/pages/orgs/org-detail/add-domain-dialog/add-domain-dialog.component.scss +++ b/console/src/app/pages/orgs/org-detail/add-domain-dialog/add-domain-dialog.component.scss @@ -4,7 +4,7 @@ } .desc { - color: #8795a1; + color: var(--grey); font-size: .9rem; } diff --git a/console/src/app/pages/orgs/org-detail/domain-verification/domain-verification.component.scss b/console/src/app/pages/orgs/org-detail/domain-verification/domain-verification.component.scss index 362a1a1b8b..dc2fc5cb53 100644 --- a/console/src/app/pages/orgs/org-detail/domain-verification/domain-verification.component.scss +++ b/console/src/app/pages/orgs/org-detail/domain-verification/domain-verification.component.scss @@ -9,7 +9,7 @@ } .desc { - color: #8795a1; + color: var(--grey); font-size: .9rem; &.warn { diff --git a/console/src/app/pages/orgs/org-detail/org-detail.component.html b/console/src/app/pages/orgs/org-detail/org-detail.component.html index e36dcd2c43..71fb04d229 100644 --- a/console/src/app/pages/orgs/org-detail/org-detail.component.html +++ b/console/src/app/pages/orgs/org-detail/org-detail.component.html @@ -13,12 +13,13 @@ - {{'ORG.DOMAINS.SETPRIMARY' | translate}} - +

{{'ORG.PAGES.ORGDOMAIN_VERIFICATION' | translate}}

@@ -48,8 +48,7 @@ - diff --git a/console/src/app/pages/orgs/org-list/org-list.component.scss b/console/src/app/pages/orgs/org-list/org-list.component.scss index 1b52dcc57a..e3d50b0123 100644 --- a/console/src/app/pages/orgs/org-list/org-list.component.scss +++ b/console/src/app/pages/orgs/org-list/org-list.component.scss @@ -3,7 +3,7 @@ h1 { } .top-desc { - color: #8795a1; + color: var(--grey); } .table, diff --git a/console/src/app/pages/orgs/org-list/org-list.component.ts b/console/src/app/pages/orgs/org-list/org-list.component.ts index 5b545c186e..a5db909cc1 100644 --- a/console/src/app/pages/orgs/org-list/org-list.component.ts +++ b/console/src/app/pages/orgs/org-list/org-list.component.ts @@ -1,7 +1,9 @@ import { AfterViewInit, Component, ViewChild } from '@angular/core'; +import { MatInput } from '@angular/material/input'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort } from '@angular/material/sort'; import { MatTableDataSource } from '@angular/material/table'; +import { Router } from '@angular/router'; import { BehaviorSubject, from, Observable, of } from 'rxjs'; import { catchError, finalize, map } from 'rxjs/operators'; import { enterAnimations } from 'src/app/animations'; @@ -21,6 +23,7 @@ export class OrgListComponent implements AfterViewInit { @ViewChild(MatPaginator) public paginator!: MatPaginator; @ViewChild(MatSort) sort!: MatSort; + @ViewChild('input') public filter!: MatInput; public dataSource!: MatTableDataSource; public displayedColumns: string[] = ['select', 'id', 'name']; @@ -31,6 +34,7 @@ export class OrgListComponent implements AfterViewInit { constructor( private authService: GrpcAuthService, + private router: Router, ) { this.loadOrgs(10, 0); @@ -72,6 +76,21 @@ export class OrgListComponent implements AfterViewInit { this.loadOrgs(this.paginator.length, this.paginator.pageSize * this.paginator.pageIndex); } + public setFilter(key: MyProjectOrgSearchKey): void { + setTimeout(() => { + if (this.filter) { + (this.filter as any).nativeElement.focus(); + } + }, 100); + + if (this.orgSearchKey !== key) { + this.orgSearchKey = key; + } else { + this.orgSearchKey = undefined; + this.refresh(); + } + } + public applyFilter(event: Event): void { const filterValue = (event.target as HTMLInputElement).value; this.loadOrgs( @@ -80,4 +99,9 @@ export class OrgListComponent implements AfterViewInit { filterValue.trim().toLowerCase(), ); } + + public setAndNavigateToOrg(org: Org.AsObject): void { + this.authService.setActiveOrg(org); + this.router.navigate(['/org']); + } } diff --git a/console/src/app/pages/orgs/org-members/org-members.component.html b/console/src/app/pages/orgs/org-members/org-members.component.html index 5763e60d75..921ea9f0b0 100644 --- a/console/src/app/pages/orgs/org-members/org-members.component.html +++ b/console/src/app/pages/orgs/org-members/org-members.component.html @@ -1,83 +1,21 @@ - - + + - - + + add{{ 'ACTIONS.NEW' | translate }} - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - {{ 'PROJECT.MEMBER.FIRSTNAME' | translate }} - {{member.firstName}} {{ 'PROJECT.MEMBER.LASTNAME' | translate }} - {{member.lastName}} {{ 'PROJECT.MEMBER.USERNAME' | translate }} - {{member.userName}} {{ 'PROJECT.MEMBER.EMAIL' | translate }} - {{member.email}} - {{ 'ROLESLABEL' | translate }} - - {{ 'ROLESLABEL' | translate }} - - - {{ role }} - - - -
- - - -
-
+
\ No newline at end of file diff --git a/console/src/app/pages/orgs/org-members/org-members.component.scss b/console/src/app/pages/orgs/org-members/org-members.component.scss index 0e632b6ce1..e0962f6770 100644 --- a/console/src/app/pages/orgs/org-members/org-members.component.scss +++ b/console/src/app/pages/orgs/org-members/org-members.component.scss @@ -1,37 +1,3 @@ -.table-wrapper { - width: 100%; - overflow: auto; - - .table, - .paginator { - width: 100%; - - td, - th { - padding: .5rem; - - &:first-child { - padding-left: 0; - padding-right: 1rem; - } - - &:last-child { - padding-right: 0; - } - } - - .action { - width: 40px; - } - - .selection { - width: 50px; - max-width: 50px; - } - } -} - -.pointer { - outline: none; - cursor: pointer; +.del-button { + margin-right: .5rem; } diff --git a/console/src/app/pages/orgs/org-members/org-members.component.ts b/console/src/app/pages/orgs/org-members/org-members.component.ts index 0aa9a0d486..37e9e01a42 100644 --- a/console/src/app/pages/orgs/org-members/org-members.component.ts +++ b/console/src/app/pages/orgs/org-members/org-members.component.ts @@ -1,11 +1,9 @@ -import { SelectionModel } from '@angular/cdk/collections'; -import { AfterViewInit, Component, ViewChild } from '@angular/core'; +import { Component, EventEmitter } from '@angular/core'; import { MatDialog } from '@angular/material/dialog'; -import { MatPaginator } from '@angular/material/paginator'; +import { PageEvent } from '@angular/material/paginator'; import { MatSelectChange } from '@angular/material/select'; -import { tap } from 'rxjs/operators'; import { CreationType, MemberCreateDialogComponent } from 'src/app/modules/add-member-dialog/member-create-dialog.component'; -import { Org, OrgMemberView, ProjectType, UserView } from 'src/app/proto/generated/management_pb'; +import { Org, OrgMemberView, UserView } from 'src/app/proto/generated/management_pb'; import { ManagementService } from 'src/app/services/mgmt.service'; import { ToastService } from 'src/app/services/toast.service'; @@ -16,18 +14,16 @@ import { OrgMembersDataSource } from './org-members-datasource'; templateUrl: './org-members.component.html', styleUrls: ['./org-members.component.scss'], }) -export class OrgMembersComponent implements AfterViewInit { +export class OrgMembersComponent { + public INITIALPAGESIZE: number = 25; public org!: Org.AsObject; - public projectType: ProjectType = ProjectType.PROJECTTYPE_OWNED; - public disabled: boolean = false; - @ViewChild(MatPaginator) public paginator!: MatPaginator; + public disableWrite: boolean = false; public dataSource!: OrgMembersDataSource; - public selection: SelectionModel = new SelectionModel(true, []); public memberRoleOptions: string[] = []; - - /** Columns displayed in the table. Columns IDs can be added, removed, or reordered. */ - public displayedColumns: string[] = ['select', 'firstname', 'lastname', 'username', 'email', 'roles']; + public changePageFactory!: Function; + public changePage: EventEmitter = new EventEmitter(); + public selection: Array = []; constructor( private mgmtService: ManagementService, @@ -37,18 +33,17 @@ export class OrgMembersComponent implements AfterViewInit { this.mgmtService.GetMyOrg().then(org => { this.org = org.toObject(); this.dataSource = new OrgMembersDataSource(this.mgmtService); - this.dataSource.loadMembers(0, 25); + this.dataSource.loadMembers(0, this.INITIALPAGESIZE); }); this.getRoleOptions(); - } - public ngAfterViewInit(): void { - this.paginator.page - .pipe( - tap(() => this.loadMembersPage()), - ) - .subscribe(); + this.changePageFactory = (event?: PageEvent) => { + return this.dataSource.loadMembers( + event?.pageIndex ?? 0, + event?.pageSize ?? this.INITIALPAGESIZE, + ); + }; } public getRoleOptions(): void { @@ -68,15 +63,8 @@ export class OrgMembersComponent implements AfterViewInit { }); } - private loadMembersPage(): void { - this.dataSource.loadMembers( - this.paginator.pageIndex, - this.paginator.pageSize, - ); - } - public removeOrgMemberSelection(): void { - Promise.all(this.selection.selected.map(member => { + Promise.all(this.selection.map(member => { return this.mgmtService.RemoveMyOrgMember(member.userId).then(() => { this.toast.showInfo('ORG.TOAST.MEMBERREMOVED', true); }).catch(error => { @@ -84,21 +72,21 @@ export class OrgMembersComponent implements AfterViewInit { }); })).then(() => { setTimeout(() => { - this.refreshPage(); + this.changePage.emit(); }, 1000); }); } - public isAllSelected(): boolean { - const numSelected = this.selection.selected.length; - const numRows = this.dataSource.membersSubject.value.length; - return numSelected === numRows; - } + public removeOrgMember(member: OrgMemberView.AsObject): void { + this.mgmtService.RemoveMyOrgMember(member.userId).then(() => { + this.toast.showInfo('ORG.TOAST.MEMBERREMOVED', true); - public masterToggle(): void { - this.isAllSelected() ? - this.selection.clear() : - this.dataSource.membersSubject.value.forEach(row => this.selection.select(row)); + setTimeout(() => { + this.changePage.emit(); + }, 1000); + }).catch(error => { + this.toast.showError(error); + }); } public openAddMember(): void { @@ -120,7 +108,7 @@ export class OrgMembersComponent implements AfterViewInit { })).then(() => { this.toast.showInfo('ORG.TOAST.MEMBERADDED', true); setTimeout(() => { - this.refreshPage(); + this.changePage.emit(); }, 1000); }).catch(error => { this.toast.showError(error); @@ -129,9 +117,4 @@ export class OrgMembersComponent implements AfterViewInit { } }); } - - public refreshPage(): void { - this.selection.clear(); - this.dataSource.loadMembers(this.paginator.pageIndex, this.paginator.pageSize); - } } diff --git a/console/src/app/pages/orgs/org-members/org-members.module.ts b/console/src/app/pages/orgs/org-members/org-members.module.ts index 12c0fe72fe..8d8d567c9a 100644 --- a/console/src/app/pages/orgs/org-members/org-members.module.ts +++ b/console/src/app/pages/orgs/org-members/org-members.module.ts @@ -1,21 +1,13 @@ import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { MatAutocompleteModule } from '@angular/material/autocomplete'; import { MatButtonModule } from '@angular/material/button'; -import { MatCheckboxModule } from '@angular/material/checkbox'; import { MatChipsModule } from '@angular/material/chips'; -import { MatFormFieldModule } from '@angular/material/form-field'; import { MatIconModule } from '@angular/material/icon'; -import { MatPaginatorModule } from '@angular/material/paginator'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatSelectModule } from '@angular/material/select'; -import { MatSortModule } from '@angular/material/sort'; -import { MatTableModule } from '@angular/material/table'; import { MatTooltipModule } from '@angular/material/tooltip'; import { TranslateModule } from '@ngx-translate/core'; import { HasRoleModule } from 'src/app/directives/has-role/has-role.module'; import { DetailLayoutModule } from 'src/app/modules/detail-layout/detail-layout.module'; +import { MembersTableModule } from 'src/app/modules/members-table/members-table.module'; import { RefreshTableModule } from 'src/app/modules/refresh-table/refresh-table.module'; import { HasRolePipeModule } from 'src/app/pipes/has-role-pipe/has-role-pipe.module'; @@ -28,25 +20,16 @@ import { OrgMembersComponent } from './org-members.component'; imports: [ OrgMembersRoutingModule, CommonModule, - MatAutocompleteModule, MatChipsModule, MatButtonModule, HasRoleModule, - MatCheckboxModule, MatIconModule, - MatTableModule, - MatPaginatorModule, - MatSortModule, MatTooltipModule, - ReactiveFormsModule, - MatProgressSpinnerModule, - FormsModule, TranslateModule, DetailLayoutModule, - MatFormFieldModule, - MatSelectModule, - HasRolePipeModule, RefreshTableModule, + MembersTableModule, + HasRolePipeModule, ], }) export class OrgMembersModule { } diff --git a/console/src/app/pages/orgs/policy-grid/policy-grid.component.html b/console/src/app/pages/orgs/policy-grid/policy-grid.component.html index 4a404001c5..72533ea2ff 100644 --- a/console/src/app/pages/orgs/policy-grid/policy-grid.component.html +++ b/console/src/app/pages/orgs/policy-grid/policy-grid.component.html @@ -26,7 +26,8 @@ + mat-stroked-button + [matTooltip]="'ACTIONS.CONFIGURE' | translate">{{'ORG.POLICY.BTN_EDIT' | translate}} @@ -55,7 +56,8 @@ + mat-stroked-button + [matTooltip]="'ACTIONS.CONFIGURE' | translate">{{'ORG.POLICY.BTN_EDIT' | translate}}
@@ -73,7 +75,6 @@ -

{{'ORG.POLICY.LOGIN_POLICY.DESCRIPTION' | translate}}

@@ -85,9 +86,10 @@ + mat-stroked-button + [matTooltip]="'ACTIONS.CONFIGURE' | translate">{{'ORG.POLICY.BTN_EDIT' | translate}}
- + \ No newline at end of file diff --git a/console/src/app/pages/orgs/policy-grid/policy-grid.component.scss b/console/src/app/pages/orgs/policy-grid/policy-grid.component.scss index 2412226823..31f1d5e39c 100644 --- a/console/src/app/pages/orgs/policy-grid/policy-grid.component.scss +++ b/console/src/app/pages/orgs/policy-grid/policy-grid.component.scss @@ -3,7 +3,7 @@ h1 { } .top-desc { - color: #8795a1; + color: var(--grey); } .row-lyt { @@ -57,7 +57,7 @@ h1 { .desc { font-size: .9rem; - color: #8795a1; + color: var(--grey); } .fill-space { diff --git a/console/src/app/pages/projects/apps/app-create/app-create.component.scss b/console/src/app/pages/projects/apps/app-create/app-create.component.scss index 8304447ced..bff6716fc7 100644 --- a/console/src/app/pages/projects/apps/app-create/app-create.component.scss +++ b/console/src/app/pages/projects/apps/app-create/app-create.component.scss @@ -5,7 +5,7 @@ h1 { p.desc { font-size: 14px; - color: #8795a1; + color: var(--grey); } .proswitch { @@ -57,12 +57,12 @@ p.desc { .step-title { font-size: 1.2rem; - color: #8795a1; + color: var(--grey); } .step-description { font-size: .9rem; - color: #8795a1; + color: var(--grey); } .error { @@ -102,7 +102,7 @@ p.desc { .right { margin-bottom: .5rem; font-size: 14px; - color: #8795a1; + color: var(--grey); } } diff --git a/console/src/app/pages/projects/apps/app-detail/app-detail.component.scss b/console/src/app/pages/projects/apps/app-detail/app-detail.component.scss index e8ab3a3fbb..cf49e13705 100644 --- a/console/src/app/pages/projects/apps/app-detail/app-detail.component.scss +++ b/console/src/app/pages/projects/apps/app-detail/app-detail.component.scss @@ -19,7 +19,7 @@ width: 100%; display: block; font-size: .9rem; - color: #8795a1; + color: var(--grey); } .zitadel-warning { @@ -67,7 +67,7 @@ .step-description { font-size: .9rem; - color: #8795a1; + color: var(--grey); flex-basis: 100%; margin: 0 .5rem 1rem .5rem; } @@ -81,7 +81,7 @@ .docs-line { flex-basis: 100%; font-size: 14px; - color: #8795a1; + color: var(--grey); margin-top: 0; } diff --git a/console/src/app/pages/projects/apps/app-secret-dialog/app-secret-dialog.component.scss b/console/src/app/pages/projects/apps/app-secret-dialog/app-secret-dialog.component.scss index 55d6b74cdb..87f3b764d0 100644 --- a/console/src/app/pages/projects/apps/app-secret-dialog/app-secret-dialog.component.scss +++ b/console/src/app/pages/projects/apps/app-secret-dialog/app-secret-dialog.component.scss @@ -3,7 +3,7 @@ } .desc { - color: #8795a1; + color: var(--grey); font-size: .9rem; } diff --git a/console/src/app/pages/projects/granted-projects/granted-project-detail/granted-project-detail.component.html b/console/src/app/pages/projects/granted-projects/granted-project-detail/granted-project-detail.component.html index 3154c27a66..fd4cc345ef 100644 --- a/console/src/app/pages/projects/granted-projects/granted-project-detail/granted-project-detail.component.html +++ b/console/src/app/pages/projects/granted-projects/granted-project-detail/granted-project-detail.component.html @@ -18,7 +18,7 @@ diff --git a/console/src/app/pages/projects/granted-projects/granted-project-detail/granted-project-detail.component.scss b/console/src/app/pages/projects/granted-projects/granted-project-detail/granted-project-detail.component.scss index 4d595baba2..a44156df05 100644 --- a/console/src/app/pages/projects/granted-projects/granted-project-detail/granted-project-detail.component.scss +++ b/console/src/app/pages/projects/granted-projects/granted-project-detail/granted-project-detail.component.scss @@ -23,7 +23,7 @@ .desc { font-size: .9rem; - color: #8795a1; + color: var(--grey); } .zitadel-warning { @@ -37,7 +37,7 @@ width: 100%; display: block; font-size: .9rem; - color: #8795a1; + color: var(--grey); } .side { diff --git a/console/src/app/pages/projects/granted-projects/granted-project-list/granted-project-grid/granted-project-grid.component.scss b/console/src/app/pages/projects/granted-projects/granted-project-list/granted-project-grid/granted-project-grid.component.scss index ff826ddb63..6c769d450d 100644 --- a/console/src/app/pages/projects/granted-projects/granted-project-list/granted-project-grid/granted-project-grid.component.scss +++ b/console/src/app/pages/projects/granted-projects/granted-project-list/granted-project-grid/granted-project-grid.component.scss @@ -48,9 +48,10 @@ border-radius: .5rem; box-sizing: border-box; min-height: 166px; + transition: box-shadow .1s ease-in; &.inactive { - color: #8795a1; + color: var(--grey); } img { @@ -70,7 +71,7 @@ font-size: .8rem; margin-bottom: 0; margin-top: .5rem; - color: #8795a1; + color: var(--grey); } .name { @@ -85,7 +86,7 @@ .created { font-size: .8rem; - color: #8795a1; + color: var(--grey); } .organization { @@ -119,7 +120,7 @@ right: 0; margin: 0; margin-bottom: .25rem; - color: #8795a1; + color: var(--grey); &.selected { opacity: 1; @@ -127,70 +128,17 @@ } &:hover { + box-shadow: 0 5px 10px rgba(0, 0, 0, .12); + .edit-button { opacity: 1; } - - .text-part { - .icons { - opacity: 1; - } - } } &.selected { - .text-part { - .icons { - opacity: 1; - } - } - .edit-button { opacity: 1; } - - .icon { - opacity: 1; - } - } - - @media only screen and (max-width: 450px) { - flex-basis: 100%; - } - } - - .add-project-button { - z-index: 100; - flex-basis: 250px; - cursor: pointer; - display: flex; - justify-content: center; - align-items: center; - flex-direction: column; - min-height: 166px; - border-radius: .5rem; - margin: 1rem; - box-sizing: border-box; - - .icon { - display: flex; - justify-content: center; - align-self: center; - margin-bottom: 1rem; - height: 2.5rem; - line-height: 2.5rem; - font-size: 2.5rem; - } - - &:hover { - background-color: #ffffff25; - - .icon, - span { - &.disabled { - color: gray; - } - } } @media only screen and (max-width: 450px) { @@ -203,5 +151,5 @@ flex-basis: 100%; padding: 0 1rem; font-size: .8rem; - color: #8795a1; + color: var(--grey); } diff --git a/console/src/app/pages/projects/granted-projects/granted-projects.component.scss b/console/src/app/pages/projects/granted-projects/granted-projects.component.scss index 1cd29b44cb..6ba509e9b9 100644 --- a/console/src/app/pages/projects/granted-projects/granted-projects.component.scss +++ b/console/src/app/pages/projects/granted-projects/granted-projects.component.scss @@ -3,7 +3,7 @@ h1 { } .sub { - color: #8795a1; + color: var(--grey); margin-bottom: 2rem; } diff --git a/console/src/app/pages/projects/owned-projects/owned-project-detail/application-grid/application-grid.component.scss b/console/src/app/pages/projects/owned-projects/owned-project-detail/application-grid/application-grid.component.scss index ac0eee012d..7db458a3c4 100644 --- a/console/src/app/pages/projects/owned-projects/owned-project-detail/application-grid/application-grid.component.scss +++ b/console/src/app/pages/projects/owned-projects/owned-project-detail/application-grid/application-grid.component.scss @@ -52,7 +52,7 @@ border: 1px solid $accent-color; font-weight: 800; background-color: $primary-dark; - transition: background-color .2s ease-in-out; + transition: background-color box-shadow .3s ease-in; background-image: linear-gradient(transparent 11px, rgba($accent-color, .5) 12px, transparent 12px), linear-gradient(90deg, transparent 11px, rgba($accent-color, .5) 12px, transparent 12px); @@ -60,6 +60,7 @@ &:hover { background-color: rgba($accent-color, .2); + box-shadow: 0 5px 10px rgba(0, 0, 0, .12); } &.add { diff --git a/console/src/app/pages/projects/owned-projects/owned-project-detail/owned-project-detail.component.html b/console/src/app/pages/projects/owned-projects/owned-project-detail/owned-project-detail.component.html index 6db3860602..9c5e88fc88 100644 --- a/console/src/app/pages/projects/owned-projects/owned-project-detail/owned-project-detail.component.html +++ b/console/src/app/pages/projects/owned-projects/owned-project-detail/owned-project-detail.component.html @@ -90,7 +90,7 @@ description="{{'GRANTS.PROJECT.DESCRIPTION' | translate }}"> diff --git a/console/src/app/pages/projects/owned-projects/owned-project-detail/owned-project-detail.component.scss b/console/src/app/pages/projects/owned-projects/owned-project-detail/owned-project-detail.component.scss index 72b6668863..b8c350be8b 100644 --- a/console/src/app/pages/projects/owned-projects/owned-project-detail/owned-project-detail.component.scss +++ b/console/src/app/pages/projects/owned-projects/owned-project-detail/owned-project-detail.component.scss @@ -31,7 +31,7 @@ .desc { font-size: .9rem; - color: #8795a1; + color: var(--grey); } .zitadel-warning { diff --git a/console/src/app/pages/projects/owned-projects/owned-project-detail/project-grants/project-grants.component.html b/console/src/app/pages/projects/owned-projects/owned-project-detail/project-grants/project-grants.component.html index 72be797d2c..496ec019c3 100644 --- a/console/src/app/pages/projects/owned-projects/owned-project-detail/project-grants/project-grants.component.html +++ b/console/src/app/pages/projects/owned-projects/owned-project-detail/project-grants/project-grants.component.html @@ -71,7 +71,7 @@ - + diff --git a/console/src/app/pages/projects/owned-projects/owned-project-list/owned-project-grid/owned-project-grid.component.scss b/console/src/app/pages/projects/owned-projects/owned-project-list/owned-project-grid/owned-project-grid.component.scss index 8b9c70c6ae..e21118b5bf 100644 --- a/console/src/app/pages/projects/owned-projects/owned-project-list/owned-project-grid/owned-project-grid.component.scss +++ b/console/src/app/pages/projects/owned-projects/owned-project-list/owned-project-grid/owned-project-grid.component.scss @@ -48,9 +48,10 @@ border-radius: .5rem; box-sizing: border-box; min-height: 166px; + transition: box-shadow .1s ease-in; &.inactive { - color: #8795a1; + color: var(--grey); } img { @@ -70,7 +71,7 @@ font-size: .8rem; margin-bottom: 0; margin-top: .5rem; - color: #8795a1; + color: var(--grey); } .name { @@ -85,7 +86,7 @@ .created { font-size: .8rem; - color: #8795a1; + color: var(--grey); } .organization { @@ -119,7 +120,7 @@ right: 0; margin: 0; margin-bottom: .25rem; - color: #8795a1; + color: var(--grey); &.selected { opacity: 1; @@ -127,24 +128,14 @@ } &:hover { + box-shadow: 0 5px 10px rgba(0, 0, 0, .12); + .edit-button { opacity: 1; } - - .text-part { - .icons { - opacity: 1; - } - } } &.selected { - .text-part { - .icons { - opacity: 1; - } - } - .edit-button { opacity: 1; } @@ -171,6 +162,7 @@ border-radius: .5rem; margin: 1rem; box-sizing: border-box; + transition: box-shadow .1s ease-in; .icon { display: flex; @@ -183,7 +175,7 @@ } &:hover { - background-color: #ffffff25; + box-shadow: 0 5px 10px rgba(0, 0, 0, .12); .icon, span { @@ -202,6 +194,6 @@ .n-items { padding: 0 1rem; font-size: .8rem; - color: #8795a1; + color: var(--grey); flex-basis: 100%; } diff --git a/console/src/app/pages/projects/owned-projects/owned-project-list/owned-project-list.component.scss b/console/src/app/pages/projects/owned-projects/owned-project-list/owned-project-list.component.scss index 241f4477a3..f78e21b880 100644 --- a/console/src/app/pages/projects/owned-projects/owned-project-list/owned-project-list.component.scss +++ b/console/src/app/pages/projects/owned-projects/owned-project-list/owned-project-list.component.scss @@ -3,7 +3,7 @@ h1 { } .sub { - color: #8795a1; + color: var(--grey); margin-bottom: 2rem; } diff --git a/console/src/app/pages/projects/owned-projects/owned-projects.component.scss b/console/src/app/pages/projects/owned-projects/owned-projects.component.scss index 1cd29b44cb..6ba509e9b9 100644 --- a/console/src/app/pages/projects/owned-projects/owned-projects.component.scss +++ b/console/src/app/pages/projects/owned-projects/owned-projects.component.scss @@ -3,7 +3,7 @@ h1 { } .sub { - color: #8795a1; + color: var(--grey); margin-bottom: 2rem; } diff --git a/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-detail-datasource.ts b/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-detail-datasource.ts deleted file mode 100644 index 6958d8758a..0000000000 --- a/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-detail-datasource.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { DataSource } from '@angular/cdk/collections'; -import { BehaviorSubject, from, Observable, of } from 'rxjs'; -import { catchError, finalize, map } from 'rxjs/operators'; -import { ProjectMemberView } from 'src/app/proto/generated/management_pb'; -import { ManagementService } from 'src/app/services/mgmt.service'; - -/** - * Data source for the ProjectMembers view. This class should - * encapsulate all logic for fetching and manipulating the displayed data - * (including sorting, pagination, and filtering). - */ -export class ProjectGrantDetailDataSource extends DataSource { - public totalResult: number = 0; - public membersSubject: BehaviorSubject - = new BehaviorSubject([]); - private loadingSubject: BehaviorSubject = new BehaviorSubject(false); - public loading$: Observable = this.loadingSubject.asObservable(); - - constructor(private mgmtService: ManagementService) { - super(); - } - - public loadMembers(projectId: string, grantId: string, - pageIndex: number, pageSize: number, sortDirection?: string): void { - const offset = pageIndex * pageSize; - - this.loadingSubject.next(true); - - from(this.mgmtService.SearchProjectGrantMembers(projectId, grantId, pageSize, offset)).pipe( - map(resp => { - this.totalResult = resp.toObject().totalResult; - return resp.toObject().resultList; - }), - catchError(() => of([])), - finalize(() => this.loadingSubject.next(false)), - ).subscribe(members => { - this.membersSubject.next(members); - }); - } - - - /** - * Connect this data source to the table. The table will only update when - * the returned stream emits new items. - * @returns A stream of the items to be rendered. - */ - public connect(): Observable { - return this.membersSubject.asObservable(); - }; - - /** - * Called when the table is being destroyed. Use this function, to clean up - * any open connections or free any held resources that were set up during connect. - */ - public disconnect(): void { - this.membersSubject.complete(); - this.loadingSubject.complete(); - } -} diff --git a/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-detail.component.html b/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-detail.component.html index 54bef81225..c9872fb86e 100644 --- a/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-detail.component.html +++ b/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-detail.component.html @@ -28,7 +28,7 @@ {{ 'PROJECT.GRANT.ROLENAMESLIST' | translate }} - + {{role.key}} @@ -39,7 +39,19 @@

{{ 'PROJECT.GRANT.DETAIL.MEMBERTITLE' | translate }}

{{ 'PROJECT.GRANT.DETAIL.MEMBERDESC' | translate }}

- - + + + + add{{ 'ACTIONS.NEW' | translate }} + + \ No newline at end of file diff --git a/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-detail.component.scss b/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-detail.component.scss index 11c4bb63e8..5c15ed70e3 100644 --- a/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-detail.component.scss +++ b/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-detail.component.scss @@ -1,4 +1,8 @@ +.del-button { + margin-right: .5rem; +} + .master-row { display: flex; flex-wrap: wrap; @@ -21,7 +25,7 @@ } .first { - color: #8795a1; + color: var(--grey); } } } @@ -37,5 +41,5 @@ .divider { height: 1px; - background-color: #ffffff20; + background-color: #8795a140; } diff --git a/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-detail.component.ts b/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-detail.component.ts index 16c159df66..40da52c844 100644 --- a/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-detail.component.ts +++ b/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-detail.component.ts @@ -1,8 +1,12 @@ -import { Component } from '@angular/core'; +import { Component, EventEmitter } from '@angular/core'; +import { MatDialog } from '@angular/material/dialog'; +import { PageEvent } from '@angular/material/paginator'; import { MatSelectChange } from '@angular/material/select'; import { ActivatedRoute } from '@angular/router'; import { ProjectGrant, + ProjectGrantMember, + ProjectGrantMemberView, ProjectGrantState, ProjectGrantView, ProjectRoleView, @@ -11,12 +15,20 @@ import { import { ManagementService } from 'src/app/services/mgmt.service'; import { ToastService } from 'src/app/services/toast.service'; +import { + ProjectGrantMembersCreateDialogComponent, + ProjectGrantMembersCreateDialogExportType, +} from './project-grant-members-create-dialog/project-grant-members-create-dialog.component'; +import { ProjectGrantMembersDataSource } from './project-grant-members-datasource'; + @Component({ selector: 'app-project-grant-detail', templateUrl: './project-grant-detail.component.html', styleUrls: ['./project-grant-detail.component.scss'], }) export class ProjectGrantDetailComponent { + public INITIALPAGESIZE: number = 25; + public grant!: ProjectGrantView.AsObject; public projectid: string = ''; public grantid: string = ''; @@ -27,18 +39,37 @@ export class ProjectGrantDetailComponent { public isZitadel: boolean = false; ProjectGrantState: any = ProjectGrantState; - public memberRoleOptions: ProjectRoleView.AsObject[] = []; + public projectRoleOptions: ProjectRoleView.AsObject[] = []; + public memberRoleOptions: Array = []; + public changePageFactory!: Function; + public changePage: EventEmitter = new EventEmitter(); + public selection: Array = []; + public dataSource!: ProjectGrantMembersDataSource; constructor( private mgmtService: ManagementService, private route: ActivatedRoute, private toast: ToastService, + private dialog: MatDialog, ) { this.route.params.subscribe(params => { this.projectid = params.projectid; this.grantid = params.grantid; + this.dataSource = new ProjectGrantMembersDataSource(this.mgmtService); + this.dataSource.loadGrantMembers(params.projectid, params.grantid, 0, this.INITIALPAGESIZE); + this.getRoleOptions(params.projectid); + this.getMemberRoleOptions(); + + this.changePageFactory = (event?: PageEvent) => { + return this.dataSource.loadGrantMembers( + params.projectid, + params.grantid, + event?.pageIndex ?? 0, + event?.pageSize ?? this.INITIALPAGESIZE, + ); + }; this.mgmtService.ProjectGrantByID(this.grantid, this.projectid).then((grant) => { this.grant = grant.toObject(); @@ -66,7 +97,15 @@ export class ProjectGrantDetailComponent { public getRoleOptions(projectId: string): void { this.mgmtService.SearchProjectRoles(projectId, 100, 0).then(resp => { - this.memberRoleOptions = resp.toObject().resultList; + this.projectRoleOptions = resp.toObject().resultList; + }); + } + + public getMemberRoleOptions(): void { + this.mgmtService.GetProjectGrantMemberRoles().then(resp => { + this.memberRoleOptions = resp.toObject().rolesList; + }).catch(error => { + this.toast.showError(error); }); } @@ -78,4 +117,57 @@ export class ProjectGrantDetailComponent { this.toast.showError(error); }); } + + public removeProjectMemberSelection(): void { + Promise.all(this.selection.map(member => { + return this.mgmtService.RemoveProjectGrantMember(this.grant.projectId, this.grant.id, member.userId).then(() => { + this.toast.showInfo('PROJECT.GRANT.TOAST.PROJECTGRANTMEMBERREMOVED', true); + setTimeout(() => { + this.changePage.emit(); + }, 1000); + }).catch(error => { + this.toast.showError(error); + }); + })); + } + + public async openAddMember(): Promise { + const keysList = (await this.mgmtService.GetProjectGrantMemberRoles()).toObject(); + + const dialogRef = this.dialog.open(ProjectGrantMembersCreateDialogComponent, { + data: { + roleKeysList: keysList.rolesList, + }, + width: '400px', + }); + + dialogRef.afterClosed().subscribe((dataToAdd: ProjectGrantMembersCreateDialogExportType) => { + if (dataToAdd) { + Promise.all(dataToAdd.userIds.map((userid: string) => { + return this.mgmtService.AddProjectGrantMember( + this.grant.projectId, + this.grant.id, + userid, + dataToAdd.rolesKeyList, + ); + })).then(() => { + this.toast.showInfo('PROJECT.GRANT.TOAST.PROJECTGRANTMEMBERADDED', true); + setTimeout(() => { + this.changePage.emit(); + }, 3000); + }).catch(error => { + this.toast.showError(error); + }); + } + }); + } + + updateMemberRoles(member: ProjectGrantMember.AsObject, selectionChange: MatSelectChange): void { + this.mgmtService.ChangeProjectGrantMember(this.grant.projectId, this.grant.id, member.userId, selectionChange.value) + .then((_: ProjectGrantMember) => { + this.toast.showInfo('PROJECT.GRANT.TOAST.PROJECTGRANTMEMBERCHANGED', true); + }).catch(error => { + this.toast.showError(error); + }); + } } diff --git a/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-detail.module.ts b/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-detail.module.ts index 1db1e746d8..5ec566c2c6 100644 --- a/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-detail.module.ts +++ b/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-detail.module.ts @@ -5,6 +5,7 @@ import { MatAutocompleteModule } from '@angular/material/autocomplete'; import { MatButtonModule } from '@angular/material/button'; import { MatCheckboxModule } from '@angular/material/checkbox'; import { MatChipsModule } from '@angular/material/chips'; +import { MatDialogModule } from '@angular/material/dialog'; import { MatFormFieldModule } from '@angular/material/form-field'; import { MatIconModule } from '@angular/material/icon'; import { MatPaginatorModule } from '@angular/material/paginator'; @@ -15,19 +16,21 @@ import { MatTooltipModule } from '@angular/material/tooltip'; import { TranslateModule } from '@ngx-translate/core'; import { HasRoleModule } from 'src/app/directives/has-role/has-role.module'; import { DetailLayoutModule } from 'src/app/modules/detail-layout/detail-layout.module'; +import { MembersTableModule } from 'src/app/modules/members-table/members-table.module'; import { HasRolePipeModule } from 'src/app/pipes/has-role-pipe/has-role-pipe.module'; import { ProjectGrantDetailRoutingModule } from './project-grant-detail-routing.module'; import { ProjectGrantDetailComponent } from './project-grant-detail.component'; -import { ProjectGrantMembersModule } from './project-grant-members/project-grant-members.module'; - +import { + ProjectGrantMembersCreateDialogModule, +} from './project-grant-members-create-dialog/project-grant-members-create-dialog.module'; @NgModule({ declarations: [ProjectGrantDetailComponent], imports: [ CommonModule, ProjectGrantDetailRoutingModule, - ProjectGrantMembersModule, + ProjectGrantMembersCreateDialogModule, MatAutocompleteModule, HasRoleModule, MatChipsModule, @@ -45,6 +48,8 @@ import { ProjectGrantMembersModule } from './project-grant-members/project-grant MatSelectModule, DetailLayoutModule, HasRolePipeModule, + MembersTableModule, + MatDialogModule, ], }) export class ProjectGrantDetailModule { } diff --git a/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members/project-grant-members-create-dialog/project-grant-members-create-dialog.component.html b/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members-create-dialog/project-grant-members-create-dialog.component.html similarity index 100% rename from console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members/project-grant-members-create-dialog/project-grant-members-create-dialog.component.html rename to console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members-create-dialog/project-grant-members-create-dialog.component.html diff --git a/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members/project-grant-members-create-dialog/project-grant-members-create-dialog.component.scss b/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members-create-dialog/project-grant-members-create-dialog.component.scss similarity index 100% rename from console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members/project-grant-members-create-dialog/project-grant-members-create-dialog.component.scss rename to console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members-create-dialog/project-grant-members-create-dialog.component.scss diff --git a/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members/project-grant-members-create-dialog/project-grant-members-create-dialog.component.spec.ts b/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members-create-dialog/project-grant-members-create-dialog.component.spec.ts similarity index 100% rename from console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members/project-grant-members-create-dialog/project-grant-members-create-dialog.component.spec.ts rename to console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members-create-dialog/project-grant-members-create-dialog.component.spec.ts diff --git a/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members/project-grant-members-create-dialog/project-grant-members-create-dialog.component.ts b/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members-create-dialog/project-grant-members-create-dialog.component.ts similarity index 100% rename from console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members/project-grant-members-create-dialog/project-grant-members-create-dialog.component.ts rename to console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members-create-dialog/project-grant-members-create-dialog.component.ts diff --git a/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members/project-grant-members-create-dialog/project-grant-members-create-dialog.module.ts b/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members-create-dialog/project-grant-members-create-dialog.module.ts similarity index 100% rename from console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members/project-grant-members-create-dialog/project-grant-members-create-dialog.module.ts rename to console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members-create-dialog/project-grant-members-create-dialog.module.ts diff --git a/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members/project-grant-members-datasource.ts b/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members-datasource.ts similarity index 97% rename from console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members/project-grant-members-datasource.ts rename to console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members-datasource.ts index 7cbb4d6d7d..27d0c9f603 100644 --- a/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members/project-grant-members-datasource.ts +++ b/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members-datasource.ts @@ -32,6 +32,7 @@ export class ProjectGrantMembersDataSource extends DataSource { const response = resp.toObject(); + console.log(response.resultList); this.totalResult = response.totalResult; if (response.viewTimestamp) { this.viewTimestamp = response.viewTimestamp; diff --git a/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members/project-grant-members.component.html b/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members/project-grant-members.component.html deleted file mode 100644 index f767ef9287..0000000000 --- a/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members/project-grant-members.component.html +++ /dev/null @@ -1,84 +0,0 @@ - - - - add{{ 'ACTIONS.NEW' | translate }} - - -
-
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - {{ 'PROJECT.MEMBER.FIRSTNAME' | translate }} - {{member.firstName}} {{ 'PROJECT.MEMBER.LASTNAME' | translate }} - {{member.lastName}} {{ 'PROJECT.MEMBER.USERNAME' | translate }} - {{member.userName}} {{ 'PROJECT.MEMBER.EMAIL' | translate }} - {{member.email}} - {{ 'PROJECT.MEMBER.ROLES' | translate }} - - {{ 'PROJECT.MEMBER.ROLES' | translate }} - - - {{ role }} - - - -
- - - -
-
\ No newline at end of file diff --git a/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members/project-grant-members.component.ts b/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members/project-grant-members.component.ts deleted file mode 100644 index 87628db083..0000000000 --- a/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members/project-grant-members.component.ts +++ /dev/null @@ -1,149 +0,0 @@ -import { SelectionModel } from '@angular/cdk/collections'; -import { AfterViewInit, Component, Input, OnInit, ViewChild } from '@angular/core'; -import { MatDialog } from '@angular/material/dialog'; -import { MatPaginator } from '@angular/material/paginator'; -import { MatSelectChange } from '@angular/material/select'; -import { MatTable } from '@angular/material/table'; -import { tap } from 'rxjs/operators'; -import { ProjectMember, ProjectType } from 'src/app/proto/generated/management_pb'; -import { ManagementService } from 'src/app/services/mgmt.service'; -import { ToastService } from 'src/app/services/toast.service'; - -import { - ProjectGrantMembersCreateDialogComponent, - ProjectGrantMembersCreateDialogExportType, -} from './project-grant-members-create-dialog/project-grant-members-create-dialog.component'; -import { ProjectGrantMembersDataSource } from './project-grant-members-datasource'; - -@Component({ - selector: 'app-project-grant-members', - templateUrl: './project-grant-members.component.html', - styleUrls: ['./project-grant-members.component.scss'], -}) -export class ProjectGrantMembersComponent implements AfterViewInit, OnInit { - @Input() public projectId!: string; - @Input() public grantId!: string; - - @Input() public type: ProjectType = ProjectType.PROJECTTYPE_GRANTED; - - @ViewChild(MatPaginator) public paginator!: MatPaginator; - @ViewChild(MatTable) public table!: MatTable; - public dataSource!: ProjectGrantMembersDataSource; - public selection: SelectionModel = new SelectionModel(true, []); - - /** Columns displayed in the table. Columns IDs can be added, removed, or reordered. */ - public displayedColumns: string[] = ['select', 'firstname', 'lastname', 'username', 'email', 'roles']; - - public ProjectType: any = ProjectType; - public memberRoleOptions: string[] = []; - - constructor( - private mgmtService: ManagementService, - private dialog: MatDialog, - private toast: ToastService, - ) { - this.dataSource = new ProjectGrantMembersDataSource(this.mgmtService); - this.getRoleOptions(); - } - - public ngOnInit(): void { - this.dataSource.loadGrantMembers(this.projectId, this.grantId, 0, 25); - } - - public ngAfterViewInit(): void { - this.paginator.page - .pipe( - tap(() => this.loadMembersPage()), - ) - .subscribe(); - } - - public getRoleOptions(): void { - if (this.type === ProjectType.PROJECTTYPE_GRANTED) { - this.mgmtService.GetProjectGrantMemberRoles().then(resp => { - this.memberRoleOptions = resp.toObject().rolesList; - }).catch(error => { - this.toast.showError(error); - }); - } else if (this.type === ProjectType.PROJECTTYPE_OWNED) { - this.mgmtService.GetProjectMemberRoles().then(resp => { - this.memberRoleOptions = resp.toObject().rolesList; - }).catch(error => { - this.toast.showError(error); - }); - } - } - - private loadMembersPage(): void { - this.dataSource.loadGrantMembers( - this.projectId, - this.grantId, - this.paginator.pageIndex, - this.paginator.pageSize, - ); - } - - public removeProjectMemberSelection(): void { - Promise.all(this.selection.selected.map(member => { - return this.mgmtService.RemoveProjectGrantMember(this.projectId, this.grantId, member.userId).then(() => { - this.toast.showInfo('PROJECT.GRANT.TOAST.PROJECTGRANTMEMBERREMOVED', true); - }).catch(error => { - this.toast.showError(error); - }); - })); - } - - public isAllSelected(): boolean { - const numSelected = this.selection.selected.length; - const numRows = this.dataSource.membersSubject.value.length; - return numSelected === numRows; - } - - public masterToggle(): void { - this.isAllSelected() ? - this.selection.clear() : - this.dataSource.membersSubject.value.forEach(row => this.selection.select(row)); - } - - public async openAddMember(): Promise { - const keysList = (await this.mgmtService.GetProjectGrantMemberRoles()).toObject(); - - const dialogRef = this.dialog.open(ProjectGrantMembersCreateDialogComponent, { - data: { - roleKeysList: keysList.rolesList, - }, - width: '400px', - }); - - dialogRef.afterClosed().subscribe((dataToAdd: ProjectGrantMembersCreateDialogExportType) => { - if (dataToAdd) { - Promise.all(dataToAdd.userIds.map((userid: string) => { - return this.mgmtService.AddProjectGrantMember( - this.projectId, - this.grantId, - userid, - dataToAdd.rolesKeyList, - ); - })).then(() => { - this.toast.showInfo('PROJECT.GRANT.TOAST.PROJECTGRANTMEMBERADDED', true); - }).catch(error => { - this.toast.showError(error); - }); - } - }); - } - - updateRoles(member: ProjectMember.AsObject, selectionChange: MatSelectChange): void { - this.mgmtService.ChangeProjectGrantMember(this.projectId, this.grantId, member.userId, selectionChange.value) - .then((newmember: ProjectMember) => { - this.toast.showInfo('PROJECT.GRANT.TOAST.PROJECTGRANTMEMBERCHANGED', true); - }).catch(error => { - this.toast.showError(error); - }); - } - - public refreshPage(): void { - this.selection.clear(); - this.dataSource.loadGrantMembers(this.projectId, this.grantId, this.paginator.pageIndex, this.paginator.pageSize); - } -} diff --git a/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members/project-grant-members.module.ts b/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members/project-grant-members.module.ts deleted file mode 100644 index 1f7613c165..0000000000 --- a/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members/project-grant-members.module.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { MatDialogModule } from '@angular/material/dialog'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatPaginatorModule } from '@angular/material/paginator'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatSelectModule } from '@angular/material/select'; -import { MatSortModule } from '@angular/material/sort'; -import { MatTableModule } from '@angular/material/table'; -import { MatTooltipModule } from '@angular/material/tooltip'; -import { RouterModule } from '@angular/router'; -import { TranslateModule } from '@ngx-translate/core'; -import { HasRoleModule } from 'src/app/directives/has-role/has-role.module'; -import { RefreshTableModule } from 'src/app/modules/refresh-table/refresh-table.module'; -import { SearchUserAutocompleteModule } from 'src/app/modules/search-user-autocomplete/search-user-autocomplete.module'; -import { HasRolePipeModule } from 'src/app/pipes/has-role-pipe/has-role-pipe.module'; - -import { - ProjectGrantMembersCreateDialogModule, -} from './project-grant-members-create-dialog/project-grant-members-create-dialog.module'; -import { ProjectGrantMembersComponent } from './project-grant-members.component'; - -@NgModule({ - declarations: [ProjectGrantMembersComponent], - imports: [ - CommonModule, - HasRoleModule, - RouterModule, - MatButtonModule, - MatCheckboxModule, - MatIconModule, - MatInputModule, - MatFormFieldModule, - MatSelectModule, - MatTableModule, - SearchUserAutocompleteModule, - ProjectGrantMembersCreateDialogModule, - MatPaginatorModule, - MatSortModule, - MatTooltipModule, - MatDialogModule, - ReactiveFormsModule, - MatProgressSpinnerModule, - FormsModule, - TranslateModule, - RefreshTableModule, - HasRolePipeModule, - ], - exports: [ - ProjectGrantMembersComponent, - ], -}) -export class ProjectGrantMembersModule { } diff --git a/console/src/app/pages/signedout/signedout.component.scss b/console/src/app/pages/signedout/signedout.component.scss index f9301eca51..1577de9c7f 100644 --- a/console/src/app/pages/signedout/signedout.component.scss +++ b/console/src/app/pages/signedout/signedout.component.scss @@ -15,7 +15,7 @@ } p { - color: #8795a1; + color: var(--grey); text-align: center; font-size: 1rem; margin: 0; diff --git a/console/src/app/pages/user-grant-create/user-grant-create.component.scss b/console/src/app/pages/user-grant-create/user-grant-create.component.scss index 3070710ad0..41e55414c9 100644 --- a/console/src/app/pages/user-grant-create/user-grant-create.component.scss +++ b/console/src/app/pages/user-grant-create/user-grant-create.component.scss @@ -24,7 +24,7 @@ } .desc { - color: #8795a1; + color: var(--grey); } } diff --git a/console/src/app/pages/users/user-create-machine/user-create-machine.component.scss b/console/src/app/pages/users/user-create-machine/user-create-machine.component.scss index e4ce52c669..94457d525a 100644 --- a/console/src/app/pages/users/user-create-machine/user-create-machine.component.scss +++ b/console/src/app/pages/users/user-create-machine/user-create-machine.component.scss @@ -15,14 +15,15 @@ .content { width: 100%; - display: flex wrap; + display: flex; + flex-wrap: wrap; flex-direction: row; margin: 0 -.5rem; .section { padding: .5rem; flex-basis: 100%; - color: #8795a1; + color: var(--grey); font-size: .9rem; } diff --git a/console/src/app/pages/users/user-create/user-create.component.scss b/console/src/app/pages/users/user-create/user-create.component.scss index e4ce52c669..94457d525a 100644 --- a/console/src/app/pages/users/user-create/user-create.component.scss +++ b/console/src/app/pages/users/user-create/user-create.component.scss @@ -15,14 +15,15 @@ .content { width: 100%; - display: flex wrap; + display: flex; + flex-wrap: wrap; flex-direction: row; margin: 0 -.5rem; .section { padding: .5rem; flex-basis: 100%; - color: #8795a1; + color: var(--grey); font-size: .9rem; } diff --git a/console/src/app/pages/users/user-detail/auth-user-detail/auth-user-detail.component.html b/console/src/app/pages/users/user-detail/auth-user-detail/auth-user-detail.component.html index 70d8fd699d..2a38dd59cb 100644 --- a/console/src/app/pages/users/user-detail/auth-user-detail/auth-user-detail.component.html +++ b/console/src/app/pages/users/user-detail/auth-user-detail/auth-user-detail.component.html @@ -27,18 +27,12 @@ - - - - @@ -46,101 +40,10 @@ -
-
- {{ 'USER.PROFILE.PASSWORD' | translate }} - - ********* - -
- -
- {{ 'USER.EMAIL' | translate }} - - -
- {{user?.human?.email}} - - check_circle_outline - - - highlight_off - - {{'USER.LOGINMETHODS.RESENDCODE' | translate}} - -
- -
- -
-
- - - {{ 'USER.EMAIL' | translate }} - - - - - -
- -
- {{ 'USER.PHONE' | translate }} - - -
- {{user?.human?.phone}} - - check_circle_outline - - - highlight_off - - {{'USER.LOGINMETHODS.ENTERCODE' | translate}} - {{'USER.LOGINMETHODS.RESENDCODE' | translate}} - -
- -
- -
-
- - - - {{ 'USER.PHONE' | translate }} - - - - - - -
-
+
@@ -149,7 +52,7 @@
- Preferred Loginname: + {{'USER.PREFERRED_LOGINNAME' | translate}} {{user.preferredLoginName}}
diff --git a/console/src/app/pages/users/user-detail/auth-user-detail/auth-user-detail.component.scss b/console/src/app/pages/users/user-detail/auth-user-detail/auth-user-detail.component.scss index ce0b8ed026..990b793c7f 100644 --- a/console/src/app/pages/users/user-detail/auth-user-detail/auth-user-detail.component.scss +++ b/console/src/app/pages/users/user-detail/auth-user-detail/auth-user-detail.component.scss @@ -10,7 +10,7 @@ } .sub { - color: #8795a1; + color: var(--grey); } .theme { @@ -53,59 +53,6 @@ } } -.method-col { - display: flex; - flex-direction: column; - margin: -.5rem; - - .method-row { - display: flex; - align-items: center; - justify-content: space-between; - padding: .5rem; - border-bottom: 1px solid #ffffff20; - flex-wrap: wrap; - - .label, - .name { - margin-right: 1rem; - } - - .actions { - flex: 1; - display: flex; - justify-content: flex-end; - align-items: center; - flex-direction: column; - } - - .label { - font-size: .9rem; - color: #8795a1; - } - - .icon { - margin: .5rem; - } - - .verify { - text-decoration: none; - font-size: .8rem; - color: #8795a1; - border-radius: .5rem; - cursor: pointer; - word-wrap: none; - white-space: nowrap; - margin-right: 1rem; - - &:hover { - color: white; - text-decoration: underline; - } - } - } -} - .col { display: flex; flex-wrap: wrap; @@ -116,14 +63,6 @@ flex: 1; margin: .5rem; } - - // .theme-card { - // max-width: 300px; - - // @media only screen and (max-width: 450px) { - // max-width: none; - // } - // } } .side { diff --git a/console/src/app/pages/users/user-detail/auth-user-detail/auth-user-detail.component.ts b/console/src/app/pages/users/user-detail/auth-user-detail/auth-user-detail.component.ts index 9ef70b16e4..56c9dac0cf 100644 --- a/console/src/app/pages/users/user-detail/auth-user-detail/auth-user-detail.component.ts +++ b/console/src/app/pages/users/user-detail/auth-user-detail/auth-user-detail.component.ts @@ -1,5 +1,4 @@ import { Component, OnDestroy } from '@angular/core'; -import { MatDialog } from '@angular/material/dialog'; import { TranslateService } from '@ngx-translate/core'; import { Subscription } from 'rxjs'; import { ChangeType } from 'src/app/modules/changes/changes.component'; @@ -7,8 +6,6 @@ import { Gender, UserAddress, UserEmail, UserPhone, UserProfile, UserView } from import { GrpcAuthService } from 'src/app/services/grpc-auth.service'; import { ToastService } from 'src/app/services/toast.service'; -import { CodeDialogComponent } from './code-dialog/code-dialog.component'; - @Component({ selector: 'app-auth-user-detail', templateUrl: './auth-user-detail.component.html', @@ -22,9 +19,6 @@ export class AuthUserDetailComponent implements OnDestroy { private subscription: Subscription = new Subscription(); - public emailEditState: boolean = false; - public phoneEditState: boolean = false; - public loading: boolean = false; public copied: string = ''; @@ -36,7 +30,6 @@ export class AuthUserDetailComponent implements OnDestroy { public translate: TranslateService, private toast: ToastService, public userService: GrpcAuthService, - private dialog: MatDialog, ) { this.loading = true; this.userService.GetMyUser().then(user => { @@ -79,50 +72,31 @@ export class AuthUserDetailComponent implements OnDestroy { } } - public saveEmail(): void { - this.emailEditState = false; - - if (this.user.human) { - this.userService - .SaveMyUserEmail(this.user.human.email).then((data: UserEmail) => { - this.toast.showInfo('USER.TOAST.EMAILSAVED', true); - if (this.user.human) { - this.user.human.email = data.toObject().email; - } - this.emailEditState = false; - }).catch(error => { - this.toast.showError(error); - this.emailEditState = false; - }); - } + public saveEmail(email: string): void { + this.userService + .SaveMyUserEmail(email).then((data: UserEmail) => { + this.toast.showInfo('USER.TOAST.EMAILSAVED', true); + if (this.user.human) { + this.user.human.email = data.toObject().email; + } + }).catch(error => { + this.toast.showError(error); + }); } - public enterCode(): void { - if (this.user.human) { - const dialogRef = this.dialog.open(CodeDialogComponent, { - data: { - number: this.user.human.phone, - }, - width: '400px', - }); - - dialogRef.afterClosed().subscribe(code => { - if (code) { - this.userService.VerifyMyUserPhone(code).then(() => { - this.toast.showInfo('USER.TOAST.PHONESAVED', true); - }).catch(error => { - this.toast.showError(error); - }); - } - }); - } + public enteredPhoneCode(code: string): void { + this.userService.VerifyMyUserPhone(code).then(() => { + this.toast.showInfo('USER.TOAST.PHONESAVED', true); + }).catch(error => { + this.toast.showError(error); + }); } public changedLanguage(language: string): void { this.translate.use(language); } - public resendVerification(): void { + public resendEmailVerification(): void { this.userService.ResendEmailVerification().then(() => { this.toast.showInfo('USER.TOAST.EMAILSAVED', true); }).catch(error => { @@ -139,32 +113,26 @@ export class AuthUserDetailComponent implements OnDestroy { } public deletePhone(): void { - if (this.user.human) { - this.userService.RemoveMyUserPhone().then(() => { - this.toast.showInfo('USER.TOAST.PHONEREMOVED', true); - if (this.user.human) { - this.user.human.phone = ''; - } - this.phoneEditState = false; - }).catch(error => { - this.toast.showError(error); - }); - } + this.userService.RemoveMyUserPhone().then(() => { + this.toast.showInfo('USER.TOAST.PHONEREMOVED', true); + if (this.user.human) { + this.user.human.phone = ''; + } + }).catch(error => { + this.toast.showError(error); + }); } - public savePhone(): void { - this.phoneEditState = false; + public savePhone(phone: string): void { if (this.user.human) { this.userService - .SaveMyUserPhone(this.user.human.phone).then((data: UserPhone) => { + .SaveMyUserPhone(phone).then((data: UserPhone) => { this.toast.showInfo('USER.TOAST.PHONESAVED', true); if (this.user.human) { this.user.human.phone = data.toObject().phone; } - this.phoneEditState = false; }).catch(error => { this.toast.showError(error); - this.phoneEditState = false; }); } } diff --git a/console/src/app/pages/users/user-detail/auth-user-detail/theme-setting/theme-card.scss b/console/src/app/pages/users/user-detail/auth-user-detail/theme-setting/theme-card.scss index bea3d95cce..4c41f9dc3c 100644 --- a/console/src/app/pages/users/user-detail/auth-user-detail/theme-setting/theme-card.scss +++ b/console/src/app/pages/users/user-detail/auth-user-detail/theme-setting/theme-card.scss @@ -9,6 +9,6 @@ .theme-conent, .crescent { background-color: $primary-dark; - transition: background-color .4s cubic-bezier(.645, .045, .355, 1); + transition: background-color .3s cubic-bezier(.645, .045, .355, 1); // cubic-bezier(.645, .045, .355, 1); } } diff --git a/console/src/app/pages/users/user-detail/auth-user-detail/theme-setting/theme-setting.component.scss b/console/src/app/pages/users/user-detail/auth-user-detail/theme-setting/theme-setting.component.scss index 99a21fd279..2e57d35d5f 100644 --- a/console/src/app/pages/users/user-detail/auth-user-detail/theme-setting/theme-setting.component.scss +++ b/console/src/app/pages/users/user-detail/auth-user-detail/theme-setting/theme-setting.component.scss @@ -34,7 +34,7 @@ $light-background: rgb(220, 220, 220); background: $light-background; transform: scale(0); transform-origin: top right; - transition: transform .4s cubic-bezier(.645, .045, .355, 1); + transition: transform .2s cubic-bezier(.645, .045, .355, 1); } p { diff --git a/console/src/app/pages/users/user-detail/contact/contact.component.html b/console/src/app/pages/users/user-detail/contact/contact.component.html new file mode 100644 index 0000000000..1178b442ed --- /dev/null +++ b/console/src/app/pages/users/user-detail/contact/contact.component.html @@ -0,0 +1,97 @@ +
+
+ {{ 'USER.PROFILE.PASSWORD' | translate }} + + ********* + +
+ +
+ {{ 'USER.EMAIL' | translate }} + + +
+ {{human?.email}} + + check_circle_outline + + + highlight_off + + {{'USER.LOGINMETHODS.RESENDCODE' | translate}} + +
+ +
+ +
+
+ + + {{ 'USER.EMAIL' | translate }} + + + + + +
+ +
+ {{ 'USER.PHONE' | translate }} + + +
+ {{human?.phone}} + + check_circle_outline + + + highlight_off + + {{'USER.LOGINMETHODS.ENTERCODE' | translate}} + {{'USER.LOGINMETHODS.RESENDCODE' | translate}} + +
+ +
+ +
+
+ + + + {{ 'USER.PHONE' | translate }} + + + + + + +
+
\ No newline at end of file diff --git a/console/src/app/pages/users/user-detail/contact/contact.component.scss b/console/src/app/pages/users/user-detail/contact/contact.component.scss new file mode 100644 index 0000000000..ff50da7399 --- /dev/null +++ b/console/src/app/pages/users/user-detail/contact/contact.component.scss @@ -0,0 +1,47 @@ +.method-col { + display: flex; + flex-direction: column; + margin: -.5rem; + + .method-row { + display: flex; + align-items: center; + justify-content: space-between; + padding: .5rem; + border-bottom: 1px solid #ffffff20; + flex-wrap: wrap; + + .actions { + flex: 1; + display: flex; + justify-content: flex-end; + align-items: center; + flex-direction: column; + min-width: 150px; + } + + .label { + font-size: .9rem; + min-width: 100px; + color: var(--grey); + } + + .icon { + margin: .5rem; + } + + .verify { + text-decoration: none; + font-size: .8rem; + color: var(--grey); + border-radius: .5rem; + cursor: pointer; + word-wrap: none; + white-space: nowrap; + + &:hover { + text-decoration: underline; + } + } + } +} diff --git a/console/src/app/pages/users/user-detail/contact/contact.component.spec.ts b/console/src/app/pages/users/user-detail/contact/contact.component.spec.ts new file mode 100644 index 0000000000..508fa261e4 --- /dev/null +++ b/console/src/app/pages/users/user-detail/contact/contact.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ContactComponent } from './contact.component'; + +describe('ContactComponent', () => { + let component: ContactComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ContactComponent], + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(ContactComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/console/src/app/pages/users/user-detail/contact/contact.component.ts b/console/src/app/pages/users/user-detail/contact/contact.component.ts new file mode 100644 index 0000000000..d9961df4da --- /dev/null +++ b/console/src/app/pages/users/user-detail/contact/contact.component.ts @@ -0,0 +1,70 @@ +import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; +import { MatDialog } from '@angular/material/dialog'; +import { HumanView as AuthHumanView } from 'src/app/proto/generated/auth_pb'; +import { HumanView as MgmtHumanView } from 'src/app/proto/generated/management_pb'; + +import { CodeDialogComponent } from '../auth-user-detail/code-dialog/code-dialog.component'; + +@Component({ + selector: 'app-contact', + templateUrl: './contact.component.html', + styleUrls: ['./contact.component.scss'], +}) +export class ContactComponent implements OnInit { + @Input() disablePhoneCode: boolean = false; + @Input() canWrite: boolean = false; + @Input() human!: AuthHumanView.AsObject | MgmtHumanView.AsObject; + @Output() savedPhone: EventEmitter = new EventEmitter(); + @Output() savedEmail: EventEmitter = new EventEmitter(); + @Output() resendEmailVerification: EventEmitter = new EventEmitter(); + @Output() resendPhoneVerification: EventEmitter = new EventEmitter(); + @Output() enteredPhoneCode: EventEmitter = new EventEmitter(); + @Output() deletedPhone: EventEmitter = new EventEmitter(); + + public emailEditState: boolean = false; + public phoneEditState: boolean = false; + constructor(private dialog: MatDialog) { } + + ngOnInit(): void { + } + + savePhone(): void { + this.phoneEditState = false; + this.savedPhone.emit(this.human.phone); + } + + emitDeletePhone(): void { + this.phoneEditState = false; + this.deletedPhone.emit(); + } + + saveEmail(): void { + this.emailEditState = false; + this.savedEmail.emit(this.human.email); + } + + emitEmailVerification(): void { + this.resendEmailVerification.emit(); + } + + emitPhoneVerification(): void { + this.resendPhoneVerification.emit(); + } + + public enterCode(): void { + if (this.human) { + const dialogRef = this.dialog.open(CodeDialogComponent, { + data: { + number: this.human.phone, + }, + width: '400px', + }); + + dialogRef.afterClosed().subscribe(code => { + if (code) { + this.enteredPhoneCode.emit(code); + } + }); + } + } +} diff --git a/console/src/app/pages/users/user-detail/detail-form/detail-form.component.ts b/console/src/app/pages/users/user-detail/detail-form/detail-form.component.ts index 7675855aa0..c4266a740c 100644 --- a/console/src/app/pages/users/user-detail/detail-form/detail-form.component.ts +++ b/console/src/app/pages/users/user-detail/detail-form/detail-form.component.ts @@ -31,7 +31,7 @@ export class DetailFormComponent implements OnDestroy, OnChanges { firstName: [{ value: '', disabled: this.disabled }, Validators.required], lastName: [{ value: '', disabled: this.disabled }, Validators.required], nickName: [{ value: '', disabled: this.disabled }], - gender: [{ value: 0 }, { disabled: this.disabled }], + gender: [{ value: 0, disabled: this.disabled }], preferredLanguage: [{ value: '', disabled: this.disabled }], }); } @@ -44,7 +44,7 @@ export class DetailFormComponent implements OnDestroy, OnChanges { firstName: [{ value: '', disabled: this.disabled }, Validators.required], lastName: [{ value: '', disabled: this.disabled }, Validators.required], nickName: [{ value: '', disabled: this.disabled }], - gender: [{ value: 0 }, { disabled: this.disabled }], + gender: [{ value: 0, disabled: this.disabled }], preferredLanguage: [{ value: '', disabled: this.disabled }], }); diff --git a/console/src/app/pages/users/user-detail/machine-keys/add-key-dialog/add-key-dialog.component.scss b/console/src/app/pages/users/user-detail/machine-keys/add-key-dialog/add-key-dialog.component.scss index 48211d84a2..132f28cfd4 100644 --- a/console/src/app/pages/users/user-detail/machine-keys/add-key-dialog/add-key-dialog.component.scss +++ b/console/src/app/pages/users/user-detail/machine-keys/add-key-dialog/add-key-dialog.component.scss @@ -4,7 +4,7 @@ } .desc { - color: #8795a1; + color: var(--grey); font-size: .9rem; } diff --git a/console/src/app/pages/users/user-detail/machine-keys/show-key-dialog/show-key-dialog.component.scss b/console/src/app/pages/users/user-detail/machine-keys/show-key-dialog/show-key-dialog.component.scss index f4ade90762..f1b397a45a 100644 --- a/console/src/app/pages/users/user-detail/machine-keys/show-key-dialog/show-key-dialog.component.scss +++ b/console/src/app/pages/users/user-detail/machine-keys/show-key-dialog/show-key-dialog.component.scss @@ -33,7 +33,7 @@ } .left { - color: #8795a1; + color: var(--grey); margin-right: 1rem; margin-top: 0; margin-bottom: .5rem; diff --git a/console/src/app/pages/users/user-detail/memberships/memberships.component.scss b/console/src/app/pages/users/user-detail/memberships/memberships.component.scss index ee148887b5..f145943423 100644 --- a/console/src/app/pages/users/user-detail/memberships/memberships.component.scss +++ b/console/src/app/pages/users/user-detail/memberships/memberships.component.scss @@ -18,7 +18,7 @@ .sub-header { font-size: .8rem; - color: #8795a1; + color: var(--grey); } .people { @@ -84,7 +84,7 @@ box-sizing: border-box; font-size: 8px; border-radius: .5rem; - transition: background-color .2s ease-in-out; + transition: background-color .3s cubic-bezier(.645, .045, .355, 1); background-color: $accent-color; cursor: pointer; flex-direction: column; diff --git a/console/src/app/pages/users/user-detail/user-detail-routing.module.ts b/console/src/app/pages/users/user-detail/user-detail-routing.module.ts index 6658560d2f..b2e27cb3c7 100644 --- a/console/src/app/pages/users/user-detail/user-detail-routing.module.ts +++ b/console/src/app/pages/users/user-detail/user-detail-routing.module.ts @@ -2,6 +2,7 @@ import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; import { AuthGuard } from 'src/app/guards/auth.guard'; import { RoleGuard } from 'src/app/guards/role.guard'; +import { UserGuard } from 'src/app/guards/user.guard'; import { AuthUserDetailComponent } from './auth-user-detail/auth-user-detail.component'; import { PasswordComponent } from './password/password.component'; @@ -41,7 +42,7 @@ const routes: Routes = [ { path: ':id', component: UserDetailComponent, - canActivate: [AuthGuard, RoleGuard], + canActivate: [AuthGuard, UserGuard, RoleGuard], data: { roles: ['user.read'], animation: 'HomePage', diff --git a/console/src/app/pages/users/user-detail/user-detail.module.ts b/console/src/app/pages/users/user-detail/user-detail.module.ts index b17c206243..9350912b47 100644 --- a/console/src/app/pages/users/user-detail/user-detail.module.ts +++ b/console/src/app/pages/users/user-detail/user-detail.module.ts @@ -46,6 +46,7 @@ import { PasswordComponent } from './password/password.component'; import { UserDetailRoutingModule } from './user-detail-routing.module'; import { UserDetailComponent } from './user-detail/user-detail.component'; import { UserMfaComponent } from './user-detail/user-mfa/user-mfa.component'; +import { ContactComponent } from './contact/contact.component'; @NgModule({ declarations: [ @@ -60,6 +61,7 @@ import { UserMfaComponent } from './user-detail/user-mfa/user-mfa.component'; MembershipsComponent, MachineKeysComponent, ExternalIdpsComponent, + ContactComponent, ], imports: [ UserDetailRoutingModule, diff --git a/console/src/app/pages/users/user-detail/user-detail/user-detail.component.html b/console/src/app/pages/users/user-detail/user-detail/user-detail.component.html index 0b3d99b917..10c8455d3e 100644 --- a/console/src/app/pages/users/user-detail/user-detail/user-detail.component.html +++ b/console/src/app/pages/users/user-detail/user-detail/user-detail.component.html @@ -68,129 +68,34 @@ -
-
- {{ 'USER.PROFILE.PASSWORD' | translate }} - ****** -
- - - chevron_right - -
-
-
- {{ 'USER.EMAIL' | translate }} - -
- {{user?.human?.email}} - - check_circle_outline - - - highlight_off - - - {{'USER.LOGINMETHODS.RESENDCODE' | translate}} - - -
- -
- -
-
- - - {{ 'USER.EMAIL' | translate }} - - - - - -
- -
- {{ 'USER.PHONE' | translate }} - - -
- {{user?.human?.phone}} - - check_circle_outline - - - highlight_off - - - {{'USER.LOGINMETHODS.RESENDCODE' | translate}} - - -
- -
- -
-
- - - - {{ 'USER.PHONE' | translate }} - - - - - - - -
-
+ + +
- + [allowDelete]="['user.grant.delete$', 'user.grant.delete'+ user?.id] | hasRole | async"> +
- Preferred Loginname: + {{'USER.PREFERRED_LOGINNAME' | translate}} {{user.preferredLoginName}}
diff --git a/console/src/app/pages/users/user-detail/user-detail/user-detail.component.scss b/console/src/app/pages/users/user-detail/user-detail/user-detail.component.scss index d4350df012..d256173680 100644 --- a/console/src/app/pages/users/user-detail/user-detail/user-detail.component.scss +++ b/console/src/app/pages/users/user-detail/user-detail/user-detail.component.scss @@ -23,69 +23,6 @@ } } -.method-col { - display: flex; - flex-direction: column; - margin: -.5rem; - - .method-row { - display: flex; - align-items: center; - justify-content: space-between; - padding: .5rem; - border-bottom: 1px solid #ffffff20; - flex-wrap: wrap; - - .label, - .name { - padding-right: 1rem; - } - - .actions { - flex: 1; - display: flex; - justify-content: flex-end; - align-items: center; - flex-direction: column; - } - - .label { - font-size: .9rem; - color: #818a8a; - } - - .icon { - margin: .5rem; - } - - .verify { - text-decoration: none; - font-size: .8rem; - color: #8795a1; - border-radius: .5rem; - cursor: pointer; - word-wrap: none; - white-space: nowrap; - margin-right: 1rem; - - &:hover { - color: white; - text-decoration: underline; - } - } - - @media only screen and (max-width: 700px) { - flex-direction: column; - align-items: center; - - .label, - .name { - padding-right: 0; - } - } - } -} - .img-phone-email { width: 300px; } diff --git a/console/src/app/pages/users/user-detail/user-detail/user-detail.component.ts b/console/src/app/pages/users/user-detail/user-detail/user-detail.component.ts index c114a76b31..b6759690b7 100644 --- a/console/src/app/pages/users/user-detail/user-detail/user-detail.component.ts +++ b/console/src/app/pages/users/user-detail/user-detail/user-detail.component.ts @@ -31,8 +31,6 @@ export class UserDetailComponent implements OnInit, OnDestroy { public languages: string[] = ['de', 'en']; private subscription: Subscription = new Subscription(); - public emailEditState: boolean = false; - public phoneEditState: boolean = false; public ChangeType: any = ChangeType; public loading: boolean = false; @@ -127,7 +125,7 @@ export class UserDetailComponent implements OnInit, OnDestroy { } } - public resendVerification(): void { + public resendEmailVerification(): void { this.mgmtUserService.ResendEmailVerification(this.user.id).then(() => { this.toast.showInfo('USER.TOAST.EMAILVERIFICATIONSENT', true); }).catch(error => { @@ -136,6 +134,7 @@ export class UserDetailComponent implements OnInit, OnDestroy { } public resendPhoneVerification(): void { + console.log('resend phone ver', this.user.id); this.mgmtUserService.ResendPhoneVerification(this.user.id).then(() => { this.toast.showInfo('USER.TOAST.PHONEVERIFICATIONSENT', true); }).catch(error => { @@ -149,37 +148,32 @@ export class UserDetailComponent implements OnInit, OnDestroy { if (this.user.human) { this.user.human.phone = ''; } - this.phoneEditState = false; }).catch(error => { this.toast.showError(error); }); } - public saveEmail(): void { - this.emailEditState = false; - if (this.user && this.user.human?.email) { - this.mgmtUserService - .SaveUserEmail(this.user.id, this.user.human.email).then((data: UserEmail) => { - this.toast.showInfo('USER.TOAST.EMAILSENT', true); - if (this.user.human) { - this.user.human.email = data.toObject().email; - } - }).catch(error => { - this.toast.showError(error); - }); + public saveEmail(email: string): void { + if (this.user.id && email) { + this.mgmtUserService.SaveUserEmail(this.user.id, email).then((data: UserEmail) => { + this.toast.showInfo('USER.TOAST.EMAILSENT', true); + if (this.user.human) { + this.user.human.email = data.toObject().email; + } + }).catch(error => { + this.toast.showError(error); + }); } } - public savePhone(): void { - this.phoneEditState = false; - if (this.user && this.user.human?.phone) { + public savePhone(phone: string): void { + if (this.user.id && phone) { this.mgmtUserService - .SaveUserPhone(this.user.id, this.user.human.phone).then((data: UserPhone) => { + .SaveUserPhone(this.user.id, phone).then((data: UserPhone) => { this.toast.showInfo('USER.TOAST.PHONESAVED', true); if (this.user.human) { this.user.human.phone = data.toObject().phone; } - this.phoneEditState = false; }).catch(error => { this.toast.showError(error); }); diff --git a/console/src/app/pages/users/user-list/user-list.component.scss b/console/src/app/pages/users/user-list/user-list.component.scss index b0b77cc35b..7abeeb71a1 100644 --- a/console/src/app/pages/users/user-list/user-list.component.scss +++ b/console/src/app/pages/users/user-list/user-list.component.scss @@ -3,6 +3,6 @@ h1 { } .sub { - color: #8795a1; + color: var(--grey); margin-bottom: 2rem; } diff --git a/console/src/app/pages/users/user-list/user-table/user-table.component.html b/console/src/app/pages/users/user-list/user-table/user-table.component.html index 6c673e4ee2..8da09b1282 100644 --- a/console/src/app/pages/users/user-list/user-table/user-table.component.html +++ b/console/src/app/pages/users/user-list/user-table/user-table.component.html @@ -1,13 +1,13 @@ - - - {{'USER.PAGES.FILTER' | translate}} - - + + {{'USER.PAGES.FILTER' | translate}} + + +