diff --git a/applications/Unity.GrantManager/modules/Unity.AI/src/Unity.AI.Web/Pages/Prompts/Index.cshtml b/applications/Unity.GrantManager/modules/Unity.AI/src/Unity.AI.Web/Pages/Prompts/Index.cshtml index 1b4d2bddd8..4eb0df8069 100644 --- a/applications/Unity.GrantManager/modules/Unity.AI/src/Unity.AI.Web/Pages/Prompts/Index.cshtml +++ b/applications/Unity.GrantManager/modules/Unity.AI/src/Unity.AI.Web/Pages/Prompts/Index.cshtml @@ -22,7 +22,7 @@

@L["AIPrompts"]

- +
@@ -48,7 +48,7 @@
- + diff --git a/applications/Unity.GrantManager/modules/Unity.Flex/src/Unity.Flex.Web/Views/Shared/Components/SelectListDefinitionWidget/Default.cshtml b/applications/Unity.GrantManager/modules/Unity.Flex/src/Unity.Flex.Web/Views/Shared/Components/SelectListDefinitionWidget/Default.cshtml index 516be6f8f6..cf1ad644fa 100644 --- a/applications/Unity.GrantManager/modules/Unity.Flex/src/Unity.Flex.Web/Views/Shared/Components/SelectListDefinitionWidget/Default.cshtml +++ b/applications/Unity.GrantManager/modules/Unity.Flex/src/Unity.Flex.Web/Views/Shared/Components/SelectListDefinitionWidget/Default.cshtml @@ -45,8 +45,8 @@ - - + +
- +

Worksheets

@@ -33,7 +33,7 @@
- +
Published filter diff --git a/applications/Unity.GrantManager/modules/Unity.Identity.Web/src/Pages/Identity/Roles/Index.cshtml b/applications/Unity.GrantManager/modules/Unity.Identity.Web/src/Pages/Identity/Roles/Index.cshtml index 51e0555b49..95399c8d69 100644 --- a/applications/Unity.GrantManager/modules/Unity.Identity.Web/src/Pages/Identity/Roles/Index.cshtml +++ b/applications/Unity.GrantManager/modules/Unity.Identity.Web/src/Pages/Identity/Roles/Index.cshtml @@ -38,7 +38,7 @@
- +
diff --git a/applications/Unity.GrantManager/modules/Unity.Identity.Web/src/Pages/Identity/Roles/PermissionRoleMatrix.cshtml b/applications/Unity.GrantManager/modules/Unity.Identity.Web/src/Pages/Identity/Roles/PermissionRoleMatrix.cshtml index 9b86a080f7..a1dd940807 100644 --- a/applications/Unity.GrantManager/modules/Unity.Identity.Web/src/Pages/Identity/Roles/PermissionRoleMatrix.cshtml +++ b/applications/Unity.GrantManager/modules/Unity.Identity.Web/src/Pages/Identity/Roles/PermissionRoleMatrix.cshtml @@ -55,7 +55,7 @@

Permission-Role Matrix - @CurrentTenant.Name

- +
diff --git a/applications/Unity.GrantManager/modules/Unity.Identity.Web/src/Pages/Identity/Users/EditModal.cshtml b/applications/Unity.GrantManager/modules/Unity.Identity.Web/src/Pages/Identity/Users/EditModal.cshtml index e7fb61ddd3..478a316e7c 100644 --- a/applications/Unity.GrantManager/modules/Unity.Identity.Web/src/Pages/Identity/Users/EditModal.cshtml +++ b/applications/Unity.GrantManager/modules/Unity.Identity.Web/src/Pages/Identity/Users/EditModal.cshtml @@ -22,8 +22,8 @@
- - + + diff --git a/applications/Unity.GrantManager/modules/Unity.Identity.Web/src/Pages/Identity/Users/Index.cshtml b/applications/Unity.GrantManager/modules/Unity.Identity.Web/src/Pages/Identity/Users/Index.cshtml index 37a9c8a2e3..e00d257dff 100644 --- a/applications/Unity.GrantManager/modules/Unity.Identity.Web/src/Pages/Identity/Users/Index.cshtml +++ b/applications/Unity.GrantManager/modules/Unity.Identity.Web/src/Pages/Identity/Users/Index.cshtml @@ -38,7 +38,7 @@
- +
diff --git a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application/Integrations/Cas/InvoiceService.cs b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application/Integrations/Cas/InvoiceService.cs index 9cd659d376..d19c2b67bf 100644 --- a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application/Integrations/Cas/InvoiceService.cs +++ b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Application/Integrations/Cas/InvoiceService.cs @@ -157,16 +157,21 @@ private async Task GetLevel1DecisionUserNameAsync( return string.Empty; } + var fullName = $"{user.Name} {user.Surname}".Trim(); + + if(!string.IsNullOrWhiteSpace(fullName)) + { + return fullName.Length > 150 ? fullName[..150] : fullName; + } + if (!string.IsNullOrWhiteSpace(user.UserName)) { return user.UserName; } - var fullName = $"{user.Name} {user.Surname}".Trim(); + return string.Empty; + - return string.IsNullOrWhiteSpace(fullName) - ? string.Empty - : fullName; } catch (Exception ex) { diff --git a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Web/Pages/PaymentRequests/Index.js b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Web/Pages/PaymentRequests/Index.js index 7239d4cb53..61a8dbcb4a 100644 --- a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Web/Pages/PaymentRequests/Index.js +++ b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Web/Pages/PaymentRequests/Index.js @@ -529,7 +529,8 @@ $(function () { } }, onStateLoaded: function (dtApi, data) { - if (!initialLoad) { + if (!initialLoad && data) { + // A saved state was restored isRestoringState = false; dtApi.ajax.reload(null, false); } @@ -539,9 +540,22 @@ $(function () { contextMenuActionsSelector: '[data-selector="batch-payment-table-actions"]' }); - $('.grp-savedStates').text('Save View'); + // Initialize savedStates button styling $('.grp-savedStates').closest('.btn-group').addClass('cstm-save-view'); + // Update button text based on whether any named saved views exist. + // Driven by the StateRestore extension's own 'stateRestore-change' event (the same + // event it uses internally to update its default label) rather than a localStorage + // key guess or a one-shot draw handler - those raced against the extension's own + // loading of previously-saved states from storage on page refresh. + function updateSavedStatesButtonText() { + const savedStatesExist = dataTable.stateRestore.states().length > 0; + $('.grp-savedStates').text(savedStatesExist ? 'Saved States' : 'Save View'); + } + + dataTable.on('stateRestore-change', updateSavedStatesButtonText); + updateSavedStatesButtonText(); + dataTable.on('column-visibility.dt', function (e, settings, columnIdx) { try { const cols = dataTable.settings()[0].aoColumns; diff --git a/applications/Unity.GrantManager/modules/Unity.Reporting/src/Unity.Reporting.Web/Views/Shared/Components/ReportingConfiguration/Default.cshtml b/applications/Unity.GrantManager/modules/Unity.Reporting/src/Unity.Reporting.Web/Views/Shared/Components/ReportingConfiguration/Default.cshtml index f238989357..063723ecef 100644 --- a/applications/Unity.GrantManager/modules/Unity.Reporting/src/Unity.Reporting.Web/Views/Shared/Components/ReportingConfiguration/Default.cshtml +++ b/applications/Unity.GrantManager/modules/Unity.Reporting/src/Unity.Reporting.Web/Views/Shared/Components/ReportingConfiguration/Default.cshtml @@ -168,7 +168,7 @@
- +
Endpoint Management
- +
diff --git a/applications/Unity.GrantManager/modules/Unity.TenantManagement/src/Unity.TenantManagement.Web/Pages/TenantManagement/Tenants/AssignManagerModal.cshtml b/applications/Unity.GrantManager/modules/Unity.TenantManagement/src/Unity.TenantManagement.Web/Pages/TenantManagement/Tenants/AssignManagerModal.cshtml index c4d7ecc3f4..77cfafd933 100644 --- a/applications/Unity.GrantManager/modules/Unity.TenantManagement/src/Unity.TenantManagement.Web/Pages/TenantManagement/Tenants/AssignManagerModal.cshtml +++ b/applications/Unity.GrantManager/modules/Unity.TenantManagement/src/Unity.TenantManagement.Web/Pages/TenantManagement/Tenants/AssignManagerModal.cshtml @@ -19,8 +19,8 @@ - - + + @foreach (ObjectExtensionPropertyInfo propertyInfo in ObjectExtensionManager.Instance.GetProperties().Where(p => !p.Name.EndsWith("_Text"))) diff --git a/applications/Unity.GrantManager/modules/Unity.TenantManagement/src/Unity.TenantManagement.Web/Pages/TenantManagement/Tenants/EditModal.cshtml b/applications/Unity.GrantManager/modules/Unity.TenantManagement/src/Unity.TenantManagement.Web/Pages/TenantManagement/Tenants/EditModal.cshtml index 5b2b0a4142..1421d24d89 100644 --- a/applications/Unity.GrantManager/modules/Unity.TenantManagement/src/Unity.TenantManagement.Web/Pages/TenantManagement/Tenants/EditModal.cshtml +++ b/applications/Unity.GrantManager/modules/Unity.TenantManagement/src/Unity.TenantManagement.Web/Pages/TenantManagement/Tenants/EditModal.cshtml @@ -17,16 +17,16 @@ - - + +
- - @foreach (var option in Model.CasClientOptions) diff --git a/applications/Unity.GrantManager/sonar-project.properties b/applications/Unity.GrantManager/sonar-project.properties index ef578dfb60..dd79cd7e17 100644 --- a/applications/Unity.GrantManager/sonar-project.properties +++ b/applications/Unity.GrantManager/sonar-project.properties @@ -12,11 +12,28 @@ sonar.projectDescription=Grant management application for the Province of Britis sonar.sources=src,modules sonar.tests=test -# Quality gate settings (from Azure SonarQube) +# Quality gate settings 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/** +# SonarQube Exclusions (generic build artifacts and generated code only) +sonar.exclusions=src/Unity.GrantManager.EntityFrameworkCore/Migrations/**,src/Unity.GrantManager.EntityFrameworkCore/Scripts/**,**/bin/**,**/obj/**,**/wwwroot/lib/**,**/*.Designer.cs,**/node_modules/** + +# Rule exclusion: javascript:S7721 "Functions should be moved to the highest possible scope" +# Disabled project-wide for JS. ABP renders pages by composing many independent widgets, +# and dynamically bundles each widget's scripts together onto whatever page happens to +# host them, at runtime. Widgets have no visibility into what else will be on the same +# page, so the established, intentional pattern across this codebase is to nest each +# widget's helper functions inside its own $(function(){...}) DOM-ready handler, using +# that nesting as the widget's isolation boundary against same-named helpers in other +# widgets (e.g. formatItems, responseCallback, updatePreview are common names reused +# across many widgets). S7721 pushes these helpers up to module/global scope, which +# breaks that isolation and creates real cross-widget name collisions that the rule +# has no way to detect, since it only ever sees one file at a time. This has already +# caused a production bug (two widgets bundled onto the same page silently overwrote +# each other's same-named global function). Keep the nesting. +sonar.issue.ignore.multicriteria=e1 +sonar.issue.ignore.multicriteria.e1.ruleKey=javascript:S7721 +sonar.issue.ignore.multicriteria.e1.resourceKey=**/*.js # Test exclusions sonar.test.exclusions=**/bin/**,**/obj/** @@ -24,7 +41,7 @@ sonar.test.exclusions=**/bin/**,**/obj/** # Coverage analysis explicitly disabled (excludes all files from coverage) sonar.coverage.exclusions=**/* -# Code duplication exclusions (from existing Azure configuration + all files) +# Code duplication exclusions sonar.cpd.exclusions=**/*.aspx,**/*.aspx.designer.cs,**/*.cshtml,**/*.html,**/*.js,**/* # SCM settings diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Domain/GrantManagerDefaultTenantSeederContributor.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.Domain/GrantManagerDefaultTenantSeederContributor.cs index c817bed8ca..018f65c58f 100644 --- a/applications/Unity.GrantManager/src/Unity.GrantManager.Domain/GrantManagerDefaultTenantSeederContributor.cs +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Domain/GrantManagerDefaultTenantSeederContributor.cs @@ -83,7 +83,7 @@ private async Task SeedOnboardingTenantAsync() // "Unity.Onboarding" = SpecializationConsts.Onboarding; "T" = TenantFeatureValueProvider.ProviderName await _featureManager.SetAsync( "Unity.Onboarding", - "true", + "True", "T", newTenant.Id.ToString()); } diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/Applicants/Index.js b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/Applicants/Index.js index 041ac4eaff..46c9c51dd3 100644 --- a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/Applicants/Index.js +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/Applicants/Index.js @@ -650,9 +650,22 @@ $(function () { }); // For savedStates - $('.grp-savedStates').text('Save View'); + // Initialize button styling $('.grp-savedStates').closest('.btn-group').addClass('cstm-save-view'); + // Update button text based on whether any named saved views exist. + // Driven by the StateRestore extension's own 'stateRestore-change' event (the same + // event it uses internally to update its default label) rather than a localStorage + // key guess or a one-shot draw handler - those raced against the extension's own + // loading of previously-saved states from storage on page refresh. + function updateSavedStatesButtonText() { + const savedStatesExist = dataTable.stateRestore.states().length > 0; + $('.grp-savedStates').text(savedStatesExist ? 'Saved States' : 'Save View'); + } + + dataTable.on('stateRestore-change', updateSavedStatesButtonText); + updateSavedStatesButtonText(); + // Subscribe to refresh events PubSub.subscribe('refresh_applicant_list', (msg, data) => { dataTable.ajax.reload(null, false); diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/ApplicationForms/Index.cshtml b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/ApplicationForms/Index.cshtml index 433e35701a..663bf9772b 100644 --- a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/ApplicationForms/Index.cshtml +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/ApplicationForms/Index.cshtml @@ -30,7 +30,7 @@

@L["ApplicationForms"]

- +
diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/ApplicationForms/Mapping.cshtml b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/ApplicationForms/Mapping.cshtml index ca9ed8bfca..4d20a2bf76 100644 --- a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/ApplicationForms/Mapping.cshtml +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/ApplicationForms/Mapping.cshtml @@ -356,7 +356,7 @@ + cols="80" aria-label="Mapping JSON">@Model?.ApplicationFormVersionDto?.SubmissionHeaderMapping - + diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/ConfigurationManagement/Index.cshtml b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/ConfigurationManagement/Index.cshtml index d94f3f4ba3..2636b8fc95 100644 --- a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/ConfigurationManagement/Index.cshtml +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/ConfigurationManagement/Index.cshtml @@ -139,7 +139,7 @@

Account Codes

- +
@@ -161,7 +161,7 @@ - Payment ID Prefix + 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 cceadeda4c..eef2868ee3 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 @@ -329,7 +329,7 @@
- + 0; + $('.grp-savedStates').text(savedStatesExist ? 'Saved States' : 'Save View'); + } + + dataTable.on('stateRestore-change', updateSavedStatesButtonText); + updateSavedStatesButtonText(); + // Helper function to restore custom filters when loading table views. function restoreCustomFilters(filters) { UIElements.searchField.val(filters.searchValue || ''); diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/GrantPrograms/Index.cshtml b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/GrantPrograms/Index.cshtml index 71b133178a..9a75c7e436 100644 --- a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/GrantPrograms/Index.cshtml +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/GrantPrograms/Index.cshtml @@ -28,7 +28,7 @@

@L["GrantPrograms"]

- +
diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/Intakes/Index.cshtml b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/Intakes/Index.cshtml index 0df238eae8..2c5dd6875c 100644 --- a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/Intakes/Index.cshtml +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/Intakes/Index.cshtml @@ -25,7 +25,7 @@

@L["Intakes"]

- +
diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/PaymentHistory/Details.cshtml b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/PaymentHistory/Details.cshtml index 557fb5bb3f..1ade8b64cd 100644 --- a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/PaymentHistory/Details.cshtml +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/PaymentHistory/Details.cshtml @@ -29,7 +29,7 @@

Payment History

- +
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 274ae5d1a7..fa4b64e81d 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 @@ -15,7 +15,7 @@
- +
- +
- + Previous Funding History
- +
@@ -38,7 +38,7 @@

- +