diff --git a/applications/Unity.GrantManager/global.json b/applications/Unity.GrantManager/global.json index c396020fc7..bc8f2009c3 100644 --- a/applications/Unity.GrantManager/global.json +++ b/applications/Unity.GrantManager/global.json @@ -1,7 +1,7 @@ { "sdk": { "version": "10.0.303", - "rollForward": "latestPatch", + "rollForward": "latestFeature", "allowPrerelease": false } } diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/UnityAdmin/Index.css b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/UnityAdmin/Index.css index b1a25b3400..4992030f9c 100644 --- a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/UnityAdmin/Index.css +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/UnityAdmin/Index.css @@ -54,12 +54,6 @@ margin-top: 10px; } -#reconciliation-report-div, -#audit-logs-div, -#audit-log-settings-div { - margin-top: 0; -} - #audit-logs-div .reconciliation-filter-inputs { align-items: center; } @@ -119,6 +113,17 @@ margin-top:20px; } +/* DataTable sections: ScrollResize sizes the scroll body to the viewport so the + table footer sits at the bottom of the page; the card must not clip or scroll it. */ +#reconciliation-report-div, +#audit-logs-div, +#ai-prompts-div, +#endpoints-div, +#exception-logs-div { + max-height: none; + overflow: visible; +} + .unity-app-main-container { margin: auto; display: flex; diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/UnityAdmin/Index.js b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/UnityAdmin/Index.js index dc9c3ac795..b6c2dee11b 100644 --- a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/UnityAdmin/Index.js +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Pages/UnityAdmin/Index.js @@ -235,6 +235,14 @@ $(function () { $.fn.dataTable.tables({ visible: true, api: true }).columns.adjust().draw(false); } + // Size the scroll body so the table footer sits at the bottom of the viewport, + // matching initializeDataTable({ fixedHeaders: true }) used by the other admin tables. + function enableScrollResize(dt) { + if ($.fn.dataTable.ScrollResize) { + dt.settings()[0]._scrollResize = new $.fn.dataTable.ScrollResize(dt); + } + } + function initializeDateFilters() { let range = getDateRange(defaultQuickDateRange); setDateRangeFilters(defaultQuickDateRange, range); @@ -313,6 +321,8 @@ $(function () { }, externalSearchInputId: '#search', scrollX: true, + scrollY: 'calc(100vh - 325px)', // Initial value – ScrollResize recalculates dynamically + scrollCollapse: true, ajax: abp.libs.datatables.createAjax( unity.grantManager.intakes.submission.getSubmissionsList, function () { @@ -396,6 +406,8 @@ $(function () { }) ); + enableScrollResize(recDt); + // Initialize FilterRow plugin on the button if ($.fn.dataTable.FilterRow !== 'undefined') { new $.fn.dataTable.FilterRow(recDt.settings()[0], { // NOSONAR - False positive flag on S1848 @@ -563,6 +575,8 @@ $(function () { order: [[0, 'desc']], searching: false, scrollX: true, + scrollY: 'calc(100vh - 325px)', // Initial value – ScrollResize recalculates dynamically + scrollCollapse: true, ajax: abp.libs.datatables.createAjax( unity.grantManager.history.auditLog.getList, function () { @@ -594,6 +608,8 @@ $(function () { }) ); + enableScrollResize(auditDt); + if ($.fn.dataTable.FilterRow !== undefined) { new $.fn.dataTable.FilterRow(auditDt.settings()[0], { // NOSONAR - False positive flag on S1848 buttonId: 'audit-filter-button',