From 177cd8cac2e0a5ec3031342e8cd99d4e66cccd6e Mon Sep 17 00:00:00 2001 From: Marcella Maki Date: Thu, 9 Apr 2026 18:36:15 -0400 Subject: [PATCH 1/2] Update ESoCC strings after UX writing review --- .../CommunityLibraryStatusButton.vue | 4 +- .../sidePanels/PublishSidePanel.vue | 47 ++++------ .../SubmitToCommunityLibrarySidePanel.spec.js | 4 +- .../index.vue | 17 ++-- .../__tests__/PublishSidePanel.spec.js | 2 +- .../strings/communityChannelsStrings.js | 86 ++++++++----------- .../CommunityLibraryStatusChip.vue | 4 +- .../SubmissionDetailsModal/index.vue | 4 +- 8 files changed, 69 insertions(+), 99 deletions(-) diff --git a/contentcuration/contentcuration/frontend/administration/components/CommunityLibraryStatusButton.vue b/contentcuration/contentcuration/frontend/administration/components/CommunityLibraryStatusButton.vue index 20a59d5350..46006c211b 100644 --- a/contentcuration/contentcuration/frontend/administration/components/CommunityLibraryStatusButton.vue +++ b/contentcuration/contentcuration/frontend/administration/components/CommunityLibraryStatusButton.vue @@ -48,8 +48,8 @@ icon: 'circleCheckmark', }, [CommunityLibraryStatus.REJECTED]: { - text: 'Flagged', - tooltip: 'Review flagged submission', + text: 'Needs changes', + tooltip: 'Submission requires changes before approval', color: theme.red.v_100, darkColor: theme.red.v_200, labelColor: theme.red.v_600, diff --git a/contentcuration/contentcuration/frontend/channelEdit/components/sidePanels/PublishSidePanel.vue b/contentcuration/contentcuration/frontend/channelEdit/components/sidePanels/PublishSidePanel.vue index 92c0ffaa39..9f39d34309 100644 --- a/contentcuration/contentcuration/frontend/channelEdit/components/sidePanels/PublishSidePanel.vue +++ b/contentcuration/contentcuration/frontend/channelEdit/components/sidePanels/PublishSidePanel.vue @@ -16,10 +16,10 @@ @@ -53,7 +53,7 @@ showInvalidText :label="versionDescriptionLabel$()" :invalid="isVersionNotesBlurred && !isVersionNotesValid" - :invalidText="versionNotesRequiredMessage$()" + :invalidText="fieldRequired$()" textArea :maxlength="250" :appearanceOverrides="{ maxWidth: 'none' }" @@ -70,7 +70,7 @@ v-model="newChannelLanguage" :label="languageLabel$()" :invalid="isLanguageSelectBlurred && !isNewLanguageValid" - :invalidText="languageRequiredMessage$()" + :invalidText="fieldRequired$()" :options="languageOptions" @blur="isLanguageSelectBlurred = true" /> @@ -112,15 +112,6 @@ > {{ incompleteResourcesDescription1$() }} -
- {{ incompleteResourcesDescription2$() }} -
@@ -128,10 +119,10 @@
@@ -166,6 +157,7 @@ import { Channel, CommunityLibrarySubmission } from 'shared/data/resources'; import { forceServerSync } from 'shared/data/serverSync'; import { communityChannelsStrings } from 'shared/strings/communityChannelsStrings'; + import commonStrings from 'shared/translator'; import { LanguagesList } from 'shared/leUtils/Languages'; import logging from 'shared/logging'; import { FeatureFlagKeys } from 'shared/constants'; @@ -205,23 +197,22 @@ publishChannel$, publishAction$, saveDraft$, - modeLive$, - modeDraft$, + publishChannelMode$, + publishDraftMode$, versionNotesLabel$, - modeLiveDescription$, - modeDraftDescription$, + publishChannelDescription$, + publishDraftDescription$, publishingInfo$, versionDescriptionLabel$, incompleteResourcesWarning$, incompleteResourcesDescription1$, - incompleteResourcesDescription2$, cancelAction$, languageLabel$, - languageRequiredMessage$, draftBeingPublishedNotice$, - versionNotesRequiredMessage$, } = communityChannelsStrings; + const { fieldRequired$ } = commonStrings; + const currentChannel = computed(() => store.getters['currentChannel/currentChannel']); const getContentNode = computed(() => store.getters['contentNode/getContentNode']); const areAllChangesSaved = computed(() => store.getters['areAllChangesSaved']); @@ -416,21 +407,19 @@ isVersionNotesValid, submitText, - modeLive$, - modeDraft$, + publishChannelMode$, + publishDraftMode$, publishChannel$, versionNotesLabel$, - modeLiveDescription$, - modeDraftDescription$, + publishChannelDescription$, + publishDraftDescription$, publishingInfo$, versionDescriptionLabel$, incompleteResourcesWarning$, incompleteResourcesDescription1$, - incompleteResourcesDescription2$, cancelAction$, languageLabel$, - languageRequiredMessage$, - versionNotesRequiredMessage$, + fieldRequired$, onClose, submit, diff --git a/contentcuration/contentcuration/frontend/channelEdit/components/sidePanels/SubmitToCommunityLibrarySidePanel/__tests__/SubmitToCommunityLibrarySidePanel.spec.js b/contentcuration/contentcuration/frontend/channelEdit/components/sidePanels/SubmitToCommunityLibrarySidePanel/__tests__/SubmitToCommunityLibrarySidePanel.spec.js index 5f23336a82..61ef433e4f 100644 --- a/contentcuration/contentcuration/frontend/channelEdit/components/sidePanels/SubmitToCommunityLibrarySidePanel/__tests__/SubmitToCommunityLibrarySidePanel.spec.js +++ b/contentcuration/contentcuration/frontend/channelEdit/components/sidePanels/SubmitToCommunityLibrarySidePanel/__tests__/SubmitToCommunityLibrarySidePanel.spec.js @@ -32,7 +32,7 @@ const store = factory(); const { nonePrimaryInfo$, - flaggedPrimaryInfo$, + needsChangesPrimaryInfo$, approvedPrimaryInfo$, submittedPrimaryInfo$, moreDetails$, @@ -201,7 +201,7 @@ describe('SubmitToCommunityLibrarySidePanel', () => { const infoSection = wrapper.find('.info-section'); expect(infoSection.exists()).toBe(true); - expect(infoSection.text()).toContain(flaggedPrimaryInfo$()); + expect(infoSection.text()).toContain(needsChangesPrimaryInfo$()); }); it('when the previous submission was approved', async () => { diff --git a/contentcuration/contentcuration/frontend/channelEdit/components/sidePanels/SubmitToCommunityLibrarySidePanel/index.vue b/contentcuration/contentcuration/frontend/channelEdit/components/sidePanels/SubmitToCommunityLibrarySidePanel/index.vue index b0e4af2d0d..80ec211b1f 100644 --- a/contentcuration/contentcuration/frontend/channelEdit/components/sidePanels/SubmitToCommunityLibrarySidePanel/index.vue +++ b/contentcuration/contentcuration/frontend/channelEdit/components/sidePanels/SubmitToCommunityLibrarySidePanel/index.vue @@ -231,7 +231,7 @@ v-model="description" :disabled="!canBeEdited" :invalid="description.length < 1" - :invalidText="descriptionRequired$()" + :invalidText="fieldRequired$()" textArea :label="descriptionLabel$()" :maxlength="250" @@ -296,6 +296,7 @@ import { translateMetadataString } from 'shared/utils/metadataStringsTranslation'; import countriesUtil from 'shared/utils/countries'; import { communityChannelsStrings } from 'shared/strings/communityChannelsStrings'; + import commonStrings from 'shared/translator'; import { CommunityLibrarySubmission } from 'shared/data/resources'; import SidePanelModal from 'shared/views/SidePanelModal'; @@ -333,7 +334,6 @@ countryLabel$, countriesInfoText$, descriptionLabel$, - descriptionRequired$, notPublishedWarningTitle$, notPublishedWarningDescription$, publicWarningTitle$, @@ -342,9 +342,8 @@ alreadySubmittedWarningDescription$, submitButton$, cancelAction$, - submittedPrimaryInfo$, approvedPrimaryInfo$, - flaggedPrimaryInfo$, + needsChangesPrimaryInfo$, nonePrimaryInfo$, channelVersion$, submittedSnackbar$, @@ -367,6 +366,8 @@ hideCriteriaAction$, } = communityChannelsStrings; + const { fieldRequired$ } = commonStrings; + const annotationColor = computed(() => tokensTheme.annotation); const infoTextColor = computed(() => paletteTheme.grey.v_700); @@ -415,17 +416,13 @@ if (!latestSubmissionIsFinished.value) return undefined; switch (latestSubmissionStatus.value) { - case CommunityLibraryStatus.PENDING: - return { - primaryText: submittedPrimaryInfo$(), - }; case CommunityLibraryStatus.APPROVED: return { primaryText: approvedPrimaryInfo$(), }; case CommunityLibraryStatus.REJECTED: return { - primaryText: flaggedPrimaryInfo$(), + primaryText: needsChangesPrimaryInfo$(), }; case null: return { @@ -647,7 +644,7 @@ countryLabel$, countriesInfoText$, descriptionLabel$, - descriptionRequired$, + fieldRequired$, channelVersion$, notPublishedWarningTitle$, notPublishedWarningDescription$, diff --git a/contentcuration/contentcuration/frontend/channelEdit/components/sidePanels/__tests__/PublishSidePanel.spec.js b/contentcuration/contentcuration/frontend/channelEdit/components/sidePanels/__tests__/PublishSidePanel.spec.js index ee191c6930..e3edb4a12a 100644 --- a/contentcuration/contentcuration/frontend/channelEdit/components/sidePanels/__tests__/PublishSidePanel.spec.js +++ b/contentcuration/contentcuration/frontend/channelEdit/components/sidePanels/__tests__/PublishSidePanel.spec.js @@ -80,7 +80,7 @@ describe('PublishSidePanel', () => { // Headers and default texts expect(screen.getByText(communityChannelsStrings.publishChannel$())).toBeVisible(); - expect(screen.getByText(communityChannelsStrings.modeLive$())).toBeVisible(); + expect(screen.getByText(communityChannelsStrings.publishChannelMode$())).toBeVisible(); expect( screen.getByText(communityChannelsStrings.publishingInfo$({ version: 2 })), diff --git a/contentcuration/contentcuration/frontend/shared/strings/communityChannelsStrings.js b/contentcuration/contentcuration/frontend/shared/strings/communityChannelsStrings.js index 517aa7f825..4d71f6237e 100644 --- a/contentcuration/contentcuration/frontend/shared/strings/communityChannelsStrings.js +++ b/contentcuration/contentcuration/frontend/shared/strings/communityChannelsStrings.js @@ -18,29 +18,29 @@ export const communityChannelsStrings = createTranslator('CommunityChannelsStrin message: 'Save draft', context: 'The action button to save a channel as a draft', }, - modeLive: { - message: 'Live', + publishChannelMode: { + message: 'Publish channel', context: 'Label to select live publishing mode', }, - modeDraft: { - message: 'Draft (staging)', + publishDraftMode: { + message: 'Publish draft channel', context: 'Label to select draft publishing mode', }, versionNotesLabel: { - message: "Describe what's new in this channel version", + message: "Describe what's included in this channel version", context: 'Label for the version notes text area', }, versionDescriptionLabel: { message: 'Version description', context: 'Label for the version description text area', }, - modeLiveDescription: { - message: 'This edition will be accessible in Kolibri through a channel token.', + publishChannelDescription: { + message: 'To see your channel in Kolibri, import using the channel token.', context: 'Description for the live publishing mode', }, - modeDraftDescription: { + publishDraftDescription: { message: - 'Your channel will be saved as a draft, allowing you to review or conduct quality checks without altering the published version on Kolibri public library.', + 'Your channel will be saved as a draft, allowing you to review or conduct quality checks without altering the version Kolibri users can access. To see your channel in Kolibri, import using the draft channel token.', context: 'Description for the draft publishing mode', }, publishingInfo: { @@ -61,10 +61,6 @@ export const communityChannelsStrings = createTranslator('CommunityChannelsStrin 'Incomplete resources will not be published and made available for download in Kolibri.', context: 'Description for incomplete resources', }, - incompleteResourcesDescription2: { - message: "Click 'Publish' to confirm that you would like to publish anyway.", - context: 'Confirmation message for publishing incomplete resources', - }, cancelAction: { message: 'Cancel', context: 'The action button to cancel an ongoing operation', @@ -73,14 +69,6 @@ export const communityChannelsStrings = createTranslator('CommunityChannelsStrin message: 'Language', context: 'Label for the language selection dropdown', }, - versionNotesRequiredMessage: { - message: 'Version notes are required', - context: 'Error message when version notes are required but not provided', - }, - languageRequiredMessage: { - message: 'Language is required', - context: 'Error message when language selection is required but not provided', - }, // Channel version history strings seeAllVersions: { message: 'See all versions', @@ -116,24 +104,25 @@ export const communityChannelsStrings = createTranslator('CommunityChannelsStrin }, pendingStatus: { message: 'Submitted', - context: 'Status indicating that an Community Library submission is pending', + context: 'Status indicating that a Community Library submission is pending', }, supersededStatus: { message: 'Superseded', context: - 'Status indicating that an Community Library submission is superseded by a newer submission', + 'Status indicating that a Community Library submission is superseded by a newer submission', }, approvedStatus: { message: 'Approved', - context: 'Status indicating that an Community Library submission is approved', + context: 'Status indicating that a Community Library submission is approved', }, flaggedStatus: { - message: 'Flagged', - context: 'Status indicating that an Community Library submission is rejected', + message: 'Needs changes', + context: 'Status indicating that a Community Library submission is rejected', }, - liveStatus: { - message: 'Live', - context: 'Status indicating that an Community Library submission is live', + availableStatus: { + message: 'Available in Community Library', + context: + 'Status indicating that a Community Library submission is now available in the Community Library', }, // Submit to Community Library panel strings submitToCommunityLibrary: { @@ -147,7 +136,7 @@ export const communityChannelsStrings = createTranslator('CommunityChannelsStrin }, submittedPrimaryInfo: { message: - 'A previous version is still pending review. Reviewers will see the latest submission first.', + 'A previous version is still pending review. Reviewers will see the most recent submission by default.', context: 'Information shown in the "Submit to Community Library" panel when a previous version is pending review', }, @@ -157,11 +146,11 @@ export const communityChannelsStrings = createTranslator('CommunityChannelsStrin context: 'Information shown in the "Submit to Community Library" panel when a previous version is approved and live', }, - flaggedPrimaryInfo: { + needsChangesPrimaryInfo: { message: - 'A previous version was flagged for review. Ensure you have fixed all highlighted issues before submitting.', + 'Your previously submitted version needs changes. Make sure you have addressed all feedback before resubmitting.', context: - 'Information shown in the "Submit to Community Library" panel when a previous version was flagged', + 'Information shown in the "Submit to Community Library" panel when a previous version was not approved by an admin and requires changes.', }, nonePrimaryInfo: { message: @@ -175,7 +164,7 @@ export const communityChannelsStrings = createTranslator('CommunityChannelsStrin 'Button in the "Submit to Community Library" panel to show more details about the Community Library', }, lessDetailsButton: { - message: 'Less details', + message: 'Hide details', context: 'Button in the "Submit to Community Library" panel to hide details about the Community Library', }, @@ -217,7 +206,7 @@ export const communityChannelsStrings = createTranslator('CommunityChannelsStrin }, alreadySubmittedWarningDescription: { message: - 'Please wait for review or make changes and publish a new version before submitting again.', + 'Please wait for the channel to be reviewed. You will see a notification in your Studio account after the review is complete.', context: 'Description of warning shown in the "Submit to Community Library" panel when the current version is already submitted', }, @@ -226,11 +215,6 @@ export const communityChannelsStrings = createTranslator('CommunityChannelsStrin context: 'Label for the submission description field in the "Submit to Community Library" panel', }, - descriptionRequired: { - message: 'Description is required', - context: - 'Error message shown in the "Submit to Community Library" panel when description is required but empty', - }, submitButton: { message: 'Submit for review', context: 'Button in the "Submit to Community Library" panel to submit channel for review', @@ -270,12 +254,12 @@ export const communityChannelsStrings = createTranslator('CommunityChannelsStrin context: 'Label for the notes the editor can add to their submission to the Community Library', }, feedbackNotesLabel: { - message: 'Feedback notes', + message: 'Notes from the reviewer', context: 'Label for the feedback notes that reviewers can add to a submission in the Community Library ', }, internalNotesLabel: { - message: 'Internal notes', + message: 'Admin notes (internal use only)', context: 'Label for the notes that admins can add to a submission in the Community Library for themselves', }, @@ -352,7 +336,7 @@ export const communityChannelsStrings = createTranslator('CommunityChannelsStrin }, resubmitModalBodySecond: { message: - 'Would you like to resubmit this version with your changes for community library review?', + 'Would you like to resubmit this version with your changes for Community Library review?', context: 'Second sentence of the body text of the modal shown after publishing a channel that already has Community Library submissions', }, @@ -365,7 +349,7 @@ export const communityChannelsStrings = createTranslator('CommunityChannelsStrin context: 'Action in the resubmit modal to dismiss the modal', }, licenseCheckPassed: { - message: 'License check passed', + message: 'License check passed.', context: 'Title shown when license audit passes (no invalid licenses found)', }, allLicensesCompatible: { @@ -373,11 +357,11 @@ export const communityChannelsStrings = createTranslator('CommunityChannelsStrin context: 'Message shown after listing compatible licenses when license check passes', }, incompatibleLicensesDetected: { - message: 'Incompatible licenses detected', + message: 'Incompatible licenses detected.', context: 'Title shown when invalid licenses are detected in the channel', }, channelCannotBeDistributed: { - message: 'this channel cannot be distributed via Kolibri.', + message: 'This channel cannot be distributed via Kolibri.', context: 'Message explaining that channels with incompatible licenses cannot be distributed', }, fixLicensingBeforeSubmission: { @@ -386,7 +370,7 @@ export const communityChannelsStrings = createTranslator('CommunityChannelsStrin }, incompatibleLicensesDescription: { message: - '"{licenseNames}" - this channel cannot be distributed via Kolibri. Please fix licensing before submitting a new version.', + '"{licenseNames}" - this channel cannot be distributed via Kolibri. If you cannot change the license, remove all resources with "{licenseNames}" before submitting again.', context: 'Description shown when incompatible licenses are detected, includes the license names and explanation', }, @@ -476,7 +460,7 @@ export const communityChannelsStrings = createTranslator('CommunityChannelsStrin 'Notification message shown to the user when their submission to the Community Library is successful', }, flaggedNotification: { - message: '{author} ({userType}) flagged {channelVersion}', + message: 'Changes required for {channelVersion}', context: 'Notification message shown when a user flags a channel version for review', }, submissionNotification: { @@ -520,8 +504,8 @@ export const communityChannelsStrings = createTranslator('CommunityChannelsStrin message: 'Channel version token', context: 'Label for the channel version token included in submission details page', }, - liveVersionLabel: { - message: 'Live version:', + publishedVersionLabel: { + message: 'Published version:', context: 'Label indicating the live version of a channel', }, activityHistoryLabel: { @@ -575,7 +559,7 @@ export const communityChannelsStrings = createTranslator('CommunityChannelsStrin }, channelTokenDescription: { message: - 'To preview your draft channel right away, simply copy the unique draft channel token. This is the sole method to access the channel.', + 'You can use this token to import and preview the draft channel in Kolibri. Please note that the token for the final published channel will be different.', context: 'Description for the channel token field in the draft preview instructions modal', }, getDraftTokenAction: { diff --git a/contentcuration/contentcuration/frontend/shared/views/communityLibrary/CommunityLibraryStatusChip.vue b/contentcuration/contentcuration/frontend/shared/views/communityLibrary/CommunityLibraryStatusChip.vue index a11b3bd51c..c3e0288484 100644 --- a/contentcuration/contentcuration/frontend/shared/views/communityLibrary/CommunityLibraryStatusChip.vue +++ b/contentcuration/contentcuration/frontend/shared/views/communityLibrary/CommunityLibraryStatusChip.vue @@ -37,7 +37,7 @@ const theme = themePalette(); - const { pendingStatus$, supersededStatus$, approvedStatus$, flaggedStatus$, liveStatus$ } = + const { pendingStatus$, supersededStatus$, approvedStatus$, flaggedStatus$, availableStatus$ } = communityChannelsStrings; const configChoices = { @@ -63,7 +63,7 @@ icon: 'circleCheckmark', }, [CommunityLibraryStatus.LIVE]: { - text: liveStatus$(), + text: availableStatus$(), backgroundColor: theme.green.v_100, labelColor: theme.green.v_600, borderColor: theme.green.v_400, diff --git a/contentcuration/contentcuration/frontend/shared/views/communityLibrary/SubmissionDetailsModal/index.vue b/contentcuration/contentcuration/frontend/shared/views/communityLibrary/SubmissionDetailsModal/index.vue index 72025bd130..a0393fc8cb 100644 --- a/contentcuration/contentcuration/frontend/shared/views/communityLibrary/SubmissionDetailsModal/index.vue +++ b/contentcuration/contentcuration/frontend/shared/views/communityLibrary/SubmissionDetailsModal/index.vue @@ -59,7 +59,7 @@ v-if="liveSubmission && submission.id !== liveSubmission.id" class="live-version" > - {{ liveVersionLabel$() }} + {{ publishedVersionLabel$() }}