From d3df1b1f375fd732e2b89e045eb17c640b68c459 Mon Sep 17 00:00:00 2001 From: Anil Natha Date: Mon, 29 Apr 2024 14:50:00 -0700 Subject: [PATCH 01/17] Updated .nvmrc so that we target lts/hydrogen. This will in effect allow us to use the latest stable release for builds as they are published without having to increment the version. --- .nvmrc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.nvmrc b/.nvmrc index 6d80269..c32828c 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -18.16.0 +lts/hydrogen \ No newline at end of file From fbfd61f255b18d042022ee7d67c4013a8b672b07 Mon Sep 17 00:00:00 2001 From: Anil Natha Date: Mon, 29 Apr 2024 14:52:47 -0700 Subject: [PATCH 02/17] Updated package-lock.json by running npm audit fix to resolve vulnerabilities found using npm audit. --- package-lock.json | 540 ++++++++++++++++++++++++++-------------------- 1 file changed, 308 insertions(+), 232 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9e40ef7..b2dfede 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "unity-ui", - "version": "0.0.0", + "version": "0.5.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "unity-ui", - "version": "0.0.0", + "version": "0.5.0", "dependencies": { "ag-grid-community": "^30.0.0", "ag-grid-react": "^30.0.0", @@ -42,24 +42,25 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", - "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", + "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", "dependencies": { - "@babel/highlight": "^7.22.5" + "@babel/highlight": "^7.24.2", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/generator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.5.tgz", - "integrity": "sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.5.tgz", + "integrity": "sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA==", "dependencies": { - "@babel/types": "^7.22.5", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", + "@babel/types": "^7.24.5", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" }, "engines": { @@ -78,20 +79,20 @@ } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", - "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", - "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dependencies": { - "@babel/template": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" @@ -120,40 +121,41 @@ } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.5.tgz", - "integrity": "sha512-thqK5QFghPKWLhAV321lxF95yCg2K3Ob5yw+M3VHWfdia0IkPXUtoLH8x/6Fh486QUvzhb8YOWHChTVen2/PoQ==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.5.tgz", + "integrity": "sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", + "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", - "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz", + "integrity": "sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", - "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.5.tgz", + "integrity": "sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw==", "dependencies": { - "@babel/helper-validator-identifier": "^7.22.5", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" + "@babel/helper-validator-identifier": "^7.24.5", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" @@ -224,9 +226,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.5.tgz", - "integrity": "sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.5.tgz", + "integrity": "sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==", "bin": { "parser": "bin/babel-parser.js" }, @@ -246,32 +248,32 @@ } }, "node_modules/@babel/template": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", - "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", + "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", "dependencies": { - "@babel/code-frame": "^7.22.5", - "@babel/parser": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.5.tgz", - "integrity": "sha512-7DuIjPgERaNo6r+PZwItpjCZEa5vyw4eJGufeLxrPdBXBoLcCJCIasvK6pK/9DVNrLZTLFhUGqaC6X/PA007TQ==", - "dependencies": { - "@babel/code-frame": "^7.22.5", - "@babel/generator": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.5.tgz", + "integrity": "sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA==", + "dependencies": { + "@babel/code-frame": "^7.24.2", + "@babel/generator": "^7.24.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.5", - "@babel/parser": "^7.22.5", - "@babel/types": "^7.22.5", - "debug": "^4.1.0", + "@babel/helper-split-export-declaration": "^7.24.5", + "@babel/parser": "^7.24.5", + "@babel/types": "^7.24.5", + "debug": "^4.3.1", "globals": "^11.1.0" }, "engines": { @@ -287,12 +289,12 @@ } }, "node_modules/@babel/types": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz", - "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.5.tgz", + "integrity": "sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==", "dependencies": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5", + "@babel/helper-string-parser": "^7.24.1", + "@babel/helper-validator-identifier": "^7.24.5", "to-fast-properties": "^2.0.0" }, "engines": { @@ -426,9 +428,9 @@ "dev": true }, "node_modules/@esbuild/android-arm": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", - "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", + "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==", "cpu": [ "arm" ], @@ -442,9 +444,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", - "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", "cpu": [ "arm64" ], @@ -458,9 +460,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", - "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", "cpu": [ "x64" ], @@ -474,9 +476,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", - "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", "cpu": [ "arm64" ], @@ -490,9 +492,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", - "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", "cpu": [ "x64" ], @@ -506,9 +508,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", - "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", "cpu": [ "arm64" ], @@ -522,9 +524,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", - "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", "cpu": [ "x64" ], @@ -538,9 +540,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", - "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", "cpu": [ "arm" ], @@ -554,9 +556,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", - "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", + "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==", "cpu": [ "arm64" ], @@ -570,9 +572,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", - "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", "cpu": [ "ia32" ], @@ -586,9 +588,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", - "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", "cpu": [ "loong64" ], @@ -602,9 +604,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", - "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", "cpu": [ "mips64el" ], @@ -618,9 +620,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", - "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", "cpu": [ "ppc64" ], @@ -634,9 +636,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", - "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", "cpu": [ "riscv64" ], @@ -650,9 +652,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", - "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", "cpu": [ "s390x" ], @@ -666,9 +668,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", - "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", "cpu": [ "x64" ], @@ -682,9 +684,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", - "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", "cpu": [ "x64" ], @@ -698,9 +700,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", - "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", + "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==", "cpu": [ "x64" ], @@ -714,9 +716,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", - "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", "cpu": [ "x64" ], @@ -730,9 +732,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", - "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", "cpu": [ "arm64" ], @@ -746,9 +748,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", - "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", "cpu": [ "ia32" ], @@ -762,9 +764,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", - "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", "cpu": [ "x64" ], @@ -895,30 +897,30 @@ "dev": true }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dependencies": { - "@jridgewell/set-array": "^1.0.1", + "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "engines": { "node": ">=6.0.0" } @@ -929,19 +931,14 @@ "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", - "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" - }, "node_modules/@nasa-jpl/react-stellar": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@nasa-jpl/react-stellar/-/react-stellar-1.1.2.tgz", @@ -2537,14 +2534,13 @@ } }, "node_modules/asn1.js": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", - "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", "dependencies": { "bn.js": "^4.0.0", "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" + "minimalistic-assert": "^1.0.0" } }, "node_modules/asn1.js/node_modules/bn.js": { @@ -2709,21 +2705,69 @@ } }, "node_modules/browserify-sign": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", - "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.3.tgz", + "integrity": "sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw==", "dependencies": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", + "bn.js": "^5.2.1", + "browserify-rsa": "^4.1.0", "create-hash": "^1.2.0", "create-hmac": "^1.1.7", - "elliptic": "^6.5.3", + "elliptic": "^6.5.5", + "hash-base": "~3.0", "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" + "parse-asn1": "^5.1.7", + "readable-stream": "^2.3.8", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/browserify-sign/node_modules/hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha512-EeeoJKjTyt868liAlVmcv2ZsUfGHlE3Q+BICOXcZiwN3osr5Q/zFGYmTJpoIzuaSTAwndFy+GqhEwlU4L3j4Ow==", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/browserify-sign/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/browserify-sign/node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/browserify-sign/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" } }, + "node_modules/browserify-sign/node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, "node_modules/buffer": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", @@ -2882,6 +2926,11 @@ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", "dev": true }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, "node_modules/cosmiconfig": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", @@ -3083,9 +3132,9 @@ } }, "node_modules/elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.5.tgz", + "integrity": "sha512-7EjbcmUm17NQFu4Pmgmq2olYMj8nwMnpcddByChSUjArp8F5DQWcIcpriwO4ZToLNAJig0yiyjswfyGNje/ixw==", "dependencies": { "bn.js": "^4.11.9", "brorand": "^1.1.0", @@ -3111,9 +3160,9 @@ } }, "node_modules/esbuild": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", - "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", "dev": true, "hasInstallScript": true, "bin": { @@ -3123,28 +3172,28 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/android-arm": "0.17.19", - "@esbuild/android-arm64": "0.17.19", - "@esbuild/android-x64": "0.17.19", - "@esbuild/darwin-arm64": "0.17.19", - "@esbuild/darwin-x64": "0.17.19", - "@esbuild/freebsd-arm64": "0.17.19", - "@esbuild/freebsd-x64": "0.17.19", - "@esbuild/linux-arm": "0.17.19", - "@esbuild/linux-arm64": "0.17.19", - "@esbuild/linux-ia32": "0.17.19", - "@esbuild/linux-loong64": "0.17.19", - "@esbuild/linux-mips64el": "0.17.19", - "@esbuild/linux-ppc64": "0.17.19", - "@esbuild/linux-riscv64": "0.17.19", - "@esbuild/linux-s390x": "0.17.19", - "@esbuild/linux-x64": "0.17.19", - "@esbuild/netbsd-x64": "0.17.19", - "@esbuild/openbsd-x64": "0.17.19", - "@esbuild/sunos-x64": "0.17.19", - "@esbuild/win32-arm64": "0.17.19", - "@esbuild/win32-ia32": "0.17.19", - "@esbuild/win32-x64": "0.17.19" + "@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" } }, "node_modules/escape-string-regexp": { @@ -3952,6 +4001,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -4160,9 +4214,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": [ { @@ -4275,15 +4329,31 @@ } }, "node_modules/parse-asn1": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", - "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.7.tgz", + "integrity": "sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg==", "dependencies": { - "asn1.js": "^5.2.0", - "browserify-aes": "^1.0.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" + "asn1.js": "^4.10.1", + "browserify-aes": "^1.2.0", + "evp_bytestokey": "^1.0.3", + "hash-base": "~3.0", + "pbkdf2": "^3.1.2", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/parse-asn1/node_modules/hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha512-EeeoJKjTyt868liAlVmcv2ZsUfGHlE3Q+BICOXcZiwN3osr5Q/zFGYmTJpoIzuaSTAwndFy+GqhEwlU4L3j4Ow==", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": ">=4" } }, "node_modules/parse-json": { @@ -4364,8 +4434,7 @@ "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" }, "node_modules/picomatch": { "version": "2.3.1", @@ -4379,9 +4448,9 @@ } }, "node_modules/postcss": { - "version": "8.4.24", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.24.tgz", - "integrity": "sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==", + "version": "8.4.38", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", + "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", "dev": true, "funding": [ { @@ -4398,9 +4467,9 @@ } ], "dependencies": { - "nanoid": "^3.3.6", + "nanoid": "^3.3.7", "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "source-map-js": "^1.2.0" }, "engines": { "node": "^10 || ^12 || >=14" @@ -4428,6 +4497,11 @@ "node": ">= 0.6.0" } }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, "node_modules/prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", @@ -4808,9 +4882,9 @@ } }, "node_modules/rollup": { - "version": "3.25.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.25.0.tgz", - "integrity": "sha512-FnJkNRst2jEZGw7f+v4hFo6UTzpDKrAKcHZWcEfm5/GJQ5CK7wgb4moNLNAe7npKUev7yQn1AY/YbZRIxOv6Qg==", + "version": "3.29.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", + "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", "dev": true, "bin": { "rollup": "dist/bin/rollup" @@ -4865,11 +4939,6 @@ } ] }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, "node_modules/sass": { "version": "1.63.6", "resolved": "https://registry.npmjs.org/sass/-/sass-1.63.6.tgz", @@ -4896,9 +4965,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" @@ -4967,9 +5036,9 @@ } }, "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", "dev": true, "engines": { "node": ">=0.10.0" @@ -5273,14 +5342,14 @@ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "node_modules/vite": { - "version": "4.3.9", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.3.9.tgz", - "integrity": "sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==", + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.3.tgz", + "integrity": "sha512-kQL23kMeX92v3ph7IauVkXkikdDRsYMGTVl5KY2E9OY4ONLvkHf04MDTbnfo6NKxZiDLWzVpP5oTa8hQD8U3dg==", "dev": true, "dependencies": { - "esbuild": "^0.17.5", - "postcss": "^8.4.23", - "rollup": "^3.21.0" + "esbuild": "^0.18.10", + "postcss": "^8.4.27", + "rollup": "^3.27.1" }, "bin": { "vite": "bin/vite.js" @@ -5288,12 +5357,16 @@ "engines": { "node": "^14.18.0 || >=16.0.0" }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, "optionalDependencies": { "fsevents": "~2.3.2" }, "peerDependencies": { "@types/node": ">= 14", "less": "*", + "lightningcss": "^1.21.0", "sass": "*", "stylus": "*", "sugarss": "*", @@ -5306,6 +5379,9 @@ "less": { "optional": true }, + "lightningcss": { + "optional": true + }, "sass": { "optional": true }, @@ -5355,9 +5431,9 @@ } }, "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, "engines": { "node": ">=0.10.0" From ca7a169a0a1b22ec5a29301e1ee396d797057b9c Mon Sep 17 00:00:00 2001 From: Anil Natha Date: Mon, 29 Apr 2024 14:56:20 -0700 Subject: [PATCH 03/17] Stubbed in new health dashboard view and links to the health dashboard from navbar. --- src/Root.tsx | 4 +++- src/components/Navbar/index.tsx | 7 +++++++ src/routes/health-dashboard/index.tsx | 18 ++++++++++++++++++ 3 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 src/routes/health-dashboard/index.tsx diff --git a/src/Root.tsx b/src/Root.tsx index b534c06..c76c9fa 100644 --- a/src/Root.tsx +++ b/src/Root.tsx @@ -3,7 +3,8 @@ import { Routes, } from "react-router-dom" -import Home from "./routes/home" +import Home from "./routes/home"; +import HealthDashboard from "./routes/health-dashboard"; import JobMonitoring from "./routes/jobs/monitoring"; import NewJob from "./routes/jobs/new"; @@ -25,6 +26,7 @@ function Root() {
} /> + } /> } /> } /> } /> diff --git a/src/components/Navbar/index.tsx b/src/components/Navbar/index.tsx index 4625067..c394405 100644 --- a/src/components/Navbar/index.tsx +++ b/src/components/Navbar/index.tsx @@ -58,6 +58,9 @@ export default function Navbar() { Create New Job Infrastructure + + Health + HySDS ADES Deployments GitHub Actions @@ -134,6 +137,9 @@ export default function Navbar() { Create New Job Infrastructure + + Health + HySDS ADES Deployments GitHub Actions @@ -215,6 +221,7 @@ export default function Navbar() { {' '}Job Monitoring {' '}Create New Job Infrastructure + {' '}Health {' '}HySDS diff --git a/src/routes/health-dashboard/index.tsx b/src/routes/health-dashboard/index.tsx new file mode 100644 index 0000000..144819a --- /dev/null +++ b/src/routes/health-dashboard/index.tsx @@ -0,0 +1,18 @@ +import { DocumentMeta } from "../../components/DocumentMeta/DocumentMeta" + +function HealthDashboard() { + + return ( + <> + +
+

Health Dashboard

+
+ + ) +} + +export default HealthDashboard \ No newline at end of file From 4c55485606eaf6b18c5669b955261a9898fb6a48 Mon Sep 17 00:00:00 2001 From: Anil Natha Date: Mon, 29 Apr 2024 14:56:20 -0700 Subject: [PATCH 04/17] Stubbed in new health dashboard view and links to the health dashboard from navbar. --- src/Root.tsx | 4 +++- src/components/Navbar/index.tsx | 7 +++++++ src/routes/health-dashboard/index.tsx | 18 ++++++++++++++++++ 3 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 src/routes/health-dashboard/index.tsx diff --git a/src/Root.tsx b/src/Root.tsx index b534c06..c76c9fa 100644 --- a/src/Root.tsx +++ b/src/Root.tsx @@ -3,7 +3,8 @@ import { Routes, } from "react-router-dom" -import Home from "./routes/home" +import Home from "./routes/home"; +import HealthDashboard from "./routes/health-dashboard"; import JobMonitoring from "./routes/jobs/monitoring"; import NewJob from "./routes/jobs/new"; @@ -25,6 +26,7 @@ function Root() {
} /> + } /> } /> } /> } /> diff --git a/src/components/Navbar/index.tsx b/src/components/Navbar/index.tsx index 4625067..0aface2 100644 --- a/src/components/Navbar/index.tsx +++ b/src/components/Navbar/index.tsx @@ -58,6 +58,9 @@ export default function Navbar() { Create New Job Infrastructure + + Health + HySDS ADES Deployments GitHub Actions @@ -134,6 +137,9 @@ export default function Navbar() { Create New Job Infrastructure + + Health + HySDS ADES Deployments GitHub Actions @@ -215,6 +221,7 @@ export default function Navbar() { {' '}Job Monitoring {' '}Create New Job Infrastructure + {' '}Health {' '}HySDS diff --git a/src/routes/health-dashboard/index.tsx b/src/routes/health-dashboard/index.tsx new file mode 100644 index 0000000..144819a --- /dev/null +++ b/src/routes/health-dashboard/index.tsx @@ -0,0 +1,18 @@ +import { DocumentMeta } from "../../components/DocumentMeta/DocumentMeta" + +function HealthDashboard() { + + return ( + <> + +
+

Health Dashboard

+
+ + ) +} + +export default HealthDashboard \ No newline at end of file From 74dfcc99253d892a5d7a5470e801e77c12e1f5a5 Mon Sep 17 00:00:00 2001 From: Anil Natha Date: Mon, 29 Apr 2024 15:27:12 -0700 Subject: [PATCH 05/17] Updated Health Dashboard label in navbar to be "Health Dashboard". --- src/components/Navbar/index.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/Navbar/index.tsx b/src/components/Navbar/index.tsx index 0aface2..7eddf62 100644 --- a/src/components/Navbar/index.tsx +++ b/src/components/Navbar/index.tsx @@ -59,7 +59,7 @@ export default function Navbar() { Infrastructure - Health + Health Dashboard HySDS ADES Deployments @@ -138,7 +138,7 @@ export default function Navbar() { Infrastructure - Health + Health Dashboard HySDS ADES Deployments @@ -221,7 +221,7 @@ export default function Navbar() { {' '}Job Monitoring {' '}Create New Job Infrastructure - {' '}Health + {' '}Health Dashboard {' '}HySDS From e1a0aa43181238188d5308569cd3094390908a6b Mon Sep 17 00:00:00 2001 From: Anil Natha Date: Mon, 29 Apr 2024 16:51:48 -0700 Subject: [PATCH 06/17] Initial attempt at adding health dashboard data grid using stubbed in json data. --- src/routes/health-dashboard/index.tsx | 117 +++++++++++++++++++++++--- 1 file changed, 104 insertions(+), 13 deletions(-) diff --git a/src/routes/health-dashboard/index.tsx b/src/routes/health-dashboard/index.tsx index 144819a..126ede4 100644 --- a/src/routes/health-dashboard/index.tsx +++ b/src/routes/health-dashboard/index.tsx @@ -1,18 +1,109 @@ -import { DocumentMeta } from "../../components/DocumentMeta/DocumentMeta" +import { AgGridReact } from "ag-grid-react"; // the AG Grid React Component +import { CellClickedEvent } from 'ag-grid-community'; +import { DocumentMeta } from "../../components/DocumentMeta/DocumentMeta"; +import { useCallback, useMemo, useState } from "react"; +import { useNavigate } from "react-router-dom"; + +interface HealthCheck { + status:string; + date:string +} + +interface Service { + healthChecks:HealthCheck[] + landingPage:string; + service:string; +} function HealthDashboard() { - return ( - <> - -
-

Health Dashboard

-
- - ) + const navigate = useNavigate(); + + const [rowData, setRowData] = useState>([ + { + "service": "airflow", + "landingPage":"unity.jpl.nasa.gov/project/venue/processing/ui", + "healthChecks": [ + { + "status": "HEALTHY", + "date": "2024-04-09T18:01:08Z" + } + ] + }, + { + "service": "jupyter", + "landingPage":"unity.jpl.nasa.gov/project/venue/ads/jupyter", + "healthChecks": [ + { + "status": "HEALTHY", + "date": "2024-04-09T18:01:08Z" + } + ] + }, + { + "service": "other_service", + "landingPage":"unity.jpl.nasa.gov/project/venue/other_service", + "healthChecks": [ + { + "status": "UNHEALTHY", + "date": "2024-04-09T18:01:08Z" + } + ] + } + ]); // Set rowData to Array of Objects, one Object per Row + + // Each Column Definition results in one Column. + const [columnDefs] = useState([ + { field: "service", headerName: "Service", filter: true }, + { field: "status", valueGetter: "data.healthChecks[0].status", headerName: "Status", filter: true }, + { field: "landingPage", headerName: "Landing Page", filter: true, cellStyle: { cursor: 'pointer', color: '#0000FF', textDecoration: 'underline' }}, + { field: "date", valueGetter: "data.healthChecks[0].date", headerName: "Date", filter: true }, + ]); + + // DefaultColDef sets props common to all Columns + const defaultColDef = useMemo( + () => ({ + sortable: true, + }), + [] + ); + + // Example of consuming Grid Event + const cellClickedListener = useCallback( (event:CellClickedEvent) => { + + if( event.colDef.field === 'landingPage') { + window.location.href = "https://" + event.data.landingPage; + } + + }, []); + + const onGridReady = useCallback( () => { + const abortController = new AbortController(); + //fetchData(abortController) #todo implement data fetch + return () => abortController.abort(); + }, []); + + return ( + <> + +
+

Health Dashboard

+
+ +
+
+ + ); } -export default HealthDashboard \ No newline at end of file +export default HealthDashboard; From d1f316c2699106a0f2a382698ed30292314ec61e Mon Sep 17 00:00:00 2001 From: Anil Natha Date: Mon, 29 Apr 2024 16:52:24 -0700 Subject: [PATCH 07/17] Removed unused useNavigate component. --- src/routes/health-dashboard/index.tsx | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/routes/health-dashboard/index.tsx b/src/routes/health-dashboard/index.tsx index 126ede4..cff2807 100644 --- a/src/routes/health-dashboard/index.tsx +++ b/src/routes/health-dashboard/index.tsx @@ -2,7 +2,6 @@ import { AgGridReact } from "ag-grid-react"; // the AG Grid React Component import { CellClickedEvent } from 'ag-grid-community'; import { DocumentMeta } from "../../components/DocumentMeta/DocumentMeta"; import { useCallback, useMemo, useState } from "react"; -import { useNavigate } from "react-router-dom"; interface HealthCheck { status:string; @@ -17,8 +16,6 @@ interface Service { function HealthDashboard() { - const navigate = useNavigate(); - const [rowData, setRowData] = useState>([ { "service": "airflow", From fb9c8a90ddca9e6b73e6a78fc1e3d8e8af219a4c Mon Sep 17 00:00:00 2001 From: Anil Natha Date: Mon, 13 May 2024 13:16:28 -0700 Subject: [PATCH 08/17] Updated status cell rendering style for health dashboard. --- src/routes/health-dashboard/index.tsx | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/routes/health-dashboard/index.tsx b/src/routes/health-dashboard/index.tsx index cff2807..ee521a6 100644 --- a/src/routes/health-dashboard/index.tsx +++ b/src/routes/health-dashboard/index.tsx @@ -52,7 +52,22 @@ function HealthDashboard() { // Each Column Definition results in one Column. const [columnDefs] = useState([ { field: "service", headerName: "Service", filter: true }, - { field: "status", valueGetter: "data.healthChecks[0].status", headerName: "Status", filter: true }, + { + cellRenderer: params => { + + let icon; + if( params.value.toString().toUpperCase() === "UNHEALTHY" ) { + icon = + } + + return {params.value} {icon} + + }, + field: "status", + filter: true, + headerName: "Status", + valueGetter: "data.healthChecks[0].status", + }, { field: "landingPage", headerName: "Landing Page", filter: true, cellStyle: { cursor: 'pointer', color: '#0000FF', textDecoration: 'underline' }}, { field: "date", valueGetter: "data.healthChecks[0].date", headerName: "Date", filter: true }, ]); From 7af758cb5cd45eefc6b836374268aaf76ac8825f Mon Sep 17 00:00:00 2001 From: Anil Natha Date: Mon, 13 May 2024 13:17:01 -0700 Subject: [PATCH 09/17] Added "Unhealthy" status style for health dashboard. --- index.html | 2 +- src/routes/health-dashboard/index.tsx | 3 +++ src/styles/{variables.scss => _variables.scss} | 0 src/styles/components/_Icons.scss | 7 +++++++ src/styles/styles.scss | 7 +++++++ 5 files changed, 18 insertions(+), 1 deletion(-) rename src/styles/{variables.scss => _variables.scss} (100%) create mode 100644 src/styles/components/_Icons.scss create mode 100644 src/styles/styles.scss diff --git a/index.html b/index.html index 79ae34c..7ca3229 100644 --- a/index.html +++ b/index.html @@ -16,7 +16,7 @@ window.EventEmitter = EventEmitter; diff --git a/src/routes/health-dashboard/index.tsx b/src/routes/health-dashboard/index.tsx index ee521a6..9aeea25 100644 --- a/src/routes/health-dashboard/index.tsx +++ b/src/routes/health-dashboard/index.tsx @@ -59,6 +59,9 @@ function HealthDashboard() { if( params.value.toString().toUpperCase() === "UNHEALTHY" ) { icon = } + if( params.value.toString().toUpperCase() === "UNAVAILABLE" ) { + icon = + } return {params.value} {icon} diff --git a/src/styles/variables.scss b/src/styles/_variables.scss similarity index 100% rename from src/styles/variables.scss rename to src/styles/_variables.scss diff --git a/src/styles/components/_Icons.scss b/src/styles/components/_Icons.scss new file mode 100644 index 0000000..8c7a6ef --- /dev/null +++ b/src/styles/components/_Icons.scss @@ -0,0 +1,7 @@ +.unity-icon-eror { + color: var(--st-orange); +} + +.unity-icon-warning { + color: var(--st-orange); +} \ No newline at end of file diff --git a/src/styles/styles.scss b/src/styles/styles.scss new file mode 100644 index 0000000..afc24c3 --- /dev/null +++ b/src/styles/styles.scss @@ -0,0 +1,7 @@ +@charset 'utf-8'; + +// Variables +@import "_variables"; + +// Components +@import "components/_Icons"; From 5fc014505ff751efb67c29481ac2c04e4ce406a1 Mon Sep 17 00:00:00 2001 From: Anil Natha Date: Mon, 13 May 2024 13:20:45 -0700 Subject: [PATCH 10/17] Updated Health-Dashboard so that it fetches data using redux data store. --- package-lock.json | 490 ++++++++++++++++++------- package.json | 5 +- public/data/health.json | 32 ++ src/AuthenticationWrapper.tsx | 4 + src/routes/health-dashboard/index.tsx | 84 ++--- src/state/hooks.ts | 6 + src/state/selectors/healthSelectors.ts | 5 + src/state/slices/healthSlice.ts | 127 +++++++ src/state/store.ts | 14 + 9 files changed, 590 insertions(+), 177 deletions(-) create mode 100644 public/data/health.json create mode 100644 src/state/hooks.ts create mode 100644 src/state/selectors/healthSelectors.ts create mode 100644 src/state/slices/healthSlice.ts create mode 100644 src/state/store.ts diff --git a/package-lock.json b/package-lock.json index b2dfede..a92f406 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,8 +8,10 @@ "name": "unity-ui", "version": "0.5.0", "dependencies": { + "@reduxjs/toolkit": "^2.2.3", "ag-grid-community": "^30.0.0", "ag-grid-react": "^30.0.0", + "axios": "^1.6.8", "crypto-browserify": "^3.12.0", "events": "^3.3.0", "jwt-decode": "^3.1.2", @@ -18,6 +20,7 @@ "react-dom": "^18.2.0", "react-helmet-async": "^1.3.0", "react-oauth2-pkce": "^2.0.7", + "react-redux": "^9.1.2", "react-resizable-panels": "^0.0.51", "react-router-dom": "^6.11.2", "stream-browserify": "^3.0.0", @@ -25,7 +28,7 @@ "util": "^0.12.5" }, "devDependencies": { - "@nasa-jpl/react-stellar": "^1.1.2", + "@nasa-jpl/react-stellar": "^1.1.10", "@types/react": "^18.2.7", "@types/react-dom": "^18.2.4", "@types/styled-components": "^5.1.26", @@ -353,15 +356,15 @@ "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" }, "node_modules/@emotion/react": { - "version": "11.11.1", - "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.1.tgz", - "integrity": "sha512-5mlW1DquU5HaxjLkfkGN1GA/fvVGdyHURRiX/0FHl2cfIfRxSOfmxEH5YS43edp0OldZrZ+dkBKbngxcNCdZvA==", + "version": "11.11.4", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.4.tgz", + "integrity": "sha512-t8AjMlF0gHpvvxk5mAtCqR4vmxiGHCeJBaQO6gncUSdklELOgtwjerNY2yuJNfwnc6vi16U/+uMF+afIawJ9iw==", "dev": true, "dependencies": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.11.0", "@emotion/cache": "^11.11.0", - "@emotion/serialize": "^1.1.2", + "@emotion/serialize": "^1.1.3", "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", "@emotion/utils": "^1.2.1", "@emotion/weak-memoize": "^0.3.1", @@ -377,9 +380,9 @@ } }, "node_modules/@emotion/serialize": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.2.tgz", - "integrity": "sha512-zR6a/fkFP4EAcCMQtLOhIgpprZOwNmCldtpaISpvz348+DP4Mz8ZoKaGGCQpbzepNIUWbq4w6hNZkwDyKoS+HA==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.4.tgz", + "integrity": "sha512-RIN04MBT8g+FnDwgvIUi8czvr1LU1alUMI05LekWB5DGyTm8cCBMCRpq3GqaiyEDRptEXOyXnvZ58GZYu4kBxQ==", "dev": true, "dependencies": { "@emotion/hash": "^0.9.1", @@ -836,33 +839,43 @@ } }, "node_modules/@floating-ui/core": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.3.0.tgz", - "integrity": "sha512-vX1WVAdPjZg9DkDkC+zEx/tKtnST6/qcNpwcjeBgco3XRNHz5PUA+ivi/yr6G3o0kMR60uKBJcfOdfzOFI7PMQ==", - "dev": true + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.1.tgz", + "integrity": "sha512-42UH54oPZHPdRHdw6BgoBD6cg/eVTmVrFcgeRDM3jbO7uxSoipVcmcIGFcA5jmOHO5apcyvBhkSKES3fQJnu7A==", + "dev": true, + "dependencies": { + "@floating-ui/utils": "^0.2.0" + } }, "node_modules/@floating-ui/dom": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.3.0.tgz", - "integrity": "sha512-qIAwejE3r6NeA107u4ELDKkH8+VtgRKdXqtSPaKflL2S2V+doyN+Wt9s5oHKXPDo4E8TaVXaHT3+6BbagH31xw==", + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.5.tgz", + "integrity": "sha512-Nsdud2X65Dz+1RHjAIP0t8z5e2ff/IRbei6BqFrl1urT8sDVzM1HMQ+R0XcU5ceRfyO3I6ayeqIfh+6Wb8LGTw==", "dev": true, "dependencies": { - "@floating-ui/core": "^1.3.0" + "@floating-ui/core": "^1.0.0", + "@floating-ui/utils": "^0.2.0" } }, "node_modules/@floating-ui/react-dom": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.1.tgz", - "integrity": "sha512-rZtAmSht4Lry6gdhAJDrCp/6rKN7++JnL1/Anbr/DdeyYXQPxvg/ivrbYvJulbRf4vL8b212suwMM2lxbv+RQA==", + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.9.tgz", + "integrity": "sha512-q0umO0+LQK4+p6aGyvzASqKbKOJcAHJ7ycE9CuUvfx3s9zTHWmGJTPOIlM/hmSBfUfg/XfY5YhLBLR/LHwShQQ==", "dev": true, "dependencies": { - "@floating-ui/dom": "^1.3.0" + "@floating-ui/dom": "^1.0.0" }, "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, + "node_modules/@floating-ui/utils": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.2.tgz", + "integrity": "sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw==", + "dev": true + }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", @@ -940,9 +953,9 @@ } }, "node_modules/@nasa-jpl/react-stellar": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@nasa-jpl/react-stellar/-/react-stellar-1.1.2.tgz", - "integrity": "sha512-/GUgd7M7Y07og6O3sQwDQIsuVSYvYx4zleas3x48ZuNu/MJF+yG0bWIqvHj6hZHsDO+v4lIfGGaRPo5eVQQj0w==", + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/@nasa-jpl/react-stellar/-/react-stellar-1.1.10.tgz", + "integrity": "sha512-J7BPxemMGgc2ehB7BcBNFLIUm5bhVciVePNOHceBgVXLN9uhejCeQrM4YU9T1e9RGLEsUkzn8/mScKJrim55GA==", "dev": true, "dependencies": { "@nasa-jpl/stellar": "^1.1.8", @@ -953,11 +966,14 @@ "@radix-ui/react-dropdown-menu": "^2.0.4", "@radix-ui/react-popover": "^1.0.3", "@radix-ui/react-progress": "^1.0.2", - "@radix-ui/react-slider": "^1.1.1", + "@radix-ui/react-slider": "^1.1.2", "@radix-ui/react-switch": "^1.0.2", "@radix-ui/react-toast": "^1.1.3", "@radix-ui/react-tooltip": "^1.0.3", "classnames": "^2.3.2", + "date-fns": "^3.3.1", + "date-fns-tz": "^3.0.0-beta.2", + "react-day-picker": "^8.10.0", "react-select": "^5.7.3" }, "peerDependencies": { @@ -966,9 +982,9 @@ } }, "node_modules/@nasa-jpl/stellar": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/@nasa-jpl/stellar/-/stellar-1.1.8.tgz", - "integrity": "sha512-m5cCHjK2LLGTMZQAVJGbEbjtKYAd7RWoq4Ou++8LDyYN1hSzH1CvvowXyrSBGFKpA55DJMPGd/mgAul3akD2Cw==", + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/@nasa-jpl/stellar/-/stellar-1.1.18.tgz", + "integrity": "sha512-e+26M01HFrGBZBQwsxxoJ8OSbRKn/zdUatwRryuPaEIm9RNJwDiejYqIoWCLn9s04hVeYr4PRe6IXa0nPR95vg==", "dev": true }, "node_modules/@nodelib/fs.scandir": { @@ -1025,16 +1041,16 @@ } }, "node_modules/@radix-ui/react-alert-dialog": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-alert-dialog/-/react-alert-dialog-1.0.4.tgz", - "integrity": "sha512-jbfBCRlKYlhbitueOAv7z74PXYeIQmWpKwm3jllsdkw7fGWNkxqP3v0nY9WmOzcPqpQuoorNtvViBgL46n5gVg==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-alert-dialog/-/react-alert-dialog-1.0.5.tgz", + "integrity": "sha512-OrVIOcZL0tl6xibeuGt5/+UxoT2N27KCFOPjFyfXMnchxSHZ/OW7cCX2nGlIYJrbHK/fczPcFzAwvNBB6XBNMA==", "dev": true, "dependencies": { "@babel/runtime": "^7.13.10", "@radix-ui/primitive": "1.0.1", "@radix-ui/react-compose-refs": "1.0.1", "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-dialog": "1.0.4", + "@radix-ui/react-dialog": "1.0.5", "@radix-ui/react-primitive": "1.0.3", "@radix-ui/react-slot": "1.0.2" }, @@ -1078,9 +1094,9 @@ } }, "node_modules/@radix-ui/react-avatar": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-avatar/-/react-avatar-1.0.3.tgz", - "integrity": "sha512-9ToF7YNex3Ste45LrAeTlKtONI9yVRt/zOS158iilIkW5K/Apeyb/TUQlcEFTEFvWr8Kzdi2ZYrm1/suiXPajQ==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-avatar/-/react-avatar-1.0.4.tgz", + "integrity": "sha512-kVK2K7ZD3wwj3qhle0ElXhOjbezIgyl2hVvgwfIdexL3rN6zJmy5AqqIf+D31lxVppdzV8CjAfZ6PklkmInZLw==", "dev": true, "dependencies": { "@babel/runtime": "^7.13.10", @@ -1199,20 +1215,20 @@ } }, "node_modules/@radix-ui/react-dialog": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.0.4.tgz", - "integrity": "sha512-hJtRy/jPULGQZceSAP2Re6/4NpKo8im6V8P2hUqZsdFiSL8l35kYsw3qbRI6Ay5mQd2+wlLqje770eq+RJ3yZg==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.0.5.tgz", + "integrity": "sha512-GjWJX/AUpB703eEBanuBnIWdIXg6NvJFCXcNlSZk4xdszCdhrJgBoUd1cGk67vFO+WdA2pfI/plOpqz/5GUP6Q==", "dev": true, "dependencies": { "@babel/runtime": "^7.13.10", "@radix-ui/primitive": "1.0.1", "@radix-ui/react-compose-refs": "1.0.1", "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-dismissable-layer": "1.0.4", + "@radix-ui/react-dismissable-layer": "1.0.5", "@radix-ui/react-focus-guards": "1.0.1", - "@radix-ui/react-focus-scope": "1.0.3", + "@radix-ui/react-focus-scope": "1.0.4", "@radix-ui/react-id": "1.0.1", - "@radix-ui/react-portal": "1.0.3", + "@radix-ui/react-portal": "1.0.4", "@radix-ui/react-presence": "1.0.1", "@radix-ui/react-primitive": "1.0.3", "@radix-ui/react-slot": "1.0.2", @@ -1254,9 +1270,9 @@ } }, "node_modules/@radix-ui/react-dismissable-layer": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.4.tgz", - "integrity": "sha512-7UpBa/RKMoHJYjie1gkF1DlK8l1fdU/VKDpoS3rCCo8YBJR294GwcEHyxHw72yvphJ7ld0AXEcSLAzY2F/WyCg==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.5.tgz", + "integrity": "sha512-aJeDjQhywg9LBu2t/At58hCvr7pEm0o2Ke1x33B+MhjNmmZ17sy4KImo0KPLgsnc/zN7GPdce8Cnn0SWvwZO7g==", "dev": true, "dependencies": { "@babel/runtime": "^7.13.10", @@ -1282,9 +1298,9 @@ } }, "node_modules/@radix-ui/react-dropdown-menu": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.0.5.tgz", - "integrity": "sha512-xdOrZzOTocqqkCkYo8yRPCib5OkTkqN7lqNCdxwPOdE466DOaNl4N8PkUIlsXthQvW5Wwkd+aEmWpfWlBoDPEw==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.0.6.tgz", + "integrity": "sha512-i6TuFOoWmLWq+M/eCLGd/bQ2HfAX1RJgvrBQ6AQLmzfvsLdefxbWu8G9zczcPFfcSPehz9GcpF6K9QYreFV8hA==", "dev": true, "dependencies": { "@babel/runtime": "^7.13.10", @@ -1292,7 +1308,7 @@ "@radix-ui/react-compose-refs": "1.0.1", "@radix-ui/react-context": "1.0.1", "@radix-ui/react-id": "1.0.1", - "@radix-ui/react-menu": "2.0.5", + "@radix-ui/react-menu": "2.0.6", "@radix-ui/react-primitive": "1.0.3", "@radix-ui/react-use-controllable-state": "1.0.1" }, @@ -1330,9 +1346,9 @@ } }, "node_modules/@radix-ui/react-focus-scope": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.0.3.tgz", - "integrity": "sha512-upXdPfqI4islj2CslyfUBNlaJCPybbqRHAi1KER7Isel9Q2AtSJ0zRBZv8mWQiFXD2nyAJ4BhC3yXgZ6kMBSrQ==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.0.4.tgz", + "integrity": "sha512-sL04Mgvf+FmyvZeYfNu1EPAaaxD+aw7cYeIB9L9Fvq8+urhltTRaEo5ysKOpHuKPclsZcSUMKlN05x4u+CINpA==", "dev": true, "dependencies": { "@babel/runtime": "^7.13.10", @@ -1375,9 +1391,9 @@ } }, "node_modules/@radix-ui/react-menu": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.0.5.tgz", - "integrity": "sha512-Gw4f9pwdH+w5w+49k0gLjN0PfRDHvxmAgG16AbyJZ7zhwZ6PBHKtWohvnSwfusfnK3L68dpBREHpVkj8wEM7ZA==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.0.6.tgz", + "integrity": "sha512-BVkFLS+bUC8HcImkRKPSiVumA1VPOOEC5WBMiT+QAVsPzW1FJzI9KnqgGxVDPBcql5xXrHkD3JOVoXWEXD8SYA==", "dev": true, "dependencies": { "@babel/runtime": "^7.13.10", @@ -1386,12 +1402,12 @@ "@radix-ui/react-compose-refs": "1.0.1", "@radix-ui/react-context": "1.0.1", "@radix-ui/react-direction": "1.0.1", - "@radix-ui/react-dismissable-layer": "1.0.4", + "@radix-ui/react-dismissable-layer": "1.0.5", "@radix-ui/react-focus-guards": "1.0.1", - "@radix-ui/react-focus-scope": "1.0.3", + "@radix-ui/react-focus-scope": "1.0.4", "@radix-ui/react-id": "1.0.1", - "@radix-ui/react-popper": "1.1.2", - "@radix-ui/react-portal": "1.0.3", + "@radix-ui/react-popper": "1.1.3", + "@radix-ui/react-portal": "1.0.4", "@radix-ui/react-presence": "1.0.1", "@radix-ui/react-primitive": "1.0.3", "@radix-ui/react-roving-focus": "1.0.4", @@ -1416,21 +1432,21 @@ } }, "node_modules/@radix-ui/react-popover": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.0.6.tgz", - "integrity": "sha512-cZ4defGpkZ0qTRtlIBzJLSzL6ht7ofhhW4i1+pkemjV1IKXm0wgCRnee154qlV6r9Ttunmh2TNZhMfV2bavUyA==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.0.7.tgz", + "integrity": "sha512-shtvVnlsxT6faMnK/a7n0wptwBD23xc1Z5mdrtKLwVEfsEMXodS0r5s0/g5P0hX//EKYZS2sxUjqfzlg52ZSnQ==", "dev": true, "dependencies": { "@babel/runtime": "^7.13.10", "@radix-ui/primitive": "1.0.1", "@radix-ui/react-compose-refs": "1.0.1", "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-dismissable-layer": "1.0.4", + "@radix-ui/react-dismissable-layer": "1.0.5", "@radix-ui/react-focus-guards": "1.0.1", - "@radix-ui/react-focus-scope": "1.0.3", + "@radix-ui/react-focus-scope": "1.0.4", "@radix-ui/react-id": "1.0.1", - "@radix-ui/react-popper": "1.1.2", - "@radix-ui/react-portal": "1.0.3", + "@radix-ui/react-popper": "1.1.3", + "@radix-ui/react-portal": "1.0.4", "@radix-ui/react-presence": "1.0.1", "@radix-ui/react-primitive": "1.0.3", "@radix-ui/react-slot": "1.0.2", @@ -1454,9 +1470,9 @@ } }, "node_modules/@radix-ui/react-popper": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.1.2.tgz", - "integrity": "sha512-1CnGGfFi/bbqtJZZ0P/NQY20xdG3E0LALJaLUEoKwPLwl6PPPfbeiCqMVQnhoFRAxjJj4RpBRJzDmUgsex2tSg==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.1.3.tgz", + "integrity": "sha512-cKpopj/5RHZWjrbF2846jBNacjQVwkP068DfmgrNJXpvVWrOvlAmE9xSiy5OqeE+Gi8D9fP+oDhUnPqNMY8/5w==", "dev": true, "dependencies": { "@babel/runtime": "^7.13.10", @@ -1487,9 +1503,9 @@ } }, "node_modules/@radix-ui/react-portal": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.0.3.tgz", - "integrity": "sha512-xLYZeHrWoPmA5mEKEfZZevoVRK/Q43GfzRXkWV6qawIWWK8t6ifIiLQdd7rmQ4Vk1bmI21XhqF9BN3jWf+phpA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.0.4.tgz", + "integrity": "sha512-Qki+C/EuGUVCQTOTD5vzJzJuMUlewbzuKyUy+/iHM2uwGiru9gZeBJtHAPKAEkB5KWGi9mP/CHKcY0wt1aW45Q==", "dev": true, "dependencies": { "@babel/runtime": "^7.13.10", @@ -1700,9 +1716,9 @@ } }, "node_modules/@radix-ui/react-toast": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-toast/-/react-toast-1.1.4.tgz", - "integrity": "sha512-wf+fc8DOywrpRK3jlPlWVe+ELYGHdKDaaARJZNuUTWyWYq7+ANCFLp4rTjZ/mcGkJJQ/vZ949Zis9xxEpfq9OA==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toast/-/react-toast-1.1.5.tgz", + "integrity": "sha512-fRLn227WHIBRSzuRzGJ8W+5YALxofH23y0MlPLddaIpLpCDqdE0NZlS2NRQDRiptfxDeeCjgFIpexB1/zkxDlw==", "dev": true, "dependencies": { "@babel/runtime": "^7.13.10", @@ -1710,8 +1726,8 @@ "@radix-ui/react-collection": "1.0.3", "@radix-ui/react-compose-refs": "1.0.1", "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-dismissable-layer": "1.0.4", - "@radix-ui/react-portal": "1.0.3", + "@radix-ui/react-dismissable-layer": "1.0.5", + "@radix-ui/react-portal": "1.0.4", "@radix-ui/react-presence": "1.0.1", "@radix-ui/react-primitive": "1.0.3", "@radix-ui/react-use-callback-ref": "1.0.1", @@ -1735,19 +1751,19 @@ } }, "node_modules/@radix-ui/react-tooltip": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.0.6.tgz", - "integrity": "sha512-DmNFOiwEc2UDigsYj6clJENma58OelxD24O4IODoZ+3sQc3Zb+L8w1EP+y9laTuKCLAysPw4fD6/v0j4KNV8rg==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.0.7.tgz", + "integrity": "sha512-lPh5iKNFVQ/jav/j6ZrWq3blfDJ0OH9R6FlNUHPMqdLuQ9vwDgFsRxvl8b7Asuy5c8xmoojHUxKHQSOAvMHxyw==", "dev": true, "dependencies": { "@babel/runtime": "^7.13.10", "@radix-ui/primitive": "1.0.1", "@radix-ui/react-compose-refs": "1.0.1", "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-dismissable-layer": "1.0.4", + "@radix-ui/react-dismissable-layer": "1.0.5", "@radix-ui/react-id": "1.0.1", - "@radix-ui/react-popper": "1.1.2", - "@radix-ui/react-portal": "1.0.3", + "@radix-ui/react-popper": "1.1.3", + "@radix-ui/react-portal": "1.0.4", "@radix-ui/react-presence": "1.0.1", "@radix-ui/react-primitive": "1.0.3", "@radix-ui/react-slot": "1.0.2", @@ -1932,6 +1948,29 @@ "@babel/runtime": "^7.13.10" } }, + "node_modules/@reduxjs/toolkit": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.2.3.tgz", + "integrity": "sha512-76dll9EnJXg4EVcI5YNxZA/9hSAmZsFqzMmNRHvIlzw2WS/twfcVX3ysYrWGJMClwEmChQFC4yRq74tn6fdzRA==", + "dependencies": { + "immer": "^10.0.3", + "redux": "^5.0.1", + "redux-thunk": "^3.1.0", + "reselect": "^5.0.1" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18", + "react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-redux": { + "optional": true + } + } + }, "node_modules/@remix-run/router": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.6.3.tgz", @@ -2151,25 +2190,24 @@ "dev": true }, "node_modules/@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", "dev": true }, "node_modules/@types/prop-types": { "version": "15.7.5", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", - "dev": true + "devOptional": true }, "node_modules/@types/react": { - "version": "18.2.11", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.11.tgz", - "integrity": "sha512-+hsJr9hmwyDecSMQAmX7drgbDpyE+EgSF6t7+5QEBAn1tQK7kl1vWZ4iRf6SjQ8lk7dyEULxUmZOIpN0W5baZA==", - "dev": true, + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.1.tgz", + "integrity": "sha512-V0kuGBX3+prX+DQ/7r2qsv1NsdfnCLnTgnRJ1pYnxykBhGMz+qj+box5lq7XsO5mtZsBqpjwwTu/7wszPfMBcw==", + "devOptional": true, "dependencies": { "@types/prop-types": "*", - "@types/scheduler": "*", "csstype": "^3.0.2" } }, @@ -2183,20 +2221,14 @@ } }, "node_modules/@types/react-transition-group": { - "version": "4.4.6", - "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.6.tgz", - "integrity": "sha512-VnCdSxfcm08KjsJVQcfBmhEQAPnLB8G08hAxn39azX1qYBQ/5RVQuoHuKIcfKOdncuaUvEpFKFzEvbtIMsfVew==", + "version": "4.4.10", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.10.tgz", + "integrity": "sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q==", "dev": true, "dependencies": { "@types/react": "*" } }, - "node_modules/@types/scheduler": { - "version": "0.16.3", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", - "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==", - "dev": true - }, "node_modules/@types/semver": { "version": "7.5.0", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", @@ -2214,6 +2246,11 @@ "csstype": "^3.0.2" } }, + "node_modules/@types/use-sync-external-store": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz", + "integrity": "sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==" + }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "5.59.9", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.9.tgz", @@ -2513,9 +2550,9 @@ "dev": true }, "node_modules/aria-hidden": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.3.tgz", - "integrity": "sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.4.tgz", + "integrity": "sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==", "dev": true, "dependencies": { "tslib": "^2.0.0" @@ -2548,6 +2585,11 @@ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, "node_modules/available-typed-arrays": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", @@ -2559,6 +2601,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/axios": { + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", + "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, "node_modules/babel-plugin-macros": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", @@ -2891,9 +2943,9 @@ } }, "node_modules/classnames": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", - "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", + "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==", "dev": true }, "node_modules/color-convert": { @@ -2914,6 +2966,17 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -3043,7 +3106,26 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", - "dev": true + "devOptional": true + }, + "node_modules/date-fns": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz", + "integrity": "sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" + } + }, + "node_modules/date-fns-tz": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/date-fns-tz/-/date-fns-tz-3.1.3.tgz", + "integrity": "sha512-ZfbMu+nbzW0mEzC8VZrLiSWvUIaI3aRHeq33mTe7Y38UctKukgqPR4nTDwcwS4d64Gf8GghnVsroBuMY3eiTeA==", + "dev": true, + "peerDependencies": { + "date-fns": "^3.0.0" + } }, "node_modules/debug": { "version": "4.3.4", @@ -3067,6 +3149,14 @@ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/des.js": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz", @@ -3549,6 +3639,25 @@ "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", "dev": true }, + "node_modules/follow-redirects": { + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, "node_modules/for-each": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", @@ -3557,6 +3666,19 @@ "is-callable": "^1.1.3" } }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -3578,9 +3700,12 @@ } }, "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/get-intrinsic": { "version": "1.2.1", @@ -3773,6 +3898,18 @@ "minimalistic-assert": "^1.0.1" } }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/hmac-drbg": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", @@ -3820,6 +3957,15 @@ "node": ">= 4" } }, + "node_modules/immer": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/immer/-/immer-10.1.1.tgz", + "integrity": "sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, "node_modules/immutable": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.0.tgz", @@ -3919,12 +4065,12 @@ } }, "node_modules/is-core-module": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", - "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", "dev": true, "dependencies": { - "has": "^1.0.3" + "hasown": "^2.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4186,6 +4332,25 @@ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", @@ -4512,6 +4677,11 @@ "react-is": "^16.13.1" } }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, "node_modules/public-encrypt": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", @@ -4587,6 +4757,20 @@ "node": ">=0.10.0" } }, + "node_modules/react-day-picker": { + "version": "8.10.1", + "resolved": "https://registry.npmjs.org/react-day-picker/-/react-day-picker-8.10.1.tgz", + "integrity": "sha512-TMx7fNbhLk15eqcMt+7Z7S2KF7mfTId/XJDjKE8f+IUcFn0l08/kI4FiYTL/0yuOLmEcbR4Fwe3GJf/NiiMnPA==", + "dev": true, + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/gpbl" + }, + "peerDependencies": { + "date-fns": "^2.28.0 || ^3.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/react-dom": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", @@ -4645,6 +4829,28 @@ "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-2.2.0.tgz", "integrity": "sha512-86GgN2vzfUu7m9Wcj63iUkuDzFNYFVmjeDm2GzWpUk+opB0pEpMsw6ePCMrhYkumz2C1ihqtZzOMAg7FiXcNoQ==" }, + "node_modules/react-redux": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.1.2.tgz", + "integrity": "sha512-0OA4dhM1W48l3uzmv6B7TXPCGmokUU4p1M44DGN2/D9a1FjVPukVjER1PcPX97jIg6aUeLq1XJo1IpfbgULn0w==", + "dependencies": { + "@types/use-sync-external-store": "^0.0.3", + "use-sync-external-store": "^1.0.0" + }, + "peerDependencies": { + "@types/react": "^18.2.25", + "react": "^18.0", + "redux": "^5.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "redux": { + "optional": true + } + } + }, "node_modules/react-remove-scroll": { "version": "2.5.5", "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.5.tgz", @@ -4671,9 +4877,9 @@ } }, "node_modules/react-remove-scroll-bar": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.4.tgz", - "integrity": "sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==", + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.6.tgz", + "integrity": "sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==", "dev": true, "dependencies": { "react-style-singleton": "^2.2.1", @@ -4732,9 +4938,9 @@ } }, "node_modules/react-select": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/react-select/-/react-select-5.7.3.tgz", - "integrity": "sha512-z8i3NCuFFWL3w27xq92rBkVI2onT0jzIIPe480HlBjXJ3b5o6Q+Clp4ydyeKrj9DZZ3lrjawwLC5NGl0FSvUDg==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/react-select/-/react-select-5.8.0.tgz", + "integrity": "sha512-TfjLDo58XrhP6VG5M/Mi56Us0Yt8X7xD6cDybC7yoRMUNm7BGO7qk8J0TLQOua/prb8vUOtsfnXZwfm30HGsAA==", "dev": true, "dependencies": { "@babel/runtime": "^7.12.0", @@ -4816,18 +5022,36 @@ "node": ">=8.10.0" } }, + "node_modules/redux": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", + "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==" + }, + "node_modules/redux-thunk": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-3.1.0.tgz", + "integrity": "sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==", + "peerDependencies": { + "redux": "^5.0.0" + } + }, "node_modules/regenerator-runtime": { "version": "0.13.11", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" }, + "node_modules/reselect": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.1.0.tgz", + "integrity": "sha512-aw7jcGLDpSgNDyWBQLv2cedml85qd95/iszJjN988zX1t7AVRJi19d9kto5+W7oCfQ94gyo40dVbT6g2k4/kXg==" + }, "node_modules/resolve": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", - "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dev": true, "dependencies": { - "is-core-module": "^2.11.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -5195,9 +5419,9 @@ } }, "node_modules/tslib": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", - "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", "dev": true }, "node_modules/tsutils": { @@ -5268,9 +5492,9 @@ } }, "node_modules/use-callback-ref": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.0.tgz", - "integrity": "sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.2.tgz", + "integrity": "sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==", "dev": true, "dependencies": { "tslib": "^2.0.0" @@ -5324,6 +5548,14 @@ } } }, + "node_modules/use-sync-external-store": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz", + "integrity": "sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/util": { "version": "0.12.5", "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", diff --git a/package.json b/package.json index 5c5d56c..7662ac7 100644 --- a/package.json +++ b/package.json @@ -10,8 +10,10 @@ "preview": "vite preview" }, "dependencies": { + "@reduxjs/toolkit": "^2.2.3", "ag-grid-community": "^30.0.0", "ag-grid-react": "^30.0.0", + "axios": "^1.6.8", "crypto-browserify": "^3.12.0", "events": "^3.3.0", "jwt-decode": "^3.1.2", @@ -20,6 +22,7 @@ "react-dom": "^18.2.0", "react-helmet-async": "^1.3.0", "react-oauth2-pkce": "^2.0.7", + "react-redux": "^9.1.2", "react-resizable-panels": "^0.0.51", "react-router-dom": "^6.11.2", "stream-browserify": "^3.0.0", @@ -27,7 +30,7 @@ "util": "^0.12.5" }, "devDependencies": { - "@nasa-jpl/react-stellar": "^1.1.2", + "@nasa-jpl/react-stellar": "^1.1.10", "@types/react": "^18.2.7", "@types/react-dom": "^18.2.4", "@types/styled-components": "^5.1.26", diff --git a/public/data/health.json b/public/data/health.json new file mode 100644 index 0000000..07a804b --- /dev/null +++ b/public/data/health.json @@ -0,0 +1,32 @@ +[ + { + "service": "airflow", + "landingPage":"unity.jpl.nasa.gov/project/venue/processing/ui", + "healthChecks": [ + { + "status": "HEALTHY", + "date": "2024-04-09T18:01:08Z" + } + ] + }, + { + "service": "jupyter", + "landingPage":"unity.jpl.nasa.gov/project/venue/ads/jupyter", + "healthChecks": [ + { + "status": "HEALTHY", + "date": "2024-04-09T18:01:08Z" + } + ] + }, + { + "service": "other_service", + "landingPage":"unity.jpl.nasa.gov/project/venue/other_service", + "healthChecks": [ + { + "status": "UNHEALTHY", + "date": "2024-04-09T18:01:08Z" + } + ] + } +] \ No newline at end of file diff --git a/src/AuthenticationWrapper.tsx b/src/AuthenticationWrapper.tsx index 10ba373..6152f81 100644 --- a/src/AuthenticationWrapper.tsx +++ b/src/AuthenticationWrapper.tsx @@ -8,6 +8,8 @@ import App from './App'; import {AuthProvider, AuthService, useAuth} from 'react-oauth2-pkce' import jwt_decode from "jwt-decode"; import styled from 'styled-components'; +import { Provider } from 'react-redux'; +import { store } from './state/store.ts'; import Config from './Config'; @@ -178,7 +180,9 @@ function AuthenticationWrapper() { refreshToken = ""; return ( + + ); } diff --git a/src/routes/health-dashboard/index.tsx b/src/routes/health-dashboard/index.tsx index 9aeea25..bbffa30 100644 --- a/src/routes/health-dashboard/index.tsx +++ b/src/routes/health-dashboard/index.tsx @@ -1,53 +1,20 @@ import { AgGridReact } from "ag-grid-react"; // the AG Grid React Component import { CellClickedEvent } from 'ag-grid-community'; +import { getHealthData } from "../../state/slices/healthSlice"; +import { healthDataRequiresFetchOrUpdate } from "../../state/selectors/healthSelectors"; import { DocumentMeta } from "../../components/DocumentMeta/DocumentMeta"; -import { useCallback, useMemo, useState } from "react"; - -interface HealthCheck { - status:string; - date:string -} - -interface Service { - healthChecks:HealthCheck[] - landingPage:string; - service:string; -} +import { useCallback, useEffect, useMemo, useState } from "react"; +import { useAppDispatch, useAppSelector } from "../../state/hooks"; +import { IconWarning, Warning } from "@nasa-jpl/react-stellar"; +import React from "react"; function HealthDashboard() { - const [rowData, setRowData] = useState>([ - { - "service": "airflow", - "landingPage":"unity.jpl.nasa.gov/project/venue/processing/ui", - "healthChecks": [ - { - "status": "HEALTHY", - "date": "2024-04-09T18:01:08Z" - } - ] - }, - { - "service": "jupyter", - "landingPage":"unity.jpl.nasa.gov/project/venue/ads/jupyter", - "healthChecks": [ - { - "status": "HEALTHY", - "date": "2024-04-09T18:01:08Z" - } - ] - }, - { - "service": "other_service", - "landingPage":"unity.jpl.nasa.gov/project/venue/other_service", - "healthChecks": [ - { - "status": "UNHEALTHY", - "date": "2024-04-09T18:01:08Z" - } - ] - } - ]); // Set rowData to Array of Objects, one Object per Row + const dispatch = useAppDispatch(); + + const healthState = useAppSelector((state) => { + return state.health; + }); // Each Column Definition results in one Column. const [columnDefs] = useState([ @@ -94,9 +61,32 @@ function HealthDashboard() { const onGridReady = useCallback( () => { const abortController = new AbortController(); - //fetchData(abortController) #todo implement data fetch + + // Check if data manager status is 'idle', then fetch the investigations data from the API + if (healthDataRequiresFetchOrUpdate(healthState)) { + dispatch(getHealthData()); + } + return () => abortController.abort(); - }, []); + }, [dispatch, healthState]); + + useEffect(() => { + let isMounted = true; + + if (healthState.status === "pending") { + // Do something to inform user that investigation data is being fetched + } else if (healthState.status === "succeeded") { + // Do something to handle the successful fetching of data + } else if (healthState.error != null || healthState.error != undefined) { + // Do something to handle the error + console.log(healthState.error); + } + + // Cleanup function + return () => { + isMounted = false; + }; + }, [healthState, dispatch]); return ( <> @@ -105,7 +95,7 @@ function HealthDashboard() {

Health Dashboard

() +export const useAppSelector: TypedUseSelectorHook = useSelector \ No newline at end of file diff --git a/src/state/selectors/healthSelectors.ts b/src/state/selectors/healthSelectors.ts new file mode 100644 index 0000000..30107a7 --- /dev/null +++ b/src/state/selectors/healthSelectors.ts @@ -0,0 +1,5 @@ +import { HealthState } from "../slices/healthSlice"; + +export const healthDataRequiresFetchOrUpdate = (state:HealthState):boolean => { + return state.status === 'failed' || state.lastUpdated === undefined || state.lastUpdated <= (Date.now() - 60000) +}; \ No newline at end of file diff --git a/src/state/slices/healthSlice.ts b/src/state/slices/healthSlice.ts new file mode 100644 index 0000000..b7c006e --- /dev/null +++ b/src/state/slices/healthSlice.ts @@ -0,0 +1,127 @@ +import axios, { AxiosRequestConfig } from 'axios'; +import { createSlice, createAsyncThunk } from "@reduxjs/toolkit"; + +enum HEALTH_ACTIONS { + GET_HEALTH = "health/getHealth", +} + +type HealthCheckResponse = { + status:string; + date:string; +}; + +type HealthCheck = { + status:string; + date:number; +} + +type ServiceResponse = { + service:string; + landingPage:string; + healthChecks: Array +}; + +export type Service = { + service:string; + landingPage:string; + healthChecks: Array +}; + + +export type HealthState = { + error: string | null | undefined + items: ServiceResponse[] + lastUpdated: number | undefined, + status: 'idle' | 'pending' | 'succeeded' | 'failed' +}; + +const initialState:HealthState = { + error: null, + items: [], + lastUpdated: undefined, + status: 'idle', +}; + +/** + * Get all the instruments from the PDS OpenSearch API + */ +export const getHealthData = createAsyncThunk( + HEALTH_ACTIONS.GET_HEALTH, + async (_:void, thunkAPI) => { + + // todo: fill in URL in the future when an API is available to fetch + // health JSON + const url = "/data/health.json" + + const config:AxiosRequestConfig = { + headers: { + "Content-Type": "application/json" + } + } + + try { + const response = await axios.get(url, config); + return response.data; + } catch (err:any) { + return thunkAPI.rejectWithValue({ error: err.message }); + } + + } +); + +const healthSlice = createSlice({ + name: "health", + initialState, + reducers: {}, + extraReducers: (builder) => { + + builder.addCase(getHealthData.pending, (state, _action) => { + // When data is being fetched + state.status = "pending"; + }); + + builder.addCase(getHealthData.fulfilled, (state, action) => { + // When data is fetched successfully + state.status = "succeeded"; + state.lastUpdated = Date.now(); + + // Parse and store the fetched data into the state + const data = action.payload; + + const compiledServices:Service[] = []; + data.forEach( (item:ServiceResponse) => { + + const healthChecks:Array = []; + item.healthChecks.forEach( (healthCheckItem) => { + healthChecks.push({ + status: healthCheckItem.status, + date: Date.parse(healthCheckItem.date) + }); + }) + + const service:Service = { + service: item.service, + landingPage: item.landingPage, + healthChecks: healthChecks + } + + compiledServices.push(service); + + }); + + state.items = data; + + }); + + builder.addCase(getHealthData.rejected, (state, action) => { + // When data is fetched unsuccessfully + state.status = "failed"; + + // Update the error message for proper error handling + state.error = action.error.message; + }); + + } +}); + +export default healthSlice.reducer; \ No newline at end of file diff --git a/src/state/store.ts b/src/state/store.ts new file mode 100644 index 0000000..93de6aa --- /dev/null +++ b/src/state/store.ts @@ -0,0 +1,14 @@ +import { configureStore } from '@reduxjs/toolkit'; + +import healthSlice from './slices/healthSlice'; + +export const store = configureStore({ + reducer: { + health: healthSlice, + } +}); + +// Infer the `RootState` and `AppDispatch` types from the store itself +export type RootState = ReturnType +// Inferred type: {posts: PostsState, comments: CommentsState, users: UsersState} +export type AppDispatch = typeof store.dispatch \ No newline at end of file From 95769651bf5fc44510ee26a202d3d1ac4c8bf96c Mon Sep 17 00:00:00 2001 From: Anil Natha Date: Thu, 16 May 2024 16:24:55 -0700 Subject: [PATCH 11/17] Modified placeholder health JSON dat so that the landing page information includes the protocol. --- public/data/health.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/public/data/health.json b/public/data/health.json index 07a804b..a126905 100644 --- a/public/data/health.json +++ b/public/data/health.json @@ -1,7 +1,7 @@ [ { "service": "airflow", - "landingPage":"unity.jpl.nasa.gov/project/venue/processing/ui", + "landingPage":"https://unity.jpl.nasa.gov/project/venue/processing/ui", "healthChecks": [ { "status": "HEALTHY", @@ -11,7 +11,7 @@ }, { "service": "jupyter", - "landingPage":"unity.jpl.nasa.gov/project/venue/ads/jupyter", + "landingPage":"https://unity.jpl.nasa.gov/project/venue/ads/jupyter", "healthChecks": [ { "status": "HEALTHY", @@ -21,7 +21,7 @@ }, { "service": "other_service", - "landingPage":"unity.jpl.nasa.gov/project/venue/other_service", + "landingPage":"https://unity.jpl.nasa.gov/project/venue/other_service", "healthChecks": [ { "status": "UNHEALTHY", From 853255a8a0b9387c1454f8e94116c23045c87fd0 Mon Sep 17 00:00:00 2001 From: Anil Natha Date: Thu, 16 May 2024 16:35:47 -0700 Subject: [PATCH 12/17] Updated iconography styling for health dashboard and fixed CSS references by reorganizing CSS assets. --- src/App.tsx | 2 -- src/css/app.css | 14 --------- src/routes/health-dashboard/index.tsx | 21 ++++++++------ src/state/slices/healthSlice.ts | 38 ++----------------------- src/{css => styles}/ag-grid-stellar.css | 0 src/styles/components/_Grid.scss | 5 ++++ src/styles/styles.scss | 7 +++++ src/{css => styles}/unity-stellar.css | 10 +++++++ 8 files changed, 36 insertions(+), 61 deletions(-) delete mode 100644 src/css/app.css rename src/{css => styles}/ag-grid-stellar.css (100%) create mode 100644 src/styles/components/_Grid.scss rename src/{css => styles}/unity-stellar.css (94%) diff --git a/src/App.tsx b/src/App.tsx index 279fa4d..eba9973 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,7 +1,5 @@ import Root from "./Root" -import './css/app.css' - function App() { return ( diff --git a/src/css/app.css b/src/css/app.css deleted file mode 100644 index a0cec27..0000000 --- a/src/css/app.css +++ /dev/null @@ -1,14 +0,0 @@ -/* @import './stellar.css'; */ -@import "@nasa-jpl/react-stellar/dist/esm/stellar.css"; -@import 'ag-grid-community/styles/ag-grid.min.css'; /* Core grid CSS, always needed */ -@import 'ag-grid-community/styles/ag-theme-alpine.min.css'; /* Optional grid theme CSS */ -@import 'ag-grid-stellar.css'; -@import "unity-stellar.css"; - -#root { - display: flex; - flex-flow: column; - width: 100%; - min-height: 100%; - margin: 0 auto; -} \ No newline at end of file diff --git a/src/routes/health-dashboard/index.tsx b/src/routes/health-dashboard/index.tsx index bbffa30..e1f416a 100644 --- a/src/routes/health-dashboard/index.tsx +++ b/src/routes/health-dashboard/index.tsx @@ -20,17 +20,20 @@ function HealthDashboard() { const [columnDefs] = useState([ { field: "service", headerName: "Service", filter: true }, { + cellClass: 'unity-aggrid-health-status', cellRenderer: params => { - - let icon; - if( params.value.toString().toUpperCase() === "UNHEALTHY" ) { - icon = - } - if( params.value.toString().toUpperCase() === "UNAVAILABLE" ) { - icon = - } - return {params.value} {icon} + if( params.value ) { + let icon; + if( params.value.toString().toUpperCase() === "UNHEALTHY" ) { + icon = + } + if( params.value.toString().toUpperCase() === "UNAVAILABLE" ) { + icon = + } + + return {params.value} {icon} + } }, field: "status", diff --git a/src/state/slices/healthSlice.ts b/src/state/slices/healthSlice.ts index b7c006e..9fb9a1f 100644 --- a/src/state/slices/healthSlice.ts +++ b/src/state/slices/healthSlice.ts @@ -5,32 +5,20 @@ enum HEALTH_ACTIONS { GET_HEALTH = "health/getHealth", } -type HealthCheckResponse = { - status:string; - date:string; -}; - type HealthCheck = { status:string; - date:number; + date:string | number; } -type ServiceResponse = { - service:string; - landingPage:string; - healthChecks: Array -}; - export type Service = { service:string; landingPage:string; healthChecks: Array }; - export type HealthState = { error: string | null | undefined - items: ServiceResponse[] + items: Service[] lastUpdated: number | undefined, status: 'idle' | 'pending' | 'succeeded' | 'failed' }; @@ -87,28 +75,6 @@ const healthSlice = createSlice({ // Parse and store the fetched data into the state const data = action.payload; - - const compiledServices:Service[] = []; - data.forEach( (item:ServiceResponse) => { - - const healthChecks:Array = []; - item.healthChecks.forEach( (healthCheckItem) => { - healthChecks.push({ - status: healthCheckItem.status, - date: Date.parse(healthCheckItem.date) - }); - }) - - const service:Service = { - service: item.service, - landingPage: item.landingPage, - healthChecks: healthChecks - } - - compiledServices.push(service); - - }); - state.items = data; }); diff --git a/src/css/ag-grid-stellar.css b/src/styles/ag-grid-stellar.css similarity index 100% rename from src/css/ag-grid-stellar.css rename to src/styles/ag-grid-stellar.css diff --git a/src/styles/components/_Grid.scss b/src/styles/components/_Grid.scss new file mode 100644 index 0000000..d4afed9 --- /dev/null +++ b/src/styles/components/_Grid.scss @@ -0,0 +1,5 @@ +.unity-aggrid-health-status { + display: flex; + justify-content: space-between; + align-items: center; +} \ No newline at end of file diff --git a/src/styles/styles.scss b/src/styles/styles.scss index afc24c3..2722aa2 100644 --- a/src/styles/styles.scss +++ b/src/styles/styles.scss @@ -1,7 +1,14 @@ @charset 'utf-8'; +@import "@nasa-jpl/react-stellar/dist/esm/stellar.css"; +@import 'ag-grid-community/styles/ag-grid.min.css'; /* Core grid CSS, always needed */ +@import 'ag-grid-community/styles/ag-theme-alpine.min.css'; /* Optional grid theme CSS */ +@import 'ag-grid-stellar.css'; +@import "unity-stellar.css"; + // Variables @import "_variables"; // Components +@import "components/_Grid"; @import "components/_Icons"; diff --git a/src/css/unity-stellar.css b/src/styles/unity-stellar.css similarity index 94% rename from src/css/unity-stellar.css rename to src/styles/unity-stellar.css index 9f02c9c..0f9904d 100644 --- a/src/css/unity-stellar.css +++ b/src/styles/unity-stellar.css @@ -1,3 +1,11 @@ +#root { + display: flex; + flex-flow: column; + width: 100%; + min-height: 100%; + margin: 0 auto; +} + :root { /* Navbar */ @@ -40,6 +48,7 @@ line-height: 1em; margin-bottom: 1px; padding: 16px 16px; + text-transform: capitalize; word-wrap: break-word; } @@ -110,6 +119,7 @@ line-height: 1em; padding: 10px 16px; text-decoration: none; + text-transform: capitalize; word-wrap: break-word; } From f8d734316e086a9af9efe7cf425974651b52008b Mon Sep 17 00:00:00 2001 From: Anil Natha Date: Thu, 16 May 2024 16:36:31 -0700 Subject: [PATCH 13/17] Updated Navbar and routing so that routes from placeholder health JSON could be dynamically added to the navbar. --- src/Root.tsx | 103 +++++++++++++++-------- src/components/Navbar/index.tsx | 142 +++++++++++++++++--------------- 2 files changed, 145 insertions(+), 100 deletions(-) diff --git a/src/Root.tsx b/src/Root.tsx index c76c9fa..2b70994 100644 --- a/src/Root.tsx +++ b/src/Root.tsx @@ -1,6 +1,6 @@ import { - Route, - Routes, + Route, + Routes, } from "react-router-dom" import Home from "./routes/home"; @@ -15,39 +15,76 @@ import Config from "./Config"; import { getProcesses, getProcessRoute } from "./utils/processes"; import NotFound from "./routes/errors/not-found"; +import { healthDataRequiresFetchOrUpdate } from "./state/selectors/healthSelectors"; +import { useAppDispatch, useAppSelector } from "./state/hooks"; +import { useEffect } from "react"; +import { getHealthData } from "./state/slices/healthSlice"; function Root() { - - const processes = getProcesses(); - - return ( -
- -
- - } /> - } /> - } /> - } /> - } /> - - { - /* Add routes for job execution forms */ - processes.map( (item) => { - const path = "/jobs/new/" + item['id']; - const route:JSX.Element | null = getProcessRoute(item['id']); - return ( - } key={"route_" + item['id']}/> - ) - }) - } - - } /> - } /> - -
-
- ) + + const dispatch = useAppDispatch(); + const processes = getProcesses(); + + const healthState = useAppSelector((state) => { + return state.health; + }); + + useEffect(() => { + + let isMounted = true; + + // Check if data manager status is 'idle', then fetch the investigations data from the API + if (healthDataRequiresFetchOrUpdate(healthState)) { + dispatch(getHealthData()); + } + + if (healthState.status === "pending") { + // Do something to inform user that investigation data is being fetched + } else if (healthState.status === "succeeded") { + // Do something to handle the successful fetching of data + } else if (healthState.error != null || healthState.error != undefined) { + // Do something to handle the error + console.log(healthState.error); + } + + // Cleanup function + return () => { + isMounted = false; + }; + + }, [healthState, dispatch]); + + return ( +
+ +
+ + { + healthState.items.map( (item, index) => { + return } /> + }) + } + {/*} />*/} + } /> + } /> + } /> + } /> + { + /* Add routes for job execution forms */ + processes.map( (item) => { + const path = "/jobs/new/" + item['id']; + const route:JSX.Element | null = getProcessRoute(item['id']); + return ( + } key={"route_" + item['id']}/> + ) + }) + } + } /> + } /> + +
+
+ ) } export default Root; \ No newline at end of file diff --git a/src/components/Navbar/index.tsx b/src/components/Navbar/index.tsx index 7eddf62..57c059e 100644 --- a/src/components/Navbar/index.tsx +++ b/src/components/Navbar/index.tsx @@ -1,15 +1,64 @@ import { NavLink } from "react-router-dom"; -import { Avatar, Button, IconArrowRight, IconChevronDown, IconHome, IconThreeDot, Menu, MenuItem, MenuLabel, MenuRightSlot, Navbar as StellarNavbar, NavbarBrand, NavbarBreakpoint, NavbarContent, NavbarLink, NavbarMobileMenu } from "@nasa-jpl/react-stellar"; +import { Avatar, Button, IconArrowRight, IconChevronDown, IconHome, IconThreeDot, Menu, MenuItem, MenuLabel, MenuRightSlot, Navbar as StellarNavbar, NavbarBrand, NavbarBreakpoint, NavbarContent, NavbarLink, NavbarMobileMenu, IconExternalLink } from "@nasa-jpl/react-stellar"; +import { getHealthData } from "../../state/slices/healthSlice"; +import { healthDataRequiresFetchOrUpdate } from "../../state/selectors/healthSelectors"; import { logout, getUsername } from "../../AuthenticationWrapper"; +import { useAppDispatch, useAppSelector } from "../../state/hooks"; +import { useEffect, } from "react"; import UnityLogo from "../../assets/unity.svg"; import Config from "../../Config"; export default function Navbar() { + + const dispatch = useAppDispatch(); - const loggedInUsername = getUsername() - const userInitials = loggedInUsername.substring(0,1).toUpperCase(); - const uiVersion = Config['general']['version']; + const loggedInUsername = getUsername() + const userInitials = loggedInUsername.substring(0,1).toUpperCase(); + const uiVersion = Config['general']['version']; + + const healthState = useAppSelector((state) => { + return state.health; + }); + + const formatTitle = (title:string) => { + + let cleanedTitle = title; + const charReplacements = { + "_": " " + } + + for( const [key, value] of Object.entries(charReplacements) ) { + cleanedTitle = cleanedTitle.replace(key,value); + } + + return cleanedTitle; + } + + useEffect(() => { + + let isMounted = true; + + // Check if data manager status is 'idle', then fetch the investigations data from the API + if (healthDataRequiresFetchOrUpdate(healthState)) { + dispatch(getHealthData()); + } + + if (healthState.status === "pending") { + // Do something to inform user that investigation data is being fetched + } else if (healthState.status === "succeeded") { + // Do something to handle the successful fetching of data + } else if (healthState.error != null || healthState.error != undefined) { + // Do something to handle the error + console.log(healthState.error); + } + + // Cleanup function + return () => { + isMounted = false; + }; + + }, [healthState, dispatch]); return ( <> @@ -42,33 +91,25 @@ export default function Navbar() { Home - Development - Jupyter - GitHub - Catalogs - - Application Catalog - - Data Catalog - Processing Job Monitoring Create New Job - Infrastructure Health Dashboard - HySDS - ADES Deployments - GitHub Actions - Administration Documentation (Gitbook) - Kion + { + healthState.items.map( (service, index) => { + return + {formatTitle(service.service)} + + }) + } @@ -121,33 +162,28 @@ export default function Navbar() { Home - Development - Jupyter - GitHub - Catalogs Application Catalog - Data Catalog - Processing Job Monitoring Create New Job - Infrastructure Health Dashboard - HySDS - ADES Deployments - GitHub Actions - Administration Documentation (Gitbook) - Kion + { + healthState.items.map( (service, index) => { + return + {formatTitle(service.service)} + + }) + } @@ -199,45 +235,17 @@ export default function Navbar() { - - - {' '}Home - - Development - - {' '}Jupyter - - - {' '}GitHub - - Catalogs - - {' '}Application Catalog - - - {' '}Data Catalog - - Processing + {' '}Home + {' '}Application Catalog {' '}Job Monitoring {' '}Create New Job - Infrastructure {' '}Health Dashboard - - {' '}HySDS - - - {' '}ADES Deployments - - - {' '}GitHub Actions - - Administration - - {' '}Documentation (Gitbook) - - - {' '}Kion - + {' '}Documentation (Gitbook) + { + healthState.items.map( (service, index) => { + return {formatTitle(service.service)} + }) + } From 64543a0c99b45369fdb8149a13c752bc56f05be2 Mon Sep 17 00:00:00 2001 From: Anil Natha Date: Thu, 16 May 2024 16:36:47 -0700 Subject: [PATCH 14/17] Updated Changelog and version number in package.json. --- CHANGELOG.md | 4 ++++ package.json | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4cb2746..ce3eb46 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,10 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased (0.6.0) +- Added Health Dashboard using static JSON file containing example health information. [#29](https://github.com/unity-sds/unity-ui/issues/29) +- Updated navbar menu so that it is (partially) dynamic. External UI information is loaded via the Health JSON file. [#20](https://github.com/unity-sds/unity-ui/issues/20) + ## [0.5.0] 2024-04-15 - Updated Navbar CSS styling to match Figma designs [#5](https://github.com/unity-sds/unity-ui/issues/5) - Added CI/CD workflow to build application as a docker image. [#21](https://github.com/unity-sds/unity-ui/issues/21) diff --git a/package.json b/package.json index 7662ac7..37d7a65 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "unity-ui", "private": true, - "version": "0.5.0", + "version": "0.6.0", "type": "module", "scripts": { "dev": "vite", From c15abf427f95369d46d2321b7c808237ce5c8bf7 Mon Sep 17 00:00:00 2001 From: Anil Natha Date: Mon, 20 May 2024 08:28:51 -0700 Subject: [PATCH 15/17] Resolved linting errors. --- src/Root.tsx | 2 -- src/components/Navbar/index.tsx | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/Root.tsx b/src/Root.tsx index 2b70994..e06d32f 100644 --- a/src/Root.tsx +++ b/src/Root.tsx @@ -11,8 +11,6 @@ import NewJob from "./routes/jobs/new"; import Navbar from "./components/Navbar" import WebView from "./components/WebView"; -import Config from "./Config"; - import { getProcesses, getProcessRoute } from "./utils/processes"; import NotFound from "./routes/errors/not-found"; import { healthDataRequiresFetchOrUpdate } from "./state/selectors/healthSelectors"; diff --git a/src/components/Navbar/index.tsx b/src/components/Navbar/index.tsx index 57c059e..cc002c9 100644 --- a/src/components/Navbar/index.tsx +++ b/src/components/Navbar/index.tsx @@ -1,5 +1,5 @@ import { NavLink } from "react-router-dom"; -import { Avatar, Button, IconArrowRight, IconChevronDown, IconHome, IconThreeDot, Menu, MenuItem, MenuLabel, MenuRightSlot, Navbar as StellarNavbar, NavbarBrand, NavbarBreakpoint, NavbarContent, NavbarLink, NavbarMobileMenu, IconExternalLink } from "@nasa-jpl/react-stellar"; +import { Avatar, Button, IconArrowRight, IconChevronDown, IconHome, IconThreeDot, Menu, MenuItem, MenuLabel, MenuRightSlot, Navbar as StellarNavbar, NavbarBrand, NavbarBreakpoint, NavbarContent, NavbarMobileMenu } from "@nasa-jpl/react-stellar"; import { getHealthData } from "../../state/slices/healthSlice"; import { healthDataRequiresFetchOrUpdate } from "../../state/selectors/healthSelectors"; import { logout, getUsername } from "../../AuthenticationWrapper"; From e1ee21254f6535f4c86cef4b3c5b8e94af6de44b Mon Sep 17 00:00:00 2001 From: Anil Natha Date: Mon, 20 May 2024 08:36:49 -0700 Subject: [PATCH 16/17] Fixed additional linting errors. --- src/components/Navbar/index.tsx | 2 +- src/routes/health-dashboard/index.tsx | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/components/Navbar/index.tsx b/src/components/Navbar/index.tsx index cc002c9..486e3d9 100644 --- a/src/components/Navbar/index.tsx +++ b/src/components/Navbar/index.tsx @@ -243,7 +243,7 @@ export default function Navbar() { {' '}Documentation (Gitbook) { healthState.items.map( (service, index) => { - return {formatTitle(service.service)} + return {formatTitle(service.service)} }) } diff --git a/src/routes/health-dashboard/index.tsx b/src/routes/health-dashboard/index.tsx index e1f416a..8c93cec 100644 --- a/src/routes/health-dashboard/index.tsx +++ b/src/routes/health-dashboard/index.tsx @@ -1,11 +1,11 @@ import { AgGridReact } from "ag-grid-react"; // the AG Grid React Component -import { CellClickedEvent } from 'ag-grid-community'; +import { CellClickedEvent, ICellRendererParams } from 'ag-grid-community'; import { getHealthData } from "../../state/slices/healthSlice"; import { healthDataRequiresFetchOrUpdate } from "../../state/selectors/healthSelectors"; import { DocumentMeta } from "../../components/DocumentMeta/DocumentMeta"; import { useCallback, useEffect, useMemo, useState } from "react"; import { useAppDispatch, useAppSelector } from "../../state/hooks"; -import { IconWarning, Warning } from "@nasa-jpl/react-stellar"; +import { IconWarning } from "@nasa-jpl/react-stellar"; import React from "react"; function HealthDashboard() { @@ -21,7 +21,7 @@ function HealthDashboard() { { field: "service", headerName: "Service", filter: true }, { cellClass: 'unity-aggrid-health-status', - cellRenderer: params => { + cellRenderer: (params:ICellRendererParams) => { if( params.value ) { let icon; From 67cd0a18b21be738c68fd9e0a26b218f4771e15e Mon Sep 17 00:00:00 2001 From: Anil Natha Date: Mon, 20 May 2024 08:38:55 -0700 Subject: [PATCH 17/17] Fixed additional linting errors to resolve GitHub docker build checks. --- src/Root.tsx | 4 ++-- src/components/Navbar/index.tsx | 4 ++-- src/routes/health-dashboard/index.tsx | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Root.tsx b/src/Root.tsx index e06d32f..ed35660 100644 --- a/src/Root.tsx +++ b/src/Root.tsx @@ -29,7 +29,7 @@ function Root() { useEffect(() => { - let isMounted = true; + //let isMounted = true; // Check if data manager status is 'idle', then fetch the investigations data from the API if (healthDataRequiresFetchOrUpdate(healthState)) { @@ -47,7 +47,7 @@ function Root() { // Cleanup function return () => { - isMounted = false; + //isMounted = false; }; }, [healthState, dispatch]); diff --git a/src/components/Navbar/index.tsx b/src/components/Navbar/index.tsx index 486e3d9..08b7610 100644 --- a/src/components/Navbar/index.tsx +++ b/src/components/Navbar/index.tsx @@ -37,7 +37,7 @@ export default function Navbar() { useEffect(() => { - let isMounted = true; + //let isMounted = true; // Check if data manager status is 'idle', then fetch the investigations data from the API if (healthDataRequiresFetchOrUpdate(healthState)) { @@ -55,7 +55,7 @@ export default function Navbar() { // Cleanup function return () => { - isMounted = false; + //isMounted = false; }; }, [healthState, dispatch]); diff --git a/src/routes/health-dashboard/index.tsx b/src/routes/health-dashboard/index.tsx index 8c93cec..9fc1338 100644 --- a/src/routes/health-dashboard/index.tsx +++ b/src/routes/health-dashboard/index.tsx @@ -74,7 +74,7 @@ function HealthDashboard() { }, [dispatch, healthState]); useEffect(() => { - let isMounted = true; + //let isMounted = true; if (healthState.status === "pending") { // Do something to inform user that investigation data is being fetched @@ -87,7 +87,7 @@ function HealthDashboard() { // Cleanup function return () => { - isMounted = false; + //isMounted = false; }; }, [healthState, dispatch]);