@@ -277,7 +266,7 @@ $(function () {
}
function buildTextAreaFieldPreview(item) {
- let req = item.dataset.required ? "required" : null;
+ let req = item.dataset.required === 'True' ? "required" : null;
return `
${sanitizeHtml(item.dataset.questiondesc)}
@@ -296,6 +285,7 @@ $(function () {
const truncatedValue = option.value.length > 100 ? option.value.substring(0, 100) + " ..." : option.value;
return `
`;
}).join('');
+ let req = item.dataset.required === 'True' ? "required" : null;
return `
${sanitizeHtml(item.dataset.questiondesc)}
@@ -304,15 +294,17 @@ $(function () {
+
`;
}
function buildNumberFieldPreview(item) {
- let req = item.dataset.required ? "required" : null;
+ let req = item.dataset.required === 'True' ? "required" : null;
return `
${sanitizeHtml(item.dataset.questiondesc)}
@@ -325,6 +317,8 @@ $(function () {
}
function buildYesNoFieldPreview(item) {
+ let req = item.dataset.required === 'True' ? "required" : null;
+
return `
${sanitizeHtml(item.dataset.questiondesc)}
@@ -332,6 +326,7 @@ $(function () {
+
`;
}
function buildTextFieldPreview(item) {
- let req = item.dataset.required ? "required" : null;
+ let req = item.dataset.required === 'True' ? "required" : null;
return `
${sanitizeHtml(item.dataset.questiondesc)}
@@ -497,24 +493,124 @@ function savePreviewChanges(questionId, inputFieldPrefix, saveButtonPrefix, disc
updateSubtotal();
}
-function savePreviewSectionChanges(formId, sectionId) {
- const secSaveButton = document.getElementById('scoresheet-section-save-' + sectionId);
- const secDiscardButton = document.getElementById('scoresheet-section-discard-' + sectionId);
+// sectionId (hashCode-derived) -> { isDirty: bool, isValid: bool }
+// Kept separate from AssessmentScoresWidget's scoresheetSectionState: this
+// preview has no assessment, no backend save, and its own hashCode-based
+// section id scheme, so it tracks and acts on its own bulk button pair.
+let previewSectionState = {};
+
+function resetPreviewSectionState() {
+ previewSectionState = {};
+ refreshPreviewBulkActionButtons();
+}
+
+function getDirtyPreviewSectionIds() {
+ return Object.keys(previewSectionState).filter(
+ (id) => previewSectionState[id].isDirty
+ );
+}
+
+function updatePreviewSectionHeaderStyle(sectionId, isDirty) {
+ const headerButton = document.querySelector(
+ '#panel-' + sectionId + ' .accordion-button'
+ );
+ if (headerButton) {
+ headerButton.classList.toggle('section-unsaved', isDirty);
+ }
+}
- const assessmentAnswersArr = [];
- const inputFieldArr = [];
- const origAnswersArr = [];
- const formData = $(`#${formId}`).serializeArray();
+function refreshPreviewBulkActionButtons() {
+ const states = Object.values(previewSectionState);
+ const anyDirty = states.some((s) => s.isDirty);
+ const anyInvalidDirty = states.some((s) => s.isDirty && !s.isValid);
- //Handle form object data
- $.each(formData, function (_, inputData) {
- buildFormData(assessmentAnswersArr, inputData, inputFieldArr, origAnswersArr);
+ const saveAllBtn = document.getElementById('previewSaveAllBtn');
+ const discardAllBtn = document.getElementById('previewDiscardAllBtn');
+ if (discardAllBtn) discardAllBtn.disabled = !anyDirty;
+ if (saveAllBtn) saveAllBtn.disabled = !anyDirty || anyInvalidDirty;
+}
+
+// Registered as an extension hook that AssessmentScoresWidget/Default.js's
+// shared handleInputChange() calls after validating a section - this script
+// bundles alongside it on the Scoresheet configuration page (see
+// ScoresheetViewComponent's script bundle contributor).
+globalThis.onScoresheetSectionValidated = function (sectionId, isDirty, isInvalid) {
+ previewSectionState[sectionId] = { isDirty, isValid: !isInvalid };
+ updatePreviewSectionHeaderStyle(sectionId, isDirty);
+ refreshPreviewBulkActionButtons();
+};
+
+// Local-only "save": there is no real assessment to persist to here, this
+// just accepts the current values as the new baseline, same as clicking
+// Save All would visually communicate on the real page.
+function savePreviewAllSections() {
+ const dirtySectionIds = getDirtyPreviewSectionIds();
+ if (dirtySectionIds.length === 0) return;
+
+ dirtySectionIds.forEach((sectionId) => {
+ const answersArr = [];
+ const inputFieldArr = [];
+ const origAnswersArr = [];
+ $.each(
+ $(`#section-form-${sectionId}`).serializeArray(),
+ function (_, inputData) {
+ buildFormData(answersArr, inputData, inputFieldArr, origAnswersArr);
+ }
+ );
+
+ inputFieldArr.forEach((fieldId) => {
+ const el = document.getElementById(fieldId);
+ if (el) {
+ el.dataset.originalValue = el.value;
+ }
+ const questionId = fieldId.split('-').slice(2).join('-');
+ updateQuestionHeaderStyle(questionId, false);
+ });
+
+ previewSectionState[sectionId] = { isDirty: false, isValid: true };
+ updatePreviewSectionHeaderStyle(sectionId, false);
});
- secSaveButton.disabled = true;
- secDiscardButton.disabled = true;
+ updateSubtotal();
+ refreshPreviewBulkActionButtons();
+}
+
+function discardAllPreviewSections() {
+ const dirtySectionIds = getDirtyPreviewSectionIds();
+ if (dirtySectionIds.length === 0) return;
+
+ dirtySectionIds.forEach((sectionId) => {
+ const answersArr = [];
+ const inputFieldArr = [];
+ const origAnswersArr = [];
+ $.each(
+ $(`#section-form-${sectionId}`).serializeArray(),
+ function (_, inputData) {
+ buildFormData(answersArr, inputData, inputFieldArr, origAnswersArr);
+ }
+ );
+
+ inputFieldArr.forEach((fieldId) => {
+ const questionId = fieldId.split('-').slice(2).join('-');
+ const el = document.getElementById(fieldId);
+ el.value = el.dataset.originalValue;
+
+ const errorMessage = document.getElementById(
+ 'error-message-' + questionId
+ );
+ if (errorMessage) {
+ errorMessage.textContent = '';
+ }
+
+ updateQuestionHeaderStyle(questionId, false);
+ });
+
+ previewSectionState[sectionId] = { isDirty: false, isValid: true };
+ updatePreviewSectionHeaderStyle(sectionId, false);
+ });
updateSubtotal();
+ refreshPreviewBulkActionButtons();
}
diff --git a/applications/Unity.GrantManager/modules/Unity.Flex/src/Unity.Flex.Web/Views/Shared/Components/WorksheetInstanceWidget/Default.css b/applications/Unity.GrantManager/modules/Unity.Flex/src/Unity.Flex.Web/Views/Shared/Components/WorksheetInstanceWidget/Default.css
index 15c648cc60..475de28ae1 100644
--- a/applications/Unity.GrantManager/modules/Unity.Flex/src/Unity.Flex.Web/Views/Shared/Components/WorksheetInstanceWidget/Default.css
+++ b/applications/Unity.GrantManager/modules/Unity.Flex/src/Unity.Flex.Web/Views/Shared/Components/WorksheetInstanceWidget/Default.css
@@ -1,6 +1,6 @@
.control-render-error {
display: block;
- background-color: red;
+ background-color: #cc0000;
text-align: center;
padding: 5px;
color: #fff;
diff --git a/applications/Unity.GrantManager/modules/Unity.Identity.Web/src/Navigation/UnityIdentityWebMainMenuContributor.cs b/applications/Unity.GrantManager/modules/Unity.Identity.Web/src/Navigation/UnityIdentityWebMainMenuContributor.cs
index 9d7f2b6896..2579dcbeb8 100644
--- a/applications/Unity.GrantManager/modules/Unity.Identity.Web/src/Navigation/UnityIdentityWebMainMenuContributor.cs
+++ b/applications/Unity.GrantManager/modules/Unity.Identity.Web/src/Navigation/UnityIdentityWebMainMenuContributor.cs
@@ -17,7 +17,7 @@ public virtual Task ConfigureMenuAsync(MenuConfigurationContext context)
var l = context.GetLocalizer
();
- var identityMenuItem = new ApplicationMenuItem(UnityIdentityMenuNames.GroupName, l["Menu:IdentityManagement"], icon: "fa fa-id-card-o");
+ var identityMenuItem = new ApplicationMenuItem(UnityIdentityMenuNames.GroupName, l["Menu:IdentityManagement"], icon: "fa-regular fa-id-card");
identityMenuItem.AddItem(new ApplicationMenuItem(UnityIdentityMenuNames.Roles, l["Roles"], url: "~/Identity/Roles").RequirePermissions(IdentityPermissions.Roles.Default));
identityMenuItem.AddItem(new ApplicationMenuItem(UnityIdentityMenuNames.Users, l["Users"], url: "~/Identity/Users").RequirePermissions(IdentityPermissions.Users.Default));
diff --git a/applications/Unity.GrantManager/modules/Unity.Identity.Web/src/Pages/Identity/Users/index.js b/applications/Unity.GrantManager/modules/Unity.Identity.Web/src/Pages/Identity/Users/index.js
index a5189339e8..094f1f124a 100644
--- a/applications/Unity.GrantManager/modules/Unity.Identity.Web/src/Pages/Identity/Users/index.js
+++ b/applications/Unity.GrantManager/modules/Unity.Identity.Web/src/Pages/Identity/Users/index.js
@@ -194,7 +194,7 @@ $(function () {
if (!row.isActive) {
return ' ' +
+ '" class="fa-solid fa-ban text-danger"> ' +
'' + row.userName + '';
}
diff --git a/applications/Unity.GrantManager/modules/Unity.Notifications/src/Unity.Notifications.Application/EmailNotificaions/EmailNotificationService.cs b/applications/Unity.GrantManager/modules/Unity.Notifications/src/Unity.Notifications.Application/EmailNotificaions/EmailNotificationService.cs
index 0abcfd1e37..f350797571 100644
--- a/applications/Unity.GrantManager/modules/Unity.Notifications/src/Unity.Notifications.Application/EmailNotificaions/EmailNotificationService.cs
+++ b/applications/Unity.GrantManager/modules/Unity.Notifications/src/Unity.Notifications.Application/EmailNotificaions/EmailNotificationService.cs
@@ -4,12 +4,13 @@
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
using System;
-using System.IO;
using System.Collections.Generic;
+using System.IO;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
+using Unity.AspNetCore.Mvc.UI.Theme.UX2.Renderers;
using Unity.GrantManager.Notifications;
using Unity.Notifications.Emails;
using Unity.Notifications.Permissions;
@@ -32,7 +33,8 @@ public class EmailNotificationService(
ISettingManager settingManager,
IFeatureChecker featureChecker,
IConfiguration configuration,
- IWebHostEnvironment webHostEnvironment) : ApplicationService, IEmailNotificationService
+ IWebHostEnvironment webHostEnvironment,
+ IMarkdownRenderer markdownRenderer) : ApplicationService, IEmailNotificationService
{
public async Task InitializeDraftAsync(Guid applicationId)
@@ -251,7 +253,7 @@ private async Task UpdateTenantSettings(string settingKey, string valueString)
/// Renders the comment notification email template with the provided parameters.
///
/// Display name of the user who mentioned
- /// The comment body text (may contain HTML)
+ /// The comment body text
/// The URL link to view the comment
/// Rendered HTML email body
private async Task RenderCommentNotificationTemplateAsync(string currentUserText, string commentBody, string commentLink)
@@ -259,11 +261,16 @@ private async Task RenderCommentNotificationTemplateAsync(string current
// Load template from embedded resources or file system
string templateContent = await LoadEmailTemplateAsync("CommentNotification");
+ var encodedCurrentUserText = WebUtility.HtmlEncode(currentUserText);
+ var encodedCommentBody = markdownRenderer.Render(commentBody);
+ var encodedCommentLink = WebUtility.HtmlEncode(commentLink);
+
// Replace placeholders with actual values
var renderedTemplate = templateContent
- .Replace("@Model.CurrentUserText", currentUserText)
- .Replace("@Html.Raw(Model.CommentBody)", commentBody)
- .Replace("@Model.CommentLink", commentLink);
+ .Replace("@Model.CurrentUserText", encodedCurrentUserText)
+ .Replace("@Html.Raw(Model.CommentBody)", encodedCommentBody)
+ .Replace("@Model.CommentLink", encodedCommentLink)
+ .Replace("@model dynamic", string.Empty);
return renderedTemplate;
}
diff --git a/applications/Unity.GrantManager/modules/Unity.Notifications/src/Unity.Notifications.Application/Unity.Notifications.Application.csproj b/applications/Unity.GrantManager/modules/Unity.Notifications/src/Unity.Notifications.Application/Unity.Notifications.Application.csproj
index 7a8eacb9a4..5dd709e5a3 100644
--- a/applications/Unity.GrantManager/modules/Unity.Notifications/src/Unity.Notifications.Application/Unity.Notifications.Application.csproj
+++ b/applications/Unity.GrantManager/modules/Unity.Notifications/src/Unity.Notifications.Application/Unity.Notifications.Application.csproj
@@ -24,6 +24,7 @@
+
diff --git a/applications/Unity.GrantManager/modules/Unity.Notifications/src/Unity.Notifications.Web/Views/Settings/NotificationsSettingGroup/InternalEmailGroups.js b/applications/Unity.GrantManager/modules/Unity.Notifications/src/Unity.Notifications.Web/Views/Settings/NotificationsSettingGroup/InternalEmailGroups.js
index 538c9c590a..8092c7b82c 100644
--- a/applications/Unity.GrantManager/modules/Unity.Notifications/src/Unity.Notifications.Web/Views/Settings/NotificationsSettingGroup/InternalEmailGroups.js
+++ b/applications/Unity.GrantManager/modules/Unity.Notifications/src/Unity.Notifications.Web/Views/Settings/NotificationsSettingGroup/InternalEmailGroups.js
@@ -37,7 +37,7 @@ const emailGroupsManager = {
const buttonClass = row.isNew ? 'remove-selected-user' : 'remove-user-btn';
const dataAttr = row.isNew ? `data-user-id="${row.userId}"` : `data-group-user-id="${row.id}"`;
return ``;
}
}
@@ -63,21 +63,33 @@ const emailGroupsManager = {
};
},
+ // Escape untrusted values for safe insertion into HTML text and attribute contexts
+ escapeHtml: function(value) {
+ return String(value ?? '')
+ .replaceAll('&', '&')
+ .replaceAll('<', '<')
+ .replaceAll('>', '>')
+ .replaceAll("\"", '"')
+ .replaceAll('\'', ''');
+ },
+
// Generate dropdown item HTML for users
generateUserDropdownItem: function(user) {
const firstName = user.name ? user.name.split(' ')[0] : '';
const lastName = user.surname || '';
+ const displayName = this.escapeHtml(user.userName || user.name || 'Unknown');
+ const email = this.escapeHtml(user.email || '');
return `
+ data-user-id="${this.escapeHtml(user.id)}"
+ data-user-name="${displayName}"
+ data-user-email="${email}"
+ data-first-name="${this.escapeHtml(firstName)}"
+ data-last-name="${this.escapeHtml(lastName)}">
- ${user.userName || user.name || 'Unknown'}
- ${user.email || ''}
+ ${displayName}
+ ${email}
@@ -372,7 +384,7 @@ const emailGroupsManager = {
@@ -559,6 +571,9 @@ const emailGroupsManager = {
let pendingUserAdditions = [];
let pendingUserRemovals = [];
+ const escapedGroupName = emailGroupsManager.utils.escapeHtml(group.name);
+ const escapedGroupDescription = emailGroupsManager.utils.escapeHtml(group.description || '');
+
const modalHtml = `
@@ -142,13 +142,13 @@
@if (Model.PaymentGroupings[k].Items.Any(x => !x.IsValid))
{
-
+
}
else
{
-
-
-
+
+
+
}
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 60a2e62727..e5c8a669e5 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/modules/Unity.Payments/src/Unity.Payments.Web/Pages/PaymentRequests/CreateHistoricalPayments.cshtml b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Web/Pages/PaymentRequests/CreateHistoricalPayments.cshtml
index 19f6b69409..73cbbb924f 100644
--- a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Web/Pages/PaymentRequests/CreateHistoricalPayments.cshtml
+++ b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Web/Pages/PaymentRequests/CreateHistoricalPayments.cshtml
@@ -54,7 +54,7 @@
@if (ViewData["Error"] != null)
{
- @ViewData["Error"]
+ @ViewData["Error"]
}
else
@@ -108,7 +108,7 @@
size="Small"
icon-type="Other"
class="m-0 p-0 remove-single-payment"
- icon="fa fa-times"
+ icon="fa-solid fa-xmark"
data-parameter="@item.CorrelationId" />
diff --git a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Web/Pages/PaymentRequests/CreatePaymentRequests.cshtml b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Web/Pages/PaymentRequests/CreatePaymentRequests.cshtml
index 2c25168f17..77e4020b9a 100644
--- a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Web/Pages/PaymentRequests/CreatePaymentRequests.cshtml
+++ b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Web/Pages/PaymentRequests/CreatePaymentRequests.cshtml
@@ -58,7 +58,7 @@
@if (ViewData["Error"] != null)
{
- @ViewData["Error"]
+ @ViewData["Error"]
}
else
@@ -67,15 +67,15 @@
-
-
+
+
-
+
-
+
@@ -157,7 +157,7 @@
size="Small"
icon-type="Other"
class="m-0 p-0 remove-single-payment"
- icon="fa fa-times"
+ icon="fa-solid fa-xmark"
data-parameter="@item.CorrelationId" />
diff --git a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Web/Pages/PaymentRequests/Index.css b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Web/Pages/PaymentRequests/Index.css
index b9c1c99a52..7343f98d3a 100644
--- a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Web/Pages/PaymentRequests/Index.css
+++ b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Web/Pages/PaymentRequests/Index.css
@@ -75,22 +75,22 @@
}
.payment-status-transition-ban {
- color: #FF0909;
+ color: #C80000;
font-size: 1rem;
cursor: pointer;
}
#PaymentRequestListTable .error-icon {
- color: #FF0909;
+ color: #C80000;
}
#PaymentRequestListTable .error-icon-selected {
- color: #FF0909;
+ color: #C80000;
}
#PaymentRequestListTable .error-row td {
background-color: #FEEAEA;
- color: #FF0909 !important;
+ color: #C80000 !important;
}
/* DataTables stateRestore - Save View */
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 61a8dbcb4a..532a7e48d4 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
@@ -543,14 +543,9 @@ $(function () {
// 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.
+ // Update button text to Save View
function updateSavedStatesButtonText() {
- const savedStatesExist = dataTable.stateRestore.states().length > 0;
- $('.grp-savedStates').text(savedStatesExist ? 'Saved States' : 'Save View');
+ $('.grp-savedStates').text('Save View');
}
dataTable.on('stateRestore-change', updateSavedStatesButtonText);
@@ -758,7 +753,7 @@ $(function () {
index: columnIndex,
render: function (data, _, row) {
if (row.errorSummary != null && row.errorSummary !== '') {
- return `${data} `;
+ return `${data} `;
} else {
return data;
}
diff --git a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Web/Pages/PaymentTags/PaymentTagsSelectionModal.cshtml b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Web/Pages/PaymentTags/PaymentTagsSelectionModal.cshtml
index 5e9c96b0d8..797484f2d7 100644
--- a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Web/Pages/PaymentTags/PaymentTagsSelectionModal.cshtml
+++ b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Web/Pages/PaymentTags/PaymentTagsSelectionModal.cshtml
@@ -19,7 +19,7 @@
@if (ViewData["Error"] != null)
{
- @ViewData["Error"]
+ @ViewData["Error"]
}
else
diff --git a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Web/Views/Shared/Components/SupplierInfo/Default.cshtml b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Web/Views/Shared/Components/SupplierInfo/Default.cshtml
index bbd81aeee5..c6e08bc92d 100644
--- a/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Web/Views/Shared/Components/SupplierInfo/Default.cshtml
+++ b/applications/Unity.GrantManager/modules/Unity.Payments/src/Unity.Payments.Web/Views/Shared/Components/SupplierInfo/Default.cshtml
@@ -52,9 +52,9 @@
id="btnClearSupplierNo"
title="Remove supplier number"
type="button"
- icon="xmark"
+ icon-type="Other"
+ icon="fa-solid fa-xmark"
class="clear-btn">
-
} else
{
diff --git a/applications/Unity.GrantManager/modules/Unity.Reporting/src/Unity.Reporting.Web/Pages/ReportingAdmin/Configuration/DatabaseInfoModal.cshtml b/applications/Unity.GrantManager/modules/Unity.Reporting/src/Unity.Reporting.Web/Pages/ReportingAdmin/Configuration/DatabaseInfoModal.cshtml
index ff9a7730b9..64d4c141a0 100644
--- a/applications/Unity.GrantManager/modules/Unity.Reporting/src/Unity.Reporting.Web/Pages/ReportingAdmin/Configuration/DatabaseInfoModal.cshtml
+++ b/applications/Unity.GrantManager/modules/Unity.Reporting/src/Unity.Reporting.Web/Pages/ReportingAdmin/Configuration/DatabaseInfoModal.cshtml
@@ -22,7 +22,7 @@
@foreach (var role in Model.DatabaseInfo.DatabaseRoles)
{
- @role
+ @role
}
@@ -42,7 +42,7 @@
@foreach (var view in Model.DatabaseInfo.ReportingViews)
{
- @view
+ @view
}
diff --git a/applications/Unity.GrantManager/modules/Unity.Reporting/src/Unity.Reporting.Web/Pages/ReportingAdmin/Configuration/Index.cshtml b/applications/Unity.GrantManager/modules/Unity.Reporting/src/Unity.Reporting.Web/Pages/ReportingAdmin/Configuration/Index.cshtml
index 62e111b10e..dd0b637f99 100644
--- a/applications/Unity.GrantManager/modules/Unity.Reporting/src/Unity.Reporting.Web/Pages/ReportingAdmin/Configuration/Index.cshtml
+++ b/applications/Unity.GrantManager/modules/Unity.Reporting/src/Unity.Reporting.Web/Pages/ReportingAdmin/Configuration/Index.cshtml
@@ -48,7 +48,7 @@
aria-label="@($"View role for {tenantRole.TenantName}")" />
@if (tenantRole.IsDefaultInferred)
{
-
@@ -61,21 +61,21 @@
class="btn btn-sm btn-outline-primary save-role-btn"
data-tenant-id="@tenantRole.TenantId"
title="Save Role">
- Save
+ Save
diff --git a/applications/Unity.GrantManager/modules/Unity.Reporting/src/Unity.Reporting.Web/Pages/ReportingAdmin/Configuration/Index.css b/applications/Unity.GrantManager/modules/Unity.Reporting/src/Unity.Reporting.Web/Pages/ReportingAdmin/Configuration/Index.css
index 3b043b519e..df3a7d6839 100644
--- a/applications/Unity.GrantManager/modules/Unity.Reporting/src/Unity.Reporting.Web/Pages/ReportingAdmin/Configuration/Index.css
+++ b/applications/Unity.GrantManager/modules/Unity.Reporting/src/Unity.Reporting.Web/Pages/ReportingAdmin/Configuration/Index.css
@@ -73,7 +73,7 @@
/* Table header styling - match the user config pattern */
#TenantViewRoleTable thead th {
- background-color: #859ab9 !important;
+ background-color: #55698A !important;
color: white !important;
font-weight: 500 !important;
font-size: 18px !important;
@@ -82,7 +82,7 @@
}
#TenantViewRoleTable thead th:hover {
- background-color: #6c7b95 !important;
+ background-color: #3E4C63 !important;
color: white !important;
}
diff --git a/applications/Unity.GrantManager/modules/Unity.Reporting/src/Unity.Reporting.Web/Pages/ReportingAdmin/Configuration/Index.js b/applications/Unity.GrantManager/modules/Unity.Reporting/src/Unity.Reporting.Web/Pages/ReportingAdmin/Configuration/Index.js
index d4511e78f5..7abdccfd0c 100644
--- a/applications/Unity.GrantManager/modules/Unity.Reporting/src/Unity.Reporting.Web/Pages/ReportingAdmin/Configuration/Index.js
+++ b/applications/Unity.GrantManager/modules/Unity.Reporting/src/Unity.Reporting.Web/Pages/ReportingAdmin/Configuration/Index.js
@@ -63,7 +63,7 @@ $(function () {
return;
}
- button.prop('disabled', true).html('
Saving...');
+ button.prop('disabled', true).html('
Saving...');
_tenantViewRoleAppService.update(tenantId, { viewRole: viewRole })
.done(function (_) {
@@ -83,7 +83,7 @@ $(function () {
abp.notify.error('Failed to save view role.');
})
.always(function () {
- button.prop('disabled', false).html('
Save');
+ button.prop('disabled', false).html('
Save');
});
});
@@ -134,7 +134,7 @@ $(function () {
// Function to save role and then assign to views
function saveAndAssignRole(tenantId, tenantName, viewRole, button, row) {
- button.prop('disabled', true).html('
Saving & Assigning...');
+ button.prop('disabled', true).html('
Saving & Assigning...');
_tenantViewRoleAppService.update(tenantId, { viewRole: viewRole })
.done(function (result) {
@@ -153,13 +153,13 @@ $(function () {
})
.fail(function () {
abp.notify.error('Failed to save view role.');
- button.prop('disabled', false).html('
Assign to Views');
+ button.prop('disabled', false).html('
Assign to Views');
});
}
// Function to assign role to views
function assignRoleToViews(tenantId, tenantName, viewRole, button) {
- button.prop('disabled', true).html('
Assigning...');
+ button.prop('disabled', true).html('
Assigning...');
_tenantViewRoleAppService.assignRoleToViews(tenantId)
.done(function () {
@@ -169,7 +169,7 @@ $(function () {
abp.notify.error('Failed to queue role assignment jobs.');
})
.always(function () {
- button.prop('disabled', false).html('
Assign to Views');
+ button.prop('disabled', false).html('
Assign to Views');
});
}
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 063723ecef..2d916282b9 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
@@ -176,7 +176,7 @@
data-bs-toggle="tooltip"
data-bs-placement="top"
data-bs-original-title="There are duplicate keys detected and catered for, this may affect the view generation and resulting data">
-
+
Duplicate Keys
@@ -187,7 +187,7 @@
data-bs-toggle="tooltip"
data-bs-placement="top"
data-bs-original-title="A DataGrid has dynamic columns but no matching field mapping was found in the form submission schema. Map the worksheet DataGrid to a CHEFS form field to resolve the individual columns.">
-
+
Unmapped DataGrid
@@ -236,7 +236,7 @@