Skip to content

Commit

Permalink
Merge pull request #1795 from bcgov/UTOPIA-1583
Browse files Browse the repository at this point in the history
[UTOPIA-1583] Implement package for text editor on PIA Pathways Questionnaire
  • Loading branch information
JieunSon96 authored Nov 18, 2023
2 parents 666cac8 + 9d4a562 commit acc5a21
Show file tree
Hide file tree
Showing 10 changed files with 391 additions and 1,921 deletions.
193 changes: 193 additions & 0 deletions src/backend/src/migrations/1700244977702-RichTextPPQ.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,193 @@
import { MigrationInterface, QueryRunner } from 'typeorm';

export class RichTextPPQ1700244977702 implements MigrationInterface {
public async up(queryRunner: QueryRunner): Promise<void> {
// Add temporary columns to store the existing text
await queryRunner.query(
`ALTER TABLE "pia-intake" ADD "temp_ppq_initiativeOtherDetails" text`,
);
await queryRunner.query(
`ALTER TABLE "pia-intake" ADD "temp_ppq_proposedDeadlineReason" text`,
);
await queryRunner.query(
`ALTER TABLE "pia-intake" ADD "temp_ppq_otherCpoConsideration" text`,
);
await queryRunner.query(
`ALTER TABLE "pia-intake" ADD "temp_ppq_pidInitiativeSummary" text`,
);

// Copy the data from the old columns to the temporary columns
await queryRunner.query(
`UPDATE "pia-intake" SET "temp_ppq_initiativeOtherDetails" = "ppq" ->>'initiativeOtherDetails'`,
);
await queryRunner.query(
`UPDATE "pia-intake" SET "temp_ppq_proposedDeadlineReason"= "ppq" ->>'proposedDeadlineReason'`,
);
await queryRunner.query(
`UPDATE "pia-intake" SET "temp_ppq_otherCpoConsideration" = "ppq" ->>'otherCpoConsideration'`,
);
await queryRunner.query(
`UPDATE "pia-intake" SET "temp_ppq_pidInitiativeSummary" = "ppq" ->>'pidInitiativeSummary'`,
);

// Change jsonb properties from type string to object
await queryRunner.query(
`UPDATE "pia-intake"
SET "ppq" = jsonb_set(
"ppq",
'{initiativeOtherDetails}',
'{"content": ""}'::jsonb
)`,
);
await queryRunner.query(
`UPDATE "pia-intake"
SET "ppq" = jsonb_set(
"ppq",
'{proposedDeadlineReason}',
'{"content": ""}'::jsonb
)`,
);
await queryRunner.query(
`UPDATE "pia-intake"
SET "ppq" = jsonb_set(
"ppq",
'{otherCpoConsideration}',
'{"content": ""}'::jsonb
)`,
);
await queryRunner.query(
`UPDATE "pia-intake"
SET "ppq" = jsonb_set(
"ppq",
'{pidInitiativeSummary}',
'{"content": ""}'::jsonb
)`,
);

// Populate the jsonb with the data from the temporary columns
await queryRunner.query(
`UPDATE "pia-intake"
SET "ppq" = jsonb_set(
"ppq",
'{initiativeOtherDetails, content}',
to_jsonb("temp_ppq_initiativeOtherDetails")
)`,
);
await queryRunner.query(
`UPDATE "pia-intake"
SET "ppq" = jsonb_set(
"ppq",
'{proposedDeadlineReason, content}',
to_jsonb("temp_ppq_proposedDeadlineReason")
)`,
);
await queryRunner.query(
`UPDATE "pia-intake"
SET "ppq" = jsonb_set(
"ppq",
'{otherCpoConsideration, content}',
to_jsonb("temp_ppq_otherCpoConsideration")
)`,
);
await queryRunner.query(
`UPDATE "pia-intake"
SET "ppq" = jsonb_set(
"ppq",
'{pidInitiativeSummary, content}',
to_jsonb("temp_ppq_pidInitiativeSummary")
)`,
);

// Drop the temporary columns
await queryRunner.query(
`ALTER TABLE "pia-intake" DROP COLUMN "temp_ppq_initiativeOtherDetails"`,
);
await queryRunner.query(
`ALTER TABLE "pia-intake" DROP COLUMN "temp_ppq_proposedDeadlineReason"`,
);
await queryRunner.query(
`ALTER TABLE "pia-intake" DROP COLUMN "temp_ppq_otherCpoConsideration"`,
);
await queryRunner.query(
`ALTER TABLE "pia-intake" DROP COLUMN "temp_ppq_pidInitiativeSummary"`,
);
}

public async down(queryRunner: QueryRunner): Promise<void> {
// Re-add temporary columns
await queryRunner.query(
`ALTER TABLE "pia-intake" ADD "temp_ppq_initiativeOtherDetails" text`,
);
await queryRunner.query(
`ALTER TABLE "pia-intake" ADD "temp_ppq_proposedDeadlineReason" text`,
);
await queryRunner.query(
`ALTER TABLE "pia-intake" ADD "temp_ppq_otherCpoConsideration" text`,
);
await queryRunner.query(
`ALTER TABLE "pia-intake" ADD "temp_ppq_pidInitiativeSummary" text`,
);

// Extract the content from JSONB and store in temporary columns
await queryRunner.query(
`UPDATE "pia-intake" SET "temp_ppq_initiativeOtherDetails" = "ppq"->'initiativeOtherDetails'->>'content'`,
);
await queryRunner.query(
`UPDATE "pia-intake" SET "temp_ppq_proposedDeadlineReason" = "ppq"->'proposedDeadlineReason'->>'content'`,
);
await queryRunner.query(
`UPDATE "pia-intake" SET "temp_ppq_otherCpoConsideration" = "ppq"->'otherCpoConsideration'->>'content'`,
);
await queryRunner.query(
`UPDATE "pia-intake" SET "temp_ppq_pidInitiativeSummary" = "ppq"->'pidInitiativeSummary'->>'content'`,
);

// Revert the JSONB properties to type string using the temporary column values
await queryRunner.query(
`UPDATE "pia-intake"
SET "ppq" = jsonb_set(
"ppq",
'{initiativeOtherDetails}',
to_jsonb("temp_ppq_initiativeOtherDetails")
)`,
);
await queryRunner.query(
`UPDATE "pia-intake"
SET "ppq" = jsonb_set(
"ppq",
'{proposedDeadlineReason}',
to_jsonb("temp_ppq_proposedDeadlineReason")
)`,
);
await queryRunner.query(
`UPDATE "pia-intake"
SET "ppq" = jsonb_set(
"ppq",
'{otherCpoConsideration}',
to_jsonb("temp_ppq_otherCpoConsideration")
)`,
);
await queryRunner.query(
`UPDATE "pia-intake"
SET "ppq" = jsonb_set(
"ppq",
'{pidInitiativeSummary}',
to_jsonb("temp_ppq_pidInitiativeSummary")
)`,
);

// Drop the temporary columns
await queryRunner.query(
`ALTER TABLE "pia-intake" DROP COLUMN "temp_ppq_initiativeOtherDetails"`,
);
await queryRunner.query(
`ALTER TABLE "pia-intake" DROP COLUMN "temp_ppq_proposedDeadlineReason"`,
);
await queryRunner.query(
`ALTER TABLE "pia-intake" DROP COLUMN "temp_ppq_otherCpoConsideration"`,
);
await queryRunner.query(
`ALTER TABLE "pia-intake" DROP COLUMN "temp_ppq_pidInitiativeSummary"`,
);
}
}
18 changes: 10 additions & 8 deletions src/backend/src/modules/pia-intake/jsonb-classes/ppq/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,14 @@ import {
IsString,
IsArray,
Validate,
IsObject,
} from '@nestjs/class-validator';
import { UserTypesEnum } from 'src/common/enums/users.enum';
import { YesNoInput } from 'src/common/enums/yes-no-input.enum';
import { IFormField } from 'src/common/interfaces/form-field.interface';
import { DateStringValidator } from 'src/common/validators/date-string.validator';
import { validateRoleForFormField } from 'src/common/validators/form-field-role.validator';
import { RichTextContent } from '../rich-text-content';

export class Ppq {
@IsBoolean()
Expand Down Expand Up @@ -45,9 +47,9 @@ export class Ppq {
@IsOptional()
hasInitiativeOther?: boolean;

@IsString()
@IsObject()
@IsOptional()
initiativeOtherDetails?: string;
initiativeOtherDetails?: RichTextContent;

@IsEnum(YesNoInput)
@IsOptional()
Expand All @@ -58,17 +60,17 @@ export class Ppq {
@Validate(DateStringValidator)
proposedDeadline?: string;

@IsString()
@IsObject()
@IsOptional()
proposedDeadlineReason?: string;
proposedDeadlineReason?: RichTextContent;

@IsString()
@IsObject()
@IsOptional()
otherCpoConsideration?: string;
otherCpoConsideration?: RichTextContent;

@IsString()
@IsObject()
@IsOptional()
pidInitiativeSummary?: string;
pidInitiativeSummary?: RichTextContent;

@IsArray()
@IsOptional()
Expand Down
14 changes: 10 additions & 4 deletions src/backend/src/modules/pia-intake/mocks/create-pia-intake.mock.ts
Original file line number Diff line number Diff line change
Expand Up @@ -172,12 +172,18 @@ export const piaIntakeEntityMock: CreatePiaIntakeDto = {
hasAiOrMl: true,
hasContactOrLicenseReview: false,
hasInitiativeOther: true,
initiativeOtherDetails: 'Extra details goes here...',
initiativeOtherDetails: { content: 'Extra details goes here...' },
proposedDeadlineAvailable: YesNoInput.YES,
proposedDeadline: '2022/06/20',
proposedDeadlineReason: 'Reasons for proposed deadline goes here...',
otherCpoConsideration:
'Any related PIAs or CPO considerations goes here...',
proposedDeadlineReason: {
content: 'Reasons for proposed deadline goes here...',
},
otherCpoConsideration: {
content: 'Any related PIAs or CPO considerations goes here...',
},
pidInitiativeSummary: {
content: 'Any related PIAs initiative summary goes here...',
},
},
review: {
programArea: {
Expand Down
28 changes: 20 additions & 8 deletions src/backend/test/unit/pia-intake/pia-intake.service.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -314,12 +314,18 @@ describe('PiaIntakeService', () => {
hasAiOrMl: true,
hasContactOrLicenseReview: false,
hasInitiativeOther: true,
initiativeOtherDetails: 'Extra details goes here...',
initiativeOtherDetails: { content: 'Extra details goes here...' },
proposedDeadlineAvailable: YesNoInput.YES,
proposedDeadline: '2022/06/20',
proposedDeadlineReason: 'Reasons for proposed deadline goes here...',
otherCpoConsideration:
'Any related PIAs or CPO considerations goes here...',
proposedDeadlineReason: {
content: 'Reasons for proposed deadline goes here...',
},
otherCpoConsideration: {
content: 'Any related PIAs or CPO considerations goes here...',
},
pidInitiativeSummary: {
content: 'Any related PIAs initiative summary goes here...',
},
},
};

Expand Down Expand Up @@ -349,12 +355,18 @@ describe('PiaIntakeService', () => {
hasAiOrMl: true,
hasContactOrLicenseReview: false,
hasInitiativeOther: true,
initiativeOtherDetails: 'Extra details goes here...',
initiativeOtherDetails: { content: 'Extra details goes here...' },
proposedDeadlineAvailable: YesNoInput.YES,
proposedDeadline: '2022/06/20',
proposedDeadlineReason: 'Reasons for proposed deadline goes here...',
otherCpoConsideration:
'Any related PIAs or CPO considerations goes here...',
proposedDeadlineReason: {
content: 'Reasons for proposed deadline goes here...',
},
otherCpoConsideration: {
content: 'Any related PIAs or CPO considerations goes here...',
},
pidInitiativeSummary: {
content: 'Any related PIAs initiative summary goes here...',
},
},
};

Expand Down
14 changes: 10 additions & 4 deletions src/backend/test/util/mocks/data/pia-intake.mock.ts
Original file line number Diff line number Diff line change
Expand Up @@ -179,12 +179,18 @@ const piaIntakeDataMock = {
hasAiOrMl: true,
hasContactOrLicenseReview: false,
hasInitiativeOther: true,
initiativeOtherDetails: 'Extra details goes here...',
initiativeOtherDetails: { content: 'Extra details goes here...' },
proposedDeadlineAvailable: YesNoInput.YES,
proposedDeadline: '2022/06/20',
proposedDeadlineReason: 'Reasons for proposed deadline goes here...',
otherCpoConsideration:
'Any related PIAs or CPO considerations goes here...',
proposedDeadlineReason: {
content: 'Reasons for proposed deadline goes here...',
},
otherCpoConsideration: {
content: 'Any related PIAs or CPO considerations goes here...',
},
pidInitiativeSummary: {
content: 'Any related PIAs initiative summary goes here...',
},
},
invitee: { ...inviteeEntityMock },
review: null,
Expand Down
Loading

0 comments on commit acc5a21

Please sign in to comment.