Skip to content

Commit

Permalink
[Feature] Adds Employee Profile Goals and Work Style form (#12433)
Browse files Browse the repository at this point in the history
* Allow employeeProfile to be optional

* Add messages

* Add validator

* Add GoalsWorkStyleSection

* Add GoalsWorkStyleSection

* Allow employeeProfile to be nullable

* Add NotFoundError conditional

* Remove hasError

* Rename function

* Add translations
  • Loading branch information
mnigh authored Jan 15, 2025
1 parent 86676c3 commit 86b71b4
Show file tree
Hide file tree
Showing 6 changed files with 470 additions and 4 deletions.
40 changes: 40 additions & 0 deletions apps/web/src/lang/fr.json
Original file line number Diff line number Diff line change
Expand Up @@ -535,6 +535,10 @@
"defaultMessage": "Prévoyez-vous un effet de report ou d’entraînement à long terme sur d’autres services en termes de niveaux de personnel ou de compétences requises?",
"description": "Label for _has future impact on other departments_ fieldset in the _digital services contracting questionnaire_"
},
"0c/3Iw": {
"defaultMessage": "Vos objectifs et votre style de travail",
"description": "Title for goals and work style section"
},
"0cevfA": {
"defaultMessage": "Vous êtes sur le point d'ajouter des rôles pour ce ou cette membre :",
"description": "Lead in text for the add role to user form."
Expand Down Expand Up @@ -2311,6 +2315,10 @@
"defaultMessage": "la cybersécurité;",
"description": "Fourth item in list of certification topics section"
},
"9pYZOU": {
"defaultMessage": "Comment vous travaillez le mieux",
"description": "Label for a employee profile work style field"
},
"9pYlYz": {
"defaultMessage": "Volet",
"description": "Label for a process' stream"
Expand Down Expand Up @@ -4787,6 +4795,10 @@
"defaultMessage": "Tâches de travail (français)",
"description": "Label for a process' French work tasks"
},
"MptxTu": {
"defaultMessage": "Cette section vous permet de présenter des informations sur vous-même et sur votre façon de travailler, y compris sur vos objectifs pour l'avenir et sur les environnements qui vous permettent de donner le meilleur de vous-même.",
"description": "Describes the goals and work style section of employee profile"
},
"MsLKAj": {
"defaultMessage": "Voir l’expérience pour {experienceName}",
"description": "Assistive technology link text to view a specific experience"
Expand Down Expand Up @@ -4967,6 +4979,10 @@
"defaultMessage": "Ajoutez, modifiez, et gérez les compétences de votre profil.",
"description": "Page description for the skill library page"
},
"NlcepR": {
"defaultMessage": "Vos objectifs de carrière",
"description": "Label for a employee profile career goals field"
},
"Nm+j2a": {
"defaultMessage": "Un nouveau poste y est maintenant affiché! À vous de juger s’il vous convient et de présenter votre candidature.",
"description": "Label for the new job posted notification"
Expand Down Expand Up @@ -5255,6 +5271,10 @@
"defaultMessage": "Filtrer les expériences par type",
"description": "Label for selector to choose experience filter options"
},
"PEH7og": {
"defaultMessage": "Cette section contient des questions facultatives qui sont actuellement sans réponse. Cliquez sur le bouton « Modifiez » pour réviser vos réponses dans les champs pertinents.",
"description": "Message for unanswered optional questions in this section"
},
"PFoM2I": {
"defaultMessage": "Éducation et certificats",
"description": "Title for education experience section"
Expand Down Expand Up @@ -5347,6 +5367,10 @@
"defaultMessage": "Présentation de {showing} sur {total} modèles disponibles",
"description": "Number of job poster templates being displayed in the list"
},
"PkE/Ir": {
"defaultMessage": "Sauvegardez les objectifs et le style de travail ",
"description": "Text on a button to save goals and work style form"
},
"PmDeul": {
"defaultMessage": "Utilisez-vous actuellement cette compétence?",
"description": "Label for field asking if a skill is currently being used"
Expand Down Expand Up @@ -9274,6 +9298,10 @@
"defaultMessage": "Lieu précis (précisez ci-dessous)",
"description": "Label displayed for 'specific location' option"
},
"j5Fwi6": {
"defaultMessage": "Vos objectifs d'apprentissage",
"description": "Label for a employee profile learning goals field"
},
"j5cMN5": {
"defaultMessage": "Pourquoi cette offre d’emploi n’est-elle plus disponible?",
"description": "Heading for the closed early pool deadlines dialog"
Expand Down Expand Up @@ -10482,6 +10510,10 @@
"defaultMessage": "Télécharger le profil complet",
"description": "Button label for downloading a full user profile"
},
"pKTmqM": {
"defaultMessage": "Échec de la mise à jour des informations sur les objectifs et le style de travail",
"description": "Message displayed when a user fails to updates employee profile information"
},
"pLef1V": {
"defaultMessage": "Dissimuler les détails de {experienceName}",
"description": "Button text to hide a specific experience's details"
Expand Down Expand Up @@ -11170,6 +11202,10 @@
"defaultMessage": "Vous êtes membre d'un ou de plusieurs de ces groupes visés par l'équité en matière d'emploi.",
"description": "First condition for selecting an employment equity group"
},
"tSvuK1": {
"defaultMessage": "À propos de vous",
"description": "Label for a employee profile about you field"
},
"tUIvbq": {
"defaultMessage": "Adresse courriel non validée",
"description": "The email address has not been verified to be owned by user"
Expand Down Expand Up @@ -11550,6 +11586,10 @@
"defaultMessage": "Je souhaite être pris en considération pour des postes en anglais",
"description": "English Positions message"
},
"voMSDe": {
"defaultMessage": "Les informations sur les objectifs et le style de travail ont été mises à jour avec succès!",
"description": "Message displayed when a user successfully updates employee profile information"
},
"vweW8X": {
"defaultMessage": "Veuillez contacter notre <helpLink>équipe de soutien</helpLink> qui vous aidera à récupérer votre compte.",
"description": "GCKey answer for when user authenticator codes not accepted"
Expand Down
26 changes: 26 additions & 0 deletions apps/web/src/messages/employeeProfileMessages.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import { defineMessages } from "react-intl";

const messages = defineMessages({
aboutYou: {
defaultMessage: "About you",
id: "tSvuK1",
description: "Label for a employee profile about you field",
},
careerGoals: {
defaultMessage: "Your career goals",
id: "NlcepR",
description: "Label for a employee profile career goals field",
},
learningGoals: {
defaultMessage: "Your learning goals",
id: "j5Fwi6",
description: "Label for a employee profile learning goals field",
},
workStyle: {
defaultMessage: "How you work best",
id: "9pYZOU",
description: "Label for a employee profile work style field",
},
});

export default messages;
18 changes: 14 additions & 4 deletions apps/web/src/pages/EmployeeProfile/EmployeeProfilePage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import {
ThrowNotFound,
} from "@gc-digital-talent/ui";
import { ROLE_NAME } from "@gc-digital-talent/auth";
import { UnauthorizedError } from "@gc-digital-talent/helpers";
import { NotFoundError, UnauthorizedError } from "@gc-digital-talent/helpers";

import Hero from "~/components/Hero";
import SEO from "~/components/SEO/SEO";
Expand All @@ -23,6 +23,7 @@ import profileMessages from "~/messages/profileMessages";
import StatusItem from "~/components/StatusItem/StatusItem";

import messages from "./messages";
import GoalsWorkStyleSection from "./components/GoalsWorkStyleSection/GoalsWorkStyleSection";

const SECTION_ID = {
CAREER_PLANNING: "career-planning-section",
Expand All @@ -36,6 +37,9 @@ const EmployeeProfile_Fragment = graphql(/** GraphQL */ `
isGovEmployee
workEmail
isWorkEmailVerified
employeeProfile {
...EmployeeProfileGoalsWorkStyle
}
}
`);

Expand All @@ -49,6 +53,10 @@ const EmployeeProfile = ({ userQuery }: EmployeeProfileProps) => {
const user = getFragment(EmployeeProfile_Fragment, userQuery);
const { isGovEmployee, workEmail, isWorkEmailVerified } = user;

if (!user.employeeProfile) {
throw new NotFoundError();
}

if (
!isVerifiedGovEmployee({ isGovEmployee, workEmail, isWorkEmailVerified })
) {
Expand Down Expand Up @@ -174,9 +182,11 @@ const EmployeeProfile = ({ userQuery }: EmployeeProfileProps) => {
<TableOfContents.Section
id={SECTION_ID.DREAM_ROLE}
></TableOfContents.Section>
<TableOfContents.Section
id={SECTION_ID.GOALS_WORK_STYLE}
></TableOfContents.Section>
<TableOfContents.Section id={SECTION_ID.GOALS_WORK_STYLE}>
<GoalsWorkStyleSection
employeeProfileQuery={user.employeeProfile}
/>
</TableOfContents.Section>
</div>
</TableOfContents.Content>
</TableOfContents.Wrapper>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
import { useIntl } from "react-intl";

import { commonMessages } from "@gc-digital-talent/i18n";
import { RichTextRenderer, htmlToRichTextJSON } from "@gc-digital-talent/forms";
import { EmployeeProfileGoalsWorkStyleFragment } from "@gc-digital-talent/graphql";
import { Well } from "@gc-digital-talent/ui";

import ToggleForm from "~/components/ToggleForm/ToggleForm";
import employeeProfileMessages from "~/messages/employeeProfileMessages";
import { hasAnyEmptyFields } from "~/validators/employeeProfile/goalsWorkStyle";

interface DisplayProps {
employeeProfile: EmployeeProfileGoalsWorkStyleFragment;
}

const Display = ({
employeeProfile: { aboutYou, careerGoals, learningGoals, workStyle },
}: DisplayProps) => {
const intl = useIntl();
const notProvided = intl.formatMessage(commonMessages.notProvided);

return (
<div
data-h2-display="base(flex)"
data-h2-flex-direction="base(column)"
data-h2-gap="base(x1)"
>
{hasAnyEmptyFields({
aboutYou,
careerGoals,
learningGoals,
workStyle,
}) && (
<Well>
{intl.formatMessage({
defaultMessage:
'There are currently unanswered optional questions in this section. Use the "Edit" button to review and answer any relevant fields.',
id: "PEH7og",
description:
"Message for unanswered optional questions in this section",
})}
</Well>
)}
<ToggleForm.FieldDisplay
label={intl.formatMessage(employeeProfileMessages.aboutYou)}
>
{aboutYou ? (
<RichTextRenderer node={htmlToRichTextJSON(aboutYou)} />
) : (
notProvided
)}
</ToggleForm.FieldDisplay>
<ToggleForm.FieldDisplay
label={intl.formatMessage(employeeProfileMessages.careerGoals)}
>
{careerGoals ? (
<RichTextRenderer node={htmlToRichTextJSON(careerGoals)} />
) : (
notProvided
)}
</ToggleForm.FieldDisplay>
<ToggleForm.FieldDisplay
label={intl.formatMessage(employeeProfileMessages.learningGoals)}
>
{learningGoals ? (
<RichTextRenderer node={htmlToRichTextJSON(learningGoals)} />
) : (
notProvided
)}
</ToggleForm.FieldDisplay>
<ToggleForm.FieldDisplay
label={intl.formatMessage(employeeProfileMessages.workStyle)}
>
{workStyle ? (
<RichTextRenderer node={htmlToRichTextJSON(workStyle)} />
) : (
notProvided
)}
</ToggleForm.FieldDisplay>
</div>
);
};

export default Display;
Loading

0 comments on commit 86b71b4

Please sign in to comment.