feat(workspaces): add bulk member import modal

This commit is contained in:
2026-06-18 22:53:44 +03:30
parent 29cadb83e6
commit 55ba274346
7 changed files with 961 additions and 28 deletions

View File

@@ -284,6 +284,46 @@ export const en = {
membersSectionTitle: "Members",
membersSectionSubtitle: "People in this workspace and their current roles.",
projectRateHint: "Project-specific user rates can be managed from the Projects page. Open a project and use its access modal to set a custom rate that overrides the workspace rate for that project.",
memberImport: {
button: "Import members",
title: "Import members",
description: "Upload a file with mobile, role, hourly_rate, and currency columns. Mobile is required; role defaults to member.",
uploadTitle: "Upload member file",
uploadDescription: "CSV, TSV, TXT, or XLSX. The first row must contain headers.",
sampleCsv: "CSV sample",
sampleTsv: "TSV sample",
sampleTxt: "TXT sample",
sampleXlsx: "XLSX sample",
validate: "Validate file",
validating: "Validating...",
import: "Import members",
importing: "Importing...",
chooseFile: "Choose file",
selectedFile: "Selected file",
validRows: "Valid rows",
invalidRows: "Invalid rows",
totalRows: "Total rows",
line: "Line",
mobile: "Mobile",
user: "User",
role: "Role",
hourlyRate: "Hourly rate",
currency: "Currency",
status: "Status",
messages: "Messages",
valid: "Valid",
invalid: "Invalid",
noRows: "No rows loaded yet.",
localErrors: "Fix local file errors before backend validation.",
success: "Members imported successfully.",
parseFailed: "Failed to parse the file.",
missingMobile: "Mobile is required.",
duplicateMobile: "This mobile appears more than once.",
invalidRole: "Role must be admin, member, or guest.",
invalidRate: "Hourly rate must be a valid positive number.",
rateCurrencyPair: "Hourly rate and currency must be provided together.",
tooManyRows: "Import is limited to 500 rows.",
},
membersLocked: "Only owners and admins can view the full member list.",
manageMembers: "Manage members",
mobileNumber: "Mobile Number",