diff --git a/src/caretogether-pwa/package-lock.json b/src/caretogether-pwa/package-lock.json index 317b56e0..749c349f 100644 --- a/src/caretogether-pwa/package-lock.json +++ b/src/caretogether-pwa/package-lock.json @@ -8,48 +8,48 @@ "name": "caretogether-pwa", "version": "0.1.0", "dependencies": { - "@azure/msal-browser": "^2.38.3", + "@azure/msal-browser": "^3.10.0", "@azure/storage-blob": "^12.17.0", - "@date-io/date-fns": "^2.17.0", + "@date-io/date-fns": "^3.0.0", "@emotion/react": "^11.11.4", "@emotion/styled": "^11.11.0", "@fullcalendar/core": "^6.1.11", "@fullcalendar/daygrid": "^6.1.11", "@fullcalendar/list": "^6.1.11", "@fullcalendar/react": "^6.1.11", - "@microsoft/applicationinsights-react-js": "^3.4.3", - "@microsoft/applicationinsights-web": "^2.8.17", - "@mui/icons-material": "^5.15.11", - "@mui/lab": "5.0.0-alpha.128", - "@mui/material": "^5.15.11", - "@mui/system": "^5.15.11", - "@mui/x-date-pickers": "^6.19.5", - "@testing-library/jest-dom": "^5.17.0", + "@microsoft/applicationinsights-react-js": "^17.1.0", + "@microsoft/applicationinsights-web": "^3.1.0", + "@mui/icons-material": "^5.15.12", + "@mui/lab": "5.0.0-alpha.167", + "@mui/material": "^5.15.12", + "@mui/system": "^5.15.12", + "@mui/x-date-pickers": "^6.19.6", + "@testing-library/jest-dom": "^6.4.2", "@testing-library/react": "^14.2.1", "@testing-library/user-event": "^14.5.2", - "date-fns": "^2.30.0", - "dexie": "^3.2.5", + "date-fns": "^3.3.1", + "dexie": "^3.2.6", "dexie-react-hooks": "^1.1.7", "react": "^18.2.0", "react-dom": "^18.2.0", - "react-router-dom": "^6.22.1", + "react-router-dom": "^6.22.3", "recoil": "^0.7.7", "web-vitals": "^3.5.2" }, "devDependencies": { "@types/jest": "^29.5.12", - "@types/node": "^18.19.18", - "@types/react": "^18.2.60", - "@types/react-dom": "^18.2.19", + "@types/node": "^20.11.25", + "@types/react": "^18.2.64", + "@types/react-dom": "^18.2.21", "@types/react-router-dom": "^5.3.3", - "@typescript-eslint/eslint-plugin": "^5.62.0", - "@typescript-eslint/parser": "^5.62.0", + "@typescript-eslint/eslint-plugin": "^7.1.1", + "@typescript-eslint/parser": "^7.1.1", "@vitejs/plugin-react-swc": "^3.6.0", "eslint": "^8.57.0", "eslint-plugin-react-hooks": "^4.6.0", - "eslint-plugin-react-refresh": "^0.3.5", - "typescript": "^4.9.5", - "vite": "^4.5.2" + "eslint-plugin-react-refresh": "^0.4.5", + "typescript": "^5.4.2", + "vite": "^5.1.5" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -174,21 +174,20 @@ } }, "node_modules/@azure/msal-browser": { - "version": "2.38.3", - "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-2.38.3.tgz", - "integrity": "sha512-2WuLFnWWPR1IdvhhysT18cBbkXx1z0YIchVss5AwVA95g7CU5CpT3d+5BcgVGNXDXbUU7/5p0xYHV99V5z8C/A==", - "deprecated": "A newer major version of this library is available. Please upgrade to the latest available version.", + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-3.10.0.tgz", + "integrity": "sha512-mnmi8dCXVNZI+AGRq0jKQ3YiodlIC4W9npr6FCB9WN6NQT+6rq+cIlxgUb//BjLyzKsnYo+i4LROGeMyU+6v1A==", "dependencies": { - "@azure/msal-common": "13.3.1" + "@azure/msal-common": "14.7.1" }, "engines": { "node": ">=0.8.0" } }, "node_modules/@azure/msal-common": { - "version": "13.3.1", - "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-13.3.1.tgz", - "integrity": "sha512-Lrk1ozoAtaP/cp53May3v6HtcFSVxdFrg2Pa/1xu5oIvsIwhxW6zSPibKefCOVgd5osgykMi5jjcZHv8XkzZEQ==", + "version": "14.7.1", + "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-14.7.1.tgz", + "integrity": "sha512-v96btzjM7KrAu4NSEdOkhQSTGOuNUIIsUdB8wlyB9cdgl5KqEKnTonHUZ8+khvZ6Ap542FCErbnTyDWl8lZ2rA==", "engines": { "node": ">=0.8.0" } @@ -360,19 +359,19 @@ } }, "node_modules/@date-io/core": { - "version": "2.17.0", - "resolved": "https://registry.npmjs.org/@date-io/core/-/core-2.17.0.tgz", - "integrity": "sha512-+EQE8xZhRM/hsY0CDTVyayMDDY5ihc4MqXCrPxooKw19yAzUIC6uUqsZeaOFNL9YKTNxYKrJP5DFgE8o5xRCOw==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@date-io/core/-/core-3.0.0.tgz", + "integrity": "sha512-S3j+IAQVBYNkQzchVVhX40eBkGDreBpScy9RXwTS5j2+k07+62pMVPisQ44Gq76Rqy5AOG/EZXCwBpY/jbemvA==" }, "node_modules/@date-io/date-fns": { - "version": "2.17.0", - "resolved": "https://registry.npmjs.org/@date-io/date-fns/-/date-fns-2.17.0.tgz", - "integrity": "sha512-L0hWZ/mTpy3Gx/xXJ5tq5CzHo0L7ry6KEO9/w/JWiFWFLZgiNVo3ex92gOl3zmzjHqY/3Ev+5sehAr8UnGLEng==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@date-io/date-fns/-/date-fns-3.0.0.tgz", + "integrity": "sha512-hsLAbsdP8LKfi7OQ729cXMWfmHQEq0hn3ysXfAAoc92j6j6sBq0s0tplnkWu6O4iBUpVCYRPGuNjQQhTaOu2AA==", "dependencies": { - "@date-io/core": "^2.17.0" + "@date-io/core": "^3.0.0" }, "peerDependencies": { - "date-fns": "^2.0.0" + "date-fns": "^3.2.0" }, "peerDependenciesMeta": { "date-fns": { @@ -513,10 +512,26 @@ "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz", "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", + "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/@esbuild/android-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", - "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", + "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", "cpu": [ "arm" ], @@ -530,9 +545,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", - "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", + "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", "cpu": [ "arm64" ], @@ -546,9 +561,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", - "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", + "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", "cpu": [ "x64" ], @@ -562,9 +577,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", - "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", + "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", "cpu": [ "arm64" ], @@ -578,9 +593,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", - "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", + "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", "cpu": [ "x64" ], @@ -594,9 +609,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", - "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", + "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", "cpu": [ "arm64" ], @@ -610,9 +625,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", - "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", + "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", "cpu": [ "x64" ], @@ -626,9 +641,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", - "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", + "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", "cpu": [ "arm" ], @@ -642,9 +657,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", - "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", + "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", "cpu": [ "arm64" ], @@ -658,9 +673,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", - "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", + "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", "cpu": [ "ia32" ], @@ -674,9 +689,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", - "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", + "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", "cpu": [ "loong64" ], @@ -690,9 +705,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", - "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", + "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", "cpu": [ "mips64el" ], @@ -706,9 +721,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", - "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", + "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", "cpu": [ "ppc64" ], @@ -722,9 +737,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", - "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", + "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", "cpu": [ "riscv64" ], @@ -738,9 +753,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", - "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", + "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", "cpu": [ "s390x" ], @@ -754,9 +769,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", - "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", + "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", "cpu": [ "x64" ], @@ -770,9 +785,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", - "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", + "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", "cpu": [ "x64" ], @@ -786,9 +801,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", - "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", + "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", "cpu": [ "x64" ], @@ -802,9 +817,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", - "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", + "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", "cpu": [ "x64" ], @@ -818,9 +833,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", - "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", + "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", "cpu": [ "arm64" ], @@ -834,9 +849,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", - "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", + "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", "cpu": [ "ia32" ], @@ -850,9 +865,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", - "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", + "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", "cpu": [ "x64" ], @@ -1026,6 +1041,7 @@ "version": "29.5.0", "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.5.0.tgz", "integrity": "sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg==", + "devOptional": true, "dependencies": { "jest-get-type": "^29.4.3" }, @@ -1037,6 +1053,7 @@ "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", + "devOptional": true, "dependencies": { "@sinclair/typebox": "^0.25.16" }, @@ -1048,6 +1065,7 @@ "version": "29.5.0", "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.5.0.tgz", "integrity": "sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==", + "devOptional": true, "dependencies": { "@jest/schemas": "^29.4.3", "@types/istanbul-lib-coverage": "^2.0.0", @@ -1061,95 +1079,121 @@ } }, "node_modules/@microsoft/applicationinsights-analytics-js": { - "version": "2.8.17", - "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-analytics-js/-/applicationinsights-analytics-js-2.8.17.tgz", - "integrity": "sha512-xuP5vdxPyvpGsbtH9yrm+g0NK8CH4mv1yHR2XRMvpUJ6xWDU0XONtg4tW99j/saE4+5wKk/8eB07jEtDfnYOJg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-analytics-js/-/applicationinsights-analytics-js-3.1.0.tgz", + "integrity": "sha512-uKME14ZE2I809PY/i+f39TlDn9aWSCFDdOkfjc1B46g2YVlqqtVBI0fQoPPPLjuSj1DDUjuXJUfjQL2rB853uw==", + "dependencies": { + "@microsoft/applicationinsights-common": "3.1.0", + "@microsoft/applicationinsights-core-js": "3.1.0", + "@microsoft/applicationinsights-shims": "3.0.1", + "@microsoft/dynamicproto-js": "^2.0.3", + "@nevware21/ts-utils": ">= 0.10.5 < 2.x" + }, + "peerDependencies": { + "tslib": "*" + } + }, + "node_modules/@microsoft/applicationinsights-cfgsync-js": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-cfgsync-js/-/applicationinsights-cfgsync-js-3.1.0.tgz", + "integrity": "sha512-85wjyjgcH3YouuKj1uweQGaKD30w6DBGHrs57IpBR388xshuEt/JPayMfuxUUQE0s8ySyEk8k+S8sDh1aLYAZw==", "dependencies": { - "@microsoft/applicationinsights-common": "2.8.17", - "@microsoft/applicationinsights-core-js": "2.8.17", - "@microsoft/applicationinsights-shims": "2.0.2", - "@microsoft/dynamicproto-js": "^1.1.11" + "@microsoft/applicationinsights-common": "3.1.0", + "@microsoft/applicationinsights-core-js": "3.1.0", + "@microsoft/applicationinsights-shims": "3.0.1", + "@microsoft/dynamicproto-js": "^2.0.3", + "@nevware21/ts-async": ">= 0.3.0 < 2.x", + "@nevware21/ts-utils": ">= 0.10.5 < 2.x" }, "peerDependencies": { "tslib": "*" } }, "node_modules/@microsoft/applicationinsights-channel-js": { - "version": "2.8.17", - "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-channel-js/-/applicationinsights-channel-js-2.8.17.tgz", - "integrity": "sha512-dYL8vR/1rLmncc16uukSMyZYzYpMhf9OPZypkUquZc01q5Afwwn4i6pJL72i2AoHQKOEir6wBbQbqHtQc/HQ7g==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-channel-js/-/applicationinsights-channel-js-3.1.0.tgz", + "integrity": "sha512-VJUZT1FpQ5+XV3t4/AKprWiyH0gEEPDoJr6E8ZVopKoVVX/AjorkhPcZ4oDlpeEWpBeMxg+PeZOdTMKyY0atOw==", "dependencies": { - "@microsoft/applicationinsights-common": "2.8.17", - "@microsoft/applicationinsights-core-js": "2.8.17", - "@microsoft/applicationinsights-shims": "2.0.2", - "@microsoft/dynamicproto-js": "^1.1.11" + "@microsoft/applicationinsights-common": "3.1.0", + "@microsoft/applicationinsights-core-js": "3.1.0", + "@microsoft/applicationinsights-shims": "3.0.1", + "@microsoft/dynamicproto-js": "^2.0.3", + "@nevware21/ts-async": ">= 0.3.0 < 2.x", + "@nevware21/ts-utils": ">= 0.10.5 < 2.x" }, "peerDependencies": { "tslib": "*" } }, "node_modules/@microsoft/applicationinsights-common": { - "version": "2.8.17", - "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-common/-/applicationinsights-common-2.8.17.tgz", - "integrity": "sha512-Q8W94oJuZvNWL6klUeEpXR5FFcwkyksQAfunBgRsIkpfFeoMw8Ac7DzY3HWFeQAYMq4hiifdiHxJ1YM/opbShA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-common/-/applicationinsights-common-3.1.0.tgz", + "integrity": "sha512-PpWdCbTPsH5MSDIkHKaIBpEJcsnPcnAjlTCk+ls0DOfIB/T6bTn3TuKsDfSu/sxdLhDQiJeUXu8G3qOQ3L0nBA==", "dependencies": { - "@microsoft/applicationinsights-core-js": "2.8.17", - "@microsoft/applicationinsights-shims": "2.0.2", - "@microsoft/dynamicproto-js": "^1.1.11" + "@microsoft/applicationinsights-core-js": "3.1.0", + "@microsoft/applicationinsights-shims": "3.0.1", + "@microsoft/dynamicproto-js": "^2.0.3", + "@nevware21/ts-utils": ">= 0.10.5 < 2.x" }, "peerDependencies": { "tslib": "*" } }, "node_modules/@microsoft/applicationinsights-core-js": { - "version": "2.8.17", - "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-core-js/-/applicationinsights-core-js-2.8.17.tgz", - "integrity": "sha512-v1UMRkV1dW1ezQqhIcMz4L7TyAvWi5vQ333uKO93UY+UmCZW8frYqmqgxV9uaJjs3IBgr0T7ddp4IkvOTjy1/w==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-core-js/-/applicationinsights-core-js-3.1.0.tgz", + "integrity": "sha512-pHaZ3CQx+KdfRV3yV/xuMEvIEJ1KxlK6klnFcuz4AMXOOPeuvWy1FsUIQ/sVA97TXEDl87LqV6QDnH99bLZpMg==", "dependencies": { - "@microsoft/applicationinsights-shims": "2.0.2", - "@microsoft/dynamicproto-js": "^1.1.11" + "@microsoft/applicationinsights-shims": "3.0.1", + "@microsoft/dynamicproto-js": "^2.0.3", + "@nevware21/ts-async": ">= 0.3.0 < 2.x", + "@nevware21/ts-utils": ">= 0.10.5 < 2.x" }, "peerDependencies": { "tslib": "*" } }, "node_modules/@microsoft/applicationinsights-dependencies-js": { - "version": "2.8.17", - "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-dependencies-js/-/applicationinsights-dependencies-js-2.8.17.tgz", - "integrity": "sha512-0dZvWIZj3XC+ocDzFZqVPs4x8W0urw2p/XUdc0PgGY7FyQCNtOp2OoEi6BDSWipaRWQeOwB99Ch71RILl/OQEw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-dependencies-js/-/applicationinsights-dependencies-js-3.1.0.tgz", + "integrity": "sha512-CI1hJQ4goz71EWitRJLjU0Y+jD3boANmFDtlxCXnP5oVfNJkV5r/CZ6ufUNnNEO4EBG++bRg3PSlwBJ5mbZ14Q==", "dependencies": { - "@microsoft/applicationinsights-common": "2.8.17", - "@microsoft/applicationinsights-core-js": "2.8.17", - "@microsoft/applicationinsights-shims": "2.0.2", - "@microsoft/dynamicproto-js": "^1.1.11" + "@microsoft/applicationinsights-common": "3.1.0", + "@microsoft/applicationinsights-core-js": "3.1.0", + "@microsoft/applicationinsights-shims": "3.0.1", + "@microsoft/dynamicproto-js": "^2.0.3", + "@nevware21/ts-async": ">= 0.3.0 < 2.x", + "@nevware21/ts-utils": ">= 0.10.5 < 2.x" }, "peerDependencies": { "tslib": "*" } }, "node_modules/@microsoft/applicationinsights-properties-js": { - "version": "2.8.17", - "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-properties-js/-/applicationinsights-properties-js-2.8.17.tgz", - "integrity": "sha512-TqOMdbVCcjOyMCwZwfOH1Z9ZHxeHRJ6JkAP1cdDtpX3H7e8j/ce+p3t0yFGmZGBVRhsgsZgEuV8npK7LYnryRA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-properties-js/-/applicationinsights-properties-js-3.1.0.tgz", + "integrity": "sha512-ABDDiqZD4y1gcS+Ggj7gyuPLClO7q053s53eBpxoYlZzQ5D7qn/A9A2AOCRrih4pSc212rdzi8TqC2iu9IWLxA==", "dependencies": { - "@microsoft/applicationinsights-common": "2.8.17", - "@microsoft/applicationinsights-core-js": "2.8.17", - "@microsoft/applicationinsights-shims": "2.0.2", - "@microsoft/dynamicproto-js": "^1.1.11" + "@microsoft/applicationinsights-common": "3.1.0", + "@microsoft/applicationinsights-core-js": "3.1.0", + "@microsoft/applicationinsights-shims": "3.0.1", + "@microsoft/dynamicproto-js": "^2.0.3", + "@nevware21/ts-utils": ">= 0.10.5 < 2.x" }, "peerDependencies": { "tslib": "*" } }, "node_modules/@microsoft/applicationinsights-react-js": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-react-js/-/applicationinsights-react-js-3.4.3.tgz", - "integrity": "sha512-+IIPDYU7DKBwByN7lK/mkMGrnWMGdyIsEZfDzBh/fKDZgGGGgH9B3WHej+vIpdwBcVaPbYx++lonTshn56C9/A==", + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-react-js/-/applicationinsights-react-js-17.1.0.tgz", + "integrity": "sha512-cxa+25t88IozRGxQad073DXpDw4s2owR9O7Lq7g/pI1sTPtcw2TmP6tnH+ObeChdHJrC4UGkzn06Rr2CkX2Lfg==", "dependencies": { - "@microsoft/applicationinsights-common": "^2.8.14", - "@microsoft/applicationinsights-core-js": "^2.8.14", - "@microsoft/applicationinsights-shims": "^2.0.2", - "@microsoft/dynamicproto-js": "^1.1.9" + "@microsoft/applicationinsights-common": "^3.1.0", + "@microsoft/applicationinsights-core-js": "^3.1.0", + "@microsoft/applicationinsights-shims": "^3.0.1", + "@microsoft/dynamicproto-js": "^2.0.3", + "@nevware21/ts-utils": ">= 0.10.5 < 2.x" }, "peerDependencies": { "history": ">= 4.10.1", @@ -1158,42 +1202,51 @@ } }, "node_modules/@microsoft/applicationinsights-shims": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-shims/-/applicationinsights-shims-2.0.2.tgz", - "integrity": "sha512-PoHEgsnmcqruLNHZ/amACqdJ6YYQpED0KSRe6J7gIJTtpZC1FfFU9b1fmDKDKtFoUSrPzEh1qzO3kmRZP0betg==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-shims/-/applicationinsights-shims-3.0.1.tgz", + "integrity": "sha512-DKwboF47H1nb33rSUfjqI6ryX29v+2QWcTrRvcQDA32AZr5Ilkr7whOOSsD1aBzwqX0RJEIP1Z81jfE3NBm/Lg==", + "dependencies": { + "@nevware21/ts-utils": ">= 0.9.4 < 2.x" + } }, "node_modules/@microsoft/applicationinsights-web": { - "version": "2.8.17", - "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-web/-/applicationinsights-web-2.8.17.tgz", - "integrity": "sha512-3JjQb5+3z9wnJS1SQDS2nyH3K6p2v/CsWxyY2etwG7CVEe/R9n0jpA4dcNYQoP7afoKR2TPBfARr17zNHBmlug==", - "dependencies": { - "@microsoft/applicationinsights-analytics-js": "2.8.17", - "@microsoft/applicationinsights-channel-js": "2.8.17", - "@microsoft/applicationinsights-common": "2.8.17", - "@microsoft/applicationinsights-core-js": "2.8.17", - "@microsoft/applicationinsights-dependencies-js": "2.8.17", - "@microsoft/applicationinsights-properties-js": "2.8.17", - "@microsoft/applicationinsights-shims": "2.0.2", - "@microsoft/dynamicproto-js": "^1.1.11" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-web/-/applicationinsights-web-3.1.0.tgz", + "integrity": "sha512-DfLiZNBZmIX8gaybvSxkecCKJpUvsL9BplhUb4ldJU7fq9h/lk5u+wJXny96Oy1jBbUpFKjBgfWjXjLb6owezw==", + "dependencies": { + "@microsoft/applicationinsights-analytics-js": "3.1.0", + "@microsoft/applicationinsights-cfgsync-js": "3.1.0", + "@microsoft/applicationinsights-channel-js": "3.1.0", + "@microsoft/applicationinsights-common": "3.1.0", + "@microsoft/applicationinsights-core-js": "3.1.0", + "@microsoft/applicationinsights-dependencies-js": "3.1.0", + "@microsoft/applicationinsights-properties-js": "3.1.0", + "@microsoft/applicationinsights-shims": "3.0.1", + "@microsoft/dynamicproto-js": "^2.0.3", + "@nevware21/ts-async": ">= 0.3.0 < 2.x", + "@nevware21/ts-utils": ">= 0.10.5 < 2.x" }, "peerDependencies": { "tslib": "*" } }, "node_modules/@microsoft/dynamicproto-js": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/@microsoft/dynamicproto-js/-/dynamicproto-js-1.1.11.tgz", - "integrity": "sha512-gNw9z9LbqLV+WadZ6/MMrWwO3e0LuoUH1wve/1iPsBNbgqeVCiB0EZFNNj2lysxS2gkqoF9hmyVaG3MoM1BkxA==" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@microsoft/dynamicproto-js/-/dynamicproto-js-2.0.3.tgz", + "integrity": "sha512-JTWTU80rMy3mdxOjjpaiDQsTLZ6YSGGqsjURsY6AUQtIj0udlF/jYmhdLZu8693ZIC0T1IwYnFa0+QeiMnziBA==", + "dependencies": { + "@nevware21/ts-utils": ">= 0.10.4 < 2.x" + } }, "node_modules/@mui/base": { - "version": "5.0.0-beta.37", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.37.tgz", - "integrity": "sha512-/o3anbb+DeCng8jNsd3704XtmmLDZju1Fo8R2o7ugrVtPQ/QpcqddwKNzKPZwa0J5T8YNW3ZVuHyQgbTnQLisQ==", + "version": "5.0.0-beta.38", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.38.tgz", + "integrity": "sha512-AsjD6Y1X5A1qndxz8xCcR8LDqv31aiwlgWMPxFAX/kCKiIGKlK65yMeVZ62iQr/6LBz+9hSKLiD1i4TZdAHKcQ==", "dependencies": { "@babel/runtime": "^7.23.9", "@floating-ui/react-dom": "^2.0.8", "@mui/types": "^7.2.13", - "@mui/utils": "^5.15.11", + "@mui/utils": "^5.15.12", "@popperjs/core": "^2.11.8", "clsx": "^2.1.0", "prop-types": "^15.8.1" @@ -1216,27 +1269,19 @@ } } }, - "node_modules/@mui/base/node_modules/clsx": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz", - "integrity": "sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==", - "engines": { - "node": ">=6" - } - }, "node_modules/@mui/core-downloads-tracker": { - "version": "5.15.11", - "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.15.11.tgz", - "integrity": "sha512-JVrJ9Jo4gyU707ujnRzmE8ABBWpXd6FwL9GYULmwZRtfPg89ggXs/S3MStQkpJ1JRWfdLL6S5syXmgQGq5EDAw==", + "version": "5.15.12", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.15.12.tgz", + "integrity": "sha512-brRO+tMFLpGyjEYHrX97bzqeF6jZmKpqqe1rY0LyIHAwP6xRVzh++zSecOQorDOCaZJg4XkGT9xfD+RWOWxZBA==", "funding": { "type": "opencollective", "url": "https://opencollective.com/mui-org" } }, "node_modules/@mui/icons-material": { - "version": "5.15.11", - "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.15.11.tgz", - "integrity": "sha512-R5ZoQqnKpd+5Ew7mBygTFLxgYsQHPhgR3TDXSgIHYIjGzYuyPLmGLSdcPUoMdi6kxiYqHlpPj4NJxlbaFD0UHA==", + "version": "5.15.12", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.15.12.tgz", + "integrity": "sha512-3BXiDlOd3AexZoEXa/VqpIpVIvosCzjLHsdMWzKMXbZdnBiJjmb9ECdqfjn5SpTClO49qvkKLhkTqdBH3fSFGw==", "dependencies": { "@babel/runtime": "^7.23.9" }, @@ -1259,30 +1304,29 @@ } }, "node_modules/@mui/lab": { - "version": "5.0.0-alpha.128", - "resolved": "https://registry.npmjs.org/@mui/lab/-/lab-5.0.0-alpha.128.tgz", - "integrity": "sha512-jsGP8bbAvnG+cBCveHhF49BHhVNojBvblWrNUuMkkLYS6T239Dela/+UvVnfIn/1hfUUNf/G/RiB42qC6ud7vQ==", - "dependencies": { - "@babel/runtime": "^7.21.0", - "@mui/base": "5.0.0-alpha.127", - "@mui/system": "^5.12.1", - "@mui/types": "^7.2.4", - "@mui/utils": "^5.12.0", - "clsx": "^1.2.1", - "prop-types": "^15.8.1", - "react-is": "^18.2.0" + "version": "5.0.0-alpha.167", + "resolved": "https://registry.npmjs.org/@mui/lab/-/lab-5.0.0-alpha.167.tgz", + "integrity": "sha512-BNQJ7fBBvL68WGVnzAhbtTmabSuJDXaILr9dz/3RNK4TgGXPgWCAr7qtJeUdc4p1t7c4Z1ifG8UwgqD+5hzMNg==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/base": "5.0.0-beta.38", + "@mui/system": "^5.15.12", + "@mui/types": "^7.2.13", + "@mui/utils": "^5.15.12", + "clsx": "^2.1.0", + "prop-types": "^15.8.1" }, "engines": { "node": ">=12.0.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/mui" + "url": "https://opencollective.com/mui-org" }, "peerDependencies": { "@emotion/react": "^11.5.0", "@emotion/styled": "^11.3.0", - "@mui/material": "^5.0.0", + "@mui/material": ">=5.15.0", "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0", "react-dom": "^17.0.0 || ^18.0.0" @@ -1299,49 +1343,17 @@ } } }, - "node_modules/@mui/lab/node_modules/@mui/base": { - "version": "5.0.0-alpha.127", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.127.tgz", - "integrity": "sha512-FoRQd0IOH9MnfyL5yXssyQRnC4vXI+1bwkU1idr+wNkP1ZfxE+JsThHcfl1dy5azLssVUGTtQFD9edQLdbyJog==", - "dependencies": { - "@babel/runtime": "^7.21.0", - "@emotion/is-prop-valid": "^1.2.0", - "@mui/types": "^7.2.4", - "@mui/utils": "^5.12.0", - "@popperjs/core": "^2.11.7", - "clsx": "^1.2.1", - "prop-types": "^15.8.1", - "react-is": "^18.2.0" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui" - }, - "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, "node_modules/@mui/material": { - "version": "5.15.11", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.15.11.tgz", - "integrity": "sha512-FA3eEuEZaDaxgN3CgfXezMWbCZ4VCeU/sv0F0/PK5n42qIgsPVD6q+j71qS7/62sp6wRFMHtDMpXRlN+tT/7NA==", + "version": "5.15.12", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.15.12.tgz", + "integrity": "sha512-vXJGg6KNKucsvbW6l7w9zafnpOp0CWc0Wx4mDykuABTpQ5QQBnZxP7+oB4yAS1hDZQ1WobbeIl0CjxK4EEahkA==", "dependencies": { "@babel/runtime": "^7.23.9", - "@mui/base": "5.0.0-beta.37", - "@mui/core-downloads-tracker": "^5.15.11", - "@mui/system": "^5.15.11", + "@mui/base": "5.0.0-beta.38", + "@mui/core-downloads-tracker": "^5.15.12", + "@mui/system": "^5.15.12", "@mui/types": "^7.2.13", - "@mui/utils": "^5.15.11", + "@mui/utils": "^5.15.12", "@types/react-transition-group": "^4.4.10", "clsx": "^2.1.0", "csstype": "^3.1.3", @@ -1375,21 +1387,13 @@ } } }, - "node_modules/@mui/material/node_modules/clsx": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz", - "integrity": "sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==", - "engines": { - "node": ">=6" - } - }, "node_modules/@mui/private-theming": { - "version": "5.15.11", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.15.11.tgz", - "integrity": "sha512-jY/696SnSxSzO1u86Thym7ky5T9CgfidU3NFJjguldqK4f3Z5S97amZ6nffg8gTD0HBjY9scB+4ekqDEUmxZOA==", + "version": "5.15.12", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.15.12.tgz", + "integrity": "sha512-cqoSo9sgA5HE+8vZClbLrq9EkyOnYysooepi5eKaKvJ41lReT2c5wOZAeDDM1+xknrMDos+0mT2zr3sZmUiRRA==", "dependencies": { "@babel/runtime": "^7.23.9", - "@mui/utils": "^5.15.11", + "@mui/utils": "^5.15.12", "prop-types": "^15.8.1" }, "engines": { @@ -1441,15 +1445,15 @@ } }, "node_modules/@mui/system": { - "version": "5.15.11", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.15.11.tgz", - "integrity": "sha512-9j35suLFq+MgJo5ktVSHPbkjDLRMBCV17NMBdEQurh6oWyGnLM4uhU4QGZZQ75o0vuhjJghOCA1jkO3+79wKsA==", + "version": "5.15.12", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.15.12.tgz", + "integrity": "sha512-/pq+GO6yN3X7r3hAwFTrzkAh7K1bTF5r8IzS79B9eyKJg7v6B/t4/zZYMR6OT9qEPtwf6rYN2Utg1e6Z7F1OgQ==", "dependencies": { "@babel/runtime": "^7.23.9", - "@mui/private-theming": "^5.15.11", + "@mui/private-theming": "^5.15.12", "@mui/styled-engine": "^5.15.11", "@mui/types": "^7.2.13", - "@mui/utils": "^5.15.11", + "@mui/utils": "^5.15.12", "clsx": "^2.1.0", "csstype": "^3.1.3", "prop-types": "^15.8.1" @@ -1479,14 +1483,6 @@ } } }, - "node_modules/@mui/system/node_modules/clsx": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz", - "integrity": "sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==", - "engines": { - "node": ">=6" - } - }, "node_modules/@mui/types": { "version": "7.2.13", "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.13.tgz", @@ -1501,9 +1497,9 @@ } }, "node_modules/@mui/utils": { - "version": "5.15.11", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.15.11.tgz", - "integrity": "sha512-D6bwqprUa9Stf8ft0dcMqWyWDKEo7D+6pB1k8WajbqlYIRA8J8Kw9Ra7PSZKKePGBGWO+/xxrX1U8HpG/aXQCw==", + "version": "5.15.12", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.15.12.tgz", + "integrity": "sha512-8SDGCnO2DY9Yy+5bGzu00NZowSDtuyHP4H8gunhHGQoIlhlY2Z3w64wBzAOLpYw/ZhJNzksDTnS/i8qdJvxuow==", "dependencies": { "@babel/runtime": "^7.23.9", "@types/prop-types": "^15.7.11", @@ -1528,9 +1524,9 @@ } }, "node_modules/@mui/x-date-pickers": { - "version": "6.19.5", - "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-6.19.5.tgz", - "integrity": "sha512-WPi59ImgvGTEuAlJiCLnqNkEkbqPjgwUTrg8iqACFIb4qzg5tz4y8vNgmOKMnTXCwWDHjd+SoDdxiMlZJWT1hg==", + "version": "6.19.6", + "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-6.19.6.tgz", + "integrity": "sha512-QW9AFcPi0vLpkUhmquhhyhLaBvB0AZJuu3NTrE173qNKx3Z3n51aCLY9bc7c6i4ltZMMsVRHlvzQjsve04TC8A==", "dependencies": { "@babel/runtime": "^7.23.2", "@mui/base": "^5.0.0-beta.22", @@ -1592,14 +1588,19 @@ } } }, - "node_modules/@mui/x-date-pickers/node_modules/clsx": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz", - "integrity": "sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==", - "engines": { - "node": ">=6" + "node_modules/@nevware21/ts-async": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@nevware21/ts-async/-/ts-async-0.4.0.tgz", + "integrity": "sha512-dbV826TTehQIBIJjh8GDSbwn1Z6+cnkyNbRlpcpdBPH8mROD2zabIUKqWcw9WRdTjjUIm21K+OR4DXWlAyOVTQ==", + "dependencies": { + "@nevware21/ts-utils": ">= 0.10.0 < 2.x" } }, + "node_modules/@nevware21/ts-utils": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/@nevware21/ts-utils/-/ts-utils-0.10.5.tgz", + "integrity": "sha512-+TEvP0+l/VBR5bJZoYFV+o6aQQ1O6y80uys5AVyyCKeWvrgWu/yNydqSBQNsk4BuEfkayg7R9+HCJRRRIvptTA==" + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -1653,17 +1654,187 @@ } }, "node_modules/@remix-run/router": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.15.1.tgz", - "integrity": "sha512-zcU0gM3z+3iqj8UX45AmWY810l3oUmXM7uH4dt5xtzvMhRtYVhKGOmgOd1877dOPPepfCjUv57w+syamWIYe7w==", + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.15.3.tgz", + "integrity": "sha512-Oy8rmScVrVxWZVOpEF57ovlnhpZ8CCPlnIIumVcV9nFdiSIrus99+Lw78ekXyGvVDlIsFJbSfmSovJUhCWYV3w==", "engines": { "node": ">=14.0.0" } }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.12.1.tgz", + "integrity": "sha512-iU2Sya8hNn1LhsYyf0N+L4Gf9Qc+9eBTJJJsaOGUp+7x4n2M9dxTt8UvhJl3oeftSjblSlpCfvjA/IfP3g5VjQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.12.1.tgz", + "integrity": "sha512-wlzcWiH2Ir7rdMELxFE5vuM7D6TsOcJ2Yw0c3vaBR3VOsJFVTx9xvwnAvhgU5Ii8Gd6+I11qNHwndDscIm0HXg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.12.1.tgz", + "integrity": "sha512-YRXa1+aZIFN5BaImK+84B3uNK8C6+ynKLPgvn29X9s0LTVCByp54TB7tdSMHDR7GTV39bz1lOmlLDuedgTwwHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.12.1.tgz", + "integrity": "sha512-opjWJ4MevxeA8FhlngQWPBOvVWYNPFkq6/25rGgG+KOy0r8clYwL1CFd+PGwRqqMFVQ4/Qd3sQu5t7ucP7C/Uw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.12.1.tgz", + "integrity": "sha512-uBkwaI+gBUlIe+EfbNnY5xNyXuhZbDSx2nzzW8tRMjUmpScd6lCQYKY2V9BATHtv5Ef2OBq6SChEP8h+/cxifQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.12.1.tgz", + "integrity": "sha512-0bK9aG1kIg0Su7OcFTlexkVeNZ5IzEsnz1ept87a0TUgZ6HplSgkJAnFpEVRW7GRcikT4GlPV0pbtVedOaXHQQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.12.1.tgz", + "integrity": "sha512-qB6AFRXuP8bdkBI4D7UPUbE7OQf7u5OL+R94JE42Z2Qjmyj74FtDdLGeriRyBDhm4rQSvqAGCGC01b8Fu2LthQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.12.1.tgz", + "integrity": "sha512-sHig3LaGlpNgDj5o8uPEoGs98RII8HpNIqFtAI8/pYABO8i0nb1QzT0JDoXF/pxzqO+FkxvwkHZo9k0NJYDedg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.12.1.tgz", + "integrity": "sha512-nD3YcUv6jBJbBNFvSbp0IV66+ba/1teuBcu+fBBPZ33sidxitc6ErhON3JNavaH8HlswhWMC3s5rgZpM4MtPqQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.12.1.tgz", + "integrity": "sha512-7/XVZqgBby2qp/cO0TQ8uJK+9xnSdJ9ct6gSDdEr4MfABrjTyrW6Bau7HQ73a2a5tPB7hno49A0y1jhWGDN9OQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.12.1.tgz", + "integrity": "sha512-CYc64bnICG42UPL7TrhIwsJW4QcKkIt9gGlj21gq3VV0LL6XNb1yAdHVp1pIi9gkts9gGcT3OfUYHjGP7ETAiw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.12.1.tgz", + "integrity": "sha512-LN+vnlZ9g0qlHGlS920GR4zFCqAwbv2lULrR29yGaWP9u7wF5L7GqWu9Ah6/kFZPXPUkpdZwd//TNR+9XC9hvA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.12.1.tgz", + "integrity": "sha512-n+vkrSyphvmU0qkQ6QBNXCGr2mKjhP08mPRM/Xp5Ck2FV4NrHU+y6axzDeixUrCBHVUS51TZhjqrKBBsHLKb2Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@sinclair/typebox": { "version": "0.25.24", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", - "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==" + "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==", + "devOptional": true }, "node_modules/@socket.io/component-emitter": { "version": "3.1.0", @@ -1900,24 +2071,47 @@ } }, "node_modules/@testing-library/jest-dom": { - "version": "5.17.0", - "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.17.0.tgz", - "integrity": "sha512-ynmNeT7asXyH3aSVv4vvX4Rb+0qjOhdNHnO/3vuZNqPmhDpV/+rCSGwQ7bLcmU2cJ4dvoheIO85LQj0IbJHEtg==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.4.2.tgz", + "integrity": "sha512-CzqH0AFymEMG48CpzXFriYYkOjk6ZGPCLMhW9e9jg3KMCn5OfJecF8GtGW7yGfR/IgCe3SX8BSwjdzI6BBbZLw==", "dependencies": { - "@adobe/css-tools": "^4.0.1", + "@adobe/css-tools": "^4.3.2", "@babel/runtime": "^7.9.2", - "@types/testing-library__jest-dom": "^5.9.1", "aria-query": "^5.0.0", "chalk": "^3.0.0", "css.escape": "^1.5.1", - "dom-accessibility-api": "^0.5.6", + "dom-accessibility-api": "^0.6.3", "lodash": "^4.17.15", "redent": "^3.0.0" }, "engines": { - "node": ">=8", + "node": ">=14", "npm": ">=6", "yarn": ">=1" + }, + "peerDependencies": { + "@jest/globals": ">= 28", + "@types/bun": "latest", + "@types/jest": ">= 28", + "jest": ">= 28", + "vitest": ">= 0.32" + }, + "peerDependenciesMeta": { + "@jest/globals": { + "optional": true + }, + "@types/bun": { + "optional": true + }, + "@types/jest": { + "optional": true + }, + "jest": { + "optional": true + }, + "vitest": { + "optional": true + } } }, "node_modules/@testing-library/jest-dom/node_modules/chalk": { @@ -1932,6 +2126,11 @@ "node": ">=8" } }, + "node_modules/@testing-library/jest-dom/node_modules/dom-accessibility-api": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", + "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==" + }, "node_modules/@testing-library/react": { "version": "14.2.1", "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-14.2.1.tgz", @@ -1981,6 +2180,12 @@ "@types/node": "*" } }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, "node_modules/@types/history": { "version": "4.7.11", "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", @@ -1990,12 +2195,14 @@ "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==" + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "devOptional": true }, "node_modules/@types/istanbul-lib-report": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "devOptional": true, "dependencies": { "@types/istanbul-lib-coverage": "*" } @@ -2004,6 +2211,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "devOptional": true, "dependencies": { "@types/istanbul-lib-report": "*" } @@ -2012,6 +2220,7 @@ "version": "29.5.12", "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.12.tgz", "integrity": "sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==", + "devOptional": true, "dependencies": { "expect": "^29.0.0", "pretty-format": "^29.0.0" @@ -2021,6 +2230,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "devOptional": true, "engines": { "node": ">=10" }, @@ -2032,6 +2242,7 @@ "version": "29.5.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "devOptional": true, "dependencies": { "@jest/schemas": "^29.4.3", "ansi-styles": "^5.0.0", @@ -2048,9 +2259,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "18.19.18", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.18.tgz", - "integrity": "sha512-80CP7B8y4PzZF0GWx15/gVWRrB5y/bIjNI84NK3cmQJu0WZwvmj2WMA5LcofQFVfLqqCSp545+U2LsrVzX36Zg==", + "version": "20.11.25", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.25.tgz", + "integrity": "sha512-TBHyJxk2b7HceLVGFcpAUjsa5zIdsPWlR6XHfyGzd0SFu+/NFgQgMAl96MSDZgQDvJAvV6BKsFOrt6zIL09JDw==", "dependencies": { "undici-types": "~5.26.4" } @@ -2088,9 +2299,9 @@ "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==" }, "node_modules/@types/react": { - "version": "18.2.60", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.60.tgz", - "integrity": "sha512-dfiPj9+k20jJrLGOu9Nf6eqxm2EyJRrq2NvwOFsfbb7sFExZ9WELPs67UImHj3Ayxg8ruTtKtNnbjaF8olPq0A==", + "version": "18.2.64", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.64.tgz", + "integrity": "sha512-MlmPvHgjj2p3vZaxbQgFUQFvD8QiZwACfGqEdDSWou5yISWxDQ4/74nCAwsUiX7UFLKZz3BbVSPj+YxeoGGCfg==", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -2098,9 +2309,9 @@ } }, "node_modules/@types/react-dom": { - "version": "18.2.19", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.19.tgz", - "integrity": "sha512-aZvQL6uUbIJpjZk4U8JZGbau9KDeAwMfmhyWorxgBkqDIEf6ROjRozcmPIicqsUwPUjbkDfHKgGee1Lq65APcA==", + "version": "18.2.21", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.21.tgz", + "integrity": "sha512-gnvBA/21SA4xxqNXEwNiVcP0xSGHh/gi1VhWv9Bl46a0ItbTT5nFY+G9VSQpaG/8N/qdJpJ+vftQ4zflTtnjLw==", "dependencies": { "@types/react": "*" } @@ -2148,15 +2359,8 @@ "node_modules/@types/stack-utils": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", - "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==" - }, - "node_modules/@types/testing-library__jest-dom": { - "version": "5.14.5", - "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.5.tgz", - "integrity": "sha512-SBwbxYoyPIvxHbeHxTZX2Pe/74F/tX2/D3mMvzabdeJ25bBojfW0TyB8BHrbq/9zaaKICJZjLP+8r6AeZMFCuQ==", - "dependencies": { - "@types/jest": "*" - } + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", + "devOptional": true }, "node_modules/@types/tunnel": { "version": "0.0.3", @@ -2170,6 +2374,7 @@ "version": "17.0.24", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", + "devOptional": true, "dependencies": { "@types/yargs-parser": "*" } @@ -2177,35 +2382,37 @@ "node_modules/@types/yargs-parser": { "version": "21.0.0", "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==" + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", + "devOptional": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", - "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.1.1.tgz", + "integrity": "sha512-zioDz623d0RHNhvx0eesUmGfIjzrk18nSBC8xewepKXbBvN/7c1qImV7Hg8TI1URTxKax7/zxfxj3Uph8Chcuw==", "dev": true, "dependencies": { - "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/type-utils": "5.62.0", - "@typescript-eslint/utils": "5.62.0", + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "7.1.1", + "@typescript-eslint/type-utils": "7.1.1", + "@typescript-eslint/utils": "7.1.1", + "@typescript-eslint/visitor-keys": "7.1.1", "debug": "^4.3.4", "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "@typescript-eslint/parser": "^7.0.0", + "eslint": "^8.56.0" }, "peerDependenciesMeta": { "typescript": { @@ -2214,25 +2421,26 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", - "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.1.1.tgz", + "integrity": "sha512-ZWUFyL0z04R1nAEgr9e79YtV5LbafdOtN7yapNbn1ansMyaegl2D4bL7vHoJ4HPSc4CaLwuCVas8CVuneKzplQ==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", + "@typescript-eslint/scope-manager": "7.1.1", + "@typescript-eslint/types": "7.1.1", + "@typescript-eslint/typescript-estree": "7.1.1", + "@typescript-eslint/visitor-keys": "7.1.1", "debug": "^4.3.4" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "eslint": "^8.56.0" }, "peerDependenciesMeta": { "typescript": { @@ -2241,16 +2449,16 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", - "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.1.1.tgz", + "integrity": "sha512-cirZpA8bJMRb4WZ+rO6+mnOJrGFDd38WoXCEI57+CYBqta8Yc8aJym2i7vyqLL1vVYljgw0X27axkUXz32T8TA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" + "@typescript-eslint/types": "7.1.1", + "@typescript-eslint/visitor-keys": "7.1.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -2258,25 +2466,25 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", - "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.1.1.tgz", + "integrity": "sha512-5r4RKze6XHEEhlZnJtR3GYeCh1IueUHdbrukV2KSlLXaTjuSfeVF8mZUVPLovidCuZfbVjfhi4c0DNSa/Rdg5g==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.62.0", - "@typescript-eslint/utils": "5.62.0", + "@typescript-eslint/typescript-estree": "7.1.1", + "@typescript-eslint/utils": "7.1.1", "debug": "^4.3.4", - "tsutils": "^3.21.0" + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "*" + "eslint": "^8.56.0" }, "peerDependenciesMeta": { "typescript": { @@ -2285,12 +2493,12 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", - "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.1.1.tgz", + "integrity": "sha512-KhewzrlRMrgeKm1U9bh2z5aoL4s7K3tK5DwHDn8MHv0yQfWFz/0ZR6trrIHHa5CsF83j/GgHqzdbzCXJ3crx0Q==", "dev": true, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -2298,21 +2506,22 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", - "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.1.1.tgz", + "integrity": "sha512-9ZOncVSfr+sMXVxxca2OJOPagRwT0u/UHikM2Rd6L/aB+kL/QAuTnsv6MeXtjzCJYb8PzrXarypSGIPx3Jemxw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0", + "@typescript-eslint/types": "7.1.1", + "@typescript-eslint/visitor-keys": "7.1.1", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -2324,43 +2533,66 @@ } } }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@typescript-eslint/utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", - "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.1.1.tgz", + "integrity": "sha512-thOXM89xA03xAE0lW7alstvnyoBUbBX38YtY+zAUcpRPcq9EIhXPuJ0YTv948MbzmKh6e1AUszn5cBFK49Umqg==", "dev": true, "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "7.1.1", + "@typescript-eslint/types": "7.1.1", + "@typescript-eslint/typescript-estree": "7.1.1", + "semver": "^7.5.4" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "eslint": "^8.56.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.1.1.tgz", + "integrity": "sha512-yTdHDQxY7cSoCcAtiBzVzxleJhkGB9NncSIyMYe2+OGON1ZsP9zOPws/Pqgopa65jvknOjlk/w7ulPlZ78PiLQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" + "@typescript-eslint/types": "7.1.1", + "eslint-visitor-keys": "^3.4.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -2701,6 +2933,7 @@ "version": "3.8.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", + "devOptional": true, "funding": [ { "type": "github", @@ -2723,9 +2956,9 @@ } }, "node_modules/clsx": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", - "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz", + "integrity": "sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==", "engines": { "node": ">=6" } @@ -2874,18 +3107,12 @@ "peer": true }, "node_modules/date-fns": { - "version": "2.30.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", - "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", - "dependencies": { - "@babel/runtime": "^7.21.0" - }, - "engines": { - "node": ">=0.11" - }, + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.3.1.tgz", + "integrity": "sha512-y8e109LYGgoQDveiEBD3DYXKba1jWf5BA8YU1FL5Tvm0BTdEfy54WLCwnuYWZNnzzvALy/QQ4Hov+Q9RVRv+Zw==", "funding": { - "type": "opencollective", - "url": "https://opencollective.com/date-fns" + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" } }, "node_modules/date-format": { @@ -2990,9 +3217,9 @@ } }, "node_modules/dexie": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/dexie/-/dexie-3.2.5.tgz", - "integrity": "sha512-MA7vYQvXxWN2+G50D0GLS4FqdYUyRYQsN0FikZIVebOmRoNCSCL9+eUbIF80dqrfns3kmY+83+hE2GN9CnAGyA==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/dexie/-/dexie-3.2.6.tgz", + "integrity": "sha512-R9VzQ27/cncQymoAeD1kfu66NUrdxcnMNXVfEoFLnQ+apVVbS4++veUcSGxft9V++zaeiLkMAREOMf8EwgR/Vw==", "dependencies": { "karma-safari-launcher": "^1.0.0" }, @@ -3020,6 +3247,7 @@ "version": "29.4.3", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz", "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==", + "devOptional": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } @@ -3159,9 +3387,9 @@ } }, "node_modules/esbuild": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", - "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", + "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", "dev": true, "hasInstallScript": true, "bin": { @@ -3171,28 +3399,29 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/android-arm": "0.18.20", - "@esbuild/android-arm64": "0.18.20", - "@esbuild/android-x64": "0.18.20", - "@esbuild/darwin-arm64": "0.18.20", - "@esbuild/darwin-x64": "0.18.20", - "@esbuild/freebsd-arm64": "0.18.20", - "@esbuild/freebsd-x64": "0.18.20", - "@esbuild/linux-arm": "0.18.20", - "@esbuild/linux-arm64": "0.18.20", - "@esbuild/linux-ia32": "0.18.20", - "@esbuild/linux-loong64": "0.18.20", - "@esbuild/linux-mips64el": "0.18.20", - "@esbuild/linux-ppc64": "0.18.20", - "@esbuild/linux-riscv64": "0.18.20", - "@esbuild/linux-s390x": "0.18.20", - "@esbuild/linux-x64": "0.18.20", - "@esbuild/netbsd-x64": "0.18.20", - "@esbuild/openbsd-x64": "0.18.20", - "@esbuild/sunos-x64": "0.18.20", - "@esbuild/win32-arm64": "0.18.20", - "@esbuild/win32-ia32": "0.18.20", - "@esbuild/win32-x64": "0.18.20" + "@esbuild/aix-ppc64": "0.19.12", + "@esbuild/android-arm": "0.19.12", + "@esbuild/android-arm64": "0.19.12", + "@esbuild/android-x64": "0.19.12", + "@esbuild/darwin-arm64": "0.19.12", + "@esbuild/darwin-x64": "0.19.12", + "@esbuild/freebsd-arm64": "0.19.12", + "@esbuild/freebsd-x64": "0.19.12", + "@esbuild/linux-arm": "0.19.12", + "@esbuild/linux-arm64": "0.19.12", + "@esbuild/linux-ia32": "0.19.12", + "@esbuild/linux-loong64": "0.19.12", + "@esbuild/linux-mips64el": "0.19.12", + "@esbuild/linux-ppc64": "0.19.12", + "@esbuild/linux-riscv64": "0.19.12", + "@esbuild/linux-s390x": "0.19.12", + "@esbuild/linux-x64": "0.19.12", + "@esbuild/netbsd-x64": "0.19.12", + "@esbuild/openbsd-x64": "0.19.12", + "@esbuild/sunos-x64": "0.19.12", + "@esbuild/win32-arm64": "0.19.12", + "@esbuild/win32-ia32": "0.19.12", + "@esbuild/win32-x64": "0.19.12" } }, "node_modules/escalade": { @@ -3289,27 +3518,14 @@ } }, "node_modules/eslint-plugin-react-refresh": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.3.5.tgz", - "integrity": "sha512-61qNIsc7fo9Pp/mju0J83kzvLm0Bsayu7OQSLEoJxLDCBjIIyb87bkzufoOvdDxLkSlMfkF7UxomC4+eztUBSA==", + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.5.tgz", + "integrity": "sha512-D53FYKJa+fDmZMtriODxvhwrO+IOqrxoEo21gMA0sjHdU6dPVH4OhyFip9ypl8HOF5RV5KdTo+rBQLvnY2cO8w==", "dev": true, "peerDependencies": { "eslint": ">=7" } }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, "node_modules/eslint-visitor-keys": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", @@ -3406,15 +3622,6 @@ "node": ">=4.0" } }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", @@ -3442,6 +3649,7 @@ "version": "29.5.0", "resolved": "https://registry.npmjs.org/expect/-/expect-29.5.0.tgz", "integrity": "sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg==", + "devOptional": true, "dependencies": { "@jest/expect-utils": "^29.5.0", "jest-get-type": "^29.4.3", @@ -4327,6 +4535,7 @@ "version": "29.5.0", "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.5.0.tgz", "integrity": "sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw==", + "devOptional": true, "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^29.4.3", @@ -4341,6 +4550,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "devOptional": true, "engines": { "node": ">=10" }, @@ -4352,6 +4562,7 @@ "version": "29.5.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "devOptional": true, "dependencies": { "@jest/schemas": "^29.4.3", "ansi-styles": "^5.0.0", @@ -4365,6 +4576,7 @@ "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz", "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==", + "devOptional": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } @@ -4373,6 +4585,7 @@ "version": "29.5.0", "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz", "integrity": "sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw==", + "devOptional": true, "dependencies": { "chalk": "^4.0.0", "jest-diff": "^29.5.0", @@ -4387,6 +4600,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "devOptional": true, "engines": { "node": ">=10" }, @@ -4398,6 +4612,7 @@ "version": "29.5.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "devOptional": true, "dependencies": { "@jest/schemas": "^29.4.3", "ansi-styles": "^5.0.0", @@ -4411,6 +4626,7 @@ "version": "29.5.0", "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.5.0.tgz", "integrity": "sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA==", + "devOptional": true, "dependencies": { "@babel/code-frame": "^7.12.13", "@jest/types": "^29.5.0", @@ -4430,6 +4646,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "devOptional": true, "engines": { "node": ">=10" }, @@ -4441,6 +4658,7 @@ "version": "29.5.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "devOptional": true, "dependencies": { "@jest/schemas": "^29.4.3", "ansi-styles": "^5.0.0", @@ -4454,6 +4672,7 @@ "version": "29.5.0", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.5.0.tgz", "integrity": "sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ==", + "devOptional": true, "dependencies": { "@jest/types": "^29.5.0", "@types/node": "*", @@ -4677,6 +4896,7 @@ "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "devOptional": true, "dependencies": { "braces": "^3.0.2", "picomatch": "^2.3.1" @@ -4762,9 +4982,9 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", "dev": true, "funding": [ { @@ -4785,12 +5005,6 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, - "node_modules/natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", - "dev": true - }, "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -5045,9 +5259,9 @@ } }, "node_modules/postcss": { - "version": "8.4.31", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", - "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "version": "8.4.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz", + "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==", "dev": true, "funding": [ { @@ -5064,7 +5278,7 @@ } ], "dependencies": { - "nanoid": "^3.3.6", + "nanoid": "^3.3.7", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" }, @@ -5248,11 +5462,11 @@ "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" }, "node_modules/react-router": { - "version": "6.22.1", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.22.1.tgz", - "integrity": "sha512-0pdoRGwLtemnJqn1K0XHUbnKiX0S4X8CgvVVmHGOWmofESj31msHo/1YiqcJWK7Wxfq2a4uvvtS01KAQyWK/CQ==", + "version": "6.22.3", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.22.3.tgz", + "integrity": "sha512-dr2eb3Mj5zK2YISHK++foM9w4eBnO23eKnZEDs7c880P6oKbrjz/Svg9+nxqtHQK+oMW4OtjZca0RqPglXxguQ==", "dependencies": { - "@remix-run/router": "1.15.1" + "@remix-run/router": "1.15.3" }, "engines": { "node": ">=14.0.0" @@ -5262,12 +5476,12 @@ } }, "node_modules/react-router-dom": { - "version": "6.22.1", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.22.1.tgz", - "integrity": "sha512-iwMyyyrbL7zkKY7MRjOVRy+TMnS/OPusaFVxM2P11x9dzSzGmLsebkCvYirGq0DWB9K9hOspHYYtDz33gE5Duw==", + "version": "6.22.3", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.22.3.tgz", + "integrity": "sha512-7ZILI7HjcE+p31oQvwbokjk6OA/bnFxrhJ19n82Ex9Ph8fNAq+Hm/7KchpMGlTgWhUxRHMMCut+vEtNpWpowKw==", "dependencies": { - "@remix-run/router": "1.15.1", - "react-router": "6.22.1" + "@remix-run/router": "1.15.3", + "react-router": "6.22.3" }, "engines": { "node": ">=14.0.0" @@ -5426,18 +5640,34 @@ } }, "node_modules/rollup": { - "version": "3.29.4", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", - "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.12.1.tgz", + "integrity": "sha512-ggqQKvx/PsB0FaWXhIvVkSWh7a/PCLQAsMjBc+nA2M8Rv2/HG0X6zvixAB7KyZBRtifBUhy5k8voQX/mRnABPg==", "dev": true, + "dependencies": { + "@types/estree": "1.0.5" + }, "bin": { "rollup": "dist/bin/rollup" }, "engines": { - "node": ">=14.18.0", + "node": ">=18.0.0", "npm": ">=8.0.0" }, "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.12.1", + "@rollup/rollup-android-arm64": "4.12.1", + "@rollup/rollup-darwin-arm64": "4.12.1", + "@rollup/rollup-darwin-x64": "4.12.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.12.1", + "@rollup/rollup-linux-arm64-gnu": "4.12.1", + "@rollup/rollup-linux-arm64-musl": "4.12.1", + "@rollup/rollup-linux-riscv64-gnu": "4.12.1", + "@rollup/rollup-linux-x64-gnu": "4.12.1", + "@rollup/rollup-linux-x64-musl": "4.12.1", + "@rollup/rollup-win32-arm64-msvc": "4.12.1", + "@rollup/rollup-win32-ia32-msvc": "4.12.1", + "@rollup/rollup-win32-x64-msvc": "4.12.1", "fsevents": "~2.3.2" } }, @@ -5484,9 +5714,9 @@ } }, "node_modules/semver": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", - "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -5542,6 +5772,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "devOptional": true, "engines": { "node": ">=8" } @@ -5608,6 +5839,7 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "devOptional": true, "dependencies": { "escape-string-regexp": "^2.0.0" }, @@ -5619,6 +5851,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "devOptional": true, "engines": { "node": ">=8" } @@ -5783,31 +6016,22 @@ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, - "node_modules/tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" - }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "node_modules/ts-api-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, "engines": { - "node": ">= 6" + "node": ">=16" }, "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + "typescript": ">=4.2.0" } }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true + "node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" }, "node_modules/tunnel": { "version": "0.0.6", @@ -5855,16 +6079,16 @@ } }, "node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.2.tgz", + "integrity": "sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==", "dev": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { - "node": ">=4.2.0" + "node": ">=14.17" } }, "node_modules/ua-parser-js": { @@ -5949,29 +6173,29 @@ } }, "node_modules/vite": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.2.tgz", - "integrity": "sha512-tBCZBNSBbHQkaGyhGCDUGqeo2ph8Fstyp6FMSvTtsXeZSPpSMGlviAOav2hxVTqFcx8Hj/twtWKsMJXNY0xI8w==", + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.1.5.tgz", + "integrity": "sha512-BdN1xh0Of/oQafhU+FvopafUp6WaYenLU/NFoL5WyJL++GxkNfieKzBhM24H3HVsPQrlAqB7iJYTHabzaRed5Q==", "dev": true, "dependencies": { - "esbuild": "^0.18.10", - "postcss": "^8.4.27", - "rollup": "^3.27.1" + "esbuild": "^0.19.3", + "postcss": "^8.4.35", + "rollup": "^4.2.0" }, "bin": { "vite": "bin/vite.js" }, "engines": { - "node": "^14.18.0 || >=16.0.0" + "node": "^18.0.0 || >=20.0.0" }, "funding": { "url": "https://github.com/vitejs/vite?sponsor=1" }, "optionalDependencies": { - "fsevents": "~2.3.2" + "fsevents": "~2.3.3" }, "peerDependencies": { - "@types/node": ">= 14", + "@types/node": "^18.0.0 || >=20.0.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", diff --git a/src/caretogether-pwa/package.json b/src/caretogether-pwa/package.json index a7a6b5c2..bd1b7f22 100644 --- a/src/caretogether-pwa/package.json +++ b/src/caretogether-pwa/package.json @@ -2,49 +2,50 @@ "name": "caretogether-pwa", "version": "0.1.0", "private": true, + "type": "module", "dependencies": { - "@azure/msal-browser": "^2.38.3", + "@azure/msal-browser": "^3.10.0", "@azure/storage-blob": "^12.17.0", - "@date-io/date-fns": "^2.17.0", + "@date-io/date-fns": "^3.0.0", "@emotion/react": "^11.11.4", "@emotion/styled": "^11.11.0", "@fullcalendar/core": "^6.1.11", "@fullcalendar/daygrid": "^6.1.11", "@fullcalendar/list": "^6.1.11", "@fullcalendar/react": "^6.1.11", - "@microsoft/applicationinsights-react-js": "^3.4.3", - "@microsoft/applicationinsights-web": "^2.8.17", - "@mui/icons-material": "^5.15.11", - "@mui/lab": "5.0.0-alpha.128", - "@mui/material": "^5.15.11", - "@mui/system": "^5.15.11", - "@mui/x-date-pickers": "^6.19.5", - "@testing-library/jest-dom": "^5.17.0", + "@microsoft/applicationinsights-react-js": "^17.1.0", + "@microsoft/applicationinsights-web": "^3.1.0", + "@mui/icons-material": "^5.15.12", + "@mui/lab": "5.0.0-alpha.167", + "@mui/material": "^5.15.12", + "@mui/system": "^5.15.12", + "@mui/x-date-pickers": "^6.19.6", + "@testing-library/jest-dom": "^6.4.2", "@testing-library/react": "^14.2.1", "@testing-library/user-event": "^14.5.2", - "date-fns": "^2.30.0", - "dexie": "^3.2.5", + "date-fns": "^3.3.1", + "dexie": "^3.2.6", "dexie-react-hooks": "^1.1.7", "react": "^18.2.0", "react-dom": "^18.2.0", - "react-router-dom": "^6.22.1", + "react-router-dom": "^6.22.3", "recoil": "^0.7.7", "web-vitals": "^3.5.2" }, "devDependencies": { "@types/jest": "^29.5.12", - "@types/node": "^18.19.18", - "@types/react": "^18.2.60", - "@types/react-dom": "^18.2.19", + "@types/node": "^20.11.25", + "@types/react": "^18.2.64", + "@types/react-dom": "^18.2.21", "@types/react-router-dom": "^5.3.3", - "@typescript-eslint/eslint-plugin": "^5.62.0", - "@typescript-eslint/parser": "^5.62.0", + "@typescript-eslint/eslint-plugin": "^7.1.1", + "@typescript-eslint/parser": "^7.1.1", "@vitejs/plugin-react-swc": "^3.6.0", "eslint": "^8.57.0", "eslint-plugin-react-hooks": "^4.6.0", - "eslint-plugin-react-refresh": "^0.3.5", - "typescript": "^4.9.5", - "vite": "^4.5.2" + "eslint-plugin-react-refresh": "^0.4.5", + "typescript": "^5.4.2", + "vite": "^5.1.5" }, "scripts": { "dev": "vite", diff --git a/src/caretogether-pwa/src/Activities/ActivityTimeline.tsx b/src/caretogether-pwa/src/Activities/ActivityTimeline.tsx index b700dffc..6ad61161 100644 --- a/src/caretogether-pwa/src/Activities/ActivityTimeline.tsx +++ b/src/caretogether-pwa/src/Activities/ActivityTimeline.tsx @@ -18,7 +18,7 @@ export function ActivityTimeline({ family }: ActivityTimelineProps) { const activities = (family.partneringFamilyInfo?.history?.slice() || []).concat( family.volunteerFamilyInfo?.history?.slice() || []); - + const unmatchedNotesAsActivities = family.notes?.filter(note => activities?.every(a => a.noteId !== note.id))?.map(note => ({ @@ -64,41 +64,41 @@ export function ActivityTimeline({ family }: ActivityTimelineProps) { sx={{ padding: 0 }}> {allActivitiesSorted?.map((activity, i) => - + - + {activity instanceof ReferralRequirementCompleted || activity instanceof ArrangementRequirementCompleted ? "โœ”" : activity instanceof ChildLocationChanged - ? - : } + ? + : } {i < allActivitiesSorted.length - 1 && } - - - {format(activity.activityTimestampUtc!, "M/d/yy h:mm a")} + + + {format(activity.activityTimestampUtc!, "M/d/yy h:mm a")} {activity instanceof ReferralRequirementCompleted || activity instanceof ArrangementRequirementCompleted ? activity.requirementName : activity instanceof ChildLocationChanged - ? <> + ? <> ({activity.plan === ChildLocationPlan.DaytimeChildCare ? "daytime" : activity.plan === ChildLocationPlan.OvernightHousing - ? "overnight" - : "parent"}) - + ? "overnight" + : "parent"}) + - : activity instanceof ReferralOpened - ? "Referral opened" - : null} + : activity instanceof ReferralOpened + ? "Referral opened" + : null} {activity.uploadedDocumentId && - + ๐Ÿ“ƒ {documentLookup(activity.uploadedDocumentId)?.uploadedFileName} } {activity.noteId && } diff --git a/src/caretogether-pwa/src/AppRoutes.tsx b/src/caretogether-pwa/src/AppRoutes.tsx index 4e3ec21f..7886895b 100644 --- a/src/caretogether-pwa/src/AppRoutes.tsx +++ b/src/caretogether-pwa/src/AppRoutes.tsx @@ -32,8 +32,8 @@ function RouteMigrator() { roles: loc.roles })) })))}`); - - const [lastVisitedLocation, _] = useLocalStorage(LAST_VISITED_LOCATION, null); + + const [lastVisitedLocation,] = useLocalStorage(LAST_VISITED_LOCATION, null); trace(`lastVisitedLocation contents: ${JSON.stringify(lastVisitedLocation)}`); useEffect(() => { @@ -42,7 +42,7 @@ function RouteMigrator() { } let migrationTargetContext: LocationContext | null = null; - + if (lastVisitedLocation) { migrationTargetContext = lastVisitedLocation; } else { @@ -53,7 +53,7 @@ function RouteMigrator() { ? { organizationId: firstOrganization.organizationId!, locationId: firstLocation.locationId! } : null; } - + if (migrationTargetContext != null) { //TODO: Only do this if the old path is a valid/migrate-able path to begin with. const target = `/org/${migrationTargetContext.organizationId}/${migrationTargetContext.locationId}${location.pathname}` + @@ -85,9 +85,9 @@ function RouteError(): React.ReactElement { function LocationContextWrapper() { const trace = useScopedTrace("LocationContext"); const { organizationId, locationId } = useParams<{ organizationId: string, locationId: string }>(); - + const [selectedLocationContext, setSelectedLocationContext] = useRecoilStateLoadable(selectedLocationContextState); - const [_, setLastVisitedLocation] = useLocalStorage(LAST_VISITED_LOCATION, null); + const [, setLastVisitedLocation] = useLocalStorage(LAST_VISITED_LOCATION, null); // We only need to change this on first load or when the location context actually changes. useEffect(() => { @@ -101,17 +101,18 @@ function LocationContextWrapper() { `organizationId: '${organizationId}'` + `locationId: '${locationId}'`); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [organizationId, locationId, trace, setSelectedLocationContext]); - + return ( // We need to wait for this to have a value before rendering the child tree; otherwise, // the tree will suspend as soon as a data dependency on selectedLocationContextState is encountered, and // the effect above (that actually sets the selectedLocationContextState) will not fire. (selectedLocationContext.state === "hasValue" && - // As an added benefit, we can also use this component to show the spinner when switching locations. + // As an added benefit, we can also use this component to show the spinner when switching locations. selectedLocationContext.contents.organizationId === organizationId && selectedLocationContext.contents.locationId === locationId) - ? + ? } /> } /> @@ -122,7 +123,7 @@ function LocationContextWrapper() { } /> - : + :

Setting location...

); diff --git a/src/caretogether-pwa/src/ApplicationInsightsService.tsx b/src/caretogether-pwa/src/ApplicationInsightsService.tsx index 48eae549..f2bba6a4 100644 --- a/src/caretogether-pwa/src/ApplicationInsightsService.tsx +++ b/src/caretogether-pwa/src/ApplicationInsightsService.tsx @@ -2,8 +2,8 @@ import { ApplicationInsights, ITelemetryItem } from '@microsoft/applicationinsig import { ReactPlugin } from '@microsoft/applicationinsights-react-js'; import { globalMsalInstance } from './Authentication/Auth'; -var aiReactPlugin = new ReactPlugin(); -var appInsights = new ApplicationInsights({ +const aiReactPlugin = new ReactPlugin(); +const appInsights = new ApplicationInsights({ config: { connectionString: import.meta.env.VITE_APP_APPINSIGHTS_CONNECTIONSTRING, enableAutoRouteTracking: true, diff --git a/src/caretogether-pwa/src/Authentication/Auth.ts b/src/caretogether-pwa/src/Authentication/Auth.ts index 82a84a41..cfbb0a41 100644 --- a/src/caretogether-pwa/src/Authentication/Auth.ts +++ b/src/caretogether-pwa/src/Authentication/Auth.ts @@ -9,7 +9,7 @@ const config = { auth: { clientId: import.meta.env.VITE_APP_AUTH_CLIENT_ID, authority: import.meta.env.VITE_APP_AUTH_AUTHORITY, - knownAuthorities: [ import.meta.env.VITE_APP_AUTH_KNOWN_AUTHORITY ], + knownAuthorities: [import.meta.env.VITE_APP_AUTH_KNOWN_AUTHORITY], redirectUri: import.meta.env.VITE_APP_AUTH_REDIRECT_URI }, cache: { @@ -82,7 +82,7 @@ async function loginAndSetActiveAccountAsync(): Promise { } } } - + // Step 5: If one or more accounts was found but no active account is set, set the active account. let activeAccount = globalMsalInstance.getActiveAccount(); trace(`Login`, `Active account is: ${activeAccount?.localAccountId}`); @@ -140,7 +140,7 @@ async function loginAndSetActiveAccountAsync(): Promise { } let userIdStateInitialized = false; -const initializeUserIdStateAsync: AtomEffect = params => { +const initializeUserIdStateAsync: AtomEffect = params => { trace(`InitializeUserIdStateAsync`, params.node.key); if (!userIdStateInitialized) { userIdStateInitialized = true; diff --git a/src/caretogether-pwa/src/Authentication/AuthenticationWrapper.tsx b/src/caretogether-pwa/src/Authentication/AuthenticationWrapper.tsx index f97cdce6..b69834a0 100644 --- a/src/caretogether-pwa/src/Authentication/AuthenticationWrapper.tsx +++ b/src/caretogether-pwa/src/Authentication/AuthenticationWrapper.tsx @@ -10,7 +10,7 @@ function AuthenticatedUserWrapper({ children }: React.PropsWithChildren) { // This will suspend until a user ID has been set by the `userIdState` initialization logic. const userId = useLoadable(userIdState); trace(`userId: ${userId}`); - + return ( <> {userId diff --git a/src/caretogether-pwa/src/Communities/AddMemberFamiliesForm.tsx b/src/caretogether-pwa/src/Communities/AddMemberFamiliesForm.tsx index 8757d48b..9f538f04 100644 --- a/src/caretogether-pwa/src/Communities/AddMemberFamiliesForm.tsx +++ b/src/caretogether-pwa/src/Communities/AddMemberFamiliesForm.tsx @@ -48,7 +48,7 @@ export function AddMemberFamiliesForm({ community, onClose }: AddMemberFamiliesF a.family!.primaryFamilyContactPersonId === adult.item1!.id)!.item1!; const bPrimaryContact = b.family!.adults!.find(adult => b.family!.primaryFamilyContactPersonId === adult.item1!.id)!.item1!; - + const aFirst = aPrimaryContact.firstName!; const aLast = aPrimaryContact.lastName!; const bFirst = bPrimaryContact.firstName!; @@ -57,7 +57,7 @@ export function AddMemberFamiliesForm({ community, onClose }: AddMemberFamiliesF // Sort by last name, then by first name (of the family's primary contact) return aLast < bLast ? -1 : aLast > bLast ? 1 : aFirst < bFirst ? -1 : aFirst > bFirst ? 1 : - 0; + 0; }).map(family => ({ id: family.family!.id!, label: familyNameString(family) @@ -69,10 +69,10 @@ export function AddMemberFamiliesForm({ community, onClose }: AddMemberFamiliesF

Add Member Families

- + { + onChange={(_event, newValue: CandidateFamily[]) => { setFamilies(newValue); }} options={candidateFamilies} diff --git a/src/caretogether-pwa/src/Communities/AddRoleAssignmentForm.tsx b/src/caretogether-pwa/src/Communities/AddRoleAssignmentForm.tsx index 3aa09130..d9021b47 100644 --- a/src/caretogether-pwa/src/Communities/AddRoleAssignmentForm.tsx +++ b/src/caretogether-pwa/src/Communities/AddRoleAssignmentForm.tsx @@ -44,19 +44,19 @@ export function AddRoleAssignmentForm({ community, onClose }: AddRoleAssignmentF const allFamilies = useRecoilValue(visibleFamiliesQuery); const allAdults = allFamilies.flatMap(family => family.family!.adults!.map(adult => adult.item1!)).sort((a, b) => { - const aFirst = a.firstName!; - const aLast = a.lastName!; - const bFirst = b.firstName!; - const bLast = b.lastName!; + const aFirst = a.firstName!; + const aLast = a.lastName!; + const bFirst = b.firstName!; + const bLast = b.lastName!; - // Sort by last name, then by first name - return aLast < bLast ? -1 : aLast > bLast ? 1 : - aFirst < bFirst ? -1 : aFirst > bFirst ? 1 : + // Sort by last name, then by first name + return aLast < bLast ? -1 : aLast > bLast ? 1 : + aFirst < bFirst ? -1 : aFirst > bFirst ? 1 : 0; - }).map(person => ({ - id: person.id!, - label: personNameString(person) - } as CandidatePerson)); + }).map(person => ({ + id: person.id!, + label: personNameString(person) + } as CandidatePerson)); const organizationConfiguration = useRecoilValue(organizationConfigurationQuery); const communityRoles = organizationConfiguration?.communityRoles || []; @@ -70,10 +70,10 @@ export function AddRoleAssignmentForm({ community, onClose }: AddRoleAssignmentF

Add Community Role Assignments

- + { + onChange={(_event, newValue: CandidatePerson | null) => { setPerson(newValue); }} options={allAdults} @@ -88,7 +88,7 @@ export function AddRoleAssignmentForm({ community, onClose }: AddRoleAssignmentF setRole(newValue)} + onChange={(_event, newValue) => setRole(newValue)} > {communityRoles.map(role => -

Loading communities...

-
+

Loading communities...

+ : <> - - - - - - Name - - - Description - - - Member Families - - - Role Assigments - - - - - {communities.map(community => openCommunity(community)}> - - {community.name} - - - {community.description} - - - {community.memberFamilies?.length} - - - {community.communityRoleAssignments?.length} - - - )} - -
-
- {permissions(Permission.CreateCommunity) && - <> - + + + + + Name + + + Description + + + Member Families + + + Role Assigments + + + + + {communities.map(community => openCommunity(community)}> + + {community.name} + + + {community.description} + + + {community.memberFamilies?.length} + + + {community.communityRoleAssignments?.length} + + + )} + +
+ + {permissions(Permission.CreateCommunity) && + <> + setAddDrawerOpen(true)}> @@ -84,9 +84,9 @@ export function CommunitiesList() { anchor='right' open={addDrawerOpen} onClose={() => setAddDrawerOpen(false)} - sx={{ '.MuiDrawer-paper': { padding: 2, paddingTop: { xs: 7, sm: 8, md: 6 }}}}> + sx={{ '.MuiDrawer-paper': { padding: 2, paddingTop: { xs: 7, sm: 8, md: 6 } } }}> setAddDrawerOpen(false)} /> - } - ); + } + ); } diff --git a/src/caretogether-pwa/src/Communities/CommunityDocumentUploadForm.tsx b/src/caretogether-pwa/src/Communities/CommunityDocumentUploadForm.tsx index a040b5b8..c84a608e 100644 --- a/src/caretogether-pwa/src/Communities/CommunityDocumentUploadForm.tsx +++ b/src/caretogether-pwa/src/Communities/CommunityDocumentUploadForm.tsx @@ -16,7 +16,7 @@ interface CommunityDocumentUploadProps extends DrawerProps { export function CommunityDocumentUpload({ community, onClose }: CommunityDocumentUploadProps) { const [documentFiles, setDocumentFiles] = useState(null); const { organizationId, locationId } = useRecoilValue(selectedLocationContextState); - + const withBackdrop = useBackdrop(); const uploadCommunityDocument = useCommunityCommand((communityId, documentId: string, fileName: string) => { diff --git a/src/caretogether-pwa/src/Communities/CommunityDocuments.tsx b/src/caretogether-pwa/src/Communities/CommunityDocuments.tsx index 4e9bae1e..24ebdbb1 100644 --- a/src/caretogether-pwa/src/Communities/CommunityDocuments.tsx +++ b/src/caretogether-pwa/src/Communities/CommunityDocuments.tsx @@ -17,7 +17,7 @@ interface CommunityDocumentsProps { export function CommunityDocuments({ communityInfo }: CommunityDocumentsProps) { const permissions = useCommunityPermissions(communityInfo); const community = communityInfo.community!; - + const { organizationId, locationId } = useRecoilValue(selectedLocationContextState); const userLookup = useUserLookup(); @@ -52,35 +52,35 @@ export function CommunityDocuments({ communityInfo }: CommunityDocumentsProps) { const theme = useTheme(); return - {documents.map(doc => + {documents.map(doc => deleteDocument(doc.document)}> - - + color='primary' + onClick={() => deleteDocument(doc.document)}> + + : null}> {permissions(Permission.ReadCommunityDocuments) ? downloadDocument(doc.document)}> - - - - - - + onClick={() => downloadDocument(doc.document)}> + + + + + + : <> - - - - - - } + + + + + + } )} ; } diff --git a/src/caretogether-pwa/src/Communities/CommunityMemberFamilies.tsx b/src/caretogether-pwa/src/Communities/CommunityMemberFamilies.tsx index 1c60ee57..473eba66 100644 --- a/src/caretogether-pwa/src/Communities/CommunityMemberFamilies.tsx +++ b/src/caretogether-pwa/src/Communities/CommunityMemberFamilies.tsx @@ -22,12 +22,12 @@ export function CommunityMemberFamilies({ communityInfo }: CommunityMemberFamili const memberFamilies = (community?.memberFamilies || []).map(familyId => visibleFamilies.find(family => family.family?.id === familyId)).filter(family => - family).sort((a, b) => { - const aName = familyLastName(a!); - const bName = familyLastName(b!); - return aName?.localeCompare(bName, undefined, { sensitivity: 'base' }); - }) as CombinedFamilyInfo[]; - + family).sort((a, b) => { + const aName = familyLastName(a!); + const bName = familyLastName(b!); + return aName?.localeCompare(bName, undefined, { sensitivity: 'base' }); + }) as CombinedFamilyInfo[]; + const removeMemberFamily = useCommunityCommand((communityId, familyId: string) => { const command = new RemoveCommunityMemberFamily(); command.communityId = communityId; @@ -49,14 +49,14 @@ export function CommunityMemberFamilies({ communityInfo }: CommunityMemberFamili const appNavigate = useAppNavigate(); return - {memberFamilies.map(family => + {memberFamilies.map(family => remove(family)}> - - + color='primary' + onClick={() => remove(family)}> + + : null}> appNavigate.family(family.family!.id!)}> diff --git a/src/caretogether-pwa/src/Communities/CommunityRoleAssignments.tsx b/src/caretogether-pwa/src/Communities/CommunityRoleAssignments.tsx index 22eab310..d45ee393 100644 --- a/src/caretogether-pwa/src/Communities/CommunityRoleAssignments.tsx +++ b/src/caretogether-pwa/src/Communities/CommunityRoleAssignments.tsx @@ -45,14 +45,14 @@ export function CommunityRoleAssignments({ communityInfo }: CommunityRoleAssignm } return - {assignments.map(assignment => + {assignments.map(assignment => remove(assignment)}> - - + color='primary' + onClick={() => remove(assignment)}> + + : null}> -

Loading community...

- +

Loading community...

+ : - - {permissions(Permission.EditCommunity) && } - {/* {permissions(Permission.DeleteCommunity) && } + {/* {permissions(Permission.DeleteCommunity) && } */} - - - - - Description - {permissions(Permission.EditCommunity) && } - -

{community.description}

-
- - {permissions(Permission.ViewCommunityDocumentMetadata) && - <> - - Documents - {permissions(Permission.UploadCommunityDocuments) && } - - - } - - - - Member Families - {permissions(Permission.EditCommunityMemberFamilies) && } - - - - - - - Role Assignments - {permissions(Permission.EditCommunityRoleAssignments) && } - - - + + + + + Description + {permissions(Permission.EditCommunity) && } + +

{community.description}

+
+ + {permissions(Permission.ViewCommunityDocumentMetadata) && + <> + + Documents + {permissions(Permission.UploadCommunityDocuments) && } + + + } + + + + Member Families + {permissions(Permission.EditCommunityMemberFamilies) && } + + + + + + + Role Assignments + {permissions(Permission.EditCommunityRoleAssignments) && } + + - {permissions(Permission.EditCommunity) && editDrawer.drawerFor( - - )} - {permissions(Permission.UploadCommunityDocuments) && uploadDrawer.drawerFor( - - )} - {permissions(Permission.EditCommunityMemberFamilies) && addMemberFamilyDrawer.drawerFor( - - )} - {permissions(Permission.EditCommunityRoleAssignments) && addRoleAssignmentDrawer.drawerFor( - - )} - {/* {permissions(Permission.DeleteCommunity) && deleteCommunityDrawer.drawerFor( +
+ {permissions(Permission.EditCommunity) && editDrawer.drawerFor( + + )} + {permissions(Permission.UploadCommunityDocuments) && uploadDrawer.drawerFor( + + )} + {permissions(Permission.EditCommunityMemberFamilies) && addMemberFamilyDrawer.drawerFor( + + )} + {permissions(Permission.EditCommunityRoleAssignments) && addRoleAssignmentDrawer.drawerFor( + + )} + {/* {permissions(Permission.DeleteCommunity) && deleteCommunityDrawer.drawerFor( )} */} -
); + ); } diff --git a/src/caretogether-pwa/src/Dashboard/Dashboard.tsx b/src/caretogether-pwa/src/Dashboard/Dashboard.tsx index bf75521f..fdf36093 100644 --- a/src/caretogether-pwa/src/Dashboard/Dashboard.tsx +++ b/src/caretogether-pwa/src/Dashboard/Dashboard.tsx @@ -46,44 +46,44 @@ function Dashboard() { const allArrangements = (partneringFamilies || []).flatMap(family => (family.partneringFamilyInfo?.closedReferrals || []).concat(family.partneringFamilyInfo?.openReferral || []).flatMap(referral => referral.arrangements || []).map(arrangement => ({ arrangement, person: familyPerson(family, arrangement.partneringFamilyPersonId!) }))); - + const arrangementPlannedDurations = allArrangements.map(({ arrangement, person }) => ({ title: `${personNameString(person)} - ${arrangement.arrangementType}`, start: arrangement.plannedStartUtc && format(arrangement.plannedStartUtc, "yyyy-MM-dd"), end: arrangement.plannedEndUtc && format(arrangement.plannedEndUtc, "yyyy-MM-dd"), backgroundColor: 'lightblue' } as EventInput)) - - const arrangementActualStarts = allArrangements.filter(({arrangement}) => arrangement.startedAtUtc).map(({ arrangement, person }) => ({ + + const arrangementActualStarts = allArrangements.filter(({ arrangement }) => arrangement.startedAtUtc).map(({ arrangement, person }) => ({ title: `โ–ถ ${personNameString(person)} - ${arrangement.arrangementType}`, date: arrangement.startedAtUtc } as EventInput)); - - const arrangementActualEnds = allArrangements.filter(({arrangement}) => arrangement.endedAtUtc).map(({ arrangement, person }) => ({ + + const arrangementActualEnds = allArrangements.filter(({ arrangement }) => arrangement.endedAtUtc).map(({ arrangement, person }) => ({ title: `โน ${personNameString(person)} - ${arrangement.arrangementType}`, date: arrangement.endedAtUtc } as EventInput)); - - const arrangementCompletedRequirements = allArrangements.flatMap(({arrangement, person}) => arrangement.completedRequirements?.map(completed => ({ + + const arrangementCompletedRequirements = allArrangements.flatMap(({ arrangement, person }) => arrangement.completedRequirements?.map(completed => ({ title: `โœ… ${personNameString(person)} - ${completed.requirementName}`, date: completed.completedAtUtc } as EventInput))); - - const allArrangementMissingRequirements = allArrangements.flatMap(({arrangement, person}) => + + const allArrangementMissingRequirements = allArrangements.flatMap(({ arrangement, person }) => (arrangement.missingRequirements || []).map(missing => ({ person, missing }))); - - const arrangementPastDueRequirements = allArrangementMissingRequirements.filter(({missing}) => missing.pastDueSince).map(({missing, person}) => ({ + + const arrangementPastDueRequirements = allArrangementMissingRequirements.filter(({ missing }) => missing.pastDueSince).map(({ missing, person }) => ({ title: `โŒ ${personNameString(person)} - ${missing.actionName}`, date: missing.pastDueSince && format(missing.pastDueSince, "yyyy-MM-dd"), color: 'red' } as EventInput)); - - const arrangementUpcomingRequirements = allArrangementMissingRequirements.filter(({missing}) => missing.dueBy).map(({missing, person}) => ({ + + const arrangementUpcomingRequirements = allArrangementMissingRequirements.filter(({ missing }) => missing.dueBy).map(({ missing, person }) => ({ title: `๐Ÿ“… ${personNameString(person)} - ${missing.actionName}`, date: missing.dueBy && format(missing.dueBy, "yyyy-MM-dd") } as EventInput)); - - const arrangementActualChildcare = allArrangements.flatMap(({arrangement, person}) => { + + const arrangementActualChildcare = allArrangements.flatMap(({ arrangement, person }) => { const durationEntries = (arrangement.childLocationHistory || []).map((entry, index, history) => { const nextEntry = index < history.length - 1 ? history[index + 1] : null; const locationFamily = familyLookup(entry.childLocationFamilyId); @@ -97,7 +97,7 @@ function Dashboard() { return durationEntries.filter(entry => entry.backgroundColor === '#a52a2a'); }); - const arrangementPlannedChildcare = allArrangements.flatMap(({arrangement, person}) => { + const arrangementPlannedChildcare = allArrangements.flatMap(({ arrangement, person }) => { const durationEntries = (arrangement.childLocationPlan || []).map((entry, index, plan) => { const nextEntry = index < plan.length - 1 ? plan[index + 1] : null; const locationFamily = familyLookup(entry.childLocationFamilyId); @@ -110,7 +110,7 @@ function Dashboard() { }); return durationEntries.filter(entry => entry.backgroundColor === '#e58a8a'); }); - + enum CalendarFilters { ArrangementPlannedDuration = "Arrangement - Planned Duration", ArrangementActualStartEndDates = "Arrangement - Actual Start & End Dates", @@ -119,7 +119,7 @@ function Dashboard() { ArrangementUpcomingRequirements = "Arrangement - Upcoming Requirements", ArrangementPlannedChildcare = "Arrangement - Planned Childcare", ArrangementActualChildcare = "Arrangement - Actual Childcare" - }; + } const { filterOptions, handleFilterChange } = useFilterMenu(Object.values(CalendarFilters), [ @@ -134,7 +134,7 @@ function Dashboard() { function isSelected(option: string) { return filterOptions.find(filterOption => filterOption.key === option)?.selected || false; - }; + } const filteredEvents: EventSourceInput = ([] as EventInput[]).concat( isSelected(CalendarFilters.ArrangementPlannedDuration) ? arrangementPlannedDurations : [], @@ -147,44 +147,44 @@ function Dashboard() { return ((!dataLoaded || locationConfiguration.state !== 'hasValue' && organizationConfiguration.state !== 'hasValue') ? -

Loading dashboard...

-
+

Loading dashboard...

+ : - - - - {locationConfiguration.contents?.name} ({organizationConfiguration.contents?.organizationName}) - - - - - -
- - - - - + + + + {locationConfiguration.contents?.name} ({organizationConfiguration.contents?.organizationName}) + + + + -
+
+ + + + + + + ); } diff --git a/src/caretogether-pwa/src/Families/AddAdultDialog.tsx b/src/caretogether-pwa/src/Families/AddAdultDialog.tsx index 09b856d3..e67c0238 100644 --- a/src/caretogether-pwa/src/Families/AddAdultDialog.tsx +++ b/src/caretogether-pwa/src/Families/AddAdultDialog.tsx @@ -20,7 +20,7 @@ function optional(arg: string) { return arg.length > 0 ? arg : null; } -export function AddAdultDialog({onClose}: AddAdultDialogProps) { +export function AddAdultDialog({ onClose }: AddAdultDialogProps) { const { familyId } = useParams<{ familyId: string }>(); const visibleFamilies = useRecoilValue(visibleFamiliesQuery); const family = visibleFamilies.find(x => x.family?.id === familyId) as CombinedFamilyInfo; @@ -61,16 +61,16 @@ export function AddAdultDialog({onClose}: AddAdultDialogProps) { } else if (relationshipToFamily === '') { //TODO: Actual validation! alert("Family relationship was not selected. Try again."); } else { - let age = dateOfBirth == null ? null : new ExactAge(); + const age = dateOfBirth == null ? null : new ExactAge(); if (dateOfBirth != null) age!.dateOfBirth = dateOfBirth; await directoryModel.addAdult(family.family!.id!, firstName, lastName, gender, age, optional(ethnicity), isInHousehold, relationshipToFamily, - address == null ? null : new Address({...address, id: crypto.randomUUID() }), + address == null ? null : new Address({ ...address, id: crypto.randomUUID() }), optional(phoneNumber), phoneType, optional(emailAddress), emailType, (notes == null ? undefined : notes), (concerns == null ? undefined : concerns)); - //TODO: Error handling (start with a basic error dialog w/ request to share a screenshot, and App Insights logging) + //TODO: Error handling (start with a basic error dialog w/ request to share a screenshot, and App Insights logging) onClose(); } }); @@ -89,11 +89,11 @@ export function AddAdultDialog({onClose}: AddAdultDialogProps) { setFields({...fields, firstName: e.target.value})} /> + value={firstName} onChange={e => setFields({ ...fields, firstName: e.target.value })} /> setFields({...fields, lastName: e.target.value})} /> + value={lastName} onChange={e => setFields({ ...fields, lastName: e.target.value })} /> @@ -101,19 +101,19 @@ export function AddAdultDialog({onClose}: AddAdultDialogProps) { setFields({...fields, isInHousehold: e.target.checked})} + control={ setFields({ ...fields, isInHousehold: e.target.checked })} name="isInHousehold" color="primary" size="small" />} label="In Household" /> @@ -126,7 +126,7 @@ export function AddAdultDialog({onClose}: AddAdultDialogProps) { Gender: setFields({...fields, gender: Gender[e.target.value as keyof typeof Gender]})}> + value={gender == null ? null : Gender[gender]} onChange={e => setFields({ ...fields, gender: Gender[e.target.value as keyof typeof Gender] })}> } label="Male" /> } label="Female" /> } label="See Notes" /> @@ -138,8 +138,8 @@ export function AddAdultDialog({onClose}: AddAdultDialogProps) { label="Date of birth" value={dateOfBirth} maxDate={subYears(new Date(), 18)} openTo="year" format="MM/dd/yyyy" - onChange={(date: any) => date && setFields({...fields, dateOfBirth: date})} - slotProps={{ textField: { size: "small", fullWidth: true}}} /> + onChange={(date: Date | null) => date && setFields({ ...fields, dateOfBirth: date })} + slotProps={{ textField: { size: "small", fullWidth: true } }} /> @@ -147,12 +147,12 @@ export function AddAdultDialog({onClose}: AddAdultDialogProps) { @@ -160,12 +160,12 @@ export function AddAdultDialog({onClose}: AddAdultDialogProps) { setFields({...fields, phoneNumber: e.target.value})} /> + value={phoneNumber} onChange={e => setFields({ ...fields, phoneNumber: e.target.value })} /> setFields({...fields, phoneType: PhoneNumberType[e.target.value as keyof typeof PhoneNumberType]})}> + value={PhoneNumberType[phoneType]} onChange={e => setFields({ ...fields, phoneType: PhoneNumberType[e.target.value as keyof typeof PhoneNumberType] })}> } label="Mobile" /> } label="Home" /> } label="Work" /> @@ -175,12 +175,12 @@ export function AddAdultDialog({onClose}: AddAdultDialogProps) { setFields({...fields, emailAddress: e.target.value})} /> + value={emailAddress} onChange={e => setFields({ ...fields, emailAddress: e.target.value })} /> setFields({...fields, emailType: EmailAddressType[e.target.value as keyof typeof EmailAddressType]})}> + value={EmailAddressType[emailType]} onChange={e => setFields({ ...fields, emailType: EmailAddressType[e.target.value as keyof typeof EmailAddressType] })}> } label="Personal" /> } label="Work" /> @@ -188,7 +188,7 @@ export function AddAdultDialog({onClose}: AddAdultDialogProps) { - setFields({...fields, address: value})} /> + setFields({ ...fields, address: value })} /> @@ -203,7 +203,7 @@ export function AddAdultDialog({onClose}: AddAdultDialogProps) { ), }} - value={concerns == null ? "" : concerns} onChange={e => setFields({...fields, concerns: e.target.value})} + value={concerns == null ? "" : concerns} onChange={e => setFields({ ...fields, concerns: e.target.value })} /> @@ -211,13 +211,13 @@ export function AddAdultDialog({onClose}: AddAdultDialogProps) { id="notes" label="Notes" placeholder="Space for any general notes" multiline fullWidth variant="outlined" minRows={2} maxRows={5} size="small" - value={notes == null ? "" : notes} onChange={e => setFields({...fields, notes: e.target.value})} + value={notes == null ? "" : notes} onChange={e => setFields({ ...fields, notes: e.target.value })} /> - + diff --git a/src/caretogether-pwa/src/Families/AddChildDialog.tsx b/src/caretogether-pwa/src/Families/AddChildDialog.tsx index cda187f7..185784f8 100644 --- a/src/caretogether-pwa/src/Families/AddChildDialog.tsx +++ b/src/caretogether-pwa/src/Families/AddChildDialog.tsx @@ -15,7 +15,7 @@ interface AddChildDialogProps { onClose: () => void } -export function AddChildDialog({onClose}: AddChildDialogProps) { +export function AddChildDialog({ onClose }: AddChildDialogProps) { const { familyId } = useParams<{ familyId: string }>(); const visibleFamilies = useRecoilValue(visibleFamiliesQuery); const family = visibleFamilies.find(x => x.family?.id === familyId) as CombinedFamilyInfo; @@ -38,7 +38,7 @@ export function AddChildDialog({onClose}: AddChildDialogProps) { const directoryModel = useDirectoryModel(); const ethnicities = useRecoilValue(ethnicitiesData); - + const withBackdrop = useBackdrop(); async function addChild() { @@ -46,7 +46,7 @@ export function AddChildDialog({onClose}: AddChildDialogProps) { if (firstName.length <= 0 || lastName.length <= 0) { alert("First and last name are required. Try again."); } else { - let age = dateOfBirth == null ? null : new ExactAge(); + const age = dateOfBirth == null ? null : new ExactAge(); if (dateOfBirth != null) age!.dateOfBirth = dateOfBirth; await directoryModel.addChild(family.family?.id as string, @@ -77,11 +77,11 @@ export function AddChildDialog({onClose}: AddChildDialogProps) { setFields({...fields, firstName: e.target.value})} /> + value={firstName} onChange={e => setFields({ ...fields, firstName: e.target.value })} /> setFields({...fields, lastName: e.target.value})} /> + value={lastName} onChange={e => setFields({ ...fields, lastName: e.target.value })} /> @@ -98,15 +98,17 @@ export function AddChildDialog({onClose}: AddChildDialogProps) { @@ -122,7 +124,7 @@ export function AddChildDialog({onClose}: AddChildDialogProps) { Gender: setFields({...fields, gender: Gender[e.target.value as keyof typeof Gender]})}> + value={gender == null ? null : Gender[gender]} onChange={e => setFields({ ...fields, gender: Gender[e.target.value as keyof typeof Gender] })}> } label="Male" /> } label="Female" /> } label="See Notes" /> @@ -134,8 +136,8 @@ export function AddChildDialog({onClose}: AddChildDialogProps) { label="Date of birth" value={dateOfBirth} maxDate={subYears(new Date(), 18)} openTo="year" format="MM/dd/yyyy" - onChange={(date: any) => date && setFields({...fields, dateOfBirth: date})} - slotProps={{ textField: { size: "small", fullWidth: true}}} /> + onChange={(date: Date | null) => date && setFields({ ...fields, dateOfBirth: date })} + slotProps={{ textField: { size: "small", fullWidth: true } }} /> @@ -143,12 +145,12 @@ export function AddChildDialog({onClose}: AddChildDialogProps) { @@ -166,7 +168,7 @@ export function AddChildDialog({onClose}: AddChildDialogProps) { ), }} - value={concerns == null ? "" : concerns} onChange={e => setFields({...fields, concerns: e.target.value})} + value={concerns == null ? "" : concerns} onChange={e => setFields({ ...fields, concerns: e.target.value })} /> @@ -174,13 +176,13 @@ export function AddChildDialog({onClose}: AddChildDialogProps) { id="notes" label="Notes" placeholder="Space for any general notes" multiline fullWidth variant="outlined" minRows={2} maxRows={5} size="small" - value={notes == null ? "" : notes} onChange={e => setFields({...fields, notes: e.target.value})} + value={notes == null ? "" : notes} onChange={e => setFields({ ...fields, notes: e.target.value })} /> - + diff --git a/src/caretogether-pwa/src/Families/AddressEditor.tsx b/src/caretogether-pwa/src/Families/AddressEditor.tsx index ed7bb2e9..4d473cfb 100644 --- a/src/caretogether-pwa/src/Families/AddressEditor.tsx +++ b/src/caretogether-pwa/src/Families/AddressEditor.tsx @@ -18,11 +18,11 @@ function isSet(value: string | undefined) { function isInputValid(value: IAddress) { return isSet(value.line1) || - isSet(value.line2) || - isSet(value.city) || - isSet(value.county) || - isSet(value.state) || - isSet(value.postalCode); + isSet(value.line2) || + isSet(value.city) || + isSet(value.county) || + isSet(value.state) || + isSet(value.postalCode); } export function AddressFormFields({ address, onEdit }: AddressFormFieldsProps) { @@ -39,32 +39,32 @@ export function AddressFormFields({ address, onEdit }: AddressFormFieldsProps) { onEditField({...address, line1: e.target.value})} /> + onChange={e => onEditField({ ...address, line1: e.target.value })} /> onEditField({...address, line2: e.target.value})} /> + onChange={e => onEditField({ ...address, line2: e.target.value })} /> onEditField({...address, city: e.target.value})} /> + onChange={e => onEditField({ ...address, city: e.target.value })} /> onEditField({...address, county: e.target.value})} /> + onChange={e => onEditField({ ...address, county: e.target.value })} /> onEditField({...address, state: e.target.value})} /> + onChange={e => onEditField({ ...address, state: e.target.value })} /> onEditField({...address, postalCode: e.target.value})} /> + onChange={e => onEditField({ ...address, postalCode: e.target.value })} /> ); @@ -83,23 +83,23 @@ export function AddressEditor({ familyId, person, add, address }: AddressEditorP const isCurrent = person.currentAddressId === address?.id || typeof person.addresses === 'undefined' || person.addresses.length === 0; - const addressWithCurrent = {address: address || null, isCurrent: isCurrent}; - + const addressWithCurrent = { address: address || null, isCurrent: isCurrent }; + const editor = useInlineEditor(async value => await (add - ? directoryModel.addPersonAddress(familyId!, person.id!, new Address({...value.address!, id: crypto.randomUUID()}), value.isCurrent!) - : directoryModel.updatePersonAddress(familyId!, person.id!, new Address({...value.address!, id: address!.id}), value.isCurrent!)), + ? directoryModel.addPersonAddress(familyId!, person.id!, new Address({ ...value.address!, id: crypto.randomUUID() }), value.isCurrent!) + : directoryModel.updatePersonAddress(familyId!, person.id!, new Address({ ...value.address!, id: address!.id }), value.isCurrent!)), addressWithCurrent, value => (value && value.address != null && (value.address.line1 !== address?.line1 || - value.address.line2 !== address?.line2 || - value.address.city !== address?.city || - value.address.county !== address?.county || - value.address.state !== address?.state || - value.address.postalCode !== address?.postalCode || - value.isCurrent !== isCurrent || - add)) || false); + value.address.line2 !== address?.line2 || + value.address.city !== address?.city || + value.address.county !== address?.county || + value.address.state !== address?.state || + value.address.postalCode !== address?.postalCode || + value.isCurrent !== isCurrent || + add)) || false); function handleAdd() { editor.setValue(editorValue => ({ @@ -117,48 +117,48 @@ export function AddressEditor({ familyId, person, add, address }: AddressEditorP } const permissions = useFamilyIdPermissions(familyId); - + return ( {editor.editing ? <> -
- - - editor.setValue({...editor.value!, isCurrent: e.target.checked})} - icon={} - checkedIcon={} />} - label="Is Current Address" /> - - - {editor.cancelButton} - {editor.saveButton} - -
- +
+ + + editor.setValue({ ...editor.value!, isCurrent: e.target.checked })} + icon={} + checkedIcon={} />} + label="Is Current Address" /> + + + {editor.cancelButton} + {editor.saveButton} + +
+ : - { add + {add ? + onClick={handleAdd} + variant="text" + size="small" + startIcon={}> + Add + : <> - {isCurrent - ? - : } -

- {address!.line1}
- {address!.line2 && <>{address!.line2}
} - {address!.city}, {address!.state} {address!.postalCode} - {address!.county && <>
{address!.county} County} -

- {permissions(Permission.EditPersonContactInfo) && editor.editButton} - } + {isCurrent + ? + : } +

+ {address!.line1}
+ {address!.line2 && <>{address!.line2}
} + {address!.city}, {address!.state} {address!.postalCode} + {address!.county && <>
{address!.county} County} +

+ {permissions(Permission.EditPersonContactInfo) && editor.editButton} + }
}
); diff --git a/src/caretogether-pwa/src/Families/AdultFamilyRelationshipEditor.tsx b/src/caretogether-pwa/src/Families/AdultFamilyRelationshipEditor.tsx index 04326de1..b9e88103 100644 --- a/src/caretogether-pwa/src/Families/AdultFamilyRelationshipEditor.tsx +++ b/src/caretogether-pwa/src/Families/AdultFamilyRelationshipEditor.tsx @@ -25,45 +25,47 @@ export function AdultFamilyRelationshipEditor({ familyId, person, relationship } {editor.editing ? <> - - - Relationship to Family - editor.setValue({ + isInHousehold: editor.value!.isInHousehold, + relationshipToFamily: e.target.value as string + })}> + + Select a relationship type + + {relationshipTypes.map(relationshipType => + {relationshipType})} + + + + + + editor.setValue({ - isInHousehold: editor.value!.isInHousehold, - relationshipToFamily: e.target.value as string })}> - - Select a relationship type - - {relationshipTypes.map(relationshipType => - {relationshipType})} - -
- - - - editor.setValue({ - isInHousehold: e.target.checked, - relationshipToFamily: editor.value!.relationshipToFamily })} - name="isInHousehold" color="primary" size="small" />} - label="In Household" - /> - - - - {editor.cancelButton} - {editor.saveButton} - - + isInHousehold: e.target.checked, + relationshipToFamily: editor.value!.relationshipToFamily + })} + name="isInHousehold" color="primary" size="small" />} + label="In Household" + /> + + + + {editor.cancelButton} + {editor.saveButton} + + : - Relationship type: {relationship.relationshipToFamily}, {relationship.isInHousehold + Relationship type: {relationship.relationshipToFamily}, {relationship.isInHousehold ? "household member" : "not in household"} - {editor.editButton} + {editor.editButton} } ); diff --git a/src/caretogether-pwa/src/Families/AgeEditor.tsx b/src/caretogether-pwa/src/Families/AgeEditor.tsx index c4279646..2bfb8f94 100644 --- a/src/caretogether-pwa/src/Families/AgeEditor.tsx +++ b/src/caretogether-pwa/src/Families/AgeEditor.tsx @@ -24,35 +24,35 @@ export function AgeEditor({ familyId, person }: PersonEditorProps) { {editor.editing ? <> - - Saved age: - {person.age - ? person.age instanceof ExactAge - ? ` (date of birth: ${format(dateOfBirth!, " (M/d/yyyy)")}` - : ` (${ageInYears} as of ${format(ageAsOf!, "M/d/yy")})` - : ``} - - - date && editor.setValue(date)} - slotProps={{ textField: { size: "small", required: true}}} /> - - - {editor.cancelButton} - {editor.saveButton} - - - : - Age: + + Saved age: {person.age ? person.age instanceof ExactAge ? ` (date of birth: ${format(dateOfBirth!, " (M/d/yyyy)")}` : ` (${ageInYears} as of ${format(ageAsOf!, "M/d/yy")})` : ``} - {editor.editButton} + + + date && editor.setValue(date)} + slotProps={{ textField: { size: "small", required: true } }} /> + + + {editor.cancelButton} + {editor.saveButton} + + + : + Age: + {person.age + ? person.age instanceof ExactAge + ? ` (date of birth: ${format(dateOfBirth!, " (M/d/yyyy)")}` + : ` (${ageInYears} as of ${format(ageAsOf!, "M/d/yy")})` + : ``} + {editor.editButton} } ); diff --git a/src/caretogether-pwa/src/Families/AgeText.tsx b/src/caretogether-pwa/src/Families/AgeText.tsx index 6573d923..98e4eff1 100644 --- a/src/caretogether-pwa/src/Families/AgeText.tsx +++ b/src/caretogether-pwa/src/Families/AgeText.tsx @@ -5,14 +5,14 @@ interface AgeTextProps { age?: Age } -export function AgeText({age}: AgeTextProps) { +export function AgeText({ age }: AgeTextProps) { return ( { age && age instanceof ExactAge ? age.dateOfBirth && differenceInYears(new Date(), age.dateOfBirth) : age instanceof AgeInYears - ? age.years && age.asOf && (age.years + differenceInYears(new Date(), age.asOf)) - : "โš " + ? age.years && age.asOf && (age.years + differenceInYears(new Date(), age.asOf)) + : "โš " } ); } diff --git a/src/caretogether-pwa/src/Families/ChildCard.tsx b/src/caretogether-pwa/src/Families/ChildCard.tsx index e327b63a..3efcf32b 100644 --- a/src/caretogether-pwa/src/Families/ChildCard.tsx +++ b/src/caretogether-pwa/src/Families/ChildCard.tsx @@ -18,7 +18,7 @@ type ChildCardProps = { personId: string } -export function ChildCard({familyId, personId}: ChildCardProps) { +export function ChildCard({ familyId, personId }: ChildCardProps) { const familyLookup = useFamilyLookup(); const family = familyLookup(familyId)!; @@ -27,10 +27,10 @@ export function ChildCard({familyId, personId}: ChildCardProps) { const editDialogHandle = useDialogHandle(); const permissions = useFamilyPermissions(family); - + return <>{child && - - + Child, {child.gender ? ", " + Gender[child.gender] : ""} {child.ethnicity ? ", " + child.ethnicity : ""} @@ -41,24 +41,24 @@ export function ChildCard({familyId, personId}: ChildCardProps) { size="medium"> } /> - + {child.concerns && <>โš    {child.concerns}} {child.concerns && child.notes &&
} {child.notes && <>๐Ÿ“ {child.notes}}
-
    +
      {family.family?.custodialRelationships?.filter(relationship => relationship.childId === child.id)?.map(relationship => ( -
    • +
    • {family.family?.adults?.filter(x => x.item1?.id === relationship.personId)[0].item1?.firstName}:      - {relationship.type === CustodialRelationshipType.LegalGuardian + {relationship.type === CustodialRelationshipType.LegalGuardian ? "legal guardian" : relationship.type === CustodialRelationshipType.ParentWithCustody - ? "parent with custody" - : relationship.type === CustodialRelationshipType.ParentWithCourtAppointedCustody - ? "parent with court-appointed sole custody" - : null} + ? "parent with custody" + : relationship.type === CustodialRelationshipType.ParentWithCourtAppointedCustody + ? "parent with court-appointed sole custody" + : null}
    • ))}
    diff --git a/src/caretogether-pwa/src/Families/ChildCustodyRelationshipEditor.tsx b/src/caretogether-pwa/src/Families/ChildCustodyRelationshipEditor.tsx index 88fe46ba..06af9435 100644 --- a/src/caretogether-pwa/src/Families/ChildCustodyRelationshipEditor.tsx +++ b/src/caretogether-pwa/src/Families/ChildCustodyRelationshipEditor.tsx @@ -25,36 +25,36 @@ export function ChildCustodyRelationshipEditor({ familyId, person, adult, relati {editor.editing ? <> - - - - - - - - {editor.cancelButton} - {editor.saveButton} - - + + + + + + + + {editor.cancelButton} + {editor.saveButton} + + : - : - - {editor.value === CustodialRelationshipType.LegalGuardian - ? "legal guardian" - : editor.value === CustodialRelationshipType.ParentWithCustody + : + + {editor.value === CustodialRelationshipType.LegalGuardian + ? "legal guardian" + : editor.value === CustodialRelationshipType.ParentWithCustody ? "parent with custody" : editor.value === CustodialRelationshipType.ParentWithCourtAppointedCustody - ? "parent with court-appointed sole custody" - : "none"} - {editor.editButton} + ? "parent with court-appointed sole custody" + : "none"} + {editor.editButton} } ); diff --git a/src/caretogether-pwa/src/Families/ConcernsEditor.tsx b/src/caretogether-pwa/src/Families/ConcernsEditor.tsx index 684f2621..27e24c27 100644 --- a/src/caretogether-pwa/src/Families/ConcernsEditor.tsx +++ b/src/caretogether-pwa/src/Families/ConcernsEditor.tsx @@ -15,34 +15,34 @@ export function ConcernsEditor({ familyId, person }: PersonEditorProps) { typeof person.concerns === 'undefined' ? null : person.concerns); const permissions = useFamilyIdPermissions(familyId); - + return ( {editor.editing ? <> - - - - - ), - }} - value={editor.value == null ? "" : editor.value} - onChange={e => editor.setValue(e.target.value)} /> - - - {editor.cancelButton} - {editor.saveButton} - - + + + + + ), + }} + value={editor.value == null ? "" : editor.value} + onChange={e => editor.setValue(e.target.value)} /> + + + {editor.cancelButton} + {editor.saveButton} + + : - Concerns: {person.concerns} - {permissions(Permission.EditPersonConcerns) && editor.editButton} + Concerns: {person.concerns} + {permissions(Permission.EditPersonConcerns) && editor.editButton} } ); diff --git a/src/caretogether-pwa/src/Families/ContactDisplay.tsx b/src/caretogether-pwa/src/Families/ContactDisplay.tsx index 0c3d028c..0e72cfc5 100644 --- a/src/caretogether-pwa/src/Families/ContactDisplay.tsx +++ b/src/caretogether-pwa/src/Families/ContactDisplay.tsx @@ -15,7 +15,7 @@ export function ContactDisplay({ person }: ContactDisplayProps) { {preferredPhoneNumber && {preferredPhoneNumber.number}} {preferredEmailAddress && {preferredEmailAddress.address}} {currentAddress && -

    +

    {currentAddress.line1}
    {currentAddress.line2 && <>{currentAddress.line2}
    } {currentAddress.city}, {currentAddress.state} {currentAddress.postalCode} diff --git a/src/caretogether-pwa/src/Families/DeleteDocumentDialog.tsx b/src/caretogether-pwa/src/Families/DeleteDocumentDialog.tsx index 4cd1dda5..6a0734ac 100644 --- a/src/caretogether-pwa/src/Families/DeleteDocumentDialog.tsx +++ b/src/caretogether-pwa/src/Families/DeleteDocumentDialog.tsx @@ -8,7 +8,7 @@ interface DeleteDocumentDialogProps { onClose: () => void } -export function DeleteDocumentDialog({familyId, document, onClose}: DeleteDocumentDialogProps) { +export function DeleteDocumentDialog({ familyId, document, onClose }: DeleteDocumentDialogProps) { const directoryModel = useDirectoryModel(); async function save() { diff --git a/src/caretogether-pwa/src/Families/DeletePersonDialog.tsx b/src/caretogether-pwa/src/Families/DeletePersonDialog.tsx index ae8b9b8f..699b1b5d 100644 --- a/src/caretogether-pwa/src/Families/DeletePersonDialog.tsx +++ b/src/caretogether-pwa/src/Families/DeletePersonDialog.tsx @@ -9,7 +9,7 @@ interface DeletePersonDialogProps { handle: DialogHandle } -export function DeletePersonDialog({familyId, person, handle}: DeletePersonDialogProps) { +export function DeletePersonDialog({ familyId, person, handle }: DeletePersonDialogProps) { const directoryModel = useDirectoryModel(); async function save() { diff --git a/src/caretogether-pwa/src/Families/EditAdultDialog.tsx b/src/caretogether-pwa/src/Families/EditAdultDialog.tsx index 6a9a245d..d7d5b1b8 100644 --- a/src/caretogether-pwa/src/Families/EditAdultDialog.tsx +++ b/src/caretogether-pwa/src/Families/EditAdultDialog.tsx @@ -47,18 +47,18 @@ export function EditAdultDialog({ handle, adult }: EditAdultDialogProps) { {permissions(Permission.ViewPersonContactInfo) && <> -

    Phone Number(s):

    +

    Phone Number(s):

    {person.phoneNumbers?.map(phoneNumber => - )} + )} {permissions(Permission.EditPersonContactInfo) && } -

    Email Address(es):

    +

    Email Address(es):

    {person.emailAddresses?.map(emailAddress => - )} + )} {permissions(Permission.EditPersonContactInfo) && } -

    Address(es):

    +

    Address(es):

    {person.addresses?.map(address => - )} - {permissions(Permission.EditPersonContactInfo) && } + )} + {permissions(Permission.EditPersonContactInfo) && } } {permissions(Permission.ViewPersonNotes) && } {permissions(Permission.ViewPersonConcerns) && } diff --git a/src/caretogether-pwa/src/Families/EditChildDialog.tsx b/src/caretogether-pwa/src/Families/EditChildDialog.tsx index 77a9dec2..7720103f 100644 --- a/src/caretogether-pwa/src/Families/EditChildDialog.tsx +++ b/src/caretogether-pwa/src/Families/EditChildDialog.tsx @@ -31,7 +31,7 @@ export function EditChildDialog({ handle, child, familyAdults, custodialRelation const deleteDialogHandle = useDialogHandle(); const permissions = useFamilyIdPermissions(familyId!); - + return ( @@ -47,7 +47,7 @@ export function EditChildDialog({ handle, child, familyAdults, custodialRelation {familyAdults.map(adult => r.personId === adult.id)} - {...personEditorProps } />)} + {...personEditorProps} />)} {permissions(Permission.ViewPersonNotes) && } {permissions(Permission.ViewPersonConcerns) && } diff --git a/src/caretogether-pwa/src/Families/EmailAddressEditor.tsx b/src/caretogether-pwa/src/Families/EmailAddressEditor.tsx index 6011a7ef..e389c71c 100644 --- a/src/caretogether-pwa/src/Families/EmailAddressEditor.tsx +++ b/src/caretogether-pwa/src/Families/EmailAddressEditor.tsx @@ -24,16 +24,16 @@ export function EmailAddressEditor({ familyId, person, add, emailAddress }: Emai const isPreferred = person.preferredEmailAddressId === emailAddress?.id || typeof person.emailAddresses === 'undefined' || person.emailAddresses.length === 0; - const emailAddressWithPreference = {...emailAddress} as IEmailAddressWithPreference | undefined; + const emailAddressWithPreference = { ...emailAddress } as IEmailAddressWithPreference | undefined; if (typeof emailAddressWithPreference !== 'undefined') emailAddressWithPreference.isPreferred = isPreferred; - + const editor = useInlineEditor(async value => await (add ? directoryModel.addPersonEmailAddress(familyId!, person.id!, - value!.address!, value!.type!, value!.isPreferred!) + value!.address!, value!.type!, value!.isPreferred!) : directoryModel.updatePersonEmailAddress(familyId!, person.id!, - value.id!, value.address!, value.type!, value!.isPreferred!)), + value.id!, value.address!, value.type!, value!.isPreferred!)), emailAddressWithPreference, value => (value && value.address!.length > 0 && (value.address !== emailAddress?.address || value.type !== emailAddress?.type || @@ -49,58 +49,58 @@ export function EmailAddressEditor({ familyId, person, add, emailAddress }: Emai } const permissions = useFamilyIdPermissions(familyId); - + return ( {editor.editing ? <> -
    - - editor.setValue({...editor.value, address: e.target.value})} /> - - - - Email Type: - editor.setValue({...editor.value, type: EmailAddressType[e.target.value as keyof typeof EmailAddressType]})}> - } label="Personal" /> - } label="Work" /> - - - - - editor.setValue({...editor.value, isPreferred: e.target.checked})} - icon={} - checkedIcon={} />} - label="Is Preferred Email Address" /> - - - {editor.cancelButton} - {editor.saveButton} - -
    - +
    + + editor.setValue({ ...editor.value, address: e.target.value })} /> + + + + Email Type: + editor.setValue({ ...editor.value, type: EmailAddressType[e.target.value as keyof typeof EmailAddressType] })}> + } label="Personal" /> + } label="Work" /> + + + + + editor.setValue({ ...editor.value, isPreferred: e.target.checked })} + icon={} + checkedIcon={} />} + label="Is Preferred Email Address" /> + + + {editor.cancelButton} + {editor.saveButton} + +
    + : - { add + {add ? + onClick={handleAdd} + variant="text" + size="small" + startIcon={}> + Add + : <> - {isPreferred - ? - : } - {emailAddress!.address} - {EmailAddressType[emailAddress!.type!]} - {permissions(Permission.EditPersonContactInfo) && editor.editButton} - } + {isPreferred + ? + : } + {emailAddress!.address} - {EmailAddressType[emailAddress!.type!]} + {permissions(Permission.EditPersonContactInfo) && editor.editButton} + } }
    ); diff --git a/src/caretogether-pwa/src/Families/EthnicityEditor.tsx b/src/caretogether-pwa/src/Families/EthnicityEditor.tsx index 3dff657b..0590c18b 100644 --- a/src/caretogether-pwa/src/Families/EthnicityEditor.tsx +++ b/src/caretogether-pwa/src/Families/EthnicityEditor.tsx @@ -17,29 +17,29 @@ export function EthnicityEditor({ familyId, person }: PersonEditorProps) { {editor.editing ? <> - - - Ethnicity - - - - - {editor.cancelButton} - {editor.saveButton} - - + + + Ethnicity + + + + + {editor.cancelButton} + {editor.saveButton} + + : - Ethnicity: {person.ethnicity} - {editor.editButton} + Ethnicity: {person.ethnicity} + {editor.editButton} } ); diff --git a/src/caretogether-pwa/src/Families/FamilyCustomField.tsx b/src/caretogether-pwa/src/Families/FamilyCustomField.tsx index aad86d6e..66007a4d 100644 --- a/src/caretogether-pwa/src/Families/FamilyCustomField.tsx +++ b/src/caretogether-pwa/src/Families/FamilyCustomField.tsx @@ -11,12 +11,12 @@ type FamilyCustomFieldProps = { export function FamilyCustomField({ familyId, customField }: FamilyCustomFieldProps) { const policy = useRecoilValue(policyData); - + const savedCustomField = customField instanceof CompletedCustomFieldInfo ? customField : null; const customFieldPolicy = policy.customFamilyFields!.find(cf => savedCustomField - ? cf.name === savedCustomField.customFieldName - : cf.name === customField) as CustomField; + ? cf.name === savedCustomField.customFieldName + : cf.name === customField) as CustomField; const directoryModel = useDirectoryModel(); diff --git a/src/caretogether-pwa/src/Families/FamilyDocuments.tsx b/src/caretogether-pwa/src/Families/FamilyDocuments.tsx index 4fc8c61e..5f6a2a2c 100644 --- a/src/caretogether-pwa/src/Families/FamilyDocuments.tsx +++ b/src/caretogether-pwa/src/Families/FamilyDocuments.tsx @@ -15,21 +15,21 @@ type FamilyDocumentsProps = { export function FamilyDocuments({ family }: FamilyDocumentsProps) { const { organizationId, locationId } = useRecoilValue(selectedLocationContextState); - const [moreMenuAnchor, setMoreMenuAnchor] = useState<{anchor: Element, document: UploadedDocumentInfo} | null>(null); - const [deleteParameter, setDeleteParameter] = useState<{familyId: string, document: UploadedDocumentInfo} | null>(null); + const [moreMenuAnchor, setMoreMenuAnchor] = useState<{ anchor: Element, document: UploadedDocumentInfo } | null>(null); + const [deleteParameter, setDeleteParameter] = useState<{ familyId: string, document: UploadedDocumentInfo } | null>(null); function selectDelete(document: UploadedDocumentInfo) { setMoreMenuAnchor(null); - setDeleteParameter({familyId: family.family!.id!, document: document}); + setDeleteParameter({ familyId: family.family!.id!, document: document }); } const permissions = useFamilyPermissions(family); - + return ( <> -
      +
        {family.uploadedDocuments?.map((uploaded, i) => permissions(Permission.ReadFamilyDocuments) - ?
      • { if (!permissions(Permission.DeleteFamilyDocuments)) return; @@ -38,11 +38,11 @@ export function FamilyDocuments({ family }: FamilyDocumentsProps) { }} onClick={() => downloadFamilyFile(organizationId, locationId, family.family!.id!, uploaded.uploadedDocumentId!)}> ๐Ÿ“ƒ {uploaded.uploadedFileName}      - {uploaded.timestampUtc && {format(uploaded.timestampUtc, "M/d/yy")}} + {uploaded.timestampUtc && {format(uploaded.timestampUtc, "M/d/yy")}}
      • - :
      • + :
      • ๐Ÿ“ƒ {uploaded.uploadedFileName}      - {uploaded.timestampUtc && {format(uploaded.timestampUtc, "M/d/yy")}} + {uploaded.timestampUtc && {format(uploaded.timestampUtc, "M/d/yy")}}
      • )}
      diff --git a/src/caretogether-pwa/src/Families/FamilyName.tsx b/src/caretogether-pwa/src/Families/FamilyName.tsx index 80f600a3..1f96bed9 100644 --- a/src/caretogether-pwa/src/Families/FamilyName.tsx +++ b/src/caretogether-pwa/src/Families/FamilyName.tsx @@ -1,4 +1,3 @@ -import React from 'react'; import { CombinedFamilyInfo } from '../GeneratedClient'; import { personNameString } from './PersonName'; @@ -6,10 +5,11 @@ type FamilyNameProps = { family?: CombinedFamilyInfo } +// eslint-disable-next-line react-refresh/only-export-components export function familyNameString(family?: CombinedFamilyInfo) { const primaryContactPerson = family?.family?.adults?.find(adult => family.family!.primaryFamilyContactPersonId === adult.item1?.id)?.item1; - + return primaryContactPerson && `${personNameString(primaryContactPerson)} Family`; } diff --git a/src/caretogether-pwa/src/Families/FamilyScreen.tsx b/src/caretogether-pwa/src/Families/FamilyScreen.tsx index 7851fa3c..3fb82e8e 100644 --- a/src/caretogether-pwa/src/Families/FamilyScreen.tsx +++ b/src/caretogether-pwa/src/Families/FamilyScreen.tsx @@ -234,7 +234,7 @@ export function FamilyScreen() {
      {family.partneringFamilyInfo?.openReferral ? "Referral open since " + format(family.partneringFamilyInfo.openReferral.openedAtUtc!, "M/d/yy") - : "Referral closed - " + ReferralCloseReason[family.partneringFamilyInfo?.closedReferrals?.[family.partneringFamilyInfo.closedReferrals.length - 1]?.closeReason!] + : "Referral closed - " + ReferralCloseReason[family.partneringFamilyInfo!.closedReferrals![family.partneringFamilyInfo.closedReferrals!.length - 1]!.closeReason!] //TODO: "Closed on " + format(partneringFamily.partneringFamilyInfo?.closedReferrals?.[0]?.closedUtc) -- needs a new calculated property } {(family.partneringFamilyInfo?.closedReferrals?.length && ( @@ -289,12 +289,12 @@ export function FamilyScreen() { } {closeReferralDialogOpen && family.partneringFamilyInfo?.openReferral && ( setCloseReferralDialogOpen(false)} />)} {openNewReferralDialogOpen && ( setOpenNewReferralDialogOpen(false)} />)} diff --git a/src/caretogether-pwa/src/Families/FamilyUtils.tsx b/src/caretogether-pwa/src/Families/FamilyUtils.tsx index 37d06739..e1dcb120 100644 --- a/src/caretogether-pwa/src/Families/FamilyUtils.tsx +++ b/src/caretogether-pwa/src/Families/FamilyUtils.tsx @@ -5,13 +5,13 @@ export function familyLastName(family: CombinedFamilyInfo) { return family.family!.adults?.filter(adult => family.family!.primaryFamilyContactPersonId === adult.item1?.id)[0]?.item1?.lastName || ""; } -export function filterFamiliesByText(families : CombinedFamilyInfo[], inputText: string) { +export function filterFamiliesByText(families: CombinedFamilyInfo[], inputText: string) { return families.filter(family => inputText.length === 0 || family.family?.adults?.some(adult => simplify(`${adult.item1?.firstName} ${adult.item1?.lastName}`).includes(inputText.toLowerCase())) || family.family?.children?.some(child => simplify(`${child?.firstName} ${child?.lastName}`).includes(inputText.toLowerCase()))); } -export function sortFamiliesByLastNameDesc(families : CombinedFamilyInfo[]) { +export function sortFamiliesByLastNameDesc(families: CombinedFamilyInfo[]) { return families.map(x => x).sort((a, b) => - familyLastName(a) < familyLastName(b) ? -1 : familyLastName(a) > familyLastName(b) ? 1 : 0); + familyLastName(a) < familyLastName(b) ? -1 : familyLastName(a) > familyLastName(b) ? 1 : 0); } \ No newline at end of file diff --git a/src/caretogether-pwa/src/Families/GenderEditor.tsx b/src/caretogether-pwa/src/Families/GenderEditor.tsx index b933ceb6..3fefcb14 100644 --- a/src/caretogether-pwa/src/Families/GenderEditor.tsx +++ b/src/caretogether-pwa/src/Families/GenderEditor.tsx @@ -15,31 +15,31 @@ export function GenderEditor({ familyId, person }: PersonEditorProps) { {editor.editing ? <> - - - Gender: - editor.setValue(Gender[e.target.value as keyof typeof Gender])}> - } label="Male" /> - } label="Female" /> - } label="See Notes" /> - - - - - {editor.cancelButton} - {editor.saveButton} - - + + + Gender: + editor.setValue(Gender[e.target.value as keyof typeof Gender])}> + } label="Male" /> + } label="Female" /> + } label="See Notes" /> + + + + + {editor.cancelButton} + {editor.saveButton} + + : - Gender: { - (person.gender !== null && typeof(person.gender) !== 'undefined') - ? (person.gender === Gender.Male ? "Male" - : person.gender === Gender.Female ? "Female" - : "(see notes)") - : ""} - {editor.editButton} + Gender: { + (person.gender !== null && typeof (person.gender) !== 'undefined') + ? (person.gender === Gender.Male ? "Male" + : person.gender === Gender.Female ? "Female" + : "(see notes)") + : ""} + {editor.editButton} } ); diff --git a/src/caretogether-pwa/src/Families/ManageUserDrawer.tsx b/src/caretogether-pwa/src/Families/ManageUserDrawer.tsx index 917f322a..2f19dae4 100644 --- a/src/caretogether-pwa/src/Families/ManageUserDrawer.tsx +++ b/src/caretogether-pwa/src/Families/ManageUserDrawer.tsx @@ -66,23 +66,23 @@ export function ManageUserDrawer({ onClose, adult, user }: ManageUserDrawerProps const currentSorted = user?.locationRoles?.slice().sort() || []; const rolesChanged = selectedRoles.length !== currentSorted.length || - selectedRoles.slice().sort().some(function(value, index) { + selectedRoles.slice().sort().some(function (value, index) { return value !== currentSorted[index]; }); const unsavedChanges = rolesChanged; - const savePersonRoles = useRecoilCallback(({snapshot, set}) => { + const savePersonRoles = useRecoilCallback(({ set }) => { const asyncCallback = async () => { const updatedAggregate = await api.users.changePersonRoles( organizationId, locationId, adult.id, selectedRoles); - set(visibleAggregatesState, current => + set(visibleAggregatesState, current => current.some(currentEntry => currentEntry.id === updatedAggregate.id && currentEntry.constructor === updatedAggregate.constructor) - ? current.map(currentEntry => currentEntry.id === updatedAggregate.id && currentEntry.constructor === updatedAggregate.constructor - ? updatedAggregate - : currentEntry) - : current.concat(updatedAggregate)); + ? current.map(currentEntry => currentEntry.id === updatedAggregate.id && currentEntry.constructor === updatedAggregate.constructor + ? updatedAggregate + : currentEntry) + : current.concat(updatedAggregate)); }; return asyncCallback; }); @@ -112,24 +112,24 @@ export function ManageUserDrawer({ onClose, adult, user }: ManageUserDrawerProps

      Manage User: {personNameString(adult)}

      - { user?.userId - ?

      - - - - User account activated -

      - :

      - - - - Account not yet created - -

      } + {user?.userId + ?

      + + + + User account activated +

      + :

      + + + + Account not yet created + +

      }
      diff --git a/src/caretogether-pwa/src/Families/NameEditor.tsx b/src/caretogether-pwa/src/Families/NameEditor.tsx index 627ae866..354e8ccc 100644 --- a/src/caretogether-pwa/src/Families/NameEditor.tsx +++ b/src/caretogether-pwa/src/Families/NameEditor.tsx @@ -18,24 +18,24 @@ export function NameEditor({ familyId, person }: PersonEditorProps) { {editor.editing ? <> - - editor.setValue({ firstName: e.target.value, lastName: editor.value!.lastName })} /> - - - editor.setValue({ firstName: editor.value!.firstName, lastName: e.target.value })} /> - - - {editor.cancelButton} - {editor.saveButton} - - + + editor.setValue({ firstName: e.target.value, lastName: editor.value!.lastName })} /> + + + editor.setValue({ firstName: editor.value!.firstName, lastName: e.target.value })} /> + + + {editor.cancelButton} + {editor.saveButton} + + : - Name: - {editor.editButton} + Name: + {editor.editButton} } ); diff --git a/src/caretogether-pwa/src/Families/NotesEditor.tsx b/src/caretogether-pwa/src/Families/NotesEditor.tsx index 519ae6c9..96067388 100644 --- a/src/caretogether-pwa/src/Families/NotesEditor.tsx +++ b/src/caretogether-pwa/src/Families/NotesEditor.tsx @@ -19,22 +19,22 @@ export function NotesEditor({ familyId, person }: PersonEditorProps) { {editor.editing ? <> - - editor.setValue(e.target.value)} /> - - - {editor.cancelButton} - {editor.saveButton} - - + + editor.setValue(e.target.value)} /> + + + {editor.cancelButton} + {editor.saveButton} + + : - Notes: {person.notes} - {permissions(Permission.EditPersonNotes) && editor.editButton} + Notes: {person.notes} + {permissions(Permission.EditPersonNotes) && editor.editButton} } ); diff --git a/src/caretogether-pwa/src/Families/PersonName.tsx b/src/caretogether-pwa/src/Families/PersonName.tsx index 9fdc2d06..05a583f0 100644 --- a/src/caretogether-pwa/src/Families/PersonName.tsx +++ b/src/caretogether-pwa/src/Families/PersonName.tsx @@ -1,10 +1,10 @@ -import React from 'react'; import { Person } from '../GeneratedClient'; type PersonNameProps = { person?: Person }; +// eslint-disable-next-line react-refresh/only-export-components export function personNameString(person?: Person) { return person && `${person.firstName} ${person.lastName}`; } diff --git a/src/caretogether-pwa/src/Families/PhoneNumberEditor.tsx b/src/caretogether-pwa/src/Families/PhoneNumberEditor.tsx index 22ef60b4..21035025 100644 --- a/src/caretogether-pwa/src/Families/PhoneNumberEditor.tsx +++ b/src/caretogether-pwa/src/Families/PhoneNumberEditor.tsx @@ -24,21 +24,21 @@ export function PhoneNumberEditor({ familyId, person, add, phoneNumber }: PhoneN const isPreferred = person.preferredPhoneNumberId === phoneNumber?.id || typeof person.phoneNumbers === 'undefined' || person.phoneNumbers.length === 0; - const phoneNumberWithPreference = {...phoneNumber} as IPhoneNumberWithPreference | undefined; + const phoneNumberWithPreference = { ...phoneNumber } as IPhoneNumberWithPreference | undefined; if (typeof phoneNumberWithPreference !== 'undefined') phoneNumberWithPreference.isPreferred = isPreferred; const editor = useInlineEditor(async value => await (add ? directoryModel.addPersonPhoneNumber(familyId!, person.id!, - value!.number!, value!.type!, value!.isPreferred!) + value!.number!, value!.type!, value!.isPreferred!) : directoryModel.updatePersonPhoneNumber(familyId!, person.id!, - value!.id!, value!.number!, value!.type!, value!.isPreferred!)), + value!.id!, value!.number!, value!.type!, value!.isPreferred!)), phoneNumberWithPreference, value => (value && value.number!.length > 0 && (value.number !== phoneNumber?.number || value.type !== phoneNumber?.type || value.isPreferred !== isPreferred)) as boolean); - + function handleAdd() { editor.setValue({ number: "", @@ -54,54 +54,54 @@ export function PhoneNumberEditor({ familyId, person, add, phoneNumber }: PhoneN {editor.editing ? <> -
      - - editor.setValue({...editor.value, number: e.target.value})} /> - - - - Phone Type: - editor.setValue({...editor.value, type: PhoneNumberType[e.target.value as keyof typeof PhoneNumberType]})}> - } label="Mobile" /> - } label="Home" /> - } label="Work" /> - - - - - editor.setValue({...editor.value, isPreferred: e.target.checked})} - icon={} - checkedIcon={} />} - label="Is Preferred Phone Number" /> - - - {editor.cancelButton} - {editor.saveButton} - -
      - +
      + + editor.setValue({ ...editor.value, number: e.target.value })} /> + + + + Phone Type: + editor.setValue({ ...editor.value, type: PhoneNumberType[e.target.value as keyof typeof PhoneNumberType] })}> + } label="Mobile" /> + } label="Home" /> + } label="Work" /> + + + + + editor.setValue({ ...editor.value, isPreferred: e.target.checked })} + icon={} + checkedIcon={} />} + label="Is Preferred Phone Number" /> + + + {editor.cancelButton} + {editor.saveButton} + +
      + : - { add + {add ? + onClick={handleAdd} + variant="text" + size="small" + startIcon={}> + Add + : <> - {isPreferred - ? - : } - {phoneNumber!.number} - {PhoneNumberType[phoneNumber!.type!]} - {permissions(Permission.EditPersonContactInfo) && editor.editButton} - } + {isPreferred + ? + : } + {phoneNumber!.number} - {PhoneNumberType[phoneNumber!.type!]} + {permissions(Permission.EditPersonContactInfo) && editor.editButton} + } }
      ); diff --git a/src/caretogether-pwa/src/Families/PrimaryContactEditor.tsx b/src/caretogether-pwa/src/Families/PrimaryContactEditor.tsx index e59d3a32..369a6a8c 100644 --- a/src/caretogether-pwa/src/Families/PrimaryContactEditor.tsx +++ b/src/caretogether-pwa/src/Families/PrimaryContactEditor.tsx @@ -14,34 +14,34 @@ export function PrimaryContactEditor({ family }: PrimaryContactEditorProps) { const primaryContactPerson = family.family!.adults!.filter(adult => adult.item1!.id === family.family!.primaryFamilyContactPersonId)[0].item1!; - + const editor = useInlineEditor(async adultId => await directoryModel.updatePrimaryFamilyContact(family.family!.id!, adultId), primaryContactPerson.id!); const permissions = useFamilyPermissions(family); - + return (editor.editing - ? + ? Primary Contact {editor.cancelButton} {editor.saveButton} - : + : Primary Contact: {permissions(Permission.EditFamilyInfo) && editor.editButton} ); diff --git a/src/caretogether-pwa/src/Families/UploadFamilyDocumentsDialog.tsx b/src/caretogether-pwa/src/Families/UploadFamilyDocumentsDialog.tsx index c9711c60..fec68793 100644 --- a/src/caretogether-pwa/src/Families/UploadFamilyDocumentsDialog.tsx +++ b/src/caretogether-pwa/src/Families/UploadFamilyDocumentsDialog.tsx @@ -12,7 +12,7 @@ interface UploadFamilyDocumentsDialogProps { onClose: () => void } -export function UploadFamilyDocumentsDialog({family, onClose}: UploadFamilyDocumentsDialogProps) { +export function UploadFamilyDocumentsDialog({ family, onClose }: UploadFamilyDocumentsDialogProps) { const [documentFiles, setDocumentFiles] = useState(); const { organizationId, locationId } = useRecoilValue(selectedLocationContextState); const directoryModel = useDirectoryModel(); @@ -44,9 +44,11 @@ export function UploadFamilyDocumentsDialog({family, onClose}: UploadFamilyDocum multiple={true} id="family-document-file" type="file" - onChange={async (e) => {if (e.target.files && e.target.files.length > 0) { - setDocumentFiles(e.target.files); - }}} + onChange={async (e) => { + if (e.target.files && e.target.files.length > 0) { + setDocumentFiles(e.target.files); + } + }} /> diff --git a/src/caretogether-pwa/src/Generic/CustomFieldEditor.tsx b/src/caretogether-pwa/src/Generic/CustomFieldEditor.tsx index b511653e..74650ceb 100644 --- a/src/caretogether-pwa/src/Generic/CustomFieldEditor.tsx +++ b/src/caretogether-pwa/src/Generic/CustomFieldEditor.tsx @@ -5,6 +5,7 @@ import { useInlineEditor } from "../Hooks/useInlineEditor"; type CustomFieldEditorProps = { customFieldPolicy: CustomField; completedCustomFieldInfo?: CompletedCustomFieldInfo; + // eslint-disable-next-line @typescript-eslint/no-explicit-any onSave: (value: any) => Promise; } @@ -15,37 +16,37 @@ export function CustomFieldEditor({ customFieldPolicy, completedCustomFieldInfo, const editor = useInlineEditor(onSave, savedValue); return ( - + {customFieldPolicy.name}:  {editor.editing ? type === CustomFieldType.Boolean ? <> - editor.setValue(e.target.value === "yes" ? true : e.target.value === "no" ? false : null)} - > - } label="Yes" /> - } label="No" /> - } label="(blank)" /> - - + editor.setValue(e.target.value === "yes" ? true : e.target.value === "no" ? false : null)} + > + } label="Yes" /> + } label="No" /> + } label="(blank)" /> + + : customFieldPolicy.validation === CustomFieldValidation.SuggestOnly ? { - editor.setValue(newValue.length > 0 ? newValue : null); - }} - options={(customFieldPolicy.validValues || []).slice().sort((a, b) => -b.localeCompare(a))} - renderInput={(params) => } - inputValue={editor.value || ""} - /> - : { + editor.setValue(newValue.length > 0 ? newValue : null); + }} + options={(customFieldPolicy.validValues || []).slice().sort((a, b) => -b.localeCompare(a))} + renderInput={(params) => } + inputValue={editor.value || ""} + /> + : editor.setValue(e.target.value)} /> - : typeof(savedValue) === 'undefined' || savedValue == null + : typeof (savedValue) === 'undefined' || savedValue == null ? "โ“" : type === CustomFieldType.Boolean ? savedValue ? "Yes" : "No" diff --git a/src/caretogether-pwa/src/Generic/FilterMenu.tsx b/src/caretogether-pwa/src/Generic/FilterMenu.tsx index 0477b3d0..b6a0269a 100644 --- a/src/caretogether-pwa/src/Generic/FilterMenu.tsx +++ b/src/caretogether-pwa/src/Generic/FilterMenu.tsx @@ -28,7 +28,7 @@ export function FilterMenu({ singularLabel, pluralLabel, filterOptions, handleFi aria-describedby={filterMenuId} onClick={handleFilterClick} size="small" - color="primary" + color="primary" > @@ -38,23 +38,23 @@ export function FilterMenu({ singularLabel, pluralLabel, filterOptions, handleFi anchorEl={filterElement} onClose={handleFilterClose} anchorOrigin={{ - vertical: 'bottom', - horizontal: 'left', + vertical: 'bottom', + horizontal: 'left', }} > - {`Filter ${pluralLabel}`} - - {filterOptions.map(o => - - } - label={o.text} - /> - )} - + {`Filter ${pluralLabel}`} + + {filterOptions.map(o => + + } + label={o.text} + /> + )} + diff --git a/src/caretogether-pwa/src/Generic/IconRow.tsx b/src/caretogether-pwa/src/Generic/IconRow.tsx index 09ba1454..a78a2127 100644 --- a/src/caretogether-pwa/src/Generic/IconRow.tsx +++ b/src/caretogether-pwa/src/Generic/IconRow.tsx @@ -11,10 +11,10 @@ export const IconRow: React.FC = ({ onClick, children }) => ( - - {icon} + sx={(onClick && { '&:hover': { backgroundColor: 'primary.light', cursor: 'pointer' } }) || null}> + {icon} {children} ); diff --git a/src/caretogether-pwa/src/Generic/ShellDrawer.tsx b/src/caretogether-pwa/src/Generic/ShellDrawer.tsx index 158427e5..66daf8c7 100644 --- a/src/caretogether-pwa/src/Generic/ShellDrawer.tsx +++ b/src/caretogether-pwa/src/Generic/ShellDrawer.tsx @@ -12,7 +12,7 @@ export function useDrawer() { anchor='right' open={open} onClose={() => setOpen(false)} - sx={{ '.MuiDrawer-paper': { padding: 2, paddingTop: { xs: 7, sm: 8, md: 6 }}}}> + sx={{ '.MuiDrawer-paper': { padding: 2, paddingTop: { xs: 7, sm: 8, md: 6 } } }}> {children} }); diff --git a/src/caretogether-pwa/src/Generic/TabPanel.tsx b/src/caretogether-pwa/src/Generic/TabPanel.tsx index 38570900..be6e2b65 100644 --- a/src/caretogether-pwa/src/Generic/TabPanel.tsx +++ b/src/caretogether-pwa/src/Generic/TabPanel.tsx @@ -23,6 +23,7 @@ export function TabPanel(props: TabPanelProps) { ); } +// eslint-disable-next-line react-refresh/only-export-components export function a11yProps(index: number) { return { id: `full-width-tab-${index}`, diff --git a/src/caretogether-pwa/src/Generic/UpdateDialog.tsx b/src/caretogether-pwa/src/Generic/UpdateDialog.tsx index d2473b9b..b7e90f8e 100644 --- a/src/caretogether-pwa/src/Generic/UpdateDialog.tsx +++ b/src/caretogether-pwa/src/Generic/UpdateDialog.tsx @@ -23,10 +23,10 @@ export const UpdateDialog: React.FC = ({ const withBackdrop = useBackdrop(); // Whether the dialog is open or not can be controlled by the caller; otherwise it will always be open. - const isOpen = typeof(open) === 'undefined' ? true : open; - - const saveButtonLabel = typeof(saveLabel) === 'undefined' ? "Save" : saveLabel; - + const isOpen = typeof (open) === 'undefined' ? true : open; + + const saveButtonLabel = typeof (saveLabel) === 'undefined' ? "Save" : saveLabel; + async function saveHandler() { await withBackdrop(async () => { await onSave(); diff --git a/src/caretogether-pwa/src/Generic/useFilterMenu.ts b/src/caretogether-pwa/src/Generic/useFilterMenu.ts index 88f78ff5..70b640a6 100644 --- a/src/caretogether-pwa/src/Generic/useFilterMenu.ts +++ b/src/caretogether-pwa/src/Generic/useFilterMenu.ts @@ -11,7 +11,7 @@ export function useFilterMenu(options: string[], initialSelections: string[]) { } })); - const handleFilterChange = (event: ChangeEvent, _checked: boolean) => { + const handleFilterChange = (event: ChangeEvent) => { setSelectedOptions(filterOptions.map(o => { if (o.text === event.target.name) { o.selected = !o.selected; diff --git a/src/caretogether-pwa/src/GlobalErrorBoundary.tsx b/src/caretogether-pwa/src/GlobalErrorBoundary.tsx index 7d136367..5f0f2320 100644 --- a/src/caretogether-pwa/src/GlobalErrorBoundary.tsx +++ b/src/caretogether-pwa/src/GlobalErrorBoundary.tsx @@ -3,17 +3,20 @@ import { appInsights } from "./ApplicationInsightsService"; export class GlobalErrorBoundary extends React.Component< { children?: React.ReactNode; }, + // eslint-disable-next-line @typescript-eslint/no-explicit-any { hasError: boolean; error: any; }> { - constructor(props: {}) { + constructor(props: object) { super(props); this.state = { hasError: false, error: null }; } + // eslint-disable-next-line @typescript-eslint/no-explicit-any static getDerivedStateFromError(error: any) { // Update state so the next render will show the fallback UI. return { hasError: true, error: error }; } + // eslint-disable-next-line @typescript-eslint/no-explicit-any componentDidCatch(error: any, errorInfo: any) { console.error(error); console.error(errorInfo); @@ -31,7 +34,7 @@ export class GlobalErrorBoundary extends React.Component< return ( <>

      Something went wrong.

      -
      +          
                   {this.state.error?.message
                     ? this.state.error.message
                     : JSON.stringify(this.state.error)}
      diff --git a/src/caretogether-pwa/src/Hooks/useBackdrop.ts b/src/caretogether-pwa/src/Hooks/useBackdrop.ts
      index 4665bdac..7555ee63 100644
      --- a/src/caretogether-pwa/src/Hooks/useBackdrop.ts
      +++ b/src/caretogether-pwa/src/Hooks/useBackdrop.ts
      @@ -6,12 +6,12 @@ export const showGlobalBackdropData = atom({
       });
       
       export function useBackdrop() {
      -  const showBackdrop = useRecoilCallback(({snapshot, set}) => {
      +  const showBackdrop = useRecoilCallback(({ set }) => {
           return async () => {
             set(showGlobalBackdropData, true);
           };
         });
      -  const hideBackdrop = useRecoilCallback(({snapshot, set}) => {
      +  const hideBackdrop = useRecoilCallback(({ set }) => {
           return async () => {
             set(showGlobalBackdropData, false);
           };
      diff --git a/src/caretogether-pwa/src/Hooks/useCollapsed.ts b/src/caretogether-pwa/src/Hooks/useCollapsed.ts
      index cb71b046..80a90eba 100644
      --- a/src/caretogether-pwa/src/Hooks/useCollapsed.ts
      +++ b/src/caretogether-pwa/src/Hooks/useCollapsed.ts
      @@ -7,7 +7,7 @@ interface Collapsed {
       }
       
       class CollapsedDb extends Dexie {
      -  items!: Table; 
      +  items!: Table;
       
         constructor() {
           super('collapsedItems');
      @@ -38,6 +38,6 @@ export function useCollapsed(key: string, initialValue: boolean) {
         }, [key]);
       
         const value = typeof savedValue === 'undefined' ? initialValue : savedValue;
      -  
      +
         return [value, upsertSavedValue] as const;
       }
      diff --git a/src/caretogether-pwa/src/Hooks/useInlineEditor.tsx b/src/caretogether-pwa/src/Hooks/useInlineEditor.tsx
      index 974ca4f0..f49968fb 100644
      --- a/src/caretogether-pwa/src/Hooks/useInlineEditor.tsx
      +++ b/src/caretogether-pwa/src/Hooks/useInlineEditor.tsx
      @@ -44,7 +44,7 @@ export function useInlineEditor(onSave: (value: T) => Promise, savedVal
               variant="text"
               size="small"
               startIcon={}
      -        sx={{margin: 1}}>
      +        sx={{ margin: 1 }}>
               Edit
             ,
           cancelButton: editing &&
      @@ -54,19 +54,19 @@ export function useInlineEditor(onSave: (value: T) => Promise, savedVal
               size="small"
               startIcon={}
               color="secondary"
      -        sx={{margin: 1}}>
      +        sx={{ margin: 1 }}>
               Cancel
             ,
           saveButton: editing &&
             
         }
      diff --git a/src/caretogether-pwa/src/Hooks/useScopedTrace.ts b/src/caretogether-pwa/src/Hooks/useScopedTrace.ts
      index 3c3b5ddb..45e590bc 100644
      --- a/src/caretogether-pwa/src/Hooks/useScopedTrace.ts
      +++ b/src/caretogether-pwa/src/Hooks/useScopedTrace.ts
      @@ -19,5 +19,5 @@ export function useScopedTrace(component: string) {
               "Component Name": component
             }
           });
      -  }, [ appInsights, component ]);
      +  }, [appInsights, component]);
       }
      diff --git a/src/caretogether-pwa/src/Hooks/useWindowSize.ts b/src/caretogether-pwa/src/Hooks/useWindowSize.ts
      index 45fc4ec1..fd80ec31 100644
      --- a/src/caretogether-pwa/src/Hooks/useWindowSize.ts
      +++ b/src/caretogether-pwa/src/Hooks/useWindowSize.ts
      @@ -15,6 +15,6 @@ export function useWindowSize() {
             window.removeEventListener('resize', handleResize);
           };
         }, []);
      -  
      +
         return size;
       }
      diff --git a/src/caretogether-pwa/src/Model/ConfigurationModel.ts b/src/caretogether-pwa/src/Model/ConfigurationModel.ts
      index dc106695..7b66987e 100644
      --- a/src/caretogether-pwa/src/Model/ConfigurationModel.ts
      +++ b/src/caretogether-pwa/src/Model/ConfigurationModel.ts
      @@ -12,7 +12,7 @@ export const organizationConfigurationEdited = atom {
      +  get: async ({ get }) => {
           const { organizationId } = get(selectedLocationContextState);
           if (organizationId == null)
             return null;
      @@ -23,11 +23,12 @@ export const organizationConfigurationQuery = selector({
             const dataResponse = await api.configuration.getOrganizationConfiguration(organizationId);
             return dataResponse;
           }
      -  }});
      +  }
      +});
       
       export const locationConfigurationQuery = selector({
         key: 'locationConfigurationQuery',
      -  get: ({get}) => {
      +  get: ({ get }) => {
           const organizationConfiguration = get(organizationConfigurationQuery);
           const { locationId } = get(selectedLocationContextState);
           return organizationConfiguration?.locations!.find(x => x.id === locationId);
      @@ -36,7 +37,7 @@ export const locationConfigurationQuery = selector({
       
       export const ethnicitiesData = selector({//TODO: Rename to 'query'
         key: 'COMPATIBILITY__ethnicitiesData',
      -  get: ({get}) => {
      +  get: ({ get }) => {
           const locationConfiguration = get(locationConfigurationQuery);
           return locationConfiguration!.ethnicities!;
         }
      @@ -44,7 +45,7 @@ export const ethnicitiesData = selector({//TODO: Rename to 'query'
       
       export const adultFamilyRelationshipsData = selector({//TODO: Rename to 'query'
         key: 'COMPATIBILITY__adultFamilyRelationshipsData',
      -  get: ({get}) => {
      +  get: ({ get }) => {
           const locationConfiguration = get(locationConfigurationQuery);
           return locationConfiguration!.adultFamilyRelationships!;
         }
      @@ -52,26 +53,27 @@ export const adultFamilyRelationshipsData = selector({//TODO: Rename to 'query'
       
       export const policyData = selector({
         key: 'policyData',
      -  get: async ({get}) => {
      +  get: async ({ get }) => {
           const { organizationId, locationId } = get(selectedLocationContextState);
           const dataResponse = await api.configuration.getEffectiveLocationPolicy(organizationId, locationId);
           return dataResponse;
      -  }});
      +  }
      +});
       
       export const allApprovalAndOnboardingRequirementsData = selector({
         key: 'allApprovalAndOnboardingRequirementsData',
      -  get: ({get}) => {
      +  get: ({ get }) => {
           const policy = get(policyData);
           const sortedActionNames = (policy.actionDefinitions && Object.entries(policy.actionDefinitions)
             .map(([actionName,]) => actionName)
             .sort((a, b) => a < b ? -1 : a > b ? 1 : 0)) || [];
           return sortedActionNames.filter(actionName =>
      -      (policy.volunteerPolicy?.volunteerFamilyRoles && Object.entries(policy.volunteerPolicy.volunteerFamilyRoles).some(([role, rolePolicy]) =>
      -        rolePolicy.policyVersions && Object.entries(rolePolicy.policyVersions).some(([version, rolePolicyVersion]) =>
      +      (policy.volunteerPolicy?.volunteerFamilyRoles && Object.entries(policy.volunteerPolicy.volunteerFamilyRoles).some(([, rolePolicy]) =>
      +        rolePolicy.policyVersions && Object.entries(rolePolicy.policyVersions).some(([, rolePolicyVersion]) =>
                 rolePolicyVersion.requirements && rolePolicyVersion.requirements.some(requirement =>
                   requirement.actionName === actionName && requirement.stage !== RequirementStage.Application)))) ||
      -      (policy.volunteerPolicy?.volunteerRoles && Object.entries(policy.volunteerPolicy.volunteerRoles).some(([role, rolePolicy]) =>
      -        rolePolicy.policyVersions && Object.entries(rolePolicy.policyVersions).some(([version, rolePolicyVersion]) =>
      +      (policy.volunteerPolicy?.volunteerRoles && Object.entries(policy.volunteerPolicy.volunteerRoles).some(([, rolePolicy]) =>
      +        rolePolicy.policyVersions && Object.entries(rolePolicy.policyVersions).some(([, rolePolicyVersion]) =>
                 rolePolicyVersion.requirements && rolePolicyVersion.requirements.some(requirement =>
                   requirement.actionName === actionName && requirement.stage !== RequirementStage.Application)))));
         }
      @@ -79,7 +81,7 @@ export const allApprovalAndOnboardingRequirementsData = selector({
       
       export const familyRequirementsData = selector({
         key: 'familyRequirementsData',
      -  get: ({get}) => {
      +  get: ({ get }) => {
           const policy = get(policyData);
           return (policy.volunteerPolicy?.volunteerFamilyRoles &&
             Object.entries(policy.volunteerPolicy.volunteerFamilyRoles)
      @@ -95,11 +97,12 @@ export const familyRequirementsData = selector({
                   : previous.concat(familyApprovalRequirement);
               }, [] as string[])
               .sort((a, b) => a < b ? -1 : a > b ? 1 : 0)) || [];
      -  }});
      +  }
      +});
       
       export const adultRequirementsData = selector({
         key: 'adultRequirementsData',
      -  get: ({get}) => {
      +  get: ({ get }) => {
           const policy = get(policyData);
           const familyAllAdultRequirements = (policy.volunteerPolicy?.volunteerFamilyRoles &&
             Object.entries(policy.volunteerPolicy.volunteerFamilyRoles)
      @@ -117,31 +120,34 @@ export const adultRequirementsData = selector({
                 return previous.concat(requirements.flat());
               }, [] as string[])) || [];
           return familyAllAdultRequirements.concat(individualRequirements)
      -        .reduce((previous, individualApprovalRequirement) => {
      -          return previous.filter(x => x === individualApprovalRequirement).length > 0
      -            ? previous
      -            : previous.concat(individualApprovalRequirement);
      -        }, [] as string[])
      -        .sort((a, b) => a < b ? -1 : a > b ? 1 : 0);
      -  }});
      +      .reduce((previous, individualApprovalRequirement) => {
      +        return previous.filter(x => x === individualApprovalRequirement).length > 0
      +          ? previous
      +          : previous.concat(individualApprovalRequirement);
      +      }, [] as string[])
      +      .sort((a, b) => a < b ? -1 : a > b ? 1 : 0);
      +  }
      +});
       
       export const allFunctionsInPolicyQuery = selector({
         key: 'allFunctionsInPolicyQuery',
      -  get: ({get}) => {
      +  get: ({ get }) => {
           const policy = get(policyData);
           const allFunctions = policy.referralPolicy?.arrangementPolicies?.flatMap(arrangement =>
             arrangement.arrangementFunctions?.map(arrangementFunction => arrangementFunction.functionName!) || []) || [];
           const uniqueFunctions = Array.from(new Set(allFunctions));
           return uniqueFunctions;
      -  }});
      +  }
      +});
       
       const featureFlagQuery = selector({
         key: 'featureFlagQuery',
      -  get: async ({get}) => {
      +  get: async ({ get }) => {
           const { organizationId, locationId } = get(selectedLocationContextState);
           const dataResponse = await api.configuration.getLocationFlags(organizationId, locationId);
           return dataResponse;
      -  }});
      +  }
      +});
       
       export function useFeatureFlags() {
         return useLoadable(featureFlagQuery);
      diff --git a/src/caretogether-pwa/src/Model/Data.tsx b/src/caretogether-pwa/src/Model/Data.tsx
      index 343c10b9..d076b7bf 100644
      --- a/src/caretogether-pwa/src/Model/Data.tsx
      +++ b/src/caretogether-pwa/src/Model/Data.tsx
      @@ -8,7 +8,7 @@ import { userIdState } from "../Authentication/Auth";
       // This will be available to query (asynchronously) after the userIdState is set (i.e., post-authentication).
       export const userOrganizationAccessQuery = selector({
         key: 'userOrganizationAccessQuery',
      -  get: async ({get}) => {
      +  get: async ({ get }) => {
           //HACK: Requiring the user ID state to be set is a workaround for fall-through issues with the AuthenticationWrapper
           //      and AuthenticatedUserWrapper. Removing this currently would cause runtime errors regarding the MsalProvider
           //      being updated while a child component is being rendered (e.g., the ShellContextSwitcher).
      @@ -34,7 +34,7 @@ export const selectedLocationContextState = atom({
       // This will be available to query after the selectedLocationContextState is set by AppRoutes.
       export const currentOrganizationQuery = selector({
         key: 'currentOrganizationQuery',
      -  get: ({get}) => {
      +  get: ({ get }) => {
           const userOrganizationAccess = get(userOrganizationAccessQuery);
           const selectedLocationContext = get(selectedLocationContextState);
       
      @@ -53,7 +53,7 @@ export const currentOrganizationQuery = selector({
       // This will be available to query after the selectedLocationIdState is set by AppRoutes.
       export const currentLocationQuery = selector({
         key: 'currentLocationQuery',
      -  get: ({get}) => {
      +  get: ({ get }) => {
           const currentOrganization = get(currentOrganizationQuery);
           const selectedLocationContext = get(selectedLocationContextState);
       
      @@ -87,13 +87,13 @@ const visibleAggregatesForScopeData = atomFamily {
      +  get: ({ get }) => {
           const context = get(selectedLocationContextState);
           const visibleAggregates = visibleAggregatesForScopeData(context);
           const results = get(visibleAggregates);
           return results;
         },
      -  set: ({get, set}, newValue) => {
      +  set: ({ get, set }, newValue) => {
           const context = get(selectedLocationContextState);
           set(visibleAggregatesForScopeData(context), newValue);
         }
      @@ -106,7 +106,7 @@ export function useDataLoaded() {
       
       export const visibleFamiliesQuery = selector({
         key: 'visibleFamiliesQuery',
      -  get: ({get}) => {
      +  get: ({ get }) => {
           const visibleAggregates = get(visibleAggregatesState);
           return visibleAggregates.filter(aggregate => aggregate instanceof FamilyRecordsAggregate).map(aggregate =>
             (aggregate as FamilyRecordsAggregate).family!);
      @@ -115,7 +115,7 @@ export const visibleFamiliesQuery = selector({
       
       export const visibleCommunitiesQuery = selector({
         key: 'visibleCommunitiesQuery',
      -  get: ({get}) => {
      +  get: ({ get }) => {
           const visibleAggregates = get(visibleAggregatesState);
           return visibleAggregates.filter(aggregate => aggregate instanceof CommunityRecordsAggregate).map(aggregate =>
             (aggregate as CommunityRecordsAggregate).community!);
      diff --git a/src/caretogether-pwa/src/Model/DirectoryModel.ts b/src/caretogether-pwa/src/Model/DirectoryModel.ts
      index 448c033c..2ce759a2 100644
      --- a/src/caretogether-pwa/src/Model/DirectoryModel.ts
      +++ b/src/caretogether-pwa/src/Model/DirectoryModel.ts
      @@ -63,7 +63,7 @@ export function useCommunityLookup() {
       
       export function useAtomicRecordsCommandCallback(
         callback: (aggregateId: string, ...args: T) => Promise) {
      -  return useRecoilCallback(({snapshot, set}) => {
      +  return useRecoilCallback(({ snapshot, set }) => {
           const asyncCallback = async (aggregateId: string, ...args: T) => {
             const { organizationId, locationId } = await snapshot.getPromise(selectedLocationContextState);
       
      @@ -71,12 +71,12 @@ export function useAtomicRecordsCommandCallback 
      +      set(visibleAggregatesState, current =>
               current.some(currentEntry => currentEntry.id === updatedAggregate.id && currentEntry.constructor === updatedAggregate.constructor)
      -        ? current.map(currentEntry => currentEntry.id === updatedAggregate.id && currentEntry.constructor === updatedAggregate.constructor
      -          ? updatedAggregate
      -          : currentEntry)
      -        : current.concat(updatedAggregate));
      +          ? current.map(currentEntry => currentEntry.id === updatedAggregate.id && currentEntry.constructor === updatedAggregate.constructor
      +            ? updatedAggregate
      +            : currentEntry)
      +          : current.concat(updatedAggregate));
           };
           return asyncCallback;
         })
      @@ -84,20 +84,20 @@ export function useAtomicRecordsCommandCallback(
         callback: (aggregateId: string, ...args: T) => Promise) {
      -  return useRecoilCallback(({snapshot, set}) => {
      +  return useRecoilCallback(({ snapshot, set }) => {
           const asyncCallback = async (aggregateId: string, ...args: T) => {
             const { organizationId, locationId } = await snapshot.getPromise(selectedLocationContextState);
       
             const command = await callback(aggregateId, ...args);
       
             const updatedAggregate = await api.records.submitCompositeRecordsCommand(organizationId, locationId, command);
      -      
      +
             set(visibleAggregatesState, current =>
               current.some(currentEntry => currentEntry.id === updatedAggregate.id)
      -        ? current.map(currentEntry => currentEntry.id === updatedAggregate.id
      -          ? updatedAggregate
      -          : currentEntry)
      -        : current.concat(updatedAggregate));
      +          ? current.map(currentEntry => currentEntry.id === updatedAggregate.id
      +            ? updatedAggregate
      +            : currentEntry)
      +          : current.concat(updatedAggregate));
           };
           return asyncCallback;
         })
      @@ -106,7 +106,7 @@ function useCompositeRecordsCommandCallback(
       function useFamilyCommandCallback(
         callback: (familyId: string, ...args: T) => Promise) {
         return useAtomicRecordsCommandCallback(async (familyId, ...args: T) => {
      -    var command = new FamilyRecordsCommand();
      +    const command = new FamilyRecordsCommand();
           command.command = await callback(familyId, ...args);
           return command;
         });
      @@ -115,7 +115,7 @@ function useFamilyCommandCallback(
       function usePersonCommandCallback(
         callback: (familyId: string, ...args: T) => Promise) {
         return useAtomicRecordsCommandCallback(async (familyId, ...args: T) => {
      -    var command = new PersonRecordsCommand();
      +    const command = new PersonRecordsCommand();
           command.command = await callback(familyId, ...args);
           command.familyId = familyId;
           return command;
      @@ -125,7 +125,7 @@ function usePersonCommandCallback(
       function useNoteCommandCallback(
         callback: (familyId: string, ...args: T) => Promise) {
         return useAtomicRecordsCommandCallback(async (familyId, ...args: T) => {
      -    var command = new NoteRecordsCommand();
      +    const command = new NoteRecordsCommand();
           command.command = await callback(familyId, ...args);
           return command;
         });
      @@ -134,7 +134,7 @@ function useNoteCommandCallback(
       export function useCommunityCommand(
         callback: (communityId: string, ...args: TArgs) => TCommand) {
         return useAtomicRecordsCommandCallback(async (communityId, ...args: TArgs) => {
      -    var command = new CommunityRecordsCommand();
      +    const command = new CommunityRecordsCommand();
           command.command = callback(communityId, ...args);
           return command;
         });
      @@ -318,10 +318,10 @@ export function useDirectoryModel() {
           });
         const addAdult = useCompositeRecordsCommandCallback(
           async (familyId, firstName: string, lastName: string, gender: Gender | null, age: Age | null, ethnicity: string | null,
      -        isInHousehold: boolean, relationshipToFamily: string,
      -        address: Address | null,
      -        phoneNumber: string | null, phoneType: PhoneNumberType | null, emailAddress: string | null, emailType: EmailAddressType | null,
      -        notes?: string, concerns?: string) => {
      +      isInHousehold: boolean, relationshipToFamily: string,
      +      address: Address | null,
      +      phoneNumber: string | null, phoneType: PhoneNumberType | null, emailAddress: string | null, emailType: EmailAddressType | null,
      +      notes?: string, concerns?: string) => {
             const command = new AddAdultToFamilyCommand();
             command.familyId = familyId;
             command.personId = crypto.randomUUID();
      @@ -353,8 +353,8 @@ export function useDirectoryModel() {
           });
         const addChild = useCompositeRecordsCommandCallback(
           async (familyId, firstName: string, lastName: string, gender: Gender | null, age: Age | null, ethnicity: string | null,
      -        custodialRelationships: CustodialRelationship[],
      -        notes?: string, concerns?: string) => {
      +      custodialRelationships: CustodialRelationship[],
      +      notes?: string, concerns?: string) => {
             const command = new AddChildToFamilyCommand();
             command.familyId = familyId;
             command.personId = crypto.randomUUID();
      @@ -482,7 +482,7 @@ export function useDirectoryModel() {
             command.backdatedTimestampUtc = backdatedTimestampLocal;
             return command;
           });
      -  
      +
         return {
           uploadFamilyDocument,
           deleteUploadedFamilyDocument,
      diff --git a/src/caretogether-pwa/src/Model/FilesModel.ts b/src/caretogether-pwa/src/Model/FilesModel.ts
      index c45d9cde..99fb2c02 100644
      --- a/src/caretogether-pwa/src/Model/FilesModel.ts
      +++ b/src/caretogether-pwa/src/Model/FilesModel.ts
      @@ -4,7 +4,7 @@ import { api } from "../Api/Api";
       export async function uploadFamilyFileToTenant(organizationId: string, locationId: string, familyId: string, formFile: File) {
         const fileBuffer = await formFile.arrayBuffer();
         const documentId = crypto.randomUUID();
      -  
      +
         const uploadInfo = await api.files.generateFamilyDocumentUploadValetUrl(organizationId, locationId, familyId, documentId);
       
         const blobClient = new BlockBlobClient(uploadInfo.valetUrl as string, new AnonymousCredential());
      @@ -18,7 +18,7 @@ export async function uploadFamilyFileToTenant(organizationId: string, locationI
         return uploadInfo.documentId as string;
       }
       
      -export async function downloadFamilyFile(organizationId: string, locationId: string, familyId: string, documentId: string) {  
      +export async function downloadFamilyFile(organizationId: string, locationId: string, familyId: string, documentId: string) {
         const downloadUrl = await api.files.getFamilyDocumentReadValetUrl(organizationId, locationId, familyId, documentId);
       
         window.location.href = downloadUrl;
      @@ -27,7 +27,7 @@ export async function downloadFamilyFile(organizationId: string, locationId: str
       export async function uploadCommunityFileToTenant(organizationId: string, locationId: string, communityId: string, formFile: File) {
         const fileBuffer = await formFile.arrayBuffer();
         const documentId = crypto.randomUUID();
      -  
      +
         const uploadInfo = await api.files.generateCommunityDocumentUploadValetUrl(organizationId, locationId, communityId, documentId);
       
         const blobClient = new BlockBlobClient(uploadInfo.valetUrl as string, new AnonymousCredential());
      @@ -41,7 +41,7 @@ export async function uploadCommunityFileToTenant(organizationId: string, locati
         return uploadInfo.documentId as string;
       }
       
      -export async function downloadCommunityFile(organizationId: string, locationId: string, communityId: string, documentId: string) {  
      +export async function downloadCommunityFile(organizationId: string, locationId: string, communityId: string, documentId: string) {
         const downloadUrl = await api.files.getCommunityDocumentReadValetUrl(organizationId, locationId, communityId, documentId);
       
         window.location.href = downloadUrl;
      diff --git a/src/caretogether-pwa/src/Model/ReferralsModel.ts b/src/caretogether-pwa/src/Model/ReferralsModel.ts
      index 10660b6c..181a65ce 100644
      --- a/src/caretogether-pwa/src/Model/ReferralsModel.ts
      +++ b/src/caretogether-pwa/src/Model/ReferralsModel.ts
      @@ -5,15 +5,16 @@ import { visibleFamiliesQuery } from "./Data";
       
       export const partneringFamiliesData = selector({
         key: 'partneringFamiliesData',
      -  get: ({get}) => {
      +  get: ({ get }) => {
           const visibleFamilies = get(visibleFamiliesQuery);
           return visibleFamilies.filter(f => f.partneringFamilyInfo);
      -  }});
      +  }
      +});
       
       function useReferralCommandCallbackWithLocation(
         callback: (familyId: string, ...args: T) => Promise) {
         return useAtomicRecordsCommandCallback(async (familyId, ...args: T) => {
      -    var command = new ReferralRecordsCommand();
      +    const command = new ReferralRecordsCommand();
           command.command = await callback(familyId, ...args);
           return command;
         });
      @@ -22,7 +23,7 @@ function useReferralCommandCallbackWithLocation(
       function useArrangementsCommandCallbackWithLocation(
         callback: (familyId: string, ...args: T) => Promise) {
         return useAtomicRecordsCommandCallback(async (familyId, ...args: T) => {
      -    var command = new ArrangementRecordsCommand();
      +    const command = new ArrangementRecordsCommand();
           command.command = await callback(familyId, ...args);
           return command;
         });
      @@ -30,7 +31,7 @@ function useArrangementsCommandCallbackWithLocation(
       
       export function useReferralsModel() {
         const completeReferralRequirement = useReferralCommandCallbackWithLocation(
      -    async (partneringFamilyId: string, referralId: string, requirementName: string, requirement: ActionRequirement,
      +    async (partneringFamilyId: string, referralId: string, requirementName: string, _requirement: ActionRequirement,
             completedAtLocal: Date, documentId: string | null, noteId: string | null) => {
             const command = new CompleteReferralRequirement({
               familyId: partneringFamilyId,
      @@ -100,7 +101,7 @@ export function useReferralsModel() {
           });
         const completeArrangementRequirement = useArrangementsCommandCallbackWithLocation(
           async (partneringFamilyId: string, referralId: string, arrangementIds: string[],
      -      requirementName: string, requirement: ActionRequirement,
      +      requirementName: string, _requirement: ActionRequirement,
             completedAtLocal: Date, documentId: string | null, noteId: string | null) => {
             const command = new CompleteArrangementRequirement({
               familyId: partneringFamilyId,
      @@ -130,7 +131,7 @@ export function useReferralsModel() {
           });
         const exemptArrangementRequirement = useArrangementsCommandCallbackWithLocation(
           async (partneringFamilyId: string, referralId: string, arrangementIds: string[],
      -      requirement: MissingArrangementRequirement, exemptAll: Boolean,
      +      requirement: MissingArrangementRequirement, exemptAll: boolean,
             additionalComments: string, exemptionExpiresAtLocal: Date | null) => {
             const command = new ExemptArrangementRequirement({
               familyId: partneringFamilyId,
      @@ -157,11 +158,11 @@ export function useReferralsModel() {
             command.dueDate = exemptedRequirement.dueDate;
             return command;
           });
      -    
      +
         const completeVolunteerFamilyAssignmentRequirement = useArrangementsCommandCallbackWithLocation(
           async (partneringFamilyId: string, referralId: string, arrangementIds: string[],
             assignment: FamilyVolunteerAssignment,
      -      requirementName: string, requirement: ActionRequirement,
      +      requirementName: string, _requirement: ActionRequirement,
             completedAtLocal: Date, documentId: string | null, noteId: string | null) => {
             const command = new CompleteVolunteerFamilyAssignmentRequirement({
               familyId: partneringFamilyId,
      @@ -198,7 +199,7 @@ export function useReferralsModel() {
         const exemptVolunteerFamilyAssignmentRequirement = useArrangementsCommandCallbackWithLocation(
           async (partneringFamilyId: string, referralId: string, arrangementIds: string[],
             assignment: FamilyVolunteerAssignment,
      -      requirement: MissingArrangementRequirement, exemptAll: Boolean,
      +      requirement: MissingArrangementRequirement, exemptAll: boolean,
             additionalComments: string, exemptionExpiresAtLocal: Date | null) => {
             const command = new ExemptVolunteerFamilyAssignmentRequirement({
               familyId: partneringFamilyId,
      @@ -236,7 +237,7 @@ export function useReferralsModel() {
         const completeIndividualVolunteerAssignmentRequirement = useArrangementsCommandCallbackWithLocation(
           async (partneringFamilyId: string, referralId: string, arrangementIds: string[],
             assignment: IndividualVolunteerAssignment,
      -      requirementName: string, requirement: ActionRequirement,
      +      requirementName: string, _requirement: ActionRequirement,
             completedAtLocal: Date, documentId: string | null, noteId: string | null) => {
             const command = new CompleteIndividualVolunteerAssignmentRequirement({
               familyId: partneringFamilyId,
      @@ -275,7 +276,7 @@ export function useReferralsModel() {
         const exemptIndividualVolunteerAssignmentRequirement = useArrangementsCommandCallbackWithLocation(
           async (partneringFamilyId: string, referralId: string, arrangementIds: string[],
             assignment: IndividualVolunteerAssignment,
      -      requirement: MissingArrangementRequirement, exemptAll: Boolean,
      +      requirement: MissingArrangementRequirement, exemptAll: boolean,
             additionalComments: string, exemptionExpiresAtLocal: Date | null) => {
             const command = new ExemptIndividualVolunteerAssignmentRequirement({
               familyId: partneringFamilyId,
      @@ -311,7 +312,7 @@ export function useReferralsModel() {
             command.dueDate = exemptedRequirement.dueDate;
             return command;
           });
      -    
      +
         const createArrangement = useArrangementsCommandCallbackWithLocation(
           async (partneringFamilyId: string, referralId: string, arrangementType: string,
             requestedAtLocal: Date, partneringFamilyPersonId: string, reason: string | null) => {
      @@ -565,14 +566,14 @@ export function useReferralsModel() {
         const openReferral = useReferralCommandCallbackWithLocation(
           async (partneringFamilyId: string,
             openedAtLocal: Date) => {
      -        const command = new CreateReferral({
      -          familyId: partneringFamilyId
      -        });
      -        command.referralId = crypto.randomUUID();
      -        command.openedAtUtc = openedAtLocal;
      -        return command;
      -      });
      -  
      +      const command = new CreateReferral({
      +        familyId: partneringFamilyId
      +      });
      +      command.referralId = crypto.randomUUID();
      +      command.openedAtUtc = openedAtLocal;
      +      return command;
      +    });
      +
         return {
           completeReferralRequirement,
           markReferralRequirementIncomplete,
      @@ -615,4 +616,3 @@ export function useReferralsModel() {
           openReferral
         };
       }
      -  
      \ No newline at end of file
      diff --git a/src/caretogether-pwa/src/Model/SessionModel.ts b/src/caretogether-pwa/src/Model/SessionModel.ts
      index 3d96873a..e69de822 100644
      --- a/src/caretogether-pwa/src/Model/SessionModel.ts
      +++ b/src/caretogether-pwa/src/Model/SessionModel.ts
      @@ -12,16 +12,17 @@ export const redemptionSessionIdState = atom({
       
       export const inviteReviewInfoQuery = selector({
         key: 'inviteReviewInfoQuery',
      -  get: async ({get}) => {
      +  get: async ({ get }) => {
           const redemptionSessionId = get(redemptionSessionIdState);
      -    
      +
           if (redemptionSessionId) {
             const inviteReviewInfo = await api.users.examinePersonInviteRedemptionSession(redemptionSessionId);
             return inviteReviewInfo;
           } else {
             return null;
           }
      -}});
      +  }
      +});
       
       function usePermissions(applicablePermissions?: Permission[]) {
         //TODO: If we want to expose a "not-yet-loaded" state, update this to return 'null' from
      diff --git a/src/caretogether-pwa/src/Model/VolunteersModel.ts b/src/caretogether-pwa/src/Model/VolunteersModel.ts
      index a2456c1f..69f87a39 100644
      --- a/src/caretogether-pwa/src/Model/VolunteersModel.ts
      +++ b/src/caretogether-pwa/src/Model/VolunteersModel.ts
      @@ -14,7 +14,7 @@ export const volunteerFamiliesData = selector({
       function useVolunteerFamilyCommandCallbackWithLocation(
         callback: (familyId: string, ...args: T) => Promise) {
         return useAtomicRecordsCommandCallback(async (familyId, ...args: T) => {
      -    var command = new FamilyApprovalRecordsCommand();
      +    const command = new FamilyApprovalRecordsCommand();
           command.command = await callback(familyId, ...args);
           return command;
         });
      @@ -23,7 +23,7 @@ function useVolunteerFamilyCommandCallbackWithLocation(
       function useVolunteerCommandCallbackWithLocation(
         callback: (familyId: string, ...args: T) => Promise) {
         return useAtomicRecordsCommandCallback(async (familyId, ...args: T) => {
      -    var command = new IndividualApprovalRecordsCommand();
      +    const command = new IndividualApprovalRecordsCommand();
           command.command = await callback(familyId, ...args);
           return command;
         });
      @@ -31,7 +31,7 @@ function useVolunteerCommandCallbackWithLocation(
       
       export function useVolunteersModel() {
         const completeFamilyRequirement = useVolunteerFamilyCommandCallbackWithLocation(
      -    async (volunteerFamilyId, requirementName: string, requirement: ActionRequirement,
      +    async (volunteerFamilyId, requirementName: string, _requirement: ActionRequirement,
             completedAtLocal: Date, documentId: string | null, noteId: string | null) => {
             const command = new CompleteVolunteerFamilyRequirement({
               familyId: volunteerFamilyId
      @@ -94,7 +94,7 @@ export function useVolunteersModel() {
             return command;
           });
         const completeIndividualRequirement = useVolunteerCommandCallbackWithLocation(
      -    async (volunteerFamilyId, personId: string, requirementName: string, requirement: ActionRequirement,
      +    async (volunteerFamilyId, personId: string, requirementName: string, _requirement: ActionRequirement,
             completedAtLocal: Date, documentId: string | null, noteId: string | null) => {
             const command = new CompleteVolunteerRequirement({
               familyId: volunteerFamilyId,
      @@ -162,7 +162,7 @@ export function useVolunteersModel() {
             command.roleName = role;
             return command;
           });
      -  
      +
         return {
           completeFamilyRequirement,
           markFamilyRequirementIncomplete,
      diff --git a/src/caretogether-pwa/src/Notes/AddEditNoteDialog.tsx b/src/caretogether-pwa/src/Notes/AddEditNoteDialog.tsx
      index 851debf7..0bf2dd9f 100644
      --- a/src/caretogether-pwa/src/Notes/AddEditNoteDialog.tsx
      +++ b/src/caretogether-pwa/src/Notes/AddEditNoteDialog.tsx
      @@ -11,7 +11,7 @@ interface AddEditNoteDialogProps {
         onClose: () => void
       }
       
      -export function AddEditNoteDialog({familyId, note, onClose}: AddEditNoteDialogProps) {
      +export function AddEditNoteDialog({ familyId, note, onClose }: AddEditNoteDialogProps) {
         const [fields, setFields] = useState({
           contents: note?.contents || '',
           backdatedTimestampLocal: note?.backdatedTimestampUtc
      @@ -37,7 +37,7 @@ export function AddEditNoteDialog({familyId, note, onClose}: AddEditNoteDialogPr
                     id="notes"
                     label="Notes" placeholder="Space for any general notes"
                     required multiline fullWidth variant="outlined" minRows={6} size="medium"
      -              value={contents} onChange={e => setFields({...fields, contents: e.target.value})}
      +              value={contents} onChange={e => setFields({ ...fields, contents: e.target.value })}
                   />
                 
                 
      @@ -45,8 +45,8 @@ export function AddEditNoteDialog({familyId, note, onClose}: AddEditNoteDialogPr
                     label="Backdate (optional - leave blank to use the current date & time)"
                     value={backdatedTimestampLocal || null}
                     disableFuture format="M/d/yyyy h:mm a"
      -              onChange={(date: any) => setFields({...fields, backdatedTimestampLocal: date})}
      -              slotProps={{ textField: { fullWidth: true}}} />
      +              onChange={(date: Date | null) => setFields({ ...fields, backdatedTimestampLocal: date ?? undefined })}
      +              slotProps={{ textField: { fullWidth: true } }} />
                 
               
             
      diff --git a/src/caretogether-pwa/src/Notes/ApproveNoteDialog.tsx b/src/caretogether-pwa/src/Notes/ApproveNoteDialog.tsx
      index 1c5b5886..582d0ce6 100644
      --- a/src/caretogether-pwa/src/Notes/ApproveNoteDialog.tsx
      +++ b/src/caretogether-pwa/src/Notes/ApproveNoteDialog.tsx
      @@ -11,7 +11,7 @@ interface ApproveNoteDialogProps {
         onClose: () => void
       }
       
      -export function ApproveNoteDialog({familyId, note, onClose}: ApproveNoteDialogProps) {
      +export function ApproveNoteDialog({ familyId, note, onClose }: ApproveNoteDialogProps) {
         const directoryModel = useDirectoryModel();
         const userLookup = useUserLookup();
       
      diff --git a/src/caretogether-pwa/src/Notes/DiscardNoteDialog.tsx b/src/caretogether-pwa/src/Notes/DiscardNoteDialog.tsx
      index a7252e7b..fb1c0700 100644
      --- a/src/caretogether-pwa/src/Notes/DiscardNoteDialog.tsx
      +++ b/src/caretogether-pwa/src/Notes/DiscardNoteDialog.tsx
      @@ -11,7 +11,7 @@ interface DiscardNoteDialogProps {
         onClose: () => void
       }
       
      -export function DiscardNoteDialog({familyId, note, onClose}: DiscardNoteDialogProps) {
      +export function DiscardNoteDialog({ familyId, note, onClose }: DiscardNoteDialogProps) {
         const directoryModel = useDirectoryModel();
         const userLookup = useUserLookup();
       
      diff --git a/src/caretogether-pwa/src/Notes/NoteCard.tsx b/src/caretogether-pwa/src/Notes/NoteCard.tsx
      index 7e1cf6b6..8ffc79a0 100644
      --- a/src/caretogether-pwa/src/Notes/NoteCard.tsx
      +++ b/src/caretogether-pwa/src/Notes/NoteCard.tsx
      @@ -6,7 +6,7 @@ import {
         Button,
         Typography,
       } from '@mui/material';
      -import React, { useState } from 'react';
      +import { useState } from 'react';
       import { Note, NoteStatus, Permission } from '../GeneratedClient';
       import { useUserLookup } from '../Model/DirectoryModel';
       import { PersonName } from '../Families/PersonName';
      @@ -33,8 +33,8 @@ export function NoteCard({ familyId, note }: NoteCardProps) {
         const permissions = useFamilyIdPermissions(familyId);
       
         return typeof note === 'undefined' ? null : (
      -    
      -      
      +      
                 
                 {note.status === NoteStatus.Draft ? " - DRAFT" : ""}
      @@ -51,13 +51,13 @@ export function NoteCard({ familyId, note }: NoteCardProps) {
               
             
             {note.status === NoteStatus.Draft &&
      -        
      +        
                 {permissions(Permission.DiscardDraftNotes) && }
      @@ -65,7 +65,7 @@ export function NoteCard({ familyId, note }: NoteCardProps) {
                   onClick={() => setShowEditNoteDialog(true)}
                   variant="contained"
                   size="small"
      -            sx={{marginTop: 1, marginLeft: 'auto !important'}}
      +            sx={{ marginTop: 1, marginLeft: 'auto !important' }}
                   startIcon={}>
                   Edit
                 }
      @@ -73,7 +73,7 @@ export function NoteCard({ familyId, note }: NoteCardProps) {
                   onClick={() => setShowApproveNoteDialog(true)}
                   variant="contained"
                   size="small"
      -            sx={{marginTop: 1, marginLeft: 'auto !important'}}
      +            sx={{ marginTop: 1, marginLeft: 'auto !important' }}
                   startIcon={}>
                   Approve
                 }
      diff --git a/src/caretogether-pwa/src/Referrals/Arrangements/ArrangementCard.tsx b/src/caretogether-pwa/src/Referrals/Arrangements/ArrangementCard.tsx
      index c8e18ce2..4029aa38 100644
      --- a/src/caretogether-pwa/src/Referrals/Arrangements/ArrangementCard.tsx
      +++ b/src/caretogether-pwa/src/Referrals/Arrangements/ArrangementCard.tsx
      @@ -50,14 +50,14 @@ interface ChildLocationIndicatorProps {
         arrangementPolicy: ArrangementPolicy
         summaryOnly?: boolean
       }
      -function ChildLocationIndicator({ partneringFamily, referralId, arrangement, arrangementPolicy, summaryOnly }: ChildLocationIndicatorProps) {
      +function ChildLocationIndicator({ partneringFamily, referralId, arrangement, summaryOnly }: ChildLocationIndicatorProps) {
         const familyLookup = useFamilyLookup();
         const [showTrackChildLocationDialog, setShowTrackChildLocationDialog] = useState(false);
       
         const currentLocation = arrangement.childLocationHistory && arrangement.childLocationHistory.length > 0
           ? arrangement.childLocationHistory[arrangement.childLocationHistory.length - 1]
           : null;
      -  
      +
         // The planned location that is of interest is always the next one after the stay with the current family.
         // This means that, whether the current location change happened before, on, or after the corresponding planned change,
         // the next planned location to display will always be whatever other family the child is set to go to next.
      @@ -66,12 +66,12 @@ function ChildLocationIndicator({ partneringFamily, referralId, arrangement, arr
         // most recently missed planned change.
         const nextPlannedLocation = arrangement.childLocationPlan && arrangement.childLocationPlan.length > 0
           ? arrangement.childLocationPlan.find(entry =>
      -        currentLocation == null ||
      -        (entry.timestampUtc! > currentLocation.timestampUtc! &&
      -          entry.childLocationFamilyId !== currentLocation.childLocationFamilyId)) ||
      -      arrangement.childLocationPlan.slice().reverse().find(entry =>
      -        entry.childLocationFamilyId !== currentLocation?.childLocationFamilyId) ||
      -      null
      +      currentLocation == null ||
      +      (entry.timestampUtc! > currentLocation.timestampUtc! &&
      +        entry.childLocationFamilyId !== currentLocation.childLocationFamilyId)) ||
      +    arrangement.childLocationPlan.slice().reverse().find(entry =>
      +      entry.childLocationFamilyId !== currentLocation?.childLocationFamilyId) ||
      +    null
           : null;
       
         const nextPlanIsPastDue = nextPlannedLocation && nextPlannedLocation.timestampUtc! < new Date();
      @@ -80,37 +80,39 @@ function ChildLocationIndicator({ partneringFamily, referralId, arrangement, arr
           <>
             {summaryOnly
               ? <>
      -            
      -            {
      -              currentLocation
      +          
      +          {
      +            currentLocation
                     ? 
                     : Location unspecified
      -            }
      -          
      +          }
      +        
               : <>
      -            
      -            {showTrackChildLocationDialog &&  setShowTrackChildLocationDialog(false)} />}
      -          }
      -      
      +          
      +          {showTrackChildLocationDialog &&  setShowTrackChildLocationDialog(false)} />}
      +        }
      +      
               {nextPlannedLocation == null
                 ? No upcoming plans
                 : 
      -              {nextPlanIsPastDue && "PAST DUE - "}
      -              
      -               on {format(nextPlannedLocation.timestampUtc!, 'M/d/yyyy')}
      -            }
      -        
      +             on {format(nextPlannedLocation.timestampUtc!, 'M/d/yyyy')}
      +          }
      +        
      +          color: nextPlanIsPastDue ? 'red' : summaryOnly ? '#00000042' : null
      +        }} />
             
           
         );
      @@ -131,7 +133,7 @@ function ArrangementPlannedDuration({ partneringFamily, referralId, arrangement,
         const plannedStartEditor = useInlineEditor(async value => {
           await referralsModel.planArrangementStart(partneringFamilyId, referralId, arrangement.id!, value);
         }, arrangement.plannedStartUtc || null);
      -  
      +
         const plannedEndEditor = useInlineEditor(async value => {
           await referralsModel.planArrangementEnd(partneringFamilyId, referralId, arrangement.id!, value);
         }, arrangement.plannedEndUtc || null);
      @@ -143,21 +145,21 @@ function ArrangementPlannedDuration({ partneringFamily, referralId, arrangement,
               {(!summaryOnly && permissions(Permission.EditArrangement))
                 ? plannedStartEditor.editing
                   ? <>
      -                 plannedStartEditor.setValue(value)}
      -                  slotProps={{ textField: { size: 'small', margin: 'dense' }}} />
      -                {plannedStartEditor.cancelButton}
      -                {plannedStartEditor.saveButton}
      -              
      +               plannedStartEditor.setValue(value)}
      +                slotProps={{ textField: { size: 'small', margin: 'dense' } }} />
      +              {plannedStartEditor.cancelButton}
      +              {plannedStartEditor.saveButton}
      +            
                   : <>
      -                {plannedStartEditor.value ? format(plannedStartEditor.value, "M/d/yyyy") : "-"}
      -                {plannedStartEditor.editButton}
      -              
      -          : <>
                     {plannedStartEditor.value ? format(plannedStartEditor.value, "M/d/yyyy") : "-"}
      +              {plannedStartEditor.editButton}
                   
      +          : <>
      +            {plannedStartEditor.value ? format(plannedStartEditor.value, "M/d/yyyy") : "-"}
      +          
               }
             
             
      @@ -165,21 +167,21 @@ function ArrangementPlannedDuration({ partneringFamily, referralId, arrangement,
               {(!summaryOnly && permissions(Permission.EditArrangement))
                 ? plannedEndEditor.editing
                   ? <>
      -                 plannedEndEditor.setValue(value)}
      -                  slotProps={{ textField: { size: 'small', margin: 'dense'}}} />
      -                {plannedEndEditor.cancelButton}
      -                {plannedEndEditor.saveButton}
      -              
      +               plannedEndEditor.setValue(value)}
      +                slotProps={{ textField: { size: 'small', margin: 'dense' } }} />
      +              {plannedEndEditor.cancelButton}
      +              {plannedEndEditor.saveButton}
      +            
                   : <>
      -                {plannedEndEditor.value ? format(plannedEndEditor.value, "M/d/yyyy") : "-"}
      -                {plannedEndEditor.editButton}
      -              
      -          : <>
                     {plannedEndEditor.value ? format(plannedEndEditor.value, "M/d/yyyy") : "-"}
      -            }
      +              {plannedEndEditor.editButton}
      +            
      +          : <>
      +            {plannedEndEditor.value ? format(plannedEndEditor.value, "M/d/yyyy") : "-"}
      +          }
             
           
         );
      @@ -206,9 +208,9 @@ export function ArrangementCard({ partneringFamily, referralId, arrangement, sum
           referralId: referralId,
           arrangementId: arrangement.id!
         };
      -  
      +
         const arrangementPolicy = policy.referralPolicy?.arrangementPolicies?.find(a => a.arrangementType === arrangement.arrangementType);
      -  
      +
         const missingAssignmentFunctions = arrangementPolicy?.arrangementFunctions?.filter(functionPolicy =>
           (functionPolicy.requirement === FunctionRequirement.ExactlyOne || functionPolicy.requirement === FunctionRequirement.OneOrMore) &&
           !arrangement.familyVolunteerAssignments?.some(x => x.arrangementFunction === functionPolicy.functionName) &&
      @@ -216,72 +218,88 @@ export function ArrangementCard({ partneringFamily, referralId, arrangement, sum
       
         const assignmentsMissingVariants = arrangementPolicy?.arrangementFunctions?.filter(functionPolicy =>
           functionPolicy.variants && functionPolicy.variants.length > 0).map(functionPolicy =>
      -    (arrangement.familyVolunteerAssignments?.filter(fva =>
      -      fva.arrangementFunction === functionPolicy.functionName && !fva.arrangementFunctionVariant)?.length || 0) +
      -    (arrangement.individualVolunteerAssignments?.filter(iva =>
      -      iva.arrangementFunction === functionPolicy.functionName && !iva.arrangementFunctionVariant)?.length || 0)).reduce(
      -    (prev, curr) => prev + curr, 0) || 0;
      -  
      +      (arrangement.familyVolunteerAssignments?.filter(fva =>
      +        fva.arrangementFunction === functionPolicy.functionName && !fva.arrangementFunctionVariant)?.length || 0) +
      +      (arrangement.individualVolunteerAssignments?.filter(iva =>
      +        iva.arrangementFunction === functionPolicy.functionName && !iva.arrangementFunctionVariant)?.length || 0)).reduce(
      +          (prev, curr) => prev + curr, 0) || 0;
      +
         const completedRequirementsWithContext =
           (arrangement.completedRequirements || []).map(cr =>
             ({ completed: cr, context: arrangementRequirementContext as RequirementContext })).concat(
      -    (arrangement.familyVolunteerAssignments || []).flatMap(fva => (fva.completedRequirements || []).map(cr =>
      -      ({ completed: cr, context: {
      -        kind: "Family Volunteer Assignment",
      -        partneringFamilyId: partneringFamily.family!.id!,
      -        referralId: referralId,
      -        arrangementId: arrangement.id!,
      -        assignment: fva } as RequirementContext})))).concat(
      -    (arrangement.individualVolunteerAssignments || []).flatMap(iva => (iva.completedRequirements || []).map(cr =>
      -      ({ completed: cr, context: {
      -        kind: "Individual Volunteer Assignment",
      -        partneringFamilyId: partneringFamily.family!.id!,
      -        referralId: referralId,
      -        arrangementId: arrangement.id!,
      -        assignment: iva }}))));
      -  
      +        (arrangement.familyVolunteerAssignments || []).flatMap(fva => (fva.completedRequirements || []).map(cr =>
      +        ({
      +          completed: cr, context: {
      +            kind: "Family Volunteer Assignment",
      +            partneringFamilyId: partneringFamily.family!.id!,
      +            referralId: referralId,
      +            arrangementId: arrangement.id!,
      +            assignment: fva
      +          } as RequirementContext
      +        })))).concat(
      +          (arrangement.individualVolunteerAssignments || []).flatMap(iva => (iva.completedRequirements || []).map(cr =>
      +          ({
      +            completed: cr, context: {
      +              kind: "Individual Volunteer Assignment",
      +              partneringFamilyId: partneringFamily.family!.id!,
      +              referralId: referralId,
      +              arrangementId: arrangement.id!,
      +              assignment: iva
      +            }
      +          }))));
      +
         const exemptedRequirementsWithContext =
           (arrangement.exemptedRequirements || []).map(er =>
             ({ exempted: er, context: arrangementRequirementContext as RequirementContext })).concat(
      -    (arrangement.familyVolunteerAssignments || []).flatMap(fva => (fva.exemptedRequirements || []).map(er =>
      -      ({ exempted: er, context: {
      -        kind: "Family Volunteer Assignment",
      -        partneringFamilyId: partneringFamily.family!.id!,
      -        referralId: referralId,
      -        arrangementId: arrangement.id!,
      -        assignment: fva } as RequirementContext})))).concat(
      -    (arrangement.individualVolunteerAssignments || []).flatMap(iva => (iva.exemptedRequirements || []).map(er =>
      -      ({ exempted: er, context: {
      -        kind: "Individual Volunteer Assignment",
      -        partneringFamilyId: partneringFamily.family!.id!,
      -        referralId: referralId,
      -        arrangementId: arrangement.id!,
      -        assignment: iva }}))));
      +        (arrangement.familyVolunteerAssignments || []).flatMap(fva => (fva.exemptedRequirements || []).map(er =>
      +        ({
      +          exempted: er, context: {
      +            kind: "Family Volunteer Assignment",
      +            partneringFamilyId: partneringFamily.family!.id!,
      +            referralId: referralId,
      +            arrangementId: arrangement.id!,
      +            assignment: fva
      +          } as RequirementContext
      +        })))).concat(
      +          (arrangement.individualVolunteerAssignments || []).flatMap(iva => (iva.exemptedRequirements || []).map(er =>
      +          ({
      +            exempted: er, context: {
      +              kind: "Individual Volunteer Assignment",
      +              partneringFamilyId: partneringFamily.family!.id!,
      +              referralId: referralId,
      +              arrangementId: arrangement.id!,
      +              assignment: iva
      +            }
      +          }))));
       
         const missingRequirementsWithContext = (arrangement.missingRequirements || []).map(requirement => {
           if (requirement.personId) {
      -      return { missing: requirement, context: {
      -        kind: "Individual Volunteer Assignment",
      -        partneringFamilyId: partneringFamily.family!.id!,
      -        referralId: referralId,
      -        arrangementId: arrangement.id!,
      -        assignment: arrangement.individualVolunteerAssignments!.find(iva =>
      -          iva.arrangementFunction === requirement.arrangementFunction &&
      -          iva.arrangementFunctionVariant === requirement.arrangementFunctionVariant &&
      -          iva.familyId === requirement.volunteerFamilyId &&
      -          iva.personId === requirement.personId)!
      -      } as RequirementContext };
      +      return {
      +        missing: requirement, context: {
      +          kind: "Individual Volunteer Assignment",
      +          partneringFamilyId: partneringFamily.family!.id!,
      +          referralId: referralId,
      +          arrangementId: arrangement.id!,
      +          assignment: arrangement.individualVolunteerAssignments!.find(iva =>
      +            iva.arrangementFunction === requirement.arrangementFunction &&
      +            iva.arrangementFunctionVariant === requirement.arrangementFunctionVariant &&
      +            iva.familyId === requirement.volunteerFamilyId &&
      +            iva.personId === requirement.personId)!
      +        } as RequirementContext
      +      };
           } else if (requirement.volunteerFamilyId) {
      -      return { missing: requirement, context: {
      -        kind: "Family Volunteer Assignment",
      -        partneringFamilyId: partneringFamily.family!.id!,
      -        referralId: referralId,
      -        arrangementId: arrangement.id!,
      -        assignment: arrangement.familyVolunteerAssignments!.find(iva =>
      -          iva.arrangementFunction === requirement.arrangementFunction &&
      -          iva.arrangementFunctionVariant === requirement.arrangementFunctionVariant &&
      -          iva.familyId === requirement.volunteerFamilyId)!
      -      } as RequirementContext };
      +      return {
      +        missing: requirement, context: {
      +          kind: "Family Volunteer Assignment",
      +          partneringFamilyId: partneringFamily.family!.id!,
      +          referralId: referralId,
      +          arrangementId: arrangement.id!,
      +          assignment: arrangement.familyVolunteerAssignments!.find(iva =>
      +            iva.arrangementFunction === requirement.arrangementFunction &&
      +            iva.arrangementFunctionVariant === requirement.arrangementFunctionVariant &&
      +            iva.familyId === requirement.volunteerFamilyId)!
      +        } as RequirementContext
      +      };
           } else {
             return { missing: requirement, context: arrangementRequirementContext };
           }
      @@ -289,7 +307,7 @@ export function ArrangementCard({ partneringFamily, referralId, arrangement, sum
       
         const upcomingRequirementsCount = arrangement.missingRequirements?.filter(missingRequirement =>
           missingRequirement.dueBy /* Determine if this is an "upcoming" requirement */).length || 0;
      -  
      +
         return (
           
             } />
      +          partneringFamilyId={partneringFamily.family!.id!} referralId={referralId} arrangement={arrangement} />} />
             
      -        
      +        
                 
      -          {(arrangementPolicy?.childInvolvement === ChildInvolvement.ChildHousing || arrangementPolicy?.childInvolvement === ChildInvolvement.DaytimeChildCareOnly) && 
      +          {(arrangementPolicy?.childInvolvement === ChildInvolvement.ChildHousing || arrangementPolicy?.childInvolvement === ChildInvolvement.DaytimeChildCareOnly) &&
                   }
               
      @@ -325,10 +343,10 @@ export function ArrangementCard({ partneringFamily, referralId, arrangement, sum
                 
                 
                 
      -           setCollapsed(!isExpanded)}
      -            variant="outlined" square disableGutters sx={{marginLeft:-2, marginRight:-2, border: 'none' }}>
      +           setCollapsed(!isExpanded)}
      +            variant="outlined" square disableGutters sx={{ marginLeft: -2, marginRight: -2, border: 'none' }}>
                   }
      -              sx={{ marginTop:1, paddingTop:1, backgroundColor: "#0000000a" }}>
      +              sx={{ marginTop: 1, paddingTop: 1, backgroundColor: "#0000000a" }}>
                     
                       
                         
                 
      -          
      +        
               )}
             
           
      diff --git a/src/caretogether-pwa/src/Referrals/Arrangements/ArrangementCardTitle.tsx b/src/caretogether-pwa/src/Referrals/Arrangements/ArrangementCardTitle.tsx
      index fb39bd5b..8d92c2c0 100644
      --- a/src/caretogether-pwa/src/Referrals/Arrangements/ArrangementCardTitle.tsx
      +++ b/src/caretogether-pwa/src/Referrals/Arrangements/ArrangementCardTitle.tsx
      @@ -41,15 +41,15 @@ export function ArrangementCardTitle({ summaryOnly, partneringFamilyId, referral
               {arrangement.arrangementType}
             
             {summaryOnly &&
      -        
      +        
                 {arrangement.phase === ArrangementPhase.Cancelled ? `Cancelled ${formatRelative(arrangement.cancelledAtUtc!, now)}`
                   : arrangement.phase === ArrangementPhase.SettingUp ? "Setting up"
      -            : arrangement.phase === ArrangementPhase.ReadyToStart ? "Ready to start"
      -            : arrangement.phase === ArrangementPhase.Started ? `Started ${formatRelative(arrangement.startedAtUtc!, now)}`
      -            : `Ended ${formatRelative(arrangement.endedAtUtc!, now)}`}
      +              : arrangement.phase === ArrangementPhase.ReadyToStart ? "Ready to start"
      +                : arrangement.phase === ArrangementPhase.Started ? `Started ${formatRelative(arrangement.startedAtUtc!, now)}`
      +                  : `Ended ${formatRelative(arrangement.endedAtUtc!, now)}`}
               }
             {!summaryOnly &&
      -        
      +        
                 {arrangement.phase === ArrangementPhase.Cancelled ?
                   `Cancelled ${formatRelative(arrangement.cancelledAtUtc!, now)}`
                   : arrangement.phase === ArrangementPhase.SettingUp ?
      @@ -57,70 +57,70 @@ export function ArrangementCardTitle({ summaryOnly, partneringFamilyId, referral
                       Setting up
                       {permissions(Permission.EditArrangement) &&
                         }
                     
      -            : arrangement.phase === ArrangementPhase.ReadyToStart ?
      -              permissions(Permission.EditArrangement) &&
      -              <>
      -                
      -                
      -              
      -            : arrangement.phase === ArrangementPhase.Started ?
      -              <>
      -                {permissions(Permission.EditArrangement)
      -                  ? <>
      -                      {startedAtEditor.editing
      -                        ? <>
      +              : arrangement.phase === ArrangementPhase.ReadyToStart ?
      +                permissions(Permission.EditArrangement) &&
      +                <>
      +                  
      +                  
      +                
      +                : arrangement.phase === ArrangementPhase.Started ?
      +                  <>
      +                    {permissions(Permission.EditArrangement)
      +                      ? <>
      +                        {startedAtEditor.editing
      +                          ? <>
                                    date && startedAtEditor.setValue(date)}
      -                              slotProps={{ textField: { fullWidth: true, required: true, sx: {marginTop: 1}}}} />
      +                              onChange={(date: Date | null) => date && startedAtEditor.setValue(date)}
      +                              slotProps={{ textField: { fullWidth: true, required: true, sx: { marginTop: 1 } } }} />
                                   {startedAtEditor.cancelButton}
                                   {startedAtEditor.saveButton}
                                 
      -                        : <>
      +                          : <>
                                   Started {formatRelative(arrangement.startedAtUtc!, now)}
                                   {startedAtEditor.editButton}
                                 }
      +                        
      +                      
      +                      : Started {formatRelative(arrangement.startedAtUtc!, now)}}
      +                  
      +                  : <>
      +                    Ended {formatRelative(arrangement.endedAtUtc!, now)}
      +                    {permissions(Permission.EditArrangement) &&
                             
      -                    
      -                  : Started {formatRelative(arrangement.startedAtUtc!, now)}}
      -              
      -            : <>
      -                Ended {formatRelative(arrangement.endedAtUtc!, now)}
      -                {permissions(Permission.EditArrangement) &&
      -                  }
      -              }
      -        {permissions(Permission.DeleteArrangement) &&
      -        <>
      -          
      -        }
      -      }
      +                        style={{ marginLeft: 10 }}
      +                        onClick={() => setShowReopenArrangementDialog(true)}>
      +                        Reopen
      +                      }
      +                  }
      +          {permissions(Permission.DeleteArrangement) &&
      +            <>
      +              
      +            }
      +        }
             {(showStartArrangementDialog &&  setShowStartArrangementDialog(false)} />) || null}
             {(showEndArrangementDialog && 
             {editor.editing
               ?  editor.setValue(e.target.value)} />
      +          id="arrangement-comments"
      +          helperText="Arrangement comments are visible to everyone."
      +          placeholder="Space for any general notes about the arrangement, upcoming plans, etc."
      +          multiline fullWidth variant="outlined" minRows={2} size="medium"
      +          value={editor.value}
      +          onChange={e => editor.setValue(e.target.value)} />
               : (savedValue && savedValue.length > 0)
      -        ? savedValue
      -        : "(no comments)"}
      +          ? savedValue
      +          : "(no comments)"}
             {permissions(Permission.EditArrangement) &&
               <>
                 {editor.editButton}
      diff --git a/src/caretogether-pwa/src/Referrals/Arrangements/ArrangementFunctionRow.tsx b/src/caretogether-pwa/src/Referrals/Arrangements/ArrangementFunctionRow.tsx
      index 229bcbac..ee69dd36 100644
      --- a/src/caretogether-pwa/src/Referrals/Arrangements/ArrangementFunctionRow.tsx
      +++ b/src/caretogether-pwa/src/Referrals/Arrangements/ArrangementFunctionRow.tsx
      @@ -25,16 +25,16 @@ export function ArrangementFunctionRow({
         const permissions = useFamilyIdPermissions(partneringFamilyId);
         const familyLookup = useFamilyLookup();
         const personLookup = usePersonLookup();
      -  
      +
         const addAssignmentDialogHandle = useDialogHandle();
         const removeAssignmentDialogHandle = useDialogHandle();
       
         const canComplete = permissions(Permission.EditAssignments);
      -  
      +
         const assignments = (arrangement.familyVolunteerAssignments || [] as Array).concat(
           arrangement.individualVolunteerAssignments || []).filter(assignment =>
      -    assignment.arrangementFunction === functionPolicy.functionName) as Array;
      -  
      +      assignment.arrangementFunction === functionPolicy.functionName) as Array;
      +
         const isMissing =
           !arrangement.familyVolunteerAssignments?.some(x => x.arrangementFunction === functionPolicy.functionName) &&
           !arrangement.individualVolunteerAssignments?.some(x => x.arrangementFunction === functionPolicy.functionName);
      @@ -42,13 +42,13 @@ export function ArrangementFunctionRow({
         function isMissingVariant(assignment: FamilyVolunteerAssignment | IndividualVolunteerAssignment) {
           return functionPolicy.variants && functionPolicy.variants.length > 0 && !assignment.arrangementFunctionVariant;
         }
      -  
      +
         const [unassignmentParameter, setUnassignmentParameter] = useState(null);
         function openUnassignDialog(assignment: FamilyVolunteerAssignment | IndividualVolunteerAssignment) {
           setUnassignmentParameter(assignment);
           removeAssignmentDialogHandle.openDialog();
         }
      -  
      +
         return (
           <>
             
      @@ -72,12 +72,12 @@ export function ArrangementFunctionRow({
                       {assignment.arrangementFunctionVariant &&
                         <>
                           
      - {assignment.arrangementFunctionVariant} + {assignment.arrangementFunctionVariant} } {isMissingVariant(assignment) && <>
      - โŒ This assignment is missing a variant! Requirements for this assignment will not be calculated. To fix, remove this assignment and add it back with the correct variant. + โŒ This assignment is missing a variant! Requirements for this assignment will not be calculated. To fix, remove this assignment and add it back with the correct variant. } )} diff --git a/src/caretogether-pwa/src/Referrals/Arrangements/ArrangementPhaseSummary.tsx b/src/caretogether-pwa/src/Referrals/Arrangements/ArrangementPhaseSummary.tsx index 5b4763a6..1f576cb2 100644 --- a/src/caretogether-pwa/src/Referrals/Arrangements/ArrangementPhaseSummary.tsx +++ b/src/caretogether-pwa/src/Referrals/Arrangements/ArrangementPhaseSummary.tsx @@ -22,30 +22,36 @@ export function ArrangementPhaseSummary({ phase, requestedAtUtc, startedAtUtc, e {startedAtUtc &&

      Started at {format(startedAtUtc, "M/d/yy h:mm a")}

      } {endedAtUtc &&

      Ended at {format(endedAtUtc, "M/d/yy h:mm a")}

      } }> -
      -
      +
      + : phase === ArrangementPhase.SettingUp ? currentPhaseColor + : phase === ArrangementPhase.ReadyToStart ? completedPhaseColor + : phase === ArrangementPhase.Started ? completedPhaseColor + : completedPhaseColor + }}>
      -
      + : phase === ArrangementPhase.SettingUp ? futurePhaseColor + : phase === ArrangementPhase.ReadyToStart ? futurePhaseColor + : phase === ArrangementPhase.Started ? currentPhaseColor + : completedPhaseColor + }}>
      -
      + : phase === ArrangementPhase.SettingUp ? futurePhaseColor + : phase === ArrangementPhase.ReadyToStart ? futurePhaseColor + : phase === ArrangementPhase.Started ? futurePhaseColor + : completedPhaseColor /* TODO: Show as currentPhaseColor if any closeout requirements are missing */ + }}>
      diff --git a/src/caretogether-pwa/src/Referrals/Arrangements/ArrangementReason.tsx b/src/caretogether-pwa/src/Referrals/Arrangements/ArrangementReason.tsx index 32e832a5..05127856 100644 --- a/src/caretogether-pwa/src/Referrals/Arrangements/ArrangementReason.tsx +++ b/src/caretogether-pwa/src/Referrals/Arrangements/ArrangementReason.tsx @@ -32,28 +32,28 @@ export function ArrangementReason({ partneringFamily, referralId, arrangement }: Reason:  {editor.editing ? - Reason for Request - - + Reason for Request + + : (savedValue && savedValue.length > 0) - ? savedValue - : "(reason unknown)"} + ? savedValue + : "(reason unknown)"} {permissions(Permission.EditArrangement) && <> {editor.editButton} {editor.cancelButton} {editor.saveButton} } - + : <>} ); diff --git a/src/caretogether-pwa/src/Referrals/Arrangements/AssignArrangementFunctionDialog.tsx b/src/caretogether-pwa/src/Referrals/Arrangements/AssignArrangementFunctionDialog.tsx index 5ae5c396..5183e092 100644 --- a/src/caretogether-pwa/src/Referrals/Arrangements/AssignArrangementFunctionDialog.tsx +++ b/src/caretogether-pwa/src/Referrals/Arrangements/AssignArrangementFunctionDialog.tsx @@ -20,10 +20,11 @@ interface AssignArrangementFunctionDialogProps { interface AssigneeOptionType { label: string; id: string; + candidateType: string; } export function AssignArrangementFunctionDialog({ - handle, referralId, arrangement, arrangementPolicy, arrangementFunction + handle, referralId, arrangement, arrangementFunction }: AssignArrangementFunctionDialogProps) { const familyIdMaybe = useParams<{ familyId: string }>(); const familyId = familyIdMaybe.familyId as string; @@ -40,7 +41,7 @@ export function AssignArrangementFunctionDialog({ : []; const candidateVolunteerIndividualAssignees = arrangementFunction.eligibleIndividualVolunteerRoles ? visibleFamilies.flatMap(f => f.volunteerFamilyInfo?.individualVolunteers - ? Object.entries(f.volunteerFamilyInfo?.individualVolunteers).filter(([volunteerId, _]) => + ? Object.entries(f.volunteerFamilyInfo?.individualVolunteers).filter(([volunteerId,]) => f.family!.adults!.find(a => a.item1!.id === volunteerId)!.item1!.active).flatMap(([volunteerId, volunteerInfo]) => volunteerInfo.approvalStatusByRole ? Object.entries(volunteerInfo.approvalStatusByRole).flatMap(([roleName, roleApprovalStatus]) => arrangementFunction.eligibleIndividualVolunteerRoles!.find(x => x === roleName) && @@ -156,7 +157,7 @@ export function AssignArrangementFunctionDialog({ { + onChange={(_event, newValue: AssigneeOptionType | null) => { setFields({ ...fields, assigneeKey: newValue?.id as string }) }} options={candidateAssignees.map(candidate => { diff --git a/src/caretogether-pwa/src/Referrals/Arrangements/CancelArrangementDialog.tsx b/src/caretogether-pwa/src/Referrals/Arrangements/CancelArrangementDialog.tsx index 2525f710..b7e2026b 100644 --- a/src/caretogether-pwa/src/Referrals/Arrangements/CancelArrangementDialog.tsx +++ b/src/caretogether-pwa/src/Referrals/Arrangements/CancelArrangementDialog.tsx @@ -13,13 +13,13 @@ interface CancelArrangementDialogProps { onClose: () => void } -export function CancelArrangementDialog({referralId, arrangement, onClose}: CancelArrangementDialogProps) { +export function CancelArrangementDialog({ referralId, arrangement, onClose }: CancelArrangementDialogProps) { const familyIdMaybe = useParams<{ familyId: string }>(); const familyId = familyIdMaybe.familyId as string; - + const referralsModel = useReferralsModel(); const personLookup = usePersonLookup(); - + const person = personLookup(familyId, arrangement.partneringFamilyPersonId) as Person; const [fields, setFields] = useState({ @@ -40,8 +40,8 @@ export function CancelArrangementDialog({referralId, arrangement, onClose}: Canc label="When was this arrangement cancelled?" value={cancelledAtLocal} disableFuture format="M/d/yyyy h:mm a" - onChange={(date: any) => date && setFields({ ...fields, cancelledAtLocal: date })} - slotProps={{ textField: { fullWidth: true, required: true, sx: {marginTop: 1}}}} /> + onChange={(date: Date | null) => date && setFields({ ...fields, cancelledAtLocal: date })} + slotProps={{ textField: { fullWidth: true, required: true, sx: { marginTop: 1 } } }} /> diff --git a/src/caretogether-pwa/src/Referrals/Arrangements/CreateArrangementDialog.tsx b/src/caretogether-pwa/src/Referrals/Arrangements/CreateArrangementDialog.tsx index 441e2e27..b82e431d 100644 --- a/src/caretogether-pwa/src/Referrals/Arrangements/CreateArrangementDialog.tsx +++ b/src/caretogether-pwa/src/Referrals/Arrangements/CreateArrangementDialog.tsx @@ -15,7 +15,7 @@ interface CreateArrangementDialogProps { onClose: () => void } -export function CreateArrangementDialog({referralId, arrangementPolicy, onClose}: CreateArrangementDialogProps) { +export function CreateArrangementDialog({ referralId, arrangementPolicy, onClose }: CreateArrangementDialogProps) { const { familyId } = useParams<{ familyId: string }>(); const visibleFamilies = useRecoilValue(visibleFamiliesQuery); const family = visibleFamilies.find(x => x.family?.id === familyId) as CombinedFamilyInfo; @@ -34,9 +34,9 @@ export function CreateArrangementDialog({referralId, arrangementPolicy, onClose} reason: null as string | null }); const { requestedAtLocal, partneringFamilyPersonId, reason } = fields; - + const referralsModel = useReferralsModel(); - + const withBackdrop = useBackdrop(); async function save() { @@ -69,14 +69,14 @@ export function CreateArrangementDialog({referralId, arrangementPolicy, onClose} label="Requested at" value={requestedAtLocal} maxDate={new Date()} format="MM/dd/yyyy" - onChange={(date: any) => date && setFields({...fields, requestedAtLocal: date})} - slotProps={{ textField: { size: "small", required: true, sx: {marginTop: 1}}}} /> + onChange={(date: Date | null) => date && setFields({ ...fields, requestedAtLocal: date })} + slotProps={{ textField: { size: "small", required: true, sx: { marginTop: 1 } } }} /> Family Member: setFields({...fields, partneringFamilyPersonId: e.target.value})}> + value={partneringFamilyPersonId} onChange={e => setFields({ ...fields, partneringFamilyPersonId: e.target.value })}> {applicableFamilyMembers.map(person => ( } label={person.firstName!} /> ))} @@ -90,12 +90,12 @@ export function CreateArrangementDialog({referralId, arrangementPolicy, onClose} } diff --git a/src/caretogether-pwa/src/Referrals/Arrangements/DeleteArrangementDialog.tsx b/src/caretogether-pwa/src/Referrals/Arrangements/DeleteArrangementDialog.tsx index 6fdf59d2..43667eeb 100644 --- a/src/caretogether-pwa/src/Referrals/Arrangements/DeleteArrangementDialog.tsx +++ b/src/caretogether-pwa/src/Referrals/Arrangements/DeleteArrangementDialog.tsx @@ -10,13 +10,13 @@ interface DeleteArrangementDialogProps { onClose: () => void } -export function DeleteArrangementDialog({referralId, arrangement, onClose}: DeleteArrangementDialogProps) { +export function DeleteArrangementDialog({ referralId, arrangement, onClose }: DeleteArrangementDialogProps) { const familyIdMaybe = useParams<{ familyId: string }>(); const familyId = familyIdMaybe.familyId as string; - + const referralsModel = useReferralsModel(); const personLookup = usePersonLookup(); - + const person = personLookup(familyId, arrangement.partneringFamilyPersonId) as Person; async function save() { diff --git a/src/caretogether-pwa/src/Referrals/Arrangements/EndArrangementDialog.tsx b/src/caretogether-pwa/src/Referrals/Arrangements/EndArrangementDialog.tsx index 9109b6fd..bd501287 100644 --- a/src/caretogether-pwa/src/Referrals/Arrangements/EndArrangementDialog.tsx +++ b/src/caretogether-pwa/src/Referrals/Arrangements/EndArrangementDialog.tsx @@ -13,13 +13,13 @@ interface EndArrangementDialogProps { onClose: () => void } -export function EndArrangementDialog({referralId, arrangement, onClose}: EndArrangementDialogProps) { +export function EndArrangementDialog({ referralId, arrangement, onClose }: EndArrangementDialogProps) { const familyIdMaybe = useParams<{ familyId: string }>(); const familyId = familyIdMaybe.familyId as string; - + const referralsModel = useReferralsModel(); const personLookup = usePersonLookup(); - + const person = personLookup(familyId, arrangement.partneringFamilyPersonId) as Person; const [endedAtLocal, setEndedAtLocal] = useState(null as Date | null); @@ -39,8 +39,8 @@ export function EndArrangementDialog({referralId, arrangement, onClose}: EndArra value={endedAtLocal} minDate={arrangement.startedAtUtc} disableFuture format="M/d/yyyy h:mm a" - onChange={(date: any) => date && setEndedAtLocal(date)} - slotProps={{ textField: {fullWidth: true, required: true, sx: {marginTop: 1}}}} /> + onChange={(date: Date | null) => date && setEndedAtLocal(date)} + slotProps={{ textField: { fullWidth: true, required: true, sx: { marginTop: 1 } } }} /> diff --git a/src/caretogether-pwa/src/Referrals/Arrangements/ReopenArrangementDialog.tsx b/src/caretogether-pwa/src/Referrals/Arrangements/ReopenArrangementDialog.tsx index e5c9817d..1b8df375 100644 --- a/src/caretogether-pwa/src/Referrals/Arrangements/ReopenArrangementDialog.tsx +++ b/src/caretogether-pwa/src/Referrals/Arrangements/ReopenArrangementDialog.tsx @@ -12,16 +12,16 @@ interface ReopenArrangementDialogProps { onClose: () => void } -export function ReopenArrangementDialog({referralId, arrangement, onClose}: ReopenArrangementDialogProps) { +export function ReopenArrangementDialog({ referralId, arrangement, onClose }: ReopenArrangementDialogProps) { const familyIdMaybe = useParams<{ familyId: string }>(); const familyId = familyIdMaybe.familyId as string; - + const referralsModel = useReferralsModel(); const directoryModel = useDirectoryModel(); const personLookup = usePersonLookup(); - + const person = personLookup(familyId, arrangement.partneringFamilyPersonId) as Person; - + const [notes, setNotes] = useState(""); async function save() { diff --git a/src/caretogether-pwa/src/Referrals/Arrangements/StartArrangementDialog.tsx b/src/caretogether-pwa/src/Referrals/Arrangements/StartArrangementDialog.tsx index e1c6decd..37165825 100644 --- a/src/caretogether-pwa/src/Referrals/Arrangements/StartArrangementDialog.tsx +++ b/src/caretogether-pwa/src/Referrals/Arrangements/StartArrangementDialog.tsx @@ -13,13 +13,13 @@ interface StartArrangementDialogProps { onClose: () => void } -export function StartArrangementDialog({referralId, arrangement, onClose}: StartArrangementDialogProps) { +export function StartArrangementDialog({ referralId, arrangement, onClose }: StartArrangementDialogProps) { const familyIdMaybe = useParams<{ familyId: string }>(); const familyId = familyIdMaybe.familyId as string; - + const referralsModel = useReferralsModel(); const personLookup = usePersonLookup(); - + const person = personLookup(familyId, arrangement.partneringFamilyPersonId) as Person; const [startedAtLocal, setStartedAtLocal] = useState(null as Date | null); @@ -38,8 +38,8 @@ export function StartArrangementDialog({referralId, arrangement, onClose}: Start label="When was this arrangement started?" value={startedAtLocal} disableFuture format="M/d/yyyy h:mm a" - onChange={(date: any) => date && setStartedAtLocal(date)} - slotProps={{ textField: { fullWidth: true, required: true, sx: {marginTop: 1}}}} /> + onChange={(date: Date | null) => date && setStartedAtLocal(date)} + slotProps={{ textField: { fullWidth: true, required: true, sx: { marginTop: 1 } } }} /> diff --git a/src/caretogether-pwa/src/Referrals/Arrangements/TrackChildLocationDialog.tsx b/src/caretogether-pwa/src/Referrals/Arrangements/TrackChildLocationDialog.tsx index 71524fd3..5f8f3078 100644 --- a/src/caretogether-pwa/src/Referrals/Arrangements/TrackChildLocationDialog.tsx +++ b/src/caretogether-pwa/src/Referrals/Arrangements/TrackChildLocationDialog.tsx @@ -36,14 +36,14 @@ function ChildLocationTimeline({ partneringFamily, referralId, arrangement, reco const personLookup = usePersonLookup(); const referralsModel = useReferralsModel(); const withBackdrop = useBackdrop(); - + async function deleteChildLocationEntry(historyEntry: ChildLocationHistoryEntry) { await withBackdrop(async () => { await referralsModel.deleteChildLocationEntry(partneringFamily.family?.id as string, referralId, arrangement.id!, historyEntry.childLocationFamilyId!, historyEntry.childLocationReceivingAdultId!, historyEntry.timestampUtc!, null); }); } - + async function deleteChildLocationPlan(planEntry: ChildLocationHistoryEntry) { await withBackdrop(async () => { await referralsModel.deleteChildLocationPlan(partneringFamily.family?.id as string, referralId, arrangement.id!, @@ -54,15 +54,15 @@ function ChildLocationTimeline({ partneringFamily, referralId, arrangement, reco // Planned entries will have null noteId values; actual history entries will have non-null noteId values. const allEntries = (arrangement.childLocationHistory || []).concat(arrangement.childLocationPlan || []).sort((a, b) => a.timestampUtc! < b.timestampUtc! ? 1 : a.timestampUtc! > b.timestampUtc! ? -1 : 0); - + // If there are no entries, or only planned entries, the current location entry will be undefined. const currentLocationEntryIndex = allEntries.findIndex(entry => entry.noteId); const currentLocationEntry = currentLocationEntryIndex !== -1 ? allEntries[currentLocationEntryIndex] : undefined; const nextPlannedChange = allEntries.slice(0, currentLocationEntryIndex).reverse().find(entry => !entry.noteId && entry.childLocationFamilyId !== currentLocationEntry?.childLocationFamilyId); - + const now = new Date(); - + return ( {allEntries.map((entry, i) => @@ -118,13 +118,13 @@ interface TrackChildLocationDialogProps { onClose: () => void } -export function TrackChildLocationDialog({partneringFamily, referralId, arrangement, onClose}: TrackChildLocationDialogProps) { +export function TrackChildLocationDialog({ partneringFamily, referralId, arrangement, onClose }: TrackChildLocationDialogProps) { const policy = useRecoilValue(policyData); const arrangementPolicy = policy.referralPolicy!.arrangementPolicies!.find(x => x.arrangementType === arrangement.arrangementType); const familyLookup = useFamilyLookup(); const personLookup = usePersonLookup(); - + const child = personLookup(partneringFamily.family!.id, arrangement.partneringFamilyPersonId); const arrangementHasNotStartedYet = @@ -145,7 +145,7 @@ export function TrackChildLocationDialog({partneringFamily, referralId, arrangem setPlan(entry.plan!); } - function candidateItem(candidate: {familyId: string, adult: Person}) { + function candidateItem(candidate: { familyId: string, adult: Person }) { return { familyId: candidate.familyId, personId: candidate.adult.id!, @@ -153,7 +153,7 @@ export function TrackChildLocationDialog({partneringFamily, referralId, arrangem displayName: `${candidate.adult.firstName} ${candidate.adult.lastName}` }; } - + const candidatePartneringFamilyAssignees = (partneringFamily.family?.adults?.map(adultInfo => ({ familyId: partneringFamily.family!.id!, adult: adultInfo.item1! })) || []) .map(candidateItem); const candidateFamilyAssignees = arrangement.familyVolunteerAssignments?.flatMap(familyAssignment => @@ -164,7 +164,7 @@ export function TrackChildLocationDialog({partneringFamily, referralId, arrangem .map(candidateItem); const deduplicatedCandidateVolunteerAssignees = allCandidateVolunteerAssignees.filter((candidateItem, i) => allCandidateVolunteerAssignees.filter((x, j) => x.key === candidateItem.key && j < i).length === 0); - + function updateAssignee(assigneeKey: string) { setSelectedAssigneeKey(assigneeKey); const assigneeIsFromPartneringFamily = candidatePartneringFamilyAssignees.some(ca => ca.key === assigneeKey); @@ -182,7 +182,7 @@ export function TrackChildLocationDialog({partneringFamily, referralId, arrangem const referralsModel = useReferralsModel(); const directoryModel = useDirectoryModel(); - + const withBackdrop = useBackdrop(); function canSave() { @@ -197,7 +197,7 @@ export function TrackChildLocationDialog({partneringFamily, referralId, arrangem changeAtLocal != null; } } - + async function onSave() { if (tabValue === 0) { return trackChildLocation(); @@ -277,14 +277,14 @@ export function TrackChildLocationDialog({partneringFamily, referralId, arrangem labelId="assignee-label" id="assignee" value={selectedAssigneeKey} onChange={e => updateAssignee(e.target.value as string)}> - - Select the adult who received the child - - {candidatePartneringFamilyAssignees.map(candidate => - {candidate.displayName})} - - {deduplicatedCandidateVolunteerAssignees.map(candidate => - {candidate.displayName})} + + Select the adult who received the child + + {candidatePartneringFamilyAssignees.map(candidate => + {candidate.displayName})} + + {deduplicatedCandidateVolunteerAssignees.map(candidate => + {candidate.displayName})} @@ -308,8 +308,8 @@ export function TrackChildLocationDialog({partneringFamily, referralId, arrangem label="What time did this person receive the child?" value={changeAtLocal} disableFuture format="M/d/yyyy h:mm a" - onChange={(date: any) => date && setChangeAtLocal(date)} - slotProps={{ textField: { fullWidth: true, required: true }}} /> + onChange={(date: Date | null) => date && setChangeAtLocal(date)} + slotProps={{ textField: { fullWidth: true, required: true } }} /> updateAssignee(e.target.value as string)}> - - Select the adult who will receive the child - - {candidatePartneringFamilyAssignees.map(candidate => - {candidate.displayName})} - - {deduplicatedCandidateVolunteerAssignees.map(candidate => - {candidate.displayName})} + + Select the adult who will receive the child + + {candidatePartneringFamilyAssignees.map(candidate => + {candidate.displayName})} + + {deduplicatedCandidateVolunteerAssignees.map(candidate => + {candidate.displayName})} @@ -361,8 +361,8 @@ export function TrackChildLocationDialog({partneringFamily, referralId, arrangem label="What time will this person receive the child?" value={changeAtLocal} format="M/d/yyyy h:mm a" - onChange={(date: any) => date && setChangeAtLocal(date)} - slotProps={{ textField: { fullWidth: true, required: true}}} /> + onChange={(date: Date | null) => date && setChangeAtLocal(date)} + slotProps={{ textField: { fullWidth: true, required: true } }} /> diff --git a/src/caretogether-pwa/src/Referrals/Arrangements/UnassignArrangementFunctionDialog.tsx b/src/caretogether-pwa/src/Referrals/Arrangements/UnassignArrangementFunctionDialog.tsx index 178f947a..0613444a 100644 --- a/src/caretogether-pwa/src/Referrals/Arrangements/UnassignArrangementFunctionDialog.tsx +++ b/src/caretogether-pwa/src/Referrals/Arrangements/UnassignArrangementFunctionDialog.tsx @@ -18,7 +18,7 @@ interface UnassignArrangementFunctionDialogProps { } export function UnassignArrangementFunctionDialog({ - handle, partneringFamilyId, referralId, arrangement, arrangementPolicy, arrangementFunction, assignment + handle, partneringFamilyId, referralId, arrangement, arrangementFunction, assignment }: UnassignArrangementFunctionDialogProps) { const familyLookup = useFamilyLookup(); const personLookup = usePersonLookup(); @@ -26,9 +26,9 @@ export function UnassignArrangementFunctionDialog({ const assignee = assignment instanceof IndividualVolunteerAssignment ? personLookup(assignment.familyId, assignment.personId) : familyLookup(assignment.familyId); - + const referralsModel = useReferralsModel(); - + const withBackdrop = useBackdrop(); async function save() { diff --git a/src/caretogether-pwa/src/Referrals/CloseReferralDialog.tsx b/src/caretogether-pwa/src/Referrals/CloseReferralDialog.tsx index 9111fbec..54a28720 100644 --- a/src/caretogether-pwa/src/Referrals/CloseReferralDialog.tsx +++ b/src/caretogether-pwa/src/Referrals/CloseReferralDialog.tsx @@ -11,7 +11,7 @@ interface CloseReferralDialogProps { onClose: () => void } -export function CloseReferralDialog({partneringFamilyId, referralId, onClose}: CloseReferralDialogProps) { +export function CloseReferralDialog({ partneringFamilyId, referralId, onClose }: CloseReferralDialogProps) { const referralsModel = useReferralsModel(); const [fields, setFields] = useState({ reason: null as ReferralCloseReason | null, @@ -34,7 +34,7 @@ export function CloseReferralDialog({partneringFamilyId, referralId, onClose}: C Reason for Closing: setFields({...fields, reason: ReferralCloseReason[e.target.value as keyof typeof ReferralCloseReason]})}> + onChange={e => setFields({ ...fields, reason: ReferralCloseReason[e.target.value as keyof typeof ReferralCloseReason] })}> } label="Not Appropriate" /> } label="No Capacity" /> } label="No Longer Needed" /> @@ -48,7 +48,7 @@ export function CloseReferralDialog({partneringFamilyId, referralId, onClose}: C label="When was this referral closed?" value={closedAtLocal} disableFuture format="MM/dd/yyyy" - onChange={(date: any) => date && setFields({ ...fields, closedAtLocal: date })} /> + onChange={(date: Date | null) => date && setFields({ ...fields, closedAtLocal: date })} /> diff --git a/src/caretogether-pwa/src/Referrals/CreatePartneringFamilyDialog.tsx b/src/caretogether-pwa/src/Referrals/CreatePartneringFamilyDialog.tsx index 5f1d3c1a..570f9e2b 100644 --- a/src/caretogether-pwa/src/Referrals/CreatePartneringFamilyDialog.tsx +++ b/src/caretogether-pwa/src/Referrals/CreatePartneringFamilyDialog.tsx @@ -18,7 +18,7 @@ function optional(arg: string) { return arg.length > 0 ? arg : null; } -export function CreatePartneringFamilyDialog({onClose}: CreatePartneringFamilyDialogProps) { +export function CreatePartneringFamilyDialog({ onClose }: CreatePartneringFamilyDialogProps) { const [fields, setFields] = useState({ referralOpenedAtLocal: new Date(), firstName: '', @@ -47,7 +47,7 @@ export function CreatePartneringFamilyDialog({onClose}: CreatePartneringFamilyDi const relationshipTypes = useRecoilValue(adultFamilyRelationshipsData); const ethnicities = useRecoilValue(ethnicitiesData); - + const withBackdrop = useBackdrop(); async function save() { @@ -57,7 +57,7 @@ export function CreatePartneringFamilyDialog({onClose}: CreatePartneringFamilyDi } else if (relationshipToFamily === '') { //TODO: Actual validation! alert("Family relationship was not selected. Try again."); } else { - let age = dateOfBirth == null ? null : new ExactAge(); + const age = dateOfBirth == null ? null : new ExactAge(); if (dateOfBirth != null) age!.dateOfBirth = dateOfBirth; const familyId = crypto.randomUUID(); @@ -65,7 +65,7 @@ export function CreatePartneringFamilyDialog({onClose}: CreatePartneringFamilyDi referralOpenedAtLocal, firstName, lastName, gender, age, optional(ethnicity), isInHousehold, relationshipToFamily, - address == null ? null : new Address({...address, id: crypto.randomUUID() }), + address == null ? null : new Address({ ...address, id: crypto.randomUUID() }), optional(phoneNumber), phoneType, optional(emailAddress), emailType, (notes == null ? undefined : notes), (concerns == null ? undefined : concerns)); //TODO: Error handling (start with a basic error dialog w/ request to share a screenshot, and App Insights logging) @@ -80,13 +80,13 @@ export function CreatePartneringFamilyDialog({onClose}: CreatePartneringFamilyDi Create Partnering Family - First Adult - + date && setFields({...fields, referralOpenedAtLocal: date})} - slotProps={{ textField: { fullWidth: true, required: true }}} /> + onChange={(date: Date | null) => date && setFields({ ...fields, referralOpenedAtLocal: date })} + slotProps={{ textField: { fullWidth: true, required: true } }} /> Provide the basic information needed for the first adult in the family. @@ -95,11 +95,11 @@ export function CreatePartneringFamilyDialog({onClose}: CreatePartneringFamilyDi setFields({...fields, firstName: e.target.value})} /> + value={firstName} onChange={e => setFields({ ...fields, firstName: e.target.value })} /> setFields({...fields, lastName: e.target.value})} /> + value={lastName} onChange={e => setFields({ ...fields, lastName: e.target.value })} /> @@ -107,19 +107,19 @@ export function CreatePartneringFamilyDialog({onClose}: CreatePartneringFamilyDi setFields({...fields, isInHousehold: e.target.checked})} + control={ setFields({ ...fields, isInHousehold: e.target.checked })} name="isInHousehold" color="primary" size="small" />} label="In Household" /> @@ -132,7 +132,7 @@ export function CreatePartneringFamilyDialog({onClose}: CreatePartneringFamilyDi Gender: setFields({...fields, gender: Gender[e.target.value as keyof typeof Gender]})}> + value={gender == null ? null : Gender[gender]} onChange={e => setFields({ ...fields, gender: Gender[e.target.value as keyof typeof Gender] })}> } label="Male" /> } label="Female" /> } label="See Notes" /> @@ -144,8 +144,8 @@ export function CreatePartneringFamilyDialog({onClose}: CreatePartneringFamilyDi label="Date of birth" value={dateOfBirth} maxDate={subYears(new Date(), 16)} openTo="year" format="MM/dd/yyyy" - onChange={(date: any) => date && setFields({...fields, dateOfBirth: date})} - slotProps={{ textField: { size: "small", fullWidth: true}}} /> + onChange={(date: Date | null) => date && setFields({ ...fields, dateOfBirth: date })} + slotProps={{ textField: { size: "small", fullWidth: true } }} /> @@ -153,12 +153,12 @@ export function CreatePartneringFamilyDialog({onClose}: CreatePartneringFamilyDi @@ -166,12 +166,12 @@ export function CreatePartneringFamilyDialog({onClose}: CreatePartneringFamilyDi setFields({...fields, phoneNumber: e.target.value})} /> + value={phoneNumber} onChange={e => setFields({ ...fields, phoneNumber: e.target.value })} /> setFields({...fields, phoneType: PhoneNumberType[e.target.value as keyof typeof PhoneNumberType]})}> + value={PhoneNumberType[phoneType]} onChange={e => setFields({ ...fields, phoneType: PhoneNumberType[e.target.value as keyof typeof PhoneNumberType] })}> } label="Mobile" /> } label="Home" /> } label="Work" /> @@ -181,12 +181,12 @@ export function CreatePartneringFamilyDialog({onClose}: CreatePartneringFamilyDi setFields({...fields, emailAddress: e.target.value})} /> + value={emailAddress} onChange={e => setFields({ ...fields, emailAddress: e.target.value })} /> setFields({...fields, emailType: EmailAddressType[e.target.value as keyof typeof EmailAddressType]})}> + value={EmailAddressType[emailType]} onChange={e => setFields({ ...fields, emailType: EmailAddressType[e.target.value as keyof typeof EmailAddressType] })}> } label="Personal" /> } label="Work" /> @@ -194,7 +194,7 @@ export function CreatePartneringFamilyDialog({onClose}: CreatePartneringFamilyDi - setFields({...fields, address: value})} /> + setFields({ ...fields, address: value })} /> @@ -209,7 +209,7 @@ export function CreatePartneringFamilyDialog({onClose}: CreatePartneringFamilyDi ), }} - value={concerns == null ? "" : concerns} onChange={e => setFields({...fields, concerns: e.target.value})} + value={concerns == null ? "" : concerns} onChange={e => setFields({ ...fields, concerns: e.target.value })} /> @@ -217,13 +217,13 @@ export function CreatePartneringFamilyDialog({onClose}: CreatePartneringFamilyDi id="notes" label="Notes" placeholder="Space for any general notes" multiline fullWidth variant="outlined" minRows={2} maxRows={5} size="small" - value={notes == null ? "" : notes} onChange={e => setFields({...fields, notes: e.target.value})} + value={notes == null ? "" : notes} onChange={e => setFields({ ...fields, notes: e.target.value })} /> - + diff --git a/src/caretogether-pwa/src/Referrals/OpenNewReferralDialog.tsx b/src/caretogether-pwa/src/Referrals/OpenNewReferralDialog.tsx index 6682570b..5b7f0ecf 100644 --- a/src/caretogether-pwa/src/Referrals/OpenNewReferralDialog.tsx +++ b/src/caretogether-pwa/src/Referrals/OpenNewReferralDialog.tsx @@ -9,7 +9,7 @@ interface OpenNewReferralDialogProps { onClose: () => void } -export function OpenNewReferralDialog({partneringFamilyId, onClose}: OpenNewReferralDialogProps) { +export function OpenNewReferralDialog({ partneringFamilyId, onClose }: OpenNewReferralDialogProps) { const referralsModel = useReferralsModel(); const [fields, setFields] = useState({ openedAtLocal: new Date() @@ -31,8 +31,8 @@ export function OpenNewReferralDialog({partneringFamilyId, onClose}: OpenNewRefe label="When was this referral opened?" value={openedAtLocal} disableFuture format="MM/dd/yyyy" - onChange={(date: any) => date && setFields({...fields, openedAtLocal: date})} - slotProps={{ textField: { fullWidth: true, required: true, sx: {marginTop: 1}}}} /> + onChange={(date: Date | null) => date && setFields({ ...fields, openedAtLocal: date })} + slotProps={{ textField: { fullWidth: true, required: true, sx: { marginTop: 1 } } }} /> diff --git a/src/caretogether-pwa/src/Referrals/PartneringFamilies.tsx b/src/caretogether-pwa/src/Referrals/PartneringFamilies.tsx index d4e84cc6..58dd647d 100644 --- a/src/caretogether-pwa/src/Referrals/PartneringFamilies.tsx +++ b/src/caretogether-pwa/src/Referrals/PartneringFamilies.tsx @@ -43,7 +43,7 @@ function matchingArrangements(partneringFamilyInfo: PartneringFamilyInfo, viewAc if (viewActiveOnly) { partneringFamilyInfo.openReferral?.arrangements?.filter(arrangement => arrangement.phase === ArrangementPhase.Started).forEach(x => - results.push({ referralId: partneringFamilyInfo.openReferral!.id!, arrangement: x })); + results.push({ referralId: partneringFamilyInfo.openReferral!.id!, arrangement: x })); } else { partneringFamilyInfo.closedReferrals?.forEach(x => x.arrangements?.forEach(y => results.push({ referralId: x.id!, arrangement: y }))); partneringFamilyInfo.openReferral?.arrangements?.forEach(x => results.push({ referralId: partneringFamilyInfo.openReferral!.id!, arrangement: x })); @@ -64,7 +64,7 @@ function PartneringFamilies() { const [filterText, setFilterText] = useState(""); const filteredPartneringFamilies = filterFamiliesByText(partneringFamilies, filterText); - + useScrollMemory(); function openFamily(familyId: string) { @@ -74,7 +74,7 @@ function PartneringFamilies() { function arrangementStatusSummary(partneringFamily: PartneringFamilyInfo, phase: ArrangementPhase, type: string) { const phaseText = arrangementPhaseText.get(phase); - const statusCount = allArrangements(partneringFamily).filter((a) => (a.arrangement.phase === phase + const statusCount = allArrangements(partneringFamily).filter((a) => (a.arrangement.phase === phase && a.arrangement.arrangementType === type)).length; let statusCountDiv; @@ -85,41 +85,47 @@ function PartneringFamilies() { const arrangementStarted = '#01ACFB'; const arrangementEnded = 'green'; - if(statusCount > 0) { - statusCountDiv = {statusCount} + if (statusCount > 0) { + statusCountDiv = {statusCount} } - + return ( -
      +
      - {phase===ArrangementPhase.SettingUp ? + {phase === ArrangementPhase.SettingUp ? - : phase===ArrangementPhase.ReadyToStart ? - - : phase===ArrangementPhase.Started ? - - : } + : phase === ArrangementPhase.ReadyToStart ? + + : phase === ArrangementPhase.Started ? + + : } {statusCountDiv}
      ) @@ -127,9 +133,9 @@ function PartneringFamilies() { const [createPartneringFamilyDialogOpen, setCreatePartneringFamilyDialogOpen] = useState(false); const [expandedView, setExpandedView] = useLocalStorage('partnering-families-expanded', true); - + const handleExpandCollapse = ( - event: React.MouseEvent, + _event: React.MouseEvent, newExpandedView: boolean | null, ) => { if (newExpandedView !== null) { @@ -152,12 +158,12 @@ function PartneringFamilies() { return (!partneringFamiliesLoadable || !arrangementTypes ? -

      Loading families...

      -
      - : +

      Loading families...

      + + : - + @@ -173,72 +179,72 @@ function PartneringFamilies() { -
+
Partnering Family Referral Status - { !expandedView ? arrangementTypes?.map((arrangementType) => + {!expandedView ? arrangementTypes?.map((arrangementType) => ({arrangementType})) : <>} {filteredPartneringFamiliesWithActiveOrAllFilter.map((partneringFamily) => ( - openFamily(partneringFamily.family!.id!)}> + openFamily(partneringFamily.family!.id!)}> { partneringFamily.partneringFamilyInfo?.openReferral - ? "Open since " + format(partneringFamily.partneringFamilyInfo.openReferral.openedAtUtc!, "MM/dd/yyyy") - : "Closed - " + ReferralCloseReason[partneringFamily.partneringFamilyInfo?.closedReferrals?.[partneringFamily.partneringFamilyInfo.closedReferrals.length-1]?.closeReason!] + ? "Open since " + format(partneringFamily.partneringFamilyInfo.openReferral.openedAtUtc!, "MM/dd/yyyy") + : "Closed - " + ReferralCloseReason[partneringFamily.partneringFamilyInfo!.closedReferrals![partneringFamily.partneringFamilyInfo!.closedReferrals!.length - 1]!.closeReason!] //TODO: "Closed on " + format(partneringFamily.partneringFamilyInfo?.closedReferrals?.[0]?.closedUtc) -- needs a new calculated property - } - {!expandedView ? arrangementTypes?.map((arrangementType) => ( - -
- {arrangementStatusSummary(partneringFamily.partneringFamilyInfo!,ArrangementPhase.SettingUp, arrangementType!)} + } + {!expandedView ? arrangementTypes?.map((arrangementType) => ( + +
+ {arrangementStatusSummary(partneringFamily.partneringFamilyInfo!, ArrangementPhase.SettingUp, arrangementType!)}
- {arrangementStatusSummary(partneringFamily.partneringFamilyInfo!,ArrangementPhase.ReadyToStart, arrangementType!)} + {arrangementStatusSummary(partneringFamily.partneringFamilyInfo!, ArrangementPhase.ReadyToStart, arrangementType!)}
- {arrangementStatusSummary(partneringFamily.partneringFamilyInfo!,ArrangementPhase.Started, arrangementType!)} + {arrangementStatusSummary(partneringFamily.partneringFamilyInfo!, ArrangementPhase.Started, arrangementType!)}
- {arrangementStatusSummary(partneringFamily.partneringFamilyInfo!,ArrangementPhase.Ended, arrangementType!)} -
+ {arrangementStatusSummary(partneringFamily.partneringFamilyInfo!, ArrangementPhase.Ended, arrangementType!)}
-
)) : <> } +
+
)) : <>}
- { expandedView + {expandedView ? ( openFamily(partneringFamily.family!.id!)}> - - {partneringFamily.partneringFamilyInfo?.openReferral?.comments} - - - - {matchingArrangements(partneringFamily.partneringFamilyInfo!, viewActiveOnly).map(arrangementEntry => ( - - - - ))} - - - ) : <> } + + {partneringFamily.partneringFamilyInfo?.openReferral?.comments} + + + + {matchingArrangements(partneringFamily.partneringFamilyInfo!, viewActiveOnly).map(arrangementEntry => ( + + + + ))} + + +
) : <>}
))}
{permissions(Permission.EditFamilyInfo) && permissions(Permission.CreateReferral) && setCreatePartneringFamilyDialogOpen(true)}> } diff --git a/src/caretogether-pwa/src/Referrals/ReferralComments.tsx b/src/caretogether-pwa/src/Referrals/ReferralComments.tsx index b2cb5d6b..5818bb53 100644 --- a/src/caretogether-pwa/src/Referrals/ReferralComments.tsx +++ b/src/caretogether-pwa/src/Referrals/ReferralComments.tsx @@ -21,24 +21,24 @@ export function ReferralComments({ partneringFamily, referralId }: ReferralComme return permissions(Permission.ViewReferralComments) ? <> -

- Comments - {permissions(Permission.EditReferral) && - <> - {editor.editButton} - {editor.cancelButton} - {editor.saveButton} - } -

- {editor.editing && permissions(Permission.EditReferral) - ? editor.setValue(e.target.value)} /> - : savedValue} - +

+ Comments + {permissions(Permission.EditReferral) && + <> + {editor.editButton} + {editor.cancelButton} + {editor.saveButton} + } +

+ {editor.editing && permissions(Permission.EditReferral) + ? editor.setValue(e.target.value)} /> + : savedValue} + : <>; } diff --git a/src/caretogether-pwa/src/Referrals/ReferralCustomField.tsx b/src/caretogether-pwa/src/Referrals/ReferralCustomField.tsx index 86a1c9af..25b8c8bb 100644 --- a/src/caretogether-pwa/src/Referrals/ReferralCustomField.tsx +++ b/src/caretogether-pwa/src/Referrals/ReferralCustomField.tsx @@ -12,12 +12,12 @@ type ReferralCustomFieldProps = { export function ReferralCustomField({ partneringFamilyId, referralId, customField }: ReferralCustomFieldProps) { const policy = useRecoilValue(policyData); - + const savedCustomField = customField instanceof CompletedCustomFieldInfo ? customField : null; const customFieldPolicy = policy.referralPolicy!.customFields!.find(cf => savedCustomField - ? cf.name === savedCustomField.customFieldName - : cf.name === customField) as CustomField; + ? cf.name === savedCustomField.customFieldName + : cf.name === customField) as CustomField; const referralsModel = useReferralsModel(); diff --git a/src/caretogether-pwa/src/Referrals/Referrals.tsx b/src/caretogether-pwa/src/Referrals/Referrals.tsx index 86e2b2b4..7ca2ea18 100644 --- a/src/caretogether-pwa/src/Referrals/Referrals.tsx +++ b/src/caretogether-pwa/src/Referrals/Referrals.tsx @@ -3,7 +3,7 @@ import { PartneringFamilies } from './PartneringFamilies'; function Referrals() { const familyId = useMatch('/referrals/family/:familyId'); - + return ( <> diff --git a/src/caretogether-pwa/src/Requirements/ExemptedRequirementRow.tsx b/src/caretogether-pwa/src/Requirements/ExemptedRequirementRow.tsx index d840004c..d0751e68 100644 --- a/src/caretogether-pwa/src/Requirements/ExemptedRequirementRow.tsx +++ b/src/caretogether-pwa/src/Requirements/ExemptedRequirementRow.tsx @@ -21,13 +21,13 @@ export function ExemptedRequirementRow({ requirement, context }: ExemptedRequire const userLookup = useUserLookup(); const permissions = useFamilyIdPermissions( context.kind === 'Referral' || - context.kind === 'Arrangement' || - context.kind === 'Family Volunteer Assignment' || - context.kind === 'Individual Volunteer Assignment' - ? context.partneringFamilyId - : context.volunteerFamilyId + context.kind === 'Arrangement' || + context.kind === 'Family Volunteer Assignment' || + context.kind === 'Individual Volunteer Assignment' + ? context.partneringFamilyId + : context.volunteerFamilyId ); - + const dialogHandle = useDialogHandle(); const canExempt = context.kind === 'Referral' @@ -35,8 +35,8 @@ export function ExemptedRequirementRow({ requirement, context }: ExemptedRequire : context.kind === 'Arrangement' || context.kind === 'Family Volunteer Assignment' || context.kind === 'Individual Volunteer Assignment' - ? permissions(Permission.EditArrangementRequirementExemption) - : permissions(Permission.EditApprovalRequirementExemption); + ? permissions(Permission.EditArrangementRequirementExemption) + : permissions(Permission.EditApprovalRequirementExemption); const familyLookup = useFamilyLookup(); const personLookup = usePersonLookup(); @@ -47,8 +47,8 @@ export function ExemptedRequirementRow({ requirement, context }: ExemptedRequire (context.kind === 'Arrangement' || context.kind === 'Family Volunteer Assignment' || context.kind === 'Individual Volunteer Assignment') - ? [context.partneringFamilyId, context.referralId, context.arrangementId] - : [undefined, undefined, undefined]; + ? [context.partneringFamilyId, context.referralId, context.arrangementId] + : [undefined, undefined, undefined]; const partneringFamilyInfo = familyLookup(partneringFamilyId)?.partneringFamilyInfo; const referral = partneringFamilyInfo?.closedReferrals?.concat( partneringFamilyInfo.openReferral || []).find(r => r.id === referralId); @@ -67,7 +67,7 @@ export function ExemptedRequirementRow({ requirement, context }: ExemptedRequire <> {isArrangementMonitoringRequirement && !requirement.dueDate && - All } + All } {requirement.requirementName}      {requirement.exemptionExpiresAtUtc && @@ -75,11 +75,11 @@ export function ExemptedRequirementRow({ requirement, context }: ExemptedRequire } {context.kind === 'Family Volunteer Assignment' && - <>
+ <>
} {context.kind === 'Individual Volunteer Assignment' && - <>
+ <>
}
diff --git a/src/caretogether-pwa/src/Requirements/MissingArrangementRequirementRow.tsx b/src/caretogether-pwa/src/Requirements/MissingArrangementRequirementRow.tsx index 651506ed..d24c1017 100644 --- a/src/caretogether-pwa/src/Requirements/MissingArrangementRequirementRow.tsx +++ b/src/caretogether-pwa/src/Requirements/MissingArrangementRequirementRow.tsx @@ -20,22 +20,22 @@ export function MissingArrangementRequirementRow({ requirement, context }: Missi const policy = useRecoilValue(policyData); const permissions = useFamilyIdPermissions( context.kind === 'Referral' || - context.kind === 'Arrangement' || - context.kind === 'Family Volunteer Assignment' || - context.kind === 'Individual Volunteer Assignment' - ? context.partneringFamilyId - : context.volunteerFamilyId + context.kind === 'Arrangement' || + context.kind === 'Family Volunteer Assignment' || + context.kind === 'Individual Volunteer Assignment' + ? context.partneringFamilyId + : context.volunteerFamilyId ); - + const dialogHandle = useDialogHandle(); - + const requirementPolicy = policy.actionDefinitions![requirement.actionName!]; - + if (context.kind === 'Referral' || context.kind === 'Individual Volunteer' || context.kind === 'Volunteer Family') throw new Error(`Invalid missing requirement context '${context.kind}'`); - + const canComplete = permissions(Permission.EditArrangementRequirementCompletion); const canExempt = permissions(Permission.EditArrangementRequirementExemption); @@ -49,11 +49,11 @@ export function MissingArrangementRequirementRow({ requirement, context }: Missi {requirement.actionName}      {format(requirement.dueBy, "M/d/yy h:mm a")} {requirement.volunteerFamilyId && !requirement.personId && - <>
+ <>
} {requirement.volunteerFamilyId && requirement.personId && - <>
+ <>
} @@ -61,11 +61,11 @@ export function MissingArrangementRequirementRow({ requirement, context }: Missi {requirement.actionName}      {requirement.pastDueSince && {format(requirement.pastDueSince, "M/d/yy h:mm a")}} {requirement.volunteerFamilyId && !requirement.personId && - <>
+ <>
} {requirement.volunteerFamilyId && requirement.personId && - <>
+ <>
} } diff --git a/src/caretogether-pwa/src/Requirements/MissingRequirementDialog.tsx b/src/caretogether-pwa/src/Requirements/MissingRequirementDialog.tsx index 36295097..6be147ee 100644 --- a/src/caretogether-pwa/src/Requirements/MissingRequirementDialog.tsx +++ b/src/caretogether-pwa/src/Requirements/MissingRequirementDialog.tsx @@ -49,15 +49,15 @@ export function MissingRequirementDialog({ const familyLookup = useFamilyLookup(); const contextFamilyId = context.kind === 'Referral' || context.kind === 'Arrangement' || - context.kind === 'Family Volunteer Assignment' || context.kind === 'Individual Volunteer Assignment' - ? context.partneringFamilyId - : context.volunteerFamilyId; + context.kind === 'Family Volunteer Assignment' || context.kind === 'Individual Volunteer Assignment' + ? context.partneringFamilyId + : context.volunteerFamilyId; const contextFamily = familyLookup(contextFamilyId); const personLookup = usePersonLookup().bind(null, contextFamilyId); const availableArrangements = requirement instanceof MissingArrangementRequirement - ? contextFamily!.partneringFamilyInfo!.openReferral!.arrangements!.filter(arrangement => + ? contextFamily!.partneringFamilyInfo!.openReferral!.arrangements!.filter(arrangement => arrangement.missingRequirements?.some(x => { if (context.kind === 'Family Volunteer Assignment') return x.actionName === requirement.actionName && @@ -73,11 +73,11 @@ export function MissingRequirementDialog({ else return x.actionName === requirement.actionName; })) - : []; + : []; const [applyToArrangements, setApplyToArrangements] = useState( context.kind === 'Arrangement' - ? availableArrangements.filter(arrangement => arrangement.id === context.arrangementId) - :[]); + ? availableArrangements.filter(arrangement => arrangement.id === context.arrangementId) + : []); function toggleApplyToArrangement(arrangement: Arrangement, include: boolean) { if (include) { setApplyToArrangements(applyToArrangements.concat(arrangement)); @@ -229,10 +229,10 @@ export function MissingRequirementDialog({ (context.kind === 'Individual Volunteer Assignment' ? ` (${personNameString(personLookup(context.assignment.personId))})` : '') + ` - ` + (arrangement.phase === ArrangementPhase.Cancelled ? `Cancelled ${formatRelative(arrangement.cancelledAtUtc!, now)}` - : arrangement.phase === ArrangementPhase.SettingUp ? "Setting up" - : arrangement.phase === ArrangementPhase.ReadyToStart ? "Ready to start" - : arrangement.phase === ArrangementPhase.Started ? `Started ${formatRelative(arrangement.startedAtUtc!, now)}` - : `Ended ${formatRelative(arrangement.endedAtUtc!, now)}`)} /> + : arrangement.phase === ArrangementPhase.SettingUp ? "Setting up" + : arrangement.phase === ArrangementPhase.ReadyToStart ? "Ready to start" + : arrangement.phase === ArrangementPhase.Started ? `Started ${formatRelative(arrangement.startedAtUtc!, now)}` + : `Ended ${formatRelative(arrangement.endedAtUtc!, now)}`)} /> )} @@ -243,14 +243,14 @@ export function MissingRequirementDialog({ label="When was this requirement completed?" value={completedAtLocal} disableFuture format="M/d/yyyy h:mm a" - onChange={(date: any) => date && setCompletedAtLocal(date)} - slotProps={{ textField: { fullWidth: true, required: true }}} /> + onChange={(date: Date | null) => date && setCompletedAtLocal(date)} + slotProps={{ textField: { fullWidth: true, required: true } }} /> : date && setCompletedAtLocal(date)} - slotProps={{ textField: { fullWidth: true, required: true }}} />} + onChange={(date: Date | null) => date && setCompletedAtLocal(date)} + slotProps={{ textField: { fullWidth: true, required: true } }} />} {validityDuration && ((completedAtLocal && isValid(completedAtLocal)) ?

This will be valid until {format(add(completedAtLocal, validityDuration), "M/d/yyyy h:mm a")}

:

Valid for {formatDuration(validityDuration)}

)} @@ -317,11 +317,11 @@ export function MissingRequirementDialog({ onChange={(_, checked) => toggleApplyToArrangement(arrangement, checked)} name={arrangement.id!} />} label={`${arrangement.arrangementType} - ${personNameString(personLookup(arrangement.partneringFamilyPersonId))} - ` + - (arrangement.phase === ArrangementPhase.Cancelled ? `Cancelled ${formatRelative(arrangement.cancelledAtUtc!, now)}` - : arrangement.phase === ArrangementPhase.SettingUp ? "Setting up" - : arrangement.phase === ArrangementPhase.ReadyToStart ? "Ready to start" + (arrangement.phase === ArrangementPhase.Cancelled ? `Cancelled ${formatRelative(arrangement.cancelledAtUtc!, now)}` + : arrangement.phase === ArrangementPhase.SettingUp ? "Setting up" + : arrangement.phase === ArrangementPhase.ReadyToStart ? "Ready to start" : arrangement.phase === ArrangementPhase.Started ? `Started ${formatRelative(arrangement.startedAtUtc!, now)}` - : `Ended ${formatRelative(arrangement.endedAtUtc!, now)}`)} /> + : `Ended ${formatRelative(arrangement.endedAtUtc!, now)}`)} /> )} @@ -329,7 +329,7 @@ export function MissingRequirementDialog({ {requirement instanceof MissingArrangementRequirement && (requirement.dueBy || requirement.pastDueSince) && // Only monitoring requirements will have one of these dates set. - + date && setExemptionExpiresAtLocal(date)} - slotProps={{ textField: { fullWidth: true}}} /> + onChange={(date: Date | null) => date && setExemptionExpiresAtLocal(date)} + slotProps={{ textField: { fullWidth: true } }} />
diff --git a/src/caretogether-pwa/src/Requirements/MissingRequirementRow.tsx b/src/caretogether-pwa/src/Requirements/MissingRequirementRow.tsx index b1497d9a..9dd1b95b 100644 --- a/src/caretogether-pwa/src/Requirements/MissingRequirementRow.tsx +++ b/src/caretogether-pwa/src/Requirements/MissingRequirementRow.tsx @@ -17,15 +17,15 @@ export function MissingRequirementRow({ requirement, context, isAvailableApplica const policy = useRecoilValue(policyData); const permissions = useFamilyIdPermissions( context.kind === 'Referral' || - context.kind === 'Arrangement' || - context.kind === 'Family Volunteer Assignment' || - context.kind === 'Individual Volunteer Assignment' - ? context.partneringFamilyId - : context.volunteerFamilyId + context.kind === 'Arrangement' || + context.kind === 'Family Volunteer Assignment' || + context.kind === 'Individual Volunteer Assignment' + ? context.partneringFamilyId + : context.volunteerFamilyId ); - + const dialogHandle = useDialogHandle(); - + const requirementPolicy = policy.actionDefinitions![requirement]; if (context.kind === 'Arrangement' || @@ -39,7 +39,7 @@ export function MissingRequirementRow({ requirement, context, isAvailableApplica const canExempt = context.kind === 'Referral' ? permissions(Permission.EditReferralRequirementExemption) : permissions(Permission.EditApprovalRequirementExemption); - + return ( <> 0 && c.toUpperCase() === c) ? " " + c : c; @@ -46,7 +46,7 @@ export function ContextualPermissionSetRow({ permissions: permissionSet.permissions }); } - + function removePermission(permission: Permission) { onUpdate({ context: permissionSet.context, @@ -88,7 +88,7 @@ export function ContextualPermissionSetRow({ {spacesBeforeCapitalLetters(Permission[permission])}
); // Group similar permission items - return i > 0 && Math.floor((all[i-1] as number)/100) < Math.floor((permission as number)/100) + return i > 0 && Math.floor((all[i - 1] as number) / 100) < Math.floor((permission as number) / 100) ? [, permissionListItem] : permissionListItem; })} @@ -112,7 +112,7 @@ export function ContextualPermissionSetRow({ {spacesBeforeCapitalLetters(permission[0])} ); // Group similar permission items - return i > 0 && Math.floor((all[i-1][1] as number)/100) < Math.floor((permission[1] as number)/100) + return i > 0 && Math.floor((all[i - 1][1] as number) / 100) < Math.floor((permission[1] as number) / 100) ? [, permissionMenuItem] : permissionMenuItem; })} diff --git a/src/caretogether-pwa/src/Settings/PermissionContextCell.tsx b/src/caretogether-pwa/src/Settings/PermissionContextCell.tsx index 9a02377c..94ae0a23 100644 --- a/src/caretogether-pwa/src/Settings/PermissionContextCell.tsx +++ b/src/caretogether-pwa/src/Settings/PermissionContextCell.tsx @@ -37,8 +37,8 @@ function ReferralOpenSelector({ context, factory, onUpdate }: ContextSelectorPro ? true : false; onUpdate(newContext); }} />} - label={context.whenReferralIsOpen ? "Open referral" : "Closed referral"} - sx={{marginLeft: 3}} />} + label={context.whenReferralIsOpen ? "Open referral" : "Closed referral"} + sx={{ marginLeft: 3 }} />} ); } @@ -54,36 +54,36 @@ function OwnFunctionSelector({ context, factory, onUpdate }: ContextSelectorProp {allFunctionsInPolicy === null ? : <> - ) => { - const newContext = factory(); - newContext.whenOwnFunctionIsIn = event.target.checked - ? allFunctionsInPolicy : undefined; - onUpdate(newContext); - }} />} - label={hasValue - ? "Only when own function is:" : "When assigned any function"} /> - {hasValue && - - {allFunctionsInPolicy.map(f => ( - { - const newContext = factory(); - if (checked) { - newContext.whenOwnFunctionIsIn?.push(f); - } else { - newContext.whenOwnFunctionIsIn = - newContext.whenOwnFunctionIsIn?.filter(x => x !== f); - } - onUpdate(newContext); - }} />} - label={f} - sx={{marginLeft: 3}} />))} - } - } + ) => { + const newContext = factory(); + newContext.whenOwnFunctionIsIn = event.target.checked + ? allFunctionsInPolicy : undefined; + onUpdate(newContext); + }} />} + label={hasValue + ? "Only when own function is:" : "When assigned any function"} /> + {hasValue && + + {allFunctionsInPolicy.map(f => ( + { + const newContext = factory(); + if (checked) { + newContext.whenOwnFunctionIsIn?.push(f); + } else { + newContext.whenOwnFunctionIsIn = + newContext.whenOwnFunctionIsIn?.filter(x => x !== f); + } + onUpdate(newContext); + }} />} + label={f} + sx={{ marginLeft: 3 }} />))} + } + } ); } @@ -99,35 +99,35 @@ function AssigneeFunctionSelector({ context, factory, onUpdate }: ContextSelecto {allFunctionsInPolicy === null ? : <> - ) => { - const newContext = factory(); - newContext.whenAssigneeFunctionIsIn = event.target.checked - ? allFunctionsInPolicy : undefined; - onUpdate(newContext); - }} />} - label={hasValue - ? "Only when assignee's function is:" : "Any assignee function"} /> - {hasValue && - - {allFunctionsInPolicy.map(f => ( - { - const newContext = factory(); - if (checked) { - newContext.whenAssigneeFunctionIsIn?.push(f); - } else { - newContext.whenAssigneeFunctionIsIn = - newContext.whenAssigneeFunctionIsIn?.filter(x => x !== f); - } - onUpdate(newContext); - }} />} - label={f} - sx={{marginLeft: 3}} />))} - } - } + ) => { + const newContext = factory(); + newContext.whenAssigneeFunctionIsIn = event.target.checked + ? allFunctionsInPolicy : undefined; + onUpdate(newContext); + }} />} + label={hasValue + ? "Only when assignee's function is:" : "Any assignee function"} /> + {hasValue && + + {allFunctionsInPolicy.map(f => ( + { + const newContext = factory(); + if (checked) { + newContext.whenAssigneeFunctionIsIn?.push(f); + } else { + newContext.whenAssigneeFunctionIsIn = + newContext.whenAssigneeFunctionIsIn?.filter(x => x !== f); + } + onUpdate(newContext); + }} />} + label={f} + sx={{ marginLeft: 3 }} />))} + } + } ); } @@ -143,36 +143,36 @@ function OwnCommunityRoleSelector({ context, factory, onUpdate }: ContextSelecto {communityRoles === null ? : <> - ) => { - const newContext = factory(); - newContext.whenOwnCommunityRoleIsIn = event.target.checked - ? communityRoles : undefined; - onUpdate(newContext); - }} />} - label={hasValue - ? "Only when own community role is:" : "Regardless of any assigned community role"} /> - {hasValue && - - {communityRoles.map(f => ( - { - const newContext = factory(); - if (checked) { - newContext.whenOwnCommunityRoleIsIn?.push(f); - } else { - newContext.whenOwnCommunityRoleIsIn = - newContext.whenOwnCommunityRoleIsIn?.filter(x => x !== f); - } - onUpdate(newContext); - }} />} - label={f} - sx={{marginLeft: 3}} />))} - } - } + ) => { + const newContext = factory(); + newContext.whenOwnCommunityRoleIsIn = event.target.checked + ? communityRoles : undefined; + onUpdate(newContext); + }} />} + label={hasValue + ? "Only when own community role is:" : "Regardless of any assigned community role"} /> + {hasValue && + + {communityRoles.map(f => ( + { + const newContext = factory(); + if (checked) { + newContext.whenOwnCommunityRoleIsIn?.push(f); + } else { + newContext.whenOwnCommunityRoleIsIn = + newContext.whenOwnCommunityRoleIsIn?.filter(x => x !== f); + } + onUpdate(newContext); + }} />} + label={f} + sx={{ marginLeft: 3 }} />))} + } + } ); } @@ -182,28 +182,28 @@ interface PermissionContextCellProps { editable: boolean onUpdate: (newValue: PermissionContext) => void } -export function PermissionContextCell({ context, editable, onUpdate }: PermissionContextCellProps) { +export function PermissionContextCell({ context, onUpdate }: PermissionContextCellProps) { const contextLabel = context instanceof GlobalPermissionContext - ? "Global" - : context instanceof OwnFamilyPermissionContext - ? "Own Family" - : context instanceof AllVolunteerFamiliesPermissionContext - ? "All Volunteer Families" - : context instanceof AllPartneringFamiliesPermissionContext - ? "All Partnering Families" - : context instanceof AssignedFunctionsInReferralPartneringFamilyPermissionContext - ? "Assigned Functions in Referral - Partnering Family" - : context instanceof AssignedFunctionsInReferralCoAssigneeFamiliesPermissionContext - ? "Assigned Functions in Referral - Co-Assigned Families" - : context instanceof OwnReferralAssigneeFamiliesPermissionContext - ? "Own Referral - Assigned Families" - : context instanceof CommunityMemberPermissionContext - ? "Community Member - Community" - : context instanceof CommunityCoMemberFamiliesPermissionContext - ? "Community Member - Co-Member Families" - : JSON.stringify(context); - + ? "Global" + : context instanceof OwnFamilyPermissionContext + ? "Own Family" + : context instanceof AllVolunteerFamiliesPermissionContext + ? "All Volunteer Families" + : context instanceof AllPartneringFamiliesPermissionContext + ? "All Partnering Families" + : context instanceof AssignedFunctionsInReferralPartneringFamilyPermissionContext + ? "Assigned Functions in Referral - Partnering Family" + : context instanceof AssignedFunctionsInReferralCoAssigneeFamiliesPermissionContext + ? "Assigned Functions in Referral - Co-Assigned Families" + : context instanceof OwnReferralAssigneeFamiliesPermissionContext + ? "Own Referral - Assigned Families" + : context instanceof CommunityMemberPermissionContext + ? "Community Member - Community" + : context instanceof CommunityCoMemberFamiliesPermissionContext + ? "Community Member - Co-Member Families" + : JSON.stringify(context); + function assignedFunctionsInReferralPartneringFamilyPermissionContextFactory( context: AssignedFunctionsInReferralPartneringFamilyPermissionContext) { const result = new AssignedFunctionsInReferralPartneringFamilyPermissionContext() @@ -211,7 +211,7 @@ export function PermissionContextCell({ context, editable, onUpdate }: Permissio result.whenOwnFunctionIsIn = context.whenOwnFunctionIsIn?.slice(); return result; } - + function assignedFunctionsInReferralCoAssigneeFamiliesPermissionContextFactory( context: AssignedFunctionsInReferralCoAssigneeFamiliesPermissionContext) { const result = new AssignedFunctionsInReferralCoAssigneeFamiliesPermissionContext() @@ -220,7 +220,7 @@ export function PermissionContextCell({ context, editable, onUpdate }: Permissio result.whenAssigneeFunctionIsIn = context.whenAssigneeFunctionIsIn?.slice(); return result; } - + function ownReferralAssigneeFamiliesPermissionContextFactory( context: OwnReferralAssigneeFamiliesPermissionContext) { const result = new OwnReferralAssigneeFamiliesPermissionContext() @@ -228,21 +228,21 @@ export function PermissionContextCell({ context, editable, onUpdate }: Permissio result.whenAssigneeFunctionIsIn = context.whenAssigneeFunctionIsIn?.slice(); return result; } - + function communityMemberPermissionContextFactory( context: CommunityMemberPermissionContext) { const result = new CommunityMemberPermissionContext() result.whenOwnCommunityRoleIsIn = context.whenOwnCommunityRoleIsIn?.slice(); return result; } - + function communityCoMemberFamiliesPermissionContextFactory( context: CommunityCoMemberFamiliesPermissionContext) { const result = new CommunityCoMemberFamiliesPermissionContext() result.whenOwnCommunityRoleIsIn = context.whenOwnCommunityRoleIsIn?.slice(); return result; } - + return ( {contextLabel} diff --git a/src/caretogether-pwa/src/Settings/RoleSettings.tsx b/src/caretogether-pwa/src/Settings/RoleSettings.tsx index 8de16b5a..b34196bc 100644 --- a/src/caretogether-pwa/src/Settings/RoleSettings.tsx +++ b/src/caretogether-pwa/src/Settings/RoleSettings.tsx @@ -18,7 +18,7 @@ function RoleSettings() { const { organizationId } = useRecoilValue(selectedLocationContextState); const storeEdits = useSetRecoilState(organizationConfigurationEdited); const roles = configuration?.roles; - + const permissions = useGlobalPermissions(); const [selectedRoleName, setSelectedRoleName] = useState(""); @@ -49,7 +49,7 @@ function RoleSettings() { setDirty(false); }); } - + function deletePermissionSetAtIndex(i: number) { const newPermissionSets = workingRole!.permissionSets!.filter((_, j) => j !== i); const newWorkingRole = { @@ -87,16 +87,16 @@ function RoleSettings() { useScreenTitle("Roles"); return (!roles - ? + ?

Loading roles...

- : + : - + Role switchLocation(e.target.value as string)}> - {locations.map(location => - - {location.name} - )} - - : - {locationConfiguration.name} - + } + }} + value={selectedLocationContext.locationId} + onChange={e => switchLocation(e.target.value as string)}> + {locations.map(location => + + {location.name} + )} + + : + {locationConfiguration.name} + : } ); diff --git a/src/caretogether-pwa/src/Shell/ShellRootLayout.tsx b/src/caretogether-pwa/src/Shell/ShellRootLayout.tsx index e6351406..7df8b77f 100644 --- a/src/caretogether-pwa/src/Shell/ShellRootLayout.tsx +++ b/src/caretogether-pwa/src/Shell/ShellRootLayout.tsx @@ -21,11 +21,11 @@ function ShellRootLayout({ children }: React.PropsWithChildren) { {isDesktop && } + marginTop: { xs: 7, sm: 8, md: 6 }, + marginBottom: isDesktop ? 0 : 7, + paddingBottom: isDesktop ? 0 : 7, + backgroundColor: '#fff' + }}>

Loading...

diff --git a/src/caretogether-pwa/src/Shell/ShellSearchBar.tsx b/src/caretogether-pwa/src/Shell/ShellSearchBar.tsx index 9cdb9da2..34d1c7fd 100644 --- a/src/caretogether-pwa/src/Shell/ShellSearchBar.tsx +++ b/src/caretogether-pwa/src/Shell/ShellSearchBar.tsx @@ -17,6 +17,7 @@ export function ShellSearchBar({ openMobileSearch, setOpenMobileSearch }: ShellS const families = useLoadable(visibleFamiliesQuery) || []; + // eslint-disable-next-line @typescript-eslint/no-explicit-any const searchBoxRef = useRef(null); function openAndFocusSearch() { @@ -34,7 +35,7 @@ export function ShellSearchBar({ openMobileSearch, setOpenMobileSearch }: ShellS }); } - function selectFamily(event: React.SyntheticEvent, family: CombinedFamilyInfo | null) { + function selectFamily(_event: React.SyntheticEvent, family: CombinedFamilyInfo | null) { console.log(family); //TODO: Navigate to the selected family } diff --git a/src/caretogether-pwa/src/Shell/ShellSideNavigation.tsx b/src/caretogether-pwa/src/Shell/ShellSideNavigation.tsx index 72922f27..3d7cc42a 100644 --- a/src/caretogether-pwa/src/Shell/ShellSideNavigation.tsx +++ b/src/caretogether-pwa/src/Shell/ShellSideNavigation.tsx @@ -19,7 +19,7 @@ interface SideNavigationMenuProps { function SideNavigationMenu({ open }: SideNavigationMenuProps) { const flags = useFeatureFlags(); const permissions = useGlobalPermissions(); - + const context = useLoadable(selectedLocationContextState); const locationPrefix = `/org/${context?.organizationId}/${context?.locationId}`; @@ -30,34 +30,34 @@ function SideNavigationMenu({ open }: SideNavigationMenuProps) { {flags === null ? <> - - - - {open && - } - - - - {open && - } - + + + + {open && + } + + + + {open && + } - + + : <> - } /> - {permissions(Permission.AccessPartneringFamiliesScreen) && - } />} - {permissions(Permission.AccessVolunteersScreen) && - } />} - {permissions(Permission.AccessCommunitiesScreen) && - } />} - {permissions(Permission.AccessSettingsScreen) && - <> - - } /> - } /> - } - } + } /> + {permissions(Permission.AccessPartneringFamiliesScreen) && + } />} + {permissions(Permission.AccessVolunteersScreen) && + } />} + {permissions(Permission.AccessCommunitiesScreen) && + } />} + {permissions(Permission.AccessSettingsScreen) && + <> + + } /> + } /> + } + } ); } @@ -68,7 +68,7 @@ interface ShellSideNavigationProps { } export function ShellSideNavigation({ open, width }: ShellSideNavigationProps) { const theme = useTheme(); - + // const drawerPaperOpenStyle = { // position: 'relative', // whiteSpace: 'nowrap', @@ -78,7 +78,7 @@ export function ShellSideNavigation({ open, width }: ShellSideNavigationProps) { // duration: theme.transitions.duration.enteringScreen // }) // }; - + // const drawerPaperCloseStyle = { // position: 'relative', // whiteSpace: 'nowrap', @@ -109,7 +109,7 @@ export function ShellSideNavigation({ open, width }: ShellSideNavigationProps) { {open && -
+
} diff --git a/src/caretogether-pwa/src/UserProfile/RedeemPersonInvite.tsx b/src/caretogether-pwa/src/UserProfile/RedeemPersonInvite.tsx index aea68887..8ee222bd 100644 --- a/src/caretogether-pwa/src/UserProfile/RedeemPersonInvite.tsx +++ b/src/caretogether-pwa/src/UserProfile/RedeemPersonInvite.tsx @@ -12,7 +12,7 @@ import { userOrganizationAccessQuery } from '../Model/Data'; function RedeemPersonInvite() { // Start by configuring the current redemption session, if there is one. - const [searchParams, ] = useSearchParams(); + const [searchParams,] = useSearchParams(); const redemptionSessionId = searchParams.get("state"); const setRedemptionSessionId = useSetRecoilState(redemptionSessionIdState); useEffect(() => { @@ -25,7 +25,7 @@ function RedeemPersonInvite() { // If it can be retrieved, then render the invite review to allow the user the // option to confirm accepting the invite. const inviteReviewInfo = useLoadable(inviteReviewInfoQuery); - + const withBackdrop = useBackdrop(); const navigate = useNavigate(); @@ -33,7 +33,7 @@ function RedeemPersonInvite() { async function redeem() { await withBackdrop(async () => { const result = await api.users.completePersonInviteRedemptionSession( - redemptionSessionId); + redemptionSessionId ?? undefined); console.log("Invite redemption result:"); console.log(result); refreshUserOrganizationAccess(); @@ -45,14 +45,14 @@ function RedeemPersonInvite() { return (!redemptionSessionId ?

- It appears that you did not use a valid CareTogether invite link to get here. - If you have a link, try clicking it again. -

+ It appears that you did not use a valid CareTogether invite link to get here. + If you have a link, try clicking it again. +

: !inviteReviewInfo - ? + ?

Loading invitation...

- : <> + : <>

You're Invited!

The link you clicked is an invitation to link your CareTogether account to @@ -69,15 +69,15 @@ function RedeemPersonInvite() {

{inviteReviewInfo.roles && inviteReviewInfo.roles.length > 0 ?
    - {inviteReviewInfo.roles?.map(role => -
  • {role}
  • - )} -
+ {inviteReviewInfo.roles?.map(role => +
  • {role}
  • + )} + :

    (none at this time)

    }

    Redemption session ID: - {redemptionSessionId} + {redemptionSessionId}

    diff --git a/src/caretogether-pwa/src/Volunteers/RemoveFamilyRoleDialog.tsx b/src/caretogether-pwa/src/Volunteers/RemoveFamilyRoleDialog.tsx index 187394c3..4da2c631 100644 --- a/src/caretogether-pwa/src/Volunteers/RemoveFamilyRoleDialog.tsx +++ b/src/caretogether-pwa/src/Volunteers/RemoveFamilyRoleDialog.tsx @@ -10,7 +10,7 @@ interface RemoveFamilyRoleDialogProps { onClose: () => void } -export function RemoveFamilyRoleDialog({volunteerFamilyId, role, onClose}: RemoveFamilyRoleDialogProps) { +export function RemoveFamilyRoleDialog({ volunteerFamilyId, role, onClose }: RemoveFamilyRoleDialogProps) { const volunteerFamiliesModel = useVolunteersModel(); const [fields, setFields] = useState({ reason: RoleRemovalReason.Inactive, @@ -32,7 +32,7 @@ export function RemoveFamilyRoleDialog({volunteerFamilyId, role, onClose}: Remov Reason for Removal: setFields({...fields, reason: RoleRemovalReason[e.target.value as keyof typeof RoleRemovalReason]})}> + value={RoleRemovalReason[reason]} onChange={e => setFields({ ...fields, reason: RoleRemovalReason[e.target.value as keyof typeof RoleRemovalReason] })}> } label="Inactive" /> } label="Opted Out" /> } label="Denied" /> @@ -44,7 +44,7 @@ export function RemoveFamilyRoleDialog({volunteerFamilyId, role, onClose}: Remov id="additional-comments" label="Additional Comments" placeholder="Explain why the family is not going to serve in this role" multiline fullWidth variant="outlined" minRows={2} maxRows={5} size="small" - value={additionalComments} onChange={e => setFields({...fields, additionalComments: e.target.value})} + value={additionalComments} onChange={e => setFields({ ...fields, additionalComments: e.target.value })} /> diff --git a/src/caretogether-pwa/src/Volunteers/RemoveIndividualRoleDialog.tsx b/src/caretogether-pwa/src/Volunteers/RemoveIndividualRoleDialog.tsx index 21f2a0f9..477b5f30 100644 --- a/src/caretogether-pwa/src/Volunteers/RemoveIndividualRoleDialog.tsx +++ b/src/caretogether-pwa/src/Volunteers/RemoveIndividualRoleDialog.tsx @@ -13,7 +13,7 @@ interface RemoveIndividualRoleDialogProps { onClose: () => void } -export function RemoveIndividualRoleDialog({volunteerFamilyId, person, role, onClose}: RemoveIndividualRoleDialogProps) { +export function RemoveIndividualRoleDialog({ volunteerFamilyId, person, role, onClose }: RemoveIndividualRoleDialogProps) { const volunteerFamiliesModel = useVolunteersModel(); const [fields, setFields] = useState({ reason: RoleRemovalReason.Inactive, @@ -38,7 +38,7 @@ export function RemoveIndividualRoleDialog({volunteerFamilyId, person, role, onC Reason for Removal: setFields({...fields, reason: RoleRemovalReason[e.target.value as keyof typeof RoleRemovalReason]})}> + value={RoleRemovalReason[reason]} onChange={e => setFields({ ...fields, reason: RoleRemovalReason[e.target.value as keyof typeof RoleRemovalReason] })}> } label="Inactive" /> {isFamilyRole && // The 'opted out' reason is only applicable to family roles. Opting out of an individual role is just being inactive. @@ -52,7 +52,7 @@ export function RemoveIndividualRoleDialog({volunteerFamilyId, person, role, onC id="additional-comments" label="Additional Comments" placeholder="Explain why the volunteer is not going to serve in this role" multiline fullWidth variant="outlined" minRows={2} maxRows={5} size="small" - value={additionalComments} onChange={e => setFields({...fields, additionalComments: e.target.value})} + value={additionalComments} onChange={e => setFields({ ...fields, additionalComments: e.target.value })} /> diff --git a/src/caretogether-pwa/src/Volunteers/ResetFamilyRoleDialog.tsx b/src/caretogether-pwa/src/Volunteers/ResetFamilyRoleDialog.tsx index 6fb3281f..fe03b4e9 100644 --- a/src/caretogether-pwa/src/Volunteers/ResetFamilyRoleDialog.tsx +++ b/src/caretogether-pwa/src/Volunteers/ResetFamilyRoleDialog.tsx @@ -10,7 +10,7 @@ interface ResetFamilyRoleDialogProps { onClose: () => void } -export function ResetFamilyRoleDialog({volunteerFamilyId, role, removalReason, removalAdditionalComments, onClose}: ResetFamilyRoleDialogProps) { +export function ResetFamilyRoleDialog({ volunteerFamilyId, role, removalReason, removalAdditionalComments, onClose }: ResetFamilyRoleDialogProps) { const volunteerFamiliesModel = useVolunteersModel(); async function save() { diff --git a/src/caretogether-pwa/src/Volunteers/ResetIndividualRoleDialog.tsx b/src/caretogether-pwa/src/Volunteers/ResetIndividualRoleDialog.tsx index 4dbb96f1..c4774908 100644 --- a/src/caretogether-pwa/src/Volunteers/ResetIndividualRoleDialog.tsx +++ b/src/caretogether-pwa/src/Volunteers/ResetIndividualRoleDialog.tsx @@ -11,7 +11,7 @@ interface ResetIndividualRoleDialogProps { onClose: () => void } -export function ResetIndividualRoleDialog({volunteerFamilyId, person, role, removalReason, removalAdditionalComments, onClose}: ResetIndividualRoleDialogProps) { +export function ResetIndividualRoleDialog({ volunteerFamilyId, person, role, removalReason, removalAdditionalComments, onClose }: ResetIndividualRoleDialogProps) { const volunteerFamiliesModel = useVolunteersModel(); async function save() { diff --git a/src/caretogether-pwa/src/Volunteers/VolunteerApproval.tsx b/src/caretogether-pwa/src/Volunteers/VolunteerApproval.tsx index ae37ce7f..12945e71 100644 --- a/src/caretogether-pwa/src/Volunteers/VolunteerApproval.tsx +++ b/src/caretogether-pwa/src/Volunteers/VolunteerApproval.tsx @@ -211,7 +211,7 @@ function VolunteerApproval(props: { onOpen: () => void }) { roleFilter.selected.indexOf( family.volunteerFamilyInfo?.familyRoleApprovals?.[roleFilter.roleName]?.currentStatus || null) > -1) && volunteerRoleFilters.every(roleFilter => - ((family.volunteerFamilyInfo?.individualVolunteers && Object.entries(family.volunteerFamilyInfo?.individualVolunteers)) || []).some(([_, volunteer]) => + ((family.volunteerFamilyInfo?.individualVolunteers && Object.entries(family.volunteerFamilyInfo?.individualVolunteers)) || []).some(([, volunteer]) => roleFilter.selected.indexOf(null) > -1 || roleFilter.selected.indexOf(volunteer.approvalStatusByRole?.[roleFilter.roleName]?.currentStatus || null) > -1)) )); @@ -232,7 +232,7 @@ function VolunteerApproval(props: { onOpen: () => void }) { const [expandedView, setExpandedView] = useLocalStorage('volunteer-approval-expanded', true); const handleExpandCollapse = ( - event: React.MouseEvent, + _event: React.MouseEvent, newExpandedView: boolean | null, ) => { if (newExpandedView !== null) { diff --git a/src/caretogether-pwa/src/main.tsx b/src/caretogether-pwa/src/main.tsx index 4849c69e..27e45070 100644 --- a/src/caretogether-pwa/src/main.tsx +++ b/src/caretogether-pwa/src/main.tsx @@ -6,7 +6,7 @@ import { ThemeProvider } from '@mui/material/styles'; import { theme } from './theme'; import { CssBaseline } from '@mui/material'; import { LocalizationProvider } from '@mui/x-date-pickers'; -import { AdapterDateFns as DateAdapter } from '@mui/x-date-pickers/AdapterDateFns'; +import { AdapterDateFns as DateAdapter } from '@mui/x-date-pickers/AdapterDateFnsV3'; import { GlobalErrorBoundary } from './GlobalErrorBoundary'; import { RecoilRoot } from 'recoil'; import { BrowserRouter as Router } from "react-router-dom"; diff --git a/src/caretogether-pwa/vite.config.ts b/src/caretogether-pwa/vite.config.ts index 93d251a5..8bf9a523 100644 --- a/src/caretogether-pwa/vite.config.ts +++ b/src/caretogether-pwa/vite.config.ts @@ -5,7 +5,6 @@ import react from '@vitejs/plugin-react-swc' export default defineConfig({ plugins: [react()], server: { - port: 3000, - base: '/' + port: 3000 } })