Added opaque join-token support across backend and frontend: new migration/model/service/endpoints, guest controllers now resolve tokens, and the demo seeder seeds a token. Tenant event details list/manage tokens with copy/revoke actions, and the guest PWA uses tokens end-to-end (routing, storage, uploads, achievements, etc.). Docs TODO updated to reflect completed steps.

This commit is contained in:
Codex Agent
2025-10-12 10:32:37 +02:00
parent d04e234ca0
commit 9394c3171e
73 changed files with 3277 additions and 911 deletions

View File

@@ -0,0 +1,149 @@
{
"billing": {
"title": "Billing & credits",
"subtitle": "Manage balances, packages, and invoicing.",
"actions": {
"refresh": "Refresh",
"exportCsv": "Export CSV"
},
"errors": {
"load": "Unable to load billing data.",
"more": "Unable to load more ledger entries."
},
"sections": {
"overview": {
"title": "Credits & status",
"description": "Your current balance and active reseller package.",
"cards": {
"balance": {
"label": "Available credits"
},
"used": {
"label": "Events used",
"helper": "Remaining: {{count}}"
},
"price": {
"label": "Price (net)"
},
"expires": {
"label": "Expires",
"helper": "Auto-renews when active"
}
}
},
"packages": {
"title": "Package history",
"description": "Overview of active and past reseller packages.",
"empty": "No packages purchased yet.",
"card": {
"statusActive": "Active",
"statusInactive": "Inactive",
"used": "Events used",
"available": "Remaining",
"expires": "Expires"
}
},
"ledger": {
"title": "Credit ledger",
"description": "All credit additions and deductions.",
"empty": "No ledger entries recorded yet.",
"loadMore": "Load more",
"reasons": {
"purchase": "Credit purchase",
"usage": "Usage",
"manual": "Manual adjustment"
}
}
}
},
"members": {
"title": "Event members",
"subtitle": "Manage moderators, admins, and helpers for this event.",
"actions": {
"back": "Back to overview"
},
"errors": {
"missingSlug": "No event slug provided.",
"load": "Could not load members.",
"emailRequired": "Please provide an email address.",
"invite": "Invitation could not be sent.",
"remove": "Member could not be removed."
},
"alerts": {
"notFoundTitle": "Event not found",
"notFoundDescription": "Please return to the event list.",
"lockedTitle": "Feature not enabled",
"lockedDescription": "Member management isnt available for this event yet. Contact support to activate the feature."
},
"sections": {
"list": {
"title": "Members",
"empty": "No members invited yet."
},
"invite": {
"title": "Invite new member"
}
},
"labels": {
"status": "Status: {{status}}",
"joined": "Joined: {{date}}"
},
"form": {
"emailLabel": "Email",
"emailPlaceholder": "person@example.com",
"nameLabel": "Name (optional)",
"namePlaceholder": "Name",
"roleLabel": "Role",
"rolePlaceholder": "Select role",
"submit": "Send invitation"
},
"roles": {
"tenantAdmin": "Tenant admin",
"member": "Member",
"guest": "Guest"
},
"statuses": {
"published": "Published",
"draft": "Draft",
"active": "Active"
},
"eventStatus": "Status: {{status}}",
"events": {
"untitled": "Untitled event"
}
},
"tasks": {
"title": "Event tasks",
"subtitle": "Manage tasks associated with this event.",
"actions": {
"back": "Back to overview",
"assign": "Assign selected tasks"
},
"errors": {
"missingSlug": "No event slug provided.",
"load": "Event tasks could not be loaded.",
"assign": "Tasks could not be assigned."
},
"alerts": {
"notFoundTitle": "Event not found",
"notFoundDescription": "Please return to the event list."
},
"eventStatus": "Status: {{status}}",
"sections": {
"assigned": {
"title": "Assigned tasks",
"empty": "No tasks assigned yet."
},
"library": {
"title": "Add tasks from library",
"empty": "No tasks found in the library."
}
},
"priorities": {
"low": "Low",
"medium": "Medium",
"high": "High",
"urgent": "Urgent"
}
}
}