From 552dad40cbf51652385d78a6be4ac34205d6792f Mon Sep 17 00:00:00 2001 From: Yoni K Date: Mon, 13 Jan 2025 18:22:34 -0500 Subject: [PATCH 01/18] Create work stream table --- .../src/pages/WorkStreams/WorkStreamTable.tsx | 178 ++++++++++++++++++ 1 file changed, 178 insertions(+) create mode 100644 apps/web/src/pages/WorkStreams/WorkStreamTable.tsx diff --git a/apps/web/src/pages/WorkStreams/WorkStreamTable.tsx b/apps/web/src/pages/WorkStreams/WorkStreamTable.tsx new file mode 100644 index 00000000000..4c55bbd8835 --- /dev/null +++ b/apps/web/src/pages/WorkStreams/WorkStreamTable.tsx @@ -0,0 +1,178 @@ +import { ColumnDef, createColumnHelper } from "@tanstack/react-table"; +import { useIntl } from "react-intl"; +import { OperationContext, useQuery } from "urql"; +import { useLocation } from "react-router"; + +import { unpackMaybes } from "@gc-digital-talent/helpers"; +import { commonMessages, getLocalizedName } from "@gc-digital-talent/i18n"; +import { Link, Pending } from "@gc-digital-talent/ui"; +import { + graphql, + FragmentType, + getFragment, + WorkStreamTableRowFragment, +} from "@gc-digital-talent/graphql"; + +import useRoutes from "~/hooks/useRoutes"; +import Table from "~/components/Table/ResponsiveTable/ResponsiveTable"; +import adminMessages from "~/messages/adminMessages"; +import { normalizedText } from "~/components/Table/sortingFns"; + +export const WorkStreamTableRow_Fragment = graphql(/* GraphQL */ ` + fragment WorkStreamTableRow on WorkStream { + id + name { + en + fr + } + plainLanguageName { + en + fr + } + community { + id + key + name { + en + fr + } + } + } +`); + +const columnHelper = createColumnHelper(); + +interface WorkStreamTableProps { + workStreamsQuery: FragmentType[]; + title: string; +} + +export const WorkStreamTable = ({ + workStreamsQuery, + title, +}: WorkStreamTableProps) => { + const intl = useIntl(); + const paths = useRoutes(); + const workStreams = getFragment( + WorkStreamTableRow_Fragment, + workStreamsQuery, + ); + const columns = [ + columnHelper.accessor("id", { + id: "id", + enableColumnFilter: false, + header: intl.formatMessage(adminMessages.id), + }), + columnHelper.accessor((row) => getLocalizedName(row.name, intl), { + id: "name", + sortingFn: normalizedText, + header: intl.formatMessage(commonMessages.name), + cell: ({ row: { original: workStream } }) => ( + + {getLocalizedName(workStream.name, intl)} + + ), + meta: { + isRowTitle: true, + }, + }), + columnHelper.accessor( + (row) => getLocalizedName(row.plainLanguageName, intl), + { + id: "plainLanguageName", + sortingFn: normalizedText, + header: intl.formatMessage({ + defaultMessage: "Plain language alternative", + id: "ax3wZp", + description: + "Column header for plain language name in work streams table", + }), + }, + ), + columnHelper.accessor( + (row) => getLocalizedName(row.community?.name, intl), + { + id: "community", + sortingFn: normalizedText, + header: intl.formatMessage(adminMessages.community), + }, + ), + ] as ColumnDef[]; + + const { pathname, search, hash } = useLocation(); + + return ( + + caption={title} + data={workStreams} + columns={columns} + hiddenColumnIds={["id"]} + pagination={{ + internal: true, + total: workStreams.length, + pageSizes: [10, 20, 50], + initialState: { + pageIndex: 0, + pageSize: 50, + }, + }} + sort={{ + internal: true, + initialState: [{ id: "community", desc: false }], + }} + search={{ + internal: true, + label: intl.formatMessage(adminMessages.searchByKeyword), + }} + add={{ + linkProps: { + href: paths.workStreamCreate(), + label: intl.formatMessage({ + defaultMessage: "Create work stream", + id: "jkY75T", + description: "Button text to create a work stream", + }), + from: `${pathname}${search}${hash}`, + }, + }} + nullMessage={{ + description: intl.formatMessage({ + defaultMessage: 'Use the "Create work stream" button to get started.', + id: "9HEVBb", + description: "Instructions for adding a work stream item.", + }), + }} + /> + ); +}; + +const WorkStreamTable_Query = graphql(/* GraphQL */ ` + query WorkStreams { + workStreams { + ...WorkStreamTableRow + } + } +`); + +const context: Partial = { + additionalTypenames: ["WorkStream"], // This lets urql know when to invalidate cache if request returns empty list. https://formidable.com/open-source/urql/docs/basics/document-caching/#document-cache-gotchas + requestPolicy: "cache-first", // The list of workStream will rarely change, so we override default request policy to avoid unnecessary cache updates. +}; + +const WorkStreamTableApi = ({ title }: { title: string }) => { + const [{ data, fetching, error }] = useQuery({ + query: WorkStreamTable_Query, + context, + }); + + return ( + + + + ); +}; + +export default WorkStreamTableApi; From fc77ddc3defd84463f9983a8abbbdc8bc971ec68 Mon Sep 17 00:00:00 2001 From: Yoni K Date: Mon, 13 Jan 2025 18:23:05 -0500 Subject: [PATCH 02/18] Add work stream index page --- .../pages/WorkStreams/IndexWorkStreamPage.tsx | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 apps/web/src/pages/WorkStreams/IndexWorkStreamPage.tsx diff --git a/apps/web/src/pages/WorkStreams/IndexWorkStreamPage.tsx b/apps/web/src/pages/WorkStreams/IndexWorkStreamPage.tsx new file mode 100644 index 00000000000..0d535430d8e --- /dev/null +++ b/apps/web/src/pages/WorkStreams/IndexWorkStreamPage.tsx @@ -0,0 +1,49 @@ +import { useIntl } from "react-intl"; + +import { ROLE_NAME } from "@gc-digital-talent/auth"; + +import SEO from "~/components/SEO/SEO"; +import useRoutes from "~/hooks/useRoutes"; +import useBreadcrumbs from "~/hooks/useBreadcrumbs"; +import RequireAuth from "~/components/RequireAuth/RequireAuth"; +import pageTitles from "~/messages/pageTitles"; +import Hero from "~/components/Hero"; +import AdminContentWrapper from "~/components/AdminContentWrapper/AdminContentWrapper"; + +import WorkStreamTableApi from "./WorkStreamTable"; + +export const IndexWorkStreamPage = () => { + const intl = useIntl(); + const routes = useRoutes(); + + const formattedPageTitle = intl.formatMessage(pageTitles.workStreams); + + const navigationCrumbs = useBreadcrumbs({ + crumbs: [ + { + label: formattedPageTitle, + url: routes.workStreamTable(), + }, + ], + }); + + return ( + <> + + + + + + + ); +}; + +export const Component = () => ( + + + +); + +Component.displayName = "AdminIndexWorkStreamPage"; + +export default IndexWorkStreamPage; From a6ead173f7b68ba96942df1d7070bda0838fb9fb Mon Sep 17 00:00:00 2001 From: Yoni K Date: Mon, 13 Jan 2025 18:23:48 -0500 Subject: [PATCH 03/18] Add work stream view, create, and update pages --- apps/web/src/messages/pageTitles.ts | 5 + .../WorkStreams/CreateWorkStreamPage.tsx | 310 ++++++++++++++ .../WorkStreams/UpdateWorkStreamPage.tsx | 396 ++++++++++++++++++ .../pages/WorkStreams/ViewWorkStreamsPage.tsx | 241 +++++++++++ 4 files changed, 952 insertions(+) create mode 100644 apps/web/src/pages/WorkStreams/CreateWorkStreamPage.tsx create mode 100644 apps/web/src/pages/WorkStreams/UpdateWorkStreamPage.tsx create mode 100644 apps/web/src/pages/WorkStreams/ViewWorkStreamsPage.tsx diff --git a/apps/web/src/messages/pageTitles.ts b/apps/web/src/messages/pageTitles.ts index e86601fe870..7a66fb3d3e7 100644 --- a/apps/web/src/messages/pageTitles.ts +++ b/apps/web/src/messages/pageTitles.ts @@ -87,4 +87,9 @@ export default defineMessages({ description: "Title for the page showing list of job advertisement templates", }, + workStreams: { + defaultMessage: "Work Streams", + id: "cgKjDf", + description: "Title for the index work streams page", + }, }); diff --git a/apps/web/src/pages/WorkStreams/CreateWorkStreamPage.tsx b/apps/web/src/pages/WorkStreams/CreateWorkStreamPage.tsx new file mode 100644 index 00000000000..ef793118d96 --- /dev/null +++ b/apps/web/src/pages/WorkStreams/CreateWorkStreamPage.tsx @@ -0,0 +1,310 @@ +import { useNavigate } from "react-router"; +import { SubmitHandler } from "react-hook-form"; +import { useIntl } from "react-intl"; +import { useMutation, useQuery } from "urql"; +import IdentificationIcon from "@heroicons/react/24/outline/IdentificationIcon"; + +import { toast } from "@gc-digital-talent/toast"; +import { + BasicForm, + Input, + OptGroupOrOption, + Select, + Submit, +} from "@gc-digital-talent/forms"; +import { + commonMessages, + errorMessages, + getLocalizedName, +} from "@gc-digital-talent/i18n"; +import { + graphql, + Scalars, + CreateWorkStreamInput, + LocalizedStringInput, + InputMaybe, +} from "@gc-digital-talent/graphql"; +import { ROLE_NAME } from "@gc-digital-talent/auth"; +import { Heading, Link, CardSeparator, CardBasic } from "@gc-digital-talent/ui"; +import { notEmpty } from "@gc-digital-talent/helpers"; + +import SEO from "~/components/SEO/SEO"; +import useRoutes from "~/hooks/useRoutes"; +import useBreadcrumbs from "~/hooks/useBreadcrumbs"; +import RequireAuth from "~/components/RequireAuth/RequireAuth"; +import pageTitles from "~/messages/pageTitles"; +import Hero from "~/components/Hero"; +import adminMessages from "~/messages/adminMessages"; + +interface FormValues { + key?: InputMaybe; + name: LocalizedStringInput; + plainLanguageName?: InputMaybe; + community: string; +} + +const formValuesToSubmitData = (data: FormValues): CreateWorkStreamInput => { + const communityId = data.community; + return { + name: { + en: data.name?.en, + fr: data.name?.fr, + }, + plainLanguageName: { + en: data.plainLanguageName?.en, + fr: data.plainLanguageName?.fr, + }, + community: { connect: communityId }, + }; +}; + +interface CreateWorkStreamProps { + handleCreateWorkStream: ( + data: CreateWorkStreamInput, + ) => Promise; + communityOptions: OptGroupOrOption[]; +} + +export const CreateWorkStreamForm = ({ + handleCreateWorkStream, + communityOptions, +}: CreateWorkStreamProps) => { + const intl = useIntl(); + const navigate = useNavigate(); + const paths = useRoutes(); + + const handleSubmit: SubmitHandler = async (data) => { + return handleCreateWorkStream(formValuesToSubmitData(data)) + .then(async (id) => { + await navigate(paths.workStreamView(id)); + toast.success( + intl.formatMessage({ + defaultMessage: "Work stream created successfully!", + id: "bPN0EF", + description: "Message displayed after a work stream is created", + }), + ); + }) + .catch(() => { + toast.error( + intl.formatMessage({ + defaultMessage: "Error: creating work stream failed", + id: "R+PiXo", + description: "Messaged displayed after creating work stream fails", + }), + ); + }); + }; + + return ( + + +
+ + {intl.formatMessage({ + defaultMessage: "Work stream information", + id: "0bf24C", + description: "Heading for the 'create a work stream' form", + })} + +
+
+ + +
+

+ {intl.formatMessage({ + defaultMessage: + "We recommend adding an alternative name using plain language for non-government users.", + id: "eZT5Vr", + description: "Suggestion for the next work stream input.", + })} +

+
+ + +
+ + + + +
+ - -
-

+ {intl.formatMessage({ - defaultMessage: - "We recommend adding an alternative name using plain language for non-government users.", - id: "eZT5Vr", - description: "Suggestion for the next work stream input.", + defaultMessage: "Work stream information", + id: "0bf24C", + description: "Heading for the 'create a work stream' form", })} -

-
- - -
- + +
+

+ {intl.formatMessage({ + defaultMessage: + "We recommend adding an alternative name using plain language for non-government users.", + id: "eZT5Vr", + description: "Suggestion for the next work stream input.", + })} +

+
+ + +
+ - - - -
- + + + +
+
+
; name?: InputMaybe; plainLanguageName?: InputMaybe; community: string; @@ -274,6 +275,12 @@ export const UpdateWorkStreamForm = ({ options={communityOptions} />
+
+ + {workStream.key ?? + intl.formatMessage(commonMessages.notProvided)} + +
{ {workStream.community?.name?.localized}
+
+ + {workStream.key ?? + intl.formatMessage(commonMessages.notProvided)} + +
Date: Mon, 20 Jan 2025 09:14:13 -0500 Subject: [PATCH 17/18] Add translations --- apps/web/src/lang/fr.json | 96 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) diff --git a/apps/web/src/lang/fr.json b/apps/web/src/lang/fr.json index e540828dd06..78d1aa5ec26 100644 --- a/apps/web/src/lang/fr.json +++ b/apps/web/src/lang/fr.json @@ -543,6 +543,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_" }, + "0bf24C": { + "defaultMessage": "Informations sur le volet de travail", + "description": "Heading for the 'create a work stream' form" + }, "0c/3Iw": { "defaultMessage": "Vos objectifs et votre style de travail", "description": "Title for goals and work style section" @@ -551,6 +555,10 @@ "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." }, + "0cieq3": { + "defaultMessage": "Le volet de travail a été mis à jour avec succès!", + "description": "Message displayed to user after work stream is updated successfully." + }, "0cy9n/": { "defaultMessage": "Informations sur le groupe de compétences", "description": "Subtitle for viewing a specific skill family" @@ -1039,6 +1047,10 @@ "defaultMessage": "Création de la classification réussie!", "description": "Message displayed to user after classification is created successfully." }, + "3D8drd": { + "defaultMessage": "Informations sur le volet de travail", + "description": "Heading for the 'update a work stream' form" + }, "3FAEil": { "defaultMessage": "Cette possibilité d'emploi s'adresse aux employés internes, la préférence étant donnée aux personnes travaillant dans les ministères énumérés*", "description": "Title of a note describing that a pool is only open to employees with departmental preference. Has an asterisk for fine print." @@ -1275,6 +1287,10 @@ "defaultMessage": "{poolCandidateName} possède 0 des 0 compétences", "description": "Aria-label for the title displayed on the candidate skill count column." }, + "4SdmnS": { + "defaultMessage": "Modifier un volet de travail", + "description": "Page title for the work stream edit page" + }, "4TmwRU": { "defaultMessage": "Candidature reçue", "description": "Status for an application that has been submitted" @@ -2203,6 +2219,10 @@ "defaultMessage": "Afin d'offrir une occasion équitable à toutes les personnes au Canada de postuler un poste, les dates limites se terminent à 23 h 59, heure du Pacifique, à la date que vous avez choisie. Lorsqu'ils sont montrés aux candidates et candidats, nous leur demandons de présenter leur demande au plus tard à la date que vous avez choisie afin d'éviter toute confusion concernant les fuseaux horaires.", "description": "First paragraph for the pool closing date dialog" }, + "9HEVBb": { + "defaultMessage": "Utilisez le bouton « Créez un volet de travail » pour commencer.", + "description": "Instructions for adding a work stream item." + }, "9IMcqY": { "defaultMessage": "En fin de compte, il revient au comité de sélection ou au gestionnaire de déterminer le nombre approprié de méthodes d’évaluation. Si vous en avez plus de {maxSteps}, sélectionnez « évaluation supplémentaire » en dernier ressort, puis communiquez avec notre équipe. Nous pouvons vous expliquer la façon dont ces évaluations supplémentaires peuvent être gérées sur la plateforme.", "description": "First paragraph of second answer of the Frequently Asked Questions for logging in" @@ -5091,6 +5111,10 @@ "defaultMessage": "Titre du poste", "description": "Label for an opportunity's job title." }, + "OKCVhm": { + "defaultMessage": "Texte de rechange en langage clair (français)", + "description": "Label for plain language alt french input" + }, "OKqOVT": { "defaultMessage": "Gouvernement du Canada", "description": "Label for goc employment category on work experience card metadata" @@ -5427,6 +5451,10 @@ "defaultMessage": "Sélectionner une classification pour afficher les exigences en matière de formation.", "description": "Null message for education requirement section" }, + "PzQ0E1": { + "defaultMessage": "Le volet de travail {workStreamId} n'a pas été trouvé.", + "description": "Message displayed for work stream not found." + }, "Q+7LUo": { "defaultMessage": "Trouver et associer une compétence à votre expérience de parcours professionnel", "description": "Title for the find a skill dialog within an experience" @@ -5675,6 +5703,10 @@ "defaultMessage": "Cette annonce n’exige pas d’une section « À propos de nous ».", "description": "Message displayed when there is no about us for a process advertisement." }, + "R+PiXo": { + "defaultMessage": "Erreur : La création du volet de travail a échoué.", + "description": "Messaged displayed after creating work stream fails" + }, "R/z71a": { "defaultMessage": "Information sur la demande", "description": "Heading for the information of an application" @@ -5819,6 +5851,10 @@ "defaultMessage": "Étape {currentStep}", "description": "Label for the candidates current assessment step" }, + "RjKlKz": { + "defaultMessage": "Créez un volet de travail", + "description": "Text to create a work stream" + }, "Rk1i9Q": { "defaultMessage": "Ce programme élimine l’un des principaux obstacles à l’emploi en valorisant le potentiel d’une personne plutôt que son niveau de scolarité. Ce faisant, cette initiative contribue à combler les écarts en matière d’éducation, d’emploi et d’économie auxquelles sont confrontées les personnes autochtones du Canada.", "description": "Paragraph 3 of the 'About the program' section" @@ -6215,6 +6251,10 @@ "defaultMessage": "Gestionnaires de l'initiative numérique", "description": "Title for group-specific resource card" }, + "TwR8/e": { + "defaultMessage": "Créer un volet de travail", + "description": "Breadcrumb title for the create work stream page link." + }, "TxVbLI": { "defaultMessage": "Filtre de classification", "description": "Heading for classification filter of the search form." @@ -7542,6 +7582,10 @@ "defaultMessage": "l'analyse opérationnelle;", "description": "Second item in list of certification topics section" }, + "ax3wZp": { + "defaultMessage": "Texte de rechange en langage clair", + "description": "Column header for plain language name in work streams table" + }, "axQDlj": { "defaultMessage": "Contactez-nous pour nous faire part de votre rétroaction ou d'un problème.", "description": "Subtitle for the Support page" @@ -7618,6 +7662,10 @@ "defaultMessage": "Ajoutez une nouvelle expérience", "description": "Title for adding a new experience" }, + "bPN0EF": { + "defaultMessage": "Le volet de travail a été créé avec succès!", + "description": "Message displayed after a work stream is created" + }, "bQ4iDW": { "defaultMessage": "Résultats des candidates et candidats", "description": "Heading for the candidate results section of the single search request view." @@ -8030,6 +8078,10 @@ "defaultMessage": "Les exigences linguistiques des postes bilingues sont résumées au moyen de l’une des lettres pour chacune des compétences. La première lettre renvoie au niveau requis pour la Lecture, la deuxième pour l’écriture et la troisième pour l’expression orale.", "description": "Description for second language proficiency on language requirement dialog" }, + "da/TLc": { + "defaultMessage": "Modifier le volet de travail", + "description": "Breadcrumb title for the edit work stream page link." + }, "db3ZDX": { "defaultMessage": "Bon retour!", "description": "Heading at the top of the sign in page for applicant profiles" @@ -8282,6 +8334,10 @@ "defaultMessage": "Objet de la demande", "description": "Talent request - request purpose title" }, + "eZT5Vr": { + "defaultMessage": "Nous recommandons d'ajouter un nom de rechange en langage clair pour les utilisateurs non gouvernementaux.", + "description": "Suggestion for the next work stream input." + }, "eZYP/W": { "defaultMessage": "Gérer votre parcours professionnel", "description": "Titles for a page section to manage your career timeline" @@ -8546,10 +8602,18 @@ "defaultMessage": "Province, territoire ou région", "description": "Label for current province or territory field" }, + "fo51DL": { + "defaultMessage": "Créer un volet de travail", + "description": "Page title for the work stream creation page" + }, "fpm0Bt": { "defaultMessage": "Compétences techniques essentielles", "description": "Short title of the 'essential technical skills' section of the job poster template page" }, + "fqEh4+": { + "defaultMessage": "Modifiez les informations sur le volet de travail", + "description": "Link to edit the currently viewed work stream" + }, "fqa45V": { "defaultMessage": "Définition du niveau", "description": "Label for the definition of a specific skill level" @@ -9450,6 +9514,10 @@ "defaultMessage": "Poursuivez l'ébauche", "description": "Link text to continue a specific application that is in draft state." }, + "jkY75T": { + "defaultMessage": "Créez le volet de travail", + "description": "Button text to create a work stream" + }, "joXPYW": { "defaultMessage": "Composantes clés", "description": "Heading for section describing the different components" @@ -9598,6 +9666,10 @@ "defaultMessage": "Signaler une page manquante", "description": "Link text to go report a missing page on the 404" }, + "kh9KTx": { + "defaultMessage": "Annulez et revenez aux volets de travail", + "description": "Link text to cancel updating a work stream" + }, "kiH9nz": { "defaultMessage": "Sélectionnez une langue autochtone ", "description": "Button text displayed for Indigenous languages dropdown" @@ -9838,6 +9910,10 @@ "defaultMessage": "Apprendre quoi faire si vous ne trouvez pas une compétence", "description": "Button text to show help information about skills" }, + "mBaKVv": { + "defaultMessage": "Informations sur les volets de travail", + "description": "Nav tab label for work stream information" + }, "mDowK/": { "defaultMessage": "Représentée par les expériences suivantes :", "description": "Lead in text for experiences that represent the users skills" @@ -10118,6 +10194,10 @@ "defaultMessage": "Mesures", "description": "Title displayed for actions column" }, + "nGy9DA": { + "defaultMessage": "Informations sur les volets de travail", + "description": "Heading for the 'view a work stream' form" + }, "nIJlba": { "defaultMessage": "Obtention réussie d’un diplôme d’études secondaires ou un équivalent du GED.", "description": "Message under radio button in IAP application education page." @@ -11366,6 +11446,10 @@ "defaultMessage": "Le contrat comporte-t-il des exigences particulières en matière de personnel?", "description": "Label for _contract amendable_ fieldset in the _digital services contracting questionnaire_" }, + "uK9/a4": { + "defaultMessage": "Volets de travail", + "description": "Title for the index work streams page" + }, "uLncuU": { "defaultMessage": "Nom du (de la) candidat(e)", "description": "Title displayed on the User table Candidate name column." @@ -11374,6 +11458,10 @@ "defaultMessage": "Votre incidence (français)", "description": "Label for a process' French impact" }, + "uNKq32": { + "defaultMessage": "Erreur : la mise à jour du volet de travail a échoué.", + "description": "Message displayed to user after work stream fails to get updated." + }, "uOTYlH": { "defaultMessage": "Vous n'avez pas encore de profil? En suivant le processus de demande d'emploi, vous obtiendrez toutes les informations dont vous avez besoin.", "description": "Text letting users know the application will allow them setup a profile" @@ -11394,6 +11482,10 @@ "defaultMessage": "Le statut de candidat du bassin a été mis à jour avec succès", "description": "Message displayed when a pool candidate has been updated by and admin" }, + "uWZgYM": { + "defaultMessage": "La « clé » est une chaîne qui identifie de manière unique un volet de travail. Elle devrait être fondée sur le nom anglais du volet de travail et devrait être concise. Un bon exemple serait « information_management ». Elle peut être utilisée dans le code pour faire référence à cette compétence particulière, et ne peut donc pas être modifiée ultérieurement.", + "description": "Additional context describing the purpose of the work streams 'key' field." + }, "uWdGeZ": { "defaultMessage": "Expérience professionnelle", "description": "Experience count column header for the skill library table" @@ -12066,6 +12158,10 @@ "defaultMessage": "Télécharger le guide", "description": "Link text for guidance resource download" }, + "yW8bEZ": { + "defaultMessage": "Texte de rechange en langage clair (anglais)", + "description": "Label for plain language alt english input" + }, "yWen8A": { "defaultMessage": "Format", "description": "The format of the training opportunity" From ddffa77adf0af9a7b0d77523ecb3092be475754a Mon Sep 17 00:00:00 2001 From: Yoni K Date: Mon, 20 Jan 2025 09:38:23 -0500 Subject: [PATCH 18/18] Update translations snapshot --- apps/web/src/lang/__snapshots__/lang.test.ts.snap | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/apps/web/src/lang/__snapshots__/lang.test.ts.snap b/apps/web/src/lang/__snapshots__/lang.test.ts.snap index fff52065b45..1f1d1e1ee85 100644 --- a/apps/web/src/lang/__snapshots__/lang.test.ts.snap +++ b/apps/web/src/lang/__snapshots__/lang.test.ts.snap @@ -2,6 +2,13 @@ exports[`message files should have no changes to duplicate strings 1`] = ` "[ + { + "en": "Work stream information", + "fr": [ + "Informations sur le volet de travail", + "Informations sur les volets de travail" + ] + }, { "en": "Community roles", "fr": [ @@ -79,6 +86,13 @@ exports[`message files should have no changes to duplicate strings 1`] = ` "Créer une collectivité" ] }, + { + "en": "Create work stream", + "fr": [ + "Créez un volet de travail", + "Créez le volet de travail" + ] + }, { "en": "Add process role", "fr": [