diff --git a/angular.json b/angular.json index d9fce95..ae4125e 100644 --- a/angular.json +++ b/angular.json @@ -30,7 +30,8 @@ ], "styles": [ "./node_modules/@angular/material/prebuilt-themes/deeppurple-amber.css", - "src/styles.scss" + "src/styles.scss", + "src/assets/scss/theme.scss" ], "scripts": [] }, @@ -98,7 +99,8 @@ ], "styles": [ "./node_modules/@angular/material/prebuilt-themes/deeppurple-amber.css", - "src/styles.scss" + "src/styles.scss", + "src/assets/scss/theme.scss" ], "scripts": [] } diff --git a/package-lock.json b/package-lock.json index e5664e5..3ba5e3c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,12 +5,12 @@ "requires": true, "dependencies": { "@angular-devkit/architect": { - "version": "0.901.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.901.5.tgz", - "integrity": "sha512-VO+8qBkaq54xAjdtvhEhQ86gZxS0V1wC9hGblw3O+XXri/euHky4811B2BbEylPy8/kRy5sUYcuwcyZrVxJ2TQ==", + "version": "0.901.6", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.901.6.tgz", + "integrity": "sha512-0pWzn10gCZxMCrS62NlD38qE2R7l5fPfBuNylntNqvzw9L7iS1ARgqMlAKn8KLaNG6FrXONmgUWHsV987ZICIw==", "dev": true, "requires": { - "@angular-devkit/core": "9.1.5", + "@angular-devkit/core": "9.1.6", "rxjs": "6.5.4" }, "dependencies": { @@ -26,21 +26,21 @@ } }, "@angular-devkit/build-angular": { - "version": "0.901.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-0.901.5.tgz", - "integrity": "sha512-XottEBXE7cmkx6LPu33lXJCSAlxFkIu2ErWvV1oy+La6aZEuoJVntxzIKLprJmTiiD/4IDDQLWwp4m+EC96kyg==", + "version": "0.901.6", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-0.901.6.tgz", + "integrity": "sha512-jgLFKRWSZIZZVb7fiGC0SHzBFYBkDOLTw/MRta8p81o8WzLe0uxGVP4RlIj6fZxv3Vvb1NZI4HHrgt/jASaj4A==", "dev": true, "requires": { - "@angular-devkit/architect": "0.901.5", - "@angular-devkit/build-optimizer": "0.901.5", - "@angular-devkit/build-webpack": "0.901.5", - "@angular-devkit/core": "9.1.5", + "@angular-devkit/architect": "0.901.6", + "@angular-devkit/build-optimizer": "0.901.6", + "@angular-devkit/build-webpack": "0.901.6", + "@angular-devkit/core": "9.1.6", "@babel/core": "7.9.0", "@babel/generator": "7.9.3", "@babel/preset-env": "7.9.0", "@babel/template": "7.8.6", "@jsdevtools/coverage-istanbul-loader": "3.0.3", - "@ngtools/webpack": "9.1.5", + "@ngtools/webpack": "9.1.6", "ajv": "6.12.0", "autoprefixer": "9.7.4", "babel-loader": "8.0.6", @@ -106,9 +106,9 @@ } }, "@angular-devkit/build-optimizer": { - "version": "0.901.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.901.5.tgz", - "integrity": "sha512-xmAMvLMSa8BvqlZ0wsC37Qop/7/pEaQRKLeowC3CCI3jiYDF10Tihar+Hjc04NVSal8ZBP9/+Gp3Yr0x61HcFA==", + "version": "0.901.6", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.901.6.tgz", + "integrity": "sha512-M0H9SrOq4QOYqGCIguGQDWizf+XL7whJjBtYHxI7jEjtzar3zkTFgzZ/znv49R56Zch1niH0mBgtDxCFFWqarQ==", "dev": true, "requires": { "loader-utils": "2.0.0", @@ -133,13 +133,13 @@ } }, "@angular-devkit/build-webpack": { - "version": "0.901.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.901.5.tgz", - "integrity": "sha512-4HHOFFRu3yUBe0otaDHh4PID99XvnBJj7hYzvbB5BvP0ULif4/W0aoU2STnern4lH4pJmrtqYawBZ84ETXN/Ag==", + "version": "0.901.6", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.901.6.tgz", + "integrity": "sha512-jEk850AtIFK+xbXXiloVvueXTbJOL1mANR2UBrmWk7V4Bct+gHVerdXjn9vo1Tsd8BgemUYAcqvLldCx9MSDTg==", "dev": true, "requires": { - "@angular-devkit/architect": "0.901.5", - "@angular-devkit/core": "9.1.5", + "@angular-devkit/architect": "0.901.6", + "@angular-devkit/core": "9.1.6", "rxjs": "6.5.4" }, "dependencies": { @@ -155,9 +155,9 @@ } }, "@angular-devkit/core": { - "version": "9.1.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-9.1.5.tgz", - "integrity": "sha512-i0BJ6Ad3bcDE6e4Ev9Flbw7P0bz9p94FDVfEOPGBTrbJQZSqOm3CqaH2y5LGfl7acSPUi54hK481h1QRUFBkTQ==", + "version": "9.1.6", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-9.1.6.tgz", + "integrity": "sha512-lYXoRtsMsfyIrNAa49Hcx79FPRW6ZrWjK2yJ3avON1Q3WEHYb/DIUP+ItyOQAkNUsCVMyK4wkddsu8PsqEW6tg==", "dev": true, "requires": { "ajv": "6.12.0", @@ -179,12 +179,12 @@ } }, "@angular-devkit/schematics": { - "version": "9.1.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-9.1.5.tgz", - "integrity": "sha512-nkNiGrVl7xLaYYj/oT1wOBowa4Driv2f4abn78AJI/pd/EXA45G/rI9gO/kEG8lHn+FAMQedaywX9N4JDOxCGg==", + "version": "9.1.6", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-9.1.6.tgz", + "integrity": "sha512-twS8Sxc6NG4A0n7yITugP0snIMJ2Rm6aOGkckomWjZAP1fPo8pup8EFGc5wUBAtAOM3DJBphEnskpwEWCkBaLg==", "dev": true, "requires": { - "@angular-devkit/core": "9.1.5", + "@angular-devkit/core": "9.1.6", "ora": "4.0.3", "rxjs": "6.5.4" }, @@ -201,9 +201,9 @@ } }, "@angular/animations": { - "version": "9.1.6", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-9.1.6.tgz", - "integrity": "sha512-7Pp7aqNNcH4fu1BnOVpvqJJHjE7RZ5K1oD396OWCh35pgpLowLSpFjhbVhzGrcAuxHyKnnHSX3etLn2hDaHxmQ==" + "version": "9.1.7", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-9.1.7.tgz", + "integrity": "sha512-1wW8ndGMLDuE2LpTN2RNRz1Dt7JgVBeVmOPMgzoA7g1uuvm+jESTrGG7W3BzLzG0BE2TeXt0fY90o4iU+S2Rmg==" }, "@angular/cdk": { "version": "9.2.3", @@ -222,16 +222,16 @@ } }, "@angular/cli": { - "version": "9.1.5", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-9.1.5.tgz", - "integrity": "sha512-Decn0p+s0SLc5p2GN7k8dUrOY43hBuCz8PxueW0gEln7NjlpdmHk+6JQn0ZRl2/2Dbk+eTGzPXyCxGwqsW3jjw==", + "version": "9.1.6", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-9.1.6.tgz", + "integrity": "sha512-hQnad0LQx0n+FiMRUV2RX9+L0dLsISu7uzimGLjgJVtW6Bc1cVnaTkKhOqHRQG2Q4Iv8adKWf5UL5tMZz/roDA==", "dev": true, "requires": { - "@angular-devkit/architect": "0.901.5", - "@angular-devkit/core": "9.1.5", - "@angular-devkit/schematics": "9.1.5", - "@schematics/angular": "9.1.5", - "@schematics/update": "0.901.5", + "@angular-devkit/architect": "0.901.6", + "@angular-devkit/core": "9.1.6", + "@angular-devkit/schematics": "9.1.6", + "@schematics/angular": "9.1.6", + "@schematics/update": "0.901.6", "@yarnpkg/lockfile": "1.1.0", "ansi-colors": "4.1.1", "debug": "4.1.1", @@ -264,19 +264,19 @@ } }, "@angular/common": { - "version": "9.1.6", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-9.1.6.tgz", - "integrity": "sha512-L9vw//wE+8QcSArOA411uJ68znnszCiPrbzSBV0BRZeadc7X68MwANA9qjtiTWZx5Xh9pNfHHwsCUyv2lUeinQ==" + "version": "9.1.7", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-9.1.7.tgz", + "integrity": "sha512-04ef+J8bnOnjYbdRsm82IdIaaLFZ6QWh4SLtjnYhgCjEe4Stf59g+zRNPMauMFDQYDCp3foPo0djk1CPfEd8AQ==" }, "@angular/compiler": { - "version": "9.1.6", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-9.1.6.tgz", - "integrity": "sha512-tHOQEjWuWqSkrk6/vI6BK7uJnpAyFajCXPW37rH5xspF/aMbetrpoOiGBNUQg/HLaFh04nOAnnFntjLkW0ooaA==" + "version": "9.1.7", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-9.1.7.tgz", + "integrity": "sha512-BiHJ3rAd00aJkur7ohnXjqBmz2QkSTAAFWLuBTYuHysxP4zJD54y4uUtsrCUReKL+8dkUv8AcfXBAkCBLvBUYg==" }, "@angular/compiler-cli": { - "version": "9.1.6", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-9.1.6.tgz", - "integrity": "sha512-1b7m9tvSQJE4y95wNCdi34MORcsmXPC1vaylYlzChVM2et9Y2eKHYcRs+4g329j66irLBGpS/7cgTT2pgJ+IbA==", + "version": "9.1.7", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-9.1.7.tgz", + "integrity": "sha512-8HT8+UuSohrXlF90eewG2XuhtOEIfJ2UlijnSB10/+ZyroSdTKckoiFSps86nTd/EfrBblqNUMbwjOxIkzac3w==", "dev": true, "requires": { "canonical-path": "1.0.0", @@ -477,19 +477,19 @@ } }, "@angular/core": { - "version": "9.1.6", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-9.1.6.tgz", - "integrity": "sha512-iXgPh5DebLwkMzLtQ6WKiv/mo4hpwMOwYex3O4F2CKToR2tKPnXbV5WC/ADGm0XYXiocSKQPiyL4ZrUjVeKEqA==" + "version": "9.1.7", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-9.1.7.tgz", + "integrity": "sha512-uJSZ+rdGL47gc3A+Fal1XwJYB4WWpYJrNifvoQ2nOs+X5Qu+j0HN6GXPJb4kixoNzjYCGxmLoirdT3xhNZFcfQ==" }, "@angular/flex-layout": { - "version": "9.0.0-beta.29", - "resolved": "https://registry.npmjs.org/@angular/flex-layout/-/flex-layout-9.0.0-beta.29.tgz", - "integrity": "sha512-93sxR+kYfYMOdnlWL0Q77FZ428gg8XnBu0YZm6GsCdkw/vLggIT/G1ZAqHlCPIODt6pxmCJ5KXh4ShvniIYDsA==" + "version": "9.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@angular/flex-layout/-/flex-layout-9.0.0-beta.30.tgz", + "integrity": "sha512-aPiw9sfuXpV99oFtbIbTJYC+GtubdggP66qO0JH5MCX+J8btCGAOJMf9RPJWx2yyh/VoSBOt2nWSYqcY5OEv+g==" }, "@angular/forms": { - "version": "9.1.6", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-9.1.6.tgz", - "integrity": "sha512-3KiFjLDipZVgS5rfnZ8EoKlkUokOR8dmuw2xdjKHgzflWFFeuaY9ZtQgjZGw9/jkwWlc9P38BOSEHbK8NakdDw==" + "version": "9.1.7", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-9.1.7.tgz", + "integrity": "sha512-/bRs5hSFDUjOrq2vw11HoS25oEu7KYVxPbQiEjeBHJo82yDmSO+1cVukh6ulDi7iv1sJwSzikDtE9+xDx1ocfQ==" }, "@angular/material": { "version": "9.2.3", @@ -497,24 +497,24 @@ "integrity": "sha512-QJltLNp8a/eoozPgkFLISEWgdlX9q9+fZaLJ8c9tHEp2IT5sFYBFHf8dPl0pUyxgOXkS/0HD43I1qki71/T7Kw==" }, "@angular/platform-browser": { - "version": "9.1.6", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-9.1.6.tgz", - "integrity": "sha512-ebQhbT0Z55vwlQwAY4+s3Bcf1Q4wEN5Yk43iCuVt4g2kFkg09UP0z8aYtbuh7VQDyv/W4TTIGX8smGBWstoedQ==" + "version": "9.1.7", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-9.1.7.tgz", + "integrity": "sha512-zwNCnn4Ozax80YrkFcLoQ/7bVR7jPk7+QT++Nf9MmQwsaqa0Ve1IYa6Hg9Y1Kf4wquI9TdxMN17TPKmX8iNIaA==" }, "@angular/platform-browser-dynamic": { - "version": "9.1.6", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-9.1.6.tgz", - "integrity": "sha512-7AL3hWu4oY0LRiMS9ZEFXPW2uqybWcVNFDHjPp3UwsDIT4+sW3DIm8P+UvAOFkkRwaHpPDqm4chTTiAHygC/1Q==" + "version": "9.1.7", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-9.1.7.tgz", + "integrity": "sha512-DyUDGxp4kF4majcm9COVzu/9wzmgnfj+d6GUEjYkbqSH9QP05LonJ6wHMNxNMN6qMfawdCxDe0TnNDRPmHUj9w==" }, "@angular/router": { - "version": "9.1.6", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-9.1.6.tgz", - "integrity": "sha512-Oz4nVQUR6t68DSzZuSrVaqrzmA7/0PIEi0sc85CE+UuOEoAqGMwN0NdQYizFT62WZ16DRI/1tZ+TTWvdmpEv8w==" + "version": "9.1.7", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-9.1.7.tgz", + "integrity": "sha512-ycrkhkCbfOMCe9PngFjnyk8nH5jt0Kyb2NPtjmaGOtSCuZBZ0kOU0rQGmQnj3d2PiT0Yir59S8eEAf3Fh0iDuw==" }, "@angular/service-worker": { - "version": "9.1.6", - "resolved": "https://registry.npmjs.org/@angular/service-worker/-/service-worker-9.1.6.tgz", - "integrity": "sha512-mQhVZjw4aEH7f0j07TuoBSrW02KTbySYimivfq9Cb33a2ihI7fb3MAR6YmoM+0ax8Ohl88aOsUOU7xFeHbaMJQ==" + "version": "9.1.7", + "resolved": "https://registry.npmjs.org/@angular/service-worker/-/service-worker-9.1.7.tgz", + "integrity": "sha512-YPN6gk9+r3UDZHJqhi6psfq30g79/YN/7taPXF+29epSAu+oUo/0KYNeurwSOkWxL+lpplGP7p8Co1Zk1Q3zRQ==" }, "@babel/code-frame": { "version": "7.8.3", @@ -1528,12 +1528,12 @@ } }, "@ngtools/webpack": { - "version": "9.1.5", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-9.1.5.tgz", - "integrity": "sha512-6VzmlXRnf7phwLOiy0WrxHFHD5TuNQgVVpD/VFkZjtCTOsZyGQYGVPfaqxvn13M4Mm8bjrN4mk06VowCFm2oHw==", + "version": "9.1.6", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-9.1.6.tgz", + "integrity": "sha512-W/9kENoiYARDGXqXSmOekQddUlQUVxfYP7JgQwqdg7JYktIpThicbV/iLBChZwWnmn9mb7MDw1IPeUTkZzrO2Q==", "dev": true, "requires": { - "@angular-devkit/core": "9.1.5", + "@angular-devkit/core": "9.1.6", "enhanced-resolve": "4.1.1", "rxjs": "6.5.4", "webpack-sources": "1.4.3" @@ -1551,23 +1551,23 @@ } }, "@schematics/angular": { - "version": "9.1.5", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-9.1.5.tgz", - "integrity": "sha512-kMscfnwd9TGLo8V+dE/Pzu4wNxZej/6F6z5XzMOQVFTbL+RqMDvtkHf9CarhiKBd5ogm4npfKV8ToNTUecFJkA==", + "version": "9.1.6", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-9.1.6.tgz", + "integrity": "sha512-Q9lPTf1/pXBWuFOLzwtrU88Gwkfn9JLiSb45xSQZ771cCD68tZyL4V9fH+u7139y3H3ID2xebMs7WiddAERLyw==", "dev": true, "requires": { - "@angular-devkit/core": "9.1.5", - "@angular-devkit/schematics": "9.1.5" + "@angular-devkit/core": "9.1.6", + "@angular-devkit/schematics": "9.1.6" } }, "@schematics/update": { - "version": "0.901.5", - "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.901.5.tgz", - "integrity": "sha512-JmB+AuU6C9eM8x/CxeBEDigRuypzuWx7gnloK9D5i2gP9r39clFNtWT7eM3YW3kl4uyEMzrQHx6esMWNUScVBw==", + "version": "0.901.6", + "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.901.6.tgz", + "integrity": "sha512-fKDjD/nGOsrPglOeMVNW+/wa8t73XBrsVneaLg3qmWp6c80JQAxwryE+3MTnBP7apZCLR2YZlKySbY54gLRs6w==", "dev": true, "requires": { - "@angular-devkit/core": "9.1.5", - "@angular-devkit/schematics": "9.1.5", + "@angular-devkit/core": "9.1.6", + "@angular-devkit/schematics": "9.1.6", "@yarnpkg/lockfile": "1.1.0", "ini": "1.3.5", "npm-package-arg": "^8.0.0", @@ -1633,15 +1633,21 @@ "dev": true }, "@types/node": { - "version": "12.12.38", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.38.tgz", - "integrity": "sha512-75eLjX0pFuTcUXnnWmALMzzkYorjND0ezNEycaKesbUBg9eGZp4GHPuDmkRc4mQQvIpe29zrzATNRA6hkYqwmA==", + "version": "12.12.39", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.39.tgz", + "integrity": "sha512-pADGfwnDkr6zagDwEiCVE4yQrv7XDkoeVa4OfA9Ju/zRTk6YNDLGtQbkdL4/56mCQQCs4AhNrBIag6jrp7ZuOg==", "dev": true }, "@types/q": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.2.tgz", - "integrity": "sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.3.tgz", + "integrity": "sha512-I3wR8FNrk9ny4zJzSB1FBpPHw8kv+eVapS3Hkw+QAF7WCIF7foiEj0GcWFR5mwzw/HUMrLBD+rO/OKJcLf/v+w==", + "dev": true + }, + "@types/selenium-webdriver": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-3.0.17.tgz", + "integrity": "sha512-tGomyEuzSC1H28y2zlW6XPCaDaXFaD6soTdb4GNdmte2qfHtrKqhy0ZFs4r/1hpazCfEZqeTSRLvSasmEx89uw==", "dev": true }, "@types/source-list-map": { @@ -2102,6 +2108,12 @@ "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==", "dev": true }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, "asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", @@ -2829,9 +2841,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001054", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001054.tgz", - "integrity": "sha512-jiKlTI6Ur8Kjfj8z0muGrV6FscpRvefcQVPSuMuXnvRCfExU7zlVLNjmOz1TnurWgUrAY7MMmjyy+uTgIl1XHw==", + "version": "1.0.30001059", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001059.tgz", + "integrity": "sha512-oOrc+jPJWooKIA0IrNZ5sYlsXc7NP7KLhNWrSGEJhnfSzDvDJ0zd3i6HXsslExY9bbu+x0FQ5C61LcqmPt7bOQ==", "dev": true }, "canonical-path": { @@ -4270,9 +4282,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.3.432", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.432.tgz", - "integrity": "sha512-/GdNhXyLP5Yl2322CUX/+Xi8NhdHBqL6lD9VJVKjH6CjoPGakvwZ5CpKgj/oOlbzuWWjOvMjDw1bBuAIRCNTlw==", + "version": "1.3.438", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.438.tgz", + "integrity": "sha512-QKMcpfA/fCOnqFHsZvKr2haQQb3eXkDI17zT+4hHxJJThyN5nShcG6q1VR8vRiE/2GCJM+0p3PzinYknkdsBYg==", "dev": true }, "elliptic": { @@ -4641,6 +4653,12 @@ "strip-eof": "^1.0.0" } }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true + }, "expand-brackets": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", @@ -5474,9 +5492,9 @@ } }, "safe-buffer": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", - "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true } } @@ -6454,13 +6472,22 @@ } }, "jasmine": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-3.5.0.tgz", - "integrity": "sha512-DYypSryORqzsGoMazemIHUfMkXM7I7easFaxAvNM3Mr6Xz3Fy36TupTrAOxZWN8MVKEU5xECv22J4tUQf3uBzQ==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-2.8.0.tgz", + "integrity": "sha1-awicChFXax8W3xG4AUbZHU6Lij4=", "dev": true, "requires": { - "glob": "^7.1.4", - "jasmine-core": "~3.5.0" + "exit": "^0.1.2", + "glob": "^7.0.6", + "jasmine-core": "~2.8.0" + }, + "dependencies": { + "jasmine-core": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.8.0.tgz", + "integrity": "sha1-vMl5rh+f0FcB5F5S5l06XWPxok4=", + "dev": true + } } }, "jasmine-core": { @@ -6478,6 +6505,12 @@ "colors": "1.1.2" } }, + "jasminewd2": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/jasminewd2/-/jasminewd2-2.2.0.tgz", + "integrity": "sha1-43zwsX8ZnM4jvqcbIDk5Uka07E4=", + "dev": true + }, "jest-worker": { "version": "25.1.0", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.1.0.tgz", @@ -6864,9 +6897,9 @@ } }, "karma-jasmine-html-reporter": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-1.5.3.tgz", - "integrity": "sha512-ci0VrjuCaFj+9d1tYlTE3KIPUCp0rz874zWWU3JgCMqGIyw5ke+BXWFPOAGAqUdCJcrMwneyvp1zFXA74MiPUA==", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-1.5.4.tgz", + "integrity": "sha512-PtilRLno5O6wH3lDihRnz0Ba8oSn0YUJqKjjux1peoYGwo0AQqrWRbdWk/RLzcGlb+onTyXAnHl6M+Hu3UxG/Q==", "dev": true }, "karma-source-map-support": { @@ -7537,9 +7570,9 @@ "dev": true }, "minipass": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.1.tgz", - "integrity": "sha512-UFqVihv6PQgwj8/yTGvl9kPz7xIAY+R5z6XYjRInD3Gk3qx6QGSD6zEcpeG4Dy/lQnv1J6zv8ejV90hyYIKf3w==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", "dev": true, "requires": { "yallist": "^4.0.0" @@ -7564,9 +7597,9 @@ } }, "minipass-pipeline": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.2.tgz", - "integrity": "sha512-3JS5A2DKhD2g0Gg8x3yamO0pj7YeKGwVlDS90pF++kxptwx/F+B//roxf9SqYil5tQo65bijy+dAuAFZmYOouA==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.3.tgz", + "integrity": "sha512-cFOknTvng5vqnwOpDsZTWhNll6Jf8o2x+/diplafmxpuIymAjzoOolZG0VvQf3V2HgqzJNhnuKHYp2BqDgz8IQ==", "dev": true, "requires": { "minipass": "^3.0.0" @@ -7721,6 +7754,11 @@ "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", "dev": true }, + "ngx-mask": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/ngx-mask/-/ngx-mask-9.0.2.tgz", + "integrity": "sha512-HG8G1ea9vWF1enqx2bW5m4Ry5VMLOiqL+zH+KHEnjwCzfHNa9SjnDXp+D0AfAyMPvOUEl1rCcff9YxQzv9nOFQ==" + }, "nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", @@ -7924,9 +7962,9 @@ } }, "safe-buffer": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", - "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true }, "semver": { @@ -8156,24 +8194,6 @@ } } }, - "optimist": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", - "dev": true, - "requires": { - "minimist": "~0.0.1", - "wordwrap": "~0.0.2" - }, - "dependencies": { - "minimist": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", - "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", - "dev": true - } - } - }, "ora": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/ora/-/ora-4.0.3.tgz", @@ -9501,23 +9521,40 @@ } }, "protractor": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/protractor/-/protractor-6.0.0.tgz", - "integrity": "sha512-kCV1hK9gAh+N9to04oXLXtqnnG/UX/aDL2YvLS0SYqzzpeLt8Are3y3JPjWC/OSsYBkOW8T1cXmcMn0QaGUudw==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/protractor/-/protractor-7.0.0.tgz", + "integrity": "sha512-UqkFjivi4GcvUQYzqGYNe0mLzfn5jiLmO8w9nMhQoJRLhy2grJonpga2IWhI6yJO30LibWXJJtA4MOIZD2GgZw==", "dev": true, "requires": { + "@types/q": "^0.0.32", + "@types/selenium-webdriver": "^3.0.0", "blocking-proxy": "^1.0.0", "browserstack": "^1.5.1", "chalk": "^1.1.3", "glob": "^7.0.3", - "jasmine": "^3.3.1", - "optimist": "~0.6.0", + "jasmine": "2.8.0", + "jasminewd2": "^2.1.0", + "q": "1.4.1", "saucelabs": "^1.5.0", - "selenium-webdriver": "^4.0.0-alpha.1", + "selenium-webdriver": "3.6.0", "source-map-support": "~0.4.0", - "webdriver-manager": "13.0.0" + "webdriver-js-extender": "2.1.0", + "webdriver-manager": "^12.1.7", + "yargs": "^15.3.1" }, "dependencies": { + "@types/q": { + "version": "0.0.32", + "resolved": "https://registry.npmjs.org/@types/q/-/q-0.0.32.tgz", + "integrity": "sha1-vShOV8hPEyXacCur/IKlMoGQwMU=", + "dev": true + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, "ansi-styles": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", @@ -9537,32 +9574,182 @@ "supports-color": "^2.0.0" } }, - "fs-minipass": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", - "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", "dev": true, "requires": { - "minipass": "^2.6.0" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + }, + "dependencies": { + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + } } }, - "minipass": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" + "color-name": "~1.1.4" } }, - "minizlib": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", - "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "del": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", "dev": true, "requires": { - "minipass": "^2.9.0" + "globby": "^5.0.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "rimraf": "^2.2.8" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "globby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "dev": true + }, + "is-path-in-cwd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", + "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", + "dev": true, + "requires": { + "is-path-inside": "^1.0.0" + } + }, + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "dev": true, + "requires": { + "path-is-inside": "^1.0.1" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "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 + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "q": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", + "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=", + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" } }, "semver": { @@ -9586,47 +9773,113 @@ "source-map": "^0.5.6" } }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, "supports-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", "dev": true }, - "tar": { - "version": "4.4.13", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", - "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", + "webdriver-manager": { + "version": "12.1.7", + "resolved": "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-12.1.7.tgz", + "integrity": "sha512-XINj6b8CYuUYC93SG3xPkxlyUc3IJbD6Vvo75CVGuG9uzsefDzWQrhz0Lq8vbPxtb4d63CZdYophF8k8Or/YiA==", "dev": true, "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.8.6", - "minizlib": "^1.2.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.3" + "adm-zip": "^0.4.9", + "chalk": "^1.1.1", + "del": "^2.2.0", + "glob": "^7.0.3", + "ini": "^1.3.4", + "minimist": "^1.2.0", + "q": "^1.4.1", + "request": "^2.87.0", + "rimraf": "^2.5.2", + "semver": "^5.3.0", + "xml2js": "^0.4.17" } }, - "webdriver-manager": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-13.0.0.tgz", - "integrity": "sha512-nwcbUWZwwqw4Nn+Xs8rgyX5JWDJ3oOAEc+OMI9sp8QlM7yg1CDaqqk/2DRZI/ig3DxQwZ1Xna3Eq0unNUaSQvA==", + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dev": true, "requires": { - "adm-zip": "^0.4.13", - "loglevel": "^1.6.1", - "request": "^2.88.0", - "semver": "^5.6.0", - "tar": "^4.4.8", - "xml2js": "^0.4.19", - "yargs": "^12.0.5" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "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==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + } } }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true + "yargs": { + "version": "15.3.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz", + "integrity": "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==", + "dev": true, + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.1" + } + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } } } }, @@ -10295,14 +10548,15 @@ "dev": true }, "selenium-webdriver": { - "version": "4.0.0-alpha.7", - "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.0.0-alpha.7.tgz", - "integrity": "sha512-D4qnTsyTr91jT8f7MfN+OwY0IlU5+5FmlO5xlgRUV6hDEV8JyYx2NerdTEqDDkNq7RZDYc4VoPALk8l578RBHw==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-3.6.0.tgz", + "integrity": "sha512-WH7Aldse+2P5bbFBO4Gle/nuQOdVwpHMTL6raL3uuBj/vPG07k6uzt3aiahu352ONBr5xXh0hDlM3LhtXPOC4Q==", "dev": true, "requires": { - "jszip": "^3.2.2", - "rimraf": "^2.7.1", - "tmp": "0.0.30" + "jszip": "^3.1.3", + "rimraf": "^2.5.4", + "tmp": "0.0.30", + "xml2js": "^0.4.17" }, "dependencies": { "rimraf": { @@ -11048,9 +11302,9 @@ "dev": true }, "spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "dev": true, "requires": { "spdx-exceptions": "^2.1.0", @@ -11808,9 +12062,9 @@ } }, "tslib": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.2.tgz", - "integrity": "sha512-tTSkux6IGPnUGUd1XAZHcpu85MOkIl5zX49pO+jfsie3eP0B6pyhOlLXm3cAC6T7s+euSDDUUV+Acop5WmtkVg==" + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" }, "tslint": { "version": "6.1.2", @@ -12402,6 +12656,16 @@ "defaults": "^1.0.3" } }, + "webdriver-js-extender": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/webdriver-js-extender/-/webdriver-js-extender-2.1.0.tgz", + "integrity": "sha512-lcUKrjbBfCK6MNsh7xaY2UAUmZwe+/ib03AjVOpFobX4O7+83BUveSrLfU0Qsyb1DaKJdQRbuU+kM9aZ6QUhiQ==", + "dev": true, + "requires": { + "@types/selenium-webdriver": "^3.0.0", + "selenium-webdriver": "^3.0.1" + } + }, "webpack": { "version": "4.42.0", "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.42.0.tgz", @@ -12892,12 +13156,6 @@ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, - "wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", - "dev": true - }, "worker-farm": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", diff --git a/package.json b/package.json index 60dcaa9..b19f101 100644 --- a/package.json +++ b/package.json @@ -11,29 +11,30 @@ }, "private": true, "dependencies": { - "@angular/animations": "~9.1.6", + "@angular/animations": "^9.1.7", "@angular/cdk": "^9.2.3", - "@angular/common": "~9.1.6", - "@angular/compiler": "~9.1.6", - "@angular/core": "~9.1.6", - "@angular/flex-layout": "^9.0.0-beta.29", - "@angular/forms": "~9.1.6", + "@angular/common": "^9.1.7", + "@angular/compiler": "^9.1.7", + "@angular/core": "^9.1.7", + "@angular/flex-layout": "^9.0.0-beta.30", + "@angular/forms": "^9.1.7", "@angular/material": "^9.2.3", - "@angular/platform-browser": "~9.1.6", - "@angular/platform-browser-dynamic": "~9.1.6", - "@angular/router": "~9.1.6", - "@angular/service-worker": "~9.1.6", + "@angular/platform-browser": "^9.1.7", + "@angular/platform-browser-dynamic": "^9.1.7", + "@angular/router": "^9.1.7", + "@angular/service-worker": "^9.1.7", + "ngx-mask": "^9.0.2", "rxjs": "~6.5.4", - "tslib": "^1.10.0", + "tslib": "^1.13.0", "zone.js": "~0.10.2" }, "devDependencies": { - "@angular-devkit/build-angular": "~0.901.5", - "@angular/cli": "~9.1.5", - "@angular/compiler-cli": "~9.1.6", + "@angular-devkit/build-angular": "^0.901.6", + "@angular/cli": "^9.1.6", + "@angular/compiler-cli": "^9.1.7", "@types/jasmine": "~3.5.0", "@types/jasminewd2": "~2.0.3", - "@types/node": "^12.11.1", + "@types/node": "^12.12.39", "codelyzer": "^5.1.2", "jasmine-core": "~3.5.0", "jasmine-spec-reporter": "~4.2.1", @@ -41,8 +42,8 @@ "karma-chrome-launcher": "~3.1.0", "karma-coverage-istanbul-reporter": "~2.1.0", "karma-jasmine": "~3.0.1", - "karma-jasmine-html-reporter": "^1.4.2", - "protractor": "^6.0.0", + "karma-jasmine-html-reporter": "^1.5.4", + "protractor": "^7.0.0", "ts-node": "~8.3.0", "tslint": "~6.1.0", "typescript": "~3.8.3" diff --git a/src/app/app.component.html b/src/app/app.component.html index bb43c5c..3455f7b 100644 --- a/src/app/app.component.html +++ b/src/app/app.component.html @@ -1,9 +1,12 @@ -
- + [ngStyle]="{'overflow': 'hidden', 'height': '100%'}"> + -
+
diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 472294e..0ac0317 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -6,6 +6,8 @@ import { NgModule } from '@angular/core'; import { environment } from '../environments/environment'; +import { NgxMaskModule } from 'ngx-mask'; + import { CoreModule } from './core/core.module'; import { CalculateComponent } from './components/calculate/calculate.component'; import { AppComponent } from './app.component'; @@ -22,7 +24,8 @@ import { ResultsComponent } from './components/calculate/results/results.compone BrowserAnimationsModule, CoreModule, ServiceWorkerModule.register('ngsw-worker.js', { enabled: environment.production }), - HttpClientModule + HttpClientModule, + NgxMaskModule.forRoot(), ], providers: [], bootstrap: [ AppComponent ] diff --git a/src/app/components/calculate/calculate.component.html b/src/app/components/calculate/calculate.component.html index 8131d14..d958965 100644 --- a/src/app/components/calculate/calculate.component.html +++ b/src/app/components/calculate/calculate.component.html @@ -1,57 +1,82 @@
-

Mortgage Expense Calculator

+

Mortgage Expense Calculator

-

- Buying a property is a big investment in our lives. Most people don't know what amount of money they need for the - expenses of a mortgage. +

+ Buying a property is a big investment in our lives.
- 'Mortgage Expense Calculator' is an application to use of calculating estimated mortgage expenses when you buy a + Most people are not sure what amount of money they need to have upfront for buying a property with a mortgage. +
+ 'Mortgage Expense Calculator' is a web application to use of calculating estimated mortgage expenses when you buy a property.
- Simply enter the mortgage amount that you are going to get below and click the calculate button to see the - estimated expenses that you need for buying your property of dreams. + Simply enter the mortgage amount that you are going to get below and click the calculate button to see the estimated + expense amount that you need to have for buying your property of dreams.

- + Mortgage Amount - + €   + + -
-
- +
+
- + +
diff --git a/src/app/components/calculate/calculate.component.ts b/src/app/components/calculate/calculate.component.ts index bbe8321..6b46f0e 100644 --- a/src/app/components/calculate/calculate.component.ts +++ b/src/app/components/calculate/calculate.component.ts @@ -1,4 +1,5 @@ -import { Component, OnInit } from '@angular/core'; +import { Component, Inject, OnInit } from '@angular/core'; +import { DOCUMENT } from '@angular/common'; @Component({ selector: 'app-calculate', @@ -7,11 +8,27 @@ import { Component, OnInit } from '@angular/core'; }) export class CalculateComponent implements OnInit { value = null; + isCalculate = false; - constructor() { + constructor(@Inject(DOCUMENT) private doc: Document) { } ngOnInit(): void { } + setCalculationState() { + const showCalculation = !this.isCalculate + && this.value !== null + && this.value !== undefined + && this.value !== ''; + + if (showCalculation) { + this.isCalculate = true; + } + } + + refreshPage() { + this.doc.defaultView.location.reload(); + } + } diff --git a/src/app/components/calculate/results/results.component.html b/src/app/components/calculate/results/results.component.html index 7e0d899..18bea11 100644 --- a/src/app/components/calculate/results/results.component.html +++ b/src/app/components/calculate/results/results.component.html @@ -1,11 +1,14 @@ + fxLayoutAlign="center center" + class="margin-top-md margin-bottom-md"> @@ -15,7 +18,10 @@ fxLayoutAlign="space-between center">
+ [disabled]="expenseItem.exceededAmount" + (change)="updateExpenseItemCheckedState()" + [(ngModel)]="expenseItem.checked" + color="primary">

@@ -33,6 +39,11 @@ class="margin-bottom-zero">(This cost is tax deductible, which means it can be lowered with effectively 38% or 49% depending on the amount of your gross income.)

+

(This expense has an average amount.)

+

{{ expenseItem.info }}

@@ -42,7 +53,7 @@

{{ expenseItem.name }} (Not compulsory) + [ngStyle.lt-md]="{'font-size': '12px'}">(Not compulsory.)

(This cost is tax deductible, which means it can be lowered with effectively 38% or 49% depending on the amount of your gross income.)

+

(This expense has an average amount.)

+

{{ expenseItem.info }}

+ [ngStyle.lt-md]="{'font-size': '12px'}" + [ngClass.lt-md]="'margin-top-sm'"> {{ expenseItem.info }}

@@ -61,17 +78,30 @@ euro + [ngStyle.gt-xs]="{'cursor': 'help'}">euro_symbol info + approximately + + - ??? + {{ calculateExpense(expenseItem.amount.bothApplicable, expenseItem.amount.costRange, expenseItem.amount.percentage, + expenseItem.checked).average | currency: 'EUR' : 'symbol' : '1.0-0' }}
-

+

TOTAL + (Average) +

+ + help + + + +

TOTAL

+ class="margin-bottom-zero" + [ngStyle]="{'font-size': '24px'}"> {{ totalExpenseAmounts.average | currency: 'EUR' : 'symbol' : '1.0-0' }}

+
+ + +
+

TOTAL + (Minimum) +

+ + help + +
+ +

{{ totalExpenseAmounts.min | currency: 'EUR' : 'symbol' : '1.0-0' }}

+
+ + +
+

TOTAL + (Maximum) +

+ + help + +
+

???

+ class="margin-bottom-zero" + [ngStyle]="{'font-size': '16px'}"> {{ totalExpenseAmounts.max | currency: 'EUR' : 'symbol' : '1.0-0' }}

diff --git a/src/app/components/calculate/results/results.component.scss b/src/app/components/calculate/results/results.component.scss index 24ad306..33dda24 100644 --- a/src/app/components/calculate/results/results.component.scss +++ b/src/app/components/calculate/results/results.component.scss @@ -1,7 +1,11 @@ -@import 'src/assets/scss/mixins'; +@import '../../../../assets/scss/mixins'; :host { mat-icon { @include md-icon-size(16px); + + &[svgicon=approximately] { + @include md-icon-size(14px); + } } } diff --git a/src/app/components/calculate/results/results.component.ts b/src/app/components/calculate/results/results.component.ts index e499ed1..e9c3d11 100644 --- a/src/app/components/calculate/results/results.component.ts +++ b/src/app/components/calculate/results/results.component.ts @@ -1,28 +1,235 @@ -import { Component, OnInit } from '@angular/core'; +import { Component, Input, OnChanges, OnInit, SimpleChanges } from '@angular/core'; -import { ExpenseItems } from '../../../shared/expense-data.model'; +import { ExpenseItem, ExpenseVariations, MinMaxModel } from '../../../shared/expense-data.model'; +import { CustomIconService } from '../../../shared/custom-icon.service'; @Component({ selector: 'app-results', templateUrl: './results.component.html', styleUrls: [ './results.component.scss' ] }) -export class ResultsComponent implements OnInit { - public expenseItems: ExpenseItems[]; +export class ResultsComponent implements OnInit, OnChanges { + @Input() mortgageValue; + @Input() calculateState; - constructor() { + public expenseItems: ExpenseItem[]; + public calculatedMortgageExpenses: ExpenseItem[]; + public totalExpenseAmounts: ExpenseVariations; + + private readonly FIRST_ELEMENT = 0; + private readonly SECOND_ELEMENT = 1; + private readonly MAX_NATIONAL_MORTGAGE_GUARANTEE_AMOUNT = 31e4; + private readonly TOTAL_NUMBER_OF_REAL_ESTATE_EXPENSE_SCENARIOS = 12; + + constructor(private customIconService: CustomIconService) { + this.customIconService.addIcon('approximately', 'approximately.svg'); } ngOnInit(): void { - this.expenseItems = this.createExpenseItemsList(); } - createExpenseItemsList(): ExpenseItems[] { - const expenseItems: ExpenseItems[] = [ + ngOnChanges(changes: SimpleChanges): void { + for (const propName in changes) { + if (changes.hasOwnProperty(propName)) { + switch (propName) { + case 'mortgageValue': { + this.setCalculatedExpenses(Number(changes[ propName ].currentValue)); + + this.expenseItems = this.calculatedMortgageExpenses; + + this.setExceededAmountFlag(this.mortgageValue); + + this.totalExpenseAmounts = this.calculateTotal(this.expenseItems); + break; + } + } + } + } + } + + setExceededAmountFlag(mortgageValue) { + if (mortgageValue > this.MAX_NATIONAL_MORTGAGE_GUARANTEE_AMOUNT) { + const exceededAmountItem = this.expenseItems.find(expenseElement => expenseElement.exceededAmount === false); + + exceededAmountItem.exceededAmount = true; + exceededAmountItem.amount.percentage[this.FIRST_ELEMENT] = 0; + exceededAmountItem.checked = false; + } + } + + updateExpenseItemCheckedState() { + this.totalExpenseAmounts = this.calculateTotal(this.expenseItems); + } + + calculateTotal(expenseItems: ExpenseItem[]): ExpenseVariations { + const totalExpenseAmounts: ExpenseVariations = { + min: 0, + average: 0, + max: 0, + }; + + expenseItems.forEach((expenseItem: ExpenseItem) => { + const expenseVariations = this.calculateExpense( + expenseItem.amount.bothApplicable, + expenseItem.amount.costRange, + expenseItem.amount.percentage, + expenseItem.checked + ); + + totalExpenseAmounts.min += expenseVariations.min; + totalExpenseAmounts.average += expenseVariations.average; + totalExpenseAmounts.max += expenseVariations.max; + }); + + return totalExpenseAmounts; + } + + calculateExpense(isBothApplicable: boolean, costRange: MinMaxModel, percentage: number[], checked: boolean): ExpenseVariations { + const firstPercentageElement = percentage[this.FIRST_ELEMENT]; + const secondPercentageElement = percentage[this.SECOND_ELEMENT]; + const checkNotDefined = checked === undefined || checked === null; + + if (checkNotDefined) { + if (firstPercentageElement === 0) { + return { + min: costRange.min, + average: Math.ceil(( costRange.min + costRange.max ) / 2), + max: costRange.max + }; + } else { + return { + min: firstPercentageElement, + average: firstPercentageElement, + max: firstPercentageElement + }; + } + } else { + if (checked) { + if (!isBothApplicable) { + if (firstPercentageElement === 0) { + return { + min: costRange.min, + average: Math.ceil(( costRange.min + costRange.max ) / 2), + max: costRange.max + }; + } else { + return { + min: firstPercentageElement, + average: firstPercentageElement, + max: firstPercentageElement + }; + } + } else { + return { + min: costRange.min, + average: this.calculateRealEstateAgencyAverageExpense(costRange, percentage), + max: costRange.max + secondPercentageElement + }; + } + } else { + return { + min: 0, + average: 0, + max: 0 + }; + } + } + } + + calculateRealEstateAgencyAverageExpense(costRange: MinMaxModel, percentage: number[]): number { + const firstPercentageElement = percentage[ this.FIRST_ELEMENT ]; + const secondPercentageElement = percentage[ this.SECOND_ELEMENT ]; + const minCost = costRange.min; + const maxCost = costRange.max; + const averageCost = minCost + maxCost / 2; + const averagePercentageCost = ( firstPercentageElement + secondPercentageElement ) / 2; + + return Math.ceil(( + ( minCost ) + + ( averageCost ) + + ( minCost + firstPercentageElement ) + + ( minCost + secondPercentageElement ) + + ( minCost + ( averagePercentageCost ) ) + + ( maxCost ) + + ( maxCost + firstPercentageElement ) + + ( maxCost + secondPercentageElement ) + + ( maxCost + ( averagePercentageCost ) ) + + ( ( averageCost ) + firstPercentageElement ) + + ( ( averageCost ) + secondPercentageElement ) + + ( ( averageCost ) + ( averagePercentageCost ) ) + ) / this.TOTAL_NUMBER_OF_REAL_ESTATE_EXPENSE_SCENARIOS + ); + } + + setCalculatedExpenses(mortgageAmount: number): ExpenseItem[] { + this.calculatedMortgageExpenses = this.createRawExpenseItemsList() + .map((expenseItem: ExpenseItem) => { + const expenseElement = { + name: expenseItem.name, + info: expenseItem.info, + compulsory: expenseItem.compulsory, + taxDeductible: expenseItem.taxDeductible, + specialExpense: expenseItem.specialExpense, + checked: expenseItem.checked, + approximate: expenseItem.approximate, + exceededAmount: expenseItem.exceededAmount, + }; + + const constRange = { + costRange: { + min: expenseItem.amount.costRange.min, + max: expenseItem.amount.costRange.max, + }, + }; + + const bothApplicable = { + bothApplicable: expenseItem.amount.bothApplicable, + }; + + if (expenseItem.name === 'Real Estate Agent') { + return { + ... expenseElement, + amount: { + percentage: [ + Math.floor((expenseItem.amount.percentage[this.FIRST_ELEMENT] / 100) * mortgageAmount), + Math.floor((expenseItem.amount.percentage[this.SECOND_ELEMENT] / 100) * mortgageAmount) + ], + ...constRange, + ...bothApplicable, + } + } as ExpenseItem; + } else if (expenseItem.name === 'Bank Guarantee') { + return { + ... expenseElement, + amount: { + percentage: [ + Math.floor((10 / 100) * (expenseItem.amount.percentage[this.FIRST_ELEMENT] / 100) * mortgageAmount) + ], + ...constRange, + ...bothApplicable, + } + } as ExpenseItem; + } else { + return { + ... expenseElement, + amount: { + percentage: [Math.floor((expenseItem.amount.percentage[this.FIRST_ELEMENT] / 100) * mortgageAmount)], + ...constRange, + ...bothApplicable, + } + } as ExpenseItem; + } + }); + + return this.calculatedMortgageExpenses; + } + + createRawExpenseItemsList(): ExpenseItem[] { + const expenseItems: ExpenseItem[] = [ { name: 'Financial Advisor', amount: { - percentage: [ 0 ], + percentage: [0], costRange: { min: 2000, max: 5000, @@ -32,11 +239,12 @@ export class ResultsComponent implements OnInit { info: 'Prices for a financial advisor can vary from approx. 2,000 euros to more than 5,000 euros.', compulsory: true, taxDeductible: true, + approximate: true, }, { name: 'Valuation', amount: { - percentage: [ 0 ], + percentage: [0], costRange: { min: 300, max: 800, @@ -46,11 +254,12 @@ export class ResultsComponent implements OnInit { info: 'Every bank or lender requires an official valuation report if you’re getting a mortgage. This will cost you somewhere between 300 and 800 euros, depending on the size of the house (the bigger, the more work) and of course the evaluator you choose.', compulsory: true, taxDeductible: true, + approximate: true, }, { name: 'Civil-Law Notary', amount: { - percentage: [ 0 ], + percentage: [0], costRange: { min: 900, max: 2000, @@ -60,11 +269,12 @@ export class ResultsComponent implements OnInit { info: 'You’ll need a notary to legally transfer the property to your name and register it at the land registry. Costs for this will vary from 900 euros to as much as 2,000 euros, depending on the notary.', compulsory: true, taxDeductible: true, + approximate: true, }, { name: 'Transfer Tax', amount: { - percentage: [ 2 ], + percentage: [2], costRange: { min: 0, max: 0, @@ -78,7 +288,7 @@ export class ResultsComponent implements OnInit { { name: 'Organizing Medical Report', amount: { - percentage: [ 0 ], + percentage: [0], costRange: { min: 125, max: 150, @@ -88,25 +298,29 @@ export class ResultsComponent implements OnInit { info: 'This expense is related to organizing you medical report and handling files with the authorities.', compulsory: true, taxDeductible: false, + approximate: true, }, { name: 'Bank Guarantee', amount: { - percentage: [ 1 ], + percentage: [1], costRange: { min: 0, max: 0, }, bothApplicable: false, }, - info: 'You’ll need to provide the seller with a 10% deposit once you’ve signed the purchase agreement. If you can’t provide a 10% deposit, you’ll need to get a bank guarantee for that amount. You can expect the bank guarantee to cost you about 1% of the amount of the guarantee.', + info: 'You’ll need to provide the seller with a 10% deposit once you’ve signed the purchase agreement. If you can’t provide a' + + ' 10% deposit, you’ll need to get a bank guarantee for that amount. Fees for bank guarantees vary from provider to provider.' + + ' It is often 1% of the deposit, but some providers charge less or even nothing at all. The notary will deduct these fees' + + ' upon transfer. You can expect the bank guarantee to cost you between from nothing to 1% of the amount of the guarantee.', compulsory: true, taxDeductible: false, }, { name: 'Structural Survey', amount: { - percentage: [ 0 ], + percentage: [0], costRange: { min: 250, max: 900, @@ -116,11 +330,12 @@ export class ResultsComponent implements OnInit { info: 'A structural survey to inspect your home will cost between 250 and 900 euros, depending on the size of the building.', compulsory: true, taxDeductible: false, + approximate: true, }, { name: 'National Mortgage Guarantee(NHG)', amount: { - percentage: [ 0.9 ], + percentage: [0.9], costRange: { min: 0, max: 0, @@ -131,11 +346,13 @@ export class ResultsComponent implements OnInit { compulsory: false, taxDeductible: true, specialExpense: true, + exceededAmount: false, + checked: true }, { name: 'Real Estate Agent', amount: { - percentage: [ 0.5, 1.5 ], + percentage: [0.5, 1.5], costRange: { min: 500, max: 3000, @@ -146,11 +363,13 @@ export class ResultsComponent implements OnInit { compulsory: false, taxDeductible: false, specialExpense: true, + approximate: true, + checked: true }, { name: 'Life Insurance', amount: { - percentage: [ 0 ], + percentage: [0], costRange: { min: 250, max: 500, @@ -161,11 +380,13 @@ export class ResultsComponent implements OnInit { compulsory: false, taxDeductible: false, specialExpense: true, + approximate: true, + checked: true }, { name: 'Contact with Agency', amount: { - percentage: [ 0 ], + percentage: [0], costRange: { min: 350, max: 500, @@ -176,14 +397,16 @@ export class ResultsComponent implements OnInit { compulsory: false, taxDeductible: false, specialExpense: true, + approximate: true, + checked: true }, { name: 'Translator', amount: { - percentage: [ 0 ], + percentage: [0], costRange: { - min: 500, - max: 750, + min: 250, + max: 500, }, bothApplicable: false, }, @@ -191,11 +414,13 @@ export class ResultsComponent implements OnInit { compulsory: false, taxDeductible: false, specialExpense: true, + approximate: true, + checked: true }, { name: 'Self-employed Customers', amount: { - percentage: [ 0 ], + percentage: [0], costRange: { min: 495, max: 500, @@ -206,6 +431,8 @@ export class ResultsComponent implements OnInit { compulsory: false, taxDeductible: false, specialExpense: true, + approximate: true, + checked: true } ]; diff --git a/src/app/core/header/share-buttons/share-buttons.component.scss b/src/app/core/header/share-buttons/share-buttons.component.scss index a06d2c0..6e4c675 100644 --- a/src/app/core/header/share-buttons/share-buttons.component.scss +++ b/src/app/core/header/share-buttons/share-buttons.component.scss @@ -1,4 +1,4 @@ -@import 'src/assets/scss/mixins'; +@import '../../../../assets/scss/mixins'; :host { flex: 1 1 auto; diff --git a/src/app/shared/expense-data.model.ts b/src/app/shared/expense-data.model.ts index 0d38ed9..2606635 100644 --- a/src/app/shared/expense-data.model.ts +++ b/src/app/shared/expense-data.model.ts @@ -1,19 +1,28 @@ -export interface ExpenseItems { +export interface ExpenseItem { name: string; amount: CostRanges; info: string; compulsory: boolean; taxDeductible: boolean; - specialExpense?: boolean, + checked?: boolean; + specialExpense?: boolean; + approximate?: boolean; + exceededAmount?: boolean; } -interface CostRanges { +export interface CostRanges { percentage: number[]; costRange: MinMaxModel; bothApplicable: boolean; } -interface MinMaxModel { +export interface MinMaxModel { min: number; max: number; } + +export interface ExpenseVariations { + min: number; + average: number; + max: number; +} diff --git a/src/assets/custom-font-icons/approximately.svg b/src/assets/custom-font-icons/approximately.svg new file mode 100644 index 0000000..d5999d1 --- /dev/null +++ b/src/assets/custom-font-icons/approximately.svg @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/scss/media-queries.scss b/src/assets/scss/media-queries.scss new file mode 100644 index 0000000..ad5fd31 --- /dev/null +++ b/src/assets/scss/media-queries.scss @@ -0,0 +1,7 @@ +@media only screen and (max-width: 800px) { + app-calculate .mat-raised-button { + line-height: 47px !important; + padding: 0 16px !important; + font-size: 15px !important; + } +} diff --git a/src/assets/scss/theme.scss b/src/assets/scss/theme.scss new file mode 100644 index 0000000..64920d0 --- /dev/null +++ b/src/assets/scss/theme.scss @@ -0,0 +1,9 @@ +@import '~@angular/material/theming'; +@include mat-core(); + +$my-app-primary: mat-palette($mat-deep-purple); +$my-app-accent: mat-palette($mat-red); +$my-app-warn: mat-palette($mat-amber); +$my-app-theme: mat-light-theme($my-app-primary, $my-app-accent, $my-app-warn); + +@include angular-material-theme($my-app-theme); diff --git a/src/styles.scss b/src/styles.scss index 3d1532d..8dcc855 100644 --- a/src/styles.scss +++ b/src/styles.scss @@ -1,7 +1,15 @@ +@import 'assets/scss/mixins.scss'; +@import 'assets/scss/media-queries.scss'; + body { height: 100vh; margin: 0; font-family: Roboto, "Helvetica Neue", sans-serif; + background-image: url('assets/logo/mecLogoEmptyWhite.svg'); + background-repeat: no-repeat; + background-color: #fbfbfb; + background-size: 30%; + background-position: bottom; } .no--padding { @@ -20,6 +28,11 @@ body { width: 100%; } +::selection { + color: white; + background: #673ab7; +} + .margin { &-top { &-xl { @@ -124,12 +137,12 @@ body { .mat-form-field-appearance-legacy { .mat-form-field-infix { - padding: 0.7em 0 !important; + padding: 0.54em 0 !important; } } .mat-card .mat-divider-horizontal { - min-height: 30px; + min-height: 20px; } .mat-list-base .mat-list-item .mat-list-item-content { @@ -141,3 +154,14 @@ body { .mat-checkbox-layout .mat-checkbox-label { white-space: initial; } + +.mat-card:not([class*=mat-elevation-z]) { + box-shadow: 0 2px 1px -1px rgba(0, 0, 0, 0.07), 0px 1px 1px 0 rgba(0, 0, 0, 0.35), 0 1px 3px 0 rgba(0, 0, 0, 0.43); +} + +.mat-raised-button { + line-height: 50px !important; + padding: 0 20px !important; + font-size: 18px !important; +} +