diff --git a/angular.json b/angular.json index 3e08d95..034704a 100644 --- a/angular.json +++ b/angular.json @@ -24,6 +24,7 @@ "tsConfig": "tsconfig.app.json", "assets": [ "src/.htaccess", + "src/qr-scanner-worker.min.js", "src/favicon.ico", "src/assets" ], diff --git a/package-lock.json b/package-lock.json index 0afc8a3..8371449 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,26 +15,26 @@ } }, "@angular-devkit/architect": { - "version": "0.1202.8", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1202.8.tgz", - "integrity": "sha512-aPzwO3coRIuSjZa8FwFHy2y8OJarXG+afsqOk3muR6anvbdl+Av+m2RT8jjwj5J3D4N2eKZ7ob2q9HDUiHi4Pg==", + "version": "0.1202.10", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1202.10.tgz", + "integrity": "sha512-/sLgtXaFsNouxub5M/bQ2sBkiMIlPubuz6QMh+pA2jia82vJ3hcRMt4AnJTXuXpVY+aew4FiG0i9nt/8HETQsw==", "dev": true, "requires": { - "@angular-devkit/core": "12.2.8", + "@angular-devkit/core": "12.2.10", "rxjs": "6.6.7" } }, "@angular-devkit/build-angular": { - "version": "12.2.8", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-12.2.8.tgz", - "integrity": "sha512-nntuVk7K4DR0cdw1lAFLQKG6CFXQfnA2Ykk48gsMVAW2FHitrjiRfDuBKitx+D7f+cEXAFUO2wymrp9fIT2Z5w==", + "version": "12.2.10", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-12.2.10.tgz", + "integrity": "sha512-MuViuSmXmB67Wge3NpyfY2aAU4O4K+BbcHj1W1k1A9WTx/Hyh6jR6Zgwy/EsNh64zjdUg/Jlg/oHxIVabsWfvQ==", "dev": true, "requires": { "@ampproject/remapping": "1.0.1", - "@angular-devkit/architect": "0.1202.8", - "@angular-devkit/build-optimizer": "0.1202.8", - "@angular-devkit/build-webpack": "0.1202.8", - "@angular-devkit/core": "12.2.8", + "@angular-devkit/architect": "0.1202.10", + "@angular-devkit/build-optimizer": "0.1202.10", + "@angular-devkit/build-webpack": "0.1202.10", + "@angular-devkit/core": "12.2.10", "@babel/core": "7.14.8", "@babel/generator": "7.14.8", "@babel/helper-annotate-as-pure": "7.14.5", @@ -46,7 +46,7 @@ "@babel/template": "7.14.5", "@discoveryjs/json-ext": "0.5.3", "@jsdevtools/coverage-istanbul-loader": "3.0.5", - "@ngtools/webpack": "12.2.8", + "@ngtools/webpack": "12.2.10", "ansi-colors": "4.1.1", "babel-loader": "8.2.2", "browserslist": "^4.9.1", @@ -58,8 +58,8 @@ "critters": "0.0.10", "css-loader": "6.2.0", "css-minimizer-webpack-plugin": "3.0.2", - "esbuild": "0.12.29", - "esbuild-wasm": "0.12.29", + "esbuild": "0.13.4", + "esbuild-wasm": "0.13.4", "find-cache-dir": "3.3.1", "glob": "7.1.7", "https-proxy-agent": "5.0.0", @@ -112,11 +112,29 @@ } }, "esbuild": { - "version": "0.12.29", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.12.29.tgz", - "integrity": "sha512-w/XuoBCSwepyiZtIRsKsetiLDUVGPVw1E/R3VTFSecIy8UR7Cq3SOtwKHJMFoVqqVG36aGkzh4e8BvpO1Fdc7g==", + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.13.4.tgz", + "integrity": "sha512-wMA5eUwpavTBiNl+It6j8OQuKVh69l6z4DKDLzoTIqC+gChnPpcmqdA8WNHptUHRnfyML+mKEQPlW7Mybj8gHg==", "dev": true, - "optional": true + "optional": true, + "requires": { + "esbuild-android-arm64": "0.13.4", + "esbuild-darwin-64": "0.13.4", + "esbuild-darwin-arm64": "0.13.4", + "esbuild-freebsd-64": "0.13.4", + "esbuild-freebsd-arm64": "0.13.4", + "esbuild-linux-32": "0.13.4", + "esbuild-linux-64": "0.13.4", + "esbuild-linux-arm": "0.13.4", + "esbuild-linux-arm64": "0.13.4", + "esbuild-linux-mips64le": "0.13.4", + "esbuild-linux-ppc64le": "0.13.4", + "esbuild-openbsd-64": "0.13.4", + "esbuild-sunos-64": "0.13.4", + "esbuild-windows-32": "0.13.4", + "esbuild-windows-64": "0.13.4", + "esbuild-windows-arm64": "0.13.4" + } }, "glob": { "version": "7.1.7", @@ -151,9 +169,9 @@ } }, "@angular-devkit/build-optimizer": { - "version": "0.1202.8", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.1202.8.tgz", - "integrity": "sha512-GyzlbIM5RX5RhnX3wW0YV7K9ctoJQv5O7L/VUuDFpK8yaJjqjC+sZT+rnu6oPGFbPnYMx/BkkxzU2D0z98T4Mg==", + "version": "0.1202.10", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.1202.10.tgz", + "integrity": "sha512-NcFEtj4Vfc7gXJtXEVf1mnpk0CJ0htlkm/LbidPcs1PEQbJ/yDgZ44fO+53Pt6NzLmsmPHXOmRzN7O6HkxolPA==", "dev": true, "requires": { "source-map": "0.7.3", @@ -170,19 +188,19 @@ } }, "@angular-devkit/build-webpack": { - "version": "0.1202.8", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1202.8.tgz", - "integrity": "sha512-ryzstLoMcJfICToZv/RwqeVNNZ3tn71+S1JxNled469gWnsZAvABfexe8BOaT0b0MTo8h49ULeK1DU8McLY78Q==", + "version": "0.1202.10", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1202.10.tgz", + "integrity": "sha512-xGSy12g+wa/qeYOaPGkeoJp3zatlS+HZxECtw0Up3ES85Ewrx9PvraexHSuRxnkuBQykRORKf6WbPt/WYIAVGQ==", "dev": true, "requires": { - "@angular-devkit/architect": "0.1202.8", + "@angular-devkit/architect": "0.1202.10", "rxjs": "6.6.7" } }, "@angular-devkit/core": { - "version": "12.2.8", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-12.2.8.tgz", - "integrity": "sha512-N13N1Lm7qllBXSVZYz4Khw75rnQnS3lu5QiJqlsaNklWgVfVz8jt99AAeGGvNGSLEbmZjlr35YLxu8ugD267Ug==", + "version": "12.2.10", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-12.2.10.tgz", + "integrity": "sha512-0qhmS7Qvl0hiRVTHxEC/ipFAfzYofPstw0ZITDpEMw+pgHlOZolOlnFrv8LyOXWNqlSIH5fS9D3WF7Hpm7ApYA==", "dev": true, "requires": { "ajv": "8.6.2", @@ -214,12 +232,12 @@ } }, "@angular-devkit/schematics": { - "version": "12.2.8", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-12.2.8.tgz", - "integrity": "sha512-SPiMFoCi1TpFXY6h1xGCakgdwT25gGHdbis1MuHE5yMcPLvhl/yr7EQVY1GY00/iMrgeslTHg/UPp4D6xHyQxA==", + "version": "12.2.10", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-12.2.10.tgz", + "integrity": "sha512-oQ2EWdkEDE+eAttHeviXsvBi85PsntQT+IffjKUZdbQU+Leuk/pKUpTeea1YosU1p4Cz3PKYF+P/Nl5Jy3B7IQ==", "dev": true, "requires": { - "@angular-devkit/core": "12.2.8", + "@angular-devkit/core": "12.2.10", "ora": "5.4.1", "rxjs": "6.6.7" } @@ -240,24 +258,17 @@ } }, "@angular/animations": { - "version": "12.2.8", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-12.2.8.tgz", - "integrity": "sha512-uRK3EIIFMMIGBMIZscKt9p+H6lzuGXm+zokj5aZsB4Pu+rz8sc/Uxn26lTzq6o5GApiL4I75inK4Vs5f5RZKnA==", + "version": "12.2.10", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-12.2.10.tgz", + "integrity": "sha512-K1WT3m/StW5a4SE9wKT+D7eteyWK+MW3pAwFPaKH8EU9k6dItlLr3jWZsve5w2u/GLSnrOMGJNU/JmTfskV9LA==", "requires": { "tslib": "^2.2.0" - }, - "dependencies": { - "tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" - } } }, "@angular/cdk": { - "version": "12.2.8", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-12.2.8.tgz", - "integrity": "sha512-M0Y61o0yEVLMg+DSNsaDgiOifAV6OdumTgt2/kNoSuauPRWS0bkZJE58k3LR+cPi1Cho3UXELMKMOXZN9AhofA==", + "version": "12.2.10", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-12.2.10.tgz", + "integrity": "sha512-jF/tyZXcAS0i11aH8061lMf/ofKs8U52smm/q7k5llTj/NvMZl4s6o3SmdYYE/ByljvCzObz+2j3TzJS/ioDFg==", "requires": { "parse5": "^5.0.0", "tslib": "^2.2.0" @@ -268,24 +279,19 @@ "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", "optional": true - }, - "tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" } } }, "@angular/cli": { - "version": "12.2.8", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-12.2.8.tgz", - "integrity": "sha512-MkTVkQbI+58W1izHKpGdpj0YAFfQnf7oQIyMom13/8l83yuOJdNzFTG/Lt77hx19qaKemEdmqTqdEOOrzaqggw==", + "version": "12.2.10", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-12.2.10.tgz", + "integrity": "sha512-gx2XlOUjAAYyJBBIz4QkgsLLRMdFTQbcOR41/Yv0kgpR6AStrOWhz7tpYPbU6vWMjehpuTaWv4NE5eGjwVTZqg==", "dev": true, "requires": { - "@angular-devkit/architect": "0.1202.8", - "@angular-devkit/core": "12.2.8", - "@angular-devkit/schematics": "12.2.8", - "@schematics/angular": "12.2.8", + "@angular-devkit/architect": "0.1202.10", + "@angular-devkit/core": "12.2.10", + "@angular-devkit/schematics": "12.2.10", + "@schematics/angular": "12.2.10", "@yarnpkg/lockfile": "1.1.0", "ansi-colors": "4.1.1", "debug": "4.3.2", @@ -337,39 +343,25 @@ } }, "@angular/common": { - "version": "12.2.8", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-12.2.8.tgz", - "integrity": "sha512-4nFlwC97wNEkB4vU2+xrbzpniuzmw8FG9zfqIeMFLLmceHLR7SQmxVKUrZylNXjT5TXXynpQzrpRAxQ1AEcTSA==", + "version": "12.2.10", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-12.2.10.tgz", + "integrity": "sha512-7IjD0frrKG/nt3/fo4mKDH0Tx5Nn8f2G8Ks/aq6xnJssy/V841COjua0ZyfPOkPS1r0VEaQJB5ieqMrp2T6MWg==", "requires": { "tslib": "^2.2.0" - }, - "dependencies": { - "tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" - } } }, "@angular/compiler": { - "version": "12.2.8", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-12.2.8.tgz", - "integrity": "sha512-11AswnrVeipKibK0Ra4n3TjZfr6QYpiNGPvT6XQB9NLgSthAPTa9T1Bige2yQhgyWNaZsOPko/jhhNS8ufSZCg==", + "version": "12.2.10", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-12.2.10.tgz", + "integrity": "sha512-5fuzX8P74z28CRYTamsZgsdUyh0c53shytZYfa0cGFXyV8VD/r8AMIyQ4y7Y5Fmt4Nr+65EVeYb3sI7IzYiueg==", "requires": { "tslib": "^2.2.0" - }, - "dependencies": { - "tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" - } } }, "@angular/compiler-cli": { - "version": "12.2.8", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-12.2.8.tgz", - "integrity": "sha512-KFGYsDATUCEoY4KEVcpxyT5S0k2T14hIlmBxzmzRhsCVi2ZLti5E2tnqQi2klKCFxmsk7VYd3kqWRJWBZieQtA==", + "version": "12.2.10", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-12.2.10.tgz", + "integrity": "sha512-cPWxNMwPTM7IsEBxMrh4yY9XZi4gZRv7EmKWOfBw6hiW0SEmthIQWOvCaoL5CPsdUhInNxXWvwAoFggk/tfJ5g==", "dev": true, "requires": { "@babel/core": "^7.8.6", @@ -467,12 +459,6 @@ "ansi-regex": "^5.0.1" } }, - "tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", - "dev": true - }, "wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -514,18 +500,11 @@ } }, "@angular/core": { - "version": "12.2.8", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-12.2.8.tgz", - "integrity": "sha512-ko7RJ8BImcMiI64Z8DM54ylkUwu2r/Mhf37BME0EEm+RIrH0KUVzrFOl2rMaxKBZUtY9qaxvVt43bZPrvN2acg==", + "version": "12.2.10", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-12.2.10.tgz", + "integrity": "sha512-xG1IbmEAV7gWpiY2MSFc87MlmB3yff8/TAlSE8Tj2ZFzb1lFjeFnrZ1y50Hi2AcVyX/KA1mx/RyJ0M7fmQ1ayw==", "requires": { "tslib": "^2.2.0" - }, - "dependencies": { - "tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" - } } }, "@angular/flex-layout": { @@ -544,24 +523,17 @@ } }, "@angular/forms": { - "version": "12.2.8", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-12.2.8.tgz", - "integrity": "sha512-/4w+ggQdUg9Ab5s2yhd9A06uevRsyoZ28vGgLU861PZUe5hR4+Gv3XdIuyEBOFvifanWzuxR0xL3okVZAKCXyA==", + "version": "12.2.10", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-12.2.10.tgz", + "integrity": "sha512-ntTJOaLeH+7th5W4LEm3/yHsBvaFpfRgn0Uc88Th8p2gvorqCgpJMWogJIx/yESNolSFItY6k/x7kjuMBgm9mA==", "requires": { "tslib": "^2.2.0" - }, - "dependencies": { - "tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" - } } }, "@angular/localize": { - "version": "12.2.8", - "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-12.2.8.tgz", - "integrity": "sha512-W4CP9lVxzC5KBiaUY0EapwrOeRxgUfTBHe+Onj5+1OqM+8AFiS62eGYCt+6+nTrgnSEh/2tWSHiF3z095+OS7w==", + "version": "12.2.10", + "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-12.2.10.tgz", + "integrity": "sha512-YTvDYvhjo+qakuLdyWTpgz7Hd4nzmCLdzk/P2a46SiYWG4i/ShBmfkhJNAgZfVnnM6oSt15z/VCgB31lS7JrYg==", "dev": true, "requires": { "@babel/core": "7.8.3", @@ -732,78 +704,43 @@ } }, "@angular/material": { - "version": "12.2.8", - "resolved": "https://registry.npmjs.org/@angular/material/-/material-12.2.8.tgz", - "integrity": "sha512-wRTaTZIGC9+2e8aft44V9Qqwp3PsR9AG0FeJ0spl8mdOlYEqMMyoRXjvMiWIjo2ywxHLoQgLXXsWn3ip2xnnVg==", + "version": "12.2.10", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-12.2.10.tgz", + "integrity": "sha512-iC0EA8ogpn/KJ+kr3TEfQJLYPAtrguMr21KAGwtKOOLng1HiEhH6qEqlc0PPYUUQ06i+8nJr/WWfL0ORKXh3fg==", "requires": { "tslib": "^2.2.0" - }, - "dependencies": { - "tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" - } } }, "@angular/material-moment-adapter": { - "version": "12.2.8", - "resolved": "https://registry.npmjs.org/@angular/material-moment-adapter/-/material-moment-adapter-12.2.8.tgz", - "integrity": "sha512-uk81sYrY4TfX889ZXo7l7iV8Idxww+sTHzZueq8xC9UTG35FM0KLSvUa/EqwR31lau+6rbgKFCGurQVhBvHrQA==", + "version": "12.2.10", + "resolved": "https://registry.npmjs.org/@angular/material-moment-adapter/-/material-moment-adapter-12.2.10.tgz", + "integrity": "sha512-ywgdJm00V2OwGejnIB87/lsmgOvcFewMtPqyNrK3v65VmXNw7VAeu94L7eX+gnOaot8E+vFtML+r+dVzH8mSVw==", "requires": { "tslib": "^2.2.0" - }, - "dependencies": { - "tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" - } } }, "@angular/platform-browser": { - "version": "12.2.8", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-12.2.8.tgz", - "integrity": "sha512-U79tj/fOIKYQbtrRhZm6IcHilUt3UEmloRh7hn2ozhYWOgJmTpygR6FIvvu1X7urAFoOMGY25UZjBNxbnabRNw==", + "version": "12.2.10", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-12.2.10.tgz", + "integrity": "sha512-2pYoscOJijbqFsnYpKX6o4ojt4XfZiNhODTf9RDOPVKjVqFsRNVThg76kdKtN+N8q6N1z4I01x6aX4EeWqQqIA==", "requires": { "tslib": "^2.2.0" - }, - "dependencies": { - "tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" - } } }, "@angular/platform-browser-dynamic": { - "version": "12.2.8", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-12.2.8.tgz", - "integrity": "sha512-kHU4mbbrc1TW5Fz9OHRN5IQcFsmEm3zR5g5V1QTFoLjj6jnRao2xd5KZ8Owt0vcf+Qr4/v4kQGh2pIFZJFMaxQ==", + "version": "12.2.10", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-12.2.10.tgz", + "integrity": "sha512-CLYHCdTCzpxvMwITRBLlUoa44orDdogMaQfKIMEQsWrynf+zGZKYe5chAut9P/A54PVPUtKeQrfEVFjmbdYR2w==", "requires": { "tslib": "^2.2.0" - }, - "dependencies": { - "tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" - } } }, "@angular/router": { - "version": "12.2.8", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-12.2.8.tgz", - "integrity": "sha512-uYPT968IoGH01gUxHTG86hkFIS6G/sWr7QFXhuIzQHTnb+OeyaqWiw4iLc/QDAEPHJ7Wz6gNvCVHv9R2yod00g==", + "version": "12.2.10", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-12.2.10.tgz", + "integrity": "sha512-e9sqOdLNF3pVRZPZtD6OdvERdTWKP7Et8Mz4OSNT8GEe6SctRAaptTAqY09AGpi4BO2+LsxVBERYfhZw9bZ2bA==", "requires": { "tslib": "^2.2.0" - }, - "dependencies": { - "tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" - } } }, "@assemblyscript/loader": { @@ -851,9 +788,9 @@ }, "dependencies": { "@babel/code-frame": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", - "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.15.8.tgz", + "integrity": "sha512-2IAnmn8zbvC/jKYhq5Ki9I+DwjlrtMPUCH/CpHvqI4dNnlwHwsxoIhlc8WcYY5LSYknXQtAlFYuHfqAFCvQ4Wg==", "dev": true, "requires": { "@babel/highlight": "^7.14.5" @@ -1028,9 +965,9 @@ }, "dependencies": { "@babel/code-frame": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", - "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.15.8.tgz", + "integrity": "sha512-2IAnmn8zbvC/jKYhq5Ki9I+DwjlrtMPUCH/CpHvqI4dNnlwHwsxoIhlc8WcYY5LSYknXQtAlFYuHfqAFCvQ4Wg==", "dev": true, "requires": { "@babel/highlight": "^7.14.5" @@ -1103,9 +1040,9 @@ } }, "@babel/helper-module-transforms": { - "version": "7.15.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.7.tgz", - "integrity": "sha512-ZNqjjQG/AuFfekFTY+7nY4RgBSklgTu970c7Rj3m/JOhIu5KPBUuTA9AY6zaKcUvk4g6EbDXdBnhi35FAssdSw==", + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.8.tgz", + "integrity": "sha512-DfAfA6PfpG8t4S6npwzLvTUpp0sS7JrcuaMiy1Y5645laRJIp/LiLGIBbQKaXSInK8tiGNI7FL7L8UvB8gdUZg==", "dev": true, "requires": { "@babel/helper-module-imports": "^7.15.4", @@ -1119,9 +1056,9 @@ }, "dependencies": { "@babel/code-frame": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", - "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.15.8.tgz", + "integrity": "sha512-2IAnmn8zbvC/jKYhq5Ki9I+DwjlrtMPUCH/CpHvqI4dNnlwHwsxoIhlc8WcYY5LSYknXQtAlFYuHfqAFCvQ4Wg==", "dev": true, "requires": { "@babel/highlight": "^7.14.5" @@ -1258,9 +1195,9 @@ }, "dependencies": { "@babel/code-frame": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", - "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.15.8.tgz", + "integrity": "sha512-2IAnmn8zbvC/jKYhq5Ki9I+DwjlrtMPUCH/CpHvqI4dNnlwHwsxoIhlc8WcYY5LSYknXQtAlFYuHfqAFCvQ4Wg==", "dev": true, "requires": { "@babel/highlight": "^7.14.5" @@ -1308,9 +1245,9 @@ }, "dependencies": { "@babel/code-frame": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", - "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.15.8.tgz", + "integrity": "sha512-2IAnmn8zbvC/jKYhq5Ki9I+DwjlrtMPUCH/CpHvqI4dNnlwHwsxoIhlc8WcYY5LSYknXQtAlFYuHfqAFCvQ4Wg==", "dev": true, "requires": { "@babel/highlight": "^7.14.5" @@ -1358,9 +1295,9 @@ } }, "@babel/parser": { - "version": "7.15.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.7.tgz", - "integrity": "sha512-rycZXvQ+xS9QyIcJ9HXeDWf1uxqlbVFAUq0Rq0dbc50Zb/+wUe/ehyfzGfm9KZZF0kBejYgxltBXocP+gKdL2g==", + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.8.tgz", + "integrity": "sha512-BRYa3wcQnjS/nqI8Ac94pYYpJfojHVvVXJ97+IDCImX4Jc8W8Xv1+47enbruk+q1etOpsQNwnfFcNGw+gtPGxA==", "dev": true }, "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { @@ -1967,13 +1904,13 @@ } }, "@babel/plugin-transform-spread": { - "version": "7.14.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.14.6.tgz", - "integrity": "sha512-Zr0x0YroFJku7n7+/HH3A2eIrGMjbmAIbJSVv0IZ+t3U2WUQUA64S/oeied2e+MaGSjmt4alzBCsK9E8gh+fag==", + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.15.8.tgz", + "integrity": "sha512-/daZ8s2tNaRekl9YJa9X4bzjpeRZLt122cpgFnQPLGUe61PH8zMEBmYqKkW5xF5JUEh5buEGXJoQpqBmIbpmEQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5" + "@babel/helper-skip-transparent-expression-wrappers": "^7.15.4" } }, "@babel/plugin-transform-sticky-regex": { @@ -2145,9 +2082,9 @@ }, "dependencies": { "@babel/code-frame": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", - "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.15.8.tgz", + "integrity": "sha512-2IAnmn8zbvC/jKYhq5Ki9I+DwjlrtMPUCH/CpHvqI4dNnlwHwsxoIhlc8WcYY5LSYknXQtAlFYuHfqAFCvQ4Wg==", "dev": true, "requires": { "@babel/highlight": "^7.14.5" @@ -2190,21 +2127,21 @@ }, "dependencies": { "@babel/code-frame": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", - "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.15.8.tgz", + "integrity": "sha512-2IAnmn8zbvC/jKYhq5Ki9I+DwjlrtMPUCH/CpHvqI4dNnlwHwsxoIhlc8WcYY5LSYknXQtAlFYuHfqAFCvQ4Wg==", "dev": true, "requires": { "@babel/highlight": "^7.14.5" } }, "@babel/generator": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.4.tgz", - "integrity": "sha512-d3itta0tu+UayjEORPNz6e1T3FtvWlP5N4V5M+lhp/CxT4oAA7/NcScnpRyspUMLK6tu9MNHmQHxRykuN2R7hw==", + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.8.tgz", + "integrity": "sha512-ECmAKstXbp1cvpTTZciZCgfOt6iN64lR0d+euv3UZisU5awfRawOvg07Utn/qBGuH4bRIEZKrA/4LzZyXhZr8g==", "dev": true, "requires": { - "@babel/types": "^7.15.4", + "@babel/types": "^7.15.6", "jsesc": "^2.5.1", "source-map": "^0.5.0" } @@ -2290,9 +2227,9 @@ } }, "@ngtools/webpack": { - "version": "12.2.8", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-12.2.8.tgz", - "integrity": "sha512-utQrOXm4eS3BEQh2/y8zt5fVF9cuakfVQSPD/pWPKLqZsGc9wB3CHkrQED0EizsBfrsn5yLc3yPh3P8yGUmdRw==", + "version": "12.2.10", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-12.2.10.tgz", + "integrity": "sha512-8ptz2WqEeqFLOMbiYJ6x6XARjzWIrCHzRzpGwvKS28L5iMWeYuvX2EB48uKkMFy/8RJ0SkwyAJkFClPNJvDfrQ==", "dev": true }, "@nodelib/fs.scandir": { @@ -2410,13 +2347,13 @@ } }, "@schematics/angular": { - "version": "12.2.8", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-12.2.8.tgz", - "integrity": "sha512-xkVcX6lTHC5JzDOjGdRAZutVVpxkRkT84vXtVlJwojyhNjAZg5dm/GC84+gVGfmVnO9vkUIYo/vGoN+/ydcSdA==", + "version": "12.2.10", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-12.2.10.tgz", + "integrity": "sha512-hjOWrC/RlZ97oYWO92f5VRu6LDzPHnowDcyGDGvI9wCrfipL4Y7Is6LgFAiVZxCHdRz71MCnES1IXSj5w6UuBA==", "dev": true, "requires": { - "@angular-devkit/core": "12.2.8", - "@angular-devkit/schematics": "12.2.8", + "@angular-devkit/core": "12.2.10", + "@angular-devkit/schematics": "12.2.10", "jsonc-parser": "3.0.0" } }, @@ -2460,9 +2397,9 @@ "dev": true }, "@types/eslint": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.28.0.tgz", - "integrity": "sha512-07XlgzX0YJUn4iG1ocY4IX9DzKSmMGUs6ESKlxWhZRaa0fatIWaHWUVapcuGa8r5HFnTqzj+4OCjd5f7EZ/i/A==", + "version": "7.28.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.28.1.tgz", + "integrity": "sha512-XhZKznR3i/W5dXqUhgU9fFdJekufbeBd5DALmkuXoeFcjbQcPk+2cL+WLHf6Q81HWAnM2vrslIHpGVyCAviRwg==", "dev": true, "requires": { "@types/estree": "*", @@ -2496,9 +2433,9 @@ } }, "@types/jasmine": { - "version": "3.6.11", - "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-3.6.11.tgz", - "integrity": "sha512-S6pvzQDvMZHrkBz2Mcn/8Du7cpr76PlRJBAoHnSDNbulULsH5dp0Gns+WRyNX5LHejz/ljxK4/vIHK/caHt6SQ==", + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-3.10.0.tgz", + "integrity": "sha512-sPHWB05cYGt7GXFkkn+03VL1533abxiA5bE8PKdr0nS3cEsOXCGjMk0sgqVwY6xkiwajoAiN3zc/7zDeXip3Pw==", "dev": true }, "@types/jasminewd2": { @@ -2523,9 +2460,9 @@ "dev": true }, "@types/node": { - "version": "12.20.27", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.27.tgz", - "integrity": "sha512-qZdePUDSLAZRXXV234bLBEUM0nAQjoxbcSwp1rqSMUe1rZ47mwU6OjciR/JvF1Oo8mc0ys6GE0ks0HGgqAZoGg==", + "version": "12.20.33", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.33.tgz", + "integrity": "sha512-5XmYX2GECSa+CxMYaFsr2mrql71Q4EvHjKS+ox/SiwSdaASMoBIWE6UmZqFO+VX1jIcsYLStI4FFoB6V7FeIYw==", "dev": true }, "@types/openpgp": { @@ -3103,6 +3040,12 @@ "postcss-value-parser": "^4.1.0" }, "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, "postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -3462,16 +3405,16 @@ } }, "browserslist": { - "version": "4.17.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.3.tgz", - "integrity": "sha512-59IqHJV5VGdcJZ+GZ2hU5n4Kv3YiASzW6Xk5g9tf5a/MAzGeFwgGWU39fVzNIOVcgB3+Gp+kiQu0HEfTVU/3VQ==", + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.4.tgz", + "integrity": "sha512-Zg7RpbZpIJRW3am9Lyckue7PLytvVxxhJj1CaJVlCWENsGEAOlnlt8X0ZxGRPp7Bt9o8tIRM5SEXy4BCPMJjLQ==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001264", - "electron-to-chromium": "^1.3.857", + "caniuse-lite": "^1.0.30001265", + "electron-to-chromium": "^1.3.867", "escalade": "^3.1.1", - "node-releases": "^1.1.77", - "picocolors": "^0.2.1" + "node-releases": "^2.0.0", + "picocolors": "^1.0.0" } }, "browserstack": { @@ -3619,9 +3562,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001264", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001264.tgz", - "integrity": "sha512-Ftfqqfcs/ePiUmyaySsQ4PUsdcYyXG2rfoBVsk3iY1ahHaJEw65vfb7Suzqm+cEkwwPIv/XWkg27iCpRavH4zA==", + "version": "1.0.30001267", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001267.tgz", + "integrity": "sha512-r1mjTzAuJ9W8cPBGbbus8E0SKcUP7gn03R14Wk8FlAlqhH9hroy9nLqmpuXlfKEw/oILW+FGz47ipXV2O7x8lg==", "dev": true }, "canonical-path": { @@ -4126,12 +4069,12 @@ "dev": true }, "core-js-compat": { - "version": "3.18.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.18.1.tgz", - "integrity": "sha512-XJMYx58zo4W0kLPmIingVZA10+7TuKrMLPt83+EzDmxFJQUMcTVVmQ+n5JP4r6Z14qSzhQBRi3NSWoeVyKKXUg==", + "version": "3.18.3", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.18.3.tgz", + "integrity": "sha512-4zP6/y0a2RTHN5bRGT7PTq9lVt3WzvffTNjqnTKsXhkAYNDTkdCLOIfAdOLcQ/7TDdyRj3c+NeHe1NmF1eDScw==", "dev": true, "requires": { - "browserslist": "^4.17.1", + "browserslist": "^4.17.3", "semver": "7.0.0" }, "dependencies": { @@ -4285,6 +4228,12 @@ "postcss": "^7.0.5" }, "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, "postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -4334,6 +4283,12 @@ "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", "dev": true }, + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, "postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -4485,6 +4440,12 @@ "postcss": "^7.0.5" }, "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, "postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -4545,9 +4506,9 @@ } }, "css-what": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.0.1.tgz", - "integrity": "sha512-FYDTSHb/7KXsWICVsxdmiExPjCfRC4qRFBdVwv7Ax9hMnvMmEjP9RfxTEZ3qPZGmADDn2vAKSo9UcN1jKVYscg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz", + "integrity": "sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==", "dev": true }, "cssauron": { @@ -4986,9 +4947,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.3.859", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.859.tgz", - "integrity": "sha512-gXRXKNWedfdiKIzwr0Mg/VGCvxXzy+4SuK9hp1BDvfbCwx0O5Ot+2f4CoqQkqEJ3Zj/eAV/GoAFgBVFgkBLXuQ==", + "version": "1.3.871", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.871.tgz", + "integrity": "sha512-qcLvDUPf8DSIMWarHT2ptgcqrYg62n3vPA7vhrOF24d8UNzbUBaHu2CySiENR3nEDzYgaN60071t0F6KLYMQ7Q==", "dev": true }, "emoji-regex": { @@ -5159,12 +5120,124 @@ "es6-promise": "^4.0.3" } }, + "esbuild-android-arm64": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.13.4.tgz", + "integrity": "sha512-elDJt+jNyoHFId0/dKsuVYUPke3EcquIyUwzJCH17a3ERglN3A9aMBI5zbz+xNZ+FbaDNdpn0RaJHCFLbZX+fA==", + "dev": true, + "optional": true + }, + "esbuild-darwin-64": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.13.4.tgz", + "integrity": "sha512-zJQGyHRAdZUXlRzbN7W+7ykmEiGC+bq3Gc4GxKYjjWTgDRSEly98ym+vRNkDjXwXYD3gGzSwvH35+MiHAtWvLA==", + "dev": true, + "optional": true + }, + "esbuild-darwin-arm64": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.13.4.tgz", + "integrity": "sha512-r8oYvAtqSGq8HNTZCAx4TdLE7jZiGhX9ooGi5AQAey37MA6XNaP8ZNlw9OCpcgpx3ryU2WctXwIqPzkHO7a8dg==", + "dev": true, + "optional": true + }, + "esbuild-freebsd-64": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.13.4.tgz", + "integrity": "sha512-u9DRGkn09EN8+lCh6z7FKle7awi17PJRBuAKdRNgSo5ZrH/3m+mYaJK2PR2URHMpAfXiwJX341z231tSdVe3Yw==", + "dev": true, + "optional": true + }, + "esbuild-freebsd-arm64": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.13.4.tgz", + "integrity": "sha512-q3B2k68Uf6gfjATjcK16DqxvjqRQkHL8aPoOfj4op+lSqegdXvBacB1d8jw8PxbWJ8JHpdTLdAVUYU80kotQXA==", + "dev": true, + "optional": true + }, + "esbuild-linux-32": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.13.4.tgz", + "integrity": "sha512-UUYJPHSiKAO8KoN3Ls/iZtgDLZvK5HarES96aolDPWZnq9FLx4dIHM/x2z4Rxv9IYqQ/DxlPoE2Co1UPBIYYeA==", + "dev": true, + "optional": true + }, + "esbuild-linux-64": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.13.4.tgz", + "integrity": "sha512-+RnohAKiiUW4UHLGRkNR1AnENW1gCuDWuygEtd4jxTNPIoeC7lbXGor7rtgjj9AdUzFgOEvAXyNNX01kJ8NueQ==", + "dev": true, + "optional": true + }, + "esbuild-linux-arm": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.13.4.tgz", + "integrity": "sha512-BH5gKve4jglS7UPSsfwHSX79I5agC/lm4eKoRUEyo8lwQs89frQSRp2Xup+6SFQnxt3md5EsKcd2Dbkqeb3gPA==", + "dev": true, + "optional": true + }, + "esbuild-linux-arm64": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.13.4.tgz", + "integrity": "sha512-+A188cAdd6QuSRxMIwRrWLjgphQA0LDAQ/ECVlrPVJwnx+1i64NjDZivoqPYLOTkSPIKntiWwMhhf0U5/RrPHQ==", + "dev": true, + "optional": true + }, + "esbuild-linux-mips64le": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.13.4.tgz", + "integrity": "sha512-0xkwtPaUkG5xMTFGaQPe1AadSe5QAiQuD4Gix1O9k5Xo/U8xGIkw9UFUTvfEUeu71vFb6ZgsIacfP1NLoFjWNw==", + "dev": true, + "optional": true + }, + "esbuild-linux-ppc64le": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.13.4.tgz", + "integrity": "sha512-E1+oJPP7A+j23GPo3CEpBhGwG1bni4B8IbTA3/3rvzjURwUMZdcN3Fhrz24rnjzdLSHmULtOE4VsbT42h1Om4Q==", + "dev": true, + "optional": true + }, + "esbuild-openbsd-64": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.13.4.tgz", + "integrity": "sha512-xEkI1o5HYxDzbv9jSox0EsDxpwraG09SRiKKv0W8pH6O3bt+zPSlnoK7+I7Q69tkvONkpIq5n2o+c55uq0X7cw==", + "dev": true, + "optional": true + }, + "esbuild-sunos-64": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.13.4.tgz", + "integrity": "sha512-bjXUMcODMnB6hQicLBBmmnBl7OMDyVpFahKvHGXJfDChIi5udiIRKCmFUFIRn+AUAKVlfrofRKdyPC7kBsbvGQ==", + "dev": true, + "optional": true + }, "esbuild-wasm": { - "version": "0.12.29", - "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.12.29.tgz", - "integrity": "sha512-amSuB/qOGnTFYLOxGHDGosQbOKZnrinniPHFf6ZxzeNH7WAjLkjXluKyKAtX2YuhTkUXm9XV9igl13iqYZ44fQ==", + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.13.4.tgz", + "integrity": "sha512-2dN7njr9/2QzKLqbTEgXr73vDbSqffdJMv4EfaMQoy04cej0owbGHH5apPgED0wN9I5e7sBT0/Q81tVy3wQBlA==", "dev": true }, + "esbuild-windows-32": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.13.4.tgz", + "integrity": "sha512-z4CH07pfyVY0XF98TCsGmLxKCl0kyvshKDbdpTekW9f2d+dJqn5mmoUyWhpSVJ0SfYWJg86FoD9nMbbaMVyGdg==", + "dev": true, + "optional": true + }, + "esbuild-windows-64": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.13.4.tgz", + "integrity": "sha512-uVL11vORRPjocGLYam67rwFLd0LvkrHEs+JG+1oJN4UD9MQmNGZPa4gBHo6hDpF+kqRJ9kXgQSeDqUyRy0tj/Q==", + "dev": true, + "optional": true + }, + "esbuild-windows-arm64": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.13.4.tgz", + "integrity": "sha512-vA6GLvptgftRcDcWngD5cMlL4f4LbL8JjU2UMT9yJ0MT5ra6hdZNFWnOeOoEtY4GtJ6OjZ0i+81sTqhAB0fMkg==", + "dev": true, + "optional": true + }, "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -6485,9 +6558,9 @@ "dev": true }, "rxjs": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.3.1.tgz", - "integrity": "sha512-vNenx7gqjPyeKpRnM6S5Ksm/oFTRijWWzYlRON04KaehZ3YjDwEmVjGUGo0TKWVjeNXOujVRlh0K1drUbcdPkw==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.4.0.tgz", + "integrity": "sha512-7SQDi7xeTMCJpqViXh8gL/lebcwlp3d831F05+9B44A4B0WfsEwUQHR64gsH1kvJ+Ep/J9K2+n1hVl1CsGN23w==", "dev": true, "requires": { "tslib": "~2.1.0" @@ -6616,9 +6689,9 @@ "dev": true }, "is-core-module": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.7.0.tgz", - "integrity": "sha512-ByY+tjCciCr+9nLryBYcSD50EOGWt95c7tIsKTG1J2ixKKXPvF7Ej3AVd+UfDydAJom3biBGDBALaO79ktwgEQ==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz", + "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==", "dev": true, "requires": { "has": "^1.0.3" @@ -6996,9 +7069,9 @@ "dev": true }, "jest-worker": { - "version": "27.2.4", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.2.4.tgz", - "integrity": "sha512-Zq9A2Pw59KkVjBBKD1i3iE2e22oSjXhUKKuAK1HGX8flGwkm6NMozyEYzKd41hXc64dbd/0eWFeEEuxqXyhM+g==", + "version": "27.2.5", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.2.5.tgz", + "integrity": "sha512-HTjEPZtcNKZ4LnhSp02NEH4vE+5OpJ0EsOWYvGQpHgUMLngydESAAMH5Wd/asPf29+XUDQZszxpLg1BkIIA2aw==", "dev": true, "requires": { "@types/node": "*", @@ -8032,9 +8105,9 @@ "dev": true }, "nanoid": { - "version": "3.1.28", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.28.tgz", - "integrity": "sha512-gSu9VZ2HtmoKYe/lmyPFES5nknFrHa+/DT9muUFWFMi6Jh9E1I7bkvlQ8xxf1Kos9pi9o8lBnIOkatMhKX/YUw==", + "version": "3.1.30", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.30.tgz", + "integrity": "sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ==", "dev": true }, "nanomatch": { @@ -8122,6 +8195,16 @@ } } }, + "ngx-mat-timepicker": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/ngx-mat-timepicker/-/ngx-mat-timepicker-12.1.0.tgz", + "integrity": "sha512-qPOKjYbXb4LoOKc9/5ZL2bHsjGGzyz9/4PBIm9cQH1S1k/9cszH8as0zFjgXWBphSCNfsZkSQQvYqwJHK+M/Yw==", + "requires": { + "smp-core-utils": "^12.0.0", + "ts-luxon": "^2.2.0", + "tslib": "^2.1.0" + } + }, "nice-napi": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/nice-napi/-/nice-napi-1.0.2.tgz", @@ -8205,9 +8288,9 @@ } }, "node-releases": { - "version": "1.1.77", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.77.tgz", - "integrity": "sha512-rB1DUFUNAN4Gn9keO2K1efO35IDK7yKHCdCaIMvFO7yUYmmZYeDjnGKle26G4rwj+LKRQpjyUUvMkPglwGCYNQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.0.tgz", + "integrity": "sha512-aA87l0flFYMzCHpTM3DERFSYxc6lv/BltdbRTOMZuxZ0cwZCD3mejE5n9vLhSJCN++/eOqr77G1IO5uXxlQYWA==", "dev": true }, "nopt": { @@ -8835,9 +8918,9 @@ "dev": true }, "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", "dev": true }, "picomatch": { @@ -8978,6 +9061,12 @@ "postcss-selector-parser": "^6.0.2" }, "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, "postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -9016,6 +9105,12 @@ "postcss-values-parser": "^2.0.0" }, "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, "postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -9045,6 +9140,12 @@ "postcss-values-parser": "^2.0.0" }, "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, "postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -9073,6 +9174,12 @@ "postcss-values-parser": "^2.0.1" }, "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, "postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -9102,6 +9209,12 @@ "postcss-values-parser": "^2.0.0" }, "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, "postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -9130,6 +9243,12 @@ "postcss-values-parser": "^2.0.0" }, "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, "postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -9178,6 +9297,12 @@ "postcss": "^7.0.14" }, "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, "postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -9206,6 +9331,12 @@ "postcss-values-parser": "^2.0.1" }, "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, "postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -9240,6 +9371,12 @@ "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", "dev": true }, + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, "postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -9285,6 +9422,12 @@ "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", "dev": true }, + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, "postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -9348,6 +9491,12 @@ "postcss-values-parser": "^2.0.0" }, "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, "postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -9376,6 +9525,12 @@ "postcss-values-parser": "^2.0.0" }, "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, "postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -9403,6 +9558,12 @@ "postcss": "^7.0.2" }, "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, "postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -9430,6 +9591,12 @@ "postcss": "^7.0.2" }, "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, "postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -9457,6 +9624,12 @@ "postcss": "^7.0.2" }, "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, "postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -9484,6 +9657,12 @@ "postcss": "^7.0.2" }, "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, "postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -9512,6 +9691,12 @@ "postcss-values-parser": "^2.0.0" }, "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, "postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -9550,6 +9735,12 @@ "postcss": "^7.0.2" }, "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, "postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -9579,6 +9770,12 @@ "postcss-values-parser": "^2.0.0" }, "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, "postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -9617,6 +9814,12 @@ "postcss": "^7.0.2" }, "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, "postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -9644,6 +9847,12 @@ "postcss": "^7.0.2" }, "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, "postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -9773,6 +9982,12 @@ "postcss": "^7.0.2" }, "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, "postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -9894,6 +10109,12 @@ "postcss": "^7.0.2" }, "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, "postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -9921,6 +10142,12 @@ "postcss": "^7.0.2" }, "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, "postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -9949,6 +10176,12 @@ "postcss-values-parser": "^2.0.0" }, "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, "postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -10012,6 +10245,12 @@ "postcss-selector-not": "^4.0.0" }, "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, "postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -10046,6 +10285,12 @@ "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", "dev": true }, + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, "postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -10104,6 +10349,12 @@ "postcss": "^7.0.2" }, "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, "postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -10132,6 +10383,12 @@ "postcss": "^7.0.2" }, "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, "postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -10160,6 +10417,12 @@ "postcss": "^7.0.2" }, "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, "postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -10654,6 +10917,11 @@ "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", "dev": true }, + "qr-scanner": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/qr-scanner/-/qr-scanner-1.3.0.tgz", + "integrity": "sha512-xNXlZaKOW0nihHaV7KPrMYJHNp1YX9z+NTqFrbNoibGIzQpPLeIocP9187lxihU/EbgplMm7sQ4hI9jG9+zYHg==" + }, "qs": { "version": "6.7.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", @@ -10990,6 +11258,12 @@ "source-map": "0.6.1" }, "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, "postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", @@ -11429,6 +11703,14 @@ "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", "dev": true }, + "smp-core-utils": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/smp-core-utils/-/smp-core-utils-12.0.0.tgz", + "integrity": "sha512-MAg2CkP3arJL1UmWEivbICYX3PtsBWHGAPMRAxgdUwdVaQOlkvb62HEd8qB9RDI80fIPqjelh6wIO3JmQBoXuQ==", + "requires": { + "tslib": "~2.3.0" + } + }, "snapdragon": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", @@ -12275,6 +12557,11 @@ "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", "dev": true }, + "ts-luxon": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ts-luxon/-/ts-luxon-2.2.0.tgz", + "integrity": "sha512-r+a1xiuy9VQAcwpiDwY2yP6aMlEPlvywUMt3MbOmoy9Y74z/QYAAuEs+Iy3dxVFzrXi8UT7qf7sQO0OeeUK75g==" + }, "ts-node": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.3.0.tgz", @@ -13168,39 +13455,12 @@ "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==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", "dev": true, "requires": { - "string-width": "^1.0.2 || 2" - }, - "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 - }, - "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" - } - }, - "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" - } - } + "string-width": "^1.0.2 || 2 || 3 || 4" } }, "wildcard": { diff --git a/package.json b/package.json index 60f53eb..27b9225 100644 --- a/package.json +++ b/package.json @@ -12,34 +12,36 @@ "private": true, "dependencies": { "@angular-material-components/datetime-picker": "^6.0.3", - "@angular/animations": "~12.2.8", - "@angular/cdk": "^12.2.8", - "@angular/common": "~12.2.8", - "@angular/compiler": "~12.2.8", - "@angular/core": "~12.2.8", + "@angular/animations": "^12.2.10", + "@angular/cdk": "^12.2.10", + "@angular/common": "^12.2.10", + "@angular/compiler": "^12.2.10", + "@angular/core": "^12.2.10", "@angular/flex-layout": "^12.0.0-beta.35", - "@angular/forms": "~12.2.8", - "@angular/material": "^12.2.8", - "@angular/material-moment-adapter": "^12.2.8", - "@angular/platform-browser": "~12.2.8", - "@angular/platform-browser-dynamic": "~12.2.8", - "@angular/router": "~12.2.8", + "@angular/forms": "^12.2.10", + "@angular/material": "^12.2.10", + "@angular/material-moment-adapter": "^12.2.10", + "@angular/platform-browser": "^12.2.10", + "@angular/platform-browser-dynamic": "^12.2.10", + "@angular/router": "^12.2.10", "moment": "^2.29.1", "ng-qrcode": "^5.1.1", + "ngx-mat-timepicker": "^12.1.0", "openpgp": "^4.10.10", + "qr-scanner": "^1.3.0", "rxjs": "~6.6.7", "tslib": "^2.3.1", "unique-names-generator": "^4.6.0", "zone.js": "~0.11.4" }, "devDependencies": { - "@angular-devkit/build-angular": "^12.2.8", - "@angular/cli": "~12.2.8", - "@angular/compiler-cli": "~12.2.8", - "@angular/localize": "^12.2.8", - "@types/jasmine": "^3.6.11", + "@angular-devkit/build-angular": "^12.2.10", + "@angular/cli": "^12.2.10", + "@angular/compiler-cli": "^12.2.10", + "@angular/localize": "^12.2.10", + "@types/jasmine": "^3.10.0", "@types/jasminewd2": "^2.0.10", - "@types/node": "^12.20.27", + "@types/node": "^12.20.33", "@types/openpgp": "^4.4.18", "codelyzer": "^6.0.2", "jasmine-core": "~3.6.0", diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts index 418e576..b59905c 100644 --- a/src/app/app-routing.module.ts +++ b/src/app/app-routing.module.ts @@ -27,6 +27,11 @@ import { InvitesComponent } from './pages/invites/invites.component'; import { UrlShortenerComponent, UrlShortenerPasswordComponent } from './pages/urlshortener/urlshortener.component'; import { MinetestAccountsComponent } from './pages/minetest/accounts/accounts.component'; import { DividertestComponent } from './pages/dividertest/dividertest.component' +import { BorrowProvingComponent } from './pages/borrow/proving/proving.component'; +import { BorrowItemEditComponent, BorrowItemsComponent } from './pages/borrow/items/items.component'; +import { BorrowRequestsComponent } from './pages/borrow/requests/requests.component'; +import { BorrowComponent } from './pages/borrow/borrow.component'; +import { InviteCodeComponent } from './pages/invites/code/code.component'; const routes: Routes = [ { path: 'profile/:username', component: UserComponent, canActivate: [ AuthUpdateGuard ] }, @@ -52,6 +57,14 @@ const routes: Routes = [ { path: 'domains', component: DomainsComponent, canActivate: [ AuthenticatedGuard ] } ] }, + { + path: 'borrow', component: BorrowComponent, canActivate: [ AuthenticatedGuard ], children: [ + { path: '', redirectTo: "/borrow/items", pathMatch: 'full' }, + { path: 'items', component: BorrowItemsComponent, canActivate: [ AuthenticatedGuard ] }, + { path: 'requests', component: BorrowRequestsComponent, canActivate: [ AuthenticatedGuard ] }, + { path: 'proving', component: BorrowProvingComponent, canActivate: [ AuthenticatedGuard ] } + ] + }, { path: 'register', component: RegisterComponent, canActivate: [ AnonymousGuard ] }, { path: 'tokens', component: TokensComponent, canActivate: [ AuthGuard ] }, { path: 'jitsi', component: JitsiComponent, canActivate: [ AuthenticatedGuard ] }, @@ -62,6 +75,7 @@ const routes: Routes = [ { path: 'urlshortener', component: UrlShortenerComponent, canActivate: [ AuthenticatedGuard ] }, { path: 'urlshortener/:code', component: UrlShortenerPasswordComponent, canActivate: [ AuthUpdateGuard ] }, { path: 'invites/:quota', component: InvitesComponent, canActivate: [ AuthenticatedGuard ] }, + { path: 'invite/:code', component: InviteCodeComponent, canActivate: [ AuthGuard ] }, { path: 'unavailable', component: UnavailableComponent }, { path: 'p/:username', component: UserComponent, canActivate: [ AuthUpdateGuard ] }, { path: '**', component: NotfoundComponent, pathMatch: 'full', canActivate: [ AuthUpdateGuard ] }, ] diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 1404144..435ba12 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -13,6 +13,7 @@ import { DatePipe } from '@angular/common'; import { AutofocusDirective } from './material/autofocus'; import { I18nPipe } from './utils/i18n.pipe'; +import { MomentPipe } from './utils/moment.pipe'; import { MainComponent } from './ui/main/main.component'; import { AccountComponent } from './pages/account/account.component'; import { ServicesComponent } from './pages/services/services.component'; @@ -42,18 +43,25 @@ import { UsernameDialog } from './pages/register/username-dialog/username.dialog import { UnavailableComponent } from './pages/unavailable/unavailable.component'; import { NotfoundComponent } from './pages/notfound/notfound.component'; import { HtmlComponent } from './utils/html/html.component'; -import { ConfirmDialog } from './ui/confirm/confirm.component' -import { UserComponent } from './pages/user/user.component' -import { JitsiComponent, JitsiEditDialog, JitsiShareDialog } from './pages/jitsi/jitsi.component' -import { ParteyComponent } from './pages/partey/partey.component' -import { ParteyTimeslotsComponent, ParteyTimeslotDialog } from './pages/partey/timeslots/timeslots.compontent' -import { UrlShortenerComponent, UrlShortenerPasswordComponent, UrlShortenerShareDialog, UrlShortenerEditDialog } from './pages/urlshortener/urlshortener.component' -import { DividerComponent } from './ui/divider/divider.component' -import { DividertestComponent } from './pages/dividertest/dividertest.component' +import { ConfirmDialog } from './ui/confirm/confirm.component'; +import { UserComponent } from './pages/user/user.component'; +import { JitsiComponent, JitsiEditDialog, JitsiShareDialog } from './pages/jitsi/jitsi.component'; +import { ParteyComponent } from './pages/partey/partey.component'; +import { ParteyTimeslotsComponent, ParteyTimeslotDialog } from './pages/partey/timeslots/timeslots.compontent'; +import { UrlShortenerComponent, UrlShortenerPasswordComponent, UrlShortenerShareDialog, UrlShortenerEditDialog } from './pages/urlshortener/urlshortener.component'; +import { BorrowItemEditComponent, BorrowItemsComponent } from './pages/borrow/items/items.component'; +import { BorrowRequestEditComponent, BorrowRequestsComponent } from './pages/borrow/requests/requests.component'; +import { BorrowProvingComponent, BorrowProvingResultDialog } from './pages/borrow/proving/proving.component'; +import { DividerComponent } from './ui/divider/divider.component'; +import { DividertestComponent } from './pages/dividertest/dividertest.component'; import { I18nService } from './services/i18n.service'; import { MinetestAccountsComponent } from './pages/minetest/accounts/accounts.component'; +import { BorrowComponent } from './pages/borrow/borrow.component'; +import { DurationpickerComponent } from './ui/durationpicker/durationpicker.component'; +import { InviteCodeComponent } from './pages/invites/code/code.component'; +import { InviteEditComponent } from './pages/invites/edit/invite.edit'; export function init_app(i18n: I18nService) { @@ -75,6 +83,7 @@ export class XhrInterceptor implements HttpInterceptor { declarations: [ AutofocusDirective, I18nPipe, + MomentPipe, MainComponent, AppComponent, AccountComponent, @@ -82,7 +91,7 @@ export class XhrInterceptor implements HttpInterceptor { FormLoginComponent, FormLogin2FAComponent, TokensComponent, - InvitesComponent, + InvitesComponent, InviteCodeComponent, InviteEditComponent, ServicesComponent, PermissionsComponent, ProfileFieldsComponent, ProfileFieldDialog, ProfileFieldBlob, ProfileFieldPgpBlob, @@ -110,7 +119,9 @@ export class XhrInterceptor implements HttpInterceptor { ParteyComponent, ParteyTimeslotsComponent, ParteyTimeslotDialog, MinetestAccountsComponent, UrlShortenerComponent, UrlShortenerShareDialog, UrlShortenerEditDialog, UrlShortenerPasswordComponent, - DividerComponent, DividertestComponent + BorrowComponent, BorrowItemsComponent, BorrowItemEditComponent, BorrowRequestsComponent, BorrowRequestEditComponent, BorrowProvingComponent, BorrowProvingResultDialog, + DividerComponent, DividertestComponent, + DurationpickerComponent ], imports: [ BrowserModule, diff --git a/src/app/material/material.module.ts b/src/app/material/material.module.ts index a1c2631..90fa1c8 100644 --- a/src/app/material/material.module.ts +++ b/src/app/material/material.module.ts @@ -47,10 +47,11 @@ import {FlexLayoutModule} from '@angular/flex-layout'; import { NgxMatDatetimePickerModule, - NgxMatNativeDateModule, - NgxMatTimepickerModule + NgxMatNativeDateModule } from '@angular-material-components/datetime-picker'; +import { NgxMatTimepickerModule } from 'ngx-mat-timepicker'; + @NgModule({ declarations: [], imports: [ diff --git a/src/app/pages/borrow/borrow.component.html b/src/app/pages/borrow/borrow.component.html new file mode 100644 index 0000000..d6a2d73 --- /dev/null +++ b/src/app/pages/borrow/borrow.component.html @@ -0,0 +1,15 @@ +

{{'borrow' | i18n}}

+ + + + \ No newline at end of file diff --git a/src/app/pages/borrow/borrow.component.scss b/src/app/pages/borrow/borrow.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/pages/borrow/borrow.component.ts b/src/app/pages/borrow/borrow.component.ts new file mode 100644 index 0000000..59fb52f --- /dev/null +++ b/src/app/pages/borrow/borrow.component.ts @@ -0,0 +1,10 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-borrow', + templateUrl: './borrow.component.html', + styleUrls: [ './borrow.component.scss' ] +}) +export class BorrowComponent { + +} diff --git a/src/app/pages/borrow/items/item.edit.html b/src/app/pages/borrow/items/item.edit.html new file mode 100644 index 0000000..c9b2fea --- /dev/null +++ b/src/app/pages/borrow/items/item.edit.html @@ -0,0 +1,204 @@ +

{{(create ? 'borrow.items.create' : 'borrow.items.edit') | i18n}}

+ +
+ + + + {{'borrow.items.error.name' | i18n}} + + + + + + + {{'borrow.items.error.description' | i18n}} + + + + + + + {{'borrow.items.error.url' | i18n}} + + + +
+ + + + + + {{'borrow.items.error.minDuration' | i18n}} + + + + + + + + + {{'borrow.items.error.maxDuration' | i18n}} + + +
+ +
+ + + + {{'borrow.items.availability.ALWAYS' | i18n}} + + + {{'borrow.items.availability.PERIOD' | i18n}} + + + {{'borrow.items.availability.MANUAL' | i18n}} + + + + {{'borrow.items.error.availability' | i18n}} + + + + + {{'borrow.items.autoAccept' | i18n}} + + + + + + + {{'borrow.items.emailNotification' | i18n}} + + + + + + + + {{'borrow.items.error.email' | i18n}} + + +
+ + +
+ + + +
+ + + + + + {{'borrow.items.error.slot.start' | i18n}} + + + + + + + + + {{'borrow.items.error.slot.end' | i18n}} + + + +
+ + +
+
+
+
+ + +
+ + + +
+ + + + {{'borrow.items.slot.day.' + day | i18n}} + + + + {{'borrow.items.error.slot.startDay' | i18n}} + + + + + + + watch_later + + + {{'borrow.items.error.slot.startTime' | i18n}} + + + + + + + + {{'borrow.items.slot.day.' + day | i18n}} + + + + {{'borrow.items.error.slot.endDay' | i18n}} + + + + + + + watch_later + + + {{'borrow.items.error.slot.endTime' | i18n}} + + + + +
+ + +
+
+
+
+
+
+ +
+
+ + +
+ +
+
\ No newline at end of file diff --git a/src/app/pages/borrow/items/item.edit.scss b/src/app/pages/borrow/items/item.edit.scss new file mode 100644 index 0000000..51274f4 --- /dev/null +++ b/src/app/pages/borrow/items/item.edit.scss @@ -0,0 +1,7 @@ +mat-form-field { + display: block; +} + +mat-dialog-actions>div { + width: 100%; +} diff --git a/src/app/pages/borrow/items/items.component.html b/src/app/pages/borrow/items/items.component.html new file mode 100644 index 0000000..92c267c --- /dev/null +++ b/src/app/pages/borrow/items/items.component.html @@ -0,0 +1,65 @@ +

{{'borrow.items' | i18n}}

+
+
+
+ + + + + {{'borrow.items.mine' | i18n}} + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
{{'borrow.items.name' | i18n}} {{ borrowItem.name}} {{'borrow.items.description' | i18n}} {{ borrowItem.description}} {{'borrow.items.availability' | i18n}} {{ 'borrow.items.availability.' + borrowItem.availability | i18n}} + {{'borrow.items.url' | i18n}} + + {{ borrowItem.url }} + open_in_new + + {{'borrow.items.actions' | i18n}} + + pending_actions + + + edit + + + delete + + + pending_actions + +
+ +
\ No newline at end of file diff --git a/src/app/pages/borrow/items/items.component.scss b/src/app/pages/borrow/items/items.component.scss new file mode 100644 index 0000000..7154044 --- /dev/null +++ b/src/app/pages/borrow/items/items.component.scss @@ -0,0 +1,21 @@ +.mat-form-field+.mat-form-field, .mat-form-field+.mat-slide-toggle { + margin-left: 8px; +} + +.mat-header-cell, +.mat-cell { + &.text-right { + text-align: right; + } +} + +.mat-cell .mat-button { + padding-left: 0px; + padding-right: 0px; +} + +.align-right{ + display: flex; + padding: 21px 0; + justify-content: flex-end; +} diff --git a/src/app/pages/borrow/items/items.component.ts b/src/app/pages/borrow/items/items.component.ts new file mode 100644 index 0000000..0742adf --- /dev/null +++ b/src/app/pages/borrow/items/items.component.ts @@ -0,0 +1,410 @@ +import { Component, Inject, OnInit } from '@angular/core'; +import { FormArray, FormBuilder, FormControl, FormGroup, ValidatorFn, Validators } from '@angular/forms'; +import { debounceTime } from 'rxjs/operators'; +import { PageEvent } from '@angular/material/paginator'; +import { Sort } from '@angular/material/sort'; +import { MatDialog, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; +import * as moment from 'moment'; + +import { ConfirmDialog } from '../../../ui/confirm/confirm.component'; +import { BorrowItemsService } from './../../../services/borrow.service'; +import { AuthService } from './../../../services/auth.service'; +import { BorrowRequestEditComponent } from '../requests/requests.component'; + +@Component({ + selector: 'app-borrow-items', + templateUrl: './items.component.html', + styleUrls: [ './items.component.scss' ] +}) +export class BorrowItemsComponent implements OnInit { + + borrowItems: any[]; + page: any = { page: 0, size: 10, sort: "id", desc: false }; + pageSizeOptions: number[] = [ 5, 10, 25, 50 ]; + searchFormControl = new FormControl(); + ownerFormControl = new FormControl(); + userId: any; + + borrowItemColumns = [ "name", "description", "availability", "url", "actions" ]; + + constructor(private borrowItemsService: BorrowItemsService, + private authService: AuthService, + public dialog: MatDialog) { + } + + ngOnInit() { + this.authService.auth.subscribe((auth: any) => { + if (auth.principal && auth.principal.userId) { + this.userId = auth.principal.userId; + } + }); + + this.searchFormControl.valueChanges.pipe(debounceTime(500)).subscribe(value => { + this.borrowItemsService.getItems(0, this.page.size, this.page.sort, this.page.desc, value, this.ownerFormControl.value).subscribe((data: any) => { + this.borrowItems = data; + }, (error) => { }) + }) + + this.ownerFormControl.valueChanges.subscribe(value => { + this.borrowItemsService.getItems(0, this.page.size, this.page.sort, this.page.desc, this.searchFormControl.value, value).subscribe((data: any) => { + this.borrowItems = data; + }, (error) => { }) + }) + + this.refresh(); + } + + refresh(): void { + this.borrowItemsService.getItems(this.page.page, this.page.size, this.page.sort, this.page.desc, this.searchFormControl.value, this.ownerFormControl.value).subscribe((data: any) => { + this.borrowItems = data; + }) + } + + updatePages(event: PageEvent) { + this.page.page = event.pageIndex; + this.page.size = event.pageSize; + this.borrowItemsService.getItems(this.page.page, this.page.size, this.page.sort, this.page.desc, this.searchFormControl.value, this.ownerFormControl.value).subscribe((data: any) => { + this.borrowItems = data; + }, (error) => { }) + } + + updateSort(sort: Sort) { + if (sort.direction == "") { + this.page.sort = "id"; + this.page.desc = false; + } else { + this.page.sort = sort.active; + this.page.desc = sort.direction == "desc"; + } + this.borrowItemsService.getItems(this.page.page, this.page.size, this.page.sort, this.page.desc, this.searchFormControl.value, this.ownerFormControl.value).subscribe((data: any) => { + this.borrowItems = data; + }, (error) => { }) + } + + edit(borrowItem) { + const dialogRef = this.dialog.open(BorrowItemEditComponent, { + data: borrowItem, + minWidth: '80%' + }); + + dialogRef.afterClosed().subscribe(result => { + if (result) { + this.refresh(); + } + }); + } + + create() { + const dialogRef = this.dialog.open(BorrowItemEditComponent, { + data: {}, + minWidth: '80%' + }); + + dialogRef.afterClosed().subscribe(result => { + if (result) { + this.refresh(); + } + }); + } + + request(borrowItem) { + const dialogRef = this.dialog.open(BorrowRequestEditComponent, { + data: { + "user": this.userId, + "borrowItem": borrowItem + } + }); + + dialogRef.afterClosed().subscribe(result => { + if (result) { + this.refresh(); + } + }); + } + + confirmDelete(borrowItem) { + const dialogRef = this.dialog.open(ConfirmDialog, { + data: { + 'label': 'borrow.items.confirmDelete', + 'args': [ borrowItem.name ] + } + }) + + dialogRef.afterClosed().subscribe(result => { + if (result) { + this.borrowItemsService.deleteItem(borrowItem.id).subscribe((result: any) => { + this.refresh(); + }) + } + }); + } + +} + +@Component({ + selector: 'app-borrow-item-edit', + templateUrl: './item.edit.html', + styleUrls: [ './item.edit.scss' ] +}) +export class BorrowItemEditComponent { + + borrowItemId: number; + create: boolean = false; + form: FormGroup; + weekdays: string[] = [ 'MONDAY', 'TUESDAY', 'WEDNESDAY', 'THURSDAY', 'FRIDAY', 'SATURDAY', 'SUNDAY' ]; + + constructor(private borrowItemsService: BorrowItemsService, + private formBuilder: FormBuilder, + @Inject(MAT_DIALOG_DATA) public data: any, + public dialogRef: MatDialogRef, + public dialog: MatDialog) { + + this.form = this.formBuilder.group({ + name: [ '', Validators.required ], + description: [ '', Validators.nullValidator ], + url: [ '', Validators.nullValidator ], + minDuration: [ '', Validators.nullValidator ], + maxDuration: [ '', Validators.nullValidator ], + availability: [ '', Validators.required ], + autoAccept: [ '', Validators.nullValidator ], + emailNotification: [ '', Validators.nullValidator ], + email: [ '', Validators.nullValidator ], + slots: this.formBuilder.array([]) + }, { validators: [ durationValidator ] }) + + this.form.get('availability').valueChanges.subscribe((value) => { + this.slots.clear(); + if (value == 'MANUAL') { + this.addManualSlot('', '', ''); + } else if (value == 'PERIOD') { + this.addPeriodSlot('', '', '', '', ''); + } + }) + + if (data.id) { + this.borrowItemId = + data.id; + } else { + this.create = true; + this.borrowItemId = undefined; + } + + this.form.get('name').setValue(data.name, { emitEvent: false }); + this.form.get('description').setValue(data.description, { emitEvent: false }); + this.form.get('url').setValue(data.url, { emitEvent: false }); + this.form.get('minDuration').setValue(data.minDuration, { emitEvent: false }); + this.form.get('maxDuration').setValue(data.maxDuration, { emitEvent: false }); + this.form.get('availability').setValue(data.availability || 'ALWAYS', { emitEvent: false }); + this.form.get('autoAccept').setValue(data.autoAccept, { emitEvent: false }); + this.form.get('emailNotification').setValue(data.emailNotification, { emitEvent: false }); + this.form.get('email').setValue(data.email), { emitEvent: false }; + if (data.slots) { + for (let slot of data.slots) { + if (data.availability == 'MANUAL') { + this.addManualSlot(slot.id, slot.start, slot.end); + } else if (data.availability == 'PERIOD') { + this.addPeriodSlot(slot.id, slot.startDay, slot.startTime, slot.endDay, slot.endTime); + } + } + } + } + + formToBorrowItem(): any { + const borrowItem: any = {}; + borrowItem.id = this.borrowItemId; + borrowItem.name = this.form.get('name').value; + borrowItem.description = this.form.get('description').value; + borrowItem.url = this.form.get('url').value; + borrowItem.minDuration = this.form.get('minDuration').value; + borrowItem.maxDuration = this.form.get('maxDuration').value; + borrowItem.availability = this.form.get('availability').value; + borrowItem.autoAccept = this.form.get('autoAccept').value; + borrowItem.emailNotification = this.form.get('emailNotification').value; + borrowItem.email = this.form.get('email').value; + const slots: any[] = []; + for (let slotForm of this.slots.controls) { + if (borrowItem.availability == 'MANUAL') { + slots.push({ + id: slotForm.get('id').value, + start: slotForm.get('start').value, + end: slotForm.get('end').value, + type: 'MANUAL' + }) + } else if (borrowItem.availability == 'PERIOD') { + slots.push({ + id: slotForm.get('id').value, + startDay: slotForm.get('startDay').value, + startTime: slotForm.get('startTime').value, + endDay: slotForm.get('endDay').value, + endTime: slotForm.get('endTime').value, + type: 'PERIOD' + }) + } + } + + borrowItem.slots = slots; + return borrowItem; + } + + get slots() { + return this.form.controls[ "slots" ] as FormArray; + } + + deleteSlot(index: number) { + this.slots.removeAt(index); + } + + dublicateSlot(index: number) { + this.slots.push(this.slots.at(index)); + } + + addManualSlot(id, start, end) { + const manualSlotForm = this.formBuilder.group({ + id: [ id, Validators.required ], + start: [ start, Validators.required ], + end: [ end, Validators.required ] + }, { validators: [ manualSlotValidator ] }); + this.slots.push(manualSlotForm); + } + + addPeriodSlot(id, startDay: string, startTime: string, endDay: string, endTime: string) { + if (startTime.length == 8) { + startTime = startTime.substr(0, 5); + } + if (endTime.length == 8) { + endTime = endTime.substr(0, 5); + } + const perdiodSlotForm = this.formBuilder.group({ + id: [ id, Validators.required ], + startDay: [ startDay, Validators.required ], + startTime: [ startTime, Validators.required ], + endDay: [ endDay, Validators.required ], + endTime: [ endTime, Validators.required ] + }, { validators: [ periodSlotValidator ] }); + this.slots.push(perdiodSlotForm); + } + + + save() { + this.borrowItemsService.createOrUpdateItem(this.formToBorrowItem()).subscribe((data: any) => { + this.dialogRef.close(data); + }, (error) => { + if (error.status == 409) { + let errors = {}; + for (let code of error.error) { + errors[ code.field ] = errors[ code.field ] || {}; + errors[ code.field ][ code.code ] = true; + } + + for (let code in errors) { + this.form.get(code).setErrors(errors[ code ]); + } + } + }); + } + + confirmDelete() { + const borrowItem = this.formToBorrowItem(); + + const dialogRef = this.dialog.open(ConfirmDialog, { + data: { + 'label': 'borrow.items.confirmDelete', + 'args': [ borrowItem.name ] + } + }) + + dialogRef.afterClosed().subscribe(result => { + if (result) { + this.borrowItemsService.deleteItem(borrowItem.id).subscribe((result: any) => { + this.dialogRef.close(true); + }) + } + }); + } +} + +const durationValidator: ValidatorFn = (fg: FormGroup) => { + const minDuration = fg.get('minDuration').value; + const maxDuration = fg.get('maxDuration').value; + fg.get('minDuration').setErrors(null); + fg.get('maxDuration').setErrors(null); + + if (minDuration && maxDuration && (moment.duration(minDuration).asMinutes() >= moment.duration(maxDuration).asMinutes())) { + fg.get('minDuration').setErrors([ 'INVALID' ]); + fg.get('maxDuration').setErrors([ 'INVALID' ]); + return { 'INVALID': true }; + } + + return null; +}; + + +const manualSlotValidator: ValidatorFn = (fg: FormGroup) => { + const start = fg.get('start').value; + const end = fg.get('end').value; + + fg.get('id').setErrors(null); + fg.get('start').setErrors(null); + fg.get('end').setErrors(null); + + if (!start) { + fg.get('start').setErrors([ 'MISSING_DATES' ]); + return { 'MISSING_DATES': true }; + } + if (!end) { + fg.get('end').setErrors([ 'MISSING_DATES' ]); + return { 'MISSING_DATES': true }; + } + + if (start >= end) { + fg.get('start').setErrors([ 'INVALID_DATES' ]); + fg.get('end').setErrors([ 'INVALID_DATES' ]); + return { 'INVALID_DATES': true }; + } + + return null; +}; + +const periodSlotValidator: ValidatorFn = (fg: FormGroup) => { + const weekdays: string[] = [ 'MONDAY', 'TUESDAY', 'WEDNESDAY', 'THURSDAY', 'FRIDAY', 'SATURDAY', 'SUNDAY' ]; + const startDay = fg.get('startDay').value; + const startTime = fg.get('startTime').value; + const endDay = fg.get('endDay').value; + const endTime = fg.get('endTime').value; + + fg.get('id').setErrors(null); + fg.get('startDay').setErrors(null); + fg.get('startTime').setErrors(null); + fg.get('endDay').setErrors(null); + fg.get('endTime').setErrors(null); + + if (!startDay) { + fg.get('startDay').setErrors([ 'MISSING_DATES' ]); + return { 'MISSING_DATES': true }; + } + if (!startTime) { + fg.get('startTime').setErrors([ 'MISSING_DATES' ]); + return { 'MISSING_DATES': true }; + } + if (!endDay) { + fg.get('endDay').setErrors([ 'MISSING_DATES' ]); + return { 'MISSING_DATES': true }; + } + if (!endTime) { + fg.get('endTime').setErrors([ 'MISSING_DATES' ]); + return { 'MISSING_DATES': true }; + } + + if (weekdays.indexOf(startDay) > weekdays.indexOf(endDay)) { + fg.get('startDay').setErrors([ 'INVALID_DAY' ]); + fg.get('endDay').setErrors([ 'INVALID_DAY' ]); + return { 'INVALID_DAY': true }; + } + + if (weekdays.indexOf(startDay) == weekdays.indexOf(endDay) && startTime >= endTime) { + fg.get('startTime').setErrors([ 'INVALID_TIME' ]); + fg.get('endTime').setErrors([ 'INVALID_TIME' ]); + return { 'INVALID_TIME': true }; + } + + return null; +}; \ No newline at end of file diff --git a/src/app/pages/borrow/proving/proving.component.html b/src/app/pages/borrow/proving/proving.component.html new file mode 100644 index 0000000..245002e --- /dev/null +++ b/src/app/pages/borrow/proving/proving.component.html @@ -0,0 +1,30 @@ + + +
+ + + + {{camera.label || camera.id}} + + + + + + {{'borrow.proving.flash' | i18n}} + + +
+ + + + + no_photography + + {{'borrow.proving.noCamera' | i18n}} + + +

+ {{'borrow.proving.noCamera.text' | i18n}} +

+
+
\ No newline at end of file diff --git a/src/app/pages/borrow/proving/proving.component.scss b/src/app/pages/borrow/proving/proving.component.scss new file mode 100644 index 0000000..25d036c --- /dev/null +++ b/src/app/pages/borrow/proving/proving.component.scss @@ -0,0 +1,4 @@ +video { + width: 100%; + height: auto; +} \ No newline at end of file diff --git a/src/app/pages/borrow/proving/proving.component.ts b/src/app/pages/borrow/proving/proving.component.ts new file mode 100644 index 0000000..299ab62 --- /dev/null +++ b/src/app/pages/borrow/proving/proving.component.ts @@ -0,0 +1,105 @@ +import { AfterViewInit, Component, ElementRef, ViewChild, Inject } from '@angular/core'; +import { MatDialog, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; + +import { BorrowRequestsService } from 'src/app/services/borrow.service'; + +import QrScanner from 'qr-scanner'; +import { HttpResponse } from '@angular/common/http'; +import { FormControl } from '@angular/forms'; + +@Component({ + selector: 'app-borrow-proving', + templateUrl: './proving.component.html', + styleUrls: [ './proving.component.scss' ] +}) +export class BorrowProvingComponent implements AfterViewInit { + + @ViewChild('qrCam') private qrCamVideo: ElementRef; + toggleFlash = new FormControl(); + camera = new FormControl(); + + qrScanner: QrScanner; + cameras: QrScanner.Camera[]; + noCamera: boolean = true; + initialized: boolean = false; + + constructor(private borrowRequestService: BorrowRequestsService, private dialog: MatDialog) { + } + + ngAfterViewInit() { + this.qrScanner = new QrScanner(this.qrCamVideo.nativeElement, (result) => { + this.onResult(result); + }); + + this.qrScanner.start().then(() => { + this.initialized = true; + QrScanner.listCameras(true).then((cameras: QrScanner.Camera[]) => { + this.cameras = cameras; + if (this.cameras.length) { + this.noCamera = false; + this.camera.setValue(this.cameras[ 0 ].id, { emitEvent: false }); + this.camera.valueChanges.subscribe((value) => { + this.qrScanner.setCamera(value); + }) + } + }) + + this.qrScanner.hasFlash().then(hasFlash => { + if (hasFlash) { + this.toggleFlash.enable(); + this.toggleFlash.valueChanges.subscribe(value => { + if (value) { + this.qrScanner.turnFlashOn(); + } else { + this.qrScanner.turnFlashOff(); + } + }); + } else { + this.toggleFlash.disable(); + } + }); + }); + + } + + onResult(result: string) { + this.qrScanner.pause(); + this.borrowRequestService.verifyRequest(result).subscribe((response) => { + this.openResultDialog(response, true); + }, (error) => { + this.openResultDialog(error, false); + }); + } + + openResultDialog(response, success: boolean) { + const dialogRef = this.dialog.open(BorrowProvingResultDialog, { + data: { "success": success, "response": response }, + minWidth: '400px', + panelClass: "mat-card-dialog", + closeOnNavigation: false, + disableClose: true, + }); + + dialogRef.afterClosed().subscribe(result => { + this.qrScanner.start(); + }); + } +} + + +@Component({ + selector: 'app-borrow-prooving-result', + templateUrl: 'proving.dialog.html', + styleUrls: [ './proving.dialog.scss' ] +}) +export class BorrowProvingResultDialog { + + result: any; + + constructor( + @Inject(MAT_DIALOG_DATA) private data: any) { + this.result = JSON.parse(JSON.stringify(data)); + console.log(this.result); + } + +} \ No newline at end of file diff --git a/src/app/pages/borrow/proving/proving.dialog.html b/src/app/pages/borrow/proving/proving.dialog.html new file mode 100644 index 0000000..da96d4f --- /dev/null +++ b/src/app/pages/borrow/proving/proving.dialog.html @@ -0,0 +1,55 @@ + + + + + block + help_outline + check + + {{'borrow.proving.' + (result.success ? 'valid' : 'invalid') | i18n}} + + +

+ {{'borrow.proving.' + (result.success ? 'valid' : 'invalid') + '.text' | i18n}} +

+

+ + + {{'borrow.proving.error.' + error.code | i18n:(error.defaultMessage | datef)}} + + + {{'borrow.proving.error.' + error.code | i18n:(error.defaultMessage | datef)}} + + + {{'borrow.proving.error.default.' + error.code | i18n:error.defaultMessage}} + + +

+ + + + + + + + + + + + + + + + + + + + + +
{{'borrow.request.user' | i18n}}{{result.response.user}}
{{'borrow.request.item' | i18n}}{{result.response.name}}
{{'borrow.request.owner' | i18n}}{{result.response.owner}}
{{'borrow.request.started' | i18n}}{{result.response.nbf | datef}}
{{'borrow.request.ends' | i18n}}{{result.response.exp | datef}}
+
+ + + +
+
\ No newline at end of file diff --git a/src/app/pages/borrow/proving/proving.dialog.scss b/src/app/pages/borrow/proving/proving.dialog.scss new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/src/app/pages/borrow/proving/proving.dialog.scss @@ -0,0 +1 @@ + diff --git a/src/app/pages/borrow/requests/request.edit.html b/src/app/pages/borrow/requests/request.edit.html new file mode 100644 index 0000000..c3bc44c --- /dev/null +++ b/src/app/pages/borrow/requests/request.edit.html @@ -0,0 +1,66 @@ +

{{(create ? 'borrow.request.create' : 'borrow.request.edit') | i18n}}

+ + +

{{borrowRequest.borrowItem.name}}

+

{{borrowRequest.borrowItem.description}}

+ + + {{ borrowRequest.borrowItem.url }} + open_in_new + +
+
+ + + + + + Accent fish + + + + +
+ + + + + + {{'borrow.request.error.start' | i18n}} + + + + + + + + + {{'borrow.request.error.end' | i18n}} + + + + + + + {{'borrow.request.error.comment' | i18n}} + + +
+
+ +
+
+ + +
+ +
+
\ No newline at end of file diff --git a/src/app/pages/borrow/requests/request.edit.scss b/src/app/pages/borrow/requests/request.edit.scss new file mode 100644 index 0000000..51274f4 --- /dev/null +++ b/src/app/pages/borrow/requests/request.edit.scss @@ -0,0 +1,7 @@ +mat-form-field { + display: block; +} + +mat-dialog-actions>div { + width: 100%; +} diff --git a/src/app/pages/borrow/requests/requests.component.html b/src/app/pages/borrow/requests/requests.component.html new file mode 100644 index 0000000..4f35f64 --- /dev/null +++ b/src/app/pages/borrow/requests/requests.component.html @@ -0,0 +1,55 @@ +

{{'borrow.requests' | i18n}}

+
+
+
+ + {{'borrow.requests.mine' | i18n}} + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
{{'borrow.item.name' | i18n}} {{ borrowRequest.borrowItem.name}} {{'borrow.requests.starts' | i18n}} {{ borrowRequest.starts | datef}} + {{'borrow.requests.ends' | i18n}} {{ borrowRequest.ends | datef}} + {{'borrow.requests.status' | i18n}} {{ 'borrow.requests.status.' + borrowRequest.status | i18n}} + {{'borrow.requests.actions' | i18n}} + + edit + + + delete + + + pending_actions + +
+ +
\ No newline at end of file diff --git a/src/app/pages/borrow/requests/requests.component.scss b/src/app/pages/borrow/requests/requests.component.scss new file mode 100644 index 0000000..7154044 --- /dev/null +++ b/src/app/pages/borrow/requests/requests.component.scss @@ -0,0 +1,21 @@ +.mat-form-field+.mat-form-field, .mat-form-field+.mat-slide-toggle { + margin-left: 8px; +} + +.mat-header-cell, +.mat-cell { + &.text-right { + text-align: right; + } +} + +.mat-cell .mat-button { + padding-left: 0px; + padding-right: 0px; +} + +.align-right{ + display: flex; + padding: 21px 0; + justify-content: flex-end; +} diff --git a/src/app/pages/borrow/requests/requests.component.ts b/src/app/pages/borrow/requests/requests.component.ts new file mode 100644 index 0000000..b5bfe90 --- /dev/null +++ b/src/app/pages/borrow/requests/requests.component.ts @@ -0,0 +1,181 @@ +import { Component, Inject, OnInit } from '@angular/core'; +import { FormArray, FormBuilder, FormControl, FormGroup, ValidatorFn, Validators } from '@angular/forms'; +import { debounceTime } from 'rxjs/operators'; +import { PageEvent } from '@angular/material/paginator'; +import { Sort } from '@angular/material/sort'; +import { MatDialog, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; +import * as moment from 'moment'; + +import { ConfirmDialog } from '../../../ui/confirm/confirm.component'; +import { BorrowRequestsService } from './../../../services/borrow.service'; +import { I18nService } from './../../../services/i18n.service'; +import { AuthService } from './../../../services/auth.service'; + +@Component({ + selector: 'app-borrow-requests', + templateUrl: './requests.component.html', + styleUrls: [ './requests.component.scss' ] +}) +export class BorrowRequestsComponent implements OnInit { + + borrowRequests: any[]; + page: any = { page: 0, size: 10, sort: "id", desc: false }; + pageSizeOptions: number[] = [ 5, 10, 25, 50 ]; + ownerFormControl = new FormControl(); + userId: any; + + borrowRequestColumns = [ "name", "status", "starts", "ends", "actions" ]; + + constructor(private borrowRequestsService: BorrowRequestsService, + private i18n: I18nService, + private authService: AuthService, + public dialog: MatDialog) { + } + + ngOnInit() { + this.authService.auth.subscribe((auth: any) => { + if (auth.principal && auth.principal.userId) { + this.userId = auth.principal.userId; + } + }); + + + this.ownerFormControl.valueChanges.subscribe(value => { + this.borrowRequestsService.getRequests(0, this.page.size, this.page.sort, this.page.desc, value).subscribe((data: any) => { + this.borrowRequests = data; + }, (error) => { }) + }) + + this.refresh(); + } + + refresh(): void { + this.borrowRequestsService.getRequests(this.page.page, this.page.size, this.page.sort, this.page.desc, this.ownerFormControl.value).subscribe((data: any) => { + this.borrowRequests = data; + }) + } + + updatePages(event: PageEvent) { + this.page.page = event.pageIndex; + this.page.size = event.pageSize; + this.borrowRequestsService.getRequests(this.page.page, this.page.size, this.page.sort, this.page.desc, this.ownerFormControl.value).subscribe((data: any) => { + this.borrowRequests = data; + }, (error) => { }) + } + + updateSort(sort: Sort) { + if (sort.direction == "") { + this.page.sort = "id"; + this.page.desc = false; + } else { + this.page.sort = sort.active; + this.page.desc = sort.direction == "desc"; + } + this.borrowRequestsService.getRequests(this.page.page, this.page.size, this.page.sort, this.page.desc, this.ownerFormControl.value).subscribe((data: any) => { + this.borrowRequests = data; + }, (error) => { }) + } + + edit(borrowRequest) { + const dialogRef = this.dialog.open(BorrowRequestEditComponent, { + data: borrowRequest + }); + + dialogRef.afterClosed().subscribe(result => { + if (result) { + this.refresh(); + } + }); + } + + confirmDelete(borrowRequest) { + const dialogRef = this.dialog.open(ConfirmDialog, { + data: { + 'label': 'borrow.items.confirmDelete', + 'args': [ borrowRequest.name ] + } + }) + + dialogRef.afterClosed().subscribe(result => { + if (result) { + this.borrowRequestsService.deleteRequest(borrowRequest.id).subscribe((result: any) => { + this.refresh(); + }) + } + }); + } + +} + +@Component({ + selector: 'app-borrow-request-edit', + templateUrl: './request.edit.html', + styleUrls: [ './request.edit.scss' ] +}) +export class BorrowRequestEditComponent { + + borrowRequest: any; + create: boolean = false; + form: FormGroup; + + constructor(private borrowRequestsService: BorrowRequestsService, + private formBuilder: FormBuilder, + @Inject(MAT_DIALOG_DATA) public data: any, + public dialogRef: MatDialogRef, + public dialog: MatDialog) { + + this.form = this.formBuilder.group({ + }) + + this.borrowRequest = data; + + if (!this.borrowRequest.id) { + this.create = true; + } + + } + + formToBorrowRequest(): any { + const borrowRequest: any = {}; + return borrowRequest; + } + + + + save() { + this.borrowRequestsService.createOrUpdateRequest(this.formToBorrowRequest()).subscribe((data: any) => { + this.dialogRef.close(data); + }, (error) => { + if (error.status == 409) { + let errors = {}; + for (let code of error.error) { + errors[ code.field ] = errors[ code.field ] || {}; + errors[ code.field ][ code.code ] = true; + } + + for (let code in errors) { + this.form.get(code).setErrors(errors[ code ]); + } + } + }); + } + + confirmDelete() { + const borrowRequest = this.formToBorrowRequest(); + + const dialogRef = this.dialog.open(ConfirmDialog, { + data: { + 'label': 'borrow.requests.confirmDelete', + 'args': [ borrowRequest.name ] + } + }) + + dialogRef.afterClosed().subscribe(result => { + if (result) { + this.borrowRequestsService.deleteRequest(borrowRequest.id).subscribe((result: any) => { + this.dialogRef.close(true); + }) + } + }); + } +} \ No newline at end of file diff --git a/src/app/pages/invites/code/code.component.html b/src/app/pages/invites/code/code.component.html new file mode 100644 index 0000000..e7d859a --- /dev/null +++ b/src/app/pages/invites/code/code.component.html @@ -0,0 +1,117 @@ + + + {{'invites.register' | i18n}} + + + +

+ {{'invites.quota.' + invite.quota + ".icon" | i18n}} {{'invites.quota.' + + + invite.quota + | i18n}} +

+ +

{{'invites.quota.' + invite.quota + + ".text" | i18n}}

+

+ {{'invites.register.url' | + i18n}} +

+ + +
+ {{invite.message}}
+
{{invite.note}} +
+
+ + + + + {{'username.error' | i18n}} + + + autorenew + + + + + +
+ {{'password.error.' + error.key | i18n}}
+
+
+
+ + + + {{'password.not-match' | i18n}} + + +
+ + + + + {{'invite.errors.message' | i18n}} + + + + + + {{'invites.error.note' | i18n}} + + + +
+
+ +

{{'invites.register.success' | i18n}}

+

{{'invites.register.success.text' | i18n}}

+
+
+ + + {{'invites.register.error.' + error | i18n}} + + +
+ + + + + + + + + {{'invites.register.login' | i18n}} + + + + + + + contact_support + + +
+ +
+

{{'permissions' | i18n}}

+ +
+
+

{{'quotas' | i18n}}

+ +
\ No newline at end of file diff --git a/src/app/pages/invites/code/code.component.scss b/src/app/pages/invites/code/code.component.scss new file mode 100644 index 0000000..040c50b --- /dev/null +++ b/src/app/pages/invites/code/code.component.scss @@ -0,0 +1,23 @@ +@import '../../../../variables.scss'; + + +mat-form-field { + display: block; +} + +mat-hint { + white-space: normal; +} + +blockquote { + margin-left: 5px; + padding: 5px; + + &.message { + border-left: 2px solid $accent; + } + + &.note { + border-left: 2px solid $primary; + } +} diff --git a/src/app/pages/invites/code/code.component.ts b/src/app/pages/invites/code/code.component.ts new file mode 100644 index 0000000..1b73adf --- /dev/null +++ b/src/app/pages/invites/code/code.component.ts @@ -0,0 +1,166 @@ +import { Component, OnInit } from '@angular/core'; +import { FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { ActivatedRoute, Router } from '@angular/router'; + +import { MatchingValidator } from './../../../utils/matching.validator'; +import { InviteService } from './../../../services/invites.service'; +import { uniqueNamesGenerator, Config, adjectives, colors, animals } from 'unique-names-generator'; +import { I18nService } from 'src/app/services/i18n.service'; +import { MatDialog } from '@angular/material/dialog'; +import { InviteEditComponent } from '../edit/invite.edit'; +import { AuthService } from 'src/app/services/auth.service'; + + +@Component({ + selector: 'app-invite-code', + templateUrl: './code.component.html', + styleUrls: [ './code.component.scss' ] +}) +export class InviteCodeComponent implements OnInit { + + form: FormGroup; + error: string; + working: boolean = true; + success: boolean = false; + invite: any; + datetimeformat: string; + auth: any; + permissions = []; + quotas = []; + + constructor( + private authService: AuthService, + private inviteService: InviteService, + private formBuilder: FormBuilder, + private i18n: I18nService, + public dialog: MatDialog, + private route: ActivatedRoute) { + this.authService.auth.subscribe(data => { + this.auth = data; + }) + } + + async ngOnInit() { + + this.datetimeformat = this.i18n.get('format.datetime', []); + + this.form = this.formBuilder.group({ + username: [ '', Validators.required ], + password: [ '', Validators.nullValidator ], + password2: [ '', Validators.required ] + }, { + validators: MatchingValidator('password', 'password2') + }); + + const code = this.route.snapshot.paramMap.get('code'); + this.inviteService.code(code).subscribe((data) => { + this.invite = data; + + if (this.invite.redeemed) { + this.error = "ALREADY_REDEEMED"; + } + + if (this.invite.owner == this.auth.principal.userId) { + this.form = this.formBuilder.group({ + message: [ '', Validators.nullValidator ], + note: [ '', Validators.nullValidator ], + }); + + this.form.get("message").setValue(this.invite.message); + this.form.get("note").setValue(this.invite.note); + } + + this.working = false; + }, (error) => { + this.working = false; + if (error.status == 406) { + this.error = "INVALID_CODE"; + } + }) + + this.inviteService.permissions(code).subscribe((data: any) => { + this.permissions = data; + }) + + this.inviteService.quotas(code).subscribe((data: any) => { + this.quotas = data; + }) + } + + genUsername() { + const config: Config = { + dictionaries: [ adjectives, colors, animals ], + separator: "", + style: "capital", + length: 3 + }; + + this.form.get("username").setValue(uniqueNamesGenerator(config)); + } + + register() { + if (this.form.valid && !this.working) { + this.working = true; + + const model: any = {}; + model.token = this.invite.code; + model.username = this.form.get("username").value; + model.password = this.form.get("password").value; + model.password2 = this.form.get("password2").value; + + this.inviteService.register(model).subscribe((result: any) => { + this.working = false; + this.success = true; + }, (error) => { + this.working = false; + if (error.status == 401) { + this.error = "NO_CODE"; + } else if (error.status == 406) { + this.error = "INVALID_CODE"; + } else if (error.status == 410) { + this.error = "ALREADY_REDEEMED"; + } else if (error.status == 409) { + let errors = {}; + for (let code of error.error) { + errors[ code.field ] = errors[ code.field ] || {}; + errors[ code.field ][ code.code ] = true; + } + + for (let code in errors) { + this.form.get(code).setErrors(errors[ code ]); + } + } + }) + + } + } + + save() { + if (this.form.valid && !this.working) { + this.working = true; + this.invite.message = this.form.get("message").value; + this.invite.note = this.form.get("note").value; + this.inviteService.update(this.invite).subscribe((result: any) => { + this.invite = result; + this.working = false; + }, (error) => { + this.working = false; + if (error.status == 406) { + this.error = "INVALID_CODE"; + } if (error.status == 410) { + this.error = "ALREADY_REDEEMED"; + } else if (error.status == 409) { + let errors = {}; + for (let code of error.error) { + errors[ code.field ] = errors[ code.field ] || {}; + errors[ code.field ][ code.code ] = true; + } + + for (let code in errors) { + this.form.get(code).setErrors(errors[ code ]); + } + } + }) + } + } +} diff --git a/src/app/pages/invites/edit/invite.edit.html b/src/app/pages/invites/edit/invite.edit.html new file mode 100644 index 0000000..de92164 --- /dev/null +++ b/src/app/pages/invites/edit/invite.edit.html @@ -0,0 +1,26 @@ +

{{'invites.edit' | i18n}}

+ +
+ + {{'invites.register.error.' + error | i18n}} + + + + + {{'invite.errors.message' | i18n}} + + + + + + {{'invites.error.note' | i18n}} + + +
+
+ + + + \ No newline at end of file diff --git a/src/app/pages/invites/edit/invite.edit.scss b/src/app/pages/invites/edit/invite.edit.scss new file mode 100644 index 0000000..fac5333 --- /dev/null +++ b/src/app/pages/invites/edit/invite.edit.scss @@ -0,0 +1,7 @@ +mat-form-field { + display: block; +} + +mat-hint { + white-space: normal; +} \ No newline at end of file diff --git a/src/app/pages/invites/edit/invite.edit.ts b/src/app/pages/invites/edit/invite.edit.ts new file mode 100644 index 0000000..d954c2b --- /dev/null +++ b/src/app/pages/invites/edit/invite.edit.ts @@ -0,0 +1,71 @@ +import { Component, Inject, OnInit } from '@angular/core'; +import { FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { ActivatedRoute, Router } from '@angular/router'; + +import { MatchingValidator } from '../../../utils/matching.validator'; +import { InviteService } from '../../../services/invites.service'; +import { uniqueNamesGenerator, Config, adjectives, colors, animals } from 'unique-names-generator'; +import { MatDialog, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; + + +@Component({ + selector: 'app-invite-edit', + templateUrl: './invite.edit.html', + styleUrls: [ './invite.edit.scss' ] +}) +export class InviteEditComponent { + + form: FormGroup; + error: string; + working: boolean = false; + success: boolean = false; + invite: any; + + constructor( + private inviteService: InviteService, + private formBuilder: FormBuilder, + @Inject(MAT_DIALOG_DATA) public data: any, + public dialogRef: MatDialogRef, + public dialog: MatDialog) { + this.form = this.formBuilder.group({ + message: [ '', Validators.nullValidator ], + note: [ '', Validators.nullValidator ], + }); + + this.invite = data; + this.form.get("message").setValue(this.invite.message); + this.form.get("note").setValue(this.invite.note); + } + + save() { + if (this.form.valid && !this.working) { + this.working = true; + + this.invite.message = this.form.get("message").value; + this.invite.note = this.form.get("note").value; + + this.inviteService.update(this.invite).subscribe((result: any) => { + this.working = false; + this.dialogRef.close(result); + }, (error) => { + this.working = false; + if (error.status == 406) { + this.error = "INVALID_CODE"; + } if (error.status == 410) { + this.error = "ALREADY_REDEEMED"; + } else if (error.status == 409) { + let errors = {}; + for (let code of error.error) { + errors[ code.field ] = errors[ code.field ] || {}; + errors[ code.field ][ code.code ] = true; + } + + for (let code in errors) { + this.form.get(code).setErrors(errors[ code ]); + } + } + }) + + } + } +} diff --git a/src/app/pages/invites/invites.component.html b/src/app/pages/invites/invites.component.html index 38d8090..fc29594 100644 --- a/src/app/pages/invites/invites.component.html +++ b/src/app/pages/invites/invites.component.html @@ -37,17 +37,17 @@ {{ invite.expires | date:datetimeformat}} - {{'invite.link' | i18n}} - - {{ - invite.code}} + + {{invite.code}} + {{'invite.note' | i18n}} - {{ invite.note}} {{ 'invite.noNote' | i18n}} + {{ invite.note}} {{ 'invite.noNote' | i18n}} @@ -65,10 +65,20 @@ + + {{'invite.actions' | i18n}} + + + edit + + + + - + @@ -117,7 +127,8 @@ - + @@ -130,5 +141,6 @@
{{'invite.note' | i18n}} {{ invite.note}} {{ 'invite.noNote' | i18n}} {{ invite.note}} {{ 'invite.noNote' | i18n}}
- + \ No newline at end of file diff --git a/src/app/pages/invites/invites.component.ts b/src/app/pages/invites/invites.component.ts index 0e7074c..59b6c7a 100644 --- a/src/app/pages/invites/invites.component.ts +++ b/src/app/pages/invites/invites.component.ts @@ -1,19 +1,21 @@ -import {Component, OnInit, ViewChild} from '@angular/core'; +import { Component, OnInit, ViewChild } from '@angular/core'; -import {ActivatedRoute, Router} from '@angular/router'; -import {PageEvent} from '@angular/material/paginator'; +import { ActivatedRoute, Router } from '@angular/router'; +import { PageEvent } from '@angular/material/paginator'; -import {AuthService} from '../../services/auth.service'; -import {I18nService} from '../../services/i18n.service'; -import {QuotaService} from '../../services/quota.service'; -import {InviteService} from '../../services/invites.service'; -import {FormControl} from '@angular/forms'; -import {debounceTime} from 'rxjs/operators'; +import { AuthService } from '../../services/auth.service'; +import { I18nService } from '../../services/i18n.service'; +import { QuotaService } from '../../services/quota.service'; +import { InviteService } from '../../services/invites.service'; +import { FormControl } from '@angular/forms'; +import { debounceTime } from 'rxjs/operators'; +import { InviteEditComponent } from './edit/invite.edit'; +import { MatDialog } from '@angular/material/dialog'; @Component({ selector: 'app-invites', templateUrl: './invites.component.html', - styleUrls: ['./invites.component.scss'] + styleUrls: [ './invites.component.scss' ] }) export class InvitesComponent implements OnInit { @@ -24,21 +26,20 @@ export class InvitesComponent implements OnInit { success: boolean; working: boolean; datetimeformat: string; - pageSizeOptions: number[] = [5, 10, 25, 50]; + pageSizeOptions: number[] = [ 5, 10, 25, 50 ]; searchFormControl = new FormControl(); redeemedFormControl = new FormControl(); searchOthersFormControl = new FormControl(); redeemedOthersFormControl = new FormControl(); - inviteColumns = ["starts", "expires", "link", "note", "message", "redeemed"]; - otherColumns = ["note", "redeemed"]; + inviteColumns = [ "starts", "expires", "link", "note", "message", "redeemed", "actions" ]; + otherColumns = [ "note", "redeemed" ]; constructor( - private authService: AuthService, private inviteService: InviteService, private i18n: I18nService, private quotaService: QuotaService, - private router: Router, + public dialog: MatDialog, private route: ActivatedRoute) { } @@ -49,23 +50,23 @@ export class InvitesComponent implements OnInit { this.searchFormControl.valueChanges.pipe(debounceTime(500)).subscribe(value => { this.inviteService.getPages(this.quota, 0, this.invites.size, value, this.redeemedFormControl.value).subscribe((data: any) => { this.invites = data; - }, (error) => {}) + }, (error) => { }) }) this.redeemedFormControl.valueChanges.subscribe(value => { this.inviteService.getPages(this.quota, 0, this.invites.size, this.searchFormControl.value ? this.searchFormControl.value : "", value).subscribe((data: any) => { this.invites = data; - }, (error) => {}) + }, (error) => { }) }) this.searchOthersFormControl.valueChanges.pipe(debounceTime(500)).subscribe(value => { this.inviteService.getOthersPages(this.quota, 0, this.others.size, value, this.redeemedOthersFormControl.value).subscribe((data: any) => { this.others = data; - }, (error) => {}) + }, (error) => { }) }) this.redeemedOthersFormControl.valueChanges.subscribe(value => { this.inviteService.getOthersPages(this.quota, 0, this.others.size, this.searchOthersFormControl.value ? this.searchOthersFormControl.value : "", value).subscribe((data: any) => { this.others = data; - }, (error) => {}) + }, (error) => { }) }) this.update(); @@ -75,56 +76,67 @@ export class InvitesComponent implements OnInit { update(): void { this.inviteQuota = 0; this.quotaService.quotas().subscribe((data: any) => { - for(let quota of data) { - if(quota.name == "invite_" + this.quota) { + for (let quota of data) { + if (quota.name == "invite_" + this.quota) { this.inviteQuota = quota.value; } } }) - if(!this.invites) { + if (!this.invites) { this.inviteService.get(this.quota).subscribe((data: any) => { this.invites = data; }) } else { this.inviteService.getPages(this.quota, this.invites.number || 0, this.invites.size || 10, this.searchFormControl.value ? this.searchFormControl.value : "", this.redeemedFormControl.value).subscribe((data: any) => { this.invites = data; - }, (error) => {}) + }, (error) => { }) } this.inviteService.getOthers(this.quota).subscribe((data: any) => { this.others = data; - }, (error) => {}) + }, (error) => { }) } updatePages(event: PageEvent) { this.inviteService.getPages(this.quota, event.pageIndex, event.pageSize, this.searchFormControl.value ? this.searchFormControl.value : "", this.redeemedFormControl.value).subscribe((data: any) => { this.invites = data; - }, (error) => {}) + }, (error) => { }) } create(): void { this.working = true; - - this.inviteService.create(this.quota, {}).subscribe(response => { this.update(); this.working = false; }, (error) => { this.working = false; - if(error.status == 409) { + if (error.status == 409) { let errors = {}; - for(let code of error.error) { - errors[code.field] = errors[code.field] || {}; - errors[code.field][code.code] = true; + for (let code of error.error) { + errors[ code.field ] = errors[ code.field ] || {}; + errors[ code.field ][ code.code ] = true; } } }) } + edit(invite) { + const dialogRef = this.dialog.open(InviteEditComponent, { + data: invite, + minWidth: "400px" + }); + + dialogRef.afterClosed().subscribe(result => { + if (result) { + this.update(); + } + }); + } + updateOthers(event: PageEvent) { this.inviteService.getOthersPages(this.quota, event.pageIndex, event.pageSize, this.searchOthersFormControl.value ? this.searchOthersFormControl.value : "", this.redeemedOthersFormControl.value).subscribe((data: any) => { this.others = data; - }, (error) => {}) + }, (error) => { }) } } diff --git a/src/app/pages/partey/partey.component.html b/src/app/pages/partey/partey.component.html index 6ef279f..549e7ba 100644 --- a/src/app/pages/partey/partey.component.html +++ b/src/app/pages/partey/partey.component.html @@ -3,7 +3,11 @@

{{'partey.tags.none' | i18n}}

- {{tag.tag}} + + {{tag.tag}} + {{tag.tag}} + {{tag.tag}} + diff --git a/src/app/pages/partey/partey.component.ts b/src/app/pages/partey/partey.component.ts index 3cbeb83..438d486 100644 --- a/src/app/pages/partey/partey.component.ts +++ b/src/app/pages/partey/partey.component.ts @@ -21,4 +21,20 @@ export class ParteyComponent implements OnInit { }) } + toDate(value : string) { + return new Date(value); + } + + activeTag(tag: any) { + return !tag.starts && !tag.expires; + } + + upcomingTag(tag: any) { + return tag.starts && (new Date() < this.toDate(tag.starts)); + } + + expiringTag(tag: any) { + return !(this.upcomingTag(tag)) && tag.expires; + } + } \ No newline at end of file diff --git a/src/app/pages/register/register.component.html b/src/app/pages/register/register.component.html index 2b36938..fbda578 100644 --- a/src/app/pages/register/register.component.html +++ b/src/app/pages/register/register.component.html @@ -9,17 +9,17 @@ + [(ngModel)]="model.username" required matAutofocus tabindex="1"> {{'username.error' | i18n}} - + autorenew + [(ngModel)]="model.password" required tabindex="2">
{{'password.error.' + error.key | i18n}}
@@ -28,14 +28,14 @@ + [(ngModel)]="model.password2" required tabindex="3"> {{'password.not-match' | i18n}} + (change)="onPrimaryChange()" tabindex="4"> {{'email.primary' | i18n}} + [(ngModel)]="model.email" required tabindex="5"> {{'email.invalid' | i18n}} @@ -59,14 +59,16 @@ - - + contact_support diff --git a/src/app/services/borrow.service.ts b/src/app/services/borrow.service.ts new file mode 100644 index 0000000..d3059a8 --- /dev/null +++ b/src/app/services/borrow.service.ts @@ -0,0 +1,106 @@ +import { Injectable } from '@angular/core'; +import { HttpClient, HttpParams } from '@angular/common/http'; + +import { environment } from '../../environments/environment'; + +@Injectable({ + providedIn: 'root', +}) +export class BorrowItemsService { + + constructor(private http: HttpClient) { + } + + getItems(page: number, size: number, sort: string, desc: boolean, search: string, owner: boolean) { + let httpParams = new HttpParams(); + if (page != undefined) { + httpParams = httpParams.set("page", "" + page); + } + if (size != undefined) { + httpParams = httpParams.set("size", "" + size); + } + + if (sort != undefined) { + httpParams = httpParams.set("sort", sort); + } + + if (desc != undefined) { + httpParams = httpParams.set("desc", "" + desc); + } + + if (search != undefined) { + httpParams = httpParams.set("search", "" + search); + } + + if (owner != undefined && owner) { + httpParams = httpParams.set("owner", "" + owner); + } + + return this.http.get(environment.apiUrl + "/borrow/items", { params: httpParams }); + } + + getItem(id) { + return this.http.get(environment.apiUrl + "/borrow/items/" + id); + } + + createOrUpdateItem(borrowItem) { + return this.http.post(environment.apiUrl + "/borrow/items", borrowItem); + } + + deleteItem(id) { + return this.http.delete(environment.apiUrl + "/borrow/items/" + id); + } +} + +@Injectable({ + providedIn: 'root', +}) +export class BorrowRequestsService { + + constructor(private http: HttpClient) { + } + + getRequests(page: number, size: number, sort: string, desc: boolean, owner: boolean) { + let httpParams = new HttpParams(); + if (page != undefined) { + httpParams = httpParams.set("page", "" + page); + } + if (size != undefined) { + httpParams = httpParams.set("size", "" + size); + } + + if (sort != undefined) { + httpParams = httpParams.set("sort", sort); + } + + if (desc != undefined) { + httpParams = httpParams.set("desc", "" + desc); + } + + if (owner != undefined && owner) { + httpParams = httpParams.set("owner", "" + owner); + } + + return this.http.get(environment.apiUrl + "/borrow/requests", { params: httpParams }); + } + + createOrUpdateRequest(borrowRequest) { + return this.http.post(environment.apiUrl + "/borrow/requests", borrowRequest); + } + + deleteRequest(id) { + return this.http.delete(environment.apiUrl + "/borrow/requests/" + id); + } + + setRequestStatus(borrowRequest) { + return this.http.put(environment.apiUrl + "/borrow/requests", borrowRequest); + } + + getRequestCode(id) { + return this.http.get(environment.apiUrl + "/borrow/requests/code/" + id); + } + + verifyRequest(serialized) { + return this.http.post(environment.apiUrl + "/borrow/requests/verify", serialized); + } +} \ No newline at end of file diff --git a/src/app/services/i18n.service.ts b/src/app/services/i18n.service.ts index 2f6a083..1b88be1 100644 --- a/src/app/services/i18n.service.ts +++ b/src/app/services/i18n.service.ts @@ -1,6 +1,6 @@ -import {Injectable} from '@angular/core'; -import {HttpClient} from '@angular/common/http'; -import {environment} from '../../environments/environment'; +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { environment } from '../../environments/environment'; @Injectable({ providedIn: 'root', @@ -8,7 +8,7 @@ import {environment} from '../../environments/environment'; export class I18nService { locale: string = "de-informal"; - locales: any[] = ["de-informal"]; + locales: any[] = [ "de-informal" ]; i18n: any; constructor(private http: HttpClient) { @@ -31,13 +31,13 @@ export class I18nService { let browserLocale = navigator.language; - if(browserLocale.indexOf("-") != -1) { - browserLocale = browserLocale.split("-")[0]; + if (browserLocale.indexOf("-") != -1) { + browserLocale = browserLocale.split("-")[ 0 ]; } - let locale = localStorage.getItem("bstly.locale") || browserLocale || this.locales[0]; + let locale = localStorage.getItem("bstly.locale") || browserLocale || this.locales[ 0 ]; - if(locale == 'de') { + if (locale == 'de') { locale = 'de-informal'; } @@ -45,54 +45,58 @@ export class I18nService { await this.http.get(environment.apiUrl + "/i18n").toPromise().then((response: any) => { this.locales = response; }); - } catch(e) { + } catch (e) { console.debug("fallback to default locales"); } - if(this.locales.indexOf(locale) == -1) { - locale = this.locales[0]; + if (this.locales.indexOf(locale) == -1) { + locale = this.locales[ 0 ]; } this.setLocale(locale); try { this.i18n = await this.http.get(environment.apiUrl + "/i18n/" + locale).toPromise(); - } catch(e) { + } catch (e) { this.i18n = await this.http.get("/assets/i18n/" + locale + ".json").toPromise(); console.debug("fallback to default locale"); } } get(key, args: string[]): string { - return this.getInternal(key, args, this.i18n); + return this.getInternal(key, args, this.i18n, ""); } - getInternal(key, args: string[], from): string { + getInternal(key, args: string[], from, path): string { key += ''; - if(!from) { - return key; - } else if(from[key]) { - if(typeof from[key] === 'object') { - if(from[key]["."]) { - return this.insertArguments(from[key]["."], args); + if (!from) { + return this.empty(key, args, path); + } else if (from[ key ]) { + if (typeof from[ key ] === 'object') { + if (from[ key ][ "." ]) { + return this.insertArguments(from[ key ][ "." ], args); } - return key; + return this.empty(key, args, path); } - return this.insertArguments(from[key], args); + return this.insertArguments(from[ key ], args); } else { let keys = key.split("."); - if(from[keys[0]]) { + if (from[ keys[ 0 ] ]) { key = keys.slice(1, keys.length).join("."); - return this.getInternal(key, args, from[keys[0]]) + return this.getInternal(key, args, from[ keys[ 0 ] ], path + keys[ 0 ] + ".") } } - return key; + return this.empty(key, args, path); + } + + empty(key, args: string[], path: string): string { + return (path ? path + (path.endsWith(".") ? "" : ".") : "") + key + (args && args.length > 0 ? (" [" + args + "]") : ""); } insertArguments(label: string, args: string[]) { - if(args) { - for(let index in args) { - label = label.replace(`{${index}}`, this.get(args[index], [])); + if (args) { + for (let index in args) { + label = label.replace(`{${index}}`, this.get(args[ index ], [])); } } return label; diff --git a/src/app/services/invites.service.ts b/src/app/services/invites.service.ts index 8eaecad..af880d4 100644 --- a/src/app/services/invites.service.ts +++ b/src/app/services/invites.service.ts @@ -1,7 +1,7 @@ -import {Injectable} from '@angular/core'; -import {HttpClient} from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; -import {environment} from '../../environments/environment'; +import { environment } from '../../environments/environment'; @Injectable({ providedIn: 'root', @@ -19,6 +19,23 @@ export class InviteService { return this.http.get(environment.apiUrl + "/invites" + (quota ? "?quota=" + quota + "&" : "?") + "page=" + page + "&size=" + size + "&search=" + search + (redeemed ? "&redeemed=" + redeemed : "")); } + code(code: string) { + return this.http.get(environment.apiUrl + "/invites/" + code); + } + + permissions(code: string) { + return this.http.get(environment.apiUrl + "/invites/" + code + "/permissions"); + } + + quotas(code: string) { + return this.http.get(environment.apiUrl + "/invites/" + code + "/quotas"); + } + + + register(model: any) { + return this.http.post(environment.apiUrl + "/invites", model); + } + getOthers(quota: string) { return this.http.get(environment.apiUrl + "/invites/" + quota + "/others"); } @@ -32,7 +49,7 @@ export class InviteService { } update(invite: any) { - return this.http.post(environment.apiUrl + "/invites", invite); + return this.http.patch(environment.apiUrl + "/invites", invite); } } \ No newline at end of file diff --git a/src/app/ui/durationpicker/durationpicker.component.html b/src/app/ui/durationpicker/durationpicker.component.html new file mode 100644 index 0000000..243ced3 --- /dev/null +++ b/src/app/ui/durationpicker/durationpicker.component.html @@ -0,0 +1,20 @@ +
+
+ + + +
+
+ + + +
+
+ + + {{duration}} + +
+
\ No newline at end of file diff --git a/src/app/ui/durationpicker/durationpicker.component.scss b/src/app/ui/durationpicker/durationpicker.component.scss new file mode 100644 index 0000000..de9ab19 --- /dev/null +++ b/src/app/ui/durationpicker/durationpicker.component.scss @@ -0,0 +1,4 @@ +mat-form-field { + display: block; + padding-right: 8px; +} diff --git a/src/app/ui/durationpicker/durationpicker.component.ts b/src/app/ui/durationpicker/durationpicker.component.ts new file mode 100644 index 0000000..7249514 --- /dev/null +++ b/src/app/ui/durationpicker/durationpicker.component.ts @@ -0,0 +1,98 @@ +import { Component, OnInit } from '@angular/core'; +import { ControlValueAccessor, FormControl, NG_VALUE_ACCESSOR } from '@angular/forms'; +import * as moment from 'moment'; + +@Component({ + selector: 'app-durationpicker', + templateUrl: './durationpicker.component.html', + styleUrls: [ './durationpicker.component.scss' ], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + multi: true, + useExisting: DurationpickerComponent + } + ] +}) +export class DurationpickerComponent implements OnInit, ControlValueAccessor { + + days = new FormControl(); + hours = new FormControl(); + minutes = new FormControl(); + + duration: string; + model: moment.Duration; + onChange = (duration) => { }; + onTouched = () => { }; + isDisabled = false; + + constructor() { } + + ngOnInit(): void { + this.days.valueChanges.subscribe(value => { + if (value < this.model.days()) { + this.model.subtract((this.model.days() - value), "days"); + } else { + this.model.add((value - this.model.days()), "days"); + } + this.checkValue(); + }) + + this.hours.valueChanges.subscribe(value => { + if (value < this.model.hours()) { + this.model.subtract((this.model.hours() - value), "hours"); + } else { + this.model.add((value - this.model.hours()), "hours"); + } + this.checkValue(); + }) + + this.minutes.valueChanges.subscribe(value => { + if (value < this.model.minutes()) { + this.model.subtract((this.model.minutes() - value), "minutes"); + } else { + this.model.add((value - this.model.minutes()), "minutes"); + } + this.checkValue(); + }) + } + + checkValue() { + if (this.model.asMinutes() <= 0) { + this.days.setValue(0, { emitEvent: false }); + this.hours.setValue(0, { emitEvent: false }); + this.minutes.setValue(0, { emitEvent: false }); + this.duration = null; + } else { + this.duration = this.model.toISOString(); + } + + this.onChange(this.duration); + this.onTouched(); + } + + + + writeValue(duration: string): void { + this.duration = duration; + this.model = moment.duration(this.duration); + this.days.setValue(this.model.days(), { emitEvent: false }); + this.hours.setValue(this.model.hours()), { emitEvent: false }; + this.minutes.setValue(this.model.minutes(), { emitEvent: false }); + this.onTouched(); + } + + registerOnChange(onChange: any): void { + this.onChange = onChange; + } + + registerOnTouched(onTouched: any): void { + this.onTouched = onTouched; + } + + setDisabledState?(isDisabled: boolean): void { + this.isDisabled = isDisabled; + } + + +} \ No newline at end of file diff --git a/src/app/utils/moment.pipe.ts b/src/app/utils/moment.pipe.ts new file mode 100644 index 0000000..956b1c1 --- /dev/null +++ b/src/app/utils/moment.pipe.ts @@ -0,0 +1,13 @@ +import { Pipe, PipeTransform } from '@angular/core'; +import * as moment from 'moment'; + +@Pipe({ name: 'datef' }) +export class MomentPipe implements PipeTransform { + transform(value: Date | moment.Moment, dateFormat: string): any { + if (!dateFormat) { + return moment(value).fromNow(); + } + + return moment(value).format(dateFormat); + } +} \ No newline at end of file diff --git a/src/environments/environment.ts b/src/environments/environment.ts index a1b0ab3..85b1e5d 100644 --- a/src/environments/environment.ts +++ b/src/environments/environment.ts @@ -4,8 +4,8 @@ export const environment = { production: false, - apiUrl : 'http://localhost:9000', - //apiUrl : 'https://api.bstly.lh8.de', + // apiUrl : 'http://localhost:9000', + apiUrl : 'https://api.bstly.lh8.de', }; /* diff --git a/src/qr-scanner-worker.min.js b/src/qr-scanner-worker.min.js new file mode 100644 index 0000000..0d026ac --- /dev/null +++ b/src/qr-scanner-worker.min.js @@ -0,0 +1,87 @@ +'use strict';(function(){function T(a,b){let c=[],d="";b=a.readBits([8,16,16][b]);for(let d=0;d`%${("0"+a.toString(16)).substr(-2)}`).join(""))}catch(e){}return{bytes:c,text:d}}function U(a,b){a=new V(a);let c=9>=b?0:26>=b?1:2;for(b={text:"",bytes:[],chunks:[],version:b};4<=a.available();){var d=a.readBits(4);if(d===t.Terminator)return b;if(d===t.ECI)0===a.readBits(1)?b.chunks.push({type:r.ECI,assignmentNumber:a.readBits(7)}): +0===a.readBits(1)?b.chunks.push({type:r.ECI,assignmentNumber:a.readBits(14)}):0===a.readBits(1)?b.chunks.push({type:r.ECI,assignmentNumber:a.readBits(21)}):b.chunks.push({type:r.ECI,assignmentNumber:-1});else if(d===t.Numeric){var e=a;d=[];for(var f="",g=e.readBits([10,12,14][c]);3<=g;){var h=e.readBits(10);if(1E3<=h)throw Error("Invalid numeric value above 999");var k=Math.floor(h/100),n=Math.floor(h/10)%10;h%=10;d.push(48+k,48+n,48+h);f+=k.toString()+n.toString()+h.toString();g-=3}if(2===g){g=e.readBits(7); +if(100<=g)throw Error("Invalid numeric value above 99");e=Math.floor(g/10);g%=10;d.push(48+e,48+g);f+=e.toString()+g.toString()}else if(1===g){e=e.readBits(4);if(10<=e)throw Error("Invalid numeric value above 9");d.push(48+e);f+=e.toString()}d={bytes:d,text:f};b.text+=d.text;b.bytes.push(...d.bytes);b.chunks.push({type:r.Numeric,text:d.text})}else if(d===t.Alphanumeric){e=a;d=[];f="";for(g=e.readBits([9,11,13][c]);2<=g;)n=e.readBits(11),k=Math.floor(n/45),n%=45,d.push(B[k].charCodeAt(0),B[n].charCodeAt(0)), +f+=B[k]+B[n],g-=2;1===g&&(e=e.readBits(6),d.push(B[e].charCodeAt(0)),f+=B[e]);d={bytes:d,text:f};b.text+=d.text;b.bytes.push(...d.bytes);b.chunks.push({type:r.Alphanumeric,text:d.text})}else if(d===t.Byte)d=T(a,c),b.text+=d.text,b.bytes.push(...d.bytes),b.chunks.push({type:r.Byte,bytes:d.bytes,text:d.text});else if(d===t.Kanji){f=a;d=[];e=f.readBits([8,10,12][c]);for(g=0;gk?k+33088:k+49472,d.push(k>>8,k&255);f=(new TextDecoder("shift-jis")).decode(Uint8Array.from(d)); +d={bytes:d,text:f};b.text+=d.text;b.bytes.push(...d.bytes);b.chunks.push({type:r.Kanji,bytes:d.bytes,text:d.text})}else d===t.StructuredAppend&&b.chunks.push({type:r.StructuredAppend,currentSequence:a.readBits(4),totalSequence:a.readBits(4),parity:a.readBits(8)})}if(0===a.available()||0===a.readBits(a.available()))return b}function J(a,b){return a^b}function W(a,b,c,d){b.degree()=d/2;){var g=b;let d=e;b=c;e=f;if(b.isZero())return null; +c=g;f=a.zero;g=b.getCoefficient(b.degree());for(g=a.inverse(g);c.degree()>=b.degree()&&!c.isZero();){let d=c.degree()-b.degree(),e=a.multiply(c.getCoefficient(c.degree()),g);f=f.addOrSubtract(a.buildMonomial(d,e));c=c.addOrSubtract(b.multiplyByMonomial(d,e))}f=f.multiplyPoly(e).addOrSubtract(d);if(c.degree()>=b.degree())return null}d=f.getCoefficient(0);if(0===d)return null;a=a.inverse(d);return[f.multiply(a),c.multiply(a)]}function X(a,b){let c=new Uint8ClampedArray(a.length);c.set(a);a=new Y(285, +256,0);var d=new w(a,c),e=new Uint8ClampedArray(b),f=!1;for(var g=0;gf)return null;c[f]^=d[e]}return c}function E(a,b){a^=b;for(b=0;a;)b++,a&=a-1;return b}function C(a,b){return b<<1|a}function Z(a,b,c){c=aa[c.dataMask];let d=a.height;var e=17+4*b.versionNumber,f=A.createEmpty(e,e);f.setRegion(0,0,9,9,!0);f.setRegion(e-8,0,8,9,!0);f.setRegion(0,e-8,9,8,!0);for(var g of b.alignmentPatternCenters)for(var h of b.alignmentPatternCenters)6=== +g&&6===h||6===g&&h===e-7||g===e-7&&6===h||f.setRegion(g-2,h-2,5,5,!0);f.setRegion(6,9,1,e-17,!0);f.setRegion(9,6,e-17,1,!0);6d;d++){let f=k-d;if(!b.get(f,m)){e++;let b=a.get(f,m);c({y:m,x:f})&&(b=!b);h=h<<1|b;8===e&&(g.push(h),h=e=0)}}}f=!f}return g}function ba(a){var b=a.height,c=Math.floor((b-17)/4);if(6>=c)return K[c- +1];c=0;for(var d=5;0<=d;d--)for(var e=b-9;e>=b-11;e--)c=C(a.get(e,d),c);d=0;for(e=5;0<=e;e--)for(let c=b-9;c>=b-11;c--)d=C(a.get(e,c),d);a=Infinity;let f;for(let e of K){if(e.infoBits===c||e.infoBits===d)return e;b=E(c,e.infoBits);b=a)return f}function ca(a){let b=0;for(var c=0;8>=c;c++)6!==c&&(b=C(a.get(c,8),b));for(c=7;0<=c;c--)6!==c&&(b=C(a.get(8,c),b));var d=a.height;c=0;for(var e=d-1;e>=d-7;e--)c=C(a.get(8,e),c);for(e=d-8;e=a?d:null}function ea(a,b,c){let d=b.errorCorrectionLevels[c],e=[],f=0;d.ecBlocks.forEach(a=>{for(let b=0;ba+b.numDataCodewords,0);c=new Uint8ClampedArray(c);a=0;for(let b of d){d=X(b.codewords,b.codewords.length-b.numDataCodewords);if(!d)return null;for(let e= +0;e{const c=g*a+n*b+p;return{x:(e*a+h*b+m)/c,y:(f*a+k*b+l)/c}};for(let e=0;ea+c)}function ia(a,b,c){let d=y(a,b),e=y(b,c),f=y(a,c),g,h,k;e>=d&&e>=f?[g,h,k]=[b,a,c]:f>=e&&f>=d?[g,h,k]=[a,b,c]:[g,h,k]=[a,c,b];0>(k.x-h.x)*(g.y-h.y)-(k.y-h.y)*(g.x-h.x)&&([g,k]=[k,g]);return{bottomLeft:g,topLeft:h,topRight:k}}function ja(a,b,c,d){d=(x(z(a,c,d,5))/7+x(z(a,b,d,5))/7+x(z(c,a,d,5))/7+x(z(b,a,d,5))/7)/4;if(1>d)throw Error("Invalid module size");b=Math.round(y(a,b)/d);a=Math.round(y(a,c)/d);a= +Math.floor((b+a)/2)+7;switch(a%4){case 0:a++;break;case 2:a--}return{dimension:a,moduleSize:d}}function N(a,b,c,d){let e=[{x:Math.floor(a.x),y:Math.floor(a.y)}];var f=Math.abs(b.y-a.y)>Math.abs(b.x-a.x);if(f){var g=Math.floor(a.y);var h=Math.floor(a.x);a=Math.floor(b.y);b=Math.floor(b.x)}else g=Math.floor(a.x),h=Math.floor(a.y),a=Math.floor(b.x),b=Math.floor(b.y);let k=Math.abs(a-g),n=Math.abs(b-h),m=Math.floor(-k/2),l=g{d+=Math.pow(a[f]-b*c,2)});return{averageSize:c,error:d}}function O(a,b,c){try{let d=z(a,{x:-1,y:a.y},c,b.length), +e=z(a,{x:a.x,y:-1},c,b.length),f=z(a,{x:Math.max(0,a.x-a.y)-1,y:Math.max(0,a.y-a.x)-1},c,b.length),g=z(a,{x:Math.min(c.width,a.x+a.y)+1,y:Math.min(c.height,a.y+a.x)+1},c,b.length),h=F(d,b),k=F(e,b),n=F(f,b),m=F(g,b),l=(h.averageSize+k.averageSize+n.averageSize+m.averageSize)/4;return Math.sqrt(h.error*h.error+k.error*k.error+n.error*n.error+m.error*m.error)+(Math.pow(h.averageSize-l,2)+Math.pow(k.averageSize-l,2)+Math.pow(n.averageSize-l,2)+Math.pow(m.averageSize-l,2))/l}catch(d){return Infinity}} +function H(a,b){for(var c=Math.round(b.x);a.get(c,Math.round(b.y));)c--;for(var d=Math.round(b.x);a.get(d,Math.round(b.y));)d++;c=(c+d)/2;for(d=Math.round(b.y);a.get(Math.round(c),d);)d--;for(b=Math.round(b.y);a.get(Math.round(c),b);)b++;return{x:c,y:(d+b)/2}}function ka(a){var b=[],c=[];let d=[];var e=[];for(let m=0;m<=a.height;m++){var f=0,g=!1;let l=[0,0,0,0,0];for(let b=-1;b<=a.width;b++){var h=a.get(b,m);if(h===g)f++;else{l=[l[1],l[2],l[3],l[4],f];f=1;g=h;var k=x(l)/7;k=Math.abs(l[0]-k)d>=b.bottom.startX&&d<=b.bottom.endX||a>=b.bottom.startX&&d<=b.bottom.endX||d<=b.bottom.startX&&a>=b.bottom.endX&&1.5>l[2]/(b.bottom.endX-b.bottom.startX)&&.5c>=b.bottom.startX&&c<=b.bottom.endX||a>=b.bottom.startX&&c<=b.bottom.endX||c<=b.bottom.startX&&a>=b.bottom.endX&&1.5>l[2]/(b.bottom.endX-b.bottom.startX)&&.5a.bottom.y!==m&&2<=a.bottom.y-a.top.y));c=c.filter(a=>a.bottom.y===m);d.push(...e.filter(a=>a.bottom.y!==m));e=e.filter(a=>a.bottom.y===m)}b.push(...c.filter(a=>2<=a.bottom.y-a.top.y));d.push(...e); +c=[];for(var m of b)2>m.bottom.y-m.top.y||(b=(m.top.startX+m.top.endX+m.bottom.startX+m.bottom.endX)/4,e=(m.top.y+m.bottom.y+1)/2,a.get(Math.round(b),Math.round(e))&&(f=[m.top.endX-m.top.startX,m.bottom.endX-m.bottom.startX,m.bottom.y-m.top.y+1],f=x(f)/f.length,g=O({x:Math.round(b),y:Math.round(e)},[1,1,3,1,1],a),c.push({score:g,x:b,y:e,size:f})));if(3>c.length)return null;c.sort((a,b)=>a.score-b.score);m=[];for(b=0;ba.score-b.score);m.push({points:[e,f[0],f[1]],score:e.score+f[0].score+f[1].score})}m.sort((a,b)=>a.score-b.score);let {topRight:p,topLeft:q,bottomLeft:v}=ia(...m[0].points);m=P(a,d,p,q,v);l=[];m&&l.push({alignmentPattern:{x:m.alignmentPattern.x,y:m.alignmentPattern.y},bottomLeft:{x:v.x,y:v.y},dimension:m.dimension,topLeft:{x:q.x,y:q.y},topRight:{x:p.x,y:p.y}});m=H(a,p);b=H(a,q);c=H(a,v);(a=P(a,d,m,b,c))&&l.push({alignmentPattern:{x:a.alignmentPattern.x, +y:a.alignmentPattern.y},bottomLeft:{x:c.x,y:c.y},topLeft:{x:b.x,y:b.y},topRight:{x:m.x,y:m.y},dimension:a.dimension});return 0===l.length?null:l}function P(a,b,c,d,e){let f,g;try{({dimension:f,moduleSize:g}=ja(d,c,e,a))}catch(m){return null}var h=c.x-d.x+e.x,k=c.y-d.y+e.y;c=(y(d,e)+y(d,c))/2/g;e=1-3/c;let n={x:d.x+e*(h-d.x),y:d.y+e*(k-d.y)};b=b.map(b=>{const c=(b.top.startX+b.top.endX+b.bottom.startX+b.bottom.endX)/4;b=(b.top.y+b.bottom.y+1)/2;if(a.get(Math.floor(c),Math.floor(b))){var d=O({x:Math.floor(c), +y:Math.floor(b)},[1,1,1],a)+y({x:c,y:b},n);return{x:c,y:b,score:d}}}).filter(a=>!!a).sort((a,b)=>a.score-b.score);return{alignmentPattern:15<=c&&b.length?b[0]:n,dimension:f}}function Q(a){var b=ka(a);if(!b)return null;for(let e of b){b=ha(a,e);var c=b.matrix;if(null==c)c=null;else{var d=L(c);if(d)c=d;else{for(d=0;d{a[c]=b[c]})}function I(a,b,c,d={}){let e=Object.create(null);R(e,la);R(e,d); +d="onlyInvert"===e.inversionAttempts||"invertFirst"===e.inversionAttempts;var f="attemptBoth"===e.inversionAttempts||d;var g=e.greyScaleWeights,h=e.canOverwriteImage,k=b*c;if(a.length!==4*k)throw Error("Malformed data passed to binarizer.");var n=0;if(h){var m=new Uint8ClampedArray(a.buffer,n,k);n+=k}m=new S(b,c,m);if(g.useIntegerApproximation)for(var l=0;l>8)}else for(l=0;lt;t++)for(let a=0;8>a;a++){let b=m.get(8*q+a,8*p+t);u=Math.min(u,b);r=Math.max(r,b)}t=(u+r)/2;t=Math.min(255,1.11*t);24>=r-u&&(t=u/2,0a?2:a>c?c:a;h=l-3;h=2>b?2:b>h?h:b;k=0;for(n=-2;2>=n;n++)for(u=-2;2>=u;u++)k+=v.get(c+n,h+u);c=k/25;for(h=0;8>h;h++)for(k=0;8>k;k++)n=8*a+h,u=8*b+k,r=m.get(n,u),p.set(n,u,r<=c),f&&q.set(n,u,!(r<=c))}f=f?{binarized:p,inverted:q}:{binarized:p};let {binarized:w,inverted:x}=f;(f=Q(d?x:w))||"attemptBoth"!==e.inversionAttempts&&"invertFirst"!==e.inversionAttempts|| +(f=Q(d?w:x));return f}class A{constructor(a,b){this.width=b;this.height=a.length/b;this.data=a}static createEmpty(a,b){return new A(new Uint8ClampedArray(a*b),a)}get(a,b){return 0>a||a>=this.width||0>b||b>=this.height?!1:!!this.data[b*this.width+a]}set(a,b,c){this.data[b*this.width+a]=c?1:0}setRegion(a,b,c,d,e){for(let f=b;fa||32this.available())throw Error("Cannot read "+a.toString()+" bits");var b=0;if(0>8-c<>b;a-=c;this.bitOffset+=c;8===this.bitOffset&&(this.bitOffset=0,this.byteOffset++)}if(0>c<>c,this.bitOffset+=a)}return b}available(){return 8*(this.bytes.length-this.byteOffset)-this.bitOffset}}var r;(function(a){a.Numeric="numeric";a.Alphanumeric="alphanumeric";a.Byte="byte";a.Kanji="kanji";a.ECI="eci";a.StructuredAppend="structuredappend"})(r||(r={}));var t;(function(a){a[a.Terminator=0]="Terminator";a[a.Numeric=1]="Numeric";a[a.Alphanumeric=2]="Alphanumeric";a[a.Byte=4]="Byte";a[a.Kanji=8]="Kanji";a[a.ECI=7]="ECI";a[a.StructuredAppend= +3]="StructuredAppend"})(t||(t={}));let B="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:".split("");class w{constructor(a,b){if(0===b.length)throw Error("No coefficients.");this.field=a;let c=b.length;if(1a.length&&([b,a]=[a,b]);let c=new Uint8ClampedArray(a.length),d=a.length-b.length;for(var e=0;ea)throw Error("Invalid degree less than 0");if(0===b)return this.field.zero; +let c=this.coefficients.length;a=new Uint8ClampedArray(c+a);for(let d=0;d{b^=a}),b;b=this.coefficients[0];for(let d=1;d=this.size&&(a=(a^this.primitive)&this.size-1);for(a=0;aa)throw Error("Invalid monomial degree less than 0");if(0===b)return this.zero;a=new Uint8ClampedArray(a+1);a[0]=b;return new w(this,a)}log(a){if(0===a)throw Error("Can't take log(0)");return this.logTable[a]}exp(a){return this.expTable[a]}}let K=[{infoBits:null,versionNumber:1,alignmentPatternCenters:[],errorCorrectionLevels:[{ecCodewordsPerBlock:7,ecBlocks:[{numBlocks:1,dataCodewordsPerBlock:19}]},{ecCodewordsPerBlock:10,ecBlocks:[{numBlocks:1,dataCodewordsPerBlock:16}]},{ecCodewordsPerBlock:13, +ecBlocks:[{numBlocks:1,dataCodewordsPerBlock:13}]},{ecCodewordsPerBlock:17,ecBlocks:[{numBlocks:1,dataCodewordsPerBlock:9}]}]},{infoBits:null,versionNumber:2,alignmentPatternCenters:[6,18],errorCorrectionLevels:[{ecCodewordsPerBlock:10,ecBlocks:[{numBlocks:1,dataCodewordsPerBlock:34}]},{ecCodewordsPerBlock:16,ecBlocks:[{numBlocks:1,dataCodewordsPerBlock:28}]},{ecCodewordsPerBlock:22,ecBlocks:[{numBlocks:1,dataCodewordsPerBlock:22}]},{ecCodewordsPerBlock:28,ecBlocks:[{numBlocks:1,dataCodewordsPerBlock:16}]}]}, +{infoBits:null,versionNumber:3,alignmentPatternCenters:[6,22],errorCorrectionLevels:[{ecCodewordsPerBlock:15,ecBlocks:[{numBlocks:1,dataCodewordsPerBlock:55}]},{ecCodewordsPerBlock:26,ecBlocks:[{numBlocks:1,dataCodewordsPerBlock:44}]},{ecCodewordsPerBlock:18,ecBlocks:[{numBlocks:2,dataCodewordsPerBlock:17}]},{ecCodewordsPerBlock:22,ecBlocks:[{numBlocks:2,dataCodewordsPerBlock:13}]}]},{infoBits:null,versionNumber:4,alignmentPatternCenters:[6,26],errorCorrectionLevels:[{ecCodewordsPerBlock:20,ecBlocks:[{numBlocks:1, +dataCodewordsPerBlock:80}]},{ecCodewordsPerBlock:18,ecBlocks:[{numBlocks:2,dataCodewordsPerBlock:32}]},{ecCodewordsPerBlock:26,ecBlocks:[{numBlocks:2,dataCodewordsPerBlock:24}]},{ecCodewordsPerBlock:16,ecBlocks:[{numBlocks:4,dataCodewordsPerBlock:9}]}]},{infoBits:null,versionNumber:5,alignmentPatternCenters:[6,30],errorCorrectionLevels:[{ecCodewordsPerBlock:26,ecBlocks:[{numBlocks:1,dataCodewordsPerBlock:108}]},{ecCodewordsPerBlock:24,ecBlocks:[{numBlocks:2,dataCodewordsPerBlock:43}]},{ecCodewordsPerBlock:18, +ecBlocks:[{numBlocks:2,dataCodewordsPerBlock:15},{numBlocks:2,dataCodewordsPerBlock:16}]},{ecCodewordsPerBlock:22,ecBlocks:[{numBlocks:2,dataCodewordsPerBlock:11},{numBlocks:2,dataCodewordsPerBlock:12}]}]},{infoBits:null,versionNumber:6,alignmentPatternCenters:[6,34],errorCorrectionLevels:[{ecCodewordsPerBlock:18,ecBlocks:[{numBlocks:2,dataCodewordsPerBlock:68}]},{ecCodewordsPerBlock:16,ecBlocks:[{numBlocks:4,dataCodewordsPerBlock:27}]},{ecCodewordsPerBlock:24,ecBlocks:[{numBlocks:4,dataCodewordsPerBlock:19}]}, +{ecCodewordsPerBlock:28,ecBlocks:[{numBlocks:4,dataCodewordsPerBlock:15}]}]},{infoBits:31892,versionNumber:7,alignmentPatternCenters:[6,22,38],errorCorrectionLevels:[{ecCodewordsPerBlock:20,ecBlocks:[{numBlocks:2,dataCodewordsPerBlock:78}]},{ecCodewordsPerBlock:18,ecBlocks:[{numBlocks:4,dataCodewordsPerBlock:31}]},{ecCodewordsPerBlock:18,ecBlocks:[{numBlocks:2,dataCodewordsPerBlock:14},{numBlocks:4,dataCodewordsPerBlock:15}]},{ecCodewordsPerBlock:26,ecBlocks:[{numBlocks:4,dataCodewordsPerBlock:13}, +{numBlocks:1,dataCodewordsPerBlock:14}]}]},{infoBits:34236,versionNumber:8,alignmentPatternCenters:[6,24,42],errorCorrectionLevels:[{ecCodewordsPerBlock:24,ecBlocks:[{numBlocks:2,dataCodewordsPerBlock:97}]},{ecCodewordsPerBlock:22,ecBlocks:[{numBlocks:2,dataCodewordsPerBlock:38},{numBlocks:2,dataCodewordsPerBlock:39}]},{ecCodewordsPerBlock:22,ecBlocks:[{numBlocks:4,dataCodewordsPerBlock:18},{numBlocks:2,dataCodewordsPerBlock:19}]},{ecCodewordsPerBlock:26,ecBlocks:[{numBlocks:4,dataCodewordsPerBlock:14}, +{numBlocks:2,dataCodewordsPerBlock:15}]}]},{infoBits:39577,versionNumber:9,alignmentPatternCenters:[6,26,46],errorCorrectionLevels:[{ecCodewordsPerBlock:30,ecBlocks:[{numBlocks:2,dataCodewordsPerBlock:116}]},{ecCodewordsPerBlock:22,ecBlocks:[{numBlocks:3,dataCodewordsPerBlock:36},{numBlocks:2,dataCodewordsPerBlock:37}]},{ecCodewordsPerBlock:20,ecBlocks:[{numBlocks:4,dataCodewordsPerBlock:16},{numBlocks:4,dataCodewordsPerBlock:17}]},{ecCodewordsPerBlock:24,ecBlocks:[{numBlocks:4,dataCodewordsPerBlock:12}, +{numBlocks:4,dataCodewordsPerBlock:13}]}]},{infoBits:42195,versionNumber:10,alignmentPatternCenters:[6,28,50],errorCorrectionLevels:[{ecCodewordsPerBlock:18,ecBlocks:[{numBlocks:2,dataCodewordsPerBlock:68},{numBlocks:2,dataCodewordsPerBlock:69}]},{ecCodewordsPerBlock:26,ecBlocks:[{numBlocks:4,dataCodewordsPerBlock:43},{numBlocks:1,dataCodewordsPerBlock:44}]},{ecCodewordsPerBlock:24,ecBlocks:[{numBlocks:6,dataCodewordsPerBlock:19},{numBlocks:2,dataCodewordsPerBlock:20}]},{ecCodewordsPerBlock:28,ecBlocks:[{numBlocks:6, +dataCodewordsPerBlock:15},{numBlocks:2,dataCodewordsPerBlock:16}]}]},{infoBits:48118,versionNumber:11,alignmentPatternCenters:[6,30,54],errorCorrectionLevels:[{ecCodewordsPerBlock:20,ecBlocks:[{numBlocks:4,dataCodewordsPerBlock:81}]},{ecCodewordsPerBlock:30,ecBlocks:[{numBlocks:1,dataCodewordsPerBlock:50},{numBlocks:4,dataCodewordsPerBlock:51}]},{ecCodewordsPerBlock:28,ecBlocks:[{numBlocks:4,dataCodewordsPerBlock:22},{numBlocks:4,dataCodewordsPerBlock:23}]},{ecCodewordsPerBlock:24,ecBlocks:[{numBlocks:3, +dataCodewordsPerBlock:12},{numBlocks:8,dataCodewordsPerBlock:13}]}]},{infoBits:51042,versionNumber:12,alignmentPatternCenters:[6,32,58],errorCorrectionLevels:[{ecCodewordsPerBlock:24,ecBlocks:[{numBlocks:2,dataCodewordsPerBlock:92},{numBlocks:2,dataCodewordsPerBlock:93}]},{ecCodewordsPerBlock:22,ecBlocks:[{numBlocks:6,dataCodewordsPerBlock:36},{numBlocks:2,dataCodewordsPerBlock:37}]},{ecCodewordsPerBlock:26,ecBlocks:[{numBlocks:4,dataCodewordsPerBlock:20},{numBlocks:6,dataCodewordsPerBlock:21}]}, +{ecCodewordsPerBlock:28,ecBlocks:[{numBlocks:7,dataCodewordsPerBlock:14},{numBlocks:4,dataCodewordsPerBlock:15}]}]},{infoBits:55367,versionNumber:13,alignmentPatternCenters:[6,34,62],errorCorrectionLevels:[{ecCodewordsPerBlock:26,ecBlocks:[{numBlocks:4,dataCodewordsPerBlock:107}]},{ecCodewordsPerBlock:22,ecBlocks:[{numBlocks:8,dataCodewordsPerBlock:37},{numBlocks:1,dataCodewordsPerBlock:38}]},{ecCodewordsPerBlock:24,ecBlocks:[{numBlocks:8,dataCodewordsPerBlock:20},{numBlocks:4,dataCodewordsPerBlock:21}]}, +{ecCodewordsPerBlock:22,ecBlocks:[{numBlocks:12,dataCodewordsPerBlock:11},{numBlocks:4,dataCodewordsPerBlock:12}]}]},{infoBits:58893,versionNumber:14,alignmentPatternCenters:[6,26,46,66],errorCorrectionLevels:[{ecCodewordsPerBlock:30,ecBlocks:[{numBlocks:3,dataCodewordsPerBlock:115},{numBlocks:1,dataCodewordsPerBlock:116}]},{ecCodewordsPerBlock:24,ecBlocks:[{numBlocks:4,dataCodewordsPerBlock:40},{numBlocks:5,dataCodewordsPerBlock:41}]},{ecCodewordsPerBlock:20,ecBlocks:[{numBlocks:11,dataCodewordsPerBlock:16}, +{numBlocks:5,dataCodewordsPerBlock:17}]},{ecCodewordsPerBlock:24,ecBlocks:[{numBlocks:11,dataCodewordsPerBlock:12},{numBlocks:5,dataCodewordsPerBlock:13}]}]},{infoBits:63784,versionNumber:15,alignmentPatternCenters:[6,26,48,70],errorCorrectionLevels:[{ecCodewordsPerBlock:22,ecBlocks:[{numBlocks:5,dataCodewordsPerBlock:87},{numBlocks:1,dataCodewordsPerBlock:88}]},{ecCodewordsPerBlock:24,ecBlocks:[{numBlocks:5,dataCodewordsPerBlock:41},{numBlocks:5,dataCodewordsPerBlock:42}]},{ecCodewordsPerBlock:30, +ecBlocks:[{numBlocks:5,dataCodewordsPerBlock:24},{numBlocks:7,dataCodewordsPerBlock:25}]},{ecCodewordsPerBlock:24,ecBlocks:[{numBlocks:11,dataCodewordsPerBlock:12},{numBlocks:7,dataCodewordsPerBlock:13}]}]},{infoBits:68472,versionNumber:16,alignmentPatternCenters:[6,26,50,74],errorCorrectionLevels:[{ecCodewordsPerBlock:24,ecBlocks:[{numBlocks:5,dataCodewordsPerBlock:98},{numBlocks:1,dataCodewordsPerBlock:99}]},{ecCodewordsPerBlock:28,ecBlocks:[{numBlocks:7,dataCodewordsPerBlock:45},{numBlocks:3,dataCodewordsPerBlock:46}]}, +{ecCodewordsPerBlock:24,ecBlocks:[{numBlocks:15,dataCodewordsPerBlock:19},{numBlocks:2,dataCodewordsPerBlock:20}]},{ecCodewordsPerBlock:30,ecBlocks:[{numBlocks:3,dataCodewordsPerBlock:15},{numBlocks:13,dataCodewordsPerBlock:16}]}]},{infoBits:70749,versionNumber:17,alignmentPatternCenters:[6,30,54,78],errorCorrectionLevels:[{ecCodewordsPerBlock:28,ecBlocks:[{numBlocks:1,dataCodewordsPerBlock:107},{numBlocks:5,dataCodewordsPerBlock:108}]},{ecCodewordsPerBlock:28,ecBlocks:[{numBlocks:10,dataCodewordsPerBlock:46}, +{numBlocks:1,dataCodewordsPerBlock:47}]},{ecCodewordsPerBlock:28,ecBlocks:[{numBlocks:1,dataCodewordsPerBlock:22},{numBlocks:15,dataCodewordsPerBlock:23}]},{ecCodewordsPerBlock:28,ecBlocks:[{numBlocks:2,dataCodewordsPerBlock:14},{numBlocks:17,dataCodewordsPerBlock:15}]}]},{infoBits:76311,versionNumber:18,alignmentPatternCenters:[6,30,56,82],errorCorrectionLevels:[{ecCodewordsPerBlock:30,ecBlocks:[{numBlocks:5,dataCodewordsPerBlock:120},{numBlocks:1,dataCodewordsPerBlock:121}]},{ecCodewordsPerBlock:26, +ecBlocks:[{numBlocks:9,dataCodewordsPerBlock:43},{numBlocks:4,dataCodewordsPerBlock:44}]},{ecCodewordsPerBlock:28,ecBlocks:[{numBlocks:17,dataCodewordsPerBlock:22},{numBlocks:1,dataCodewordsPerBlock:23}]},{ecCodewordsPerBlock:28,ecBlocks:[{numBlocks:2,dataCodewordsPerBlock:14},{numBlocks:19,dataCodewordsPerBlock:15}]}]},{infoBits:79154,versionNumber:19,alignmentPatternCenters:[6,30,58,86],errorCorrectionLevels:[{ecCodewordsPerBlock:28,ecBlocks:[{numBlocks:3,dataCodewordsPerBlock:113},{numBlocks:4, +dataCodewordsPerBlock:114}]},{ecCodewordsPerBlock:26,ecBlocks:[{numBlocks:3,dataCodewordsPerBlock:44},{numBlocks:11,dataCodewordsPerBlock:45}]},{ecCodewordsPerBlock:26,ecBlocks:[{numBlocks:17,dataCodewordsPerBlock:21},{numBlocks:4,dataCodewordsPerBlock:22}]},{ecCodewordsPerBlock:26,ecBlocks:[{numBlocks:9,dataCodewordsPerBlock:13},{numBlocks:16,dataCodewordsPerBlock:14}]}]},{infoBits:84390,versionNumber:20,alignmentPatternCenters:[6,34,62,90],errorCorrectionLevels:[{ecCodewordsPerBlock:28,ecBlocks:[{numBlocks:3, +dataCodewordsPerBlock:107},{numBlocks:5,dataCodewordsPerBlock:108}]},{ecCodewordsPerBlock:26,ecBlocks:[{numBlocks:3,dataCodewordsPerBlock:41},{numBlocks:13,dataCodewordsPerBlock:42}]},{ecCodewordsPerBlock:30,ecBlocks:[{numBlocks:15,dataCodewordsPerBlock:24},{numBlocks:5,dataCodewordsPerBlock:25}]},{ecCodewordsPerBlock:28,ecBlocks:[{numBlocks:15,dataCodewordsPerBlock:15},{numBlocks:10,dataCodewordsPerBlock:16}]}]},{infoBits:87683,versionNumber:21,alignmentPatternCenters:[6,28,50,72,94],errorCorrectionLevels:[{ecCodewordsPerBlock:28, +ecBlocks:[{numBlocks:4,dataCodewordsPerBlock:116},{numBlocks:4,dataCodewordsPerBlock:117}]},{ecCodewordsPerBlock:26,ecBlocks:[{numBlocks:17,dataCodewordsPerBlock:42}]},{ecCodewordsPerBlock:28,ecBlocks:[{numBlocks:17,dataCodewordsPerBlock:22},{numBlocks:6,dataCodewordsPerBlock:23}]},{ecCodewordsPerBlock:30,ecBlocks:[{numBlocks:19,dataCodewordsPerBlock:16},{numBlocks:6,dataCodewordsPerBlock:17}]}]},{infoBits:92361,versionNumber:22,alignmentPatternCenters:[6,26,50,74,98],errorCorrectionLevels:[{ecCodewordsPerBlock:28, +ecBlocks:[{numBlocks:2,dataCodewordsPerBlock:111},{numBlocks:7,dataCodewordsPerBlock:112}]},{ecCodewordsPerBlock:28,ecBlocks:[{numBlocks:17,dataCodewordsPerBlock:46}]},{ecCodewordsPerBlock:30,ecBlocks:[{numBlocks:7,dataCodewordsPerBlock:24},{numBlocks:16,dataCodewordsPerBlock:25}]},{ecCodewordsPerBlock:24,ecBlocks:[{numBlocks:34,dataCodewordsPerBlock:13}]}]},{infoBits:96236,versionNumber:23,alignmentPatternCenters:[6,30,54,74,102],errorCorrectionLevels:[{ecCodewordsPerBlock:30,ecBlocks:[{numBlocks:4, +dataCodewordsPerBlock:121},{numBlocks:5,dataCodewordsPerBlock:122}]},{ecCodewordsPerBlock:28,ecBlocks:[{numBlocks:4,dataCodewordsPerBlock:47},{numBlocks:14,dataCodewordsPerBlock:48}]},{ecCodewordsPerBlock:30,ecBlocks:[{numBlocks:11,dataCodewordsPerBlock:24},{numBlocks:14,dataCodewordsPerBlock:25}]},{ecCodewordsPerBlock:30,ecBlocks:[{numBlocks:16,dataCodewordsPerBlock:15},{numBlocks:14,dataCodewordsPerBlock:16}]}]},{infoBits:102084,versionNumber:24,alignmentPatternCenters:[6,28,54,80,106],errorCorrectionLevels:[{ecCodewordsPerBlock:30, +ecBlocks:[{numBlocks:6,dataCodewordsPerBlock:117},{numBlocks:4,dataCodewordsPerBlock:118}]},{ecCodewordsPerBlock:28,ecBlocks:[{numBlocks:6,dataCodewordsPerBlock:45},{numBlocks:14,dataCodewordsPerBlock:46}]},{ecCodewordsPerBlock:30,ecBlocks:[{numBlocks:11,dataCodewordsPerBlock:24},{numBlocks:16,dataCodewordsPerBlock:25}]},{ecCodewordsPerBlock:30,ecBlocks:[{numBlocks:30,dataCodewordsPerBlock:16},{numBlocks:2,dataCodewordsPerBlock:17}]}]},{infoBits:102881,versionNumber:25,alignmentPatternCenters:[6, +32,58,84,110],errorCorrectionLevels:[{ecCodewordsPerBlock:26,ecBlocks:[{numBlocks:8,dataCodewordsPerBlock:106},{numBlocks:4,dataCodewordsPerBlock:107}]},{ecCodewordsPerBlock:28,ecBlocks:[{numBlocks:8,dataCodewordsPerBlock:47},{numBlocks:13,dataCodewordsPerBlock:48}]},{ecCodewordsPerBlock:30,ecBlocks:[{numBlocks:7,dataCodewordsPerBlock:24},{numBlocks:22,dataCodewordsPerBlock:25}]},{ecCodewordsPerBlock:30,ecBlocks:[{numBlocks:22,dataCodewordsPerBlock:15},{numBlocks:13,dataCodewordsPerBlock:16}]}]}, +{infoBits:110507,versionNumber:26,alignmentPatternCenters:[6,30,58,86,114],errorCorrectionLevels:[{ecCodewordsPerBlock:28,ecBlocks:[{numBlocks:10,dataCodewordsPerBlock:114},{numBlocks:2,dataCodewordsPerBlock:115}]},{ecCodewordsPerBlock:28,ecBlocks:[{numBlocks:19,dataCodewordsPerBlock:46},{numBlocks:4,dataCodewordsPerBlock:47}]},{ecCodewordsPerBlock:28,ecBlocks:[{numBlocks:28,dataCodewordsPerBlock:22},{numBlocks:6,dataCodewordsPerBlock:23}]},{ecCodewordsPerBlock:30,ecBlocks:[{numBlocks:33,dataCodewordsPerBlock:16}, +{numBlocks:4,dataCodewordsPerBlock:17}]}]},{infoBits:110734,versionNumber:27,alignmentPatternCenters:[6,34,62,90,118],errorCorrectionLevels:[{ecCodewordsPerBlock:30,ecBlocks:[{numBlocks:8,dataCodewordsPerBlock:122},{numBlocks:4,dataCodewordsPerBlock:123}]},{ecCodewordsPerBlock:28,ecBlocks:[{numBlocks:22,dataCodewordsPerBlock:45},{numBlocks:3,dataCodewordsPerBlock:46}]},{ecCodewordsPerBlock:30,ecBlocks:[{numBlocks:8,dataCodewordsPerBlock:23},{numBlocks:26,dataCodewordsPerBlock:24}]},{ecCodewordsPerBlock:30, +ecBlocks:[{numBlocks:12,dataCodewordsPerBlock:15},{numBlocks:28,dataCodewordsPerBlock:16}]}]},{infoBits:117786,versionNumber:28,alignmentPatternCenters:[6,26,50,74,98,122],errorCorrectionLevels:[{ecCodewordsPerBlock:30,ecBlocks:[{numBlocks:3,dataCodewordsPerBlock:117},{numBlocks:10,dataCodewordsPerBlock:118}]},{ecCodewordsPerBlock:28,ecBlocks:[{numBlocks:3,dataCodewordsPerBlock:45},{numBlocks:23,dataCodewordsPerBlock:46}]},{ecCodewordsPerBlock:30,ecBlocks:[{numBlocks:4,dataCodewordsPerBlock:24},{numBlocks:31, +dataCodewordsPerBlock:25}]},{ecCodewordsPerBlock:30,ecBlocks:[{numBlocks:11,dataCodewordsPerBlock:15},{numBlocks:31,dataCodewordsPerBlock:16}]}]},{infoBits:119615,versionNumber:29,alignmentPatternCenters:[6,30,54,78,102,126],errorCorrectionLevels:[{ecCodewordsPerBlock:30,ecBlocks:[{numBlocks:7,dataCodewordsPerBlock:116},{numBlocks:7,dataCodewordsPerBlock:117}]},{ecCodewordsPerBlock:28,ecBlocks:[{numBlocks:21,dataCodewordsPerBlock:45},{numBlocks:7,dataCodewordsPerBlock:46}]},{ecCodewordsPerBlock:30, +ecBlocks:[{numBlocks:1,dataCodewordsPerBlock:23},{numBlocks:37,dataCodewordsPerBlock:24}]},{ecCodewordsPerBlock:30,ecBlocks:[{numBlocks:19,dataCodewordsPerBlock:15},{numBlocks:26,dataCodewordsPerBlock:16}]}]},{infoBits:126325,versionNumber:30,alignmentPatternCenters:[6,26,52,78,104,130],errorCorrectionLevels:[{ecCodewordsPerBlock:30,ecBlocks:[{numBlocks:5,dataCodewordsPerBlock:115},{numBlocks:10,dataCodewordsPerBlock:116}]},{ecCodewordsPerBlock:28,ecBlocks:[{numBlocks:19,dataCodewordsPerBlock:47}, +{numBlocks:10,dataCodewordsPerBlock:48}]},{ecCodewordsPerBlock:30,ecBlocks:[{numBlocks:15,dataCodewordsPerBlock:24},{numBlocks:25,dataCodewordsPerBlock:25}]},{ecCodewordsPerBlock:30,ecBlocks:[{numBlocks:23,dataCodewordsPerBlock:15},{numBlocks:25,dataCodewordsPerBlock:16}]}]},{infoBits:127568,versionNumber:31,alignmentPatternCenters:[6,30,56,82,108,134],errorCorrectionLevels:[{ecCodewordsPerBlock:30,ecBlocks:[{numBlocks:13,dataCodewordsPerBlock:115},{numBlocks:3,dataCodewordsPerBlock:116}]},{ecCodewordsPerBlock:28, +ecBlocks:[{numBlocks:2,dataCodewordsPerBlock:46},{numBlocks:29,dataCodewordsPerBlock:47}]},{ecCodewordsPerBlock:30,ecBlocks:[{numBlocks:42,dataCodewordsPerBlock:24},{numBlocks:1,dataCodewordsPerBlock:25}]},{ecCodewordsPerBlock:30,ecBlocks:[{numBlocks:23,dataCodewordsPerBlock:15},{numBlocks:28,dataCodewordsPerBlock:16}]}]},{infoBits:133589,versionNumber:32,alignmentPatternCenters:[6,34,60,86,112,138],errorCorrectionLevels:[{ecCodewordsPerBlock:30,ecBlocks:[{numBlocks:17,dataCodewordsPerBlock:115}]}, +{ecCodewordsPerBlock:28,ecBlocks:[{numBlocks:10,dataCodewordsPerBlock:46},{numBlocks:23,dataCodewordsPerBlock:47}]},{ecCodewordsPerBlock:30,ecBlocks:[{numBlocks:10,dataCodewordsPerBlock:24},{numBlocks:35,dataCodewordsPerBlock:25}]},{ecCodewordsPerBlock:30,ecBlocks:[{numBlocks:19,dataCodewordsPerBlock:15},{numBlocks:35,dataCodewordsPerBlock:16}]}]},{infoBits:136944,versionNumber:33,alignmentPatternCenters:[6,30,58,86,114,142],errorCorrectionLevels:[{ecCodewordsPerBlock:30,ecBlocks:[{numBlocks:17,dataCodewordsPerBlock:115}, +{numBlocks:1,dataCodewordsPerBlock:116}]},{ecCodewordsPerBlock:28,ecBlocks:[{numBlocks:14,dataCodewordsPerBlock:46},{numBlocks:21,dataCodewordsPerBlock:47}]},{ecCodewordsPerBlock:30,ecBlocks:[{numBlocks:29,dataCodewordsPerBlock:24},{numBlocks:19,dataCodewordsPerBlock:25}]},{ecCodewordsPerBlock:30,ecBlocks:[{numBlocks:11,dataCodewordsPerBlock:15},{numBlocks:46,dataCodewordsPerBlock:16}]}]},{infoBits:141498,versionNumber:34,alignmentPatternCenters:[6,34,62,90,118,146],errorCorrectionLevels:[{ecCodewordsPerBlock:30, +ecBlocks:[{numBlocks:13,dataCodewordsPerBlock:115},{numBlocks:6,dataCodewordsPerBlock:116}]},{ecCodewordsPerBlock:28,ecBlocks:[{numBlocks:14,dataCodewordsPerBlock:46},{numBlocks:23,dataCodewordsPerBlock:47}]},{ecCodewordsPerBlock:30,ecBlocks:[{numBlocks:44,dataCodewordsPerBlock:24},{numBlocks:7,dataCodewordsPerBlock:25}]},{ecCodewordsPerBlock:30,ecBlocks:[{numBlocks:59,dataCodewordsPerBlock:16},{numBlocks:1,dataCodewordsPerBlock:17}]}]},{infoBits:145311,versionNumber:35,alignmentPatternCenters:[6, +30,54,78,102,126,150],errorCorrectionLevels:[{ecCodewordsPerBlock:30,ecBlocks:[{numBlocks:12,dataCodewordsPerBlock:121},{numBlocks:7,dataCodewordsPerBlock:122}]},{ecCodewordsPerBlock:28,ecBlocks:[{numBlocks:12,dataCodewordsPerBlock:47},{numBlocks:26,dataCodewordsPerBlock:48}]},{ecCodewordsPerBlock:30,ecBlocks:[{numBlocks:39,dataCodewordsPerBlock:24},{numBlocks:14,dataCodewordsPerBlock:25}]},{ecCodewordsPerBlock:30,ecBlocks:[{numBlocks:22,dataCodewordsPerBlock:15},{numBlocks:41,dataCodewordsPerBlock:16}]}]}, +{infoBits:150283,versionNumber:36,alignmentPatternCenters:[6,24,50,76,102,128,154],errorCorrectionLevels:[{ecCodewordsPerBlock:30,ecBlocks:[{numBlocks:6,dataCodewordsPerBlock:121},{numBlocks:14,dataCodewordsPerBlock:122}]},{ecCodewordsPerBlock:28,ecBlocks:[{numBlocks:6,dataCodewordsPerBlock:47},{numBlocks:34,dataCodewordsPerBlock:48}]},{ecCodewordsPerBlock:30,ecBlocks:[{numBlocks:46,dataCodewordsPerBlock:24},{numBlocks:10,dataCodewordsPerBlock:25}]},{ecCodewordsPerBlock:30,ecBlocks:[{numBlocks:2, +dataCodewordsPerBlock:15},{numBlocks:64,dataCodewordsPerBlock:16}]}]},{infoBits:152622,versionNumber:37,alignmentPatternCenters:[6,28,54,80,106,132,158],errorCorrectionLevels:[{ecCodewordsPerBlock:30,ecBlocks:[{numBlocks:17,dataCodewordsPerBlock:122},{numBlocks:4,dataCodewordsPerBlock:123}]},{ecCodewordsPerBlock:28,ecBlocks:[{numBlocks:29,dataCodewordsPerBlock:46},{numBlocks:14,dataCodewordsPerBlock:47}]},{ecCodewordsPerBlock:30,ecBlocks:[{numBlocks:49,dataCodewordsPerBlock:24},{numBlocks:10,dataCodewordsPerBlock:25}]}, +{ecCodewordsPerBlock:30,ecBlocks:[{numBlocks:24,dataCodewordsPerBlock:15},{numBlocks:46,dataCodewordsPerBlock:16}]}]},{infoBits:158308,versionNumber:38,alignmentPatternCenters:[6,32,58,84,110,136,162],errorCorrectionLevels:[{ecCodewordsPerBlock:30,ecBlocks:[{numBlocks:4,dataCodewordsPerBlock:122},{numBlocks:18,dataCodewordsPerBlock:123}]},{ecCodewordsPerBlock:28,ecBlocks:[{numBlocks:13,dataCodewordsPerBlock:46},{numBlocks:32,dataCodewordsPerBlock:47}]},{ecCodewordsPerBlock:30,ecBlocks:[{numBlocks:48, +dataCodewordsPerBlock:24},{numBlocks:14,dataCodewordsPerBlock:25}]},{ecCodewordsPerBlock:30,ecBlocks:[{numBlocks:42,dataCodewordsPerBlock:15},{numBlocks:32,dataCodewordsPerBlock:16}]}]},{infoBits:161089,versionNumber:39,alignmentPatternCenters:[6,26,54,82,110,138,166],errorCorrectionLevels:[{ecCodewordsPerBlock:30,ecBlocks:[{numBlocks:20,dataCodewordsPerBlock:117},{numBlocks:4,dataCodewordsPerBlock:118}]},{ecCodewordsPerBlock:28,ecBlocks:[{numBlocks:40,dataCodewordsPerBlock:47},{numBlocks:7,dataCodewordsPerBlock:48}]}, +{ecCodewordsPerBlock:30,ecBlocks:[{numBlocks:43,dataCodewordsPerBlock:24},{numBlocks:22,dataCodewordsPerBlock:25}]},{ecCodewordsPerBlock:30,ecBlocks:[{numBlocks:10,dataCodewordsPerBlock:15},{numBlocks:67,dataCodewordsPerBlock:16}]}]},{infoBits:167017,versionNumber:40,alignmentPatternCenters:[6,30,58,86,114,142,170],errorCorrectionLevels:[{ecCodewordsPerBlock:30,ecBlocks:[{numBlocks:19,dataCodewordsPerBlock:118},{numBlocks:6,dataCodewordsPerBlock:119}]},{ecCodewordsPerBlock:28,ecBlocks:[{numBlocks:18, +dataCodewordsPerBlock:47},{numBlocks:31,dataCodewordsPerBlock:48}]},{ecCodewordsPerBlock:30,ecBlocks:[{numBlocks:34,dataCodewordsPerBlock:24},{numBlocks:34,dataCodewordsPerBlock:25}]},{ecCodewordsPerBlock:30,ecBlocks:[{numBlocks:20,dataCodewordsPerBlock:15},{numBlocks:61,dataCodewordsPerBlock:16}]}]}],da=[{bits:21522,formatInfo:{errorCorrectionLevel:1,dataMask:0}},{bits:20773,formatInfo:{errorCorrectionLevel:1,dataMask:1}},{bits:24188,formatInfo:{errorCorrectionLevel:1,dataMask:2}},{bits:23371,formatInfo:{errorCorrectionLevel:1, +dataMask:3}},{bits:17913,formatInfo:{errorCorrectionLevel:1,dataMask:4}},{bits:16590,formatInfo:{errorCorrectionLevel:1,dataMask:5}},{bits:20375,formatInfo:{errorCorrectionLevel:1,dataMask:6}},{bits:19104,formatInfo:{errorCorrectionLevel:1,dataMask:7}},{bits:30660,formatInfo:{errorCorrectionLevel:0,dataMask:0}},{bits:29427,formatInfo:{errorCorrectionLevel:0,dataMask:1}},{bits:32170,formatInfo:{errorCorrectionLevel:0,dataMask:2}},{bits:30877,formatInfo:{errorCorrectionLevel:0,dataMask:3}},{bits:26159, +formatInfo:{errorCorrectionLevel:0,dataMask:4}},{bits:25368,formatInfo:{errorCorrectionLevel:0,dataMask:5}},{bits:27713,formatInfo:{errorCorrectionLevel:0,dataMask:6}},{bits:26998,formatInfo:{errorCorrectionLevel:0,dataMask:7}},{bits:5769,formatInfo:{errorCorrectionLevel:3,dataMask:0}},{bits:5054,formatInfo:{errorCorrectionLevel:3,dataMask:1}},{bits:7399,formatInfo:{errorCorrectionLevel:3,dataMask:2}},{bits:6608,formatInfo:{errorCorrectionLevel:3,dataMask:3}},{bits:1890,formatInfo:{errorCorrectionLevel:3, +dataMask:4}},{bits:597,formatInfo:{errorCorrectionLevel:3,dataMask:5}},{bits:3340,formatInfo:{errorCorrectionLevel:3,dataMask:6}},{bits:2107,formatInfo:{errorCorrectionLevel:3,dataMask:7}},{bits:13663,formatInfo:{errorCorrectionLevel:2,dataMask:0}},{bits:12392,formatInfo:{errorCorrectionLevel:2,dataMask:1}},{bits:16177,formatInfo:{errorCorrectionLevel:2,dataMask:2}},{bits:14854,formatInfo:{errorCorrectionLevel:2,dataMask:3}},{bits:9396,formatInfo:{errorCorrectionLevel:2,dataMask:4}},{bits:8579,formatInfo:{errorCorrectionLevel:2, +dataMask:5}},{bits:11994,formatInfo:{errorCorrectionLevel:2,dataMask:6}},{bits:11245,formatInfo:{errorCorrectionLevel:2,dataMask:7}}],aa=[a=>0===(a.y+a.x)%2,a=>0===a.y%2,a=>0===a.x%3,a=>0===(a.y+a.x)%3,a=>0===(Math.floor(a.y/2)+Math.floor(a.x/3))%2,a=>0===a.x*a.y%2+a.x*a.y%3,a=>0===(a.y*a.x%2+a.y*a.x%3)%2,a=>0===((a.y+a.x)%2+a.y*a.x%3)%2],y=(a,b)=>Math.sqrt(Math.pow(b.x-a.x,2)+Math.pow(b.y-a.y,2)),la={inversionAttempts:"attemptBoth",greyScaleWeights:{red:.2126,green:.7152,blue:.0722,useIntegerApproximation:!1}, +canOverwriteImage:!0};I.default=I;let G="dontInvert",D={red:77,green:150,blue:29,useIntegerApproximation:!0};self.onmessage=a=>{let b=a.data.data;switch(a.data.type){case "decode":a=I(b.data,b.width,b.height,{inversionAttempts:G,greyScaleWeights:D});self.postMessage({type:"qrResult",data:a?a.data:null});break;case "grayscaleWeights":D.red=b.red;D.green=b.green;D.blue=b.blue;D.useIntegerApproximation=b.useIntegerApproximation;break;case "inversionMode":switch(b){case "original":G="dontInvert";break; +case "invert":G="onlyInvert";break;case "both":G="attemptBoth";break;default:throw Error("Invalid inversion mode");}break;case "close":self.close()}}})() +//# sourceMappingURL=qr-scanner-worker.min.js.map diff --git a/src/styles.scss b/src/styles.scss index 199141f..649cb94 100644 --- a/src/styles.scss +++ b/src/styles.scss @@ -1,5 +1,5 @@ // Custom Theming for Angular Material -@use '~@angular/material' as mat; +@use '~@angular/material'as mat; // For more information: https://material.angular.io/guide/theming // Plus imports for other components in your app. @@ -83,7 +83,8 @@ body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol" !important; } -app-root, app-main { +app-root, +app-main { height: 100%; max-height: 100%; display: flex; @@ -326,4 +327,46 @@ table { position: relative; top: -40px; right: 15px; -} \ No newline at end of file +} + +mat-card.success { + padding: 0; + + mat-card-header { + padding: 16px; + padding-bottom: 16px; + padding-bottom: 0; + background-color: #43A047 !important; + } + + mat-card-content { + padding: 16px; + } + + mat-card-actions { + padding: 16px !important; + padding-top: 16px; + padding-top: 0 !important; + } +} + +.mat-card-dialog { + .mat-dialog-container { + margin: 0; + padding: 0; + + .mat-dialog-content { + margin: 0; + padding: 0; + + .mat-card { + margin: 0; + + .mat-card-actions { + margin: 0; + } + } + } + + } +}