feat: add cross-organization member search and template cloning functionality

This commit is contained in:
T. Zehetbauer
2026-04-01 10:15:35 +02:00
parent d3db316a68
commit fd8c2cc32a
36 changed files with 9025 additions and 94 deletions

View File

@@ -0,0 +1,306 @@
{
"nav": {
"overview": "Overview",
"clubs": "Clubs",
"hierarchy": "Hierarchy",
"memberSearch": "Member Search",
"events": "Events",
"reporting": "Reports",
"templates": "Templates",
"statistics": "Statistics",
"settings": "Settings"
},
"pages": {
"overviewTitle": "Association Management",
"clubsTitle": "Association Management - Clubs",
"hierarchyTitle": "Association Management - Hierarchy",
"hierarchyDescription": "Manage the organizational structure of your association",
"memberSearchTitle": "Association Management - Member Search",
"memberSearchDescription": "Search members across all linked organizations",
"eventsTitle": "Association Management - Events",
"eventsDescription": "View and filter events across all linked organizations",
"reportingTitle": "Association Management - Reports",
"reportingDescription": "Aggregated reports and metrics across all organizations",
"templatesTitle": "Association Management - Templates",
"templatesDescription": "Clone and use shared templates from the association hierarchy",
"statisticsTitle": "Association Management - Statistics",
"settingsTitle": "Association Management - Settings"
},
"common": {
"search": "Search",
"filter": "Filter",
"cancel": "Cancel",
"save": "Save",
"delete": "Delete",
"edit": "Edit",
"add": "Add",
"create": "Create",
"back": "Back",
"next": "Next",
"saving": "Saving...",
"name": "Name",
"email": "Email",
"phone": "Phone",
"location": "Location",
"status": "Status",
"actions": "Actions",
"action": "Action",
"type": "Type",
"date": "Date",
"description": "Description",
"noEntries": "No entries found.",
"allTypes": "All Types",
"allStatuses": "All Statuses",
"allOrganizations": "All Organizations",
"organization": "Organization",
"archived": "Archived",
"showArchived": "Show Archived",
"hideArchived": "Hide Archived"
},
"pagination": {
"page": "Page {page} of {totalPages} ({total} entries)",
"back": "Back",
"next": "Next"
},
"dashboard": {
"title": "Association Management Overview",
"subtitle": "Manage clubs, fees, contacts, and tasks",
"activeClubs": "Active Clubs",
"totalMembers": "Total Members",
"openFees": "Open Fees",
"invoiceCount": "{count} invoices",
"openTasks": "Open Tasks",
"clubTypes": "Club Types",
"archivedClubs": "Archived Clubs",
"clubsWithoutContact": "Clubs Without Contact",
"allClubsWithContact": "All clubs have at least one contact person.",
"addContact": "Add Contact"
},
"clubs": {
"searchPlaceholder": "Search clubs...",
"newClub": "New Club",
"title": "Clubs ({count})",
"noClubs": "No clubs found",
"createFirst": "Create your first club to get started.",
"members": "Members",
"contact": "Contact",
"founded": "Est. {year}"
},
"clubForm": {
"basicData": "Basic Data",
"name": "Name *",
"shortName": "Short Name",
"associationType": "Association Type",
"noType": "— No Type —",
"foundingYear": "Founding Year",
"memberCount": "Member Count",
"address": "Address",
"street": "Street",
"zip": "ZIP",
"city": "City",
"website": "Website",
"bankData": "Bank Details",
"accountHolder": "Account Holder",
"iban": "IBAN",
"bic": "BIC",
"updateClub": "Update Club",
"createClub": "Create Club",
"clubUpdated": "Club updated",
"clubCreated": "Club created",
"errorSaving": "Error saving"
},
"contacts": {
"title": "Contacts",
"addContact": "Add Contact",
"noContacts": "No contacts found.",
"firstName": "First Name *",
"lastName": "Last Name *",
"role": "Role",
"update": "Update",
"created": "Contact created",
"updated": "Contact updated",
"deleted": "Contact deleted",
"errorCreating": "Error creating contact",
"errorUpdating": "Error updating contact",
"errorDeleting": "Error deleting contact"
},
"billing": {
"title": "Fee Billings",
"feeType": "Fee Type",
"year": "Year",
"amount": "Amount",
"dueDate": "Due Date",
"paymentMethod": "Payment",
"noBillings": "No fee billings found.",
"showAll": "Show All",
"showOpen": "Open Only",
"markAsPaid": "Mark as Paid",
"paid": "Fee marked as paid",
"deleted": "Fee billing deleted",
"errorUpdating": "Error updating",
"errorDeleting": "Error deleting"
},
"notes": {
"title": "Notes & Tasks ({count} open)",
"noNotes": "No notes found.",
"dueDate": "Due: {date}",
"completed": "Completed ({count})",
"markDone": "Mark as done",
"taskCompleted": "Task completed",
"noteDeleted": "Note deleted",
"errorUpdating": "Error updating",
"errorDeleting": "Error deleting"
},
"hierarchy": {
"structure": "Organization Structure",
"directChildren": "Direct Sub-associations",
"totalOrganizations": "Total Organizations",
"availableToLink": "Available to Link",
"addOrganization": "Add Organization",
"availableOrganizations": "Available Organizations",
"selectOrganization": "Select organization...",
"link": "Link",
"linking": "Linking...",
"linked": "Organization linked successfully",
"unlinkTitle": "Unlink",
"unlinked": "Link removed",
"directCount": "{count} direct",
"rootLevel": "Federation",
"subLevel": "Sub-association",
"clubLevel": "Club",
"errorLinking": "Error linking organization",
"errorUnlinking": "Error removing link"
},
"memberSearch": {
"searchPlaceholder": "Search name, email, or member no...",
"title": "Members ({count})",
"noMembers": "No members found",
"tryOtherSearch": "Try a different search term.",
"noMembersInHierarchy": "No members found in linked organizations.",
"joinDate": "Joined",
"memberStatus": {
"active": "Active",
"inactive": "Inactive",
"pending": "Pending",
"resigned": "Resigned",
"excluded": "Excluded",
"deceased": "Deceased"
}
},
"transfer": {
"title": "Transfer Member",
"description": "{name} will be moved from {source} to another organization.",
"loadingPreview": "Loading transfer preview...",
"targetOrganization": "Target Organization",
"selectTarget": "Select organization...",
"keepSepaData": "Keep SEPA bank data (IBAN/BIC)",
"keepSepaHelp": "Bank details will be kept, mandate must be re-confirmed in the target organization.",
"reason": "Reason (optional)",
"reasonPlaceholder": "e.g. Relocation, club change...",
"transferring": "Transferring...",
"confirm": "Transfer",
"transferred": "Member transferred successfully",
"errorTransfer": "Error during transfer",
"activeEnrollments": "{count} active course enrollment(s)",
"retained": "retained",
"openInvoices": "{count} open invoice(s)",
"remainsAtSource": "remains at source organization",
"activeMandates": "{count} active SEPA mandate(s)",
"willReset": "will be reset",
"newsletters": "{count} newsletter subscription(s)",
"resetSection": "Will be reset:",
"memberNumberReset": "Member no. #{number} — reassignment needed in target org",
"duesCategoryReset": "Dues category — must be reassigned in target organization",
"sepaStatusReset": "SEPA mandate status → \"pending\" (re-confirmation needed)",
"noSideEffects": "No active relationships found",
"noSideEffectsHelp": "Transfer can be performed without side effects."
},
"events": {
"title": "Events ({count})",
"noEvents": "No events found",
"tryOtherFilters": "Try different filter criteria.",
"noEventsInHierarchy": "No events found in linked organizations.",
"event": "Event",
"capacity": "Capacity",
"fee": "Fee",
"shared": "Shared",
"sharedOnly": "Shared Only",
"eventStatus": {
"planned": "Planned",
"open": "Open",
"full": "Full",
"running": "Running",
"completed": "Completed",
"cancelled": "Cancelled"
}
},
"reporting": {
"perOrganization": "Report per Organization",
"noOrganizations": "No organizations found",
"hierarchyEmpty": "The hierarchy does not contain any organizations yet.",
"organizations": "Organizations",
"activeMembers": "Active Members",
"ofTotal": "of {total} total",
"newThisYear": "New Members (Year)",
"upcomingEvents": "Upcoming Events",
"activeCourses": "Active Courses",
"openInvoices": "Open Invoices",
"invoiceCount": "{count} invoices",
"level": "Level",
"activeMembersShort": "Active",
"totalShort": "Total",
"newYearShort": "New (Year)",
"courses": "Courses",
"eventsShort": "Events",
"openInvoicesShort": "Open Inv.",
"openAmount": "Open Amount"
},
"templates": {
"sharedTemplates": "Shared Templates",
"noTemplates": "No shared templates found",
"templatesHelp": "Templates shared by other organizations in your hierarchy appear here.",
"filterAll": "All",
"filterNewsletter": "Newsletter",
"filterDocument": "Documents",
"templateType": "Template Type",
"created": "Created",
"clone": "Clone",
"cloneTitle": "Clone Template",
"cloneDescription": "Create a copy of template \"{name}\" in your organization.",
"cloneName": "Copy Name",
"cloneNamePlaceholder": "Name for the new template",
"cloning": "Cloning...",
"cloneConfirm": "Clone Template",
"cloned": "Template cloned successfully",
"errorCloning": "Error cloning template",
"newsletter": "Newsletter",
"document": "Document",
"templateTypes": {
"generic": "General",
"member_card": "Member Card",
"invoice": "Invoice",
"receipt": "Receipt",
"certificate": "Certificate",
"letter": "Letter",
"label": "Label",
"report": "Report"
}
},
"settings": {
"title": "Settings",
"subtitle": "Manage roles, association types, and fee types",
"roles": "Roles",
"types": "Association Types",
"feeTypes": "Fee Types",
"descriptionOptional": "Description (optional)"
},
"statistics": {
"title": "Statistics",
"subtitle": "Club and member development over time",
"clubDevelopment": "Club Development",
"memberDevelopment": "Member Development",
"clubsLabel": "Clubs",
"membersLabel": "Members",
"helpText": "Statistics are automatically calculated from club data and association history."
}
}