Skip to content
Merged

Dev #2182

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
46 commits
Select commit Hold shift + click to select a range
ed7aeab
Adding l1 and l2 approval flow
Mar 24, 2026
1445669
Added SettingManagement.ConfigureAI permission.
hasanpour Mar 24, 2026
926824d
Seeded permission to ProgramManager and SystemAdmin roles
hasanpour Mar 25, 2026
5cb3a8f
Added AI setting backend
hasanpour Mar 25, 2026
ea2045f
Added AI setting UI
hasanpour Mar 25, 2026
3707e27
Added AI Scoring setting check to existing handlers
hasanpour Mar 25, 2026
2904c24
[AB#32132] Merge dev and adapt setting checks to refactored AI pipeline
hasanpour Mar 25, 2026
013e619
[AB#32132] Merge dev — resolve conflicts with AB#32437 (AI prompts to…
hasanpour Mar 26, 2026
1d91a95
AB#31159: Universal catch-all error page
aurelio-aot Mar 26, 2026
9ee17e0
AB#31159: Fix sonarqube issue
aurelio-aot Mar 26, 2026
4a0f8e9
AB#31159: Re-run sonarqube
aurelio-aot Mar 26, 2026
82dce4c
merge dev
Mar 26, 2026
c06cdfd
Adding support for l1 and l2
Mar 26, 2026
c213bee
Merge pull request #2171 from bcgov/feature/AB#32132-AI-Scoring-Assis…
JamesPasta Mar 26, 2026
d47d499
Merge pull request #2172 from bcgov/feature/AB#31159-Universal-Error-…
JamesPasta Mar 26, 2026
c2870a6
[AB#24939] Add filter buttons on file attachments
plavoie-BC Mar 26, 2026
3408366
adding co pilot review comments
Mar 26, 2026
7ffae30
Update applications/Unity.AutoUI/cypress/pages/ApplicationDetailsPage.ts
Stephan-McColm Mar 26, 2026
d1c7d6b
AB#32229 Log Token Counts for Scoring Assistant
hasanpour Mar 26, 2026
83b01c2
[AB#24939] Enable search for internal uploads
plavoie-BC Mar 26, 2026
f3267c7
fixing redundancy issue
Mar 26, 2026
3e0671d
AB#32012 increase AI token fallbacks
jacobwillsmith Mar 26, 2026
3922ffd
[AB#31673] Update payment action button states and reset logic
plavoie-BC Mar 26, 2026
816d7a2
[AB#31673] Add selection required constraint on check status action b…
plavoie-BC Mar 26, 2026
0c54ef8
Merge pull request #2173 from bcgov/feature/AB#32425-L1-L2ApprovalFlo…
DarylTodosichuk Mar 26, 2026
ed85d64
Merge pull request #2178 from bcgov/feature/AB#32012-RefactorAIFlowOr…
JamesPasta Mar 26, 2026
fa7fe43
Merge pull request #2176 from bcgov/feature/AB#32229-Log-Token-Counts…
JamesPasta Mar 26, 2026
2c0942f
[AB#32197] Implement RedStop restriction for application actions
plavoie-BC Mar 26, 2026
89fc31b
Merge remote-tracking branch 'origin/dev' into feature/AB#32197-redst…
plavoie-BC Mar 26, 2026
b7a07d9
AB#32445 submission fields provider updates
AndreGAot Mar 26, 2026
2cf6deb
[AB#32197] Add popover for Red-Stop restriction warning
plavoie-BC Mar 26, 2026
33f7bf5
[AB#32197] Rename IsApplicantRedStop to IsApplicantRedStopAsync
plavoie-BC Mar 26, 2026
6639218
Merge pull request #2180 from bcgov/feature/AB#32445-portal-submissio…
AndreGAot Mar 26, 2026
f4ecb51
AB#24672: Maximum attachment file size for single upload
aurelio-aot Mar 26, 2026
a3ebede
[AB#32197] Update RedStop warning message and tooltip logic
plavoie-BC Mar 26, 2026
65ffa8e
Merge pull request #2177 from bcgov/bugfix/AB#31673-payment-action-bu…
JamesPasta Mar 26, 2026
ee61e0f
[AB#32197] Refactor RedStop checks in application service and view
plavoie-BC Mar 26, 2026
d3b0b88
Merge remote-tracking branch 'origin/dev' into feature/AB#32197-redst…
plavoie-BC Mar 26, 2026
2ac26ae
AB#24672: File Upload Spinner and Progress Bar
aurelio-aot Mar 27, 2026
d51241c
[AB#32197] Update red-stop warning text
plavoie-BC Mar 27, 2026
7df06e8
AB#24672: Validation for total file sizes in email attachment
aurelio-aot Mar 27, 2026
3666da8
AB#24672: Environment variables for maximum email attachment file size
aurelio-aot Mar 27, 2026
cd60b73
AB#24672: Fix sonarqube issues
aurelio-aot Mar 27, 2026
12f1d47
Merge pull request #2181 from bcgov/feature/AB#24672-Email-Attachment…
JamesPasta Mar 27, 2026
ec60063
Merge pull request #2179 from bcgov/feature/AB#32197-redstop-restriction
JamesPasta Mar 27, 2026
bbd5481
Merge pull request #2174 from bcgov/feature/AB#24939-filter-attachments
JamesPasta Mar 27, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions applications/Unity.AutoUI/cypress.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,16 @@ export default defineConfig({
e2e: {
setupNodeEvents(on) {
on("task", {
readJsonIfExists(filePath: string): Record<string, unknown> | null {
try {
// path.resolve handles both forward and back slashes on Windows
const content = fs.readFileSync(path.resolve(filePath), "utf-8");
return JSON.parse(content);
} catch {
return null;
}
},

async uploadChefsFile({
baseURL,
authToken,
Expand Down
65 changes: 42 additions & 23 deletions applications/Unity.AutoUI/cypress/pages/ApplicationDetailsPage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -182,7 +182,7 @@ export class ApplicationDetailsPage extends BasePage {
| "projectInfo"
| "applicantInfo"
| "fundingAgreement"
| "paymentInfo"
| "paymentInfo",
): this {
const tabSelectors: Record<string, string> = {
submission: this.tabs.submission,
Expand Down Expand Up @@ -348,20 +348,24 @@ export class ApplicationDetailsPage extends BasePage {
* Verify Site Info table is populated
*/
verifySiteInfoTablePopulated(): this {
cy.get("#SiteInfoTable tbody tr", { timeout: 20000 })
.should("have.length.at.least", 1);
cy.get("#SiteInfoTable tbody tr", { timeout: 20000 }).should(
"have.length.at.least",
1,
);
return this;
}

/**
* Verify Site Info table has data in specific columns
*/
verifySiteInfoTableHasData(): this {
cy.get("#SiteInfoTable tbody tr", { timeout: 20000 }).first().within(() => {
cy.get("td").eq(0).should("not.be.empty"); // Site #
cy.get("td").eq(1).should("not.be.empty"); // Pay Group
cy.get("td").eq(2).should("not.be.empty"); // Mailing Address
});
cy.get("#SiteInfoTable tbody tr", { timeout: 20000 })
.first()
.within(() => {
cy.get("td").eq(0).should("not.be.empty"); // Site #
cy.get("td").eq(1).should("not.be.empty"); // Pay Group
cy.get("td").eq(2).should("not.be.empty"); // Mailing Address
});
return this;
}

Expand Down Expand Up @@ -392,8 +396,9 @@ export class ApplicationDetailsPage extends BasePage {
* Select Payment Group in Edit Site modal
*/
selectPaymentGroup(paymentGroup: "EFT" | "Cheque"): this {
cy.get("#Site_PaymentGroup", { timeout: 20000 })
.select(paymentGroup, { force: true });
cy.get("#Site_PaymentGroup", { timeout: 20000 }).select(paymentGroup, {
force: true,
});
return this;
}

Expand All @@ -406,7 +411,9 @@ export class ApplicationDetailsPage extends BasePage {
.click({ force: true });
cy.wait(2000); // Wait for save to process
cy.get("body").type("{esc}");
cy.get(".modal.show, .modal.fade.show", { timeout: 20000 }).should("not.exist");
cy.get(".modal.show, .modal.fade.show", { timeout: 20000 }).should(
"not.exist",
);
cy.get(".modal-backdrop", { timeout: 20000 }).should("not.exist");
return this;
}
Expand Down Expand Up @@ -435,7 +442,9 @@ export class ApplicationDetailsPage extends BasePage {
.click({ force: true });
}
});
cy.get(this.statusActions.dropdownMenu, { timeout: 10000 }).should("be.visible");
cy.get(this.statusActions.dropdownMenu, { timeout: 10000 }).should(
"be.visible",
);
}

/**
Expand Down Expand Up @@ -472,26 +481,36 @@ export class ApplicationDetailsPage extends BasePage {

/**
* Click Approve action.
* If "Complete Assessment" is enabled in the dropdown, click it first,
* then reopen the dropdown before clicking Approve.
* If "Complete Assessment" is present and enabled in the dropdown, click it first
* (and confirm any resulting dialog), then reopen the dropdown before clicking Approve.
*/
clickApprove(): this {
this.openStatusActionsDropdown();
cy.get(this.statusActions.completeAssessment).then(($btn) => {
if (!$btn.is(":disabled")) {
cy.wrap($btn).click({ force: true });
cy.get("body").then(($body) => {
if ($body.find(this.confirmModal.modal).filter(":visible").length > 0) {

// Use body-check so we never timeout when the button is absent from the DOM
cy.get("body").then(($body) => {
const $completeBtn = $body.find(this.statusActions.completeAssessment);
if ($completeBtn.length > 0 && !$completeBtn.is(":disabled")) {
cy.wait(10000); // Wait for any potential UI updates before clicking
cy.wrap($completeBtn).click();
cy.wait(2000); // Wait for any potential UI updates after clicking
cy.get("body").then(($b) => {
if ($b.find(this.confirmModal.modal).filter(":visible").length > 0) {
cy.get(this.confirmModal.modal)
.find(this.confirmModal.confirmButton)
.click({ force: true });
}
});
// Wait for page to stabilize after status transition
cy.get(this.statusActions.dropdownToggle, { timeout: 20000 }).should("be.visible");
this.dismissErrorModalIfPresent();

// Wait for the page to stabilize before reopening the dropdown
cy.get(this.statusActions.dropdownToggle, { timeout: 20000 }).should(
"be.visible",
);
cy.wait(2000);
}
});

// Always reopen dropdown fresh before clicking Approve (dropdown may have closed)
this.openStatusActionsDropdown();
cy.get(this.statusActions.approve, { timeout: 10000 })
Expand Down Expand Up @@ -604,7 +623,7 @@ export class ApplicationDetailsPage extends BasePage {
| "close"
| "withdraw"
| "defer"
| "onHold"
| "onHold",
): void {
const actionSelectors: Record<string, string> = {
startReview: this.statusActions.startReview,
Expand Down Expand Up @@ -636,7 +655,7 @@ export class ApplicationDetailsPage extends BasePage {
| "close"
| "withdraw"
| "defer"
| "onHold"
| "onHold",
): void {
const actionSelectors: Record<string, string> = {
startReview: this.statusActions.startReview,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -387,7 +387,11 @@ export class ReviewAssessmentPage extends BasePage {
* Set decision date to today (format: YYYY-MM-DD)
*/
setDecisionDateToToday(): this {
const today = new Date().toISOString().split("T")[0];
const now = new Date();
const yyyy = now.getFullYear();
const mm = String(now.getMonth() + 1).padStart(2, "0");
const dd = String(now.getDate()).padStart(2, "0");
const today = `${yyyy}-${mm}-${dd}`;
cy.get(this.assessment.decisionDate, { timeout: this.STANDARD_TIMEOUT })
.clear()
.type(today);
Expand Down
Loading
Loading