diff --git a/package-lock.json b/package-lock.json index 39f3e924184b0960267e08b4d6d2b6bb1ff4a88e..a7b79ff4ae1bfbce4116a3047847a5c0008c671f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,9 +5,12 @@ "requires": true, "dependencies": { "@agm/core": { - "version": "1.0.0-beta.3", - "resolved": "https://registry.npmjs.org/@agm/core/-/core-1.0.0-beta.3.tgz", - "integrity": "sha512-nsyergarmMB4JCw7KGujj86ulgRYhEk8zXKRiJZdnju/irLvazQ/9Anlfsf1Rc5yph8sZrmQDwqLGZ6AqHhnzA==" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@agm/core/-/core-1.0.0.tgz", + "integrity": "sha512-tgrobTyAHCZ3cdi21IdiBafiHLxsC5/6ncq6+f9RV+HrLg0XDuk+DA7upfdE34o2Ui3fNRDYDIgExRVFLsSPCw==", + "requires": { + "tslib": "^1.9.0" + } }, "@angular-devkit/architect": { "version": "0.6.8", @@ -160,9 +163,9 @@ } }, "@angular/cdk": { - "version": "6.4.5", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-6.4.5.tgz", - "integrity": "sha512-bbz8lHzY1NXPqrvHcZTOOD6+BiDNPKXC00xwzls62NPmiueBaWGwQdk7s3sa/0kCyq1ZKrPD3KQIDMyytxlzzw==", + "version": "6.4.7", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-6.4.7.tgz", + "integrity": "sha512-18x0U66fLD5kGQWZ9n3nb75xQouXlWs7kUDaTd8HTrHpT1s2QIAqlLd1KxfrYiVhsEC2jPQaoiae7VnBlcvkBg==", "requires": { "tslib": "^1.7.1" } @@ -336,6 +339,21 @@ "tslib": "^1.9.0" } }, + "@angular/flex-layout": { + "version": "10.0.0-beta.32", + "resolved": "https://registry.npmjs.org/@angular/flex-layout/-/flex-layout-10.0.0-beta.32.tgz", + "integrity": "sha512-JvuY4dUoy5jyCTIrFiq7n30Znakh1pD3nbg0h0hs2r3t1OiDQb0ZSI1wcumosG/vYHsuJQTuNhbfaIZzA1x8nA==", + "requires": { + "tslib": "^2.0.0" + }, + "dependencies": { + "tslib": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.0.tgz", + "integrity": "sha512-lTqkx847PI7xEDYJntxZH89L2/aXInsyF2luSafe/+0fHOMjlBNXdH6th7f70qxLDhul7KZK0zC8V5ZIyHl0/g==" + } + } + }, "@angular/forms": { "version": "6.0.4", "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-6.0.4.tgz", @@ -353,27 +371,20 @@ } }, "@angular/material": { - "version": "6.4.5", - "resolved": "https://registry.npmjs.org/@angular/material/-/material-6.4.5.tgz", - "integrity": "sha512-3wDRfGqlRSo3CBA1XuPXSz7zAwZF5kotXEgbZhIAocv+nsXa73DyPNceAQ++Pu7rFR3ipg6McyggP0OCOgv7NQ==", + "version": "6.4.7", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-6.4.7.tgz", + "integrity": "sha512-SdNx7Xovi24Kw9eU6lkLhY/7f2M7L9F+/uh6XuPr4jbGgCUVVpeeVI5ztZhsZRbj1sN+/r1p5w8u62apWWl5Ww==", "requires": { "parse5": "^5.0.0", "tslib": "^1.7.1" } }, "@angular/material-moment-adapter": { - "version": "6.4.5", - "resolved": "https://registry.npmjs.org/@angular/material-moment-adapter/-/material-moment-adapter-6.4.5.tgz", - "integrity": "sha512-xgPMnntOfwTX4Uuz7g/GQ4IcRn6tiSJCGSikwTK5yRJjUEGguHmBch57q2Xjr/A+WfmGYZnVfzy3V9t/XsNKqA==", + "version": "6.4.7", + "resolved": "https://registry.npmjs.org/@angular/material-moment-adapter/-/material-moment-adapter-6.4.7.tgz", + "integrity": "sha512-OGdDtpu/yRioOQXhJFCNuiOF2OgiL9VUj8ewFPi1lDtFGUFfVwU2h3hWkKLn+yuPW+DBVYla11tCNsn5dLElmA==", "requires": { "tslib": "^1.7.1" - }, - "dependencies": { - "tslib": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.0.tgz", - "integrity": "sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ==" - } } }, "@angular/platform-browser": { @@ -441,14 +452,14 @@ "dev": true }, "@types/marked": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@types/marked/-/marked-0.4.0.tgz", - "integrity": "sha512-xkURX55US18wHme+O2UlqJf3Fo7FqT5VAL+OJ/zK+jP2NX57naryDHoiqt/pMIwZjDc62sRvXUWuQQxQiBdheQ==" + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@types/marked/-/marked-0.4.2.tgz", + "integrity": "sha512-cDB930/7MbzaGF6U3IwSQp6XBru8xWajF5PV2YZZeV8DyiliTuld11afVztGI9+yJZ29il5E+NpGA6ooV/Cjkg==" }, "@types/node": { - "version": "6.0.116", - "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.116.tgz", - "integrity": "sha512-vToa8YEeulfyYg1gSOeHjvvIRqrokng62VMSj2hoZrwZNcYrp2h3AWo6KeBVuymIklQUaY5zgVJvVsC4KiiLkQ==", + "version": "6.0.118", + "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.118.tgz", + "integrity": "sha512-N33cKXGSqhOYaPiT4xUGsYlPPDwFtQM/6QxJxuMXA/7BcySW+lkn2yigWP7vfs4daiL/7NJNU6DMCqg5N4B+xQ==", "dev": true }, "@types/q": { @@ -458,9 +469,9 @@ "dev": true }, "@types/selenium-webdriver": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-3.0.10.tgz", - "integrity": "sha512-ikB0JHv6vCR1KYUQAzTO4gi/lXLElT4Tx+6De2pc/OZwizE9LRNiTa+U8TBFKBD/nntPnr/MPSHSnOTybjhqNA==", + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-3.0.17.tgz", + "integrity": "sha512-tGomyEuzSC1H28y2zlW6XPCaDaXFaD6soTdb4GNdmte2qfHtrKqhy0ZFs4r/1hpazCfEZqeTSRLvSasmEx89uw==", "dev": true }, "@webassemblyjs/ast": { @@ -710,13 +721,13 @@ "abbrev": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", - "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=", - "dev": true + "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=" }, "accepts": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", + "dev": true, "requires": { "mime-types": "~2.1.18", "negotiator": "0.6.1" @@ -745,9 +756,9 @@ "optional": true }, "adm-zip": { - "version": "0.4.11", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.11.tgz", - "integrity": "sha512-L8vcjDTCOIJk7wFvmlEUN7AsSb8T+2JrdP7KINBjzr24TJ5Mwj590sLu3BC7zNZowvJWa/JtPmD8eJCzdtDWjA==", + "version": "0.4.16", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz", + "integrity": "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==", "dev": true }, "after": { @@ -815,8 +826,7 @@ "amdefine": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", - "dev": true + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" }, "amqplib": { "version": "0.5.2", @@ -961,7 +971,6 @@ "version": "1.1.5", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "optional": true, "requires": { "delegates": "^1.0.0", "readable-stream": "^2.0.6" @@ -994,8 +1003,7 @@ "array-find-index": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", - "dev": true + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=" }, "array-flatten": { "version": "1.1.1", @@ -1133,9 +1141,7 @@ "async-foreach": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", - "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=", - "dev": true, - "optional": true + "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=" }, "async-limiter": { "version": "1.0.0", @@ -1494,8 +1500,6 @@ "version": "0.0.9", "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", - "dev": true, - "optional": true, "requires": { "inherits": "~2.0.0" } @@ -1525,6 +1529,7 @@ "version": "1.18.2", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", + "dev": true, "requires": { "bytes": "3.0.0", "content-type": "~1.0.4", @@ -1541,7 +1546,8 @@ "qs": { "version": "6.5.1", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", + "dev": true } } }, @@ -1754,9 +1760,9 @@ } }, "browserstack": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/browserstack/-/browserstack-1.5.1.tgz", - "integrity": "sha512-O8VMT64P9NOLhuIoD4YngyxBURefaSdR4QdhG8l6HZ9VxtU7jc3m6jLufFwKA5gaf7fetfB2TnRJnMxyob+heg==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/browserstack/-/browserstack-1.6.0.tgz", + "integrity": "sha512-HJDJ0TSlmkwnt9RZ+v5gFpa1XZTBYTj0ywvLwJ3241J7vMw2jAsGNVhKHtmCOyg+VxeLZyaibO9UL71AsUeDIw==", "dev": true, "requires": { "https-proxy-agent": "^2.2.1" @@ -1863,7 +1869,8 @@ "bytes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true }, "cacache": { "version": "10.0.4", @@ -1939,7 +1946,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", - "dev": true, "requires": { "camelcase": "^2.0.0", "map-obj": "^1.0.0" @@ -1948,8 +1954,7 @@ "camelcase": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", - "dev": true + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" } } }, @@ -2095,9 +2100,9 @@ "dev": true }, "clipboard": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.1.tgz", - "integrity": "sha512-7yhQBmtN+uYZmfRjjVjKa0dZdWuabzpSKGtyQZN+9C8xlC788SSJjOHWh7tzurfwTqTD5UDYAhIv5fRJg3sHjQ==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.6.tgz", + "integrity": "sha512-g5zbiixBRk/wyKakSwCKd7vQXDjFnAMGHoEyBogG/bw9kTD9GvdAvaoRR1ALcEzt3pVKxZR0pViekPMIS0QyGg==", "optional": true, "requires": { "good-listener": "^1.2.2", @@ -2366,8 +2371,7 @@ "console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "optional": true + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" }, "constants-browserify": { "version": "1.0.0", @@ -2376,9 +2380,12 @@ "dev": true }, "content-disposition": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "requires": { + "safe-buffer": "5.1.2" + } }, "content-type": { "version": "1.0.4", @@ -2394,7 +2401,8 @@ "cookie": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", + "dev": true }, "cookie-signature": { "version": "1.0.6", @@ -2437,9 +2445,9 @@ } }, "core-js": { - "version": "2.5.7", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", - "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==" + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", + "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==" }, "core-util-is": { "version": "1.0.2", @@ -2520,8 +2528,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", - "dev": true, - "optional": true, "requires": { "lru-cache": "^4.0.1", "which": "^1.2.9" @@ -2622,7 +2628,6 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "dev": true, "requires": { "array-find-index": "^1.0.1" } @@ -2686,8 +2691,7 @@ "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" }, "decode-uri-component": { "version": "0.2.0", @@ -2847,8 +2851,7 @@ "delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "optional": true + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" }, "depd": { "version": "1.1.2", @@ -3096,6 +3099,11 @@ "minimalistic-crypto-utils": "^1.0.0" } }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, "emojis-list": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", @@ -3186,14 +3194,26 @@ } }, "enhanced-resolve": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", - "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz", + "integrity": "sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ==", "dev": true, "requires": { "graceful-fs": "^4.1.2", - "memory-fs": "^0.4.0", + "memory-fs": "^0.5.0", "tapable": "^1.0.0" + }, + "dependencies": { + "memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + } } }, "ent": { @@ -3221,7 +3241,6 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, "requires": { "is-arrayish": "^0.2.1" } @@ -3584,51 +3603,160 @@ } }, "express": { - "version": "4.16.3", - "resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz", - "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=", + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", "requires": { - "accepts": "~1.3.5", + "accepts": "~1.3.7", "array-flatten": "1.1.1", - "body-parser": "1.18.2", - "content-disposition": "0.5.2", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", "content-type": "~1.0.4", - "cookie": "0.3.1", + "cookie": "0.4.0", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "~1.1.2", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.1.1", + "finalhandler": "~1.1.2", "fresh": "0.5.2", "merge-descriptors": "1.0.1", "methods": "~1.1.2", "on-finished": "~2.3.0", - "parseurl": "~1.3.2", + "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.3", - "qs": "6.5.1", - "range-parser": "~1.2.0", - "safe-buffer": "5.1.1", - "send": "0.16.2", - "serve-static": "1.13.2", - "setprototypeof": "1.1.0", - "statuses": "~1.4.0", - "type-is": "~1.6.16", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" }, "dependencies": { + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + } + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "mime-db": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" + }, + "mime-types": { + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "requires": { + "mime-db": "1.44.0" + } + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, "qs": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" }, - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } } } }, @@ -3805,17 +3933,29 @@ } }, "finalhandler": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", - "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", "requires": { "debug": "2.6.9", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "on-finished": "~2.3.0", - "parseurl": "~1.3.2", - "statuses": "~1.4.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", "unpipe": "~1.0.0" + }, + "dependencies": { + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + } } }, "find-cache-dir": { @@ -3972,8 +4112,7 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "fsevents": { "version": "1.2.4", @@ -4457,11 +4596,9 @@ } }, "fstream": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", - "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", - "dev": true, - "optional": true, + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", "requires": { "graceful-fs": "^4.1.2", "inherits": "~2.0.0", @@ -4524,7 +4661,6 @@ "version": "2.7.4", "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "optional": true, "requires": { "aproba": "^1.0.3", "console-control-strings": "^1.0.0", @@ -4540,8 +4676,6 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", - "dev": true, - "optional": true, "requires": { "globule": "^1.0.0" } @@ -4572,8 +4706,7 @@ "get-stdin": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", - "dev": true + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=" }, "get-stream": { "version": "3.0.0", @@ -4613,7 +4746,6 @@ "version": "7.1.2", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -4704,11 +4836,9 @@ } }, "globule": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.1.tgz", - "integrity": "sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ==", - "dev": true, - "optional": true, + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.2.tgz", + "integrity": "sha512-7IDTQTIu2xzXkT+6mlluidnWo+BypnbSoEVVQCGfzqnl5Ik8d3e1d4wycb8Rj9tWW+Z39uPWsdlquqiqPCd/pA==", "requires": { "glob": "~7.1.1", "lodash": "~4.17.10", @@ -4843,7 +4973,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, "requires": { "ansi-regex": "^2.0.0" } @@ -4885,8 +5014,7 @@ "has-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "optional": true + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" }, "has-value": { "version": "1.0.0", @@ -5120,6 +5248,7 @@ "version": "1.6.3", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, "requires": { "depd": "~1.1.2", "inherits": "2.0.3", @@ -5237,7 +5366,8 @@ "iconv-lite": { "version": "0.4.19", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", - "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", + "dev": true }, "ieee754": { "version": "1.1.12", @@ -5311,17 +5441,14 @@ "dev": true }, "in-publish": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.0.tgz", - "integrity": "sha1-4g/146KvwmkDILbcVSaCqcf631E=", - "dev": true, - "optional": true + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.1.tgz", + "integrity": "sha512-oDM0kUSNFC31ShNxHKUyfZKy8ZeXZBWMjMdZHKLOk13uvT27VTL/QzRGfRUcevJhpkZAvlhPYuXkF7eNWrtyxQ==" }, "indent-string": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "dev": true, "requires": { "repeating": "^2.0.0" } @@ -5343,7 +5470,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -5391,9 +5517,9 @@ "dev": true }, "ipaddr.js": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", - "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=" + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" }, "is-accessor-descriptor": { "version": "0.1.6", @@ -5416,8 +5542,7 @@ "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" }, "is-binary-path": { "version": "1.0.1", @@ -5529,7 +5654,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", - "dev": true, "requires": { "number-is-nan": "^1.0.0" } @@ -5701,8 +5825,7 @@ "is-utf8": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" }, "is-windows": { "version": "1.0.2", @@ -5731,8 +5854,7 @@ "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, "isobject": { "version": "3.0.1", @@ -6001,11 +6123,9 @@ "dev": true }, "js-base64": { - "version": "2.4.8", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.8.tgz", - "integrity": "sha512-hm2nYpDrwoO/OzBhdcqs/XGT6XjSuSSCVEpia+Kl2J6x4CYt5hISlVL/AYU1khoDXv0AQVgxtdJySb9gjAn56Q==", - "dev": true, - "optional": true + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz", + "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==" }, "js-tokens": { "version": "3.0.2", @@ -6095,56 +6215,15 @@ } }, "jszip": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.1.5.tgz", - "integrity": "sha512-5W8NUaFRFRqTOL7ZDDrx5qWHJyBXy6velVudIzQUSoqAAYqzSh2Z7/m0Rf1QbmQJccegD0r+YZxBjzqoBiEeJQ==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.5.0.tgz", + "integrity": "sha512-WRtu7TPCmYePR1nazfrtuF216cIVon/3GWOvHS9QR5bIwSbnxtdpma6un3jyGGNhHsKCSzn5Ypk+EkDRvTGiFA==", "dev": true, "requires": { - "core-js": "~2.3.0", - "es6-promise": "~3.0.2", - "lie": "~3.1.0", + "lie": "~3.3.0", "pako": "~1.0.2", - "readable-stream": "~2.0.6" - }, - "dependencies": { - "core-js": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.3.0.tgz", - "integrity": "sha1-+rg/uwstjchfpjbEudNMdUIMbWU=", - "dev": true - }, - "es6-promise": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.0.2.tgz", - "integrity": "sha1-AQ1YWEI6XxGJeWZfRkhqlcbuK7Y=", - "dev": true - }, - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", - "dev": true - }, - "readable-stream": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", - "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "string_decoder": "~0.10.x", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - } + "readable-stream": "~2.3.6", + "set-immediate-shim": "~1.0.1" } }, "jump.js": { @@ -6381,9 +6460,9 @@ } }, "lie": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", - "integrity": "sha1-mkNrLMd0bKWd56QfpGmz77dr2H4=", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", "dev": true, "requires": { "immediate": "~3.0.5" @@ -6393,7 +6472,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, "requires": { "graceful-fs": "^4.1.2", "parse-json": "^2.2.0", @@ -6405,8 +6483,7 @@ "pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" } } }, @@ -6440,15 +6517,7 @@ "lodash": { "version": "4.17.10", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", - "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", - "dev": true - }, - "lodash.assign": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", - "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", - "dev": true, - "optional": true + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==" }, "lodash.clonedeep": { "version": "4.5.0", @@ -6461,13 +6530,6 @@ "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" }, - "lodash.mergewith": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz", - "integrity": "sha512-eWw5r+PYICtEBgrBE5hhlT6aAa75f411bgDz/ZL2KZqYV03USvucsxcHUIlGTDTECs1eunpI7HOV7U+WLDvNdQ==", - "dev": true, - "optional": true - }, "lodash.tail": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.tail/-/lodash.tail-4.1.1.tgz", @@ -6732,7 +6794,6 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", - "dev": true, "requires": { "currently-unhandled": "^0.4.1", "signal-exit": "^3.0.0" @@ -6754,7 +6815,6 @@ "version": "4.1.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", - "dev": true, "requires": { "pseudomap": "^1.0.2", "yallist": "^2.1.2" @@ -6826,6 +6886,15 @@ "integrity": "sha512-0Dab5btKVPhibSalc9QGXb559ED7G7iLjFXBaj9Wq8O3vorueR5K5jaE3hkG6ZQINyhA/JgG6Qk4qdFQjsYV6g==", "dev": true }, + "map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "dev": true, + "requires": { + "p-defer": "^1.0.0" + } + }, "map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", @@ -6834,8 +6903,7 @@ "map-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" }, "map-visit": { "version": "1.0.0", @@ -6846,9 +6914,9 @@ } }, "marked": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-0.4.0.tgz", - "integrity": "sha512-tMsdNBgOsrUophCAFQl0XPe6Zqk/uy9gnue+jIIKhykO51hxyu6uNx7zBPy0+y/WKYVZZMspV9YeXLNdKk+iYw==" + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/marked/-/marked-0.5.2.tgz", + "integrity": "sha512-fdZvBa7/vSQIZCi4uuwo2N3q+7jJURpMVCcbaX0S1Mg65WZ5ilXvC67MviJAsdjqqgD+CEq4RKo5AYGgINkVAA==" }, "math-random": { "version": "1.0.1", @@ -6893,7 +6961,6 @@ "version": "3.7.0", "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", - "dev": true, "requires": { "camelcase-keys": "^2.0.0", "decamelize": "^1.1.2", @@ -6950,7 +7017,8 @@ "mime": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", + "dev": true }, "mime-db": { "version": "1.35.0", @@ -7144,7 +7212,8 @@ "negotiator": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", - "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", + "dev": true }, "neo-async": { "version": "2.5.2", @@ -7171,13 +7240,13 @@ "integrity": "sha1-4nvOjIPpsFt8uZ/toM84X55SIWk=" }, "ngx-markdown": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ngx-markdown/-/ngx-markdown-6.1.0.tgz", - "integrity": "sha512-+EiFsX9wcOzroaSMLWgY84uvZWxslnGKoBw34l4ZJMmoPUFDQGET5H3MB4PstGMaGlwVO03r2DuXH+/EqBUuqA==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/ngx-markdown/-/ngx-markdown-6.3.0.tgz", + "integrity": "sha512-h/C1KUWp3NfiOYf1fncSOvOOr1R52yDMlk7AEGacxXya+YVFb78Re96Mp7twBVwEZnUxP3lPh/HGGod2R4OpXg==", "requires": { - "@types/marked": "^0.4.0", - "marked": "^0.4.0", - "prismjs": "^1.14.0", + "@types/marked": "^0.4.2", + "marked": "^0.5.1", + "prismjs": "^1.15.0", "tslib": "^1.9.0" } }, @@ -7190,6 +7259,12 @@ "tslib": "^1.9.0" } }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, "no-case": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", @@ -7209,8 +7284,6 @@ "version": "3.8.0", "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz", "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==", - "dev": true, - "optional": true, "requires": { "fstream": "^1.0.0", "glob": "^7.0.3", @@ -7229,9 +7302,7 @@ "semver": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", - "dev": true, - "optional": true + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=" } } }, @@ -7275,11 +7346,9 @@ } }, "node-sass": { - "version": "4.9.3", - "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.9.3.tgz", - "integrity": "sha512-XzXyGjO+84wxyH7fV6IwBOTrEBe2f0a6SBze9QWWYR/cL74AcQUks2AsqcCZenl/Fp/JVbuEaLpgrLtocwBUww==", - "dev": true, - "optional": true, + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.14.1.tgz", + "integrity": "sha512-sjCuOlvGyCJS40R8BscF5vhVlQjNN069NtQ1gSxyK1u9iqvn6tf7O1R4GNowVZfiZUCRt5MmMs1xd+4V/7Yr0g==", "requires": { "async-foreach": "^0.1.3", "chalk": "^1.1.1", @@ -7288,46 +7357,27 @@ "get-stdin": "^4.0.1", "glob": "^7.0.3", "in-publish": "^2.0.0", - "lodash.assign": "^4.2.0", - "lodash.clonedeep": "^4.3.2", - "lodash.mergewith": "^4.6.0", + "lodash": "^4.17.15", "meow": "^3.7.0", "mkdirp": "^0.5.1", - "nan": "^2.10.0", + "nan": "^2.13.2", "node-gyp": "^3.8.0", "npmlog": "^4.0.0", - "request": "2.87.0", - "sass-graph": "^2.2.4", + "request": "^2.88.0", + "sass-graph": "2.2.5", "stdout-stream": "^1.4.0", "true-case-path": "^1.0.2" }, "dependencies": { - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "dev": true, - "optional": true, - "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" - } - }, "ansi-styles": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true, - "optional": true + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" }, "chalk": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "optional": true, "requires": { "ansi-styles": "^2.2.1", "escape-string-regexp": "^1.0.2", @@ -7336,76 +7386,20 @@ "supports-color": "^2.0.0" } }, - "har-validator": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", - "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", - "dev": true, - "optional": true, - "requires": { - "ajv": "^5.1.0", - "har-schema": "^2.0.0" - } - }, - "oauth-sign": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", - "dev": true, - "optional": true + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true, - "optional": true - }, - "request": { - "version": "2.87.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.87.0.tgz", - "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==", - "dev": true, - "optional": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.6.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.5", - "extend": "~3.0.1", - "forever-agent": "~0.6.1", - "form-data": "~2.3.1", - "har-validator": "~5.0.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.17", - "oauth-sign": "~0.8.2", - "performance-now": "^2.1.0", - "qs": "~6.5.1", - "safe-buffer": "^5.1.1", - "tough-cookie": "~2.3.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.1.0" - } + "nan": { + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz", + "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==" }, "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, - "optional": true - }, - "tough-cookie": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", - "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", - "dev": true, - "optional": true, - "requires": { - "punycode": "^1.4.1" - } + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" } } }, @@ -7501,7 +7495,6 @@ "version": "3.0.6", "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", - "dev": true, "requires": { "abbrev": "1" } @@ -7573,7 +7566,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "optional": true, "requires": { "are-we-there-yet": "~1.1.2", "console-control-strings": "~1.1.0", @@ -7798,13 +7790,95 @@ "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" }, "os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", "dev": true, - "optional": true, "requires": { - "lcid": "^1.0.0" + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", + "dev": true + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "dev": true, + "requires": { + "invert-kv": "^2.0.0" + } + }, + "mem": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "dev": true, + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } } }, "os-tmpdir": { @@ -7821,12 +7895,24 @@ "os-tmpdir": "^1.0.0" } }, + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", + "dev": true + }, "p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", "dev": true }, + "p-is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", + "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", + "dev": true + }, "p-limit": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", @@ -7992,15 +8078,14 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, "requires": { "error-ex": "^1.2.0" } }, "parse5": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", - "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", "optional": true }, "parseqs": { @@ -8024,7 +8109,8 @@ "parseurl": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", - "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", + "dev": true }, "pascalcase": { "version": "0.1.1", @@ -8045,8 +8131,7 @@ "path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" }, "path-is-absolute": { "version": "1.0.1", @@ -8130,14 +8215,12 @@ "pinkie": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" }, "pinkie-promise": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, "requires": { "pinkie": "^2.0.0" } @@ -8264,9 +8347,9 @@ } }, "prismjs": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.15.0.tgz", - "integrity": "sha512-Lf2JrFYx8FanHrjoV5oL8YHCclLQgbJcVZR+gikGGMqz6ub5QVWDTM6YIwm3BuPxM/LOV+rKns3LssXNLIf+DA==", + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.21.0.tgz", + "integrity": "sha512-uGdSIu1nk3kej2iZsLyDoJ7e9bnPzIgY0naW/HdknGj61zScaprVEVGHrPoXqI+M9sP0NDnTK2jpkvmldpuqDw==", "requires": { "clipboard": "^2.0.0" } @@ -8309,12 +8392,11 @@ } }, "protractor": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/protractor/-/protractor-5.4.0.tgz", - "integrity": "sha512-6TSYqMhUUzxr4/wN0ttSISqPMKvcVRXF4k8jOEpGWD8OioLak4KLgfzHK9FJ49IrjzRrZ+Mx1q2Op8Rk0zEcnQ==", + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/protractor/-/protractor-5.4.4.tgz", + "integrity": "sha512-BaL4vePgu3Vfa/whvTUAlgaCAId4uNSGxIFSCXMgj7LMYENPWLp85h5RBi9pdpX/bWQ8SF6flP7afmi2TC4eHw==", "dev": true, "requires": { - "@types/node": "^6.0.46", "@types/q": "^0.0.32", "@types/selenium-webdriver": "^3.0.0", "blocking-proxy": "^1.0.0", @@ -8323,21 +8405,33 @@ "glob": "^7.0.3", "jasmine": "2.8.0", "jasminewd2": "^2.1.0", - "optimist": "~0.6.0", "q": "1.4.1", "saucelabs": "^1.5.0", "selenium-webdriver": "3.6.0", "source-map-support": "~0.4.0", - "webdriver-js-extender": "2.0.0", - "webdriver-manager": "^12.0.6" + "webdriver-js-extender": "2.1.0", + "webdriver-manager": "^12.0.6", + "yargs": "^12.0.5" }, "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, "ansi-styles": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", "dev": true }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, "chalk": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", @@ -8351,6 +8445,28 @@ "supports-color": "^2.0.0" } }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, "del": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", @@ -8366,6 +8482,15 @@ "rimraf": "^2.2.8" } }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, "globby": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", @@ -8380,6 +8505,46 @@ "pinkie-promise": "^2.0.0" } }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.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": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.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 + }, "pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", @@ -8395,6 +8560,27 @@ "source-map": "^0.5.6" } }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, "supports-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", @@ -8402,9 +8588,9 @@ "dev": true }, "webdriver-manager": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-12.1.0.tgz", - "integrity": "sha512-oEc5fmkpz6Yh6udhwir5m0eN5mgRPq9P/NU5YWuT3Up5slt6Zz+znhLU7q4+8rwCZz/Qq3Fgpr/4oao7NPCm2A==", + "version": "12.1.7", + "resolved": "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-12.1.7.tgz", + "integrity": "sha512-XINj6b8CYuUYC93SG3xPkxlyUc3IJbD6Vvo75CVGuG9uzsefDzWQrhz0Lq8vbPxtb4d63CZdYophF8k8Or/YiA==", "dev": true, "requires": { "adm-zip": "^0.4.9", @@ -8419,16 +8605,46 @@ "semver": "^5.3.0", "xml2js": "^0.4.17" } + }, + "yargs": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", + "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^11.1.1" + } + }, + "yargs-parser": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", + "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } } } }, "proxy-addr": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz", - "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", + "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", "requires": { "forwarded": "~0.1.2", - "ipaddr.js": "1.8.0" + "ipaddr.js": "1.9.1" } }, "proxy-agent": { @@ -8476,8 +8692,7 @@ "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" }, "psl": { "version": "1.1.29", @@ -8597,12 +8812,14 @@ "range-parser": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", + "dev": true }, "raw-body": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", + "dev": true, "requires": { "bytes": "3.0.0", "http-errors": "1.6.2", @@ -8613,12 +8830,14 @@ "depd": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", - "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=" + "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=", + "dev": true }, "http-errors": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", + "dev": true, "requires": { "depd": "1.1.1", "inherits": "2.0.3", @@ -8629,7 +8848,8 @@ "setprototypeof": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", - "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" + "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=", + "dev": true } } }, @@ -8672,7 +8892,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, "requires": { "load-json-file": "^1.0.0", "normalize-package-data": "^2.3.2", @@ -8683,7 +8902,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, "requires": { "graceful-fs": "^4.1.2", "pify": "^2.0.0", @@ -8693,8 +8911,7 @@ "pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" } } }, @@ -8702,7 +8919,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, "requires": { "find-up": "^1.0.0", "read-pkg": "^1.0.0" @@ -8712,7 +8928,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, "requires": { "path-exists": "^2.0.0", "pinkie-promise": "^2.0.0" @@ -8722,7 +8937,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, "requires": { "pinkie-promise": "^2.0.0" } @@ -8758,7 +8972,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", - "dev": true, "requires": { "indent-string": "^2.1.0", "strip-indent": "^1.0.1" @@ -8928,7 +9141,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true, "requires": { "is-finite": "^1.0.0" } @@ -8985,8 +9197,7 @@ "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" }, "require-from-string": { "version": "2.0.2", @@ -9058,7 +9269,6 @@ "version": "2.6.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "dev": true, "requires": { "glob": "^7.0.5" } @@ -9083,9 +9293,9 @@ } }, "rxjs": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.2.2.tgz", - "integrity": "sha512-0MI8+mkKAXZUF9vMrEoPnaoHkfzBPP4IGwUYRJhIRJF6/w3uByO1e91bEHn8zd43RdkTMKiooYKmwz7RH6zfOQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.0.0.tgz", + "integrity": "sha512-2MgLQr1zvks8+Kip4T6hcJdiBhV+SIvxguoWjhwtSpNPTp/5e09HJbgclCwR/nW0yWzhubM+6Q0prl8G5RuoBA==", "requires": { "tslib": "^1.9.0" } @@ -9109,74 +9319,141 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "sass-graph": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.4.tgz", - "integrity": "sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=", - "dev": true, - "optional": true, + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.5.tgz", + "integrity": "sha512-VFWDAHOe6mRuT4mZRd4eKE+d8Uedrk6Xnh7Sh9b4NGufQLQjOrvf/MQoOdx+0s92L89FeyUUNfU597j/3uNpag==", "requires": { "glob": "^7.0.0", "lodash": "^4.0.0", "scss-tokenizer": "^0.2.3", - "yargs": "^7.0.0" + "yargs": "^13.3.2" }, "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true, - "optional": true + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" }, "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, - "optional": true, + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" } }, - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", - "dev": true, - "optional": true + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.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==" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.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==" + }, + "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==" + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } }, "yargs": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", - "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", - "dev": true, - "optional": true, + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", "requires": { - "camelcase": "^3.0.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "os-locale": "^1.4.0", - "read-pkg-up": "^1.0.1", + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", + "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", - "string-width": "^1.0.2", - "which-module": "^1.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^5.0.0" + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" } }, "yargs-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", - "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", - "dev": true, - "optional": true, + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", "requires": { - "camelcase": "^3.0.0" + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" } } } @@ -9224,8 +9501,6 @@ "version": "0.2.3", "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", - "dev": true, - "optional": true, "requires": { "js-base64": "^2.1.8", "source-map": "^0.4.2" @@ -9235,8 +9510,6 @@ "version": "0.4.4", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "dev": true, - "optional": true, "requires": { "amdefine": ">=0.0.4" } @@ -9319,9 +9592,9 @@ } }, "send": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", - "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", "requires": { "debug": "2.6.9", "depd": "~1.1.2", @@ -9330,12 +9603,56 @@ "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "~1.6.2", - "mime": "1.4.1", - "ms": "2.0.0", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", "on-finished": "~2.3.0", - "range-parser": "~1.2.0", - "statuses": "~1.4.0" + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "http-errors": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", + "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + } } }, "serialize-javascript": { @@ -9360,14 +9677,21 @@ } }, "serve-static": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", - "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", "requires": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", - "parseurl": "~1.3.2", - "send": "0.16.2" + "parseurl": "~1.3.3", + "send": "0.17.1" + }, + "dependencies": { + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + } } }, "set-blocking": { @@ -9410,7 +9734,8 @@ "setprototypeof": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true }, "sha.js": { "version": "2.4.11", @@ -9491,9 +9816,9 @@ "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=" }, "slugify": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.3.1.tgz", - "integrity": "sha512-6BwyhjF5tG5P8s+0DPNyJmBSBePG6iMyhjvIW5zGdA3tFik9PtK+yNkZgTeiroCRGZYgkHftFA62tGVK1EI9Kw==" + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.4.5.tgz", + "integrity": "sha512-WpECLAgYaxHoEAJ8Q1Lo8HOs1ngn7LN7QjXgOLbmmfkcWvosyk4ZTXkTzKyhngK640USTZUlgoQJfED1kz5fnQ==" }, "smart-buffer": { "version": "1.1.15", @@ -9936,14 +10261,13 @@ "statuses": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", + "dev": true }, "stdout-stream": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.0.tgz", - "integrity": "sha1-osfIWH5U2UJ+qe2zrD8s1SLfN4s=", - "dev": true, - "optional": true, + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz", + "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==", "requires": { "readable-stream": "^2.0.1" } @@ -10047,7 +10371,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, "requires": { "is-utf8": "^0.2.0" } @@ -10062,7 +10385,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", - "dev": true, "requires": { "get-stdin": "^4.0.1" } @@ -10153,14 +10475,12 @@ "dev": true }, "tar": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", - "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", - "dev": true, - "optional": true, + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz", + "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==", "requires": { "block-stream": "*", - "fstream": "^1.0.2", + "fstream": "^1.0.12", "inherits": "2" } }, @@ -10231,9 +10551,9 @@ "optional": true }, "tiny-emitter": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.0.2.tgz", - "integrity": "sha512-2NM0auVBGft5tee/OxP4PI3d8WItkDM+fPnaRAVo6xTDI2knbz9eC5ArWGqtGlYqiH3RU5yMpdyTTO7MguC4ow==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", + "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==", "optional": true }, "tmp": { @@ -10301,6 +10621,11 @@ "repeat-string": "^1.6.1" } }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + }, "toposort": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.7.tgz", @@ -10332,8 +10657,7 @@ "trim-newlines": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", - "dev": true + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=" }, "trim-right": { "version": "1.0.1", @@ -10342,29 +10666,11 @@ "dev": true }, "true-case-path": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.2.tgz", - "integrity": "sha1-fskRMJJHZsf1c74wIMNPj9/QDWI=", - "dev": true, - "optional": true, + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz", + "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==", "requires": { - "glob": "^6.0.4" - }, - "dependencies": { - "glob": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", - "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", - "dev": true, - "optional": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } + "glob": "^7.1.2" } }, "ts-node": { @@ -10521,6 +10827,7 @@ "version": "1.6.16", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", + "dev": true, "requires": { "media-typer": "0.3.0", "mime-types": "~2.1.18" @@ -10988,9 +11295,9 @@ } }, "web-animations-js": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/web-animations-js/-/web-animations-js-2.3.1.tgz", - "integrity": "sha1-Om2bwVGWN3qQ+OKAP6UmIWWwRRA=" + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/web-animations-js/-/web-animations-js-2.3.2.tgz", + "integrity": "sha512-TOMFWtQdxzjWp8qx4DAraTWTsdhxVSiWa6NkPFSaPtZ1diKUxTn4yTix73A1euG1WbSOMMPcY51cnjTIHrGtDA==" }, "webassemblyjs": { "version": "1.4.3", @@ -11006,9 +11313,9 @@ } }, "webdriver-js-extender": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/webdriver-js-extender/-/webdriver-js-extender-2.0.0.tgz", - "integrity": "sha512-fbyKiVu3azzIc5d4+26YfuPQcFTlgFQV5yQ/0OQj4Ybkl4g1YQuIPskf5v5wqwRJhHJnPHthB6tqCjWHOKLWag==", + "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", @@ -11323,23 +11630,19 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, "requires": { "isexe": "^2.0.0" } }, "which-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", - "dev": true, - "optional": true + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" }, "wide-align": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "optional": true, "requires": { "string-width": "^1.0.2 || 2" } @@ -11459,13 +11762,13 @@ "dev": true }, "xml2js": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", - "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", "dev": true, "requires": { "sax": ">=0.6.0", - "xmlbuilder": "~9.0.1" + "xmlbuilder": "~11.0.0" }, "dependencies": { "sax": { @@ -11477,9 +11780,9 @@ } }, "xmlbuilder": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", - "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", "dev": true }, "xmlhttprequest-ssl": { @@ -11513,14 +11816,12 @@ "y18n": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", - "dev": true + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" }, "yallist": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" }, "yargs": { "version": "3.10.0", @@ -11568,9 +11869,9 @@ } }, "zone.js": { - "version": "0.8.26", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.8.26.tgz", - "integrity": "sha512-W9Nj+UmBJG251wkCacIkETgra4QgBo/vgoEkb4a2uoLzpQG7qF9nzwoLXWU5xj3Fg2mxGvEDh47mg24vXccYjA==" + "version": "0.8.29", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.8.29.tgz", + "integrity": "sha512-mla2acNCMkWXBD+c+yeUrBUrzOxYMNFdQ6FGfigGGtEVBPJx07BQeJekjt9DmH1FtZek4E9rE1eRR9qQpxACOQ==" } } } diff --git a/package.json b/package.json index 88923fc1f9ebf41e3625097cfa30d7d8e9742dd1..7017524ed15d4530dfe73ca58e3d90b904db58ba 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ }, "private": true, "dependencies": { - "@agm/core": "^1.0.0-beta.3", + "@agm/core": "^1.0.0", "@angular/animations": "6.0.4", "@angular/cdk": "^6.2.1", "@angular/cli": "6.0.8", @@ -21,35 +21,37 @@ "@angular/compiler": "6.0.4", "@angular/compiler-cli": "6.0.4", "@angular/core": "6.0.4", + "@angular/flex-layout": "^10.0.0-beta.32", "@angular/forms": "6.0.4", "@angular/http": "6.0.4", - "@angular/material": "^6.2.1", - "@angular/material-moment-adapter": "^6.3.0", + "@angular/material": "^6.4.7", + "@angular/material-moment-adapter": "^6.4.7", "@angular/platform-browser": "6.0.4", "@angular/platform-browser-dynamic": "6.0.4", "@angular/router": "6.0.4", "autoprefixer": "^8.6.2", "core-js": "^2.5.7", - "express": "^4.16.3", - "fuse.js": "^3.2.0", + "express": "^4.17.1", + "fuse.js": "^3.2.1", "hammerjs": "^2.0.8", "jump.js": "^1.0.2", "ng2-emoji": "^0.2.0", - "ngx-markdown": "^6.0.1", + "ngx-markdown": "^6.3.0", "ngx-moment": "^2.0.0", + "node-sass": "^4.14.1", "remove-markdown": "^0.2.2", - "rxjs": "^6.2.0", - "slugify": "^1.3.0", + "rxjs": "^6.0.0", + "slugify": "^1.4.5", "typescript": "2.7.2", - "web-animations-js": "^2.3.1", - "zone.js": "^0.8.26" + "web-animations-js": "^2.3.2", + "zone.js": "^0.8.29" }, "devDependencies": { "@angular-devkit/build-angular": "~0.6.8", "@types/jasmine": "2.5.38", - "@types/node": "~6.0.60", + "@types/node": "^6.0.118", "codelyzer": "~2.0.0", - "enhanced-resolve": "^4.0.0", + "enhanced-resolve": "^4.3.0", "jasmine-core": "~2.5.2", "jasmine-spec-reporter": "~3.2.0", "karma": "^2.0.2", @@ -58,7 +60,7 @@ "karma-coverage-istanbul-reporter": "^0.2.0", "karma-jasmine": "~1.1.0", "karma-jasmine-html-reporter": "^0.2.2", - "protractor": "^5.3.2", + "protractor": "^5.4.4", "ts-node": "~2.0.0", "tslint": "~4.5.0" }, diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts index ebc3214ce91830b8876620d274fce13fb9918781..a9a0140c340e79b1933bd9476dc669568f79a763 100644 --- a/src/app/app-routing.module.ts +++ b/src/app/app-routing.module.ts @@ -1,6 +1,8 @@ import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; import { LoginComponent } from './login/login.component'; +import { ResetComponent } from './reset/reset.component'; +import { ResetConfirmComponent} from './reset-confirm/reset-confirm.component'; import { UiGalleryComponent } from './shared'; import { InternalErrorComponent, NotFoundComponent, AuthGuard, MapsAPIResolver } from './core'; @@ -23,6 +25,14 @@ const routes: Routes = [ path: 'inscription', loadChildren: './signup/signup.module#SignupModule', }, + { + path: 'reinitialiser_mdp', + component: ResetComponent, + }, + { + path: 'rest-auth/password/reset/confirm/:uid/:token', + component: ResetConfirmComponent, + }, { path: '500', component: InternalErrorComponent, diff --git a/src/app/app.component.css b/src/app/app.component.css index fc2b98b5d8a2ff2a62b4af4667905278e9d2bd7f..df02f47cc0afc6e6c58709b3bbebe489e625a7b1 100644 --- a/src/app/app.component.css +++ b/src/app/app.component.css @@ -4,3 +4,4 @@ left: 0; width: 100vw; } + \ No newline at end of file diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 0a79000a449f1af148df3ee14ff6526719bb1653..2210e3c5d6d1421d7764bfea30907dd5b0383454 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -14,6 +14,7 @@ import { MomentModule } from 'ngx-moment'; import { MatFormFieldModule, MatInputModule, + MatOptionModule, MatSelectModule, MatButtonModule, MatRadioModule, @@ -34,6 +35,8 @@ import { LoginComponent } from './login/login.component'; // Services import { MessageService } from './core'; +import { ResetComponent } from './reset/reset.component'; +import { ResetConfirmComponent } from './reset-confirm/reset-confirm.component'; registerLocaleData(localeFR); @@ -41,6 +44,8 @@ registerLocaleData(localeFR); declarations: [ AppComponent, LoginComponent, + ResetComponent, + ResetConfirmComponent, ], imports: [ BrowserModule, @@ -56,6 +61,7 @@ registerLocaleData(localeFR); AppRoutingModule, MatFormFieldModule, MatInputModule, + MatOptionModule, MatSelectModule, MatRadioModule, MatButtonModule, diff --git a/src/app/core/auth/auth.service.ts b/src/app/core/auth/auth.service.ts index 52cec91f2858e664101be6c9b098f2babbfa341f..e7c506f92a021ccc02772f55aaef1367b4bca067 100644 --- a/src/app/core/auth/auth.service.ts +++ b/src/app/core/auth/auth.service.ts @@ -19,6 +19,8 @@ class StoredToken extends SimpleStoredItem { key = 'oser-cs-user-token'; } export class AuthService { private loginUrl = environment.apiUrl + 'auth/get-token/'; + private resetUrl = environment.apiUrl + 'rest-auth/password/reset/'; + private resetConfirmUrl = environment.apiUrl + 'rest-auth/password/reset/confirm/'; fromGuard: boolean; redirectUrl: string; @@ -45,6 +47,20 @@ export class AuthService { ); } + reset(email: string): Observable<boolean> { + console.log("reset function of auth service"); + return this.http.post<any>(this.resetUrl, { email }).pipe( + map(() => true), + ); + } + + resetConfirm(uid: string, token: string, new_password1: string, new_password2: string): Observable<boolean> { + console.log("reset confirm function"); + return this.http.post<any>(this.resetConfirmUrl, { uid, token, new_password1, new_password2 }).pipe( + map(() => true), + ); + } + redirectLogin() { this.router.navigate(['/connexion']); } diff --git a/src/app/login/login.component.html b/src/app/login/login.component.html index b670f762fb31e0e809b67eb7f1d557f6348edb46..58676ecb6fbf8c1b8c108b7f3414a7fbd5c3821a 100644 --- a/src/app/login/login.component.html +++ b/src/app/login/login.component.html @@ -19,7 +19,9 @@ Se connecter <i *ngIf="loading" class="fa fa-spinner fa-pulse"></i> </button> </div> - + <div class="text-center"> + <br> + <a routerLink="/reinitialiser_mdp">Mot de passe oublié ?</a></div> </form> <messages></messages> @@ -28,4 +30,4 @@ Ou crée ton <a routerLink="/inscription">compte tutoré</a> </p> -</app-form-page> +</app-form-page> \ No newline at end of file diff --git a/src/app/members/account/account-routing.module.ts b/src/app/members/account/account-routing.module.ts new file mode 100644 index 0000000000000000000000000000000000000000..64390455f1a502e50d69d835ec51f0cfb2bb630f --- /dev/null +++ b/src/app/members/account/account-routing.module.ts @@ -0,0 +1,45 @@ +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; + +//Components +import { AccountComponent } from './account.component'; +import {MyDataComponent} from './my-data/my-data.component' +import {EditDataComponent} from './edit-data/edit-data.component' +import {MyFileComponent} from './my-file/my-file.component' +import { PersonalDataResolver } from './core' + + +const routes: Routes = [ + { + path: '', + data: { title: 'Mon Compte' }, + component: AccountComponent, + children: [ + { + path: 'donnees', + component: MyDataComponent, + resolve : { + 'personalData' : PersonalDataResolver + }, + + }, + { + path: 'modifier_donnees', component: EditDataComponent, + resolve : { + 'personalData' : PersonalDataResolver + }, + + }, + // { + // path: 'mon_dossier', component: MyFileComponent, + + // } + ], + }, +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule] +}) +export class AccountRoutingModule { } diff --git a/src/app/members/account/account.component.html b/src/app/members/account/account.component.html new file mode 100644 index 0000000000000000000000000000000000000000..1838fd558330eb6d2434d9755057ec145526e316 --- /dev/null +++ b/src/app/members/account/account.component.html @@ -0,0 +1,8 @@ +<h1 class="text-center">Mon Compte</h1> +<div class="centered-links"> + <app-nav-group [links]="navLinks" theme="blue" [theme]="theme"></app-nav-group> +</div> + +<messages></messages> +<router-outlet></router-outlet> + diff --git a/src/app/members/account/account.component.scss b/src/app/members/account/account.component.scss new file mode 100644 index 0000000000000000000000000000000000000000..0ac99de35c01c69a3f9e14ff94ed4e4d521d6a75 --- /dev/null +++ b/src/app/members/account/account.component.scss @@ -0,0 +1,38 @@ +@import '~app/showcase-site/sass/mixins'; + +#page { + @include margin-page; +} + +$grid-gap: 1em; + +ul.tabs { + list-style-type: none; + margin: 0; + padding: 0; + display: flex; + flex-flow: row; + justify-content: space-around; + + text-align: center; + margin-bottom: 2em; + li { + padding: 1em; + cursor: pointer; + color: $color-muted; + font-weight: bold; + &:hover { + color: $color-text; + } + &.active { + color: $color-dark-blue; + } + } + border-bottom: 1px solid $color-light-gray; +} + +.centered-links{ + display:flex; + flex-direction: row; + justify-content: space-around; +} \ No newline at end of file diff --git a/src/app/members/account/account.component.ts b/src/app/members/account/account.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..b16b9250c03c4ac5ac5d15fb0026945dc5ca0cd4 --- /dev/null +++ b/src/app/members/account/account.component.ts @@ -0,0 +1,24 @@ +import { Component, OnInit,Input } from '@angular/core'; +import { Router } from '@angular/router'; +import { Link } from 'app/shared'; + +@Component({ + selector: 'app-account', + templateUrl: './account.component.html', + styleUrls: ['./account.component.scss'] +}) +export class AccountComponent implements OnInit { + @Input() theme: string; + constructor( private router: Router ) { } + + navLinks: Link[] = [ + { href: './donnees', text: 'Mes données' }, + { href: './modifier_donnees', text: 'Modifier mes données' }, + //{ href: './mon_dossier', text: 'Mon dossier' }, + + ]; + ngOnInit() { + this.router.navigate(['./membres/compte/modifier_donnees']) + } + +} diff --git a/src/app/members/account/account.module.ts b/src/app/members/account/account.module.ts new file mode 100644 index 0000000000000000000000000000000000000000..8d19200616ce6f02f7b5efd89ca1c32656396091 --- /dev/null +++ b/src/app/members/account/account.module.ts @@ -0,0 +1,80 @@ +import { NgModule } from '@angular/core'; + + +// Modules +import { CommonModule } from '@angular/common'; +import { FormsModule, ReactiveFormsModule} from '@angular/forms'; +import { RouterModule } from '@angular/router'; +import { AgmCoreModule } from '@agm/core'; +import { MomentModule } from 'ngx-moment'; +import { CoreModule } from 'app/core'; +import { SharedModule } from 'app/shared'; +import { AccountRoutingModule } from './account-routing.module'; + +import { + MatFormFieldModule, + MatInputModule, + MatSelectModule, + MatButtonModule, + MatSnackBarModule, + MatCheckboxModule, + MatIconModule, + MatSlideToggleModule, + MatTableModule, + MatDividerModule, + MatProgressBarModule, + MatDialogModule, + MatListModule, + +} from '@angular/material'; + +// Components +import {AccountComponent} from './account.component' +import {MyDataComponent} from './my-data/my-data.component' +import {EditDataComponent} from './edit-data/edit-data.component' +import {MyFileComponent} from './my-file/my-file.component' +import {UploadComponent} from './upload/upload.component' +import { StudentChartDialogComponent } from './upload/dialog/studentChartDialog.component' +import {ImageRightsDialogComponent} from './upload/dialog/imageRightsDialog.component' +import {ParentalAuthDialogComponent} from './upload/dialog/parentalAuthDialog.component' +@NgModule({ + imports: [ + CommonModule, + FormsModule, + MomentModule, + RouterModule, + AgmCoreModule, + CoreModule, + SharedModule, + AccountRoutingModule, + ReactiveFormsModule, + // Material + MatFormFieldModule, + MatSelectModule, + MatInputModule, + MatButtonModule, + MatSnackBarModule, + MatCheckboxModule, + MatIconModule, + MatSlideToggleModule, + MatTableModule, + MatDividerModule, + MatProgressBarModule, + MatButtonModule, + MatDialogModule, + MatListModule, + + ], + declarations: [ + AccountComponent, + MyDataComponent, + EditDataComponent, + MyFileComponent, + UploadComponent, + ParentalAuthDialogComponent, + ImageRightsDialogComponent, + StudentChartDialogComponent + ], + entryComponents:[ParentalAuthDialogComponent,ImageRightsDialogComponent,StudentChartDialogComponent] +}) +export class AccountModule { } diff --git a/src/app/members/account/core/index.ts b/src/app/members/account/core/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..93715acac06af7dd80f8a27a25ad5d95ca04bf7f --- /dev/null +++ b/src/app/members/account/core/index.ts @@ -0,0 +1,2 @@ +export * from './personal-data.model'; +export * from './personal-data.service'; diff --git a/src/app/members/account/core/personal-data.model.ts b/src/app/members/account/core/personal-data.model.ts new file mode 100644 index 0000000000000000000000000000000000000000..468eaa426b60e27c22ac48778cbd8ac1f53775be --- /dev/null +++ b/src/app/members/account/core/personal-data.model.ts @@ -0,0 +1,93 @@ +import { User, UserAdapter, IAdapter } from 'app/core'; + +export class PersonalDataSchema { + + + user_id: string; + url : string; + firstName:string; + lastName: string; + gender: string; + nationality: string; + addressNumber:number; + street:string; + zipCode:number; + city:string; + personalPhone:string; + parentsPhone:string; + parentsEmail:string; + school:string; + grade:string; + classType:string; + specialTeaching:string; + scholarship:string; + fatherActivity:string; + motherActivity:string; + parentsStatus:string; + dependantsNumber:number; +} + +export class PersonalData extends PersonalDataSchema { + + constructor(args: PersonalDataSchema) { + super(); + Object.assign(this, args); + } +} + +export class PersonalDataAdapter implements IAdapter<PersonalData> { + + private userAdapter = new UserAdapter(); + + adapt(data: any): PersonalData { + return new PersonalData({ + url : data.url, + user_id: data.user_id, + firstName: data.user.first_name, + lastName: data.user.last_name, + gender: data.gender?data.gender:'', + nationality : data.nationality?data.nationality:'', + addressNumber: data.addressNumber?data.addressNumber:'', + street:data.street?data.street:'', + zipCode:data.zipCode?data.zipCode:'', + city:data.city?data.city:'', + personalPhone:data.personalPhone?data.personalPhone:'', + parentsPhone:data.parentsPhone?data.parentsPhone:'', + parentsEmail:data.parentsEmail?data.parentsEmail:'', + school:data.school?data.school:'', + grade:data.grade?data.grade:'', + classType : data.classType?data.classType:'', + specialTeaching:data.specialTeaching?data.specialTeaching:'', + scholarship:data.scholarship?data.scholarship:'', + fatherActivity:data.fatherActivity?data.fatherActivity:'', + motherActivity:data.motherActivity?data.motherActivity:'', + parentsStatus:data.parentsStatus?data.parentsStatus:'', + dependantsNumber:data.dependantsNumber?data.dependantsNumber:'' + }); + } + + encode(obj: PersonalData): any { + return { + user_id: obj.user_id, + url : obj.url, + gender: obj.gender, + nationality: obj.nationality, + addressNumber: obj.addressNumber, + street:obj.street, + zipCode:obj.zipCode, + city:obj.city, + personalPhone:obj.personalPhone, + parentsPhone:obj.parentsPhone, + parentsEmail:obj.parentsEmail, + school:obj.school, + grade:obj.grade, + classType:obj.classType, + specialTeaching:obj.specialTeaching, + scholarship:obj.scholarship, + fatherActivity:obj.fatherActivity, + motherActivity:obj.motherActivity, + parentsStatus:obj.parentsStatus, + dependantsNumber:obj.dependantsNumber + } + } +} diff --git a/src/app/members/account/core/personal-data.service.ts b/src/app/members/account/core/personal-data.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..c5bf690deafbd8fca4db32385c14387391b0a667 --- /dev/null +++ b/src/app/members/account/core/personal-data.service.ts @@ -0,0 +1,76 @@ +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { Resolve,ActivatedRouteSnapshot } from '@angular/router'; +import { Observable, of, forkJoin } from 'rxjs'; +import { tap, map, filter,catchError } from 'rxjs/operators'; +import { ApiService, AuthService,} from 'app/core'; +import {PersonalDataAdapter,PersonalData} from './personal-data.model' + + +@Injectable({ + providedIn: 'root' +}) +export class PersonalDataService extends ApiService { + + //api url + private baseUrl = this.apiUrl + 'students'; + private adapter = new PersonalDataAdapter(); + + constructor( + private http: HttpClient, + private auth: AuthService + ) { super(); } + + //get personalData by user + get(filters: any): Observable<PersonalData> { + const url = this.baseUrl; + return this.http.get(url, { params: filters }).pipe( + map((data: any) => { + + return data.map(item => this.adapter.adapt(item))}), + ); + } + retrieve(id: number | string): Observable<PersonalData> { + let url = this.baseUrl; + return this.http.get<PersonalData>(url).pipe( + map(v =>{ + if(v instanceof Array){ + if (v.length>1){ + return this.adapter.adapt(v.find((user)=>user.user_id===id)) + } + return this.adapter.adapt(v[0]) + } + + }), + ); + } + + forUser(userId: number): Observable<PersonalData> { + return this.get({ user_id: String(userId)}); + } + //edit personalData for a user + edit(personalData: PersonalData): Observable<any> { + + const body: any = this.adapter.encode(personalData); + return this.http.put(personalData.url, body); + } +} + +@Injectable({ + providedIn: 'root' + }) +export class PersonalDataResolver implements Resolve<PersonalData>{ + + constructor(private service: PersonalDataService, private auth: AuthService) { } + //fetch user + + resolve(route: ActivatedRouteSnapshot): Observable<PersonalData> { + const user = this.auth.getUserSnapshot(); + return this.service.retrieve(user.id).pipe( + catchError(e => of(null)) + ); + + } +} + + diff --git a/src/app/members/account/edit-data/edit-data.component.html b/src/app/members/account/edit-data/edit-data.component.html new file mode 100644 index 0000000000000000000000000000000000000000..faf76ca44b3114ffa8696554d857b62676649659 --- /dev/null +++ b/src/app/members/account/edit-data/edit-data.component.html @@ -0,0 +1,159 @@ +<app-form-page> + <form [formGroup]="formGroup" (ngSubmit)="submit()"> + <h2>Modifier mes données personnelles</h2> + <p class="text-center">Informations personnelles</p> + <mat-form-field class="full-width" > + <input matInput type="text" formControlName="firstName" placeholder="Prénom" required> + </mat-form-field> + <mat-form-field class="full-width" > + <input matInput type="text" formControlName="lastName" placeholder="Nom" required> + </mat-form-field> + + <div class="form-group"> + <mat-form-field class="horizontal-display"> + <mat-label>Sexe</mat-label> + <mat-select formControlName="gender" required> + <mat-option value="Homme">Homme</mat-option> + <mat-option value="Femme" >Femme</mat-option> + <mat-option value="Autre">Autre</mat-option> + </mat-select> + </mat-form-field> + <mat-form-field class="horizontal-display" > + <input matInput type="text" formControlName="nationality" placeholder="Nationalité" required> + </mat-form-field> + </div> + + <p class="text-center">Adresse</p> + <div class="form-group"> + <mat-form-field class="full-width address-input quarter-display"> + <input matInput type="text" formControlName="addressNumber" placeholder="Numéro de rue" required> + </mat-form-field> + <mat-form-field class="full-width address-input"> + <input matInput type="text" formControlName="street" placeholder="Rue" required> + </mat-form-field> + </div> + + <div class="form-group"> + <mat-form-field class="full-width address-input quarter-display"> + <input matInput type="text" minlength="5" maxlength="5" formControlName="zipCode" placeholder="Code postal" required> + <mat-error *ngIf="formGroup.controls['city'].hasError('pattern')"> + Vous devez rentrer un code postal correct + </mat-error> + </mat-form-field> + + <mat-form-field class="full-width address-input" > + <input matInput type="text" formControlName="city" placeholder="Ville" required> + </mat-form-field> + </div> + <p class="text-center">Informations de contact</p> + <mat-form-field class="full-width" > + <input matInput type="text" formControlName="personalPhone" placeholder="Numéro de téléphone personnel" required> + </mat-form-field> + <mat-form-field class="full-width" > + <input matInput type="text" formControlName="parentsPhone" placeholder="Numéro de téléphone des parents" required> + </mat-form-field> + + <mat-form-field class="full-width" > + <input matInput type="text" formControlName="parentsEmail" placeholder="Email des parents" required> + </mat-form-field> + + <p class="text-center">Informations scolaires</p> + + <mat-form-field class="full-width" > + <mat-label>Etablissement </mat-label> + <mat-select formControlName="school" required> + <mat-option *ngFor="let school of possibleSchools" [value]="school.id">{{ school.name }}</mat-option> + </mat-select> + </mat-form-field> + <mat-form-field class="full-width" > + <input matInput required type="text" formControlName="specialTeaching" placeholder="Enseignements de spécialité (entrer 'aucun' si jamais vous n'etes pas concerné)" > + </mat-form-field> + <div class="form-group"> + <mat-form-field class="horizontal-display"> + <mat-label>Classe</mat-label> + <mat-select formControlName="grade" required> + <mat-option value="troisieme">Troisième</mat-option> + <mat-option value="seconde">Seconde</mat-option> + <mat-option value="premiere" >Première</mat-option> + <mat-option value="terminale">Terminale</mat-option> + </mat-select> + </mat-form-field> + + <mat-form-field class="horizontal-display horizontal-center"> + <mat-label>Voie</mat-label> + <mat-select formControlName="classType" required> + <mat-option value="General">General</mat-option> + <mat-option value="Technologique">Technologique</mat-option> + </mat-select> + </mat-form-field> + + <mat-form-field class="horizontal-display"> + <mat-label>Boursier </mat-label> + <mat-select formControlName="scholarship" required> + <mat-option *ngFor="let scholarship of possibleScholarships" [value]="scholarship.id">{{ scholarship.name }}</mat-option> + </mat-select> + </mat-form-field> + + </div> + + + + <p class="text-center">Informations parentales</p> + <div class="form-group"> + <mat-form-field class="horizontal-display"> + <mat-label>Activité de la mère </mat-label> + <mat-select formControlName="motherActivity" required> + <mat-option *ngFor="let activity of possibleParentsActivities" [value]="activity.id">{{ activity.name }}</mat-option> + </mat-select> + </mat-form-field> + + <mat-form-field class="horizontal-display"> + <mat-label>Activité du père </mat-label> + <mat-select formControlName="fatherActivity" required> + <mat-option *ngFor="let activity of possibleParentsActivities" [value]="activity.id">{{ activity.name }}</mat-option> + </mat-select> + </mat-form-field> + </div> + + <div class="form-group"> + <mat-form-field class="horizontal-display"> + <mat-label>Statut des parents </mat-label> + <mat-select formControlName="parentsStatus" required > + <mat-option *ngFor="let status of possibleParentsStatus" [value]="status.id">{{ status.name }}</mat-option> + </mat-select> + </mat-form-field> + + <mat-form-field class="horizontal-display" > + <input matInput type="number" formControlName="dependantsNumber" placeholder="Nombre de personnes à charge" required> + </mat-form-field> + </div> + <p> + <small> + Données personnelles : nous utiliserons les données fournies pour assurer le contact avec toi et ta famille, + équilibrer les participations aux activités organisées ainsi qu'à des fins d'aggrégation anonymisée + (statistiques, demandes de subvention). Plus d'informations dans nos <a routerLink="/mentions-legales" + target="_blank">mentions légales</a>. + </small> + </p> + + <p> + J'accepte qu'OSER utilise mes données personnelles fournies ci-dessus ou dans le formulaire d'inscription + administrative, dans le strict respect du cadre spécifié ci-dessus : + </p> + + <mat-checkbox class="checkbox-field" formControlName="acceptedConditions" required > + J'accepte cette utilisation + </mat-checkbox> + + <div class="text-center"> + <button mat-raised-button color="primary" [disabled]="!formGroup.valid || loading"> + Modifier + <app-load-spinner *ngIf="loading" [block]="false"></app-load-spinner> + </button> + </div> + <p class="text-center">{{error}}</p> + <p class="text-center post-edit-text">{{postEditMessage}}</p> + </form> +</app-form-page> +<messages></messages> +<router-outlet></router-outlet> diff --git a/src/app/members/account/edit-data/edit-data.component.scss b/src/app/members/account/edit-data/edit-data.component.scss new file mode 100644 index 0000000000000000000000000000000000000000..f99e2b9c3baabbf455adbd54bdc198f78604ff07 --- /dev/null +++ b/src/app/members/account/edit-data/edit-data.component.scss @@ -0,0 +1,32 @@ +.checkbox-field { + display: block; + margin: .5em 0; + } + .form-group{ + display:flex; + flex-direction: row; + justify-content: space-between; + } + .horizontal-display{ + width:45%; + } + .address-input{ + margin:5px; + } + + .quarter-display{ + width:25%; + } + + .horizontal-center{ + margin: 0 10px; + } + + .checkbox-field { + display: block; + margin: .5em 0; + } + + .post-edit-text{ + color:green; + } \ No newline at end of file diff --git a/src/app/members/account/edit-data/edit-data.component.ts b/src/app/members/account/edit-data/edit-data.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..9bd2489410fc184120f94b0917d3def99865de16 --- /dev/null +++ b/src/app/members/account/edit-data/edit-data.component.ts @@ -0,0 +1,141 @@ +import { Component, OnInit } from '@angular/core'; +import { FormGroup, FormBuilder, Validators } from '@angular/forms'; +import { Router } from '@angular/router'; +import { MatSnackBar } from '@angular/material'; +import {ActivatedRoute} from '@angular/router' +import { PersonalData,PersonalDataService } from '../core'; +import { tap, mergeMap } from 'rxjs/operators'; +import { AuthService } from 'app/core'; +import {User} from 'app/core' + + + +@Component({ + selector: 'app-edit-data', + templateUrl: './edit-data.component.html', + styleUrls: ['./edit-data.component.scss'] +}) +export class EditDataComponent implements OnInit { + personalData: PersonalData; + formGroup : FormGroup; + loading = false; + public error : String = ""; + public postEditMessage : String = "" ; + public possibleParentsStatus = [ + {id:"Mariés",name:"Mariés"}, + {id:"Divorcés",name:"Divorcés"}, + {id:"En concubinage",name:"En concubinage"}, + {id:"Famille Monoparentale",name:"Famille monoparentale"} + ] + + public possibleParentsActivities = [ + {id:"Agriculteur",name:"Agriculteur"}, + {id:"Artisan, commerçant, chef d'entreprise",name:"Artisan, commerçant, chef d'entreprise"}, + {id:"Cadre, profession intellectuelle supérieure",name:"Cadre, profession intellectuelle supérieure"}, + {id:"Enseignant et assimilé",name:"Enseignant et assimilé"}, + {id:"Profession intermédiaire",name:"Profession intermédiaire"}, + {id:"Employé",name:"Employé"}, + {id:"Ouvrier",name:"Ouvrier"}, + {id:"Retraité",name:"Retraité"}, + {id:"Inactif",name:"Inactif"}, + {id:"Autre",name:"Autre"} + ] + + public possibleSchools = [ + {id:"Jean Perrin (Longjumeau)", name:"Jean Perrin (Longjumeau)"}, + {id:"Robert Doisneau (Corbeil-Essonnes)",name:"Robert Doisneau (Corbeil-Essonnes)"}, + {id:"Henri Matisse (Montreuil)",name:"Henri Matisse (Montreuil)"}, + {id:"Jean Jaurès (Montreuil)",name:"Jean Jaurès (Montreuil)"}, + {id:"Charles Péguy (Bobigny)",name:"Charles Péguy (Bobigny)"}, + {id:"Jean Jaurès (Chatenay-Malabry)",name:"Jean Jaurès (Chatenay-Malabry)"}, + {id:"Parc des Loges (Evry)",name:"Parc des Loges (Evry)"}, + {id:"Jean-Baptiste Corot (Savigny-sur-Orge)",name:"Jean-Baptiste Corot (Savigny-sur-Orge)"}, + {id:"Gaspard Monge (Savigny-sur-Orge)",name:"Gaspard Monge (Savigny-sur-Orge)"}, + ] + + public possibleScholarships = [ + {id:"echelon1",name:"Oui, échelon 1"}, + {id:"echelon2",name:"Oui, échelon 2"}, + {id:"echelon3",name:"Oui, échelon 3"}, + {id:"echelon4",name:"Oui, échelon 4"}, + {id:"echelon5",name:"Oui, échelon 5"}, + {id:"echelon6",name:"Oui, échelon 6"}, + {id:"echelon7",name:"Oui, échelon 7"}, + {id:"no",name:"Non"}, + ] + + + + constructor( + private route: ActivatedRoute, + private personalDataService : PersonalDataService, + private formBuilder: FormBuilder, + private router: Router, + private auth: AuthService, + private snackBar: MatSnackBar, + + ) { } + + + ngOnInit() { + this.personalData = this.route.snapshot.data['personalData']; + this.createForm() + } + + + createForm() { + + this.formGroup = this.formBuilder.group({ + firstName:this.personalData.firstName, + lastName:this.personalData.lastName, + gender:this.personalData.gender, + nationality : this.personalData.nationality, + addressNumber:[this.personalData.addressNumber,Validators.pattern("^[0-9]*$")], + street:this.personalData.street, + zipCode:this.personalData.zipCode, + city:this.personalData.city, + personalPhone:[this.personalData.personalPhone,Validators.pattern("^[0-9, ]*[0-9, ]{10}$")], + parentsPhone:this.personalData.parentsPhone, + parentsEmail:[this.personalData.parentsEmail,Validators.email], + school:this.personalData.school, + grade:this.personalData.grade, + classType : this.personalData.classType, + specialTeaching:this.personalData.specialTeaching, + scholarship:this.personalData.scholarship, + fatherActivity:this.personalData.fatherActivity, + motherActivity:this.personalData.motherActivity, + parentsStatus:this.personalData.parentsStatus, + dependantsNumber:this.personalData.dependantsNumber, + acceptedConditions: false + }) + + } + + submit(){ + this.loading = true; + const {firstName,lastName,gender,nationality,classType,addressNumber,street,zipCode,city,personalPhone,parentsPhone,parentsEmail,school,grade,specialTeaching,scholarship,fatherActivity,motherActivity,parentsStatus,dependantsNumber} = this.formGroup.value; + const personalData: PersonalData = {...this.personalData,classType,firstName,lastName,gender,nationality,addressNumber,street,zipCode,city,personalPhone,parentsPhone,parentsEmail,school,grade,specialTeaching,scholarship,fatherActivity,motherActivity,parentsStatus,dependantsNumber}; + + this.personalDataService.edit(personalData).pipe( + tap(() => this.loading = false), + tap(()=> this.error = ""), + tap(() => { + this.postEditMessage = "Merci d'avoir completé tes données personnelles ! Nous allons t'envoyer un email contenant le lien vers le dossier d'inscription, si tu ne le reçois pas, pense à vérifier tes spams." + setTimeout(()=>{ + this.router.navigate(['./membres/compte/donnees']) + this.postEditMessage = "" + },7000) + + }), + ).subscribe( + () => {}, + (error) => { + this.error = "Erreur lors de la modification des données" + this.loading = false + }, + ); + + } + + +} diff --git a/src/app/members/account/my-data/my-data.component.html b/src/app/members/account/my-data/my-data.component.html new file mode 100644 index 0000000000000000000000000000000000000000..d17a78139d79381b6ed2138e4ea12dfa2e78e330 --- /dev/null +++ b/src/app/members/account/my-data/my-data.component.html @@ -0,0 +1,33 @@ +<app-form-page> + <h2>Mes données</h2> + <p><span class='label'>Prénom : </span>{{personalData.firstName}} </p> + <p><span class='label'>Nom : </span>{{personalData.lastName}}</p> + <p><span class='label'>Sexe : </span>{{personalData.gender}}</p> + <p><span class='label'>Nationalité : </span>{{personalData.nationality}}</p> + <mat-divider></mat-divider> + <p> <span class='label'>Adresse : </span>{{personalData.addressNumber}} {{personalData.street}} {{personalData.zipCode}}, {{personalData.city}}</p> + <mat-divider></mat-divider> + <p><span class='label'>Numéro de téléphone personnel : </span>{{personalData.personalPhone}}</p> + <p><span class='label'>Numéro de téléphone des parents : </span>{{personalData.parentsPhone}}</p> + <p><span class='label'>Email des parents : </span>{{personalData.parentsEmail}}</p> + <mat-divider></mat-divider> + <p><span class='label'>Etablissement : </span>{{personalData.school}}</p> + <p><span class='label'>Classe : </span>{{grade[personalData.grade]}}</p> + <p><span class='label'>Voie : </span>{{[personalData.classType]}}</p> + <p><span class='label'>Enseignement de spécialité : </span>{{personalData.specialTeaching}}</p> + <p><span class='label'>Boursier : </span>{{scholarship[personalData.scholarship]}}</p> + <mat-divider></mat-divider> + <p><span class='label'>Activité du père : </span>{{personalData.fatherActivity}}</p> + + <p><span class='label'>Activité de la mère : </span>{{personalData.motherActivity}}</p> + <p><span class='label'>Statut des parents : </span>{{personalData.parentsStatus}}</p> + <p><span class='label'>Nombre de personnes à charge : </span>{{personalData.dependantsNumber}}</p> + <div class="text-center"> + <button mat-raised-button color="primary" (click)="editData()" ><mat-icon aria-hidden="false" aria-label="Example home icon">edit</mat-icon>Modifier mes données</button> + </div> + +</app-form-page> +<messages></messages> +<router-outlet></router-outlet> + + \ No newline at end of file diff --git a/src/app/members/account/my-data/my-data.component.scss b/src/app/members/account/my-data/my-data.component.scss new file mode 100644 index 0000000000000000000000000000000000000000..80c01087c041cb2478c88bbd9577c9037b6cb8e2 --- /dev/null +++ b/src/app/members/account/my-data/my-data.component.scss @@ -0,0 +1,4 @@ +.label{ + color:grey; + font-weight: 600; +} \ No newline at end of file diff --git a/src/app/members/account/my-data/my-data.component.ts b/src/app/members/account/my-data/my-data.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..cf04c137f8fb73ee21894fa5afbf2b03dcaee093 --- /dev/null +++ b/src/app/members/account/my-data/my-data.component.ts @@ -0,0 +1,52 @@ +import { Component, OnInit } from '@angular/core'; +import {ActivatedRoute,Router} from '@angular/router' +import {PersonalData} from '../core' +import {User} from 'app/core' + +@Component({ + selector: 'app-my-data', + templateUrl: './my-data.component.html', + styleUrls: ['./my-data.component.scss'] +}) +export class MyDataComponent implements OnInit { + + personalData: PersonalData; + + + public grade = { + "troisieme": "Troisième", + "seconde":"Seconde", + "premiere":"Première", + "terminale":"Terminale" + + } + public scholarship = { + "echelon0": "Oui, échelon 0", + "echelon1": "Oui, échelon 1", + "echelon2": "Oui, échelon 2", + "echelon3": "Oui, échelon 3", + "echelon4": "Oui, échelon 4", + "echelon5": "Oui, échelon 5", + "echelon6": "Oui, échelon 6", + "echelon7": "Oui, échelon 7", + "no" : "Non" + + } + + + + public editData = ()=> { + this.router.navigate(['./membres/compte/modifier_donnees']) + } + + + + constructor(private route: ActivatedRoute, private router:Router) { } + + ngOnInit() { + + this.personalData = this.route.snapshot.data['personalData']; + + } + +} diff --git a/src/app/members/account/my-file/my-file.component.html b/src/app/members/account/my-file/my-file.component.html new file mode 100644 index 0000000000000000000000000000000000000000..df34468e7b5f934ba219daf392d08b4729539521 --- /dev/null +++ b/src/app/members/account/my-file/my-file.component.html @@ -0,0 +1,8 @@ +<app-form-page> + <h1>Mon dossier</h1> + <app-upload-file></app-upload-file> +</app-form-page> +<messages></messages> +<router-outlet></router-outlet> + + \ No newline at end of file diff --git a/src/app/members/account/my-file/my-file.component.scss b/src/app/members/account/my-file/my-file.component.scss new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/src/app/members/account/my-file/my-file.component.ts b/src/app/members/account/my-file/my-file.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..723e2d51532d0a4cdbafdc5a72ad5e81cb67e1f2 --- /dev/null +++ b/src/app/members/account/my-file/my-file.component.ts @@ -0,0 +1,17 @@ +import { Component, OnInit } from '@angular/core'; +import {ActivatedRoute} from '@angular/router' +import {UploadComponent} from '../upload/upload.component' +import {PersonalData} from '../core' +@Component({ + selector: 'app-my-file', + templateUrl: './my-file.component.html', + styleUrls: ['./my-file.component.scss'] +}) +export class MyFileComponent implements OnInit { + + + + constructor(private route: ActivatedRoute) { } + + ngOnInit() {} +} diff --git a/src/app/members/account/my-file/my-file.module.ts b/src/app/members/account/my-file/my-file.module.ts new file mode 100644 index 0000000000000000000000000000000000000000..8d14e3ec6e3ede19e17dc223a71dfcb1368472a1 --- /dev/null +++ b/src/app/members/account/my-file/my-file.module.ts @@ -0,0 +1,13 @@ +import { NgModule } from '@angular/core' +import { CommonModule } from '@angular/common' +import { UploadModule } from '../upload/upload.module' +import {UploadComponent} from '../upload/upload.component' +import {MyFileComponent} from './my-file.component' + +@NgModule({ + imports : [], + declarations: [], + entryComponents:[UploadComponent] + +}) +export class MyFileModule {} \ No newline at end of file diff --git a/src/app/members/account/upload/dialog/dialog.component.html b/src/app/members/account/upload/dialog/dialog.component.html new file mode 100644 index 0000000000000000000000000000000000000000..f3d15c7f6d75d357b94c75211485405f1a2d192b --- /dev/null +++ b/src/app/members/account/upload/dialog/dialog.component.html @@ -0,0 +1,48 @@ +<input + type="file" + #file + style="display: none" + (change)="onFilesAdded()" + single +/> +<div class="container" fxLayout="column" fxLayoutAlign="space-evenly stretch"> + <h1 mat-dialog-title>Déposer un fichier</h1> + <div> + <button + [disabled]="uploading || uploadSuccessful" + mat-raised-button + color="primary" + class="add-files-btn" + (click)="addFiles()" + > + Ajouter un fichier + </button> + </div> + + <!-- This is the content of the dialog, containing a list of the files to upload --> + <mat-dialog-content fxFlex> + <mat-list> + <mat-list-item *ngFor="let file of files"> + <h4 mat-line>{{file.name}}</h4> + <mat-progress-bar + *ngIf="progress" + mode="determinate" + [value]="progress[file.name].progress | async" + ></mat-progress-bar> + </mat-list-item> + </mat-list> + </mat-dialog-content> + + <!-- This are the actions of the dialog, containing the primary and the cancel button--> + <mat-dialog-actions class="actions"> + <button *ngIf="showCancelButton" mat-button mat-dialog-close>Annuler</button> + <button + mat-raised-button + color="primary" + [disabled]="!canBeClosed" + (click)="closeDialog()" + > + {{primaryButtonText}} + </button> + </mat-dialog-actions> +</div> \ No newline at end of file diff --git a/src/app/members/account/upload/dialog/dialog.component.scss b/src/app/members/account/upload/dialog/dialog.component.scss new file mode 100644 index 0000000000000000000000000000000000000000..88e5de70b6d2237538270ce9b56cbd78d2ac5f6a --- /dev/null +++ b/src/app/members/account/upload/dialog/dialog.component.scss @@ -0,0 +1,17 @@ + + + :host { + height: 100%; + display: flex; + flex: 1; + flex-direction: column; + } + + .actions { + justify-content: flex-end; + float:bottom; + } + + .container { + height: 100%; + } \ No newline at end of file diff --git a/src/app/members/account/upload/dialog/imageRightsDialog.component.ts b/src/app/members/account/upload/dialog/imageRightsDialog.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..610713b56495b0853e16ad41bc491fc1396652e3 --- /dev/null +++ b/src/app/members/account/upload/dialog/imageRightsDialog.component.ts @@ -0,0 +1,82 @@ +import { Component, OnInit, ViewChild } from '@angular/core' +import { MatDialogRef } from '@angular/material' +import { UploadService } from '../upload.service' +import { forkJoin } from 'rxjs' + +@Component({ + selector: 'app-dialog', + templateUrl: './dialog.component.html', + styleUrls: ['./dialog.component.scss'], +}) + +export class ImageRightsDialogComponent{ + constructor(public dialogRef : MatDialogRef<ImageRightsDialogComponent>, public uploadService : UploadService) { } + @ViewChild('file') file + public files: Set<File> = new Set() + progress + canBeClosed = true + primaryButtonText = 'Envoyer' + showCancelButton = true + uploading = false + uploadSuccessful = false + + addFiles() { + this.file.nativeElement.click(); + } + + onFilesAdded() { + console.log(this.file.nativeElement.files) + const files: { [key: string]: File } = this.file.nativeElement.files; + for (let key in files) { + if (!isNaN(parseInt(key))) { + this.files.clear() + this.files.add(files[key]); + } + } + } + + + closeDialog() { + // if everything was uploaded already, just close the dialog + if (this.uploadSuccessful) { + return this.dialogRef.close(); + } + + // set the component state to "uploading" + this.uploading = true; + + // start the upload and save the progress map + this.progress = this.uploadService.upload(this.files,"image"); + + // convert the progress map into an array + let allProgressObservables = []; + for (let key in this.progress) { + allProgressObservables.push(this.progress[key].progress); + } + + // Adjust the state variables + + // The OK-button should have the text "Finish" now + this.primaryButtonText = 'Terminer'; + + // The dialog should not be closed while uploading + this.canBeClosed = false; + this.dialogRef.disableClose = true; + + // Hide the cancel-button + this.showCancelButton = false; + + // When all progress-observables are completed... + forkJoin(allProgressObservables).subscribe(end => { + // ... the dialog can be closed again... + this.canBeClosed = true; + this.dialogRef.disableClose = false; + + // ... the upload was successful... + this.uploadSuccessful = true; + + // ... and the component is no longer uploading + this.uploading = false; + }); + } + } \ No newline at end of file diff --git a/src/app/members/account/upload/dialog/parentalAuthDialog.component.ts b/src/app/members/account/upload/dialog/parentalAuthDialog.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..c2a038b9750aa846a270ed5e9c85f62b3fbd0ce3 --- /dev/null +++ b/src/app/members/account/upload/dialog/parentalAuthDialog.component.ts @@ -0,0 +1,84 @@ +import { Component, OnInit, ViewChild } from '@angular/core' +import { MatDialogRef } from '@angular/material' +import { UploadService } from '../upload.service' +import { forkJoin } from 'rxjs' + +@Component({ + selector: 'app-dialog', + templateUrl: './dialog.component.html', + styleUrls: ['./dialog.component.scss'], +}) + +export class ParentalAuthDialogComponent { + constructor(public dialogRef : MatDialogRef<ParentalAuthDialogComponent>, public uploadService : UploadService) { } + @ViewChild('file') file + public files: Set<File> = new Set() + progress + canBeClosed = true + primaryButtonText = 'Envoyer' + showCancelButton = true + uploading = false + uploadSuccessful = false + + addFiles() { + this.file.nativeElement.click(); + } + + onFilesAdded() { + console.log(this.file.nativeElement.files) + const files: { [key: string]: File } = this.file.nativeElement.files; + for (let key in files) { + if (!isNaN(parseInt(key))) { + this.files.clear() + this.files.add(files[key]); + } + } + } + + + closeDialog() { + // if everything was uploaded already, just close the dialog + if (this.uploadSuccessful) { + return this.dialogRef.close(); + } + + // set the component state to "uploading" + this.uploading = true; + + // start the upload and save the progress map + this.progress = this.uploadService.upload(this.files,"parental"); + + // convert the progress map into an array + let allProgressObservables = []; + for (let key in this.progress) { + allProgressObservables.push(this.progress[key].progress); + } + + // Adjust the state variables + + // The OK-button should have the text "Finish" now + this.primaryButtonText = 'Terminer'; + + // The dialog should not be closed while uploading + this.canBeClosed = false; + this.dialogRef.disableClose = true; + + // Hide the cancel-button + this.showCancelButton = false; + + // When all progress-observables are completed... + forkJoin(allProgressObservables).subscribe(end => { + // ... the dialog can be closed again... + this.canBeClosed = true; + this.dialogRef.disableClose = false; + + // ... the upload was successful... + this.uploadSuccessful = true; + + // ... and the component is no longer uploading + this.uploading = false; + }); + } + } + + \ No newline at end of file diff --git a/src/app/members/account/upload/dialog/studentChartDialog.component.ts b/src/app/members/account/upload/dialog/studentChartDialog.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..f2b3ff6d83267173205633d086693765f181e8cb --- /dev/null +++ b/src/app/members/account/upload/dialog/studentChartDialog.component.ts @@ -0,0 +1,87 @@ +import { Component, OnInit, ViewChild } from '@angular/core' +import { MatDialogRef } from '@angular/material' +import { UploadService } from '../upload.service' +import { forkJoin } from 'rxjs' + +@Component({ + selector: 'app-dialog', + templateUrl: './dialog.component.html', + styleUrls: ['./dialog.component.scss'], +}) + + + + + +export class StudentChartDialogComponent { + constructor(public dialogRef : MatDialogRef<StudentChartDialogComponent>, public uploadService : UploadService) { } + @ViewChild('file') file + public files: Set<File> = new Set() + progress + canBeClosed = true + primaryButtonText = 'Envoyer' + showCancelButton = true + uploading = false + uploadSuccessful = false + + addFiles() { + this.file.nativeElement.click(); + } + + onFilesAdded() { + console.log(this.file.nativeElement.files) + const files: { [key: string]: File } = this.file.nativeElement.files; + for (let key in files) { + if (!isNaN(parseInt(key))) { + this.files.clear() + this.files.add(files[key]); + } + } + } + + + closeDialog() { + // if everything was uploaded already, just close the dialog + if (this.uploadSuccessful) { + return this.dialogRef.close(); + } + + // set the component state to "uploading" + this.uploading = true; + + // start the upload and save the progress map + this.progress = this.uploadService.upload(this.files,"chart"); + + // convert the progress map into an array + let allProgressObservables = []; + for (let key in this.progress) { + allProgressObservables.push(this.progress[key].progress); + } + + // Adjust the state variables + + // The OK-button should have the text "Finish" now + this.primaryButtonText = 'Terminer'; + + // The dialog should not be closed while uploading + this.canBeClosed = false; + this.dialogRef.disableClose = true; + + // Hide the cancel-button + this.showCancelButton = false; + + // When all progress-observables are completed... + forkJoin(allProgressObservables).subscribe(end => { + // ... the dialog can be closed again... + this.canBeClosed = true; + this.dialogRef.disableClose = false; + + // ... the upload was successful... + this.uploadSuccessful = true; + + // ... and the component is no longer uploading + this.uploading = false; + }); + } +} + diff --git a/src/app/members/account/upload/upload.component.html b/src/app/members/account/upload/upload.component.html new file mode 100644 index 0000000000000000000000000000000000000000..69120155c9f3ed37fb033da0ca8f5eb99b0ff4b7 --- /dev/null +++ b/src/app/members/account/upload/upload.component.html @@ -0,0 +1,4 @@ +<h3>Charte de l'éleve</h3><button mat-raised-button (click)="openStudentChartDialog()">Déposer le fichier</button> +<h3>Autorisation parentale</h3><button mat-raised-button (click)="openParentalAuthDialog()">Déposer le fichier</button> +<h3>Droit à l'image</h3><button mat-raised-button (click)="openImageRightsDialog()">Déposer le fichier</button> +<h3>Statut du dossier : </h3> \ No newline at end of file diff --git a/src/app/members/account/upload/upload.component.scss b/src/app/members/account/upload/upload.component.scss new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/src/app/members/account/upload/upload.component.ts b/src/app/members/account/upload/upload.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..374e0effdd6f75faf9dbc4079cce28587ea2bd92 --- /dev/null +++ b/src/app/members/account/upload/upload.component.ts @@ -0,0 +1,34 @@ +import { Component } from '@angular/core' +import { MatDialog } from '@angular/material' +import {StudentChartDialogComponent } from './dialog/studentChartDialog.component' +import {ParentalAuthDialogComponent} from './dialog/parentalAuthDialog.component' +import {ImageRightsDialogComponent} from './dialog/imageRightsDialog.component' +import { UploadService } from './upload.service' + +@Component({ + selector: 'app-upload-file', + templateUrl: './upload.component.html', + styleUrls: ['./upload.component.scss'], +}) +export class UploadComponent { + constructor(public dialog: MatDialog, public uploadService: UploadService) {} + + public openStudentChartDialog() { + let dialogRef = this.dialog.open(StudentChartDialogComponent, { + width: '50%', + height: '50%', + }) + } + public openParentalAuthDialog() { + let dialogRef = this.dialog.open(ParentalAuthDialogComponent, { + width: '50%', + height: '50%', + }) + } + public openImageRightsDialog() { + let dialogRef = this.dialog.open(ImageRightsDialogComponent, { + width: '50%', + height: '50%', + }) + } +} \ No newline at end of file diff --git a/src/app/members/account/upload/upload.module.ts b/src/app/members/account/upload/upload.module.ts new file mode 100644 index 0000000000000000000000000000000000000000..51c0b61584ea97c68adb353475715ee04f93c13b --- /dev/null +++ b/src/app/members/account/upload/upload.module.ts @@ -0,0 +1,32 @@ +import { NgModule } from '@angular/core' +import { CommonModule } from '@angular/common' +//Components +import { UploadComponent } from './upload.component' +import {StudentChartDialogComponent} from './dialog/studentChartDialog.component' +import {ImageRightsDialogComponent} from './dialog/imageRightsDialog.component' +import {ParentalAuthDialogComponent} from './dialog/parentalAuthDialog.component' +import { + MatButtonModule, + MatDialogModule, + MatListModule, + MatProgressBarModule, +} from '@angular/material' + +import { BrowserAnimationsModule } from '@angular/platform-browser/animations' +import { UploadService } from './upload.service' +import { HttpClientModule } from '@angular/common/http' + +@NgModule({ + imports: [ + CommonModule, + MatButtonModule, + MatDialogModule, + MatListModule, + HttpClientModule, + BrowserAnimationsModule, + MatProgressBarModule, + ], + providers: [UploadService], + entryComponents : [ParentalAuthDialogComponent,ImageRightsDialogComponent,StudentChartDialogComponent] +}) +export class UploadModule {} \ No newline at end of file diff --git a/src/app/members/account/upload/upload.service.spec.ts b/src/app/members/account/upload/upload.service.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..c5718b07fe80fdb312fd6bd683a00cd2eef63c00 --- /dev/null +++ b/src/app/members/account/upload/upload.service.spec.ts @@ -0,0 +1,15 @@ +import { TestBed, inject } from '@angular/core/testing'; + +import { UploadService } from './upload.service'; + +describe('UploadService', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [UploadService] + }); + }); + + it('should be created', inject([UploadService], (service: UploadService) => { + expect(service).toBeTruthy(); + })); +}); diff --git a/src/app/members/account/upload/upload.service.ts b/src/app/members/account/upload/upload.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..3e67cea77e1303fb83f6cd4f79972e304a989b82 --- /dev/null +++ b/src/app/members/account/upload/upload.service.ts @@ -0,0 +1,66 @@ +import { Injectable } from '@angular/core' +import { + HttpClient, + HttpRequest, + HttpEventType, + HttpResponse, +} from '@angular/common/http' +import { Observable,Subject } from 'rxjs' +import { ApiService } from 'app/core'; + + + +@Injectable({ + providedIn: 'root' +}) +export class UploadService extends ApiService { + constructor(private http: HttpClient) {super();} + private url = this.apiUrl + 'upload/' + public upload( + files: Set<File>, + uploadedFileType : String + ): { [key: string]: { progress: Observable<number> } } { + // this will be the our resulting map + const status: { [key: string]: { progress: Observable<number> } } = {}; + + files.forEach(file => { + // create a new multipart-form for every file + const formData: FormData = new FormData(); + formData.append('fichier', file, file.name); + + // create a http-post request and pass the form + // tell it to report the upload progress + const req = new HttpRequest('POST', this.url+uploadedFileType, formData, { + reportProgress: true + }); + + // create a new progress-subject for every file + const progress = new Subject<number>(); + + // send the http-request and subscribe for progress-updates + this.http.request(req).subscribe(event => { + if (event.type === HttpEventType.UploadProgress) { + + // calculate the progress percentage + const percentDone = Math.round(100 * event.loaded / event.total); + + // pass the percentage into the progress-stream + progress.next(percentDone); + } else if (event instanceof HttpResponse) { + + // Close the progress-stream if we get an answer form the API + // The upload is complete + progress.complete(); + } + }); + + // Save every progress-observable in a map of all observables + status[file.name] = { + progress: progress.asObservable() + }; + }); + + // return the map of progress.observables + return status; + } +} \ No newline at end of file diff --git a/src/app/members/members-routing.module.ts b/src/app/members/members-routing.module.ts index f5f0fac7402fff4276adf573e911780d8f4b964b..01addc9854b6900c3587dda5388799f5e3b3c91a 100644 --- a/src/app/members/members-routing.module.ts +++ b/src/app/members/members-routing.module.ts @@ -26,6 +26,11 @@ const routes: Routes = [ data: { title: 'Projets' }, loadChildren: './projects/projects.module#ProjectsModule', }, + { + path: 'compte', + data: { title: 'Mon Compte' }, + loadChildren : './account/account.module#AccountModule', + } ] }, ]; diff --git a/src/app/members/members.component.ts b/src/app/members/members.component.ts index 18629a484b44034b44057d56b77895cf922a4619..f209352459a0795824391460446f8b2453f53a6a 100644 --- a/src/app/members/members.component.ts +++ b/src/app/members/members.component.ts @@ -19,6 +19,7 @@ export class MembersComponent { { href: './', text: 'Mon espace' }, { href: './projets', text: 'Nos projets' }, { href: './sorties', text: 'Nos sorties' }, + { href: './compte', text: 'Mon compte' }, { text: 'Déconnexion', action: () => this.logout() }, ]; diff --git a/src/app/members/student-home/account-overview/account-overview.component.html b/src/app/members/student-home/account-overview/account-overview.component.html new file mode 100644 index 0000000000000000000000000000000000000000..674262d2106745afa80e308992dc2f956b4a1ebd --- /dev/null +++ b/src/app/members/student-home/account-overview/account-overview.component.html @@ -0,0 +1,12 @@ +<div class="container"> + <h2 id="title">Mon Compte</h2> + + <p> + Remplie ou modifie tes données personnelles qui te serviront pour valider ton inscription à Oser. + </p> + <a mat-raised-button color="accent" routerLink="compte/donnees"> + Voir mon compte + </a> + + </div> + \ No newline at end of file diff --git a/src/app/members/student-home/account-overview/account-overview.component.scss b/src/app/members/student-home/account-overview/account-overview.component.scss new file mode 100644 index 0000000000000000000000000000000000000000..7c2d3209e215d6ad3a736555123a3e65c73b4fec --- /dev/null +++ b/src/app/members/student-home/account-overview/account-overview.component.scss @@ -0,0 +1,15 @@ +@import '~sass/variables'; + +#title { + margin: 0; + padding: 0; +} + +.row { + padding-bottom: 0.5em; + + p { + margin: 0; + padding: 0; + } +} diff --git a/src/app/members/student-home/account-overview/account-overview.component.ts b/src/app/members/student-home/account-overview/account-overview.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..f3194fec84c74d158c152c5da35460d2e853c3e5 --- /dev/null +++ b/src/app/members/student-home/account-overview/account-overview.component.ts @@ -0,0 +1,9 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'account-overview', + templateUrl: './account-overview.component.html', + styleUrls: ['./account-overview.component.scss'] +}) + +export class AccountOverviewComponent {} diff --git a/src/app/members/student-home/student-home.component.html b/src/app/members/student-home/student-home.component.html index 9693f0e68f2da1c7552e9e9500e6b51f8179563f..540c5f14f01be246773ff3ad286235f400a58f6b 100644 --- a/src/app/members/student-home/student-home.component.html +++ b/src/app/members/student-home/student-home.component.html @@ -2,14 +2,17 @@ Mon espace </h1> -<app-two-panes> +<app-three-panes> <app-pane id="visits"> <visits-overview class="pane-content"></visits-overview> </app-pane> <app-pane id="projects"> <projects-overview class="pane-content"></projects-overview> </app-pane> -</app-two-panes> + <app-pane id="account"> + <account-overview class="pane-content"></account-overview> + </app-pane> +</app-three-panes> <div class="container"> <h2> diff --git a/src/app/members/student-home/student-home.component.scss b/src/app/members/student-home/student-home.component.scss index eb3c7e0d7f567ac81c6d58d424a3b9b03a251b1a..62a40567bfae2c5995659c50696d5206a01782d8 100644 --- a/src/app/members/student-home/student-home.component.scss +++ b/src/app/members/student-home/student-home.component.scss @@ -14,3 +14,5 @@ // TODO use a background image? background: $color-purple-lighter; } + + diff --git a/src/app/members/student-home/student-home.module.ts b/src/app/members/student-home/student-home.module.ts index bc853c84f3ac76924a877770337f3c6a18df9f4a..778d82db466c6f63ce0d15f959dfaec1486f01a1 100644 --- a/src/app/members/student-home/student-home.module.ts +++ b/src/app/members/student-home/student-home.module.ts @@ -12,6 +12,7 @@ import { import { StudentHomeComponent } from './student-home.component'; import { ProjectsOverviewComponent } from './projects-overview/projects-overview.component'; import { VisitsOverviewComponent } from './visits-overview/visits-overview.component'; +import {AccountOverviewComponent} from './account-overview/account-overview.component'; @NgModule({ imports:[ @@ -26,6 +27,7 @@ import { VisitsOverviewComponent } from './visits-overview/visits-overview.compo StudentHomeComponent, ProjectsOverviewComponent, VisitsOverviewComponent, + AccountOverviewComponent, ] }) diff --git a/src/app/panes/panes.module.ts b/src/app/panes/panes.module.ts index 4318091c03ab19c926544f5c7fbdaf9512609b6b..b7b74763fb0c4f10e794858a8546faadb6470170 100644 --- a/src/app/panes/panes.module.ts +++ b/src/app/panes/panes.module.ts @@ -1,7 +1,7 @@ import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; -import { TwoPanesComponent } from './two-panes/two-panes.component'; +import { ThreePanesComponent } from './three-panes/three-panes.component'; import { PaneComponent } from './pane/pane.component'; @NgModule({ @@ -9,11 +9,11 @@ import { PaneComponent } from './pane/pane.component'; CommonModule ], declarations: [ - TwoPanesComponent, + ThreePanesComponent, PaneComponent, ], exports: [ - TwoPanesComponent, + ThreePanesComponent, PaneComponent, ] }) diff --git a/src/app/panes/two-panes/two-panes.component.html b/src/app/panes/three-panes/three-panes.component.html similarity index 100% rename from src/app/panes/two-panes/two-panes.component.html rename to src/app/panes/three-panes/three-panes.component.html diff --git a/src/app/panes/two-panes/two-panes.component.scss b/src/app/panes/three-panes/three-panes.component.scss similarity index 74% rename from src/app/panes/two-panes/two-panes.component.scss rename to src/app/panes/three-panes/three-panes.component.scss index d0f69030f9e766280e287190b6fc70efc6009392..60c5bdc1a6a77686bb7b9979c7334d72dc2f3435 100644 --- a/src/app/panes/two-panes/two-panes.component.scss +++ b/src/app/panes/three-panes/three-panes.component.scss @@ -4,6 +4,6 @@ display: grid; grid-template-columns: 1fr; @include media-xs { - grid-template-columns: 1fr 1fr; + grid-template-columns: 1fr 1fr 1fr; } } diff --git a/src/app/panes/three-panes/three-panes.component.ts b/src/app/panes/three-panes/three-panes.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..4167f7532cfa6f8f02fdbe3f4735d75bf17631ee --- /dev/null +++ b/src/app/panes/three-panes/three-panes.component.ts @@ -0,0 +1,8 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-three-panes', + templateUrl: './three-panes.component.html', + styleUrls: ['./three-panes.component.scss'] +}) +export class ThreePanesComponent {} diff --git a/src/app/panes/two-panes/two-panes.component.ts b/src/app/panes/two-panes/two-panes.component.ts deleted file mode 100644 index 5887f6d0b0ce78c2e5990183b847c09f7e421db5..0000000000000000000000000000000000000000 --- a/src/app/panes/two-panes/two-panes.component.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { Component } from '@angular/core'; - -@Component({ - selector: 'app-two-panes', - templateUrl: './two-panes.component.html', - styleUrls: ['./two-panes.component.scss'] -}) -export class TwoPanesComponent {} diff --git a/src/app/reset-confirm/reset-confirm.component.html b/src/app/reset-confirm/reset-confirm.component.html new file mode 100644 index 0000000000000000000000000000000000000000..b9d07f9a30ba2ca9a6958783b04259985392e3fe --- /dev/null +++ b/src/app/reset-confirm/reset-confirm.component.html @@ -0,0 +1,24 @@ +<app-form-page> + <h1>Réinitialiser le mot de passe</h1> + <form [formGroup]="formGroup" (ngSubmit)="resetConfirm()"> + + <!-- Password field --> + <mat-form-field class="block"> + <input matInput type="password" formControlName="new_password1" placeholder="Mot de passe" required autofocus /> + </mat-form-field> + + <!-- Confirm password --> + <mat-form-field class="block"> + <input matInput type="password" formControlName="new_password2" placeholder="Confirmer le mot de passe" required + autofocus /> + </mat-form-field> + + <!-- Submit--> + <div class="text-center"> + <button mat-raised-button color="primary" [disabled]="!formGroup.valid || loading" id="login-btn"> + Confirmer<i *ngIf="loading" class="fa fa-spinner fa-pulse"></i> + </button> + </div> + </form> + +</app-form-page> \ No newline at end of file diff --git a/src/app/reset-confirm/reset-confirm.component.scss b/src/app/reset-confirm/reset-confirm.component.scss new file mode 100644 index 0000000000000000000000000000000000000000..2e0715852a867e745f1483f4f38c515007e32c31 --- /dev/null +++ b/src/app/reset-confirm/reset-confirm.component.scss @@ -0,0 +1,38 @@ +@import '~sass/variables'; +@import '~sass/mixins'; + +.logo { + width: 100%; + max-width: 20em; + height: auto; + display: block; + margin: auto; +} + +.form-group { + display: flex; + flex-flow: column; +} + +.has-error { + input { + @include style-danger; + } +} +#login-btn { + margin-top: 1em; +} + +.form-control { + position: relative; + font-size: 16px; + height: auto; + padding: 10px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.block { + width: 100%; +} diff --git a/src/app/reset-confirm/reset-confirm.component.spec.ts b/src/app/reset-confirm/reset-confirm.component.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..4d5f02d9a5b900816071e1606ffd0e818bd5cced --- /dev/null +++ b/src/app/reset-confirm/reset-confirm.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ResetConfirmComponent } from './reset-confirm.component'; + +describe('ResetConfirmComponent', () => { + let component: ResetConfirmComponent; + let fixture: ComponentFixture<ResetConfirmComponent>; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ ResetConfirmComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ResetConfirmComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/reset-confirm/reset-confirm.component.ts b/src/app/reset-confirm/reset-confirm.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..cc2502362d0b5d579ce32a636720f65f2b9a625d --- /dev/null +++ b/src/app/reset-confirm/reset-confirm.component.ts @@ -0,0 +1,68 @@ +import { Component, OnInit } from '@angular/core'; +import { Router, ActivatedRoute } from '@angular/router'; +import { FormGroup, FormBuilder } from '@angular/forms'; +import { MatSnackBar } from '@angular/material'; +import { AuthService, MessageService } from 'app/core'; +import { of } from 'rxjs'; +import { filter, map, tap, catchError } from 'rxjs/operators'; + +@Component({ + selector: 'app-reset-confirm', + templateUrl: './reset-confirm.component.html', + styleUrls: ['./reset-confirm.component.scss'] +}) +export class ResetConfirmComponent implements OnInit { + + loading: boolean = false; + defaultRedirectUrl: string = '/connexion'; + formGroup: FormGroup; + public uid: string; + public token: string; + + constructor( + private router: Router, + private auth: AuthService, + private messageService: MessageService, + private fb: FormBuilder, + private snackBar: MatSnackBar, + private route: ActivatedRoute + ) { } + + ngOnInit() { + if (this.auth.fromGuard) { + this.messageService.error('Oops ! Vous devez vous connecter pour accéder à cette page.'); + } + if (this.auth.fromUnauthorized) { + this.messageService.error("Oops ! Vous n'avez pas les permissions requises pour accéder à cette page."); + } + + this.createForm(); + this.uid = this.route.snapshot.paramMap.get('uid'); + this.token = this.route.snapshot.paramMap.get('token'); + console.log(this.uid); + console.log(this.token); + } + private createForm() { + this.formGroup = this.fb.group({ + new_password1: '', + new_password2: '' + }); + } + + resetConfirm() { + this.loading = true; + const { new_password1, new_password2 } = this.formGroup.value; + this.messageService.clear(); + this.auth.resetConfirm(this.uid, this.token, new_password1, new_password2).pipe( + catchError(() => { + this.snackBar.open('Erreur lors de la réinitialisation du mot de passe : vérifiez que les mots de passes sont identiques et assez forts (8 caractères). Evitez également les mots de passes courants', 'OK', { duration: 5000 }); + return of(false); + }), + tap(() => this.loading = false), + filter(Boolean), + map(() =>this.auth.redirectUrl ? this.auth.redirectUrl : this.defaultRedirectUrl), + tap(() => this.snackBar.open('Mot de passe réinitialisé', 'OK', { duration: 2000 })), + tap((redirectUrl: string) => this.router.navigate([redirectUrl])), + ).subscribe()} + +} diff --git a/src/app/reset/reset.component.html b/src/app/reset/reset.component.html new file mode 100644 index 0000000000000000000000000000000000000000..eee197047ddcc91ac09e79faf39fda5ac6a55fc8 --- /dev/null +++ b/src/app/reset/reset.component.html @@ -0,0 +1,19 @@ +<app-form-page> + <h1>Réinitialisation du mot de passe</h1> + + <form [formGroup]="formGroup" (ngSubmit)="reset()"> + + <!-- Email field --> + <mat-form-field class="block"> + <input matInput type="email" formControlName="email" required placeholder="Adresse email" autofocus> + </mat-form-field> + + <!-- Submit --> + <div class="text-center"> + <button mat-raised-button color="primary" [disabled]="!formGroup.valid || loading" id="login-btn"> + Recevoir un mail<i *ngIf="loading" class="fa fa-spinner fa-pulse"></i> + </button> + </div> + </form> + +</app-form-page> \ No newline at end of file diff --git a/src/app/reset/reset.component.scss b/src/app/reset/reset.component.scss new file mode 100644 index 0000000000000000000000000000000000000000..2e0715852a867e745f1483f4f38c515007e32c31 --- /dev/null +++ b/src/app/reset/reset.component.scss @@ -0,0 +1,38 @@ +@import '~sass/variables'; +@import '~sass/mixins'; + +.logo { + width: 100%; + max-width: 20em; + height: auto; + display: block; + margin: auto; +} + +.form-group { + display: flex; + flex-flow: column; +} + +.has-error { + input { + @include style-danger; + } +} +#login-btn { + margin-top: 1em; +} + +.form-control { + position: relative; + font-size: 16px; + height: auto; + padding: 10px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.block { + width: 100%; +} diff --git a/src/app/reset/reset.component.spec.ts b/src/app/reset/reset.component.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..15ce951092d54ab68fdd487dd9d340edc08439fc --- /dev/null +++ b/src/app/reset/reset.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ResetComponent } from './reset.component'; + +describe('ResetComponent', () => { + let component: ResetComponent; + let fixture: ComponentFixture<ResetComponent>; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ ResetComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ResetComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/reset/reset.component.ts b/src/app/reset/reset.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..f35be7adbddac5fb4410176634036a50b7b5f981 --- /dev/null +++ b/src/app/reset/reset.component.ts @@ -0,0 +1,59 @@ +import { Component, OnInit } from '@angular/core'; +import { Router } from '@angular/router'; +import { FormGroup, FormBuilder } from '@angular/forms'; +import { MatSnackBar } from '@angular/material'; +import { AuthService, MessageService } from 'app/core'; +import { of } from 'rxjs'; +import { filter, map, tap, catchError } from 'rxjs/operators'; + +@Component({ + selector: 'app-reset', + templateUrl: './reset.component.html', + styleUrls: ['./reset.component.scss'] +}) +export class ResetComponent implements OnInit { + + loading: boolean = false; + defaultRedirectUrl: string = '/'; + formGroup: FormGroup; + + constructor( + private router: Router, + private auth: AuthService, + private messageService: MessageService, + private fb: FormBuilder, + private snackBar: MatSnackBar, + ) { } + + ngOnInit() { + if (this.auth.fromGuard) { + this.messageService.error('Oops ! Vous devez vous connecter pour accéder à cette page.'); + } + if (this.auth.fromUnauthorized) { + this.messageService.error("Oops ! Vous n'avez pas les permissions requises pour accéder à cette page."); + } + this.createForm(); + } + + private createForm() { + this.formGroup = this.fb.group({ + email: '', + }); + } + + reset() { + this.loading = true; + const { email } = this.formGroup.value; + this.messageService.clear(); + this.auth.reset(email).pipe( + catchError(() => { + this.snackBar.open('Adresse incorrecte', 'OK', { duration: 5000 }); + return of(false); + }), + tap(() => this.loading = false), + filter(Boolean), + map(() =>this.auth.redirectUrl ? this.auth.redirectUrl : this.defaultRedirectUrl), + tap(() => this.snackBar.open('Mail de réinitialisation envoyé !', 'OK', { duration: 2000 })), + tap((redirectUrl: string) => this.router.navigate([redirectUrl])), + ).subscribe()} +} diff --git a/src/app/signup/core/index.ts b/src/app/signup/core/index.ts index b18613ff1e9c9b8a605abda14e7c580b6606dadf..29d5d8235deb95cf8178b9c553beb5a6407e0c28 100644 --- a/src/app/signup/core/index.ts +++ b/src/app/signup/core/index.ts @@ -1,3 +1,5 @@ export * from './registration.model'; export * from './registration.service'; +export * from './personnalData.model'; +export * from './personnalData.service'; export * from './password.matcher'; diff --git a/src/app/signup/core/personnalData.model.ts b/src/app/signup/core/personnalData.model.ts new file mode 100644 index 0000000000000000000000000000000000000000..50e4f3ced39e624b076365250c1bfe2b71d82f1c --- /dev/null +++ b/src/app/signup/core/personnalData.model.ts @@ -0,0 +1,60 @@ +import { Injectable } from '@angular/core'; +import { Address, AddressAdapter } from 'app/core'; + +class PersonnalDataSchema { + gender: string; + adressNumber:string; + street:string; + zipCode:string; + city:string; + personnalPhone:string; + parentsPhone:string; + parentsEmail:string; + school:string; + grade:string; + section:string; + specialTeaching:string; + scholarship:string; + fatherActivity:string; + motherActivity:string; + parentsStatus:string; + dependantsNumber:number; +} + +export class PersonnalData extends PersonnalDataSchema { + + constructor(args: PersonnalDataSchema) { + super(); + Object.assign(this, args); + } +} + +@Injectable({ + providedIn: 'root' +}) +export class PersonnalDataAdapter { + + constructor(private addressAdapter: PersonnalDataAdapter) { } + + encode(obj: PersonnalData): any { + return { + gender: obj.gender, + adressNumber: obj.adressNumber, + street:obj.street, + zipCode:obj.zipCode, + city:obj.city, + personnalPhone:obj.personnalPhone, + parentsPhone:obj.parentsPhone, + parentsEmail:obj.parentsEmail, + school:obj.school, + grade:obj.grade, + section:obj.section, + specialTeaching:obj.specialTeaching, + scholarship:obj.scholarship, + fatherActivity:obj.fatherActivity, + motherActivity:obj.motherActivity, + parentsStatus:obj.parentsStatus, + dependantsNumber:obj.dependantsNumber + } + } +} diff --git a/src/app/signup/core/personnalData.service.ts b/src/app/signup/core/personnalData.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..1b8a2ab4b850ea25d4577eab71cd10722f6f36c2 --- /dev/null +++ b/src/app/signup/core/personnalData.service.ts @@ -0,0 +1,22 @@ +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { Observable, of } from 'rxjs'; +import { environment } from 'environments/environment'; +import { PersonnalData,PersonnalDataAdapter } from './personnalData.model'; + +@Injectable({ + providedIn: 'root', +}) +export class PersonnalDataService { + + private baseUrl = environment.apiUrl + 'personnalData/'; + + constructor(private http: HttpClient, private adapter: PersonnalDataAdapter) { } + + create(personnalData: PersonnalData): Observable<any> { + const body: any = this.adapter.encode(personnalData); + + return this.http.post(this.baseUrl, body); + } + +} diff --git a/src/app/signup/signup.module.ts b/src/app/signup/signup.module.ts index d33e9b53db693a1f90dd14b05031c9ca576ac093..245b3c29f1ab39ba7c6324f80c88bac1bf9fdaa2 100644 --- a/src/app/signup/signup.module.ts +++ b/src/app/signup/signup.module.ts @@ -7,10 +7,12 @@ import { RouterModule } from '@angular/router'; import { MatFormFieldModule, MatInputModule, + MatSelectModule, MatButtonModule, MatSnackBarModule, MatCheckboxModule, MatIconModule, + MatSlideToggleModule, } from '@angular/material'; import { SharedModule } from 'app/shared'; @@ -30,11 +32,13 @@ import { StudentSignupComponent } from './student-signup/student-signup.componen SharedModule, // Material MatFormFieldModule, + MatSelectModule, MatInputModule, MatButtonModule, MatSnackBarModule, MatCheckboxModule, MatIconModule, + MatSlideToggleModule, ], }) export class SignupModule { } diff --git a/src/app/signup/student-signup/student-signup.component.html b/src/app/signup/student-signup/student-signup.component.html index d991f7ce7cbed35f3ca8dde3eb6dd5027eddaf3e..64ba46da0421255eb37e9b2ad0c7ebb5b2e64d8c 100644 --- a/src/app/signup/student-signup/student-signup.component.html +++ b/src/app/signup/student-signup/student-signup.component.html @@ -1,4 +1,5 @@ <app-form-page> + <form [formGroup]="formGroup" (ngSubmit)="submit()"> <h1>Inscription</h1> @@ -32,58 +33,10 @@ </mat-hint> </mat-form-field> - <p> - Pour assurer ton inscription au tutorat, il est - <strong>obligatoire</strong> - de remplir le formulaire d'inscription administrative (Google Form). - </p> - - <p> - <small> - Données personnelles : nous utiliserons les données fournies pour assurer le contact avec toi et ta famille, - équilibrer les participations aux activités organisées ainsi qu'à des fins d'aggrégation anonymisée - (statistiques, demandes de subvention). Plus d'informations dans nos <a routerLink="/mentions-legales" - target="_blank">mentions légales</a>. - </small> - </p> - - <p> - J'accepte qu'OSER utilise mes données personnelles fournies ci-dessus ou dans le formulaire d'inscription - adminsitrative, dans le strict respect du cadre spécifié ci-dessus : - </p> - - <mat-checkbox id="checkboxUtilisation" class="checkbox-field" formControlName="acceptedConditions" required onclick='if (document.getElementById("checkboxUtilisation").classList.contains("mat-checkbox-checked")) { - document.getElementById("boutonChiant").setAttribute("disabled", "true"); - } - else { - document.getElementById("boutonChiant").removeAttribute("disabled"); - }'> - J'accepte cette utilisation - </mat-checkbox> - - <p class="text-center"> - <a mat-raised-button color="accent" disabled id="boutonChiant" - href="https://docs.google.com/forms/d/e/1FAIpQLScJnkGaDdXWL-sPyHuq58gJivr5xkZ_M5AASRCBHx4a9wR4-Q/viewform?usp=sf_link" - rel="noreferrer" target="_blank"> - <mat-icon>launch</mat-icon> - Remplir le formulaire - </a> - </p> - - - - <mat-checkbox class="checkbox-field" formControlName="filledForm" required> - J'ai rempli le formulaire - </mat-checkbox> - <!-- ici --> - - - <!-- ici --> - <p> Il ne te reste plus qu'à choisir un mot de passe. :-) </p> - + <!-- Password --> <mat-form-field class="full-width"> <input matInput type="password" formControlName="password" placeholder="Mot de passe" required> diff --git a/src/app/signup/student-signup/student-signup.component.scss b/src/app/signup/student-signup/student-signup.component.scss index 3a616f698c8965a1a969a28db5c7403d685f726d..9c39d1abb3430ba8ddec4521194896d92fdaff6a 100644 --- a/src/app/signup/student-signup/student-signup.component.scss +++ b/src/app/signup/student-signup/student-signup.component.scss @@ -2,3 +2,18 @@ display: block; margin: .5em 0; } +.form-group{ + display:flex; + flex-direction: row; + justify-content: space-between; +} +.horizontal-display{ + width:45%; +} +.adress-input{ + margin:5px; +} + +.quarter-display{ + width:25%; +} \ No newline at end of file diff --git a/src/app/signup/student-signup/student-signup.component.ts b/src/app/signup/student-signup/student-signup.component.ts index ac78486756ca5897ca1c0deb38a2dc775ba6052c..a07350b4b48ac2c3ac3732fd816c3e5e1d8e8ad0 100644 --- a/src/app/signup/student-signup/student-signup.component.ts +++ b/src/app/signup/student-signup/student-signup.component.ts @@ -4,7 +4,7 @@ import { Router } from '@angular/router'; import { MatSnackBar } from '@angular/material'; import { Observable } from 'rxjs'; import { tap, mergeMap } from 'rxjs/operators'; -import { Registration, RegistrationService, PasswordErrorStateMatcher } from '../core'; +import { Registration, RegistrationService, PasswordErrorStateMatcher,PersonnalData,PersonnalDataService } from '../core'; import { AuthService } from 'app/core'; @@ -16,17 +16,51 @@ import { AuthService } from 'app/core'; export class StudentSignupComponent implements OnInit { registration: Registration; + personnalData: PersonnalData formGroup: FormGroup; loading = false; + public showPersonnalDataForm = false; + public zipPattern = new RegExp(/^\d{5}(?:\d{2})?$/) + public possibleParentsStatus = [ + {id:"maried",name:"Mariés"}, + {id:"divorced",name:"Divorcés"}, + {id:"cohabitation",name:"En concubinage"}, + {id:"monoparental",name:"Famille monoparentale"} + ] + + public possibleParentsActivities = [ + {id:"farmer",name:"Agriculteur"}, + {id:"artisan",name:"Artisan, commerçant, chef d'entreprise"}, + {id:"executive",name:"Cadre, profession intellectuelle supérieure"}, + {id:"teacher",name:"Enseignant et assimilé"}, + {id:"intermediate",name:"Profession intermédiaire"}, + {id:"employee",name:"Employé"}, + {id:"worker",name:"Ouvrier"}, + {id:"retreated",name:"Retraité"}, + {id:"inactive",name:"Inactif"}, + {id:"other",name:"Autre"} + ] + + public possibleScholarships = [ + {id:"echelon1",name:"Oui, échelon 1"}, + {id:"echelon2",name:"Oui, échelon 2"}, + {id:"echelon3",name:"Oui, échelon 3"}, + {id:"echelon4",name:"Oui, échelon 4"}, + {id:"echelon5",name:"Oui, échelon 5"}, + {id:"echelon6",name:"Oui, échelon 6"}, + {id:"no",name:"Non"}, + ] matcher = new PasswordErrorStateMatcher(); constructor( private registrationService: RegistrationService, + private personnalDataService : PersonnalDataService, private formBuilder: FormBuilder, private router: Router, private auth: AuthService, private snackBar: MatSnackBar, + ) { } ngOnInit() { @@ -34,16 +68,36 @@ export class StudentSignupComponent implements OnInit { } createForm() { + this.formGroup = this.formBuilder.group({ firstName: '', lastName: '', email: ['', Validators.email], phoneNumber: '', + gender:'', + adressNumber:'', + street:'', + zipCode:['',Validators.pattern(this.zipPattern)], + city:'', + personnalPhone:'', + parentsPhone:'', + parentsEmail:['',Validators.email], + school:'', + grade:'', + section:'', + specialTeaching:'', + scholarship:'', + fatherActivity:'', + motherActivity:'', + parentsStatus:'', + dependantsNumber:'', password: '', passwordConfirm: '', + agree: [false, Validators.required], filledForm: false, acceptedConditions: false, - }, { validator: (group) => this.checkPasswords(group)}) + }, { validator: (group) => this.checkPasswords(group)},) + console.log(this.formGroup.value.agree) } private checkPasswords(group: FormGroup): null | any { @@ -51,10 +105,16 @@ export class StudentSignupComponent implements OnInit { const passwordConfirm = group.controls.passwordConfirm.value; return password === passwordConfirm ? null : { passwordsDifferent: true }; } - + toggleShowPersonnalDataForm(){ + this.showPersonnalDataForm = !this.showPersonnalDataForm; + } submit() { this.loading = true; - const registration: Registration = this.formGroup.value; + const {email,firstName,lastName,phoneNumber} = this.formGroup.value + //const {gender,adressNumber,street,zipCode,city,personnalPhone,parentsPhone,parentsEmail,school,grade,section,specialTeaching,scholarship,fatherActivity,motherActivity,parentsStatus,dependantsNumber} = this.formGroup.value; + const registration: Registration = {email,firstName,lastName,phoneNumber}; + // const personnalData: PersonnalData = {gender,adressNumber,street,zipCode,city,personnalPhone,parentsPhone,parentsEmail,school,grade,section,specialTeaching,scholarship,fatherActivity,motherActivity,parentsStatus,dependantsNumber}; + const password: string = this.formGroup.controls.password.value; this.registrationService.create(registration, password).pipe( mergeMap(() => this.auth.login(registration.email, password)), @@ -64,10 +124,16 @@ export class StudentSignupComponent implements OnInit { { duration: 3000 }, )), tap(() => this.loading = false), - tap(() => this.router.navigate(['/'])), ).subscribe( () => {}, (error) => this.loading = false, ); + // this.personnalDataService.create(personnalData).pipe( + // tap(() => this.loading = false), + // tap(() => this.router.navigate(['/'])), + // ).subscribe( + // () => {}, + // (error) => this.loading = false, + // ); } } diff --git a/tsconfig.json b/tsconfig.json index a35a8ee3a40d4326972a6d31edf57a9bce437520..4dfbe28709a954d6809235ff44ac0a763faa36c7 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,6 +1,7 @@ { "compileOnSave": false, "compilerOptions": { + "outDir": "./dist/out-tsc", "baseUrl": "src", "sourceMap": true, @@ -15,6 +16,7 @@ "lib": [ "es2016", "dom" - ] + ], + "skipLibCheck": true } }