From 79eb45ad46c8d16410301967923b553bd170fbc3 Mon Sep 17 00:00:00 2001 From: Jacob Smith Date: Fri, 1 May 2026 15:05:51 -0700 Subject: [PATCH 1/5] AB#32451 no-op branch checkpoint From 33f17784606c8950bf58d4d758db11473805f733 Mon Sep 17 00:00:00 2001 From: James Pasta <129337673+JamesPasta@users.noreply.github.com> Date: Fri, 1 May 2026 15:09:58 -0700 Subject: [PATCH 2/5] Revert "AB#32451 fix ExecuteAsync argument name warning" --- .../Automation/BackgroundJobs/RunApplicationAIPipelineJob.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Application/GrantApplications/Automation/BackgroundJobs/RunApplicationAIPipelineJob.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.Application/GrantApplications/Automation/BackgroundJobs/RunApplicationAIPipelineJob.cs index c749f3ff8..def126a49 100644 --- a/applications/Unity.GrantManager/src/Unity.GrantManager.Application/GrantApplications/Automation/BackgroundJobs/RunApplicationAIPipelineJob.cs +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Application/GrantApplications/Automation/BackgroundJobs/RunApplicationAIPipelineJob.cs @@ -31,7 +31,7 @@ public override async Task ExecuteAsync(RunApplicationAIPipelineJobArgs args) { if (string.IsNullOrWhiteSpace(args.RequestKey)) { - throw new ArgumentException("RequestKey is required.", nameof(args)); + throw new ArgumentException("RequestKey is required.", nameof(args.RequestKey)); } using (currentTenant.Change(args.TenantId)) From 0ee6cba000350b4a35f0b9e127dcbd7edfd283b7 Mon Sep 17 00:00:00 2001 From: JamesPasta Date: Fri, 1 May 2026 15:49:53 -0700 Subject: [PATCH 3/5] bugfix/AB#32451-FixReviewlistJS Co-authored-by: Copilot --- .../Components/ReviewList/ReviewList.js | 202 +++++++++--------- 1 file changed, 101 insertions(+), 101 deletions(-) diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Views/Shared/Components/ReviewList/ReviewList.js b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Views/Shared/Components/ReviewList/ReviewList.js index e5368d36f..257407605 100644 --- a/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Views/Shared/Components/ReviewList/ReviewList.js +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Web/Views/Shared/Components/ReviewList/ReviewList.js @@ -1,6 +1,6 @@ const l = abp.localization.getResource('GrantManager'); -const pageApplicationId = decodeURIComponent(document.querySelector("#DetailsViewApplicationId").value); -const isAiScoringEnabled = document.querySelector("#ReviewListAIScoringEnabled")?.value === 'True'; +const pageApplicationId = decodeURIComponent(document.querySelector("#DetailsViewApplicationId")?.value ?? ''); +const isAiScoringEnabled = document.querySelector("#ReviewListAIScoringEnabled")?.value === 'True'; const canUseAiScoring = isAiScoringEnabled; const actionButtonConfigMap = { @@ -28,7 +28,7 @@ const finalApplicationStates = [ ]; $(function () { - const nullPlaceholder = '—'; + const nullPlaceholder = '—'; let inputAction = function (requestData, dataTableSettings) { const applicationId = pageApplicationId @@ -76,7 +76,7 @@ $(function () { } }); - $.fn.dataTable.Api.register('row().selectWithParams()', function (params) { + $.fn.dataTable.Api.register('row().selectWithParams()', function (params) { this.params = params; return this.select(); }); @@ -255,7 +255,7 @@ $(function () { $("#AdjudicationTeamLeadActionBar .dt-buttons").contents().unwrap(); updateAiActionButtonsVisibility(reviewListTable); - reviewListTable.on('select', function (e, dt, type, indexes) { + reviewListTable.on('select', function (e, dt, type, indexes) { handleRowSelection(e, dt, type, indexes, reviewListTable); }); @@ -263,9 +263,9 @@ $(function () { handleRowDeselection(e, dt, type, indexes, reviewListTable); }); - PubSub.subscribe('refresh_review_list', (msg, data) => { - refreshReviewList(data, reviewListTable); - }); + PubSub.subscribe('refresh_review_list', (msg, data) => { + refreshReviewList(data, reviewListTable); + }); PubSub.subscribe('refresh_review_list_without_sidepanel', (msg, data) => { refreshReviewList(data, reviewListTable, false); @@ -294,7 +294,7 @@ function handleRowSelection(e, dt, type, indexes, reviewListTable) { if (type === 'row') { let selectedData = reviewListTable.row(indexes).data(); document.getElementById("AssessmentId").value = selectedData.id; - if (refreshSidePanel) { + if (refreshSidePanel) { PubSub.publish('select_application_review', selectedData); PubSub.publish('refresh_assessment_attachment_list', selectedData.id); } @@ -367,7 +367,7 @@ function renderApproval(data) { } } async function getActionButtonConfigMap() { - let applicationId = document.getElementById('DetailsViewApplicationId').value; + let applicationId = document.getElementById('DetailsViewApplicationId')?.value; let applicationStatus = await unity.grantManager.grantApplications.grantApplication.getApplicationStatus(applicationId).then(data => { return data; }); @@ -455,97 +455,97 @@ function unityWorkflowButtonAction(e, dt, button, config) { } } -function generateAiButtonAction(e, dt, button, config) { - const $button = button?.node ? $(button.node) : null; - const promptVersion = globalThis.getSelectedPromptVersion?.() || null; - const aiGenerationPollIntervalMs = 15000; - let aiGenerationPollTimeoutId = null; - - if ($button?.length) { - $button.prop('disabled', true); - $button.html('Generating...'); - globalThis.AIGenerationButtonState?.setGenerating($button); - } - - const stopPolling = function () { - if (aiGenerationPollTimeoutId) { - clearTimeout(aiGenerationPollTimeoutId); - aiGenerationPollTimeoutId = null; - } - }; - - const poll = function () { - unity.grantManager.grantApplications.grantApplication - .getAIGenerationStatus(pageApplicationId, 'application-scoring', promptVersion) - .done(function (request) { - const status = globalThis.AIGenerationButtonState?.resolveStatus(request?.status) ?? ''; - - if (status === 'Failed') { - stopPolling(); - abp.message.error(request?.failureReason || 'AI scoring failed.'); - if ($button?.length) { - globalThis.AIGenerationButtonState?.restore($button); - $button.prop('disabled', false); - $button.html(generateAiButtonText(null, null, null)); - } - return; - } - - if (!request || request.isActive === false || status === 'Completed') { - stopPolling(); - setReviewListAiButtonCompleted($button); - refreshReviewListAfterAiScoring(); - return; - } - - aiGenerationPollTimeoutId = setTimeout(poll, aiGenerationPollIntervalMs); - }) - .fail(function () { - aiGenerationPollTimeoutId = setTimeout(poll, aiGenerationPollIntervalMs); - }); - }; - - unity.grantManager.grantApplications.grantApplication.queueApplicationScoring(pageApplicationId, promptVersion) - .done(function (request) { - const status = globalThis.AIGenerationButtonState?.resolveStatus(request?.status) ?? ''; - - if (status === 'Completed') { - setReviewListAiButtonCompleted($button); - refreshReviewListAfterAiScoring(); - return; - } - - aiGenerationPollTimeoutId = setTimeout(poll, 500); - }) - .fail(function () { - stopPolling(); - abp.message.error('Failed to queue AI scoring. Please try again.'); - if ($button?.length) { - globalThis.AIGenerationButtonState?.restore($button); - $button.prop('disabled', false); - $button.html(generateAiButtonText(null, null, null)); - } - }) - ; -} - -function setReviewListAiButtonCompleted($button) { - if (!$button?.length) { - return; - } - - globalThis.AIGenerationButtonState?.setCompleted($button); - $button.html('Completed').prop('disabled', true); -} - -function refreshReviewListAfterAiScoring() { - PubSub.publish('refresh_review_list', pageApplicationId); - PubSub.publish('refresh_assessment_scores', null); -} - -function executeAssessmentAction(assessmentId, triggerAction) { - unity.grantManager.assessments.assessment.executeAssessmentAction(assessmentId, triggerAction, {}) - .then(function (result) { +function generateAiButtonAction(e, dt, button, config) { + const $button = button?.node ? $(button.node) : null; + const promptVersion = globalThis.getSelectedPromptVersion?.() || null; + const aiGenerationPollIntervalMs = 15000; + let aiGenerationPollTimeoutId = null; + + if ($button?.length) { + $button.prop('disabled', true); + $button.html('Generating...'); + globalThis.AIGenerationButtonState?.setGenerating($button); + } + + const stopPolling = function () { + if (aiGenerationPollTimeoutId) { + clearTimeout(aiGenerationPollTimeoutId); + aiGenerationPollTimeoutId = null; + } + }; + + const poll = function () { + unity.grantManager.grantApplications.grantApplication + .getAIGenerationStatus(pageApplicationId, 'application-scoring', promptVersion) + .done(function (request) { + const status = globalThis.AIGenerationButtonState?.resolveStatus(request?.status) ?? ''; + + if (status === 'Failed') { + stopPolling(); + abp.message.error(request?.failureReason || 'AI scoring failed.'); + if ($button?.length) { + globalThis.AIGenerationButtonState?.restore($button); + $button.prop('disabled', false); + $button.html(generateAiButtonText(null, null, null)); + } + return; + } + + if (!request || request.isActive === false || status === 'Completed') { + stopPolling(); + setReviewListAiButtonCompleted($button); + refreshReviewListAfterAiScoring(); + return; + } + + aiGenerationPollTimeoutId = setTimeout(poll, aiGenerationPollIntervalMs); + }) + .fail(function () { + aiGenerationPollTimeoutId = setTimeout(poll, aiGenerationPollIntervalMs); + }); + }; + + unity.grantManager.grantApplications.grantApplication.queueApplicationScoring(pageApplicationId, promptVersion) + .done(function (request) { + const status = globalThis.AIGenerationButtonState?.resolveStatus(request?.status) ?? ''; + + if (status === 'Completed') { + setReviewListAiButtonCompleted($button); + refreshReviewListAfterAiScoring(); + return; + } + + aiGenerationPollTimeoutId = setTimeout(poll, 500); + }) + .fail(function () { + stopPolling(); + abp.message.error('Failed to queue AI scoring. Please try again.'); + if ($button?.length) { + globalThis.AIGenerationButtonState?.restore($button); + $button.prop('disabled', false); + $button.html(generateAiButtonText(null, null, null)); + } + }) + ; +} + +function setReviewListAiButtonCompleted($button) { + if (!$button?.length) { + return; + } + + globalThis.AIGenerationButtonState?.setCompleted($button); + $button.html('Completed').prop('disabled', true); +} + +function refreshReviewListAfterAiScoring() { + PubSub.publish('refresh_review_list', pageApplicationId); + PubSub.publish('refresh_assessment_scores', null); +} + +function executeAssessmentAction(assessmentId, triggerAction) { + unity.grantManager.assessments.assessment.executeAssessmentAction(assessmentId, triggerAction, {}) + .then(function (result) { PubSub.publish('assessment_action_completed'); PubSub.publish('refresh_review_list', assessmentId); abp.notify.success( From 97c75fedda0f9b7b9c902947f3b538b63c019bb7 Mon Sep 17 00:00:00 2001 From: JamesPasta Date: Fri, 1 May 2026 15:55:47 -0700 Subject: [PATCH 4/5] bugfix/AB#32451-FixReviewlistJS --- .../Automation/BackgroundJobs/RunApplicationAIPipelineJob.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/applications/Unity.GrantManager/src/Unity.GrantManager.Application/GrantApplications/Automation/BackgroundJobs/RunApplicationAIPipelineJob.cs b/applications/Unity.GrantManager/src/Unity.GrantManager.Application/GrantApplications/Automation/BackgroundJobs/RunApplicationAIPipelineJob.cs index def126a49..c749f3ff8 100644 --- a/applications/Unity.GrantManager/src/Unity.GrantManager.Application/GrantApplications/Automation/BackgroundJobs/RunApplicationAIPipelineJob.cs +++ b/applications/Unity.GrantManager/src/Unity.GrantManager.Application/GrantApplications/Automation/BackgroundJobs/RunApplicationAIPipelineJob.cs @@ -31,7 +31,7 @@ public override async Task ExecuteAsync(RunApplicationAIPipelineJobArgs args) { if (string.IsNullOrWhiteSpace(args.RequestKey)) { - throw new ArgumentException("RequestKey is required.", nameof(args.RequestKey)); + throw new ArgumentException("RequestKey is required.", nameof(args)); } using (currentTenant.Change(args.TenantId)) From 73ea87f935a382909e1c1796cea839adfc6ec035 Mon Sep 17 00:00:00 2001 From: Jacob Smith Date: Fri, 1 May 2026 16:03:46 -0700 Subject: [PATCH 5/5] AB#32451 remove stale PDF script references --- .../Pages/GrantApplications/Details.cshtml | 2 -- 1 file changed, 2 deletions(-) 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 294997e16..3256376c6 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 @@ -70,8 +70,6 @@ - - }