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 @@ - - } 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(