Skip to content
Merged
12 changes: 1 addition & 11 deletions echo/frontend/src/components/chat/ChatModeBanner.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -38,17 +38,7 @@ export const ChatModeBanner = ({
)}
</Text>
{isOverview && (
<Badge
size="xs"
variant="outline"
styles={{
root: {
backgroundColor: "transparent",
borderColor: "var(--app-text)",
color: "var(--app-text)",
},
}}
>
<Badge size="sm" color="mauve" c="graphite">
<Trans>Beta</Trans>
</Badge>
)}
Expand Down
12 changes: 1 addition & 11 deletions echo/frontend/src/components/chat/ChatModeSelector.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -138,17 +138,7 @@ const ModeCard = ({
{title}
</Text>
{isBeta && (
<Badge
size="sm"
variant="outline"
styles={{
root: {
backgroundColor: "transparent",
borderColor: "var(--app-text)",
color: "var(--app-text)",
},
}}
>
<Badge size="sm" color="mauve" c="graphite">
<Trans>Beta</Trans>
</Badge>
)}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,7 @@ export const MoveConversationButton = ({
{...testId("conversation-move-button")}
>
<Group>
<Badge>
<Badge color="mauve" c="graphite" size="sm">
<Trans>Beta</Trans>
</Badge>
<Trans>Move to Another Project</Trans>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@ import { useI18nNavigate } from "@/hooks/useI18nNavigate";
import { analytics } from "@/lib/analytics";
import { AnalyticsEvents as events } from "@/lib/analyticsEvents";
import { testId } from "@/lib/testUtils";
import { useProjectById } from "../project/hooks";
import { ExponentialProgress } from "../common/ExponentialProgress";
import { useProjectById } from "../project/hooks";
import { useRetranscribeConversationMutation } from "./hooks";

export const RetranscribeConversationModalActionIcon = ({
Expand Down Expand Up @@ -131,7 +131,7 @@ export const RetranscribeConversationModal = ({
title={
<Group gap="xs">
<Text>{t`Retranscribe Conversation`}</Text>
<Badge color="primary" size="sm">
<Badge color="mauve" c="graphite" size="sm">
<Trans>Beta</Trans>
</Badge>
</Group>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,15 @@ const INSTRUCTIONS = [
{
key: "receive-artefact",
render: (objectLabel: string) => (
<Trans id="participant.concrete.instructions.receive.artefact">
You'll soon get {objectLabel} to make them concrete.
<Trans id="participant.verify.instructions.receive.artefact">
You'll soon get {objectLabel} to verify.
</Trans>
),
},
{
key: "read-aloud",
render: (objectLabel: string) => (
<Trans id="participant.concrete.instructions.read.aloud">
<Trans id="participant.verify.instructions.read.aloud">
Once you receive the {objectLabel}, read it aloud and share out loud
what you want to change, if anything.
</Trans>
Expand All @@ -32,7 +32,7 @@ const INSTRUCTIONS = [
{
key: "revise-artefact",
render: (objectLabel: string) => (
<Trans id="participant.concrete.instructions.revise.artefact">
<Trans id="participant.verify.instructions.revise.artefact">
Once you have discussed, hit "revise" to see the {objectLabel} change to
reflect your discussion.
</Trans>
Expand All @@ -41,7 +41,7 @@ const INSTRUCTIONS = [
{
key: "approve-artefact",
render: (objectLabel: string) => (
<Trans id="participant.concrete.instructions.approve.artefact">
<Trans id="participant.verify.instructions.approve.artefact">
If you are happy with the {objectLabel} click "Approve" to show you feel
heard.
</Trans>
Expand All @@ -50,7 +50,7 @@ const INSTRUCTIONS = [
{
key: "approval-helps",
render: (_objectLabel: string) => (
<Trans id="participant.concrete.instructions.approval.helps">
<Trans id="participant.verify.instructions.approval.helps">
Your approval helps us understand what you really think!
</Trans>
),
Expand Down Expand Up @@ -110,9 +110,9 @@ export const VerifyInstructions = ({
{...testId("portal-verify-instructions-next-button")}
>
{isLoading ? (
<Trans id="participant.concrete.instructions.loading">Loading</Trans>
<Trans id="participant.verify.instructions.loading">Loading</Trans>
) : (
<Trans id="participant.concrete.instructions.button.next">Next</Trans>
<Trans id="participant.verify.instructions.button.next">Next</Trans>
)}
</Button>
</Stack>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -198,8 +198,8 @@ export const VerifySelection = () => {
{/* Main content */}
<Stack gap="xl" className="flex-grow">
<Title order={3} className="font-semibold">
<Trans id="participant.concrete.selection.title">
What do you want to make concrete?
<Trans id="participant.verify.selection.title">
What do you want to verify?
</Trans>
</Title>

Expand Down Expand Up @@ -254,7 +254,7 @@ export const VerifySelection = () => {
{isLoading ? (
<Trans>Loading…</Trans>
) : (
<Trans id="participant.concrete.selection.button.next">Next</Trans>
<Trans id="participant.verify.selection.button.next">Next</Trans>
)}
</Button>
</Stack>
Expand Down
104 changes: 66 additions & 38 deletions echo/frontend/src/components/project/ProjectPortalEditor.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -40,15 +40,15 @@ import { useProjectSharingLink } from "./ProjectQRCode";
import { ProjectTagsInput } from "./ProjectTagsInput";

const FormSchema = z.object({
anonymize_transcripts: z.boolean(),
conversation_title_prompt: z.string(),
default_conversation_ask_for_participant_name: z.boolean(),
default_conversation_ask_for_participant_email: z.boolean(),
default_conversation_ask_for_participant_name: z.boolean(),
default_conversation_description: z.string(),
default_conversation_finish_text: z.string(),
default_conversation_title: z.string(),
default_conversation_transcript_prompt: z.string(),
default_conversation_tutorial_slug: z.string(),
anonymize_transcripts: z.boolean(),
enable_ai_title_and_tags: z.boolean(),
get_reply_mode: z.string(),
get_reply_prompt: z.string(),
Expand Down Expand Up @@ -252,11 +252,12 @@ const ProjectPortalEditorComponent: React.FC<ProjectPortalEditorProps> = ({
: "none";

return {
anonymize_transcripts: project.anonymize_transcripts ?? false,
conversation_title_prompt: project.conversation_title_prompt ?? "",
default_conversation_ask_for_participant_name:
project.default_conversation_ask_for_participant_name ?? false,
default_conversation_ask_for_participant_email:
project.default_conversation_ask_for_participant_email ?? false,
default_conversation_ask_for_participant_name:
project.default_conversation_ask_for_participant_name ?? false,
default_conversation_description:
project.default_conversation_description ?? "",
default_conversation_finish_text:
Expand All @@ -265,7 +266,6 @@ const ProjectPortalEditorComponent: React.FC<ProjectPortalEditorProps> = ({
default_conversation_transcript_prompt:
project.default_conversation_transcript_prompt ?? "",
default_conversation_tutorial_slug: normalizedTutorialSlug ?? "none",
anonymize_transcripts: project.anonymize_transcripts ?? false,
enable_ai_title_and_tags: project.enable_ai_title_and_tags ?? false,
get_reply_mode: project.get_reply_mode ?? "summarize",
get_reply_prompt: project.get_reply_prompt ?? "",
Expand Down Expand Up @@ -532,9 +532,7 @@ const ProjectPortalEditorComponent: React.FC<ProjectPortalEditorProps> = ({
/>
}
description={
<Trans>
Optional field on the start page
</Trans>
<Trans>Optional field on the start page</Trans>
}
checked={field.value}
onChange={(e) =>
Expand Down Expand Up @@ -563,9 +561,7 @@ const ProjectPortalEditorComponent: React.FC<ProjectPortalEditorProps> = ({
/>
}
description={
<Trans>
Optional field on the thank you page
</Trans>
<Trans>Optional field on the thank you page</Trans>
}
checked={field.value}
onChange={(e) =>
Expand Down Expand Up @@ -638,7 +634,7 @@ const ProjectPortalEditorComponent: React.FC<ProjectPortalEditorProps> = ({
<Trans>Explore</Trans>
</Title>
<Logo hideTitle alwaysDembrane />
<Badge>
<Badge color="mauve" c="graphite" size="sm">
<Trans id="dashboard.dembrane.concrete.beta">
Beta
</Trans>
Expand Down Expand Up @@ -845,21 +841,21 @@ const ProjectPortalEditorComponent: React.FC<ProjectPortalEditorProps> = ({
</Trans>
</Title>
<Logo hideTitle alwaysDembrane />
<Badge>
<Trans id="dashboard.dembrane.concrete.beta">
<Badge color="mauve" c="graphite" size="sm">
<Trans id="dashboard.dembrane.verify.beta">
Beta
</Trans>
</Badge>
</Group>

<Text size="sm" c="dimmed">
<Trans id="dashboard.dembrane.concrete.description">
Enable this feature to allow participants to create
and approve "concrete objects" from their submissions.
This helps crystallize key ideas, concerns, or
summaries. After the conversation, you can filter for
discussions with concrete objects and review them in
the overview.
<Trans id="dashboard.dembrane.feature.verify.description">
Enable this feature to allow participants to verify
and approve "outcomes" from their submissions. This
helps crystallize key ideas, concerns, or summaries.
After the conversation, you can filter for discussions
with verified outcomes and review them in the
overview.
</Trans>
</Text>

Expand Down Expand Up @@ -894,7 +890,7 @@ const ProjectPortalEditorComponent: React.FC<ProjectPortalEditorProps> = ({
render={({ field }) => (
<Stack gap="xs">
<FormLabel
label={t`Concrete Topics`}
label={t`Verify Topics`}
isDirty={
!!formState.dirtyFields.verification_topics
}
Expand All @@ -903,18 +899,18 @@ const ProjectPortalEditorComponent: React.FC<ProjectPortalEditorProps> = ({
}
/>
<Text size="sm" c="dimmed">
<Trans id="dashboard.dembrane.verify.topic.select">
<Trans id="dashboard.dembrane.feature.verify.topic.select">
Select which topics participants can use for
"Verify".
</Trans>
</Text>
{isVerificationTopicsLoading ? (
<Text size="sm" c="dimmed">
<Trans>Loading concrete topics…</Trans>
<Trans>Loading verify topics…</Trans>
</Text>
) : availableVerifyTopics.length === 0 ? (
<Text size="sm" c="dimmed">
<Trans>No concrete topics available.</Trans>
<Trans>No verify topics available.</Trans>
</Text>
) : (
<Group gap="xs">
Expand Down Expand Up @@ -1174,13 +1170,16 @@ const ProjectPortalEditorComponent: React.FC<ProjectPortalEditorProps> = ({
<Title order={4}>
<Trans>Anonymize Transcripts</Trans>
</Title>
<Badge>
<Badge color="mauve" c="graphite" size="sm">
<Trans>Beta</Trans>
</Badge>
</Group>
<Text size="sm" c="dimmed">
<Trans>
When enabled, all new transcripts will have personal information (names, emails, phone numbers, addresses) replaced with placeholders. This cannot be undone for already-processed conversations.
When enabled, all new transcripts will have personal
information (names, emails, phone numbers, addresses)
replaced with placeholders. This cannot be undone for
already-processed conversations.
</Trans>
</Text>
<Controller
Expand All @@ -1191,12 +1190,18 @@ const ProjectPortalEditorComponent: React.FC<ProjectPortalEditorProps> = ({
label={
<FormLabel
label={t`Enable transcript anonymization`}
isDirty={formState.dirtyFields.anonymize_transcripts}
error={formState.errors.anonymize_transcripts?.message}
isDirty={
formState.dirtyFields.anonymize_transcripts
}
error={
formState.errors.anonymize_transcripts?.message
}
/>
}
checked={field.value}
onChange={(e) => field.onChange(e.currentTarget.checked)}
onChange={(e) =>
field.onChange(e.currentTarget.checked)
}
/>
)}
/>
Expand All @@ -1207,13 +1212,17 @@ const ProjectPortalEditorComponent: React.FC<ProjectPortalEditorProps> = ({
<Title order={4}>
<Trans>Auto-generate Titles</Trans>
</Title>
<Badge>
<Badge color="mauve" c="graphite" size="sm">
<Trans>Beta</Trans>
</Badge>
</Group>
<Text size="sm" c="dimmed">
<Trans>
Automatically generate a short topic-based title for each conversation after summarization. The title describes what was discussed, not who participated. The participant's original name is preserved separately, if they provided one.
Automatically generate a short topic-based title for
each conversation after summarization. The title
describes what was discussed, not who participated. The
participant's original name is preserved separately, if
they provided one.
</Trans>
</Text>
<Controller
Expand All @@ -1224,12 +1233,19 @@ const ProjectPortalEditorComponent: React.FC<ProjectPortalEditorProps> = ({
label={
<FormLabel
label={t`Auto-generate titles`}
isDirty={formState.dirtyFields.enable_ai_title_and_tags}
error={formState.errors.enable_ai_title_and_tags?.message}
isDirty={
formState.dirtyFields.enable_ai_title_and_tags
}
error={
formState.errors.enable_ai_title_and_tags
?.message
}
/>
}
checked={field.value}
onChange={(e) => field.onChange(e.currentTarget.checked)}
onChange={(e) =>
field.onChange(e.currentTarget.checked)
}
/>
)}
/>
Expand All @@ -1242,11 +1258,23 @@ const ProjectPortalEditorComponent: React.FC<ProjectPortalEditorProps> = ({
label={
<FormLabel
label={t`Custom title prompt`}
isDirty={formState.dirtyFields.conversation_title_prompt}
error={formState.errors.conversation_title_prompt?.message}
isDirty={
formState.dirtyFields
.conversation_title_prompt
}
error={
formState.errors.conversation_title_prompt
?.message
}
/>
}
description={<Trans>Guide how titles are generated. Titles describe the topic of the conversation, not the participant.</Trans>}
description={
<Trans>
Guide how titles are generated. Titles describe
the topic of the conversation, not the
participant.
</Trans>
}
placeholder={t`e.g. "Use short noun phrases like 'Urban Green Spaces' or 'Youth Employment'. Avoid generic titles."`}
autosize
minRows={2}
Expand Down
Loading
Loading