Enhance audience management features with new components and API integrations

- Added `AssignCoursesModal`, `AudienceMemberRow`, `AudienceTable`, and related components for improved audience management UI.
- Implemented audience invite actions including resend and revoke functionality.
- Updated audience API to support importing members and assigning courses.
- Refactored audience data handling to include status and invite management.
- Improved overall user experience with pagination and selection features in the audience table.
This commit is contained in:
Rotimi Best
2026-03-22 18:42:23 +01:00
parent e9c4082f89
commit 3919ff6c2f
157 changed files with 13183 additions and 872 deletions
@@ -475,7 +475,54 @@
"name": "Navn",
"email": "E-mail",
"date_joined": "Dato tilmeldt",
"upgrade": "Opgrader din plan for at invitere flere elever"
"upgrade": "Opgrader din plan for at invitere flere elever",
"import_users": "Importer brugere",
"search_placeholder": "Søg...",
"status": "Status",
"status_active": "Aktiv",
"status_pending": "Afventer",
"status_expired": "Udløbet",
"status_revoked": "Tilbagekaldt",
"select_all": "Vælg alle",
"selected_count": "{count} valgt",
"assign_courses": "Tildel til kurser",
"invite": {
"row_actions_aria": "Åbne handlinger",
"resend": "Send invitationen igen",
"revoke": "Tilbagekald afventende invitation",
"resend_snackbar_success": "Invitationsmail sendt",
"resend_snackbar_email_failed": "Invitationen blev fornyet, men e-mailen kunne ikke sendes",
"revoke_snackbar_success": "Afventende invitation tilbagekaldt"
},
"assign": {
"title": "Tildel til kurser",
"description": "Giv de valgte brugere adgang til kurser og giv dem eventuelt besked via e-mail.",
"select_courses": "Vælg kurser",
"select_courses_placeholder": "Vælg kurser...",
"send_email": "Send notifikations-e-mail",
"submit": "Tildel",
"cancel": "Annuller",
"snackbar_success": "Tildelt {assigned} brugere til kurser ({alreadyEnrolled} allerede tilmeldt, {emailsSent} e-mails sendt)",
"snackbar_no_courses": "Vælg venligst mindst ét kursus",
"snackbar_failed": "Kunne ikke tildele kurser"
},
"import": {
"title": "Importer brugere",
"description": "Tilføj elever til din organisation ved at indtaste deres e-mailadresser. Tildel dem eventuelt til kurser og send invitationsmails.",
"emails_label": "E-mail-adresser",
"emails_placeholder": "Indtast e-mails adskilt af kommaer, nye linjer eller semikolon\nf.eks. [email protected], [email protected]",
"course_access": "Kursusadgang",
"no_courses": "Ingen kursusopgave",
"all_courses": "Alle kurser",
"select_courses": "Vælg specifikke kurser",
"select_courses_placeholder": "Vælg kurser...",
"send_email": "Send invitationsmail til importerede brugere",
"submit": "Importer brugere",
"back": "Tilbage til Publikum",
"snackbar_success": "Importerede {importerede} brugere ({skipped} eksisterede allerede, {emailsSent} e-mails sendt)",
"snackbar_no_emails": "Indtast venligst mindst én e-mailadresse",
"snackbar_failed": "Kunne ikke importere brugere"
}
},
"community": {
"title": "Fællesskab",
@@ -940,6 +987,8 @@
"complete": "Komplet",
"next": "Næste",
"prev": "Prev",
"prev_shortcut": "Forrige (←)",
"next_shortcut": "Næste (→)",
"disabled": "Funktionen er deaktiveret",
"version_history": {
"title": "Versionshistorik",
@@ -1200,6 +1249,9 @@
},
"edit": {
"accepted_answers_placeholder": "Accepterede svar (kommasepareret)"
},
"review": {
"your_answer_label": "Indsendt:"
}
},
"numeric": {
@@ -1217,6 +1269,11 @@
"tolerance_info": "Tilladt forskel fra den korrekte værdi (f.eks. accepterer 0,5 +/-0,5).",
"correct_value_placeholder": "Korrekt værdi",
"tolerance_placeholder": "Tolerance"
},
"review": {
"your_answer_label": "Indsendt:",
"in_range": "Inden for tolerance",
"out_of_range": "Ydre tolerance"
}
},
"short_answer": {
@@ -1228,6 +1285,10 @@
},
"edit": {
"instructions_placeholder": "Valgfri instruktioner"
},
"review": {
"your_answer_label": "Indsendt:",
"accepted_label": "Accepterede svar"
}
},
"true_false": {
@@ -1291,8 +1352,9 @@
"option_prefix": "Mulighed",
"remove": "Fjern",
"add_option": "Tilføj mulighed",
"correct_badge": "(korrekt)",
"not_set": "Ikke indstillet"
"correct_badge": "korrekt",
"not_set": "Ikke indstillet",
"incorrect_badge": "Forkert"
}
}
},
@@ -1473,7 +1535,10 @@
"cancel": "Annuller"
},
"content_locked_title": "Dette indhold er låst",
"content_locked_description": "Din instruktør har ikke låst dette indhold op endnu. Fuldfør tidligere indhold, eller tjek tilbage senere."
"content_locked_description": "Din instruktør har ikke låst dette indhold op endnu. Fuldfør tidligere indhold, eller tjek tilbage senere.",
"saving": "Gemmer...",
"saved": "Gemt",
"draft_recovery": "Der blev fundet et ikke-gemt udkast til denne lektion. Vil du gendanne den?"
},
"news_feed": {
"heading": "Nyhedsfeed",
@@ -1582,6 +1647,7 @@
"unpublished": "Upubliceret",
"continue_course": "Fortsæt",
"learn_more": "Få flere oplysninger",
"tags_overflow_aria": "{count} flere tags",
"list_view": {
"title": "Titel",
"description": "Beskrivelse",
@@ -2245,7 +2311,8 @@
"email_password_disabled_message": "E-mail/adgangskodelogin er deaktiveret for denne organisation.",
"google_auth_disabled": "Google-godkendelse er deaktiveret.",
"signup_disabled_error": "Tilmelding er deaktiveret for denne organisation. Kontakt venligst din administrator.",
"or_continue_with": "Eller fortsæt med e-mail og adgangskode"
"or_continue_with": "Eller fortsæt med e-mail og adgangskode",
"sso_enabled": "{provider} er aktiveret for denne organisation"
},
"tabs": {
"general": "Generelt",
@@ -2471,7 +2538,8 @@
"edit_group": "Rediger gruppe",
"edit_tag": "Rediger tag",
"save": "Gem",
"cancel": "Annuller"
"cancel": "Annuller",
"actions_menu": "Tag handlinger"
},
"common": {
"not_available": "N/A"
@@ -2480,9 +2548,13 @@
"invite": {
"organization": {
"page_title": "Tilmeld dig {orgName} på ClassroomIO",
"role_label": "Rolle: {role}",
"email_label": "Inviteret e-mail: {email}",
"join_button": "Deltag i organisationen",
"invitation_student": "Du er blevet inviteret til {orgName} som elev.",
"invitation_teacher": "Du er blevet inviteret til {orgName} som lærer.",
"invitation_admin": "Du er blevet inviteret til {orgName} som administrator.",
"invitation_fallback": "Du er blevet inviteret til {orgName} som {role}.",
"email_line": "E-mail: {email}",
"accept_button": "Acceptér invitation",
"go_to_dashboard": "Gå til dashboard",
"messages": {
"email_mismatch": "Du er logget ind med en anden e-mail end denne invitation.",
"expired": "Dette invitationslink er udløbet.",
@@ -2520,6 +2592,17 @@
"cancel": "Cancel",
"save": "Create key"
}
},
"usage": {
"title": "Anvendelse og grænser",
"description": "MCP er tilgængelig på alle abonnementer, men brugen styres med månedlige automatiseringskreditter og nøglegrænser.",
"credits_title": "Kreditter tilbage",
"credits_description": "Muterende MCP-handlinger bruger kreditter. Læsehandlinger er gratis.",
"keys_title": "Aktive nøgler",
"keys_description": "Brug én MCP-nøgle pr. integration, så adgang kan roteres eller tilbagekaldes rent.",
"rate_limits_title": "Satsgrænser",
"rate_limits_description": "Læs/skriv/publicér anmodninger tilladt pr. minut.",
"used_label": "Brugt:"
}
},
"keys": {
@@ -2534,7 +2617,11 @@
"never_used": "Aldrig",
"scopes_label": "Omfang:",
"revoke_confirm": "Vil du tilbagekalde denne automatiseringsnøgle?",
"rotate_confirm": "Drej denne automatiseringsnøgle?"
"rotate_confirm": "Drej denne automatiseringsnøgle?",
"table_key": "Nøgle",
"table_status": "Status",
"table_created": "Oprettet",
"table_last_used": "Sidst brugt"
},
"clients": {
"claude_code": "Claude kode",