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
-
-
-
+ €
+
+
-
+ (click)="value=null">
close
-
-
CALCULATE
+
+ CALCULATE
+
-
+
+
+ refresh
+
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;
+}
+