Skip to content
Original file line number Diff line number Diff line change
Expand Up @@ -70,8 +70,6 @@
<abp-script src="/Pages/GrantApplications/ai-generation-button-state.js" />
<abp-script src="/Pages/GrantApplications/Details.js" />
<abp-script src="/libs/formiojs/formio.form.min.js" />
<abp-script src="/libs/jspdf/dist/jspdf.umd.min.js" />
<abp-script src="/libs/html2canvas/dist/html2canvas.min.js" />
<abp-script src="/Pages/GrantApplications/ai-analysis.js" />
}

Expand Down
Original file line number Diff line number Diff line change
@@ -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 = {
Expand Down Expand Up @@ -28,7 +28,7 @@ const finalApplicationStates = [
];

$(function () {
const nullPlaceholder = '—';
const nullPlaceholder = '—';

let inputAction = function (requestData, dataTableSettings) {
const applicationId = pageApplicationId
Expand Down Expand Up @@ -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();
});
Expand Down Expand Up @@ -255,17 +255,17 @@ $(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);
});

reviewListTable.on('deselect', function (e, dt, type, indexes) {
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);
Expand Down Expand Up @@ -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);
}
Expand Down Expand Up @@ -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;
});
Expand Down Expand Up @@ -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('<span class="ai-button-content"><i class="unt-icon-sm fa-solid fa-wand-sparkles"></i><span>Generating...</span></span>');
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('<span class="ai-button-content"><i class="unt-icon-sm fa-solid fa-wand-sparkles"></i><span>Completed</span></span>').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('<span class="ai-button-content"><i class="unt-icon-sm fa-solid fa-wand-sparkles"></i><span>Generating...</span></span>');
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('<span class="ai-button-content"><i class="unt-icon-sm fa-solid fa-wand-sparkles"></i><span>Completed</span></span>').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(
Expand Down
Loading