From 714f6d229f92e103042f92b47a7c4e7f901ae2b8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 21 Jul 2022 20:26:06 +0000 Subject: [PATCH 01/58] Bump terser from 4.8.0 to 4.8.1 in /web Bumps [terser](https://github.com/terser/terser) from 4.8.0 to 4.8.1. - [Release notes](https://github.com/terser/terser/releases) - [Changelog](https://github.com/terser/terser/blob/master/CHANGELOG.md) - [Commits](https://github.com/terser/terser/commits) --- updated-dependencies: - dependency-name: terser dependency-type: indirect ... Signed-off-by: dependabot[bot] --- web/package-lock.json | 67 ++++++++++++------------------------------- 1 file changed, 19 insertions(+), 48 deletions(-) diff --git a/web/package-lock.json b/web/package-lock.json index b431eda0..a88f8a7b 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -1609,8 +1609,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", - "dev": true, - "optional": true + "dev": true }, "@types/q": { "version": "1.5.5", @@ -2198,7 +2197,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "optional": true, "requires": { "color-convert": "^2.0.1" } @@ -2208,7 +2206,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "optional": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -2219,7 +2216,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "optional": true, "requires": { "color-name": "~1.1.4" } @@ -2228,8 +2224,7 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "optional": true + "dev": true }, "fs-extra": { "version": "7.0.1", @@ -2256,8 +2251,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "optional": true + "dev": true }, "jsonfile": { "version": "4.0.0", @@ -2273,7 +2267,6 @@ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", "dev": true, - "optional": true, "requires": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -2300,7 +2293,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "optional": true, "requires": { "has-flag": "^4.0.0" } @@ -2316,7 +2308,6 @@ "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.8.3.tgz", "integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==", "dev": true, - "optional": true, "requires": { "chalk": "^4.1.0", "hash-sum": "^2.0.0", @@ -2980,8 +2971,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true, - "optional": true + "dev": true }, "atob": { "version": "2.1.2", @@ -4447,7 +4437,6 @@ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", "dev": true, - "optional": true, "requires": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.1.0", @@ -4460,8 +4449,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "optional": true + "dev": true } } }, @@ -4924,8 +4912,7 @@ "version": "4.2.2", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", - "dev": true, - "optional": true + "dev": true }, "default-gateway": { "version": "5.0.5", @@ -6397,7 +6384,6 @@ "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-5.2.1.tgz", "integrity": "sha512-SVi+ZAQOGbtAsUWrZvGzz38ga2YqjWvca1pXQFUArIVXqli0lLoDQ8uS0wg0kSpcwpZmaW5jVCZXQebkyUQSsw==", "dev": true, - "optional": true, "requires": { "@babel/code-frame": "^7.8.3", "@types/json-schema": "^7.0.5", @@ -6417,7 +6403,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "optional": true, "requires": { "color-convert": "^2.0.1" } @@ -6427,7 +6412,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "optional": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -6438,7 +6422,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "optional": true, "requires": { "color-name": "~1.1.4" } @@ -6447,22 +6430,19 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "optional": true + "dev": true }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "optional": true + "dev": true }, "schema-utils": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", "dev": true, - "optional": true, "requires": { "@types/json-schema": "^7.0.4", "ajv": "^6.12.2", @@ -6474,7 +6454,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "optional": true, "requires": { "has-flag": "^4.0.0" } @@ -6532,7 +6511,6 @@ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, - "optional": true, "requires": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", @@ -6544,8 +6522,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", - "dev": true, - "optional": true + "dev": true }, "fs-write-stream-atomic": { "version": "1.0.10", @@ -7283,7 +7260,6 @@ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, - "optional": true, "requires": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -8094,7 +8070,6 @@ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, - "optional": true, "requires": { "graceful-fs": "^4.1.6", "universalify": "^2.0.0" @@ -8404,13 +8379,12 @@ "dev": true }, "memfs": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.4.tgz", - "integrity": "sha512-W4gHNUE++1oSJVn8Y68jPXi+mkx3fXR5ITE/Ubz6EQ3xRpCN5k2CQ4AUR8094Z7211F876TyoBACGsIveqgiGA==", + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.7.tgz", + "integrity": "sha512-ygaiUSNalBX85388uskeCyhSAoOSgzBbtVCr9jA2RROssFL9Q19/ZXFqS+2Th2sr1ewNIWgFdLzLC3Yl1Zv+lw==", "dev": true, - "optional": true, "requires": { - "fs-monkey": "1.0.3" + "fs-monkey": "^1.0.3" } }, "memory-fs": { @@ -10789,8 +10763,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "optional": true + "dev": true }, "resolve-url": { "version": "0.2.1", @@ -11910,9 +11883,9 @@ "dev": true }, "terser": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", - "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz", + "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==", "dev": true, "requires": { "commander": "^2.20.0", @@ -12480,8 +12453,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true, - "optional": true + "dev": true }, "unpipe": { "version": "1.0.0", @@ -13758,8 +13730,7 @@ "version": "1.10.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true, - "optional": true + "dev": true }, "yargs": { "version": "16.2.0", From 2dca1ba761e32e273f00cca31bbd9605a1f848f8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 12 Nov 2022 18:26:37 +0000 Subject: [PATCH 02/58] Bump minimatch from 3.0.4 to 3.1.2 in /web Bumps [minimatch](https://github.com/isaacs/minimatch) from 3.0.4 to 3.1.2. - [Release notes](https://github.com/isaacs/minimatch/releases) - [Commits](https://github.com/isaacs/minimatch/compare/v3.0.4...v3.1.2) --- updated-dependencies: - dependency-name: minimatch dependency-type: indirect ... Signed-off-by: dependabot[bot] --- web/package-lock.json | 73 +++++++++++++------------------------------ 1 file changed, 22 insertions(+), 51 deletions(-) diff --git a/web/package-lock.json b/web/package-lock.json index b431eda0..2851dceb 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -1609,8 +1609,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", - "dev": true, - "optional": true + "dev": true }, "@types/q": { "version": "1.5.5", @@ -2198,7 +2197,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "optional": true, "requires": { "color-convert": "^2.0.1" } @@ -2208,7 +2206,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "optional": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -2219,7 +2216,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "optional": true, "requires": { "color-name": "~1.1.4" } @@ -2228,8 +2224,7 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "optional": true + "dev": true }, "fs-extra": { "version": "7.0.1", @@ -2256,8 +2251,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "optional": true + "dev": true }, "jsonfile": { "version": "4.0.0", @@ -2269,11 +2263,10 @@ } }, "loader-utils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", - "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "dev": true, - "optional": true, "requires": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -2300,7 +2293,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "optional": true, "requires": { "has-flag": "^4.0.0" } @@ -2316,7 +2308,6 @@ "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.8.3.tgz", "integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==", "dev": true, - "optional": true, "requires": { "chalk": "^4.1.0", "hash-sum": "^2.0.0", @@ -2980,8 +2971,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true, - "optional": true + "dev": true }, "atob": { "version": "2.1.2", @@ -4447,7 +4437,6 @@ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", "dev": true, - "optional": true, "requires": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.1.0", @@ -4460,8 +4449,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "optional": true + "dev": true } } }, @@ -4924,8 +4912,7 @@ "version": "4.2.2", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", - "dev": true, - "optional": true + "dev": true }, "default-gateway": { "version": "5.0.5", @@ -6397,7 +6384,6 @@ "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-5.2.1.tgz", "integrity": "sha512-SVi+ZAQOGbtAsUWrZvGzz38ga2YqjWvca1pXQFUArIVXqli0lLoDQ8uS0wg0kSpcwpZmaW5jVCZXQebkyUQSsw==", "dev": true, - "optional": true, "requires": { "@babel/code-frame": "^7.8.3", "@types/json-schema": "^7.0.5", @@ -6417,7 +6403,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "optional": true, "requires": { "color-convert": "^2.0.1" } @@ -6427,7 +6412,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "optional": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -6438,7 +6422,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "optional": true, "requires": { "color-name": "~1.1.4" } @@ -6447,22 +6430,19 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "optional": true + "dev": true }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "optional": true + "dev": true }, "schema-utils": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", "dev": true, - "optional": true, "requires": { "@types/json-schema": "^7.0.4", "ajv": "^6.12.2", @@ -6474,7 +6454,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "optional": true, "requires": { "has-flag": "^4.0.0" } @@ -6532,7 +6511,6 @@ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, - "optional": true, "requires": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", @@ -6544,8 +6522,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", - "dev": true, - "optional": true + "dev": true }, "fs-write-stream-atomic": { "version": "1.0.10", @@ -7283,7 +7260,6 @@ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, - "optional": true, "requires": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -8094,7 +8070,6 @@ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, - "optional": true, "requires": { "graceful-fs": "^4.1.6", "universalify": "^2.0.0" @@ -8404,13 +8379,12 @@ "dev": true }, "memfs": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.4.tgz", - "integrity": "sha512-W4gHNUE++1oSJVn8Y68jPXi+mkx3fXR5ITE/Ubz6EQ3xRpCN5k2CQ4AUR8094Z7211F876TyoBACGsIveqgiGA==", + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.10.tgz", + "integrity": "sha512-0bCUP+L79P4am30yP1msPzApwuMQG23TjwlwdHeEV5MxioDR1a0AgB0T9FfggU52eJuDCq8WVwb5ekznFyWiTQ==", "dev": true, - "optional": true, "requires": { - "fs-monkey": "1.0.3" + "fs-monkey": "^1.0.3" } }, "memory-fs": { @@ -8621,9 +8595,9 @@ "dev": true }, "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "requires": { "brace-expansion": "^1.1.7" } @@ -10789,8 +10763,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "optional": true + "dev": true }, "resolve-url": { "version": "0.2.1", @@ -12480,8 +12453,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true, - "optional": true + "dev": true }, "unpipe": { "version": "1.0.0", @@ -13758,8 +13730,7 @@ "version": "1.10.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true, - "optional": true + "dev": true }, "yargs": { "version": "16.2.0", From a8012c8cc9866c1e5c4eaeb5b1104beefe51664a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 7 Dec 2022 05:18:43 +0000 Subject: [PATCH 03/58] Bump qs from 6.5.2 to 6.5.3 in /web Bumps [qs](https://github.com/ljharb/qs) from 6.5.2 to 6.5.3. - [Release notes](https://github.com/ljharb/qs/releases) - [Changelog](https://github.com/ljharb/qs/blob/main/CHANGELOG.md) - [Commits](https://github.com/ljharb/qs/compare/v6.5.2...v6.5.3) --- updated-dependencies: - dependency-name: qs dependency-type: indirect ... Signed-off-by: dependabot[bot] --- web/package-lock.json | 73 +++++++++++++------------------------------ 1 file changed, 22 insertions(+), 51 deletions(-) diff --git a/web/package-lock.json b/web/package-lock.json index b431eda0..cdbaa606 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -1609,8 +1609,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", - "dev": true, - "optional": true + "dev": true }, "@types/q": { "version": "1.5.5", @@ -2198,7 +2197,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "optional": true, "requires": { "color-convert": "^2.0.1" } @@ -2208,7 +2206,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "optional": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -2219,7 +2216,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "optional": true, "requires": { "color-name": "~1.1.4" } @@ -2228,8 +2224,7 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "optional": true + "dev": true }, "fs-extra": { "version": "7.0.1", @@ -2256,8 +2251,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "optional": true + "dev": true }, "jsonfile": { "version": "4.0.0", @@ -2269,11 +2263,10 @@ } }, "loader-utils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", - "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "dev": true, - "optional": true, "requires": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -2300,7 +2293,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "optional": true, "requires": { "has-flag": "^4.0.0" } @@ -2316,7 +2308,6 @@ "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.8.3.tgz", "integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==", "dev": true, - "optional": true, "requires": { "chalk": "^4.1.0", "hash-sum": "^2.0.0", @@ -2980,8 +2971,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true, - "optional": true + "dev": true }, "atob": { "version": "2.1.2", @@ -4447,7 +4437,6 @@ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", "dev": true, - "optional": true, "requires": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.1.0", @@ -4460,8 +4449,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "optional": true + "dev": true } } }, @@ -4924,8 +4912,7 @@ "version": "4.2.2", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", - "dev": true, - "optional": true + "dev": true }, "default-gateway": { "version": "5.0.5", @@ -6397,7 +6384,6 @@ "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-5.2.1.tgz", "integrity": "sha512-SVi+ZAQOGbtAsUWrZvGzz38ga2YqjWvca1pXQFUArIVXqli0lLoDQ8uS0wg0kSpcwpZmaW5jVCZXQebkyUQSsw==", "dev": true, - "optional": true, "requires": { "@babel/code-frame": "^7.8.3", "@types/json-schema": "^7.0.5", @@ -6417,7 +6403,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "optional": true, "requires": { "color-convert": "^2.0.1" } @@ -6427,7 +6412,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "optional": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -6438,7 +6422,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "optional": true, "requires": { "color-name": "~1.1.4" } @@ -6447,22 +6430,19 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "optional": true + "dev": true }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "optional": true + "dev": true }, "schema-utils": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", "dev": true, - "optional": true, "requires": { "@types/json-schema": "^7.0.4", "ajv": "^6.12.2", @@ -6474,7 +6454,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "optional": true, "requires": { "has-flag": "^4.0.0" } @@ -6532,7 +6511,6 @@ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, - "optional": true, "requires": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", @@ -6544,8 +6522,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", - "dev": true, - "optional": true + "dev": true }, "fs-write-stream-atomic": { "version": "1.0.10", @@ -7283,7 +7260,6 @@ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, - "optional": true, "requires": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -8094,7 +8070,6 @@ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, - "optional": true, "requires": { "graceful-fs": "^4.1.6", "universalify": "^2.0.0" @@ -8404,13 +8379,12 @@ "dev": true }, "memfs": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.4.tgz", - "integrity": "sha512-W4gHNUE++1oSJVn8Y68jPXi+mkx3fXR5ITE/Ubz6EQ3xRpCN5k2CQ4AUR8094Z7211F876TyoBACGsIveqgiGA==", + "version": "3.4.12", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.12.tgz", + "integrity": "sha512-BcjuQn6vfqP+k100e0E9m61Hyqa//Brp+I3f0OBmN0ATHlFA8vx3Lt8z57R3u2bPqe3WGDBC+nF72fTH7isyEw==", "dev": true, - "optional": true, "requires": { - "fs-monkey": "1.0.3" + "fs-monkey": "^1.0.3" } }, "memory-fs": { @@ -10359,9 +10333,9 @@ "dev": true }, "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", "dev": true }, "query-string": { @@ -10789,8 +10763,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "optional": true + "dev": true }, "resolve-url": { "version": "0.2.1", @@ -12480,8 +12453,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true, - "optional": true + "dev": true }, "unpipe": { "version": "1.0.0", @@ -13758,8 +13730,7 @@ "version": "1.10.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true, - "optional": true + "dev": true }, "yargs": { "version": "16.2.0", From 6578b2e08687decb29c8e24869e4e0aefff70705 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 8 Dec 2022 08:20:21 +0000 Subject: [PATCH 04/58] Bump decode-uri-component from 0.2.0 to 0.2.2 in /web Bumps [decode-uri-component](https://github.com/SamVerschueren/decode-uri-component) from 0.2.0 to 0.2.2. - [Release notes](https://github.com/SamVerschueren/decode-uri-component/releases) - [Commits](https://github.com/SamVerschueren/decode-uri-component/compare/v0.2.0...v0.2.2) --- updated-dependencies: - dependency-name: decode-uri-component dependency-type: indirect ... Signed-off-by: dependabot[bot] --- web/package-lock.json | 73 +++++++++++++------------------------------ 1 file changed, 22 insertions(+), 51 deletions(-) diff --git a/web/package-lock.json b/web/package-lock.json index b431eda0..16eea1b7 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -1609,8 +1609,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", - "dev": true, - "optional": true + "dev": true }, "@types/q": { "version": "1.5.5", @@ -2198,7 +2197,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "optional": true, "requires": { "color-convert": "^2.0.1" } @@ -2208,7 +2206,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "optional": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -2219,7 +2216,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "optional": true, "requires": { "color-name": "~1.1.4" } @@ -2228,8 +2224,7 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "optional": true + "dev": true }, "fs-extra": { "version": "7.0.1", @@ -2256,8 +2251,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "optional": true + "dev": true }, "jsonfile": { "version": "4.0.0", @@ -2269,11 +2263,10 @@ } }, "loader-utils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", - "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "dev": true, - "optional": true, "requires": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -2300,7 +2293,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "optional": true, "requires": { "has-flag": "^4.0.0" } @@ -2316,7 +2308,6 @@ "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.8.3.tgz", "integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==", "dev": true, - "optional": true, "requires": { "chalk": "^4.1.0", "hash-sum": "^2.0.0", @@ -2980,8 +2971,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true, - "optional": true + "dev": true }, "atob": { "version": "2.1.2", @@ -4447,7 +4437,6 @@ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", "dev": true, - "optional": true, "requires": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.1.0", @@ -4460,8 +4449,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "optional": true + "dev": true } } }, @@ -4888,9 +4876,9 @@ "dev": true }, "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==" }, "decompress-response": { "version": "3.3.0", @@ -4924,8 +4912,7 @@ "version": "4.2.2", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", - "dev": true, - "optional": true + "dev": true }, "default-gateway": { "version": "5.0.5", @@ -6397,7 +6384,6 @@ "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-5.2.1.tgz", "integrity": "sha512-SVi+ZAQOGbtAsUWrZvGzz38ga2YqjWvca1pXQFUArIVXqli0lLoDQ8uS0wg0kSpcwpZmaW5jVCZXQebkyUQSsw==", "dev": true, - "optional": true, "requires": { "@babel/code-frame": "^7.8.3", "@types/json-schema": "^7.0.5", @@ -6417,7 +6403,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "optional": true, "requires": { "color-convert": "^2.0.1" } @@ -6427,7 +6412,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "optional": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -6438,7 +6422,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "optional": true, "requires": { "color-name": "~1.1.4" } @@ -6447,22 +6430,19 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "optional": true + "dev": true }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "optional": true + "dev": true }, "schema-utils": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", "dev": true, - "optional": true, "requires": { "@types/json-schema": "^7.0.4", "ajv": "^6.12.2", @@ -6474,7 +6454,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "optional": true, "requires": { "has-flag": "^4.0.0" } @@ -6532,7 +6511,6 @@ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, - "optional": true, "requires": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", @@ -6544,8 +6522,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", - "dev": true, - "optional": true + "dev": true }, "fs-write-stream-atomic": { "version": "1.0.10", @@ -7283,7 +7260,6 @@ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, - "optional": true, "requires": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -8094,7 +8070,6 @@ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, - "optional": true, "requires": { "graceful-fs": "^4.1.6", "universalify": "^2.0.0" @@ -8404,13 +8379,12 @@ "dev": true }, "memfs": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.4.tgz", - "integrity": "sha512-W4gHNUE++1oSJVn8Y68jPXi+mkx3fXR5ITE/Ubz6EQ3xRpCN5k2CQ4AUR8094Z7211F876TyoBACGsIveqgiGA==", + "version": "3.4.12", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.12.tgz", + "integrity": "sha512-BcjuQn6vfqP+k100e0E9m61Hyqa//Brp+I3f0OBmN0ATHlFA8vx3Lt8z57R3u2bPqe3WGDBC+nF72fTH7isyEw==", "dev": true, - "optional": true, "requires": { - "fs-monkey": "1.0.3" + "fs-monkey": "^1.0.3" } }, "memory-fs": { @@ -10789,8 +10763,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "optional": true + "dev": true }, "resolve-url": { "version": "0.2.1", @@ -12480,8 +12453,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true, - "optional": true + "dev": true }, "unpipe": { "version": "1.0.0", @@ -13758,8 +13730,7 @@ "version": "1.10.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true, - "optional": true + "dev": true }, "yargs": { "version": "16.2.0", From e5dc52cb8364846a4eb6efa0afd906d4640cad00 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 8 Dec 2022 11:27:03 +0000 Subject: [PATCH 05/58] Bump Newtonsoft.Json from 12.0.3 to 13.0.2 in /jc-interface-client Bumps [Newtonsoft.Json](https://github.com/JamesNK/Newtonsoft.Json) from 12.0.3 to 13.0.2. - [Release notes](https://github.com/JamesNK/Newtonsoft.Json/releases) - [Commits](https://github.com/JamesNK/Newtonsoft.Json/compare/12.0.3...13.0.2) --- updated-dependencies: - dependency-name: Newtonsoft.Json dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- jc-interface-client/jc-interface-client.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jc-interface-client/jc-interface-client.csproj b/jc-interface-client/jc-interface-client.csproj index 62d1ec67..932729b3 100644 --- a/jc-interface-client/jc-interface-client.csproj +++ b/jc-interface-client/jc-interface-client.csproj @@ -11,7 +11,7 @@ - + From 6802aa04bf586bbb3a6f462c823f1c15305bcb65 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 8 Dec 2022 11:28:18 +0000 Subject: [PATCH 06/58] Bump Newtonsoft.Json from 12.0.3 to 13.0.2 in /db Bumps [Newtonsoft.Json](https://github.com/JamesNK/Newtonsoft.Json) from 12.0.3 to 13.0.2. - [Release notes](https://github.com/JamesNK/Newtonsoft.Json/releases) - [Commits](https://github.com/JamesNK/Newtonsoft.Json/compare/12.0.3...13.0.2) --- updated-dependencies: - dependency-name: Newtonsoft.Json dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- db/db.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/db.csproj b/db/db.csproj index 2015b9b7..ee9bab79 100644 --- a/db/db.csproj +++ b/db/db.csproj @@ -101,7 +101,7 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - + all From 978659b16e4b19d3c58d82ea35547072672ec645 Mon Sep 17 00:00:00 2001 From: marzmehr Date: Thu, 22 Dec 2022 11:59:04 -0800 Subject: [PATCH 07/58] SS-743: initial front-end changes to generate training reports --- web/package.json | 1 + web/src/components/MyTeam/ViewReports.vue | 237 ++++++++++++++++++++++ web/src/components/NavigationTopbar.vue | 5 +- web/src/router/index.ts | 8 + web/src/types/common/index.ts | 8 + 5 files changed, 258 insertions(+), 1 deletion(-) create mode 100644 web/src/components/MyTeam/ViewReports.vue diff --git a/web/package.json b/web/package.json index aca83c75..2042231b 100644 --- a/web/package.json +++ b/web/package.json @@ -20,6 +20,7 @@ "bootstrap-vue": "^2.12.0", "core-js": "^3.6.5", "ejs": "^3.1.8", + "export-to-csv": "^0.2.1", "intersection-observer": "^0.10.0", "jquery": "^3.5.1", "moment-timezone": "^0.5.31", diff --git a/web/src/components/MyTeam/ViewReports.vue b/web/src/components/MyTeam/ViewReports.vue new file mode 100644 index 00000000..85bc6143 --- /dev/null +++ b/web/src/components/MyTeam/ViewReports.vue @@ -0,0 +1,237 @@ + + + + + \ No newline at end of file diff --git a/web/src/components/NavigationTopbar.vue b/web/src/components/NavigationTopbar.vue index c386e5fe..49a8d960 100644 --- a/web/src/components/NavigationTopbar.vue +++ b/web/src/components/NavigationTopbar.vue @@ -31,6 +31,7 @@ My Team Members Define Roles & Access + Reports Assignment Types @@ -110,6 +111,7 @@ hasPermissionToViewDutyRosterPage = false; hasPermissionToViewProfilePage = false; hasPermissionToViewRolesPage = false; + hasPermissionToViewReportsPage = true; hasPermissionToViewTeamPages = false; mounted() { @@ -124,12 +126,13 @@ this.hasPermissionToViewManageSchedule = this.userDetails.permissions.includes("ViewShifts"); this.hasPermissionToViewSchedulePages = this.hasPermissionToViewDistributeSchedule || this.hasPermissionToViewManageSchedule; this.hasPermissionToViewDutyRosterPage = this.userDetails.permissions.includes("ViewDutyRoster"); + // this.hasPermissionToViewReportsPage = this.userDetails.permissions.includes("ViewReports"); this.hasPermissionToViewRolesPage = this.userDetails.permissions.includes("ViewRoles"); const hasPermissionToViewProvinceProfiles = this.userDetails.permissions.includes("ViewProvince"); const hasPermnissionToViewProfilesInOwnLocation = this.userDetails.permissions.includes("ViewHomeLocation") || this.userDetails.permissions.includes("ViewAssignedLocation"); const hasPermnissionToViewRegionProfiles = this.userDetails.permissions.includes("ViewRegion"); this.hasPermissionToViewProfilePage = hasPermissionToViewProvinceProfiles || hasPermnissionToViewProfilesInOwnLocation || hasPermnissionToViewRegionProfiles; - this.hasPermissionToViewTeamPages = this.hasPermissionToViewProfilePage || this.hasPermissionToViewRolesPage; + this.hasPermissionToViewTeamPages = this.hasPermissionToViewProfilePage || this.hasPermissionToViewRolesPage || this.hasPermissionToViewReportsPage; } public getCurrentLocation() diff --git a/web/src/router/index.ts b/web/src/router/index.ts index ad14b213..f6e9f9be 100644 --- a/web/src/router/index.ts +++ b/web/src/router/index.ts @@ -9,6 +9,7 @@ import ManageSchedule from '@components/ShiftSchedule/ManageSchedule.vue' import DistributeSchedule from '@components/ShiftSchedule/DistributeSchedule.vue' import MyTeamMembers from '@components/MyTeam/MyTeamMembers.vue' import DefineRolesAccess from '@components/MyTeam/DefineRolesAccess.vue' +import ViewReports from '@components/MyTeam/ViewReports.vue' import AssignmentTypes from '@components/ManageTypes/AssignmentTypes.vue' import LeaveTrainingTypes from '@components/ManageTypes/LeaveTrainingTypes.vue' import store from "@/store"; @@ -136,6 +137,13 @@ const routes: Array = [ component: DefineRolesAccess, meta:{requiredPermission: 'ViewRoles'} }, + { + path: '/reports', + name: 'ViewReports', + // beforeEnter: checkPermission, + component: ViewReports, + // meta:{requiredPermission: 'ViewReports'} + }, { path: '/assignment-types', name: 'AssignmentTypes', diff --git a/web/src/types/common/index.ts b/web/src/types/common/index.ts index 561357df..4ab43325 100644 --- a/web/src/types/common/index.ts +++ b/web/src/types/common/index.ts @@ -43,3 +43,11 @@ export interface localTimeInfoType { dayOfWeek: number; isTodayInView: boolean; } + +export interface reportInfoType { + startDate: string; + endDate: string; + reportType: string; + location: string; + sheriffName: string; +} \ No newline at end of file From bcc85dd1e6d72cd24f7d9f6fc643927d876691e6 Mon Sep 17 00:00:00 2001 From: marzmehr Date: Mon, 2 Jan 2023 08:27:08 -0800 Subject: [PATCH 08/58] update to integrate with SSO Gold --- api/controllers/AuthController.cs | 4 ++-- api/helpers/extensions/ClaimExtensions.cs | 4 ++-- .../authorization/ClaimsTransformer.cs | 14 +++++++------- common/authorization/CustomClaimTypes.cs | 8 ++++---- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/api/controllers/AuthController.cs b/api/controllers/AuthController.cs index 244777aa..7d62ffde 100644 --- a/api/controllers/AuthController.cs +++ b/api/controllers/AuthController.cs @@ -84,9 +84,9 @@ public async Task Logout() var baseUri = HttpContext.Request.Headers.ContainsKey("X-Forwarded-Host") ? $"{Configuration.GetNonEmptyValue("WebBaseHref")}logout" : "/api"; var applicationUrl = $"{XForwardedForHelper.BuildUrlString(forwardedHost, forwardedPort, baseUri)}"; - var keycloakLogoutUrl = $"{logoutUrl}?post_logout_redirect_uri={applicationUrl}"; + var keycloakLogoutUrl = $"{logoutUrl}?redirect_uri={applicationUrl}"; var siteminderLogoutUrl = $"{Configuration.GetNonEmptyValue("SiteMinderLogoutUrl")}?returl={keycloakLogoutUrl}&retnow=1"; - return Redirect(siteminderLogoutUrl); + return Redirect(keycloakLogoutUrl); } [HttpGet("requestAccess")] diff --git a/api/helpers/extensions/ClaimExtensions.cs b/api/helpers/extensions/ClaimExtensions.cs index 9b2ed387..9b6f06f7 100644 --- a/api/helpers/extensions/ClaimExtensions.cs +++ b/api/helpers/extensions/ClaimExtensions.cs @@ -12,13 +12,13 @@ public static string GetValueByType(this IEnumerable claims, string type) claims.FirstOrDefault(c => c.Type == type)?.Value; public static string GetIdirUserName(this IEnumerable claims) => - claims.GetValueByType(CustomClaimTypes.IdirUserName).Replace("@idir", ""); + claims.GetValueByType(CustomClaimTypes.IdirUserName).Replace("@idir", "").ToLower(); public static Guid GetIdirId(this IEnumerable claims) => Guid.Parse(claims.GetValueByType(CustomClaimTypes.IdirId)); public static Guid GetKeyCloakId(this IEnumerable claims) => - Guid.Parse(claims.GetValueByType(ClaimTypes.NameIdentifier)); + Guid.Parse(claims.GetValueByType(ClaimTypes.NameIdentifier).Replace("@idir", "")); public static bool HasPermissions(this ClaimsPrincipal user, params string[] permissions) => user.HasClaim(c => c.Type == CustomClaimTypes.Permission) && permissions.All(perm => user.HasClaim(CustomClaimTypes.Permission, perm)); diff --git a/api/infrastructure/authorization/ClaimsTransformer.cs b/api/infrastructure/authorization/ClaimsTransformer.cs index 83dd0d69..d1e7054a 100644 --- a/api/infrastructure/authorization/ClaimsTransformer.cs +++ b/api/infrastructure/authorization/ClaimsTransformer.cs @@ -18,7 +18,7 @@ public class ClaimsTransformer : IClaimsTransformation private TimeSpan ClaimCachePeriod { get; } private bool _isTransformed; - public ClaimsTransformer(IMemoryCache cache, ClaimsService claimsService, IConfiguration configuration) + public ClaimsTransformer(IMemoryCache cache, ClaimsService claimsService, IConfiguration configuration) { Cache = cache; ClaimsService = claimsService; @@ -26,15 +26,15 @@ public ClaimsTransformer(IMemoryCache cache, ClaimsService claimsService, IConf } /// - /// Note these claims don't get saved in the cookie. + /// Note these claims don't get saved in the cookie. /// public async Task TransformAsync(ClaimsPrincipal principal) { if (!principal.Identity.IsAuthenticated || _isTransformed) return await Task.FromResult(principal); var currentPrincipal = (ClaimsIdentity)principal.Identity; var currentClaims = currentPrincipal.Claims.ToList(); - - var nameIdentifier = Guid.Parse(principal.FindFirstValue(ClaimTypes.NameIdentifier)); + + var nameIdentifier = Guid.Parse(principal.FindFirstValue(ClaimTypes.NameIdentifier).Replace("@idir", "")); if (!Cache.TryGetValue(nameIdentifier, out List claims)) { claims = await ClaimsService.GenerateClaims(currentClaims); @@ -46,9 +46,9 @@ public async Task TransformAsync(ClaimsPrincipal principal) } /// - /// This is so we can filter out the keycloak claims, as they're saved in the cookies and can be quite long. + /// This is so we can filter out the keycloak claims, as they're saved in the cookies and can be quite long. /// - public static List UsedProviderClaimTypes => + public static List UsedProviderClaimTypes => new List { ClaimTypes.NameIdentifier, CustomClaimTypes.IdirUserName, CustomClaimTypes.FullName, CustomClaimTypes.IdirId }; } -} +} \ No newline at end of file diff --git a/common/authorization/CustomClaimTypes.cs b/common/authorization/CustomClaimTypes.cs index 27e00035..e0afcdd3 100644 --- a/common/authorization/CustomClaimTypes.cs +++ b/common/authorization/CustomClaimTypes.cs @@ -3,12 +3,12 @@ public static class CustomClaimTypes { public const string FullName = "name"; - public const string IdirId = "idir_userid"; - public const string IdirUserName = "preferred_username"; + public const string IdirId = "idir_user_guid"; + public const string IdirUserName = "idir_username"; public const string FirstName = nameof(CustomClaimTypes) + nameof(FirstName); public const string LastName = nameof(CustomClaimTypes) + nameof(LastName); public const string UserId = nameof(CustomClaimTypes) + nameof(UserId); - public const string Permission = nameof(CustomClaimTypes)+ nameof(Permission); + public const string Permission = nameof(CustomClaimTypes) + nameof(Permission); public const string HomeLocationId = nameof(CustomClaimTypes) + nameof(HomeLocationId); } -} +} \ No newline at end of file From a9245f6ea4dd1530afc2f20cfcd23b1a1916e8f8 Mon Sep 17 00:00:00 2001 From: marzmehr Date: Tue, 3 Jan 2023 10:10:43 -0800 Subject: [PATCH 09/58] SS-743: Add backend functionality for new generateReports permission, Add API to provide training report information --- .../usermanagement/SheriffController.cs | 9 + api/services/usermanagement/SheriffService.cs | 16 + db/configuration/PermissionConfiguration.cs | 3 +- ...0103171941_UpdatePErmissions_7.Designer.cs | 2378 +++++++++++++++++ .../20230103171941_UpdatePErmissions_7.cs | 23 + .../SheriffDbContextModelSnapshot.cs | 8 + db/models/auth/Permission.cs | 1 + web/src/components/MyTeam/ViewReports.vue | 18 +- 8 files changed, 2446 insertions(+), 10 deletions(-) create mode 100644 db/migrations/20230103171941_UpdatePErmissions_7.Designer.cs create mode 100644 db/migrations/20230103171941_UpdatePErmissions_7.cs diff --git a/api/controllers/usermanagement/SheriffController.cs b/api/controllers/usermanagement/SheriffController.cs index cc26c792..72c8b5fe 100644 --- a/api/controllers/usermanagement/SheriffController.cs +++ b/api/controllers/usermanagement/SheriffController.cs @@ -270,6 +270,15 @@ public async Task RemoveSheriffLeave(int id, string expiryReason) #region SheriffTraining + [HttpGet] + [Route("training")] + [PermissionClaimAuthorize(perm: Permission.GenerateReports)] + public async Task> GetSheriffsTraining() + { + var sheriffs = await SheriffService.GetSheriffsTraining(); + return Ok(sheriffs.Adapt>()); + } + [HttpPost] [Route("training")] [PermissionClaimAuthorize(perm: Permission.EditUsers)] diff --git a/api/services/usermanagement/SheriffService.cs b/api/services/usermanagement/SheriffService.cs index 3c0e2a08..77fef0ff 100644 --- a/api/services/usermanagement/SheriffService.cs +++ b/api/services/usermanagement/SheriffService.cs @@ -330,6 +330,22 @@ public async Task RemoveSheriffLeave(int id, string expiryReason) #region Sheriff Training + public async Task> GetSheriffsTraining() + { + var daysPrevious = int.Parse(Configuration.GetNonEmptyValue("DaysInPastToIncludeAwayLocationAndTraining")); + var minDateForAwayAndTraining = DateTimeOffset.UtcNow.AddDays(-daysPrevious); + var sevenDaysFromNow = DateTimeOffset.UtcNow.AddDays(7); + + var sheriffQuery = Db.Sheriff.AsNoTracking() + .AsSplitQuery() + .ApplyPermissionFilters(User, minDateForAwayAndTraining, sevenDaysFromNow, Db) + .Include(s => s.Training.Where(t => t.ExpiryDate == null)) + .ThenInclude(t => t.TrainingType) + .Where(t => t.Training.Count > 0); + + return await sheriffQuery.ToListAsync(); + } + public async Task AddSheriffTraining(DutyRosterService dutyRosterService, ShiftService shiftService, SheriffTraining sheriffTraining, bool overrideConflicts) { ValidateStartAndEndDates(sheriffTraining.StartDate, sheriffTraining.EndDate); diff --git a/db/configuration/PermissionConfiguration.cs b/db/configuration/PermissionConfiguration.cs index c13bf113..4c5a35f0 100644 --- a/db/configuration/PermissionConfiguration.cs +++ b/db/configuration/PermissionConfiguration.cs @@ -45,7 +45,8 @@ public override void Configure(EntityTypeBuilder builder) new Permission { Id = 39, Name = Permission.RemovePastTraining, Description = "Remove Past Training" }, new Permission { Id = 40, Name = Permission.ViewDutyRosterInFuture, Description = "View DutyRoster in the future" }, new Permission { Id = 41, Name = Permission.ViewAllFutureShifts, Description = "View Shifts in the future (not time constrained)" }, - new Permission { Id = 42, Name = Permission.ViewOtherProfiles, Description = "View other profiles (beside their own)" } + new Permission { Id = 42, Name = Permission.ViewOtherProfiles, Description = "View other profiles (beside their own)" }, + new Permission { Id = 43, Name = Permission.GenerateReports, Description = "Generate Reports based on Sheriff's activity" } ); base.Configure(builder); } diff --git a/db/migrations/20230103171941_UpdatePErmissions_7.Designer.cs b/db/migrations/20230103171941_UpdatePErmissions_7.Designer.cs new file mode 100644 index 00000000..a74afd7d --- /dev/null +++ b/db/migrations/20230103171941_UpdatePErmissions_7.Designer.cs @@ -0,0 +1,2378 @@ +// +using System; +using System.Text.Json; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; +using SS.Db.models; + +namespace SS.Db.Migrations +{ + [DbContext(typeof(SheriffDbContext))] + [Migration("20230103171941_UpdatePErmissions_7")] + partial class UpdatePErmissions_7 + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .UseIdentityByDefaultColumns() + .HasAnnotation("Relational:MaxIdentifierLength", 63) + .HasAnnotation("ProductVersion", "5.0.1"); + + modelBuilder.Entity("Microsoft.AspNetCore.DataProtection.EntityFrameworkCore.DataProtectionKey", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .UseIdentityByDefaultColumn(); + + b.Property("FriendlyName") + .HasColumnType("text"); + + b.Property("Xml") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("DataProtectionKeys"); + }); + + modelBuilder.Entity("SS.Api.Models.DB.Location", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .UseIdentityByDefaultColumn() + .HasIdentityOptions(200L, null, null, null, null, null); + + b.Property("AgencyId") + .IsRequired() + .HasColumnType("text"); + + b.Property("ConcurrencyToken") + .IsConcurrencyToken() + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("xid") + .HasColumnName("xmin"); + + b.Property("CreatedById") + .HasColumnType("uuid"); + + b.Property("CreatedOn") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("now()"); + + b.Property("ExpiryDate") + .HasColumnType("timestamp with time zone"); + + b.Property("JustinCode") + .HasColumnType("text"); + + b.Property("Name") + .HasColumnType("text"); + + b.Property("ParentLocationId") + .HasColumnType("integer"); + + b.Property("RegionId") + .HasColumnType("integer"); + + b.Property("Timezone") + .HasColumnType("text"); + + b.Property("UpdatedById") + .HasColumnType("uuid"); + + b.Property("UpdatedOn") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.HasIndex("AgencyId") + .IsUnique(); + + b.HasIndex("CreatedById"); + + b.HasIndex("RegionId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("Location"); + + b.HasData( + new + { + Id = 1, + AgencyId = "SS1", + ConcurrencyToken = 0u, + CreatedById = new Guid("00000000-0000-0000-0000-000000000001"), + CreatedOn = new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + Name = "Office of Professional Standards", + Timezone = "America/Vancouver" + }, + new + { + Id = 2, + AgencyId = "SS2", + ConcurrencyToken = 0u, + CreatedById = new Guid("00000000-0000-0000-0000-000000000001"), + CreatedOn = new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + Name = "Sheriff Provincial Operation Centre", + Timezone = "America/Vancouver" + }, + new + { + Id = 3, + AgencyId = "SS3", + ConcurrencyToken = 0u, + CreatedById = new Guid("00000000-0000-0000-0000-000000000001"), + CreatedOn = new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + Name = "Central Float Pool", + Timezone = "America/Vancouver" + }, + new + { + Id = 4, + AgencyId = "SS4", + ConcurrencyToken = 0u, + CreatedById = new Guid("00000000-0000-0000-0000-000000000001"), + CreatedOn = new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + Name = "ITAU", + Timezone = "America/Vancouver" + }, + new + { + Id = 5, + AgencyId = "SS5", + ConcurrencyToken = 0u, + CreatedById = new Guid("00000000-0000-0000-0000-000000000001"), + CreatedOn = new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + Name = "Office of the Chief Sheriff", + Timezone = "America/Vancouver" + }, + new + { + Id = 6, + AgencyId = "SS6", + ConcurrencyToken = 0u, + CreatedById = new Guid("00000000-0000-0000-0000-000000000001"), + CreatedOn = new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + JustinCode = "4882", + Name = "South Okanagan Escort Centre", + Timezone = "America/Vancouver" + }); + }); + + modelBuilder.Entity("SS.Db.models.audit.Audit", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .UseIdentityByDefaultColumn(); + + b.Property("CreatedById") + .HasColumnType("uuid"); + + b.Property("CreatedOn") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("now()"); + + b.Property("KeyValues") + .HasColumnType("jsonb"); + + b.Property("NewValues") + .HasColumnType("jsonb"); + + b.Property("OldValues") + .HasColumnType("jsonb"); + + b.Property("TableName") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("KeyValues"); + + b.ToTable("Audit"); + }); + + modelBuilder.Entity("SS.Db.models.auth.Permission", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .UseIdentityByDefaultColumn() + .HasIdentityOptions(200L, null, null, null, null, null); + + b.Property("ConcurrencyToken") + .IsConcurrencyToken() + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("xid") + .HasColumnName("xmin"); + + b.Property("CreatedById") + .HasColumnType("uuid"); + + b.Property("CreatedOn") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("now()"); + + b.Property("Description") + .HasColumnType("text"); + + b.Property("Name") + .HasColumnType("text"); + + b.Property("UpdatedById") + .HasColumnType("uuid"); + + b.Property("UpdatedOn") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("UpdatedById"); + + b.ToTable("Permission"); + + b.HasData( + new + { + Id = 1, + ConcurrencyToken = 0u, + CreatedOn = new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + Description = "Allows the user to login.", + Name = "Login" + }, + new + { + Id = 5, + ConcurrencyToken = 0u, + CreatedOn = new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + Description = "Create Profile (User)", + Name = "CreateUsers" + }, + new + { + Id = 6, + ConcurrencyToken = 0u, + CreatedOn = new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + Description = "Expire Profile (User)", + Name = "ExpireUsers" + }, + new + { + Id = 7, + ConcurrencyToken = 0u, + CreatedOn = new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + Description = "Edit Profile (User)", + Name = "EditUsers" + }, + new + { + Id = 8, + ConcurrencyToken = 0u, + CreatedOn = new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + Description = "View all Roles", + Name = "ViewRoles" + }, + new + { + Id = 9, + ConcurrencyToken = 0u, + CreatedOn = new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + Description = "Create and Assign Roles", + Name = "CreateAndAssignRoles" + }, + new + { + Id = 10, + ConcurrencyToken = 0u, + CreatedOn = new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + Description = "Expire Roles", + Name = "ExpireRoles" + }, + new + { + Id = 11, + ConcurrencyToken = 0u, + CreatedOn = new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + Description = "Edit Roles", + Name = "EditRoles" + }, + new + { + Id = 13, + ConcurrencyToken = 0u, + CreatedOn = new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + Description = "Create Types", + Name = "CreateTypes" + }, + new + { + Id = 14, + ConcurrencyToken = 0u, + CreatedOn = new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + Description = "Edit Types", + Name = "EditTypes" + }, + new + { + Id = 15, + ConcurrencyToken = 0u, + CreatedOn = new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + Description = "Expire Types", + Name = "ExpireTypes" + }, + new + { + Id = 16, + ConcurrencyToken = 0u, + CreatedOn = new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + Description = "View shifts", + Name = "ViewShifts" + }, + new + { + Id = 19, + ConcurrencyToken = 0u, + CreatedOn = new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + Description = "Create and Assign Shifts", + Name = "CreateAndAssignShifts" + }, + new + { + Id = 20, + ConcurrencyToken = 0u, + CreatedOn = new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + Description = "Expire Shifts", + Name = "ExpireShifts" + }, + new + { + Id = 21, + ConcurrencyToken = 0u, + CreatedOn = new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + Description = "Edit Shifts", + Name = "EditShifts" + }, + new + { + Id = 22, + ConcurrencyToken = 0u, + CreatedOn = new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + Description = "View Distribute Schedule", + Name = "ViewDistributeSchedule" + }, + new + { + Id = 23, + ConcurrencyToken = 0u, + CreatedOn = new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + Description = "View Assigned Location", + Name = "ViewAssignedLocation" + }, + new + { + Id = 24, + ConcurrencyToken = 0u, + CreatedOn = new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + Description = "View Region (all locations within region)", + Name = "ViewRegion" + }, + new + { + Id = 25, + ConcurrencyToken = 0u, + CreatedOn = new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + Description = "View Province (all regions, all locations)", + Name = "ViewProvince" + }, + new + { + Id = 27, + ConcurrencyToken = 0u, + CreatedOn = new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + Description = "View Home Location", + Name = "ViewHomeLocation" + }, + new + { + Id = 28, + ConcurrencyToken = 0u, + CreatedOn = new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + Description = "Import Shifts", + Name = "ImportShifts" + }, + new + { + Id = 30, + ConcurrencyToken = 0u, + CreatedOn = new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + Description = "Create Assignments", + Name = "CreateAssignments" + }, + new + { + Id = 31, + ConcurrencyToken = 0u, + CreatedOn = new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + Description = "Edit Assignments", + Name = "EditAssignments" + }, + new + { + Id = 32, + ConcurrencyToken = 0u, + CreatedOn = new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + Description = "Expire Assignments", + Name = "ExpireAssignments" + }, + new + { + Id = 33, + ConcurrencyToken = 0u, + CreatedOn = new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + Description = "View Duties", + Name = "ViewDutyRoster" + }, + new + { + Id = 34, + ConcurrencyToken = 0u, + CreatedOn = new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + Description = "Create Duties", + Name = "CreateAndAssignDuties" + }, + new + { + Id = 35, + ConcurrencyToken = 0u, + CreatedOn = new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + Description = "Edit Duties", + Name = "EditDuties" + }, + new + { + Id = 36, + ConcurrencyToken = 0u, + CreatedOn = new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + Description = "Expire Duties", + Name = "ExpireDuties" + }, + new + { + Id = 37, + ConcurrencyToken = 0u, + CreatedOn = new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + Description = "Edit Idir", + Name = "EditIdir" + }, + new + { + Id = 38, + ConcurrencyToken = 0u, + CreatedOn = new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + Description = "Edit Past Training", + Name = "EditPastTraining" + }, + new + { + Id = 39, + ConcurrencyToken = 0u, + CreatedOn = new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + Description = "Remove Past Training", + Name = "RemovePastTraining" + }, + new + { + Id = 40, + ConcurrencyToken = 0u, + CreatedOn = new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + Description = "View DutyRoster in the future", + Name = "ViewDutyRosterInFuture" + }, + new + { + Id = 41, + ConcurrencyToken = 0u, + CreatedOn = new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + Description = "View Shifts in the future (not time constrained)", + Name = "ViewAllFutureShifts" + }, + new + { + Id = 42, + ConcurrencyToken = 0u, + CreatedOn = new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + Description = "View other profiles (beside their own)", + Name = "ViewOtherProfiles" + }, + new + { + Id = 43, + ConcurrencyToken = 0u, + CreatedOn = new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + Description = "Generate Reports based on Sheriff's activity", + Name = "GenerateReports" + }); + }); + + modelBuilder.Entity("SS.Db.models.auth.Role", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .UseIdentityByDefaultColumn() + .HasIdentityOptions(50L, null, null, null, null, null); + + b.Property("ConcurrencyToken") + .IsConcurrencyToken() + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("xid") + .HasColumnName("xmin"); + + b.Property("CreatedById") + .HasColumnType("uuid"); + + b.Property("CreatedOn") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("now()"); + + b.Property("Description") + .HasColumnType("text"); + + b.Property("Name") + .HasColumnType("text"); + + b.Property("UpdatedById") + .HasColumnType("uuid"); + + b.Property("UpdatedOn") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("UpdatedById"); + + b.ToTable("Role"); + + b.HasData( + new + { + Id = 1, + ConcurrencyToken = 0u, + CreatedById = new Guid("00000000-0000-0000-0000-000000000001"), + CreatedOn = new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + Description = "Administrator", + Name = "Administrator" + }, + new + { + Id = 2, + ConcurrencyToken = 0u, + CreatedById = new Guid("00000000-0000-0000-0000-000000000001"), + CreatedOn = new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + Description = "Manager", + Name = "Manager" + }, + new + { + Id = 3, + ConcurrencyToken = 0u, + CreatedById = new Guid("00000000-0000-0000-0000-000000000001"), + CreatedOn = new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + Description = "Sheriff", + Name = "Sheriff" + }); + }); + + modelBuilder.Entity("SS.Db.models.auth.RolePermission", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .UseIdentityByDefaultColumn() + .HasIdentityOptions(100L, null, null, null, null, null); + + b.Property("ConcurrencyToken") + .IsConcurrencyToken() + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("xid") + .HasColumnName("xmin"); + + b.Property("CreatedById") + .HasColumnType("uuid"); + + b.Property("CreatedOn") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("now()"); + + b.Property("PermissionId") + .HasColumnType("integer"); + + b.Property("RoleId") + .HasColumnType("integer"); + + b.Property("UpdatedById") + .HasColumnType("uuid"); + + b.Property("UpdatedOn") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("PermissionId"); + + b.HasIndex("RoleId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("RolePermission"); + }); + + modelBuilder.Entity("SS.Db.models.auth.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasIdentityOptions(200L, null, null, null, null, null); + + b.Property("ConcurrencyToken") + .IsConcurrencyToken() + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("xid") + .HasColumnName("xmin"); + + b.Property("CreatedById") + .HasColumnType("uuid"); + + b.Property("CreatedOn") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("now()"); + + b.Property("Discriminator") + .IsRequired() + .HasColumnType("text"); + + b.Property("Email") + .HasColumnType("text"); + + b.Property("FirstName") + .HasColumnType("text"); + + b.Property("HomeLocationId") + .HasColumnType("integer"); + + b.Property("IdirId") + .HasColumnType("uuid"); + + b.Property("IdirName") + .HasColumnType("text"); + + b.Property("IsEnabled") + .HasColumnType("boolean"); + + b.Property("KeyCloakId") + .HasColumnType("uuid"); + + b.Property("LastLogin") + .HasColumnType("timestamp with time zone"); + + b.Property("LastName") + .HasColumnType("text"); + + b.Property("UpdatedById") + .HasColumnType("uuid"); + + b.Property("UpdatedOn") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("HomeLocationId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("User"); + + b.HasDiscriminator("Discriminator").HasValue("User"); + + b.HasData( + new + { + Id = new Guid("00000000-0000-0000-0000-000000000001"), + ConcurrencyToken = 0u, + CreatedOn = new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + FirstName = "SYSTEM", + IsEnabled = false, + LastName = "SYSTEM" + }); + }); + + modelBuilder.Entity("SS.Db.models.auth.UserRole", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .UseIdentityByDefaultColumn() + .HasIdentityOptions(5000L, null, null, null, null, null); + + b.Property("ConcurrencyToken") + .IsConcurrencyToken() + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("xid") + .HasColumnName("xmin"); + + b.Property("CreatedById") + .HasColumnType("uuid"); + + b.Property("CreatedOn") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("now()"); + + b.Property("EffectiveDate") + .HasColumnType("timestamp with time zone"); + + b.Property("ExpiryDate") + .HasColumnType("timestamp with time zone"); + + b.Property("ExpiryReason") + .HasColumnType("text"); + + b.Property("RoleId") + .HasColumnType("integer"); + + b.Property("UpdatedById") + .HasColumnType("uuid"); + + b.Property("UpdatedOn") + .HasColumnType("timestamp with time zone"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("UpdatedById"); + + b.HasIndex("UserId"); + + b.HasIndex("RoleId", "UserId") + .IsUnique(); + + b.ToTable("UserRole"); + }); + + modelBuilder.Entity("SS.Db.models.jc.JcSynchronization", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .UseIdentityByDefaultColumn(); + + b.Property("LastSynchronization") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.ToTable("JcSynchronization"); + }); + + modelBuilder.Entity("SS.Db.models.lookupcodes.LookupSortOrder", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .UseIdentityByDefaultColumn() + .HasIdentityOptions(1000L, null, null, null, null, null); + + b.Property("ConcurrencyToken") + .IsConcurrencyToken() + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("xid") + .HasColumnName("xmin"); + + b.Property("CreatedById") + .HasColumnType("uuid"); + + b.Property("CreatedOn") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("now()"); + + b.Property("LocationId") + .HasColumnType("integer"); + + b.Property("LookupCodeId") + .HasColumnType("integer"); + + b.Property("SortOrder") + .HasColumnType("integer"); + + b.Property("UpdatedById") + .HasColumnType("uuid"); + + b.Property("UpdatedOn") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("LocationId"); + + b.HasIndex("LookupCodeId"); + + b.HasIndex("UpdatedById"); + + b.HasIndex("LookupCodeId", "LocationId") + .IsUnique(); + + b.ToTable("LookupSortOrder"); + + b.HasData( + new + { + Id = 1, + ConcurrencyToken = 0u, + CreatedById = new Guid("00000000-0000-0000-0000-000000000001"), + CreatedOn = new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + LookupCodeId = 1, + SortOrder = 1 + }, + new + { + Id = 2, + ConcurrencyToken = 0u, + CreatedById = new Guid("00000000-0000-0000-0000-000000000001"), + CreatedOn = new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + LookupCodeId = 2, + SortOrder = 2 + }, + new + { + Id = 3, + ConcurrencyToken = 0u, + CreatedById = new Guid("00000000-0000-0000-0000-000000000001"), + CreatedOn = new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + LookupCodeId = 3, + SortOrder = 3 + }, + new + { + Id = 4, + ConcurrencyToken = 0u, + CreatedById = new Guid("00000000-0000-0000-0000-000000000001"), + CreatedOn = new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + LookupCodeId = 4, + SortOrder = 4 + }, + new + { + Id = 5, + ConcurrencyToken = 0u, + CreatedById = new Guid("00000000-0000-0000-0000-000000000001"), + CreatedOn = new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + LookupCodeId = 5, + SortOrder = 5 + }, + new + { + Id = 6, + ConcurrencyToken = 0u, + CreatedById = new Guid("00000000-0000-0000-0000-000000000001"), + CreatedOn = new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + LookupCodeId = 6, + SortOrder = 6 + }, + new + { + Id = 7, + ConcurrencyToken = 0u, + CreatedById = new Guid("00000000-0000-0000-0000-000000000001"), + CreatedOn = new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + LookupCodeId = 7, + SortOrder = 7 + }); + }); + + modelBuilder.Entity("SS.Db.models.scheduling.Assignment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .UseIdentityByDefaultColumn() + .HasIdentityOptions(200L, null, null, null, null, null); + + b.Property("AdhocEndDate") + .HasColumnType("timestamp with time zone"); + + b.Property("AdhocStartDate") + .HasColumnType("timestamp with time zone"); + + b.Property("Comment") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ConcurrencyToken") + .IsConcurrencyToken() + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("xid") + .HasColumnName("xmin"); + + b.Property("CreatedById") + .HasColumnType("uuid"); + + b.Property("CreatedOn") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("now()"); + + b.Property("End") + .HasColumnType("interval"); + + b.Property("ExpiryDate") + .HasColumnType("timestamp with time zone"); + + b.Property("ExpiryReason") + .HasColumnType("text"); + + b.Property("Friday") + .HasColumnType("boolean"); + + b.Property("LocationId") + .HasColumnType("integer"); + + b.Property("LookupCodeId") + .HasColumnType("integer"); + + b.Property("Monday") + .HasColumnType("boolean"); + + b.Property("Name") + .HasColumnType("text"); + + b.Property("Saturday") + .HasColumnType("boolean"); + + b.Property("Start") + .HasColumnType("interval"); + + b.Property("Sunday") + .HasColumnType("boolean"); + + b.Property("Thursday") + .HasColumnType("boolean"); + + b.Property("Timezone") + .HasColumnType("text"); + + b.Property("Tuesday") + .HasColumnType("boolean"); + + b.Property("UpdatedById") + .HasColumnType("uuid"); + + b.Property("UpdatedOn") + .HasColumnType("timestamp with time zone"); + + b.Property("Wednesday") + .HasColumnType("boolean"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("LocationId"); + + b.HasIndex("LookupCodeId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("Assignment"); + }); + + modelBuilder.Entity("SS.Db.models.scheduling.Duty", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .UseIdentityByDefaultColumn() + .HasIdentityOptions(200L, null, null, null, null, null); + + b.Property("AssignmentId") + .HasColumnType("integer"); + + b.Property("Comment") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ConcurrencyToken") + .IsConcurrencyToken() + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("xid") + .HasColumnName("xmin"); + + b.Property("CreatedById") + .HasColumnType("uuid"); + + b.Property("CreatedOn") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("now()"); + + b.Property("EndDate") + .HasColumnType("timestamp with time zone"); + + b.Property("ExpiryDate") + .HasColumnType("timestamp with time zone"); + + b.Property("LocationId") + .HasColumnType("integer"); + + b.Property("StartDate") + .HasColumnType("timestamp with time zone"); + + b.Property("Timezone") + .HasColumnType("text"); + + b.Property("UpdatedById") + .HasColumnType("uuid"); + + b.Property("UpdatedOn") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.HasIndex("AssignmentId"); + + b.HasIndex("CreatedById"); + + b.HasIndex("LocationId"); + + b.HasIndex("UpdatedById"); + + b.HasIndex("StartDate", "EndDate"); + + b.ToTable("Duty"); + }); + + modelBuilder.Entity("SS.Db.models.scheduling.DutySlot", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .UseIdentityByDefaultColumn() + .HasIdentityOptions(200L, null, null, null, null, null); + + b.Property("ConcurrencyToken") + .IsConcurrencyToken() + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("xid") + .HasColumnName("xmin"); + + b.Property("CreatedById") + .HasColumnType("uuid"); + + b.Property("CreatedOn") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("now()"); + + b.Property("DutyId") + .HasColumnType("integer"); + + b.Property("EndDate") + .HasColumnType("timestamp with time zone"); + + b.Property("ExpiryDate") + .HasColumnType("timestamp with time zone"); + + b.Property("IsClosed") + .HasColumnType("boolean"); + + b.Property("IsNotAvailable") + .HasColumnType("boolean"); + + b.Property("IsNotRequired") + .HasColumnType("boolean"); + + b.Property("IsOvertime") + .HasColumnType("boolean"); + + b.Property("LocationId") + .HasColumnType("integer"); + + b.Property("SheriffId") + .HasColumnType("uuid"); + + b.Property("StartDate") + .HasColumnType("timestamp with time zone"); + + b.Property("Timezone") + .HasColumnType("text"); + + b.Property("UpdatedById") + .HasColumnType("uuid"); + + b.Property("UpdatedOn") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("DutyId"); + + b.HasIndex("LocationId"); + + b.HasIndex("SheriffId"); + + b.HasIndex("UpdatedById"); + + b.HasIndex("StartDate", "EndDate"); + + b.ToTable("DutySlot"); + }); + + modelBuilder.Entity("SS.Db.models.scheduling.Shift", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .UseIdentityByDefaultColumn() + .HasIdentityOptions(200L, null, null, null, null, null); + + b.Property("AnticipatedAssignmentId") + .HasColumnType("integer"); + + b.Property("Comment") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ConcurrencyToken") + .IsConcurrencyToken() + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("xid") + .HasColumnName("xmin"); + + b.Property("CreatedById") + .HasColumnType("uuid"); + + b.Property("CreatedOn") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("now()"); + + b.Property("EndDate") + .HasColumnType("timestamp with time zone"); + + b.Property("ExpiryDate") + .HasColumnType("timestamp with time zone"); + + b.Property("LocationId") + .HasColumnType("integer"); + + b.Property("OvertimeHours") + .HasColumnType("double precision"); + + b.Property("SheriffId") + .HasColumnType("uuid"); + + b.Property("StartDate") + .HasColumnType("timestamp with time zone"); + + b.Property("Timezone") + .HasColumnType("text"); + + b.Property("UpdatedById") + .HasColumnType("uuid"); + + b.Property("UpdatedOn") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.HasIndex("AnticipatedAssignmentId"); + + b.HasIndex("CreatedById"); + + b.HasIndex("LocationId"); + + b.HasIndex("SheriffId"); + + b.HasIndex("UpdatedById"); + + b.HasIndex("StartDate", "EndDate"); + + b.ToTable("Shift"); + }); + + modelBuilder.Entity("SS.Db.models.sheriff.SheriffActingRank", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .UseIdentityByDefaultColumn(); + + b.Property("Comment") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ConcurrencyToken") + .IsConcurrencyToken() + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("xid") + .HasColumnName("xmin"); + + b.Property("CreatedById") + .HasColumnType("uuid"); + + b.Property("CreatedOn") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("now()"); + + b.Property("EndDate") + .HasColumnType("timestamp with time zone"); + + b.Property("ExpiryDate") + .HasColumnType("timestamp with time zone"); + + b.Property("ExpiryReason") + .HasColumnType("text"); + + b.Property("Rank") + .HasColumnType("text"); + + b.Property("SheriffId") + .HasColumnType("uuid"); + + b.Property("StartDate") + .HasColumnType("timestamp with time zone"); + + b.Property("Timezone") + .HasColumnType("text"); + + b.Property("UpdatedById") + .HasColumnType("uuid"); + + b.Property("UpdatedOn") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("SheriffId"); + + b.HasIndex("UpdatedById"); + + b.HasIndex("StartDate", "EndDate"); + + b.ToTable("SheriffActingRank"); + }); + + modelBuilder.Entity("SS.Db.models.sheriff.SheriffAwayLocation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .UseIdentityByDefaultColumn(); + + b.Property("Comment") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ConcurrencyToken") + .IsConcurrencyToken() + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("xid") + .HasColumnName("xmin"); + + b.Property("CreatedById") + .HasColumnType("uuid"); + + b.Property("CreatedOn") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("now()"); + + b.Property("EndDate") + .HasColumnType("timestamp with time zone"); + + b.Property("ExpiryDate") + .HasColumnType("timestamp with time zone"); + + b.Property("ExpiryReason") + .HasColumnType("text"); + + b.Property("LocationId") + .HasColumnType("integer"); + + b.Property("SheriffId") + .HasColumnType("uuid"); + + b.Property("StartDate") + .HasColumnType("timestamp with time zone"); + + b.Property("Timezone") + .HasColumnType("text"); + + b.Property("UpdatedById") + .HasColumnType("uuid"); + + b.Property("UpdatedOn") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("LocationId"); + + b.HasIndex("SheriffId"); + + b.HasIndex("UpdatedById"); + + b.HasIndex("StartDate", "EndDate"); + + b.ToTable("SheriffAwayLocation"); + }); + + modelBuilder.Entity("SS.Db.models.sheriff.SheriffLeave", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .UseIdentityByDefaultColumn(); + + b.Property("Comment") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ConcurrencyToken") + .IsConcurrencyToken() + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("xid") + .HasColumnName("xmin"); + + b.Property("CreatedById") + .HasColumnType("uuid"); + + b.Property("CreatedOn") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("now()"); + + b.Property("EndDate") + .HasColumnType("timestamp with time zone"); + + b.Property("ExpiryDate") + .HasColumnType("timestamp with time zone"); + + b.Property("ExpiryReason") + .HasColumnType("text"); + + b.Property("LeaveTypeId") + .HasColumnType("integer"); + + b.Property("SheriffId") + .HasColumnType("uuid"); + + b.Property("StartDate") + .HasColumnType("timestamp with time zone"); + + b.Property("Timezone") + .HasColumnType("text"); + + b.Property("UpdatedById") + .HasColumnType("uuid"); + + b.Property("UpdatedOn") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("LeaveTypeId"); + + b.HasIndex("SheriffId"); + + b.HasIndex("UpdatedById"); + + b.HasIndex("StartDate", "EndDate"); + + b.ToTable("SheriffLeave"); + }); + + modelBuilder.Entity("SS.Db.models.sheriff.SheriffTraining", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .UseIdentityByDefaultColumn(); + + b.Property("Comment") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ConcurrencyToken") + .IsConcurrencyToken() + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("xid") + .HasColumnName("xmin"); + + b.Property("CreatedById") + .HasColumnType("uuid"); + + b.Property("CreatedOn") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("now()"); + + b.Property("EndDate") + .HasColumnType("timestamp with time zone"); + + b.Property("ExpiryDate") + .HasColumnType("timestamp with time zone"); + + b.Property("ExpiryReason") + .HasColumnType("text"); + + b.Property("Note") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("SheriffId") + .HasColumnType("uuid"); + + b.Property("StartDate") + .HasColumnType("timestamp with time zone"); + + b.Property("Timezone") + .HasColumnType("text"); + + b.Property("TrainingCertificationExpiry") + .HasColumnType("timestamp with time zone"); + + b.Property("TrainingTypeId") + .HasColumnType("integer"); + + b.Property("UpdatedById") + .HasColumnType("uuid"); + + b.Property("UpdatedOn") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("SheriffId"); + + b.HasIndex("TrainingTypeId"); + + b.HasIndex("UpdatedById"); + + b.HasIndex("StartDate", "EndDate"); + + b.ToTable("SheriffTraining"); + }); + + modelBuilder.Entity("db.models.Region", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .UseIdentityByDefaultColumn(); + + b.Property("Code") + .HasColumnType("text"); + + b.Property("ConcurrencyToken") + .IsConcurrencyToken() + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("xid") + .HasColumnName("xmin"); + + b.Property("CreatedById") + .HasColumnType("uuid"); + + b.Property("CreatedOn") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("now()"); + + b.Property("ExpiryDate") + .HasColumnType("timestamp with time zone"); + + b.Property("JustinId") + .HasColumnType("integer"); + + b.Property("Name") + .HasColumnType("text"); + + b.Property("UpdatedById") + .HasColumnType("uuid"); + + b.Property("UpdatedOn") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("JustinId") + .IsUnique(); + + b.HasIndex("UpdatedById"); + + b.ToTable("Region"); + }); + + modelBuilder.Entity("ss.db.models.LookupCode", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .UseIdentityByDefaultColumn() + .HasIdentityOptions(1000L, null, null, null, null, null); + + b.Property("Code") + .HasColumnType("text"); + + b.Property("ConcurrencyToken") + .IsConcurrencyToken() + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("xid") + .HasColumnName("xmin"); + + b.Property("CreatedById") + .HasColumnType("uuid"); + + b.Property("CreatedOn") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("now()"); + + b.Property("Description") + .HasColumnType("text"); + + b.Property("EffectiveDate") + .HasColumnType("timestamp with time zone"); + + b.Property("ExpiryDate") + .HasColumnType("timestamp with time zone"); + + b.Property("LocationId") + .HasColumnType("integer"); + + b.Property("SubCode") + .HasColumnType("text"); + + b.Property("Type") + .HasColumnType("integer"); + + b.Property("UpdatedById") + .HasColumnType("uuid"); + + b.Property("UpdatedOn") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("LocationId"); + + b.HasIndex("UpdatedById"); + + b.HasIndex("Type", "Code", "LocationId") + .IsUnique(); + + b.ToTable("LookupCode"); + + b.HasData( + new + { + Id = 1, + Code = "Chief Sheriff", + ConcurrencyToken = 0u, + CreatedById = new Guid("00000000-0000-0000-0000-000000000001"), + CreatedOn = new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + Description = "Chief Sheriff", + Type = 7 + }, + new + { + Id = 2, + Code = "Superintendent", + ConcurrencyToken = 0u, + CreatedById = new Guid("00000000-0000-0000-0000-000000000001"), + CreatedOn = new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + Description = "Superintendent", + Type = 7 + }, + new + { + Id = 3, + Code = "Staff Inspector", + ConcurrencyToken = 0u, + CreatedById = new Guid("00000000-0000-0000-0000-000000000001"), + CreatedOn = new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + Description = "Staff Inspector", + Type = 7 + }, + new + { + Id = 4, + Code = "Inspector", + ConcurrencyToken = 0u, + CreatedById = new Guid("00000000-0000-0000-0000-000000000001"), + CreatedOn = new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + Description = "Inspector", + Type = 7 + }, + new + { + Id = 5, + Code = "Staff Sergeant", + ConcurrencyToken = 0u, + CreatedById = new Guid("00000000-0000-0000-0000-000000000001"), + CreatedOn = new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + Description = "Staff Sergeant", + Type = 7 + }, + new + { + Id = 6, + Code = "Sergeant", + ConcurrencyToken = 0u, + CreatedById = new Guid("00000000-0000-0000-0000-000000000001"), + CreatedOn = new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + Description = "Sergeant", + Type = 7 + }, + new + { + Id = 7, + Code = "Deputy Sheriff", + ConcurrencyToken = 0u, + CreatedById = new Guid("00000000-0000-0000-0000-000000000001"), + CreatedOn = new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + Description = "Deputy Sheriff", + Type = 7 + }, + new + { + Id = 8, + Code = "CEW (Taser)", + ConcurrencyToken = 0u, + CreatedById = new Guid("00000000-0000-0000-0000-000000000001"), + CreatedOn = new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + Description = "CEW (Taser)", + Type = 6 + }, + new + { + Id = 9, + Code = "DNA", + ConcurrencyToken = 0u, + CreatedById = new Guid("00000000-0000-0000-0000-000000000001"), + CreatedOn = new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + Description = "DNA", + Type = 6 + }, + new + { + Id = 10, + Code = "FRO", + ConcurrencyToken = 0u, + CreatedById = new Guid("00000000-0000-0000-0000-000000000001"), + CreatedOn = new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + Description = "FRO", + Type = 6 + }, + new + { + Id = 11, + Code = "Fire Arm", + ConcurrencyToken = 0u, + CreatedById = new Guid("00000000-0000-0000-0000-000000000001"), + CreatedOn = new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + Description = "Fire Arm", + Type = 6 + }, + new + { + Id = 12, + Code = "First Aid", + ConcurrencyToken = 0u, + CreatedById = new Guid("00000000-0000-0000-0000-000000000001"), + CreatedOn = new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + Description = "First Aid", + Type = 6 + }, + new + { + Id = 13, + Code = "Advanced Escort SPC (AESOC)", + ConcurrencyToken = 0u, + CreatedById = new Guid("00000000-0000-0000-0000-000000000001"), + CreatedOn = new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + Description = "Advanced Escort SPC (AESOC)", + Type = 6 + }, + new + { + Id = 14, + Code = "Extenuating Circumstances SPC (EXSPC)", + ConcurrencyToken = 0u, + CreatedById = new Guid("00000000-0000-0000-0000-000000000001"), + CreatedOn = new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + Description = "Extenuating Circumstances SPC (EXSPC)", + Type = 6 + }, + new + { + Id = 15, + Code = "Search Gate", + ConcurrencyToken = 0u, + CreatedById = new Guid("00000000-0000-0000-0000-000000000001"), + CreatedOn = new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + Description = "Search Gate", + Type = 6 + }, + new + { + Id = 16, + Code = "Other", + ConcurrencyToken = 0u, + CreatedById = new Guid("00000000-0000-0000-0000-000000000001"), + CreatedOn = new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + Description = "Other", + Type = 6 + }, + new + { + Id = 17, + Code = "STIP", + ConcurrencyToken = 0u, + CreatedById = new Guid("00000000-0000-0000-0000-000000000001"), + CreatedOn = new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + Description = "STIP", + Type = 5 + }, + new + { + Id = 18, + Code = "Annual", + ConcurrencyToken = 0u, + CreatedById = new Guid("00000000-0000-0000-0000-000000000001"), + CreatedOn = new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + Description = "Annual", + Type = 5 + }, + new + { + Id = 19, + Code = "Illness", + ConcurrencyToken = 0u, + CreatedById = new Guid("00000000-0000-0000-0000-000000000001"), + CreatedOn = new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + Description = "Illness", + Type = 5 + }, + new + { + Id = 20, + Code = "Special", + ConcurrencyToken = 0u, + CreatedById = new Guid("00000000-0000-0000-0000-000000000001"), + CreatedOn = new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + Description = "Special", + Type = 5 + }); + }); + + modelBuilder.Entity("SS.Db.models.sheriff.Sheriff", b => + { + b.HasBaseType("SS.Db.models.auth.User"); + + b.Property("BadgeNumber") + .HasColumnType("text"); + + b.Property("Gender") + .HasColumnType("integer"); + + b.Property("LastPhotoUpdate") + .HasColumnType("timestamp with time zone"); + + b.Property("Photo") + .HasColumnType("bytea"); + + b.Property("Rank") + .HasColumnType("text"); + + b.HasIndex("BadgeNumber") + .IsUnique(); + + b.HasDiscriminator().HasValue("Sheriff"); + }); + + modelBuilder.Entity("SS.Api.Models.DB.Location", b => + { + b.HasOne("SS.Db.models.auth.User", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.SetNull); + + b.HasOne("db.models.Region", "Region") + .WithMany() + .HasForeignKey("RegionId") + .OnDelete(DeleteBehavior.SetNull); + + b.HasOne("SS.Db.models.auth.User", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("CreatedBy"); + + b.Navigation("Region"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("SS.Db.models.audit.Audit", b => + { + b.HasOne("SS.Db.models.auth.User", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("CreatedBy"); + }); + + modelBuilder.Entity("SS.Db.models.auth.Permission", b => + { + b.HasOne("SS.Db.models.auth.User", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.SetNull); + + b.HasOne("SS.Db.models.auth.User", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("CreatedBy"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("SS.Db.models.auth.Role", b => + { + b.HasOne("SS.Db.models.auth.User", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.SetNull); + + b.HasOne("SS.Db.models.auth.User", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("CreatedBy"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("SS.Db.models.auth.RolePermission", b => + { + b.HasOne("SS.Db.models.auth.User", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.SetNull); + + b.HasOne("SS.Db.models.auth.Permission", "Permission") + .WithMany() + .HasForeignKey("PermissionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("SS.Db.models.auth.Role", "Role") + .WithMany("RolePermissions") + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("SS.Db.models.auth.User", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("CreatedBy"); + + b.Navigation("Permission"); + + b.Navigation("Role"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("SS.Db.models.auth.User", b => + { + b.HasOne("SS.Db.models.auth.User", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.SetNull); + + b.HasOne("SS.Api.Models.DB.Location", "HomeLocation") + .WithMany() + .HasForeignKey("HomeLocationId") + .OnDelete(DeleteBehavior.SetNull); + + b.HasOne("SS.Db.models.auth.User", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("CreatedBy"); + + b.Navigation("HomeLocation"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("SS.Db.models.auth.UserRole", b => + { + b.HasOne("SS.Db.models.auth.User", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.SetNull); + + b.HasOne("SS.Db.models.auth.Role", "Role") + .WithMany("UserRoles") + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("SS.Db.models.auth.User", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById") + .OnDelete(DeleteBehavior.SetNull); + + b.HasOne("SS.Db.models.auth.User", "User") + .WithMany("UserRoles") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("CreatedBy"); + + b.Navigation("Role"); + + b.Navigation("UpdatedBy"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("SS.Db.models.lookupcodes.LookupSortOrder", b => + { + b.HasOne("SS.Db.models.auth.User", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.SetNull); + + b.HasOne("SS.Api.Models.DB.Location", "Location") + .WithMany() + .HasForeignKey("LocationId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("ss.db.models.LookupCode", "LookupCode") + .WithMany("SortOrder") + .HasForeignKey("LookupCodeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("SS.Db.models.auth.User", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("CreatedBy"); + + b.Navigation("Location"); + + b.Navigation("LookupCode"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("SS.Db.models.scheduling.Assignment", b => + { + b.HasOne("SS.Db.models.auth.User", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.SetNull); + + b.HasOne("SS.Api.Models.DB.Location", "Location") + .WithMany() + .HasForeignKey("LocationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("ss.db.models.LookupCode", "LookupCode") + .WithMany() + .HasForeignKey("LookupCodeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("SS.Db.models.auth.User", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("CreatedBy"); + + b.Navigation("Location"); + + b.Navigation("LookupCode"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("SS.Db.models.scheduling.Duty", b => + { + b.HasOne("SS.Db.models.scheduling.Assignment", "Assignment") + .WithMany() + .HasForeignKey("AssignmentId") + .OnDelete(DeleteBehavior.SetNull); + + b.HasOne("SS.Db.models.auth.User", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.SetNull); + + b.HasOne("SS.Api.Models.DB.Location", "Location") + .WithMany() + .HasForeignKey("LocationId") + .OnDelete(DeleteBehavior.SetNull) + .IsRequired(); + + b.HasOne("SS.Db.models.auth.User", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("Assignment"); + + b.Navigation("CreatedBy"); + + b.Navigation("Location"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("SS.Db.models.scheduling.DutySlot", b => + { + b.HasOne("SS.Db.models.auth.User", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.SetNull); + + b.HasOne("SS.Db.models.scheduling.Duty", "Duty") + .WithMany("DutySlots") + .HasForeignKey("DutyId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("SS.Api.Models.DB.Location", "Location") + .WithMany() + .HasForeignKey("LocationId") + .OnDelete(DeleteBehavior.SetNull) + .IsRequired(); + + b.HasOne("SS.Db.models.sheriff.Sheriff", "Sheriff") + .WithMany() + .HasForeignKey("SheriffId") + .OnDelete(DeleteBehavior.SetNull); + + b.HasOne("SS.Db.models.auth.User", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("CreatedBy"); + + b.Navigation("Duty"); + + b.Navigation("Location"); + + b.Navigation("Sheriff"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("SS.Db.models.scheduling.Shift", b => + { + b.HasOne("SS.Db.models.scheduling.Assignment", "AnticipatedAssignment") + .WithMany() + .HasForeignKey("AnticipatedAssignmentId") + .OnDelete(DeleteBehavior.SetNull); + + b.HasOne("SS.Db.models.auth.User", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.SetNull); + + b.HasOne("SS.Api.Models.DB.Location", "Location") + .WithMany() + .HasForeignKey("LocationId") + .OnDelete(DeleteBehavior.SetNull) + .IsRequired(); + + b.HasOne("SS.Db.models.sheriff.Sheriff", "Sheriff") + .WithMany() + .HasForeignKey("SheriffId") + .OnDelete(DeleteBehavior.SetNull) + .IsRequired(); + + b.HasOne("SS.Db.models.auth.User", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("AnticipatedAssignment"); + + b.Navigation("CreatedBy"); + + b.Navigation("Location"); + + b.Navigation("Sheriff"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("SS.Db.models.sheriff.SheriffActingRank", b => + { + b.HasOne("SS.Db.models.auth.User", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.SetNull); + + b.HasOne("SS.Db.models.sheriff.Sheriff", "Sheriff") + .WithMany("ActingRank") + .HasForeignKey("SheriffId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("SS.Db.models.auth.User", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("CreatedBy"); + + b.Navigation("Sheriff"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("SS.Db.models.sheriff.SheriffAwayLocation", b => + { + b.HasOne("SS.Db.models.auth.User", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.SetNull); + + b.HasOne("SS.Api.Models.DB.Location", "Location") + .WithMany() + .HasForeignKey("LocationId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("SS.Db.models.sheriff.Sheriff", "Sheriff") + .WithMany("AwayLocation") + .HasForeignKey("SheriffId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("SS.Db.models.auth.User", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("CreatedBy"); + + b.Navigation("Location"); + + b.Navigation("Sheriff"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("SS.Db.models.sheriff.SheriffLeave", b => + { + b.HasOne("SS.Db.models.auth.User", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.SetNull); + + b.HasOne("ss.db.models.LookupCode", "LeaveType") + .WithMany() + .HasForeignKey("LeaveTypeId"); + + b.HasOne("SS.Db.models.sheriff.Sheriff", "Sheriff") + .WithMany("Leave") + .HasForeignKey("SheriffId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("SS.Db.models.auth.User", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("CreatedBy"); + + b.Navigation("LeaveType"); + + b.Navigation("Sheriff"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("SS.Db.models.sheriff.SheriffTraining", b => + { + b.HasOne("SS.Db.models.auth.User", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.SetNull); + + b.HasOne("SS.Db.models.sheriff.Sheriff", "Sheriff") + .WithMany("Training") + .HasForeignKey("SheriffId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("ss.db.models.LookupCode", "TrainingType") + .WithMany() + .HasForeignKey("TrainingTypeId"); + + b.HasOne("SS.Db.models.auth.User", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("CreatedBy"); + + b.Navigation("Sheriff"); + + b.Navigation("TrainingType"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("db.models.Region", b => + { + b.HasOne("SS.Db.models.auth.User", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.SetNull); + + b.HasOne("SS.Db.models.auth.User", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("CreatedBy"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("ss.db.models.LookupCode", b => + { + b.HasOne("SS.Db.models.auth.User", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.SetNull); + + b.HasOne("SS.Api.Models.DB.Location", "Location") + .WithMany() + .HasForeignKey("LocationId") + .OnDelete(DeleteBehavior.SetNull); + + b.HasOne("SS.Db.models.auth.User", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("CreatedBy"); + + b.Navigation("Location"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("SS.Db.models.auth.Role", b => + { + b.Navigation("RolePermissions"); + + b.Navigation("UserRoles"); + }); + + modelBuilder.Entity("SS.Db.models.auth.User", b => + { + b.Navigation("UserRoles"); + }); + + modelBuilder.Entity("SS.Db.models.scheduling.Duty", b => + { + b.Navigation("DutySlots"); + }); + + modelBuilder.Entity("ss.db.models.LookupCode", b => + { + b.Navigation("SortOrder"); + }); + + modelBuilder.Entity("SS.Db.models.sheriff.Sheriff", b => + { + b.Navigation("ActingRank"); + + b.Navigation("AwayLocation"); + + b.Navigation("Leave"); + + b.Navigation("Training"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/db/migrations/20230103171941_UpdatePErmissions_7.cs b/db/migrations/20230103171941_UpdatePErmissions_7.cs new file mode 100644 index 00000000..23c7d1c6 --- /dev/null +++ b/db/migrations/20230103171941_UpdatePErmissions_7.cs @@ -0,0 +1,23 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +namespace SS.Db.Migrations +{ + public partial class UpdatePErmissions_7 : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.InsertData( + table: "Permission", + columns: new[] { "Id", "CreatedById", "Description", "Name", "UpdatedById", "UpdatedOn" }, + values: new object[] { 43, null, "Generate Reports based on Sheriff's activity", "GenerateReports", null, null }); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DeleteData( + table: "Permission", + keyColumn: "Id", + keyValue: 43); + } + } +} diff --git a/db/migrations/SheriffDbContextModelSnapshot.cs b/db/migrations/SheriffDbContextModelSnapshot.cs index d127b1ce..abcf1f3c 100644 --- a/db/migrations/SheriffDbContextModelSnapshot.cs +++ b/db/migrations/SheriffDbContextModelSnapshot.cs @@ -515,6 +515,14 @@ protected override void BuildModel(ModelBuilder modelBuilder) CreatedOn = new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), Description = "View other profiles (beside their own)", Name = "ViewOtherProfiles" + }, + new + { + Id = 43, + ConcurrencyToken = 0u, + CreatedOn = new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + Description = "Generate Reports based on Sheriff's activity", + Name = "GenerateReports" }); }); diff --git a/db/models/auth/Permission.cs b/db/models/auth/Permission.cs index 81be1247..81e29b8b 100644 --- a/db/models/auth/Permission.cs +++ b/db/models/auth/Permission.cs @@ -42,6 +42,7 @@ public class Permission : BaseEntity public const string ViewDutyRosterInFuture = nameof(ViewDutyRosterInFuture); public const string ViewAllFutureShifts = nameof(ViewAllFutureShifts); public const string ViewOtherProfiles = nameof(ViewOtherProfiles); + public const string GenerateReports = nameof(GenerateReports); [Key] public int Id { get; set; } diff --git a/web/src/components/MyTeam/ViewReports.vue b/web/src/components/MyTeam/ViewReports.vue index 85bc6143..f9e3ecbe 100644 --- a/web/src/components/MyTeam/ViewReports.vue +++ b/web/src/components/MyTeam/ViewReports.vue @@ -151,18 +151,18 @@ '&location='+location+ '&reportType='+this.reportParameters.reportType; - // this.$http.get(url) - // .then((response) => { - // if(response?.data){ - // this.results = response.data; - this.generateExcel(); + this.$http.get("api/sheriff/training") + .then((response) => { + // if(response?.data){ + // this.results = response.data; + // this.generateExcel(); // } this.searching = false; - // },(err) => { - // this.searching = false; - // this.error = err.response.data - // }); + },(err) => { + this.searching = false; + this.error = err.response.data + }); } From 91614c941c72d3c0342b00c5511fdafeacaf2620 Mon Sep 17 00:00:00 2001 From: marzmehr Date: Tue, 3 Jan 2023 10:14:19 -0800 Subject: [PATCH 10/58] SS-739: Add toggle for week/day view, Add functionality to get the correct date range for day view, Add functionality to display acting rank, Add functionality to display shifts, Add modal for email, Add recipient option selection, Add Title, Add Text input, Remove ws switch, Update switch styling, Code Cleanup --- .../MyTeam/Tabs/UserSummaryTemplate.vue | 18 +- .../ShiftSchedule/DistributeSchedule.vue | 239 +++++++++++-- .../ShiftSchedule/components/ButtonBar.vue | 55 +++ .../components/DistributeHeader.vue | 314 ++++++++++++++++-- .../components/SentEmailContent.vue | 30 ++ .../store/modules/ShiftScheduleInformation.ts | 11 + web/src/types/ShiftSchedule/index.ts | 24 ++ 7 files changed, 621 insertions(+), 70 deletions(-) create mode 100644 web/src/components/ShiftSchedule/components/ButtonBar.vue create mode 100644 web/src/components/ShiftSchedule/components/SentEmailContent.vue diff --git a/web/src/components/MyTeam/Tabs/UserSummaryTemplate.vue b/web/src/components/MyTeam/Tabs/UserSummaryTemplate.vue index 6c2457b9..611ab6f6 100644 --- a/web/src/components/MyTeam/Tabs/UserSummaryTemplate.vue +++ b/web/src/components/MyTeam/Tabs/UserSummaryTemplate.vue @@ -51,6 +51,7 @@ @@ -520,4 +676,15 @@ border: 3px solid; } + .dot { + height: 20px; + width: 20px; + background-color: black; + color: white; + padding: 0.05rem 0.3rem 0.75rem 0.35rem; + font-size: 0.75rem; + border-radius: 50%; + display: inline-block; + } + \ No newline at end of file diff --git a/web/src/components/ShiftSchedule/components/ButtonBar.vue b/web/src/components/ShiftSchedule/components/ButtonBar.vue new file mode 100644 index 00000000..4849dacc --- /dev/null +++ b/web/src/components/ShiftSchedule/components/ButtonBar.vue @@ -0,0 +1,55 @@ + + + \ No newline at end of file diff --git a/web/src/components/ShiftSchedule/components/DistributeHeader.vue b/web/src/components/ShiftSchedule/components/DistributeHeader.vue index f59b8347..3d17c6c1 100644 --- a/web/src/components/ShiftSchedule/components/DistributeHeader.vue +++ b/web/src/components/ShiftSchedule/components/DistributeHeader.vue @@ -6,7 +6,7 @@

Distribute Schedule

- + + + + + + +
{{selectedDate | beautify-date-weekday}}
+ + + + +
+ +
+
+ @@ -32,9 +58,8 @@ - All + @change="getSchedule()"> + All - -
- -
{{viewStatus}}
+ +
+ +
{{viewRange}}
+
+ + + +
- + + + + + + + + + + + + + + + All + + + {{member.name}} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
@@ -74,17 +183,28 @@ import { Component, Vue, Watch } from 'vue-property-decorator'; import { namespace } from "vuex-class"; import moment from 'moment-timezone'; + import "@store/modules/ShiftScheduleInformation"; const shiftState = namespace("ShiftScheduleInformation"); + import "@store/modules/CommonInformation"; const commonState = namespace("CommonInformation"); - import { distributeTeamMemberInfoType, shiftRangeInfoType } from '../../../types/ShiftSchedule'; + + import { distributeTeamMemberInfoType, sentEmailContentInfoType, shiftRangeInfoType } from '../../../types/ShiftSchedule'; import { locationInfoType, userInfoType } from '../../../types/common'; + import ButtonBar from './ButtonBar.vue'; + import SentEmailContent from './SentEmailContent.vue'; + import { Printd } from 'printd' const bootstrapCss = require('!!raw-loader!@/styles/bootstrapMIN.css').default; - @Component + @Component({ + components:{ + ButtonBar, + SentEmailContent + } + }) export default class DistributeHeader extends Vue { @commonState.State @@ -102,27 +222,51 @@ @shiftState.Action public UpdateShiftRangeInfo!: (newShiftRangeInfo: shiftRangeInfoType) => void + @shiftState.State + public dailyShiftRangeInfo!: shiftRangeInfoType; + + @shiftState.Action + public UpdateDailyShiftRangeInfo!: (newDailyShiftRangeInfo: shiftRangeInfoType) => void + selectedDate = ''; - datePickerOpened = false; - showWorkSectionChecked = false; + datePickerOpened = false; + showWeekViewChecked = true; hasPermissionToViewDutyRoster = false; + pdfType='' + errorMsg = '' + showEmailWindow = false; + emailingPdf = false; + emailContent = {} as sentEmailContentInfoType; + showSentEmail = false; + recipients: string[] = []; + teamMemberEmailList: string[] = []; + recipientState = true; + subjectState = true; + contentState = true; + allSelected = false; - selectedTeamMember = {sheriffId: '', name: 'All'} as distributeTeamMemberInfoType; + selectedTeamMember = {sheriffId: '', name: 'All', email: ''} as distributeTeamMemberInfoType; @Watch('location.id', { immediate: true }) locationChange() { - this.selectedTeamMember = {sheriffId: '', name: 'All'}; - this.showWorkSectionChecked = false; + this.selectedTeamMember = {sheriffId: '', name: 'All', email: ''}; + this.showWeekViewChecked = true; } - mounted() { + @Watch('recipients', { immediate: true }) + recipientChange() + { + this.emailContent.to = this.recipients.toString(); + } - this.showWorkSectionChecked = false; - this.hasPermissionToViewDutyRoster = this.userDetails.permissions.includes("ViewDutyRoster"); + mounted() { + this.showWeekViewChecked = true; + this.hasPermissionToViewDutyRoster = this.userDetails.permissions.includes("ViewDutyRoster"); + this.teamMemberEmailList = this.teamMemberList.map(member => member.email); - if(!this.shiftRangeInfo.startDate){ + if(!this.shiftRangeInfo.startDate || !this.dailyShiftRangeInfo.startDate){ this.selectedDate = moment().format().substring(0,10); this.loadNewDateRange(); } else { @@ -130,11 +274,26 @@ this.getSchedule(); } } + + public updateRecipientEmails(){ + Vue.nextTick(()=>console.log('adding emails: ' + this.recipients)) + + } + + public toggleAllEmails(checked){ + this.recipients = checked?this.teamMemberList.map(member => member.email).slice(): []; + } - public getSchedule() { - // console.log(this.showWorkSectionChecked); - // console.log(this.selectedTeamMember); - Vue.nextTick(()=>this.$emit('change', this.showWorkSectionChecked, this.selectedTeamMember.sheriffId)) + public getSchedule() { + Vue.nextTick(()=>this.$emit('change', this.showWeekViewChecked, this.selectedTeamMember.sheriffId)) + } + + public emailSchedule(){ + + this.errorMsg = ""; + this.pdfType = this.showWeekViewChecked?'Weekly Schedule': 'Daily Schedule'; + this.showEmailWindow = true; + this.emailContent = {} as sentEmailContentInfoType; } public printSchedule() { @@ -172,30 +331,115 @@ const pageToPrint = document.getElementById("pdf") if(pageToPrint) pdfPage.print(pageToPrint, styles) } + + public emailSchedulePdf() { + + let requiredError = false; + + if (!this.emailContent.to){ + this.recipientState = false; + requiredError = true; + } else { + this.recipientState = true; + } + + if (!this.emailContent.subject){ + this.subjectState = false; + requiredError = true; + } else { + this.subjectState = true; + } + + if (!this.emailContent.body){ + this.contentState = false; + requiredError = true; + } else { + this.contentState = true; + } + + this.showSentEmail = false; + + if (!requiredError){ + this.sendEmail(); + } + } + + public sendEmail(){ + + this.emailingPdf=true; + const el= document.getElementById("pdf"); + const bottomLeftText = `" ADM 322 ";`; + const bottomRightText = `" "`; + const url = '/adm/pdf?email=true'; + const pdfhtml = Vue.filter('printPdf')(el.innerHTML, bottomLeftText, bottomRightText ); + const body = { + 'html':pdfhtml + } + + const options = { + responseType: "blob", + headers: { + "Content-Type": "application/json", + } + } + this.$http.post(url,body, options) + .then(res => { + + const reader = new FileReader(); + reader.readAsText(res.data) + reader.onload = ()=> { + this.emailContent=JSON.parse(String(reader.result)) + console.log(this.emailContent) + this.showSentEmail = true + } + this.emailingPdf=false; + + this.showEmailWindow=false + },err => { + // console.error(err); + this.showEmailWindow=false + this.emailingPdf=false + const reader = new FileReader(); + reader.readAsText(err.response.data) + reader.onload = ()=> this.errorMsg = JSON.parse(String(reader.result))["detail"]; + Vue.filter('scrollToLocation')('alert-msg') + }); + + } - get viewStatus() { - if(this.showWorkSectionChecked) return 'WS';else return 'No WS' - } + get viewRange() { + if(this.showWeekViewChecked) return 'Week View';else return 'Day View' + } public dateChanged(event) { if(this.datePickerOpened)this.loadNewDateRange(); } - public nextDateRange() { - this.selectedDate = moment(this.selectedDate).add(7, 'days').format().substring(0,10); + public nextDateRange() { + const days =(this.showWeekViewChecked)? 7 :1; + this.selectedDate = moment(this.selectedDate).add(days, 'days').format().substring(0,10); this.loadNewDateRange(); } public previousDateRange() { - this.selectedDate = moment(this.selectedDate).subtract(7, 'days').format().substring(0,10); + const days =(this.showWeekViewChecked)? 7 :1; + this.selectedDate = moment(this.selectedDate).subtract(days, 'days').format().substring(0,10); this.loadNewDateRange(); } public loadNewDateRange() { const firstDayOfWeek = moment(this.selectedDate).startOf('week').format() const lastDayOfWeek = moment(this.selectedDate).endOf('week').format(); - const dateRange = {startDate: firstDayOfWeek.substring(0,10), endDate: lastDayOfWeek.substring(0,10)} - this.UpdateShiftRangeInfo(dateRange); + let weeklyDateRange = {} as shiftRangeInfoType; + + weeklyDateRange = {startDate: firstDayOfWeek.substring(0,10), endDate: lastDayOfWeek.substring(0,10)} + this.UpdateShiftRangeInfo(weeklyDateRange); + + let dailyDateRange = {} as shiftRangeInfoType; + + dailyDateRange = {startDate: moment(this.selectedDate).startOf('day').format(), endDate: moment(this.selectedDate).endOf('day').format()} + this.UpdateDailyShiftRangeInfo(dailyDateRange); + this.getSchedule(); } } @@ -218,6 +462,10 @@ display: inline-block; float:none; } - + + .recipientList /deep/ .dropdown-menu { + max-height: 100px; + overflow-y: auto; + } \ No newline at end of file diff --git a/web/src/components/ShiftSchedule/components/SentEmailContent.vue b/web/src/components/ShiftSchedule/components/SentEmailContent.vue new file mode 100644 index 00000000..e8c68d62 --- /dev/null +++ b/web/src/components/ShiftSchedule/components/SentEmailContent.vue @@ -0,0 +1,30 @@ + + + + \ No newline at end of file diff --git a/web/src/store/modules/ShiftScheduleInformation.ts b/web/src/store/modules/ShiftScheduleInformation.ts index dbdd0e85..5f41f967 100644 --- a/web/src/store/modules/ShiftScheduleInformation.ts +++ b/web/src/store/modules/ShiftScheduleInformation.ts @@ -7,6 +7,7 @@ import { VuexModule, Module, Mutation, Action } from 'vuex-module-decorators' class ShiftScheduleInformation extends VuexModule { public shiftRangeInfo = {} as shiftRangeInfoType; + public dailyShiftRangeInfo = {} as shiftRangeInfoType; public sheriffsAvailabilityInfo = [] as sheriffAvailabilityInfoType[]; public selectedShifts = [] as string[]; public teamMemberList = [] as distributeTeamMemberInfoType[]; @@ -21,6 +22,16 @@ class ShiftScheduleInformation extends VuexModule { this.context.commit('setShiftRangeInfo', newShiftRangeInfo) } + @Mutation + public setDailyShiftRangeInfo(dailyShiftRangeInfo): void { + this.dailyShiftRangeInfo = dailyShiftRangeInfo + } + + @Action + public UpdateDailyShiftRangeInfo(newDailyShiftRangeInfo): void { + this.context.commit('setDailyShiftRangeInfo', newDailyShiftRangeInfo) + } + @Mutation public setSheriffsAvailabilityInfo(sheriffsAvailabilityInfo): void { this.sheriffsAvailabilityInfo = sheriffsAvailabilityInfo diff --git a/web/src/types/ShiftSchedule/index.ts b/web/src/types/ShiftSchedule/index.ts index 07203bc5..de2760d7 100644 --- a/web/src/types/ShiftSchedule/index.ts +++ b/web/src/types/ShiftSchedule/index.ts @@ -1,5 +1,6 @@ import {} from '../common'; import {} from '../DutyRoster/jsonTypes/index'; +import { actingRankJsontype } from '../MyTeam/jsonTypes'; export interface shiftInfoType { id: number; @@ -25,6 +26,7 @@ export interface editedShiftInfoType { export interface distributeTeamMemberInfoType { sheriffId: string; name: string; + email: string; } export interface weekShiftInfoType { @@ -128,6 +130,9 @@ export interface distributeScheduleInfoType { conflicts: scheduleInfoType[]; name: string; homeLocation: string; + rank: string; + badgeNumber: string; + actingRank: actingRankJsontype[]; } export interface scheduleInfoType { @@ -141,4 +146,23 @@ export interface scheduleInfoType { subType?: string; workSection: string; workSectionColor: string; +} + +export interface actingRankInfoType { + startTime:string; + endTime:string; + rank: string; +} + +export interface sheriffPagesInfoType { + start:number; + end:number; +} + +export interface sentEmailContentInfoType { + attachments: string; + body: string; + from: string; + subject: string; + to: string; } \ No newline at end of file From 218d68ea95f7cbf5625a9005edcc888f253c62b6 Mon Sep 17 00:00:00 2001 From: marzmehr Date: Thu, 5 Jan 2023 09:11:22 -0800 Subject: [PATCH 11/58] SS-735: Shorten the assignment names, SS-707: Replace Escort with Transport, SS-743: Add the 'All Locations' option, Add functionality to display the results in a table --- .../DutyRoster/DutyRosterDayView.vue | 4 +- .../DutyRoster/components/DutyCard.vue | 4 +- .../components/DutyRosterAssignment.vue | 10 +- .../components/DutyRosterHeader.vue | 2 +- .../components/SheriffAvailabilityCard.vue | 4 +- .../DutyRoster/components/SheriffDayView.vue | 6 +- .../components/SheriffFuelGauge.vue | 2 +- .../ManageTypes/AssignmentTypes.vue | 2 +- web/src/components/MyTeam/ViewReports.vue | 204 ++++++++++-------- web/src/components/NavigationTopbar.vue | 8 +- web/src/router/index.ts | 4 +- web/src/types/MyTeam/index.ts | 8 + 12 files changed, 151 insertions(+), 107 deletions(-) diff --git a/web/src/components/DutyRoster/DutyRosterDayView.vue b/web/src/components/DutyRoster/DutyRosterDayView.vue index adaf5938..f5b47280 100644 --- a/web/src/components/DutyRoster/DutyRosterDayView.vue +++ b/web/src/components/DutyRoster/DutyRosterDayView.vue @@ -48,7 +48,7 @@