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": "Nome",
"email": "E-mail",
"date_joined": "Data de adesão",
"upgrade": "Atualize seu plano para convidar mais alunos"
"upgrade": "Atualize seu plano para convidar mais alunos",
"import_users": "Importar usuários",
"search_placeholder": "Pesquisar…",
"status": "Estado",
"status_active": "Ativo",
"status_pending": "Pendente",
"status_expired": "Expirado",
"status_revoked": "Revogado",
"select_all": "Selecionar tudo",
"selected_count": "{contagem} selecionados",
"assign_courses": "Atribuir a cursos",
"invite": {
"row_actions_aria": "Ações abertas",
"resend": "Reenviar convite",
"revoke": "Revogar convite pendente",
"resend_snackbar_success": "E-mail de convite enviado",
"resend_snackbar_email_failed": "O convite foi renovado, mas não foi possível enviar o e-mail",
"revoke_snackbar_success": "Convite pendente revogado"
},
"assign": {
"title": "Atribuir a cursos",
"description": "Conceda aos usuários selecionados acesso aos cursos e, opcionalmente, notifique-os por e-mail.",
"select_courses": "Selecione os cursos",
"select_courses_placeholder": "Escolha cursos...",
"send_email": "Enviar e-mail de notificação",
"submit": "Atribuir",
"cancel": "Cancelar",
"snackbar_success": "{assigned} usuários atribuídos aos cursos ({alreadyEnrolled} já inscrito, {emailsSent} e-mails enviados)",
"snackbar_no_courses": "Selecione pelo menos um curso",
"snackbar_failed": "Falha ao atribuir cursos"
},
"import": {
"title": "Importar usuários",
"description": "Adicione alunos à sua organização inserindo seus endereços de e-mail. Opcionalmente, atribua-os a cursos e envie e-mails de convite.",
"emails_label": "Endereços de e-mail",
"emails_placeholder": "Insira e-mails separados por vírgulas, novas linhas ou ponto e vírgula\npor exemplo [email protected], [email protected]",
"course_access": "Acesso ao curso",
"no_courses": "Nenhuma tarefa de curso",
"all_courses": "Todos os cursos",
"select_courses": "Selecione cursos específicos",
"select_courses_placeholder": "Escolha cursos...",
"send_email": "Enviar e-mail de convite para usuários importados",
"submit": "Importar usuários",
"back": "Voltar ao público",
"snackbar_success": "Usuários {importados} importados ({skipped} já existia, {emailsSent} emails enviados)",
"snackbar_no_emails": "Insira pelo menos um endereço de e-mail",
"snackbar_failed": "Falha ao importar usuários"
}
},
"community": {
"title": "Comunidade",
@@ -940,6 +987,8 @@
"complete": "Completo",
"next": "Próximo",
"prev": "Anterior",
"prev_shortcut": "Anterior (←)",
"next_shortcut": "Próximo (→)",
"disabled": "O recurso está desativado",
"version_history": {
"title": "Histórico de versões",
@@ -1200,6 +1249,9 @@
},
"edit": {
"accepted_answers_placeholder": "Respostas aceitas (separadas por vírgula)"
},
"review": {
"your_answer_label": "Enviado:"
}
},
"numeric": {
@@ -1217,6 +1269,11 @@
"tolerance_info": "Diferença permitida do valor correto (por exemplo, 0,5 aceita +/-0,5).",
"correct_value_placeholder": "Valor correto",
"tolerance_placeholder": "Tolerância"
},
"review": {
"your_answer_label": "Enviado:",
"in_range": "Dentro da tolerância",
"out_of_range": "Tolerância externa"
}
},
"short_answer": {
@@ -1228,6 +1285,10 @@
},
"edit": {
"instructions_placeholder": "Instruções opcionais"
},
"review": {
"your_answer_label": "Enviado:",
"accepted_label": "Respostas aceitas"
}
},
"true_false": {
@@ -1291,8 +1352,9 @@
"option_prefix": "Opção",
"remove": "Remover",
"add_option": "Adicionar opção",
"correct_badge": "(Correto)",
"not_set": "Não definido"
"correct_badge": "Correto",
"not_set": "Não definido",
"incorrect_badge": "Incorreto"
}
}
},
@@ -1473,7 +1535,10 @@
"cancel": "Cancelar"
},
"content_locked_title": "Este conteúdo está bloqueado",
"content_locked_description": "Seu instrutor ainda não desbloqueou este conteúdo. Conclua o conteúdo anterior ou volte mais tarde."
"content_locked_description": "Seu instrutor ainda não desbloqueou este conteúdo. Conclua o conteúdo anterior ou volte mais tarde.",
"saving": "Salvando…",
"saved": "Salvo",
"draft_recovery": "Um rascunho não salvo foi encontrado para esta lição. Você gostaria de restaurá-lo?"
},
"news_feed": {
"heading": "Feed de notícias",
@@ -1582,6 +1647,7 @@
"unpublished": "Não publicado",
"continue_course": "Continuar",
"learn_more": "Saiba mais",
"tags_overflow_aria": "Mais {count} tags",
"list_view": {
"title": "Título",
"description": "Descrição",
@@ -2245,7 +2311,8 @@
"email_password_disabled_message": "O login por e-mail/senha está desativado para esta organização.",
"google_auth_disabled": "A autenticação do Google está desativada.",
"signup_disabled_error": "A inscrição está desativada para esta organização. Entre em contato com seu administrador.",
"or_continue_with": "Ou continue com e-mail e senha"
"or_continue_with": "Ou continue com e-mail e senha",
"sso_enabled": "{provider} está ativado para esta organização"
},
"tabs": {
"general": "Geral",
@@ -2471,7 +2538,8 @@
"edit_group": "Editar grupo",
"edit_tag": "Editar etiqueta",
"save": "Salvar",
"cancel": "Cancelar"
"cancel": "Cancelar",
"actions_menu": "Ações de tags"
},
"common": {
"not_available": "N/A"
@@ -2480,9 +2548,13 @@
"invite": {
"organization": {
"page_title": "Junte-se a {orgName} no ClassroomIO",
"role_label": "Função: {função}",
"email_label": "E-mail convidado: {email}",
"join_button": "Junte-se à organização",
"invitation_student": "Você foi convidado para {orgName} como aluno.",
"invitation_teacher": "Você foi convidado para {orgName} como professor.",
"invitation_admin": "Você foi convidado para {orgName} como administrador.",
"invitation_fallback": "Você foi convidado para {orgName} como {role}.",
"email_line": "E-mail: {email}",
"accept_button": "Aceitar convite",
"go_to_dashboard": "Ir para o painel",
"messages": {
"email_mismatch": "Você está conectado com um e-mail diferente deste convite.",
"expired": "Este link de convite expirou.",
@@ -2520,6 +2592,17 @@
"cancel": "Cancel",
"save": "Create key"
}
},
"usage": {
"title": "Uso e limites",
"description": "O MCP está disponível em todos os planos, mas o uso é controlado com créditos mensais de automação e limites principais.",
"credits_title": "Créditos restantes",
"credits_description": "As ações mutantes do MCP consomem créditos. As ações de leitura são gratuitas.",
"keys_title": "Chaves ativas",
"keys_description": "Use uma chave MCP por integração para que o acesso possa ser alternado ou revogado de forma limpa.",
"rate_limits_title": "Limites de taxa",
"rate_limits_description": "Solicitações de leitura/gravação/publicação permitidas por minuto.",
"used_label": "Usado:"
}
},
"keys": {
@@ -2534,7 +2617,11 @@
"never_used": "Nunca",
"scopes_label": "Escopos:",
"revoke_confirm": "Revogar esta chave de automação?",
"rotate_confirm": "Girar esta chave de automação?"
"rotate_confirm": "Girar esta chave de automação?",
"table_key": "Chave",
"table_status": "Estado",
"table_created": "Criado",
"table_last_used": "Usado pela última vez"
},
"clients": {
"claude_code": "Código Claude",