feat(course): auto-enrol button for paid course join requests (#769)

* feat(course): add auto-enrol flow for paid course join requests

- Extend teacher buy-request email with manual access steps and an
  Auto Enrol this Student button
- Link teachers to the course People page with grantAccess query param
- Add grant-access modal that sends the same org audience invite used
  by the Invite new students flow

Co-authored-by: Rotimi Best <rotimi-best@users.noreply.github.com>

* fix(i18n): translate grant access modal strings

Replace English placeholders copied into non-en locale files with
proper translations for each supported language.

Co-authored-by: Rotimi Best <rotimi-best@users.noreply.github.com>

* fix(email): shorten auto-enrol button label per review

Co-authored-by: Rotimi Best <rotimi-best@users.noreply.github.com>

* fix(email): use American spelling Enroll in auto-enroll CTA

Co-authored-by: Rotimi Best <rotimi-best@users.noreply.github.com>

* fix(i18n): localize Danish grant-access send invite label

Co-authored-by: Rotimi Best <rotimi-best@users.noreply.github.com>

---------

Co-authored-by: Rotimi Best <rotimi-best@users.noreply.github.com>
This commit is contained in:
Rotimi Best
2026-07-19 12:02:11 +01:00
committed by GitHub
co-authored by Rotimi Best
parent 634ffeab0f
commit 6c3a982daf
14 changed files with 180 additions and 0 deletions
@@ -11,6 +11,7 @@
import * as Avatar from '@cio/ui/base/avatar';
import { ComingSoon, RoleBasedSecurity, UpgradeBanner } from '$features/ui';
import InvitationModal from '$features/course/components/people/invitation-modal.svelte';
import GrantAccessModal from '$features/course/components/people/grant-access-modal.svelte';
import DeleteConfirmation from '$features/course/components/people/delete-confirmation.svelte';
import { isStudentLimitReached } from '$lib/utils/store/org';
@@ -101,6 +102,7 @@
</script>
<InvitationModal />
<GrantAccessModal />
{#if $isStudentLimitReached}
<UpgradeBanner className="mb-2">{$t('course.navItem.people.invite_modal.student_limit_reached')}</UpgradeBanner>