From e4f9feb61e79b616e8ee69621f533699bdc00434 Mon Sep 17 00:00:00 2001 From: Armin Hasanpour Date: Thu, 30 Jul 2026 17:28:32 -0700 Subject: [PATCH 01/16] AB#33825 - Updated FontAwesome --- .../Pages/Applicants/Details.cshtml | 2 +- .../Pages/GrantApplications/Details.cshtml | 4 +- .../Components/ActionBar/Default.cshtml | 2 +- .../src/Unity.GrantManager.Web/package.json | 4 +- .../src/Unity.GrantManager.Web/yarn.lock | 332 ++++++++---------- 5 files changed, 161 insertions(+), 183 deletions(-) diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/Applicants/Details.cshtml b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/Applicants/Details.cshtml index 51a67ef65..c7c3b6f58 100644 --- a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/Applicants/Details.cshtml +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/Applicants/Details.cshtml @@ -87,7 +87,7 @@ else
- Loading... + Loading...
diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/GrantApplications/Details.cshtml b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/GrantApplications/Details.cshtml index cceadeda4..41a98f4e4 100644 --- a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/GrantApplications/Details.cshtml +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/GrantApplications/Details.cshtml @@ -105,7 +105,7 @@
- Loading... + Loading...
@@ -129,7 +129,7 @@
- Loading... + Loading...
diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Views/Shared/Components/ActionBar/Default.cshtml b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Views/Shared/Components/ActionBar/Default.cshtml index 274ae5d1a..2df3b4371 100644 --- a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Views/Shared/Components/ActionBar/Default.cshtml +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Views/Shared/Components/ActionBar/Default.cshtml @@ -134,7 +134,7 @@
- Loading... + Loading...
diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/package.json b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/package.json index 67af0468e..d7020994f 100644 --- a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/package.json +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/package.json @@ -3,8 +3,8 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "~9.1.3", - "@abp/font-awesome": "~9.1.3", + "@abp/aspnetcore.mvc.ui.theme.basic": "~10.5.0", + "@abp/font-awesome": "~10.5.0", "bootstrap-4": "npm:bootstrap@~4.6.2", "bootstrap-select": "~1.13.18", "datatables.net-bs5": "~2.3.8", diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/yarn.lock b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/yarn.lock index 1876c79a3..1c11fdd55 100644 --- a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/yarn.lock +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/yarn.lock @@ -2,194 +2,186 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@~9.1.3": - version "9.1.3" - resolved "https://registry.npmjs.org/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-9.1.3.tgz" - integrity sha512-TFU0ZvreL0fbSRTlXb4RWywItKDKB3fgpz/BX9O04UDeHbh/32xL9rM7vB3cXdrt+M60GtbUKiFCvGH+eR8B+A== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~9.1.3" - -"@abp/aspnetcore.mvc.ui.theme.shared@~9.1.3": - version "9.1.3" - resolved "https://registry.npmjs.org/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-9.1.3.tgz" - integrity sha512-lZ177eyHrwSBtsFbkbODrmEvXHdiSueh62jyoU7YKbskPHzOA/6ZOjkzMRDicf5UFUuJOYZi0i7p/2Jib9sWmA== - dependencies: - "@abp/aspnetcore.mvc.ui" "~9.1.3" - "@abp/bootstrap" "~9.1.3" - "@abp/bootstrap-datepicker" "~9.1.3" - "@abp/bootstrap-daterangepicker" "~9.1.3" - "@abp/datatables.net-bs5" "~9.1.3" - "@abp/font-awesome" "~9.1.3" - "@abp/jquery-form" "~9.1.3" - "@abp/jquery-validation-unobtrusive" "~9.1.3" - "@abp/lodash" "~9.1.3" - "@abp/luxon" "~9.1.3" - "@abp/malihu-custom-scrollbar-plugin" "~9.1.3" - "@abp/moment" "~9.1.3" - "@abp/select2" "~9.1.3" - "@abp/sweetalert2" "~9.1.3" - "@abp/timeago" "~9.1.3" - "@abp/toastr" "~9.1.3" - -"@abp/aspnetcore.mvc.ui@~9.1.3": - version "9.1.3" - resolved "https://registry.npmjs.org/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-9.1.3.tgz" - integrity sha512-ZZsvjCHjOkFAp+k1iXd35YIGGsHEIOEcRGm+3dSyQVeg8gkdAYEJ60Vj/ca5cCEFFe2v/D6xBt++vmzq2N4AvQ== +"@abp/aspnetcore.mvc.ui.theme.basic@~10.5.0": + version "10.5.0" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-10.5.0.tgz#ea188c534693e8ab02f6892e7346c6b2a19591c1" + integrity sha512-dFudLJ5Q+vieAuS71KD26rxfhm1qvx3g53UcZv/jCNFsaqIoF8dgHIQTdpJx4qtkXEinfvWCXO5quNff/mTXvA== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~10.5.0" + +"@abp/aspnetcore.mvc.ui.theme.shared@~10.5.0": + version "10.5.0" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-10.5.0.tgz#59c9d3cc5566de18a2c71734ef8e36b6461b20de" + integrity sha512-a88SfpHDx2An6EGbCrIgDzZmuqfpkwc+lqBtllmQybhWrNjCnPSQzYJuwgQU5R6X+6HotVEpluK8Rv6FnQPS/w== + dependencies: + "@abp/aspnetcore.mvc.ui" "~10.5.0" + "@abp/bootstrap" "~10.5.0" + "@abp/bootstrap-datepicker" "~10.5.0" + "@abp/bootstrap-daterangepicker" "~10.5.0" + "@abp/datatables.net-bs5" "~10.5.0" + "@abp/font-awesome" "~10.5.0" + "@abp/jquery-validation-unobtrusive" "~10.5.0" + "@abp/lodash" "~10.5.0" + "@abp/luxon" "~10.5.0" + "@abp/malihu-custom-scrollbar-plugin" "~10.5.0" + "@abp/moment" "~10.5.0" + "@abp/select2" "~10.5.0" + "@abp/sweetalert2" "~10.5.0" + "@abp/timeago" "~10.5.0" + +"@abp/aspnetcore.mvc.ui@~10.5.0": + version "10.5.0" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-10.5.0.tgz#e6bf4e3f55c8f23095e6ae63d4f1b3aa5470ab2d" + integrity sha512-3fEzOCy5f/AMr8WypZqrfLaZPkZux4mMPtLhW8+LguC95UV14puqBE3nmxliN64GVFmYpSy6nWEfsT4AxB+nBA== dependencies: ansi-colors "^4.1.3" -"@abp/bootstrap-datepicker@~9.1.3": - version "9.1.3" - resolved "https://registry.npmjs.org/@abp/bootstrap-datepicker/-/bootstrap-datepicker-9.1.3.tgz" - integrity sha512-s80oSiX4hPyby9TQsKYBz1RBEjvDbiZ6FYqrQDdJFuig44XU9Xs3QBvolGPY5doQp7Dck0a40KpuahIZC/1Ziw== +"@abp/bootstrap-datepicker@~10.5.0": + version "10.5.0" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-10.5.0.tgz#4cad320259ef055d9702ffc1c3f972d9e0fe643c" + integrity sha512-Ic9icfBIzBTHa5i15hLHTyKB13OgSbg1iTeUDG10ciKrxRaXKtTXgFCngnL/7bEBYAd/PdeYGTCg4RUhqnWvtA== dependencies: - bootstrap-datepicker "^1.10.0" + bootstrap-datepicker "^1.10.1" -"@abp/bootstrap-daterangepicker@~9.1.3": - version "9.1.3" - resolved "https://registry.npmjs.org/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-9.1.3.tgz" - integrity sha512-2FXPhhorKytyhy/wrlmK5jarxrBCGNtmKuxlHUtymJtwAKyP8yKZePrGR7ZaQB0Bn6m5oZ6KrMQlf05OJPbu4Q== +"@abp/bootstrap-daterangepicker@~10.5.0": + version "10.5.0" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-10.5.0.tgz#d1000a900fedd30602979f84fe97184ebf4316f9" + integrity sha512-zfFVeSCBZoSoatTrtjDVDKZ8TX8xzyzoPaGe+vskZH5uL8CgYJnmTy7RsRlGR79PFz7VKQ/zoyNXrufZKcho+w== dependencies: + "@abp/moment" "~10.5.0" bootstrap-daterangepicker "^3.1.0" -"@abp/bootstrap@~9.1.3": - version "9.1.3" - resolved "https://registry.npmjs.org/@abp/bootstrap/-/bootstrap-9.1.3.tgz" - integrity sha512-GVzedL6Rqza4+3LqE4HejpwdEzC4ZbmFBzVmIy0lJBHBayA8fdVBpO310M7R/JMxPNy6tFOfjufIF8M7s/r19A== +"@abp/bootstrap@~10.5.0": + version "10.5.0" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-10.5.0.tgz#a224a69d06a68e7f40c7d69be48b2a0b1c721e90" + integrity sha512-J2u16oMmi2XHfM0kP/joe+GHimyKlSGJ7cJcknNUOndEpxAX8f6WptIKmqNZv46x/3CzXsknM2AOAqGmX/gWzA== dependencies: - "@abp/core" "~9.1.3" - bootstrap "^5.3.3" + "@abp/core" "~10.5.0" + "@abp/popper.js" "~10.5.0" + bootstrap "^5.3.8" -"@abp/core@~9.1.3": - version "9.1.3" - resolved "https://registry.npmjs.org/@abp/core/-/core-9.1.3.tgz" - integrity sha512-dtMWaqqEErfBQShyxstSb4WEgKUhuhnihOEZP1PmNQVkew0ctYZ5iOI0+zbRPKRrIqdMxmczZoZinz3XcxT0oA== +"@abp/core@~10.5.0": + version "10.5.0" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-10.5.0.tgz#58364410c1df45ea5bb82c08e03141d8294e61e7" + integrity sha512-RNflX2ENTMunO3MZlMx2EZu7sqHUray2lAfkUotjNLIbz0h3btb4zoMU3W5Vy/WPhWRT7Ry7FtnUCdOK+9tNkg== dependencies: - "@abp/utils" "~9.1.3" + "@abp/utils" "~10.5.0" -"@abp/datatables.net-bs5@~9.1.3": - version "9.1.3" - resolved "https://registry.npmjs.org/@abp/datatables.net-bs5/-/datatables.net-bs5-9.1.3.tgz" - integrity sha512-FIIRxKVeCw+WmlageyeF/12OdrdkPDJTK84a+9t9s8GiFHvNa1IR6qTYi6IzNWYzh8kGzOCAj7Gc0AAZP9utRA== +"@abp/datatables.net-bs5@~10.5.0": + version "10.5.0" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-10.5.0.tgz#21b0e2ae9c78473980dedf89a07fdcb72f31bee2" + integrity sha512-j2e48mBy+oZ2y+t8aLQ4iyx0XbN5QcGjTM+CBR9KnttY/w+KD2SRngdZbOdhdDI5W3IAdH5WTwmw2EyZXmf63w== dependencies: - "@abp/datatables.net" "~9.1.3" - datatables.net-bs5 "^2.1.8" + "@abp/datatables.net" "~10.5.0" + datatables.net-bs5 "^2.3.4" -"@abp/datatables.net@~9.1.3": - version "9.1.3" - resolved "https://registry.npmjs.org/@abp/datatables.net/-/datatables.net-9.1.3.tgz" - integrity sha512-nhtEuzDkZOy69wcUS1eerFYPK58q6e7HuYhreWZzsGcPucUONK1OWrryRb0KbvogOyw9oKR/DdwoMpdChWMmmQ== +"@abp/datatables.net@~10.5.0": + version "10.5.0" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-10.5.0.tgz#d569ae83696bc25a0802ce4b90105ecebbb602eb" + integrity sha512-pqyOUjEtO3glFnBXd8O4uHRrQ7uwmk91ypOyFVCEX7L6Ksg3nRonoaBqPINUxFGOBs97h2nhICYZT9Lblp+4Sg== dependencies: - "@abp/jquery" "~9.1.3" - datatables.net "^2.1.8" + "@abp/jquery" "~10.5.0" + datatables.net "^2.3.4" -"@abp/font-awesome@~9.1.3": - version "9.1.3" - resolved "https://registry.npmjs.org/@abp/font-awesome/-/font-awesome-9.1.3.tgz" - integrity sha512-VvVEVskbVFnkXDDKHjDgGtFoNTvicGDmnSvLtCjp+NO4+W8PrXDxxgFQ7vBo3zygE6kHPnF0H2IUZXOZwwPEMQ== +"@abp/font-awesome@~10.5.0": + version "10.5.0" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-10.5.0.tgz#44347dae9d00fc20cde8fcd2cfb8cb1f58055ae2" + integrity sha512-on3fNBdAzTvVsjDtF3NgLIEm/FBPwdDnAwhFmkqioLmpF6iPnZeW4bAFlC3dsoEGrWiCvqERir6/ckmpYLA5zg== dependencies: - "@abp/core" "~9.1.3" - "@fortawesome/fontawesome-free" "^6.6.0" + "@abp/core" "~10.5.0" + "@fortawesome/fontawesome-free" "^7.0.1" -"@abp/jquery-form@~9.1.3": - version "9.1.3" - resolved "https://registry.npmjs.org/@abp/jquery-form/-/jquery-form-9.1.3.tgz" - integrity sha512-jkDjIssza7SuygXtPcGU+zP0+U48G3n/r6oWH+BYY/Edp/5xNVfMkCSi0ZvgSq4cuDNtXF2stPthSgTKrl6jyA== +"@abp/jquery-validation-unobtrusive@~10.5.0": + version "10.5.0" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-10.5.0.tgz#426e89a28c353f10ea26cd850818b2daa3519c81" + integrity sha512-XF3GO/lHCOqh3wYwyItNccVE1Jw8tGKgNu0fga+QwJr6O1xI8YnbD00tvrMkSnRM3UsxL5Ty6E2AkYn1g+At5A== dependencies: - "@abp/jquery" "~9.1.3" - jquery-form "^4.3.0" - -"@abp/jquery-validation-unobtrusive@~9.1.3": - version "9.1.3" - resolved "https://registry.npmjs.org/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-9.1.3.tgz" - integrity sha512-sOwslfUUQBQRcHwqzzKZvljk/D/IcUDEoanWebC125uaN/f+1UlfvMZ5zYr954cdQvAuGexdgvu+8Im+8CM7Gg== - dependencies: - "@abp/jquery-validation" "~9.1.3" + "@abp/jquery-validation" "~10.5.0" jquery-validation-unobtrusive "^4.0.0" -"@abp/jquery-validation@~9.1.3": - version "9.1.3" - resolved "https://registry.npmjs.org/@abp/jquery-validation/-/jquery-validation-9.1.3.tgz" - integrity sha512-Dz4cZUH6ZmcEqDEZDjw/q//pkSzayBl2Y/D+EGFNfVJXlckS20EUFDIcLiPWfeM0J8sB6Gfzj1fh1ot9irSQCQ== +"@abp/jquery-validation@~10.5.0": + version "10.5.0" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-10.5.0.tgz#19c7b057cd3f08a9e85b180843dddf8a19a2b9d8" + integrity sha512-PcLB4muI6XJkzWCVR+0T5DP44qcggeI3OF/soJBba5rrYQ5Bd7WqcNJdIg9SQK3OEzpcgwDCns5Nxt4j88fH2Q== dependencies: - "@abp/jquery" "~9.1.3" + "@abp/jquery" "~10.5.0" jquery-validation "^1.21.0" -"@abp/jquery@~9.1.3": - version "9.1.3" - resolved "https://registry.npmjs.org/@abp/jquery/-/jquery-9.1.3.tgz" - integrity sha512-K6R2jx0V8no9qSqBrfqNdcF42aXMe1P+rar3CiFJ/SG0V5L/wk85yjt5on5M1TYjO1F3l1G+0wN5cw5gvw/Qrg== +"@abp/jquery@~10.5.0": + version "10.5.0" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-10.5.0.tgz#4fce1128f95351678c47cf3de2d6b407260d73d0" + integrity sha512-uT79LFWW9jgyII0QxYZkZj2h6plkrwJFNocsGcafoY6hZ0bOUyxpXa8YGwEe0A+j1d5iBl08SH3k2HWu4TpJ6w== dependencies: - "@abp/core" "~9.1.3" + "@abp/core" "~10.5.0" jquery "~3.7.1" -"@abp/lodash@~9.1.3": - version "9.1.3" - resolved "https://registry.npmjs.org/@abp/lodash/-/lodash-9.1.3.tgz" - integrity sha512-6CH+5+SsP1rxZAT71C2BSS5HV+orPrjkQpcOI0MWVQI67OfozhnJ/0Pq/6LVs5Jxzum7x6IWZbjipQrg3xiJOw== +"@abp/lodash@~10.5.0": + version "10.5.0" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-10.5.0.tgz#852d6cb369ff478d35345e7c17e222587a6b11d0" + integrity sha512-Z2GwsL4aLA9wxgP1j8youSlq7glEpe7Mu3XFT/e+w2qyKxyEZtzSzhPF/2RMaAPw8fuFBdu7r1Dhz1Va1RVheg== dependencies: - "@abp/core" "~9.1.3" - lodash "^4.17.21" + "@abp/core" "~10.5.0" + lodash "^4.18.1" -"@abp/luxon@~9.1.3": - version "9.1.3" - resolved "https://registry.npmjs.org/@abp/luxon/-/luxon-9.1.3.tgz" - integrity sha512-J5SxZ0eQTwCg1a55L/RHBBlPHEpN9TNT90J+My9vpmYOFr046/44ZuncBJNblpZ/MWrfBO/t7CCHiDjYqL5qzQ== +"@abp/luxon@~10.5.0": + version "10.5.0" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-10.5.0.tgz#1843a4061a791e23837a89e98624b20dad9e3b70" + integrity sha512-CDmtfGRLREQIQ6roJjw/WuBlkvSdaPtp6qHNEFIp0vCrppQZLeMqwxmVVMaaEPtimsAmQ8vpeLouWNrJsCuCzQ== dependencies: - "@abp/core" "~9.1.3" - luxon "^3.5.0" + "@abp/core" "~10.5.0" + luxon "^3.7.2" -"@abp/malihu-custom-scrollbar-plugin@~9.1.3": - version "9.1.3" - resolved "https://registry.npmjs.org/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-9.1.3.tgz" - integrity sha512-T2DFZGg3J/en7RT5r6ywBjEWVCPwxlRowIhtv7hP0r4WNkhAkyimfJnPld7tMLI+xYBoliZoFOWDnGITkz2A0g== +"@abp/malihu-custom-scrollbar-plugin@~10.5.0": + version "10.5.0" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-10.5.0.tgz#ec48d62548eaa92d5340c2cfab9a85e1160530c1" + integrity sha512-hWV8AktNDhnfwqrgYn+RSDqymgsSrcXWPdtfVns6KRk2niIVVNYzu28/CzTu7+BxSBkecAD0s9LhC4LeqYoV2w== dependencies: - "@abp/core" "~9.1.3" + "@abp/core" "~10.5.0" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/moment@~9.1.3": - version "9.1.3" - resolved "https://registry.npmjs.org/@abp/moment/-/moment-9.1.3.tgz" - integrity sha512-uoejS1gJWfr7qgNiB7+o+xYDmxIlj7q0nSAbxv//CHwo1UJjgFkc7bRI3zB5qtCBhCxBxFPdkoYFI7fFnMseFw== +"@abp/moment@~10.5.0": + version "10.5.0" + resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-10.5.0.tgz#2ccd8c1fe4ef1ff084c86e984d5932a9cf4a94fe" + integrity sha512-DTEA4pR3p5NivmqaEPgnjv3ogM23DyvgvNBe/79Xogem3ERML6KBph9vKYeB2MPOI5pSLNVAsMNhG9m6Ial8TA== dependencies: moment "^2.30.1" -"@abp/select2@~9.1.3": - version "9.1.3" - resolved "https://registry.npmjs.org/@abp/select2/-/select2-9.1.3.tgz" - integrity sha512-vZStRwNzUSCDBpTGuoMe9lGCqqHLqHGkKht5zEGQlOGZs0gHQztQbi/dDsK1JOV/I9jS900IlYhjEf36xcLkDg== +"@abp/popper.js@~10.5.0": + version "10.5.0" + resolved "https://registry.yarnpkg.com/@abp/popper.js/-/popper.js-10.5.0.tgz#316bd9a5b1179babc7603662068bff08d510f832" + integrity sha512-+TwEmXxQF/sf2Pj2UVyRPyrMUmKc0HCSDzsLO89jSj4Ln+7gXgRzYo49Fuu816kJL6j/i+sXcq7BZOAEDc4X6w== dependencies: - "@abp/core" "~9.1.3" - select2 "^4.0.13" + "@abp/core" "~10.5.0" + "@popperjs/core" "^2.11.8" -"@abp/sweetalert2@~9.1.3": - version "9.1.3" - resolved "https://registry.npmjs.org/@abp/sweetalert2/-/sweetalert2-9.1.3.tgz" - integrity sha512-awQk3/Hkrt3ZyneZ4J6H9TMCOgSSjnNCHdT6flCPr78oq88/k1jYTBwAJ2boBRFXZov34c8HzJgUHcEixEpTuQ== +"@abp/select2@~10.5.0": + version "10.5.0" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-10.5.0.tgz#78abd9211863a214fe15b3fb76bfea8333cab02d" + integrity sha512-bqX6lUYRewSfsABhlkbf7A02ulz4oeit4ap+OCdgFa9yE75hHOzYBVHppQgCAHIdVcxw+XxOkejL6VEgM0EVRg== dependencies: - "@abp/core" "~9.1.3" - sweetalert2 "^11.14.1" + "@abp/core" "~10.5.0" + select2 "^4.0.13" -"@abp/timeago@~9.1.3": - version "9.1.3" - resolved "https://registry.npmjs.org/@abp/timeago/-/timeago-9.1.3.tgz" - integrity sha512-+chWSDqQL2Kt5wcIeQCf/vKRL5jpcej/Zv5lfDUJAI1dKJyLzPdzYj/m7yA9x5Osl3Cf8jG8dXDCZ2oM6pG96Q== +"@abp/sweetalert2@~10.5.0": + version "10.5.0" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-10.5.0.tgz#e5a2dc2d2223ca842c3e7f9c5fb5b3c4d61229f2" + integrity sha512-5sjDIXsQ3d27qO8eRPpkrFXqnBeWuswlBGUhNS5SnRA0K5Q6IzVUVTYSbo7+ulQ3nWuZbv5DWSB4xujjzShwXg== dependencies: - "@abp/jquery" "~9.1.3" - timeago "^1.6.7" + "@abp/core" "~10.5.0" + sweetalert2 "^11.23.0" -"@abp/toastr@~9.1.3": - version "9.1.3" - resolved "https://registry.npmjs.org/@abp/toastr/-/toastr-9.1.3.tgz" - integrity sha512-WucCvTnSV0shflVmNuHroWkWCqWJYQRnuC28hwi902udca4OnRrEQVoG2joub+/XIsaxCo1BVaR42tzdnn5Jmw== +"@abp/timeago@~10.5.0": + version "10.5.0" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-10.5.0.tgz#11e646bd69a1a6093b58a3100ea7ef8639339fb9" + integrity sha512-9qEKBdW6HhpOjDaexLdPSuJ/lag/jE01yuRJo8Qj62tjnEqzMQ8QaFdqR5YN0NiADyY7phvnHCmimPKUM5hmJw== dependencies: - "@abp/jquery" "~9.1.3" - toastr "^2.1.4" + "@abp/jquery" "~10.5.0" + timeago "^1.6.7" -"@abp/utils@~9.1.3": - version "9.1.3" - resolved "https://registry.npmjs.org/@abp/utils/-/utils-9.1.3.tgz" - integrity sha512-g0QN3pwGgSPb0orAMtQ1YcFUtqKCazizWeW5OBwWrdR/GcxD1tM2foA3jV7yOtupvVwA0XPe3TC77HS/QIZSsg== +"@abp/utils@~10.5.0": + version "10.5.0" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-10.5.0.tgz#d0c5cb23b2ad9c74fb5e0b9ecfa4fe96bbd3240a" + integrity sha512-00mcBklr6+/4HzmR1BjWSupUPjsjrzcPXsuWyJH9ylyLfaIEh13uzHqwpw3goCNsAf1NU9MaOdqlIbGAaNB9cA== dependencies: just-compare "^2.3.0" @@ -277,10 +269,10 @@ resolved "https://registry.npmjs.org/@formio/vanilla-text-mask/-/vanilla-text-mask-5.1.1-formio.1.tgz" integrity sha512-rYBlvIPMNUd6sAaduOaiIwI4vfTAjHDRonko2qJn2RP1O//TQ7rcFIPYVYePJZ4OtOpwHiHAvAIh79McphZotQ== -"@fortawesome/fontawesome-free@^6.6.0": - version "6.7.2" - resolved "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-6.7.2.tgz" - integrity sha512-JUOtgFW6k9u4Y+xeIaEiLr3+cjoUPiAuLXoyKOJSia6Duzb7pq+A76P9ZdPDoAoxHdHzq6gE9/jKBGXlZT8FbA== +"@fortawesome/fontawesome-free@^7.0.1": + version "7.3.1" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free/-/fontawesome-free-7.3.1.tgz#9d7d7df8f850637e001d24e6cd901422b4b09099" + integrity sha512-wmglKKPDIkgV3aWlZzWECCPoGIkYCulzBwxG9+w7rc5BGapZ6cPMpoPOT8k36J0Ni7PPX6c/rsoMWfS4d1MUMg== "@humanfs/core@^0.19.2": version "0.19.2" @@ -313,9 +305,9 @@ resolved "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz" integrity sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ== -"@popperjs/core@^2.9.0": +"@popperjs/core@^2.11.8", "@popperjs/core@^2.9.0": version "2.11.8" - resolved "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz" + resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.8.tgz#6b79032e760a0899cd4204710beede972a3a185f" integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A== "@sphinxxxx/color-conversion@^2.2.2": @@ -415,9 +407,9 @@ balanced-match@^4.0.2: resolved "https://registry.npmjs.org/bootstrap/-/bootstrap-4.6.2.tgz" integrity sha512-51Bbp/Uxr9aTuy6ca/8FbFloBUJZLHwnhTcnjIeRn2suQWsWzcuJhGjKDB5eppVte/8oCdOL3VuwxvZDUggwGQ== -bootstrap-datepicker@^1.10.0: +bootstrap-datepicker@^1.10.1: version "1.10.1" - resolved "https://registry.npmjs.org/bootstrap-datepicker/-/bootstrap-datepicker-1.10.1.tgz" + resolved "https://registry.yarnpkg.com/bootstrap-datepicker/-/bootstrap-datepicker-1.10.1.tgz#0a8bec42957ea1ce1272b91bcf2b53696629fb86" integrity sha512-GIe+fsLp9Hi30oW7L2v2Q9/a4+aojrIA2p4ZagtLuKw2lpfQgjJjM0L6vl/lYQydGXWUbpoKbEC/O5tzWIkEKQ== dependencies: jquery ">=3.4.0 <4.0.0" @@ -435,9 +427,9 @@ bootstrap-select@~1.13.18: resolved "https://registry.npmjs.org/bootstrap-select/-/bootstrap-select-1.13.18.tgz" integrity sha512-V1IzK4rxBq5FrJtkzSH6RmFLFBsjx50byFbfAf8jYyXROWs7ZpprGjdHeoyq2HSsHyjJhMMwjsQhRoYAfxCGow== -bootstrap@^5.1.3, bootstrap@^5.3.3: +bootstrap@^5.1.3, bootstrap@^5.3.8: version "5.3.8" - resolved "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.8.tgz" + resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-5.3.8.tgz#6401a10057a22752d21f4e19055508980656aeed" integrity sha512-HP1SZDqaLDPwsNiqRqi5NcP0SSXciX2s9E+RyqJIIqGo+vJeN5AJVM98CXmW/Wux0nQ5L7jeWUdplCEf0Ee+tg== brace-expansion@^5.0.5: @@ -515,9 +507,9 @@ custom-event@^1.0.0: resolved "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz" integrity sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg== -datatables.net-bs5@^2, datatables.net-bs5@^2.1.8, datatables.net-bs5@~2.3.8: +datatables.net-bs5@^2, datatables.net-bs5@^2.3.4, datatables.net-bs5@~2.3.8: version "2.3.8" - resolved "https://registry.npmjs.org/datatables.net-bs5/-/datatables.net-bs5-2.3.8.tgz" + resolved "https://registry.yarnpkg.com/datatables.net-bs5/-/datatables.net-bs5-2.3.8.tgz#7266636ff488429988ca664bc8cb0b7c5e48c563" integrity sha512-TbFH99QSWm93Kn3teHLFKeyOqYbaiddlHvRFdXUwAvh/fjTMhACWmHG+I43ss8d23OEFHV0WIbN4lpPusZm5zw== dependencies: datatables.net "2.3.8" @@ -616,7 +608,7 @@ datatables.net-staterestore@1.4.3, datatables.net-staterestore@~1.4.2: datatables.net "1.11 - 2" jquery ">=1.7" -"datatables.net@1.11 - 2", datatables.net@2.3.8, datatables.net@^2, datatables.net@^2.1.8: +"datatables.net@1.11 - 2", datatables.net@2.3.8, datatables.net@^2, datatables.net@^2.3.4: version "2.3.8" resolved "https://registry.npmjs.org/datatables.net/-/datatables.net-2.3.8.tgz" integrity sha512-uhViowhlDlheAuo5a8TrkQqADsjrtGeOyvrigvr4t0+K3MyAWqClORXWAYIcN9VLX6iIX0C8O9gwJNd01hITRg== @@ -1012,13 +1004,6 @@ ismobilejs@^1.1.1: resolved "https://registry.npmjs.org/ismobilejs/-/ismobilejs-1.1.1.tgz" integrity sha512-VaFW53yt8QO61k2WJui0dHf4SlL8lxBofUuUmwBo0ljPk0Drz2TiuDW4jo3wDcv41qy/SxrJ+VAzJ/qYqsmzRw== -jquery-form@^4.3.0: - version "4.3.0" - resolved "https://registry.npmjs.org/jquery-form/-/jquery-form-4.3.0.tgz" - integrity sha512-q3uaVCEWdLOYUCI6dpNdwf/7cJFOsUgdpq6r0taxtGQ5NJSkOzofyWm4jpOuJ5YxdmL1FI5QR+q+HB63HHLGnQ== - dependencies: - jquery ">=1.7.2" - jquery-maskmoney@~3.0.2: version "3.0.2" resolved "https://registry.npmjs.org/jquery-maskmoney/-/jquery-maskmoney-3.0.2.tgz" @@ -1046,7 +1031,7 @@ jquery-validation@>=1.19, jquery-validation@^1.21.0: resolved "https://registry.npmjs.org/jquery-validation/-/jquery-validation-1.22.1.tgz" integrity sha512-ePLXLWK7Rh5eR652YsuIu7YPeGlCXrsJUteVw5iZopiU17yaMd3FaDggs6yyNMl56p8TYVeDRmKGK3fPZrMeQw== -jquery@>=1.10, jquery@>=1.12.0, jquery@>=1.2.6, "jquery@>=1.5.0 <4.0", jquery@>=1.6, jquery@>=1.7, jquery@>=1.7.2, "jquery@>=3.4.0 <4.0.0", jquery@^3.6.0, jquery@~3.7.1: +jquery@>=1.10, jquery@>=1.2.6, "jquery@>=1.5.0 <4.0", jquery@>=1.6, jquery@>=1.7, "jquery@>=3.4.0 <4.0.0", jquery@^3.6.0, jquery@~3.7.1: version "3.7.1" resolved "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz" integrity sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg== @@ -1140,14 +1125,14 @@ lodash.isequal@^4.5.0: resolved "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz" integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ== -lodash@^4.17.21: +lodash@^4.17.21, lodash@^4.18.1: version "4.18.1" - resolved "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.18.1.tgz#ff2b66c1f6326d59513de2407bf881439812771c" integrity sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q== -luxon@^3.5.0: +luxon@^3.7.2: version "3.7.2" - resolved "https://registry.npmjs.org/luxon/-/luxon-3.7.2.tgz" + resolved "https://registry.yarnpkg.com/luxon/-/luxon-3.7.2.tgz#d697e48f478553cca187a0f8436aff468e3ba0ba" integrity sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew== malihu-custom-scrollbar-plugin@^3.1.5: @@ -1389,9 +1374,9 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -sweetalert2@^11.14.1: +sweetalert2@^11.23.0: version "11.26.25" - resolved "https://registry.npmjs.org/sweetalert2/-/sweetalert2-11.26.25.tgz" + resolved "https://registry.yarnpkg.com/sweetalert2/-/sweetalert2-11.26.25.tgz#ba24ffb79c67648ac51f834620baa15866a56e35" integrity sha512-+hunCOJdJ6FLj04T9YSLvvZXRjsvIkTeTKP2e4VF8CaBias961BTnWiSFAy7F/CM5eq3QK2Rraoc5Gzftslvkg== ticky@1.0.1: @@ -1418,13 +1403,6 @@ tippy.js@^6.3.7: dependencies: "@popperjs/core" "^2.9.0" -toastr@^2.1.4: - version "2.1.4" - resolved "https://registry.npmjs.org/toastr/-/toastr-2.1.4.tgz" - integrity sha512-LIy77F5n+sz4tefMmFOntcJ6HL0Fv3k1TDnNmFZ0bU/GcvIIfy6eG2v7zQmMiYgaalAiUv75ttFrPn5s0gyqlA== - dependencies: - jquery ">=1.12.0" - tr46@~0.0.3: version "0.0.3" resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" From b1e9ccbad8c4fd36af769c2a8bb1c226c9cdd8cf Mon Sep 17 00:00:00 2001 From: Armin Hasanpour Date: Fri, 31 Jul 2026 09:26:49 -0700 Subject: [PATCH 02/16] AB#33787 - Replaced ABP Toastr with ABP Notify --- .../Pages/PaymentConfigurations/Index.js | 14 ++++---- .../Pages/ApplicationForms/Mapping.js | 1 - .../Shared/Components/EmailsWidget/Default.js | 34 +++---------------- .../PaymentConfiguration/Default.js | 1 - 4 files changed, 11 insertions(+), 39 deletions(-) diff --git a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Web/Pages/PaymentConfigurations/Index.js b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Web/Pages/PaymentConfigurations/Index.js index 60a2e6272..e5c8a669e 100644 --- a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Web/Pages/PaymentConfigurations/Index.js +++ b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Web/Pages/PaymentConfigurations/Index.js @@ -8,8 +8,6 @@ $(function () { const formatter = createNumberFormatter(); const l = abp.localization.getResource('GrantManager'); - toastr.options.positionClass = 'toast-top-center'; - const UIElements = { accountCodingDT: $('#AccountCodesDataTable'), @@ -391,12 +389,12 @@ $(function () { function updatePaymentPrefix() { unity.payments.paymentConfigurations.paymentConfiguration.updatePaymentPrefix(UIElements.paymentPrefixInput.val()) .done(function () { - toastr.success('Payment prefix updated successfully.'); + abp.notify.success('Payment prefix updated successfully.'); $('#payment-id-prefix-original').val(UIElements.paymentPrefixInput.val()); checkEnableDiscard(); }) .fail(function () { - toastr.error('Failed to update payment prefix.'); + abp.notify.error('Failed to update payment prefix.'); }); }; @@ -412,7 +410,7 @@ $(function () { function discardPaymentPrefix() { UIElements.paymentPrefixInput.val(UIElements.originalPaymentPrefix.val()); - toastr.info('Payment prefix changes discarded.'); + abp.notify.info('Payment prefix changes discarded.'); checkEnableDiscard(); }; @@ -427,10 +425,10 @@ function clearFilter() { function handleDefaultAccountCodeRadioClick(id) { $('#AccountCodingId').val(id); // Update the hidden input with the selected account code ID unity.payments.paymentConfigurations.paymentConfiguration.setDefaultAccountCode(id).done(function () { - toastr.success('Successfully set default account code. Reloading account codes.'); - clearAccountCodesSearchAndReload(); + abp.notify.success('Successfully set default account code. Reloading account codes.'); + clearAccountCodesSearchAndReload(); }).fail(function () { - toastr.error('Failed to set default account code.'); + abp.notify.error('Failed to set default account code.'); }); }; diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/ApplicationForms/Mapping.js b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/ApplicationForms/Mapping.js index 7e4992918..e655747a5 100644 --- a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/ApplicationForms/Mapping.js +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/ApplicationForms/Mapping.js @@ -8,7 +8,6 @@ let worksheetMapColumn = document.querySelector('#worksheet-map-available-fields-column'); let excludedIntakeMappings = new Set(['ConfirmationId', 'SubmissionId', 'SubmissionDate']); let dataTable; - if (globalThis.toastr) { toastr.options.positionClass = 'toast-top-center'; } let allowableTypes = new Set(['textarea', 'orgbook', diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Views/Shared/Components/EmailsWidget/Default.js b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Views/Shared/Components/EmailsWidget/Default.js index 56db3501e..467139f91 100644 --- a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Views/Shared/Components/EmailsWidget/Default.js +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Views/Shared/Components/EmailsWidget/Default.js @@ -224,7 +224,6 @@ defaultValues.emailFrom = UIElements.inputOriginalEmailFrom.val(); defaultValues.emailCC = UIElements.inputOriginalEmailCC.val() || ''; defaultValues.emailBCC = UIElements.inputOriginalEmailBCC.val() || ''; - if (globalThis.toastr) { toastr.options.positionClass = 'toast-top-center'; } preloadTemplates(); // Pre-fetch templates on page load initTemplateDetails(); $('#templateTextContainer').hide(); @@ -664,11 +663,6 @@ validator?.resetForm(); - // Clear toastr notifications - if (globalThis.toastr) { - toastr.clear(); - } - $('#modal-content, #modal-background').removeClass('active'); UIElements.emailForm.removeClass('active'); $('#EmailTemplateName').val(''); @@ -749,9 +743,7 @@ // Reset BCC visibility toggleBCCVisibility(); // Show success toast - if (globalThis.toastr) { - toastr.success('Changes discarded', 'Email Reset'); - } + abp.notify.success('Changes discarded', 'Email Reset'); }) .fail(e => { console.warn('Failed to delete draft on discard:', e); @@ -842,9 +834,7 @@ resetValidationErrors(); // Show success toast - if (globalThis.toastr) { - toastr.success('Changes discarded', 'Email Reset'); - } + abp.notify.success('Changes discarded', 'Email Reset'); // Disable save and discard buttons since no changes are present handleDraftChange(); @@ -2587,7 +2577,7 @@ function sanitizeTinyMceHtml(html) { /** - * Displays validation error toast using abp.notify or toastr + * Displays validation error toast using abp.notify * @param {string[]} errors - Array of error messages to display */ function showValidationErrorToast(errors) { @@ -2598,22 +2588,8 @@ function showValidationErrorToast(errors) { console.log('Showing validation errors:', errors); - // Use abp.notify if available, fallback to toastr if available - if (globalThis.abp?.notify) { - const errorTitle = 'Validation Error' + (errors.length > 1 ? 's' : ''); - abp.notify.error(errorMessage, errorTitle); - } else if (globalThis.toastr) { - toastr.error(errorMessage, 'Validation Error' + (errors.length > 1 ? 's' : ''), { - timeOut: 0, - extendedTimeOut: 0, - closeButton: true, - escapeHtml: false - }); - } else { - // Final fallback: alert - console.error('Validation Errors:', errors.join('\n')); - alert('Validation Error:\n\n' + errors.join('\n')); - } + const errorTitle = 'Validation Error' + (errors.length > 1 ? 's' : ''); + abp.notify.error(errorMessage, errorTitle); } /** diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Views/Shared/Components/PaymentConfiguration/Default.js b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Views/Shared/Components/PaymentConfiguration/Default.js index bc5d59041..a6b45dacd 100644 --- a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Views/Shared/Components/PaymentConfiguration/Default.js +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Views/Shared/Components/PaymentConfiguration/Default.js @@ -34,7 +34,6 @@ toggleParentFormSection(); toggleDefaultPaymentGroupRow(UIElements.payable.is(':checked')); - if (window.toastr) { toastr.options.positionClass = 'toast-top-center'; } UIElements.btnSave.prop('disabled', true); } From ab4e6fd07034c76df73dce4004a73144e7e2bc6d Mon Sep 17 00:00:00 2001 From: Armin Hasanpour Date: Fri, 31 Jul 2026 10:16:49 -0700 Subject: [PATCH 03/16] AB#33825 - Updated TinyMCE --- .../src/Unity.GrantManager.Web/package.json | 2 +- .../src/Unity.GrantManager.Web/yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/package.json b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/package.json index d7020994f..e42539712 100644 --- a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/package.json +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/package.json @@ -27,7 +27,7 @@ "select2": "~4.1.0", "select2-bootstrap-5-theme": "~1.3.0", "sortablejs": "~1.15.7", - "tinymce": "~8.6.0", + "tinymce": "~8.8.2", "tributejs": "~5.1.3" }, "devDependencies": { diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/yarn.lock b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/yarn.lock index 1c11fdd55..7c44bae39 100644 --- a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/yarn.lock +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/yarn.lock @@ -1391,10 +1391,10 @@ timeago@^1.6.7: dependencies: jquery ">=1.5.0 <4.0" -tinymce@~8.6.0: - version "8.6.0" - resolved "https://registry.npmjs.org/tinymce/-/tinymce-8.6.0.tgz" - integrity sha512-qODYoNL4cPIzNFpkEEQDm3DWI78I/nQXIPwUMHRN+q/LyT9Wzt7xis2Nfhk88kV6sibp6MJXPSaUDVNe02ZB/w== +tinymce@~8.8.2: + version "8.8.2" + resolved "https://registry.yarnpkg.com/tinymce/-/tinymce-8.8.2.tgz#d30e01ff36581074d97795cc0d0578030947b0ea" + integrity sha512-wcUGaaAf4XFrQtbZtClbDN/QCqklXLlPt3+7UWliEoosuhnTOJUkXwf7Fzlq7agPnwkKKp1e4JGOhx3O1gWH3g== tippy.js@^6.3.7: version "6.3.7" From b50beea591dc4aa68e66ac01e583f90cad5271ee Mon Sep 17 00:00:00 2001 From: Armin Hasanpour Date: Fri, 31 Jul 2026 10:27:14 -0700 Subject: [PATCH 04/16] AB#33825 - Updated DataTables packages --- .../src/Unity.GrantManager.Web/package.json | 10 +++++----- .../src/Unity.GrantManager.Web/yarn.lock | 20 +++++++++---------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/package.json b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/package.json index e42539712..dd2d06618 100644 --- a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/package.json +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/package.json @@ -9,13 +9,13 @@ "bootstrap-select": "~1.13.18", "datatables.net-bs5": "~2.3.8", "datatables.net-buttons-bs5": "~3.2.6", - "datatables.net-colreorder": "~2.1.1", - "datatables.net-colreorder-bs5": "~2.1.1", + "datatables.net-colreorder": "~2.1.2", + "datatables.net-colreorder-bs5": "~2.1.2", "datatables.net-fixedheader": "~4.0.6", "datatables.net-fixedheader-bs5": "~4.0.6", - "datatables.net-select-bs5": "~3.1.0", - "datatables.net-staterestore": "~1.4.2", - "datatables.net-staterestore-dt": "~1.4.2", + "datatables.net-select-bs5": "~3.1.3", + "datatables.net-staterestore": "~1.4.3", + "datatables.net-staterestore-dt": "~1.4.3", "dompurify": "~3.4.1", "echarts": "~6.1.0", "formiojs": "4.21.7", diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/yarn.lock b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/yarn.lock index 7c44bae39..556e62d6d 100644 --- a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/yarn.lock +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/yarn.lock @@ -532,18 +532,18 @@ datatables.net-buttons@3.2.6: datatables.net "^2" jquery ">=1.7" -datatables.net-colreorder-bs5@~2.1.1: +datatables.net-colreorder-bs5@~2.1.2: version "2.1.2" - resolved "https://registry.npmjs.org/datatables.net-colreorder-bs5/-/datatables.net-colreorder-bs5-2.1.2.tgz" + resolved "https://registry.yarnpkg.com/datatables.net-colreorder-bs5/-/datatables.net-colreorder-bs5-2.1.2.tgz#3f37c981e3bef78dcbddd36be26a1ab55c8dcb27" integrity sha512-fQlitQxeRMASSGHXjpZXxwzfaDUj3LuWtjAl9bTCRatmNrUn1IqViVMBEPzFC/VDzpWMq1ltwcy2jbeygL/Ixg== dependencies: datatables.net-bs5 "^2" datatables.net-colreorder "2.1.2" jquery ">=1.7" -datatables.net-colreorder@2.1.2, datatables.net-colreorder@~2.1.1: +datatables.net-colreorder@2.1.2, datatables.net-colreorder@~2.1.2: version "2.1.2" - resolved "https://registry.npmjs.org/datatables.net-colreorder/-/datatables.net-colreorder-2.1.2.tgz" + resolved "https://registry.yarnpkg.com/datatables.net-colreorder/-/datatables.net-colreorder-2.1.2.tgz#cf45eae93f4afd0bbe2f34d47105b312defa8cc7" integrity sha512-lIsUyOt2nBm4sD2cSzDKZcIVrGgrZkh90Z2f03s8p7DYcZSfXMHAhFBrDYf9/eAK6wJnODN8EDMsrtPHfgoSXA== dependencies: datatables.net "^2" @@ -574,9 +574,9 @@ datatables.net-fixedheader@4.0.6, datatables.net-fixedheader@~4.0.6: datatables.net "^2" jquery ">=1.7" -datatables.net-select-bs5@~3.1.0: +datatables.net-select-bs5@~3.1.3: version "3.1.3" - resolved "https://registry.npmjs.org/datatables.net-select-bs5/-/datatables.net-select-bs5-3.1.3.tgz" + resolved "https://registry.yarnpkg.com/datatables.net-select-bs5/-/datatables.net-select-bs5-3.1.3.tgz#e83eea84828b900e12bebc338f53be6c635dc463" integrity sha512-1B/fzuEXTxXWnxOvaTiKkgUzVAYfaMLfBIlQ70NckLwQh65xKc64ptgxrd7zKwIM17SMu+uJC5wEmndooJjbhg== dependencies: datatables.net-bs5 "^2" @@ -591,18 +591,18 @@ datatables.net-select@3.1.3: datatables.net "^2" jquery ">=1.7" -datatables.net-staterestore-dt@~1.4.2: +datatables.net-staterestore-dt@~1.4.3: version "1.4.3" - resolved "https://registry.npmjs.org/datatables.net-staterestore-dt/-/datatables.net-staterestore-dt-1.4.3.tgz" + resolved "https://registry.yarnpkg.com/datatables.net-staterestore-dt/-/datatables.net-staterestore-dt-1.4.3.tgz#5da5d2bba57eadbe11e57ba1d78bc744470c3ecd" integrity sha512-ZrwUg1DKQUUFEdsJ6/Id05GJYNBoIYXvMwJhyKWG4wORlxT32bf3CzdRr9I3c2iWFDDMRJzrdKM/THZFVG8LNQ== dependencies: datatables.net-dt "1.11 - 2" datatables.net-staterestore "1.4.3" jquery ">=1.7" -datatables.net-staterestore@1.4.3, datatables.net-staterestore@~1.4.2: +datatables.net-staterestore@1.4.3, datatables.net-staterestore@~1.4.3: version "1.4.3" - resolved "https://registry.npmjs.org/datatables.net-staterestore/-/datatables.net-staterestore-1.4.3.tgz" + resolved "https://registry.yarnpkg.com/datatables.net-staterestore/-/datatables.net-staterestore-1.4.3.tgz#b3d8277019f939c82b6d6218319ddf360d84d60c" integrity sha512-XSkCHwi+MZ8C5ZbZ1qlvIdIOs8YEJX4BVOk3GUMoSIta6xD4UsKTDV0SxfJWRYsNnDQwvCibQD0yJhK4Vk4xTw== dependencies: datatables.net "1.11 - 2" From e54e296d9753ae7b3dba43565b2121bfb19fdae5 Mon Sep 17 00:00:00 2001 From: Armin Hasanpour Date: Fri, 31 Jul 2026 10:51:59 -0700 Subject: [PATCH 05/16] AB#33825 - Removed ESLint --- .../sonar-project.properties | 2 +- .../src/Unity.GrantManager.Web/package.json | 3 +- .../src/Unity.GrantManager.Web/yarn.lock | 458 +----------------- 3 files changed, 3 insertions(+), 460 deletions(-) diff --git a/applications/Unity.GrantManager/sonar-project.properties b/applications/Unity.GrantManager/sonar-project.properties index ef578dfb6..d7e058aa7 100644 --- a/applications/Unity.GrantManager/sonar-project.properties +++ b/applications/Unity.GrantManager/sonar-project.properties @@ -16,7 +16,7 @@ sonar.tests=test sonar.qualitygate.wait=true # SonarQube Exclusions (from existing Azure configuration) -sonar.exclusions=src/Unity.GrantManager.EntityFrameworkCore/Migrations/**,modules/Unity.Payments/src/Unity.Payments.Web/Pages/BatchPayments/Index.js,src/Unity.GrantManager.EntityFrameworkCore/Scripts/**,**/bin/**,**/obj/**,**/wwwroot/lib/**,**/*.Designer.cs,**/node_modules/** +sonar.exclusions=src/Unity.GrantManager.EntityFrameworkCore/Migrations/**,modules/Unity.Payments/src/Unity.Payments.Web/Pages/BatchPayments/Index.js,src/Unity.GrantManager.EntityFrameworkCore/Scripts/**,**/bin/**,**/obj/**,**/wwwroot/libs/**,**/*.Designer.cs,**/node_modules/** # Test exclusions sonar.test.exclusions=**/bin/**,**/obj/** diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/package.json b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/package.json index dd2d06618..a242e7784 100644 --- a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/package.json +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/package.json @@ -31,7 +31,6 @@ "tributejs": "~5.1.3" }, "devDependencies": { - "@types/jquery": "~3.5.34", - "eslint": "^10.3.0" + "@types/jquery": "~3.5.34" } } diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/yarn.lock b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/yarn.lock index 556e62d6d..767a7df0c 100644 --- a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/yarn.lock +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/yarn.lock @@ -190,54 +190,6 @@ resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz" integrity sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw== -"@eslint-community/eslint-utils@^4.8.0": - version "4.9.1" - resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz" - integrity sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ== - dependencies: - eslint-visitor-keys "^3.4.3" - -"@eslint-community/regexpp@^4.12.2": - version "4.12.2" - resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz" - integrity sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew== - -"@eslint/config-array@^0.23.5": - version "0.23.5" - resolved "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.5.tgz" - integrity sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA== - dependencies: - "@eslint/object-schema" "^3.0.5" - debug "^4.3.1" - minimatch "^10.2.4" - -"@eslint/config-helpers@^0.6.0": - version "0.6.0" - resolved "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.6.0.tgz" - integrity sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA== - dependencies: - "@eslint/core" "^1.2.1" - -"@eslint/core@^1.2.1": - version "1.2.1" - resolved "https://registry.npmjs.org/@eslint/core/-/core-1.2.1.tgz" - integrity sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ== - dependencies: - "@types/json-schema" "^7.0.15" - -"@eslint/object-schema@^3.0.5": - version "3.0.5" - resolved "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.5.tgz" - integrity sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw== - -"@eslint/plugin-kit@^0.7.2": - version "0.7.2" - resolved "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.7.2.tgz" - integrity sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A== - dependencies: - "@eslint/core" "^1.2.1" - levn "^0.4.1" - "@formio/bootstrap3@2.12.4-rc.1": version "2.12.4-rc.1" resolved "https://registry.npmjs.org/@formio/bootstrap3/-/bootstrap3-2.12.4-rc.1.tgz" @@ -274,37 +226,6 @@ resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free/-/fontawesome-free-7.3.1.tgz#9d7d7df8f850637e001d24e6cd901422b4b09099" integrity sha512-wmglKKPDIkgV3aWlZzWECCPoGIkYCulzBwxG9+w7rc5BGapZ6cPMpoPOT8k36J0Ni7PPX6c/rsoMWfS4d1MUMg== -"@humanfs/core@^0.19.2": - version "0.19.2" - resolved "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz" - integrity sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA== - dependencies: - "@humanfs/types" "^0.15.0" - -"@humanfs/node@^0.16.6": - version "0.16.8" - resolved "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz" - integrity sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ== - dependencies: - "@humanfs/core" "^0.19.2" - "@humanfs/types" "^0.15.0" - "@humanwhocodes/retry" "^0.4.0" - -"@humanfs/types@^0.15.0": - version "0.15.0" - resolved "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz" - integrity sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q== - -"@humanwhocodes/module-importer@^1.0.1": - version "1.0.1" - resolved "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz" - integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== - -"@humanwhocodes/retry@^0.4.0", "@humanwhocodes/retry@^0.4.2": - version "0.4.3" - resolved "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz" - integrity sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ== - "@popperjs/core@^2.11.8", "@popperjs/core@^2.9.0": version "2.11.8" resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.8.tgz#6b79032e760a0899cd4204710beede972a3a185f" @@ -315,16 +236,6 @@ resolved "https://registry.npmjs.org/@sphinxxxx/color-conversion/-/color-conversion-2.2.2.tgz" integrity sha512-XExJS3cLqgrmNBIP3bBw6+1oQ1ksGjFh0+oClDKFYpCCqx/hlqwWO5KO/S63fzUo67SxI9dMrF0y5T/Ey7h8Zw== -"@types/esrecurse@^4.3.1": - version "4.3.1" - resolved "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz" - integrity sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw== - -"@types/estree@^1.0.6", "@types/estree@^1.0.8": - version "1.0.9" - resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz" - integrity sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg== - "@types/jquery@~3.5.34": version "3.5.34" resolved "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.34.tgz" @@ -332,11 +243,6 @@ dependencies: "@types/sizzle" "*" -"@types/json-schema@^7.0.15": - version "7.0.15" - resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz" - integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== - "@types/sizzle@*": version "2.3.10" resolved "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.10.tgz" @@ -352,26 +258,6 @@ abortcontroller-polyfill@^1.7.5: resolved "https://registry.npmjs.org/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.8.tgz" integrity sha512-9f1iZ2uWh92VcrU9Y8x+LdM4DLj75VE0MJB8zuF1iUnroEptStw+DQ8EQPMUdfe5k+PkB1uUfDQfWbhstH8LrQ== -acorn-jsx@^5.3.2: - version "5.3.2" - resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" - integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== - -acorn@^8.16.0: - version "8.17.0" - resolved "https://registry.npmjs.org/acorn/-/acorn-8.17.0.tgz" - integrity sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg== - -ajv@^6.14.0: - version "6.15.0" - resolved "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz" - integrity sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - animation-frame-polyfill@^1.0.0: version "1.1.0" resolved "https://registry.npmjs.org/animation-frame-polyfill/-/animation-frame-polyfill-1.1.0.tgz" @@ -397,11 +283,6 @@ autocompleter@^7.0.1: resolved "https://registry.npmjs.org/autocompleter/-/autocompleter-7.1.0.tgz" integrity sha512-uCToOnq7eAD/GJAteDbYuQ7ksDtrYWOy5CIAq43wh0dT+5frMpPlyD9tp+y5fz8KIcsP+zR2MjzoTAdW5aJESw== -balanced-match@^4.0.2: - version "4.0.4" - resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz" - integrity sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA== - "bootstrap-4@npm:bootstrap@~4.6.2": version "4.6.2" resolved "https://registry.npmjs.org/bootstrap/-/bootstrap-4.6.2.tgz" @@ -432,13 +313,6 @@ bootstrap@^5.1.3, bootstrap@^5.3.8: resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-5.3.8.tgz#6401a10057a22752d21f4e19055508980656aeed" integrity sha512-HP1SZDqaLDPwsNiqRqi5NcP0SSXciX2s9E+RyqJIIqGo+vJeN5AJVM98CXmW/Wux0nQ5L7jeWUdplCEf0Ee+tg== -brace-expansion@^5.0.5: - version "5.0.6" - resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz" - integrity sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g== - dependencies: - balanced-match "^4.0.2" - browser-cookies@^1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/browser-cookies/-/browser-cookies-1.2.0.tgz" @@ -481,15 +355,6 @@ create-point-cb@^1.0.0: dependencies: type-func "^1.0.1" -cross-spawn@^7.0.6: - version "7.0.6" - resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz" - integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - crossvent@1.5.5: version "1.5.5" resolved "https://registry.npmjs.org/crossvent/-/crossvent-1.5.5.tgz" @@ -615,18 +480,6 @@ datatables.net-staterestore@1.4.3, datatables.net-staterestore@~1.4.3: dependencies: jquery ">=1.7" -debug@^4.3.1, debug@^4.3.2: - version "4.4.3" - resolved "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz" - integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== - dependencies: - ms "^2.1.3" - -deep-is@^0.1.3: - version "0.1.4" - resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" - integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== - deepmerge@^4.2.2: version "4.3.1" resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz" @@ -698,100 +551,6 @@ echarts@~6.1.0: tslib "2.3.0" zrender "6.1.0" -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -eslint-scope@^9.1.2: - version "9.1.2" - resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz" - integrity sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ== - dependencies: - "@types/esrecurse" "^4.3.1" - "@types/estree" "^1.0.8" - esrecurse "^4.3.0" - estraverse "^5.2.0" - -eslint-visitor-keys@^3.4.3: - version "3.4.3" - resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz" - integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== - -eslint-visitor-keys@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz" - integrity sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA== - -eslint@^10.3.0: - version "10.4.1" - resolved "https://registry.npmjs.org/eslint/-/eslint-10.4.1.tgz" - integrity sha512-AyIKhnOBuOAdueD7RB3xB+YeAWScb9jHsJBgH2Hcde8InP5JYhqrRR6iTMHyTEwgENK54Cp44e4v8BwNhsuHuw== - dependencies: - "@eslint-community/eslint-utils" "^4.8.0" - "@eslint-community/regexpp" "^4.12.2" - "@eslint/config-array" "^0.23.5" - "@eslint/config-helpers" "^0.6.0" - "@eslint/core" "^1.2.1" - "@eslint/plugin-kit" "^0.7.2" - "@humanfs/node" "^0.16.6" - "@humanwhocodes/module-importer" "^1.0.1" - "@humanwhocodes/retry" "^0.4.2" - "@types/estree" "^1.0.6" - ajv "^6.14.0" - cross-spawn "^7.0.6" - debug "^4.3.2" - escape-string-regexp "^4.0.0" - eslint-scope "^9.1.2" - eslint-visitor-keys "^5.0.1" - espree "^11.2.0" - esquery "^1.7.0" - esutils "^2.0.2" - fast-deep-equal "^3.1.3" - file-entry-cache "^8.0.0" - find-up "^5.0.0" - glob-parent "^6.0.2" - ignore "^5.2.0" - imurmurhash "^0.1.4" - is-glob "^4.0.0" - json-stable-stringify-without-jsonify "^1.0.1" - minimatch "^10.2.4" - natural-compare "^1.4.0" - optionator "^0.9.3" - -espree@^11.2.0: - version "11.2.0" - resolved "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz" - integrity sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw== - dependencies: - acorn "^8.16.0" - acorn-jsx "^5.3.2" - eslint-visitor-keys "^5.0.1" - -esquery@^1.7.0: - version "1.7.0" - resolved "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz" - integrity sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g== - dependencies: - estraverse "^5.1.0" - -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^5.1.0, estraverse@^5.2.0: - version "5.3.0" - resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - eventemitter3@^4.0.7: version "4.0.7" resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz" @@ -802,7 +561,7 @@ eventemitter3@^5.0.1: resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz" integrity sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw== -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: +fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== @@ -817,16 +576,6 @@ fast-json-patch@^3.1.1: resolved "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-3.1.1.tgz" integrity sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ== -fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fast-levenshtein@^2.0.6: - version "2.0.6" - resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" - integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== - fetch-ponyfill@^7.1.0: version "7.1.0" resolved "https://registry.npmjs.org/fetch-ponyfill/-/fetch-ponyfill-7.1.0.tgz" @@ -834,34 +583,6 @@ fetch-ponyfill@^7.1.0: dependencies: node-fetch "~2.6.1" -file-entry-cache@^8.0.0: - version "8.0.0" - resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz" - integrity sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ== - dependencies: - flat-cache "^4.0.0" - -find-up@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -flat-cache@^4.0.0: - version "4.0.1" - resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz" - integrity sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw== - dependencies: - flatted "^3.2.9" - keyv "^4.5.4" - -flatted@^3.2.9: - version "3.4.2" - resolved "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz" - integrity sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA== - formiojs@4.21.7: version "4.21.7" resolved "https://registry.npmjs.org/formiojs/-/formiojs-4.21.7.tgz" @@ -911,13 +632,6 @@ fuse.js@^6.6.2: resolved "https://registry.npmjs.org/fuse.js/-/fuse.js-6.6.2.tgz" integrity sha512-cJaJkxCCxC8qIIcPBF9yGxY0W/tVZS3uEISDxhYIdtk8OL93pe+6Zj7LjCqVV4dzbqcriOZ+kQ/NE4RXZHsIGA== -glob-parent@^6.0.2: - version "6.0.2" - resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" - integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== - dependencies: - is-glob "^4.0.3" - handlebars@~4.7.9: version "4.7.9" resolved "https://registry.npmjs.org/handlebars/-/handlebars-4.7.9.tgz" @@ -942,21 +656,11 @@ idb@^7.1.1: resolved "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz" integrity sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ== -ignore@^5.2.0: - version "5.3.2" - resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz" - integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== - immediate@~3.0.5: version "3.0.6" resolved "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz" integrity sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ== -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" - integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== - inherits@~2.0.3: version "2.0.4" resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" @@ -972,18 +676,6 @@ is-array@^1.0.1: resolved "https://registry.npmjs.org/is-array/-/is-array-1.0.1.tgz" integrity sha512-gxiZ+y/u67AzpeFmAmo4CbtME/bs7J2C++su5zQzvQyaxUqVzkh69DI+jN+KZuSO6JaH6TIIU6M6LhqxMjxEpw== -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== - -is-glob@^4.0.0, is-glob@^4.0.3: - version "4.0.3" - resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - isarray@~1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" @@ -994,11 +686,6 @@ iselement@^1.1.4: resolved "https://registry.npmjs.org/iselement/-/iselement-1.1.4.tgz" integrity sha512-4Q519eWmbHO1pbimiz7H1iJRUHVmAmfh0viSsUD+oAwVO4ntZt7gpf8i8AShVBTyOvRTZNYNBpUxOIvwZR+ffw== -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - ismobilejs@^1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/ismobilejs/-/ismobilejs-1.1.1.tgz" @@ -1036,26 +723,11 @@ jquery@>=1.10, jquery@>=1.2.6, "jquery@>=1.5.0 <4.0", jquery@>=1.6, jquery@>=1.7 resolved "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz" integrity sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg== -json-buffer@3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz" - integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== - json-logic-js@^2.0.2: version "2.0.5" resolved "https://registry.npmjs.org/json-logic-js/-/json-logic-js-2.0.5.tgz" integrity sha512-rTT2+lqcuUmj4DgWfmzupZqQDA64AdmYqizzMPWj3DxGdfFNsxPpcNVSaTj4l8W2tG/+hg7/mQhxjU3aPacO6g== -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" - integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== - jstimezonedetect@^1.0.7: version "1.0.7" resolved "https://registry.npmjs.org/jstimezonedetect/-/jstimezonedetect-1.0.7.tgz" @@ -1081,21 +753,6 @@ jwt-decode@^3.1.2: resolved "https://registry.npmjs.org/jwt-decode/-/jwt-decode-3.1.2.tgz" integrity sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A== -keyv@^4.5.4: - version "4.5.4" - resolved "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz" - integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== - dependencies: - json-buffer "3.0.1" - -levn@^0.4.1: - version "0.4.1" - resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" - integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== - dependencies: - prelude-ls "^1.2.1" - type-check "~0.4.0" - lie@~3.3.0: version "3.3.0" resolved "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz" @@ -1103,13 +760,6 @@ lie@~3.3.0: dependencies: immediate "~3.0.5" -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - lodash-es@^4.17.21: version "4.18.1" resolved "https://registry.npmjs.org/lodash-es/-/lodash-es-4.18.1.tgz" @@ -1142,13 +792,6 @@ malihu-custom-scrollbar-plugin@^3.1.5: dependencies: jquery-mousewheel ">=3.0.6" -minimatch@^10.2.4: - version "10.2.5" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz" - integrity sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg== - dependencies: - brace-expansion "^5.0.5" - minimist@^1.2.5: version "1.2.8" resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" @@ -1166,21 +809,11 @@ moment@^2.29.4, moment@^2.30.1, moment@^2.9.0: resolved "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz" integrity sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how== -ms@^2.1.3: - version "2.1.3" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - native-promise-only@^0.8.1: version "0.8.1" resolved "https://registry.npmjs.org/native-promise-only/-/native-promise-only-0.8.1.tgz" integrity sha512-zkVhZUA3y8mbz652WrL5x0fB0ehrBkulWT3TomAQ9iDtyXZvzKeEA6GPxAItBYeNYl5yngKRX612qHOhvMkDeg== -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" - integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== - neo-async@^2.6.2: version "2.6.2" resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz" @@ -1193,32 +826,6 @@ node-fetch@~2.6.1: dependencies: whatwg-url "^5.0.0" -optionator@^0.9.3: - version "0.9.4" - resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz" - integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== - dependencies: - deep-is "^0.1.3" - fast-levenshtein "^2.0.6" - levn "^0.4.1" - prelude-ls "^1.2.1" - type-check "^0.4.0" - word-wrap "^1.2.5" - -p-limit@^3.0.2: - version "3.1.0" - resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - pako@~1.0.2: version "1.0.11" resolved "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz" @@ -1229,26 +836,11 @@ parchment@^3.0.0: resolved "https://registry.npmjs.org/parchment/-/parchment-3.0.0.tgz" integrity sha512-HUrJFQ/StvgmXRcQ1ftY6VEZUq3jA2t9ncFN4F84J/vN0/FPpQF+8FKXb3l6fLces6q0uOHj6NJn+2xvZnxO6A== -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - popper.js@~1.16.1: version "1.16.1" resolved "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz" integrity sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ== -prelude-ls@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" - integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== - process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" @@ -1259,11 +851,6 @@ pubsub-js@~1.9.5: resolved "https://registry.npmjs.org/pubsub-js/-/pubsub-js-1.9.5.tgz" integrity sha512-5MZ0I9i5JWVO7SizvOviKvZU2qaBbl2KQX150FAA+fJBwYpwOUId7aNygURWSdPzlsA/xZ/InUKXqBbzM0czTA== -punycode@^2.1.0: - version "2.3.1" - resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz" - integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== - quill-delta@^5.1.0: version "5.1.0" resolved "https://registry.npmjs.org/quill-delta/-/quill-delta-5.1.0.tgz" @@ -1330,18 +917,6 @@ setimmediate@^1.0.5: resolved "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz" integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - signature_pad@^4.1.4: version "4.2.0" resolved "https://registry.npmjs.org/signature_pad/-/signature_pad-4.2.0.tgz" @@ -1418,13 +993,6 @@ tslib@2.3.0: resolved "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz" integrity sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg== -type-check@^0.4.0, type-check@~0.4.0: - version "0.4.0" - resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" - integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== - dependencies: - prelude-ls "^1.2.1" - type-func@^1.0.1: version "1.0.3" resolved "https://registry.npmjs.org/type-func/-/type-func-1.0.3.tgz" @@ -1435,13 +1003,6 @@ uglify-js@^3.1.4: resolved "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz" integrity sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ== -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" @@ -1472,28 +1033,11 @@ whatwg-url@^5.0.0: tr46 "~0.0.3" webidl-conversions "^3.0.0" -which@^2.0.1: - version "2.0.2" - resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -word-wrap@^1.2.5: - version "1.2.5" - resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz" - integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== - wordwrap@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz" integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== - zrender@6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/zrender/-/zrender-6.1.0.tgz#c3ef06e6426d5c28865b7183035680d685e00136" From 61da9723aa58ade9b46485c96aae8977bbd17335 Mon Sep 17 00:00:00 2001 From: JamesPasta Date: Fri, 31 Jul 2026 17:09:23 -0700 Subject: [PATCH 06/16] feature/AB#32293-DBMigratorUpdates --- .../Unity.GrantManager.DbMigrator/README.md | 4 + .../Data/GrantManagerDbMigrationService.cs | 18 ++- .../GrantManagerDataSeederContributor.cs | 31 +++-- ...ameworkCoreGrantManagerDbSchemaMigrator.cs | 112 +++++++++++++++--- .../GrantManagerEntityFrameworkCoreModule.cs | 7 +- 5 files changed, 143 insertions(+), 29 deletions(-) diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.DbMigrator/README.md b/applications/Unity.GrantManager/src/Unity.GrantManager.DbMigrator/README.md index 21a27a721..9aa057d9f 100644 --- a/applications/Unity.GrantManager/src/Unity.GrantManager.DbMigrator/README.md +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.DbMigrator/README.md @@ -41,6 +41,10 @@ Because the file is optional, its absence is not an error — omit it entirely i ## Running the Migrator +The DbMigrator enables EF Core command logging by default so the migration plan, +SQL command execution, and final migration state are visible in container logs. +Sensitive data logging is not supported by the DbMigrator. + Once you've configured your connection strings via `appsettings.secrets.json` (or environment variables), you can run the migrator: ```bash diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Domain/Data/GrantManagerDbMigrationService.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.Domain/Data/GrantManagerDbMigrationService.cs index f300cb738..d80b2df20 100644 --- a/applications/Unity.GrantManager/src/Unity.GrantManager.Domain/Data/GrantManagerDbMigrationService.cs +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Domain/Data/GrantManagerDbMigrationService.cs @@ -1,5 +1,4 @@ using Microsoft.Extensions.Logging; -using Microsoft.Extensions.Logging.Abstractions; using System; using System.Collections.Generic; using System.Diagnostics; @@ -31,7 +30,8 @@ public GrantManagerDbMigrationService( IEnumerable dbSchemaMigrators, ITenantRepository tenantRepository, ICurrentTenant currentTenant, - TenantConnectionStringEncryptionMigrator connectionStringEncryptionMigrator) + TenantConnectionStringEncryptionMigrator connectionStringEncryptionMigrator, + ILogger logger) { _dataSeeder = dataSeeder; _dbSchemaMigrators = dbSchemaMigrators; @@ -39,7 +39,7 @@ public GrantManagerDbMigrationService( _currentTenant = currentTenant; _connectionStringEncryptionMigrator = connectionStringEncryptionMigrator; - Logger = NullLogger.Instance; + Logger = logger; } public async Task MigrateAsync() @@ -59,6 +59,7 @@ public async Task MigrateAsync() await _connectionStringEncryptionMigrator.MigrateAsync(); var tenants = await _tenantRepository.GetListAsync(includeDetails: true); + Logger.LogInformation("Found {TenantCount} tenants to process.", tenants.Count); var migratedDatabaseSchemas = new HashSet(); @@ -76,6 +77,11 @@ public async Task MigrateAndSeedTenantAsync(HashSet migratedDatabaseSche { if (tenant == null) { return; } + Logger.LogInformation( + "Processing tenant {TenantName} with {ConnectionStringCount} configured connection strings.", + tenant.Name, + tenant.ConnectionStrings.Count); + using (_currentTenant.Change(tenant.Id)) { if (tenant.ConnectionStrings.Count > 0) @@ -94,6 +100,11 @@ public async Task MigrateAndSeedTenantAsync(HashSet migratedDatabaseSche await SeedDataAsync(tenant); } + + if (tenant.ConnectionStrings.Count == 0) + { + Logger.LogWarning("Skipping schema migration for tenant {TenantName}: no connection string is configured.", tenant.Name); + } } private async Task MigrateDatabaseSchemaAsync(Tenant? tenant = null) @@ -121,6 +132,7 @@ private async Task SeedDataAsync(Tenant? tenant = null) catch (Exception ex) { Logger.LogError(ex, "An error occurred while seeding {Database} database data.", tenant == null ? "host" : tenant.Name + TenantSuffix); + throw; } } diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Domain/GrantManagerDataSeederContributor.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.Domain/GrantManagerDataSeederContributor.cs index 7ec5d0266..132701f78 100644 --- a/applications/Unity.GrantManager/src/Unity.GrantManager.Domain/GrantManagerDataSeederContributor.cs +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Domain/GrantManagerDataSeederContributor.cs @@ -12,6 +12,7 @@ using Volo.Abp.Domain.Repositories; using Volo.Abp.Identity; using Volo.Abp.MultiTenancy; +using Volo.Abp.Uow; namespace Unity.GrantManager; @@ -19,7 +20,8 @@ public class GrantManagerDataSeederContributor( IApplicationStatusRepository applicationStatusRepository, IPersonRepository personRepository, IIdentityUserRepository userRepository, - ICurrentTenant currentTenant) : IDataSeedContributor, ITransientDependency + ICurrentTenant currentTenant, + IUnitOfWorkManager unitOfWorkManager) : IDataSeedContributor, ITransientDependency { public static class GrantApplicationStates { @@ -79,7 +81,9 @@ private async Task SeedApplicationStatusAsync() { try { + using var unitOfWork = unitOfWorkManager.Begin(requiresNew: true, isTransactional: true); await applicationStatusRepository.InsertAsync(status, autoSave: true); + await unitOfWork.CompleteAsync(); } catch (Exception ex) when (IsDuplicateStatusCodeException(ex)) { @@ -100,15 +104,24 @@ private async Task SeedAiScoringPersonAsync(System.Guid? tenantId) var existing = await personRepository.FirstOrDefaultAsync(p => p.Id == AIScoringConstants.AiPersonId); if (existing == null) { - await personRepository.InsertAsync(new Person + try + { + using var unitOfWork = unitOfWorkManager.Begin(requiresNew: true, isTransactional: true); + await personRepository.InsertAsync(new Person + { + Id = AIScoringConstants.AiPersonId, + OidcSub = AIScoringConstants.AiOidcSub, + OidcDisplayName = AIScoringConstants.AiDisplayName, + FullName = AIScoringConstants.AiDisplayName, + Badge = AIScoringConstants.AiBadge, + TenantId = tenantId + }, autoSave: true); + await unitOfWork.CompleteAsync(); + } + catch (Exception ex) when (ex.ToString().Contains("PK_Persons")) { - Id = AIScoringConstants.AiPersonId, - OidcSub = AIScoringConstants.AiOidcSub, - OidcDisplayName = AIScoringConstants.AiDisplayName, - FullName = AIScoringConstants.AiDisplayName, - Badge = AIScoringConstants.AiBadge, - TenantId = tenantId - }); + // Another concurrent seeder instance inserted the person first; safe to ignore. + } } } diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.EntityFrameworkCore/EntityFrameworkCore/EntityFrameworkCoreGrantManagerDbSchemaMigrator.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.EntityFrameworkCore/EntityFrameworkCore/EntityFrameworkCoreGrantManagerDbSchemaMigrator.cs index 2e1ca2113..e73e6fb8d 100644 --- a/applications/Unity.GrantManager/src/Unity.GrantManager.EntityFrameworkCore/EntityFrameworkCore/EntityFrameworkCoreGrantManagerDbSchemaMigrator.cs +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.EntityFrameworkCore/EntityFrameworkCore/EntityFrameworkCoreGrantManagerDbSchemaMigrator.cs @@ -1,12 +1,13 @@ using System; +using System.Linq; using System.Text.RegularExpressions; using System.Threading.Tasks; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; using Npgsql; using Unity.GrantManager.Data; using Volo.Abp.DependencyInjection; @@ -15,7 +16,10 @@ namespace Unity.GrantManager.EntityFrameworkCore; -public class EntityFrameworkCoreGrantManagerDbSchemaMigrator +public class EntityFrameworkCoreGrantManagerDbSchemaMigrator( + IServiceProvider serviceProvider, + IStringEncryptionService encryptionService, + ILogger logger) : IGrantManagerDbSchemaMigrator, ITransientDependency { /* Migration history was squashed to a single "Initial" migration per context @@ -37,16 +41,9 @@ public class EntityFrameworkCoreGrantManagerDbSchemaMigrator private const string TenantInitialMigrationId = "20260721203242_Initial"; private const string EfCoreProductVersion = "10.0.3"; - private readonly IServiceProvider _serviceProvider; - private readonly IStringEncryptionService _encryptionService; - - public EntityFrameworkCoreGrantManagerDbSchemaMigrator( - IServiceProvider serviceProvider, - IStringEncryptionService encryptionService) - { - _serviceProvider = serviceProvider; - _encryptionService = encryptionService; - } + private readonly IServiceProvider _serviceProvider = serviceProvider; + private readonly IStringEncryptionService _encryptionService = encryptionService; + private readonly ILogger _logger = logger; public async Task MigrateAsync(Tenant? tenant) { @@ -97,7 +94,13 @@ public async Task MigrateAsync(Tenant? tenant) if (!await tenantDb.CanConnectAsync()) { - await tenantDb.GetService().CreateAsync(); + if (!CanCreateDatabaseLocally()) + { + throw new InvalidOperationException( + $"Tenant database '{dbName}' does not exist and automatic database creation is disabled in OpenShift."); + } + + await CreateDatabaseIfNotExistsAsync(adminConnectionString, dbName); } // Grant database and schema privileges to the role (idempotent) @@ -111,7 +114,7 @@ await tenantDb.ExecuteSqlRawAsync( await ReconcileMigrationHistoryAsync(tenantDb, TenantInitialMigrationId); // Run migrations as admin against the tenant database - await tenantDb.MigrateAsync(); + await MigrateAndLogAsync(tenantDb, $"tenant:{tenant.Name}"); // Grant table and sequence privileges after migrations have created all objects await GrantTablePrivilegesAsync(adminTenantConnectionString, roleName); @@ -149,15 +152,70 @@ the correct one. */ // it exists here first (mirrors the tenant path further up). if (!await hostDb.CanConnectAsync()) { - await hostDb.GetService().CreateAsync(); + if (!CanCreateDatabaseLocally()) + { + throw new InvalidOperationException( + "Host database does not exist and automatic database creation is disabled in OpenShift."); + } + + var configuration = _serviceProvider.GetRequiredService(); + var hostConnectionString = configuration.GetConnectionString(GrantManagerConsts.DefaultConnectionStringName) + ?? throw new InvalidOperationException($"Connection string '{GrantManagerConsts.DefaultConnectionStringName}' is not configured."); + var hostCsb = new NpgsqlConnectionStringBuilder(hostConnectionString); + var hostDatabaseName = hostCsb.Database + ?? throw new InvalidOperationException("Host connection string is missing the Database value."); + EnsureSafeIdentifier(hostDatabaseName, "host database name"); + + hostCsb.Database = "postgres"; + await CreateDatabaseIfNotExistsAsync(hostCsb.ToString(), hostDatabaseName); } + await hostDb.ExecuteSqlRawAsync( + hostDb.GetService().GetCreateIfNotExistsScript()); + await ReconcileMigrationHistoryAsync(hostDb, HostInitialMigrationId); - await hostDb.MigrateAsync(); + await MigrateAndLogAsync(hostDb, "host"); } } + private bool CanCreateDatabaseLocally() + { + var runningInOpenShift = !string.IsNullOrWhiteSpace( + Environment.GetEnvironmentVariable("KUBERNETES_SERVICE_HOST")) + || !string.IsNullOrWhiteSpace(Environment.GetEnvironmentVariable("OPENSHIFT_BUILD_NAME")); + + if (runningInOpenShift) + { + _logger.LogWarning( + "Database creation is disabled when running in OpenShift. The configured database must already exist."); + return false; + } + + return true; + } + + private async Task MigrateAndLogAsync(DatabaseFacade database, string contextName) + { + var pendingMigrations = (await database.GetPendingMigrationsAsync()).ToArray(); + var appliedMigrations = (await database.GetAppliedMigrationsAsync()).ToArray(); + + _logger.LogInformation( + "Migration plan for {Context}: applied={AppliedMigrations}, pending={PendingMigrations}", + contextName, + appliedMigrations.Length == 0 ? "none" : string.Join(",", appliedMigrations), + pendingMigrations.Length == 0 ? "none" : string.Join(",", pendingMigrations)); + + await database.MigrateAsync(); + + var finalMigrations = (await database.GetAppliedMigrationsAsync()).ToArray(); + _logger.LogInformation( + "Migration completed for {Context}: result={Result}, final={FinalMigrations}", + contextName, + pendingMigrations.Length == 0 ? "NoPendingMigrations" : "AppliedMigrations", + finalMigrations.Length == 0 ? "none" : string.Join(",", finalMigrations)); + } + private static async Task ReconcileMigrationHistoryAsync(DatabaseFacade database, string initialMigrationId) { // initialMigrationId/EfCoreProductVersion are hardcoded constants above, never @@ -178,6 +236,28 @@ IF EXISTS (SELECT 1 FROM public."__EFMigrationsHistory" WHERE "MigrationId" <> ' #pragma warning restore EF1002 } + private static async Task CreateDatabaseIfNotExistsAsync(string adminConnectionString, string databaseName) + { + await using var connection = new NpgsqlConnection(adminConnectionString); + await connection.OpenAsync(); + + await using (var existsCommand = new NpgsqlCommand( + "SELECT 1 FROM pg_database WHERE datname = @databaseName", + connection)) + { + existsCommand.Parameters.AddWithValue("databaseName", databaseName); + + if (await existsCommand.ExecuteScalarAsync() != null) + { + return; + } + } + + await using var createCommand = connection.CreateCommand(); + createCommand.CommandText = $"CREATE DATABASE \"{databaseName}\""; + await createCommand.ExecuteNonQueryAsync(); + } + // Decrypt the stored value — plain-text rows (pre-encryption) fall back to their original value. // A successful decrypt that produces non-connection-string output (wrong passphrase returning garbage) // is also rejected by the Contains('=') check so we surface a meaningful error rather than a diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.EntityFrameworkCore/EntityFrameworkCore/GrantManagerEntityFrameworkCoreModule.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.EntityFrameworkCore/EntityFrameworkCore/GrantManagerEntityFrameworkCoreModule.cs index 9a6896872..2a48fe23a 100644 --- a/applications/Unity.GrantManager/src/Unity.GrantManager.EntityFrameworkCore/EntityFrameworkCore/GrantManagerEntityFrameworkCoreModule.cs +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.EntityFrameworkCore/EntityFrameworkCore/GrantManagerEntityFrameworkCoreModule.cs @@ -1,4 +1,5 @@ using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; using System; using Volo.Abp.AuditLogging.EntityFrameworkCore; using Volo.Abp.BackgroundJobs.EntityFrameworkCore; @@ -56,7 +57,11 @@ public override void ConfigureServices(ServiceConfigurationContext context) { /* The main point to change your DBMS. * See also GrantManagerMigrationsDbContextFactory for EF Core tooling. */ - options.UseNpgsql(); + options.Configure(dbContextConfiguration => + { + dbContextConfiguration.UseNpgsql(); + dbContextConfiguration.DbContextOptions.LogTo(Console.WriteLine, LogLevel.Information); + }); }); } } From 73313dcb23558cb13649dd6eb11441c43060ba2e Mon Sep 17 00:00:00 2001 From: JamesPasta Date: Fri, 31 Jul 2026 17:21:26 -0700 Subject: [PATCH 07/16] feature/AB#32293-DBMigratorUpdates --- ...ameworkCoreGrantManagerDbSchemaMigrator.cs | 44 ++++++++++--------- 1 file changed, 23 insertions(+), 21 deletions(-) diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.EntityFrameworkCore/EntityFrameworkCore/EntityFrameworkCoreGrantManagerDbSchemaMigrator.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.EntityFrameworkCore/EntityFrameworkCore/EntityFrameworkCoreGrantManagerDbSchemaMigrator.cs index e73e6fb8d..4f0ef1569 100644 --- a/applications/Unity.GrantManager/src/Unity.GrantManager.EntityFrameworkCore/EntityFrameworkCore/EntityFrameworkCoreGrantManagerDbSchemaMigrator.cs +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.EntityFrameworkCore/EntityFrameworkCore/EntityFrameworkCoreGrantManagerDbSchemaMigrator.cs @@ -84,8 +84,8 @@ public async Task MigrateAsync(Tenant? tenant) // Create the PostgreSQL role (idempotent via DO block) await CreateRoleIfNotExistsAsync(adminConnectionString, roleName, rolePassword); - // Create the database if it does not exist; use the admin connection so - // MigrateAsync connects cleanly and avoids logging a ConnectionError. + // LOCAL-ONLY database bootstrap. All existing tenant migration and + // privilege logic remains below this isolated fallback. var tenantDb = _serviceProvider .GetRequiredService() .Database; @@ -94,13 +94,7 @@ public async Task MigrateAsync(Tenant? tenant) if (!await tenantDb.CanConnectAsync()) { - if (!CanCreateDatabaseLocally()) - { - throw new InvalidOperationException( - $"Tenant database '{dbName}' does not exist and automatic database creation is disabled in OpenShift."); - } - - await CreateDatabaseIfNotExistsAsync(adminConnectionString, dbName); + await EnsureLocalDatabaseExistsAsync(adminConnectionString, dbName, "tenant"); } // Grant database and schema privileges to the role (idempotent) @@ -146,18 +140,10 @@ the correct one. */ .GetRequiredService() .Database; - // The database itself may not exist yet on a brand new Postgres instance. - // MigrateAsync() would normally create it as its first step, but - // ReconcileMigrationHistoryAsync needs to connect before that, so ensure - // it exists here first (mirrors the tenant path further up). + // LOCAL-ONLY database bootstrap. The pre-existing host migration flow + // starts immediately after this isolated fallback. if (!await hostDb.CanConnectAsync()) { - if (!CanCreateDatabaseLocally()) - { - throw new InvalidOperationException( - "Host database does not exist and automatic database creation is disabled in OpenShift."); - } - var configuration = _serviceProvider.GetRequiredService(); var hostConnectionString = configuration.GetConnectionString(GrantManagerConsts.DefaultConnectionStringName) ?? throw new InvalidOperationException($"Connection string '{GrantManagerConsts.DefaultConnectionStringName}' is not configured."); @@ -167,7 +153,7 @@ the correct one. */ EnsureSafeIdentifier(hostDatabaseName, "host database name"); hostCsb.Database = "postgres"; - await CreateDatabaseIfNotExistsAsync(hostCsb.ToString(), hostDatabaseName); + await EnsureLocalDatabaseExistsAsync(hostCsb.ToString(), hostDatabaseName, "host"); } await hostDb.ExecuteSqlRawAsync( @@ -195,6 +181,22 @@ private bool CanCreateDatabaseLocally() return true; } + // LOCAL-ONLY FALLBACK: automatic database creation is intentionally isolated + // from the normal migration flow and is disabled inside OpenShift/Kubernetes. + private async Task EnsureLocalDatabaseExistsAsync( + string adminConnectionString, + string databaseName, + string databaseContext) + { + if (!CanCreateDatabaseLocally()) + { + throw new InvalidOperationException( + $"{databaseContext} database '{databaseName}' does not exist and automatic database creation is disabled in OpenShift."); + } + + await CreateLocalDatabaseIfNotExistsAsync(adminConnectionString, databaseName); + } + private async Task MigrateAndLogAsync(DatabaseFacade database, string contextName) { var pendingMigrations = (await database.GetPendingMigrationsAsync()).ToArray(); @@ -236,7 +238,7 @@ IF EXISTS (SELECT 1 FROM public."__EFMigrationsHistory" WHERE "MigrationId" <> ' #pragma warning restore EF1002 } - private static async Task CreateDatabaseIfNotExistsAsync(string adminConnectionString, string databaseName) + private static async Task CreateLocalDatabaseIfNotExistsAsync(string adminConnectionString, string databaseName) { await using var connection = new NpgsqlConnection(adminConnectionString); await connection.OpenAsync(); From eda6b6d60979f8c61001be3429d4e1188758fd4e Mon Sep 17 00:00:00 2001 From: JamesPasta Date: Fri, 31 Jul 2026 17:27:04 -0700 Subject: [PATCH 08/16] feature/AB#32293-DBMigratorUpdates --- ...ameworkCoreGrantManagerDbSchemaMigrator.cs | 43 ++----------------- 1 file changed, 4 insertions(+), 39 deletions(-) diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.EntityFrameworkCore/EntityFrameworkCore/EntityFrameworkCoreGrantManagerDbSchemaMigrator.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.EntityFrameworkCore/EntityFrameworkCore/EntityFrameworkCoreGrantManagerDbSchemaMigrator.cs index 4f0ef1569..6c825284b 100644 --- a/applications/Unity.GrantManager/src/Unity.GrantManager.EntityFrameworkCore/EntityFrameworkCore/EntityFrameworkCoreGrantManagerDbSchemaMigrator.cs +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.EntityFrameworkCore/EntityFrameworkCore/EntityFrameworkCoreGrantManagerDbSchemaMigrator.cs @@ -5,6 +5,7 @@ using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; @@ -84,8 +85,6 @@ public async Task MigrateAsync(Tenant? tenant) // Create the PostgreSQL role (idempotent via DO block) await CreateRoleIfNotExistsAsync(adminConnectionString, roleName, rolePassword); - // LOCAL-ONLY database bootstrap. All existing tenant migration and - // privilege logic remains below this isolated fallback. var tenantDb = _serviceProvider .GetRequiredService() .Database; @@ -94,7 +93,7 @@ public async Task MigrateAsync(Tenant? tenant) if (!await tenantDb.CanConnectAsync()) { - await EnsureLocalDatabaseExistsAsync(adminConnectionString, dbName, "tenant"); + await tenantDb.GetService().CreateAsync(); } // Grant database and schema privileges to the role (idempotent) @@ -140,8 +139,6 @@ the correct one. */ .GetRequiredService() .Database; - // LOCAL-ONLY database bootstrap. The pre-existing host migration flow - // starts immediately after this isolated fallback. if (!await hostDb.CanConnectAsync()) { var configuration = _serviceProvider.GetRequiredService(); @@ -153,7 +150,7 @@ the correct one. */ EnsureSafeIdentifier(hostDatabaseName, "host database name"); hostCsb.Database = "postgres"; - await EnsureLocalDatabaseExistsAsync(hostCsb.ToString(), hostDatabaseName, "host"); + await CreateDatabaseIfNotExistsAsync(hostCsb.ToString(), hostDatabaseName); } await hostDb.ExecuteSqlRawAsync( @@ -165,38 +162,6 @@ await hostDb.ExecuteSqlRawAsync( } } - private bool CanCreateDatabaseLocally() - { - var runningInOpenShift = !string.IsNullOrWhiteSpace( - Environment.GetEnvironmentVariable("KUBERNETES_SERVICE_HOST")) - || !string.IsNullOrWhiteSpace(Environment.GetEnvironmentVariable("OPENSHIFT_BUILD_NAME")); - - if (runningInOpenShift) - { - _logger.LogWarning( - "Database creation is disabled when running in OpenShift. The configured database must already exist."); - return false; - } - - return true; - } - - // LOCAL-ONLY FALLBACK: automatic database creation is intentionally isolated - // from the normal migration flow and is disabled inside OpenShift/Kubernetes. - private async Task EnsureLocalDatabaseExistsAsync( - string adminConnectionString, - string databaseName, - string databaseContext) - { - if (!CanCreateDatabaseLocally()) - { - throw new InvalidOperationException( - $"{databaseContext} database '{databaseName}' does not exist and automatic database creation is disabled in OpenShift."); - } - - await CreateLocalDatabaseIfNotExistsAsync(adminConnectionString, databaseName); - } - private async Task MigrateAndLogAsync(DatabaseFacade database, string contextName) { var pendingMigrations = (await database.GetPendingMigrationsAsync()).ToArray(); @@ -238,7 +203,7 @@ IF EXISTS (SELECT 1 FROM public."__EFMigrationsHistory" WHERE "MigrationId" <> ' #pragma warning restore EF1002 } - private static async Task CreateLocalDatabaseIfNotExistsAsync(string adminConnectionString, string databaseName) + private static async Task CreateDatabaseIfNotExistsAsync(string adminConnectionString, string databaseName) { await using var connection = new NpgsqlConnection(adminConnectionString); await connection.OpenAsync(); From e59d061a4371639620017bbc1494568a17d5442b Mon Sep 17 00:00:00 2001 From: JamesPasta Date: Fri, 31 Jul 2026 17:30:34 -0700 Subject: [PATCH 09/16] feature/AB#32293-DBMigratorUpdates --- ...ntityFrameworkCoreGrantManagerDbSchemaMigrator.cs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.EntityFrameworkCore/EntityFrameworkCore/EntityFrameworkCoreGrantManagerDbSchemaMigrator.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.EntityFrameworkCore/EntityFrameworkCore/EntityFrameworkCoreGrantManagerDbSchemaMigrator.cs index 6c825284b..0b68fd752 100644 --- a/applications/Unity.GrantManager/src/Unity.GrantManager.EntityFrameworkCore/EntityFrameworkCore/EntityFrameworkCoreGrantManagerDbSchemaMigrator.cs +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.EntityFrameworkCore/EntityFrameworkCore/EntityFrameworkCoreGrantManagerDbSchemaMigrator.cs @@ -150,6 +150,12 @@ the correct one. */ EnsureSafeIdentifier(hostDatabaseName, "host database name"); hostCsb.Database = "postgres"; + if (!CanCreateDatabaseLocally()) + { + throw new InvalidOperationException( + $"Host database '{hostDatabaseName}' does not exist and automatic database creation is disabled outside local execution."); + } + await CreateDatabaseIfNotExistsAsync(hostCsb.ToString(), hostDatabaseName); } @@ -162,6 +168,12 @@ await hostDb.ExecuteSqlRawAsync( } } + private static bool CanCreateDatabaseLocally() + { + return string.IsNullOrWhiteSpace(Environment.GetEnvironmentVariable("KUBERNETES_SERVICE_HOST")) + && string.IsNullOrWhiteSpace(Environment.GetEnvironmentVariable("OPENSHIFT_BUILD_NAME")); + } + private async Task MigrateAndLogAsync(DatabaseFacade database, string contextName) { var pendingMigrations = (await database.GetPendingMigrationsAsync()).ToArray(); From 1d4c63b74a344d02d247f7c5410581bf7ac789cc Mon Sep 17 00:00:00 2001 From: Armin Hasanpour Date: Fri, 31 Jul 2026 18:14:10 -0700 Subject: [PATCH 10/16] AB#33825 - Removed Bootstrap 4 and migrate to 5 --- .../Pages/AIReporting/Index.cshtml | 9 - .../Pages/Dashboard/Index.cshtml | 26 +- .../Pages/Dashboard/Index.css | 138 ++++++++- .../Pages/Dashboard/Index.js | 262 +++++++++++++++++- .../Pages/GrantApplications/Details.js | 17 +- .../GrantApplications/ScoresheetPrint.css | 12 + .../Components/Notifications/Default.js | 4 +- .../abp.resourcemapping.js | 3 - .../src/Unity.GrantManager.Web/package.json | 3 - .../src/Unity.GrantManager.Web/yarn.lock | 15 - 10 files changed, 420 insertions(+), 69 deletions(-) diff --git a/applications/Unity.GrantManager/modules/Unity.AI/src/Unity.AI.Web/Pages/AIReporting/Index.cshtml b/applications/Unity.GrantManager/modules/Unity.AI/src/Unity.AI.Web/Pages/AIReporting/Index.cshtml index a7ffb565f..6e4fd0b43 100644 --- a/applications/Unity.GrantManager/modules/Unity.AI/src/Unity.AI.Web/Pages/AIReporting/Index.cshtml +++ b/applications/Unity.GrantManager/modules/Unity.AI/src/Unity.AI.Web/Pages/AIReporting/Index.cshtml @@ -1,18 +1,9 @@ @page @model Unity.AI.Web.Pages.AIReporting.IndexModel -@section styles { - @if (Model.CanViewAiReporting) - { - - } -} - @section scripts { @if (Model.CanViewAiReporting) { - - diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/Dashboard/Index.cshtml b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/Dashboard/Index.cshtml index be2f3c00a..5cfb43206 100644 --- a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/Dashboard/Index.cshtml +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/Dashboard/Index.cshtml @@ -3,17 +3,14 @@ @using Unity.GrantManager.Web.Pages.Dashboard @section styles { + + - - } @section scripts { + - - - - }
@@ -32,32 +29,27 @@
- + - + - + - + - + - + diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/Dashboard/Index.css b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/Dashboard/Index.css index a6efc06f1..fd85e840d 100644 --- a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/Dashboard/Index.css +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/Dashboard/Index.css @@ -24,10 +24,6 @@ justify-content: center; } -.application-dashboard-dropdown select { - display: none !important; -} - .application-dashboard-date { min-width: 250px; margin-top: 10px; @@ -35,16 +31,136 @@ font-weight: bold; } -.bs-actionsbox { - margin-top: 4px; -} - -.bs-actionsbox .btn-group { +/* Select All / Deselect All controls injected into the Select2 dropdown, + replacing bootstrap-select's actionsBox. */ +.dashboard-actionsbox { display: flex; justify-content: space-between; - gap: 8px; + gap: var(--bc-layout-margin-small); + padding: var(--bc-layout-margin-xsmall); } -.bs-actionsbox .btn-group button { +.dashboard-actionsbox button { + flex: 1 1 auto; width: auto; +} + +/* The filter dropdowns always show a fixed label, so style them as the + toolbar buttons they replace (see .custom-table-btn in unity-styles.css) + rather than as multi-select inputs. */ +.application-dashboard-dropdown .select2-container--bootstrap-5 .select2-selection { + position: relative; + /* Fixed rather than content-driven so all six stay level: "SUB-STATUS" is + long enough to wrap and would otherwise make its box taller. Not + --bc-input-field-height (34px), which nothing in this toolbar uses. */ + height: 38px; + min-height: 38px; + display: flex; + align-items: center; + padding: 0 1.75rem 0 0.75rem; + /* Matches the literal in .custom-table-btn; the theme has no radius token. */ + border-radius: 5px; + background-color: var(--bc-colors-white-primary-500); +} + +.application-dashboard-dropdown .select2-container--bootstrap-5 .select2-selection:hover { + border-color: var(--bc-colors-blue-primary); +} + +/* The label is written straight into the
    , so strip its list styling and + keep it on one line: "SUB-STATUS" wrapping made that box taller than the + other five and broke the row alignment. */ +.application-dashboard-dropdown .select2-container--bootstrap-5 .select2-selection__rendered { + display: block; + /* Grow to fill the button: overflow:hidden below zeroes a flex item's + automatic minimum size, so without this the label collapses and + ellipsises even though there is room for it. */ + flex: 1 1 auto; + margin: 0; + padding: 0; + list-style: none; + color: var(--bc-colors-blue-primary); + /* These filters replaced buttons styled with .btn/.dt-buttons, so use the + theme's button size rather than the base body size. layout.css feeds the + same variable into --bs-btn-font-size. */ + font-size: var(--bc-font-size-btn); + font-weight: 700; + text-transform: uppercase; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +/* Select2 only draws an arrow for single selects, so supply one. */ +.application-dashboard-dropdown .select2-container--bootstrap-5 .select2-selection::after { + content: ""; + position: absolute; + right: 0.75rem; + top: 50%; + transform: translateY(-25%); + border-left: 4px solid transparent; + border-right: 4px solid transparent; + border-top: 5px solid var(--bc-colors-blue-primary); + pointer-events: none; +} + +/* For multiple selects Select2 renders the search field inline in the control, + as a sibling of the label, and the two compete for width. Rather than move + the field (which detaches it from Select2's filtering), swap which one is + visible: label while closed, search while open. */ +.application-dashboard-dropdown .select2-container:not(.select2-container--open) .select2-search--inline { + display: none; +} + +.application-dashboard-dropdown .select2-container--open .select2-selection__rendered { + display: none; +} + +/* Select2 sizes the inline search field to its content, which clips the + placeholder to a character or two. The label is hidden while open, so give + the field the whole control. */ +.application-dashboard-dropdown .select2-container--open .select2-search--inline, +.application-dashboard-dropdown .select2-container--open .select2-search--inline .select2-search__field { + width: 100% !important; + margin: 0; +} + +/* Everything below is scoped to dashboard-filter-dropdown (set via + dropdownCssClass) because Select2 renders panels at the end of , + outside .application-dashboard-dropdown. */ + +/* Selected entries get a light tint and a checkmark rather than the theme's + solid fill, which turned the whole list blue given these filters default to + everything selected. + These selectors deliberately mirror the shape of the ones in + select2-bootstrap-5-theme.css and add .dashboard-filter-dropdown on top: + the theme's are five classes deep, so anything shorter loses to them. */ +.select2-container--bootstrap-5 .select2-dropdown.dashboard-filter-dropdown .select2-results__options .select2-results__option.select2-results__option--selected { + /* Same tint the theme uses for pressed state and DataTables selected rows + (--dt-row-selected is the same colour), so selection reads consistently. */ + background-color: var(--bc-colors-grey-pressed); + color: var(--bc-type-color-primary); +} + +.select2-container--bootstrap-5 .select2-dropdown.dashboard-filter-dropdown .select2-results__options .select2-results__option.select2-results__option--selected::after { + content: "\2713"; + float: right; + color: var(--bc-type-color-primary); +} + +/* Keyboard position: subtle, so it does not look like a hover left behind. + Declared before :hover so that hovering the keyboard-highlighted option + still shows the hover colour, since both carry the same specificity. */ +.select2-container--bootstrap-5 .select2-dropdown.dashboard-filter-dropdown .select2-results__options .select2-results__option.select2-results__option--highlighted { + background-color: var(--bc-colors-grey-hover); + color: var(--bc-type-color-primary); +} + +/* Mouse feedback comes from :hover, not Select2's --highlighted class, which + marks the keyboard position and lingers once the pointer leaves the list. + --bc-colors-blue-hover is the theme's hover tint and is light enough to keep + the text and checkmark readable in their normal colour. */ +.select2-container--bootstrap-5 .select2-dropdown.dashboard-filter-dropdown .select2-results__options .select2-results__option:hover { + background-color: var(--bc-colors-blue-hover); + color: var(--bc-type-color-primary); } \ No newline at end of file diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/Dashboard/Index.js b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/Dashboard/Index.js index 270eafe0f..b150f186f 100644 --- a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/Dashboard/Index.js +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/Dashboard/Index.js @@ -407,18 +407,266 @@ $('#dashboardIntakeId').change(function () { reloadDashboard(); }); -function highlightSelected(dropdownId,title) { +// These dropdowns always show a fixed label (e.g. "STATUS") rather than the +// current selection, so the filter bar keeps a constant width. +function setDropdownLabel(dropdownId, title) { + $('#' + dropdownId) + .next('.select2-container') + .find('.select2-selection__rendered') + .attr('title', title) + .text(title); +} + +function highlightSelected(dropdownId, title) { $('#' + dropdownId + ' option:selected').addClass('dt-button-active'); $('#' + dropdownId + ' option:not(:selected)').removeClass('dt-button-active'); - $('#' + dropdownId).selectpicker('refresh'); - $('#' + dropdownId).closest('.bootstrap-select').find('.btn .filter-option-inner-inner').html(title); - $('#' + dropdownId).closest('.bootstrap-select').find('.btn').removeClass('bs-placeholder'); + setDropdownLabel(dropdownId, title); +} + +// Select2 has no equivalent of bootstrap-select's actionsBox, so build one. +function addSelectAllControls($select) { + const $dropdown = $('.select2-container--open .select2-dropdown'); + if ($dropdown.find('.dashboard-actionsbox').length) { + return; + } + + const $box = $('
    '); + const $selectAll = $(''); + const $deselectAll = $(''); + + const setAll = (selected) => (event) => { + event.preventDefault(); + event.stopPropagation(); + $select.find('option').prop('selected', selected); + // Fires the inline onchange (reloadDashboard) plus our own change handlers. + $select.trigger('change'); + syncResultRows($select); + }; + + $selectAll.on('click', setAll(true)); + $deselectAll.on('click', setAll(false)); + + $box.append($selectAll, $deselectAll); + $dropdown.prepend($box); + + // Select2 leaves --highlighted on the last option the mouse passed over, + // because it doubles as the keyboard position. Left alone it looks like a + // hover that never cleared, so drop it once the pointer leaves the list. + // Select2 reapplies it on the next mousemove or arrow key. + $dropdown.find('.select2-results') + .off('mouseleave.dashboardFilters') + .on('mouseleave.dashboardFilters', function () { + $(this).find('.select2-results__option--highlighted') + .removeClass('select2-results__option--highlighted'); + }); +} + +// Result rows are matched to their