Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 20 additions & 20 deletions echo/directus/sync/collections/operations.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,10 @@
}
}
},
"resolve": "34fb6ee5-2813-484a-a1cc-f97de097509b",
"reject": "8d8d787a-dbc4-44f9-9ab4-28e3f3d5f31c",
"resolve": "ea78ec02-364d-4f18-80f8-ea5ac4c787ed",
"reject": "eb6f8253-647f-4fb1-9010-e93594ba065e",
"flow": "17703446-fef0-49e9-bdc4-385db1311137",
"_syncId": "eaeb2c39-32e0-428d-ad03-ff0e6052adcc"
"_syncId": "4795cc24-3f3c-4be9-9844-24552da522fa"
},
{
"name": "Dutch",
Expand All @@ -34,10 +34,10 @@
}
}
},
"resolve": "ea78ec02-364d-4f18-80f8-ea5ac4c787ed",
"reject": "eb6f8253-647f-4fb1-9010-e93594ba065e",
"resolve": "34fb6ee5-2813-484a-a1cc-f97de097509b",
"reject": "8d8d787a-dbc4-44f9-9ab4-28e3f3d5f31c",
"flow": "17703446-fef0-49e9-bdc4-385db1311137",
"_syncId": "4795cc24-3f3c-4be9-9844-24552da522fa"
"_syncId": "eaeb2c39-32e0-428d-ad03-ff0e6052adcc"
},
{
"name": "Email Send Operation Failed",
Expand Down Expand Up @@ -79,7 +79,7 @@
"resolve": null,
"reject": null,
"flow": "17703446-fef0-49e9-bdc4-385db1311137",
"_syncId": "615a54cd-a72e-41ad-9403-9577c80280d6"
"_syncId": "84c38ea6-5d15-429f-8c24-9485d54ba7be"
},
{
"name": "Email Send Operation Failed Dutch",
Expand All @@ -93,7 +93,7 @@
"resolve": null,
"reject": null,
"flow": "17703446-fef0-49e9-bdc4-385db1311137",
"_syncId": "84c38ea6-5d15-429f-8c24-9485d54ba7be"
"_syncId": "615a54cd-a72e-41ad-9403-9577c80280d6"
},
{
"name": "failed",
Expand All @@ -107,7 +107,7 @@
"resolve": null,
"reject": null,
"flow": "17703446-fef0-49e9-bdc4-385db1311137",
"_syncId": "8d8d787a-dbc4-44f9-9ab4-28e3f3d5f31c"
"_syncId": "eb6f8253-647f-4fb1-9010-e93594ba065e"
},
{
"name": "failed",
Expand All @@ -121,7 +121,7 @@
"resolve": null,
"reject": null,
"flow": "17703446-fef0-49e9-bdc4-385db1311137",
"_syncId": "eb6f8253-647f-4fb1-9010-e93594ba065e"
"_syncId": "8d8d787a-dbc4-44f9-9ab4-28e3f3d5f31c"
},
{
"name": "Filter Emails",
Expand All @@ -132,10 +132,10 @@
"options": {
"code": "module.exports = async function(data) {\n\n const submissions = data.get_all_participants;\n \n // Filter submissions to only include those where email_opt_in is true\n const filteredSubmissions = submissions.filter(sub => sub.email_opt_in === true);\n\n // Create an array with email, project_id and an email_opt_out token for each submission\n const result = filteredSubmissions.map(sub => ({\n project_name: data.project_data[0].name || '',\n\t\tdefault_conversation_title: data.project_data[0].default_conversation_title || '',\n\t\tconversation_name: sub.conversation_id.participant_name || '',\n email: sub.email,\n project_id: sub.project_id || '',\n token: sub.email_opt_out_token,\n language: data.check_report_language[0].language || 'empty',\n ADMIN_BASE_URL: \"{{ $env.ADMIN_BASE_URL }}\" || \"http://localhost:5173\",\n PARTICIPANT_BASE_URL: \"{{ $env.PARTICIPANT_BASE_URL }}\" || \"http://localhost:5174\", \n }));\n \n return result;\n};"
},
"resolve": "b8144cee-59f6-40d9-a849-dd0c639e4e31",
"resolve": "e101f00d-2fb8-4f40-9e0e-4d24da5bb1e9",
"reject": null,
"flow": "ec4e7ea5-72de-4365-b66f-d8f11b549495",
"_syncId": "ca1ffbc5-cfce-4fb4-8f15-c128ea407d41"
"_syncId": "efb3982e-5703-4c07-8982-a6e1b5218e4a"
},
{
"name": "Filter Emails",
Expand All @@ -146,10 +146,10 @@
"options": {
"code": "module.exports = async function(data) {\n\n const submissions = data.get_all_participants;\n \n // Filter submissions to only include those where email_opt_in is true\n const filteredSubmissions = submissions.filter(sub => sub.email_opt_in === true);\n\n // Create an array with email, project_id and an email_opt_out token for each submission\n const result = filteredSubmissions.map(sub => ({\n project_name: data.project_data[0].name || '',\n\t\tdefault_conversation_title: data.project_data[0].default_conversation_title || '',\n\t\tconversation_name: sub.conversation_id.participant_name || '',\n email: sub.email,\n project_id: sub.project_id || '',\n token: sub.email_opt_out_token,\n language: data.check_report_language[0].language || 'empty',\n ADMIN_BASE_URL: \"{{ $env.ADMIN_BASE_URL }}\" || \"http://localhost:5173\",\n PARTICIPANT_BASE_URL: \"{{ $env.PARTICIPANT_BASE_URL }}\" || \"http://localhost:5174\", \n }));\n \n return result;\n};"
},
"resolve": "e101f00d-2fb8-4f40-9e0e-4d24da5bb1e9",
"resolve": "b8144cee-59f6-40d9-a849-dd0c639e4e31",
"reject": null,
"flow": "ec4e7ea5-72de-4365-b66f-d8f11b549495",
"_syncId": "efb3982e-5703-4c07-8982-a6e1b5218e4a"
"_syncId": "ca1ffbc5-cfce-4fb4-8f15-c128ea407d41"
},
{
"name": "log environment vars",
Expand All @@ -163,7 +163,7 @@
"resolve": null,
"reject": null,
"flow": "ec4e7ea5-72de-4365-b66f-d8f11b549495",
"_syncId": "7161e52e-b1cc-4c13-bedd-a9d64527026f"
"_syncId": "da5f4cce-eff0-426d-a207-d61366899d1f"
},
{
"name": "log environment vars",
Expand All @@ -177,7 +177,7 @@
"resolve": null,
"reject": null,
"flow": "ec4e7ea5-72de-4365-b66f-d8f11b549495",
"_syncId": "da5f4cce-eff0-426d-a207-d61366899d1f"
"_syncId": "7161e52e-b1cc-4c13-bedd-a9d64527026f"
},
{
"name": "Send Email",
Expand Down Expand Up @@ -318,9 +318,9 @@
]
},
"resolve": null,
"reject": "2b24450b-6a2e-4452-aba1-9814d17fef42",
"reject": "920bd181-b2a2-4f0d-94dc-3b1a08c3f4ef",
"flow": "17703446-fef0-49e9-bdc4-385db1311137",
"_syncId": "9390ed2f-7dc6-4a6a-83da-2d87d478261d"
"_syncId": "3dbf2ea1-17f8-4bde-aa89-43278fe9a00f"
},
{
"name": "Send Email English",
Expand Down Expand Up @@ -349,9 +349,9 @@
]
},
"resolve": null,
"reject": "920bd181-b2a2-4f0d-94dc-3b1a08c3f4ef",
"reject": "2b24450b-6a2e-4452-aba1-9814d17fef42",
"flow": "17703446-fef0-49e9-bdc4-385db1311137",
"_syncId": "3dbf2ea1-17f8-4bde-aa89-43278fe9a00f"
"_syncId": "9390ed2f-7dc6-4a6a-83da-2d87d478261d"
},
{
"name": "Trigger Email Flow",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,16 @@
"group": null,
"hidden": false,
"interface": "select-dropdown",
"note": "Manually syncronize this with https://admin-dembrane.azurewebsites.net/admin/content/echo__portal_tutorial",
"note": null,
"options": {
"choices": [
{
"text": "Skip Consent",
"value": "skip-consent"
},
{
"text": "None",
"value": "None"
"value": "none"
},
Comment on lines +14 to 24
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

cat echo/directus/sync/snapshot/fields/project/default_conversation_tutorial_slug.json

Repository: Dembrane/echo

Length of output: 1498


🏁 Script executed:

rg -i "default_conversation_tutorial_slug" --type ts --type tsx --type js --type jsx -A 5 -B 2

Repository: Dembrane/echo

Length of output: 84


🏁 Script executed:

rg "default_conversation_tutorial_slug" -A 5 -B 2

Repository: Dembrane/echo

Length of output: 14171


🏁 Script executed:

rg "None.*basic.*advanced" --type ts -B 5 -A 5

Repository: Dembrane/echo

Length of output: 1087


🏁 Script executed:

fd "migration" -t f | head -20

Repository: Dembrane/echo

Length of output: 89


🏁 Script executed:

cat echo/docs/database_migrations.md

Repository: Dembrane/echo

Length of output: 632


🏁 Script executed:

head -20 echo/frontend/src/lib/typesDirectus.d.ts

Repository: Dembrane/echo

Length of output: 840


🏁 Script executed:

git log --oneline echo/directus/sync/snapshot/fields/project/default_conversation_tutorial_slug.json | head -10

Repository: Dembrane/echo

Length of output: 95


🏁 Script executed:

git log -p --follow -1 echo/directus/sync/snapshot/fields/project/default_conversation_tutorial_slug.json | head -100

Repository: Dembrane/echo

Length of output: 39


🏁 Script executed:

grep -A 2 -B 2 '"None"' echo/frontend/src/routes/project/ProjectsHome.tsx

Repository: Dembrane/echo

Length of output: 261


Update TypeScript types and new project defaults for consistency; legacy data is safely handled by frontend.

The lowercase choice values ("skip-consent", "none", "basic", "advanced") and default_value: "none" align well with the frontend's slug normalization logic. However, a few inconsistencies need cleanup:

  • ProjectsHome.tsx still creates new projects with "None" (uppercase), which will be normalized by the frontend's toLowerCase() validation fallback, but should use "none" directly.
  • typesDirectus.d.ts defines the type as "None" | "basic" | "advanced" (missing "skip-consent" and using uppercase "None"); update it to match the schema choices.
  • Existing rows with "None" (uppercase) will appear as unlisted choices in Directus UI, though the frontend safely defaults them to "none". If you want a clean admin experience, backfill "None""none" in the database.
🤖 Prompt for AI Agents
In
echo/directus/sync/snapshot/fields/project/default_conversation_tutorial_slug.json
around lines 14-24, the schema choices are lowercase but the code/types still
reference an uppercase "None" and are missing "skip-consent"; update
ProjectsHome.tsx to create new projects with default_value "none" (lowercase),
update typesDirectus.d.ts to include "none" | "skip-consent" | "basic" |
"advanced" (all lowercase) so TypeScript matches the schema, and optionally run
a database backfill to convert existing "None" values to "none" for a consistent
Directus admin UI.

{
"text": "Basic",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,13 +42,7 @@ export interface LanguageCards {
[language: string]: Section[];
}

const ParticipantOnboardingCards = ({
project,
initialCards,
}: {
project: Project;
initialCards: LanguageCards;
}) => {
const ParticipantOnboardingCards = ({ project }: { project: Project }) => {
const [searchParams] = useSearchParams();
const skipOnboarding = searchParams.get("skipOnboarding");

Expand Down Expand Up @@ -79,11 +73,11 @@ const ParticipantOnboardingCards = ({

const { getSystemCards } = useOnboardingCards();

const tutorialSlug = project.default_conversation_tutorial_slug ?? "none";

const cards: LanguageCards = {
...initialCards,
"de-DE": [
...initialCards["de-DE"],
...getSystemCards("de-DE", initialCards["de-DE"].length > 0),
...getSystemCards("de-DE", tutorialSlug),
{
section: "Mikrofon-Check",
slides: [
Expand All @@ -108,8 +102,7 @@ const ParticipantOnboardingCards = ({
},
],
"en-US": [
...initialCards["en-US"],
...getSystemCards("en-US", initialCards["en-US"].length > 0),
...getSystemCards("en-US", tutorialSlug),
{
section: "Microphone Check",
slides: [
Expand All @@ -134,8 +127,7 @@ const ParticipantOnboardingCards = ({
},
],
"es-ES": [
...initialCards["es-ES"],
...getSystemCards("es-ES", initialCards["es-ES"].length > 0),
...getSystemCards("es-ES", tutorialSlug),
{
section: "Verificación del Micrófono",
slides: [
Expand All @@ -160,8 +152,7 @@ const ParticipantOnboardingCards = ({
},
],
"fr-FR": [
...initialCards["fr-FR"],
...getSystemCards("fr-FR", initialCards["fr-FR"].length > 0),
...getSystemCards("fr-FR", tutorialSlug),
{
section: "Vérification du Microphone",
slides: [
Expand All @@ -186,8 +177,7 @@ const ParticipantOnboardingCards = ({
},
],
"nl-NL": [
...initialCards["nl-NL"],
...getSystemCards("nl-NL", initialCards["nl-NL"].length > 0),
...getSystemCards("nl-NL", tutorialSlug),
{
section: "Microfoon Controle",
slides: [
Expand Down
Loading
Loading