feat(workspaces): expand detail page member list

This commit is contained in:
2026-04-28 10:46:15 +03:30
parent b1ad372474
commit 581cfab1ac
4 changed files with 292 additions and 248 deletions

View File

@@ -151,30 +151,31 @@ export const en = {
emptyState: "You are not a member of any workspace.",
createTitle: "Create Workspace",
editTitle: "Edit Workspace",
detailTitle: "Workspace Details",
save: "Save",
create: "Create",
noWorkspaceTitle: "Welcome!",
noWorkspaceDesc: "Please create your first workspace.",
back: "Back to Workspaces",
roleLabel: "Your Role",
openReports: "Open reports",
statsMembers: "Members",
statsRates: "Rates set",
statsOwnersAdmins: "Owners & admins",
statsGuests: "Guests",
membersSectionTitle: "Members",
detailTitle: "Workspace Details",
save: "Save",
create: "Create",
noWorkspaceTitle: "Welcome!",
noWorkspaceDesc: "Please create your first workspace.",
back: "Back to Workspaces",
roleLabel: "Your Role",
openReports: "Open reports",
statsMembers: "Members",
statsRates: "Rates set",
statsOwnersAdmins: "Owners & admins",
statsGuests: "Guests",
membersSectionTitle: "Members",
membersSectionSubtitle: "People in this workspace and their current roles.",
membersLocked: "Only owners and admins can view the full member list.",
manageMembers: "Manage members",
joinedLabel: "Joined",
mobileNumber: "Mobile Number",
youLabel: "You",
resourcesTitle: "Resources",
resourceOpen: "Open",
roleDistributionTitle: "Role distribution",
unknownMember: "Unknown member",
roles: {
owner: "Owner",
admin: "Admin",
resourceOpen: "Open",
roleDistributionTitle: "Role distribution",
unknownMember: "Unknown member",
roles: {
owner: "Owner",
admin: "Admin",
member: "Member",
guest: "Guest",
},
@@ -258,16 +259,16 @@ export const en = {
next: "Next",
},
sidebar: {
timesheet: "Timesheet",
reports: "Reports",
workspaces: 'Workspaces',
clients: 'Clients',
projects: "Projects",
tags: "Tags",
expand: 'Expand',
collapse: 'Collapse',
},
sidebar: {
timesheet: "Timesheet",
reports: "Reports",
workspaces: 'Workspaces',
clients: 'Clients',
projects: "Projects",
tags: "Tags",
expand: 'Expand',
collapse: 'Collapse',
},
ordering: {
createdAtDesc: "Newest First",
@@ -277,7 +278,7 @@ export const en = {
nameDesc: "Name (Z-A)",
},
projects: {
projects: {
title: "Projects",
description: (workspaceName: string) => `Manage projects for ${workspaceName}`,
active: "Active Projects",
@@ -314,12 +315,12 @@ export const en = {
addAllWorkspaceMembers: "Add all workspace members",
confirmDeleteTitle: "Remove Member",
confirmDeleteDesc: "Are you sure you want to remove this member from the project?",
createSuccess: "Project created successfully.",
createError: "Failed to create project.",
updateSuccess: "Project updated successfully.",
updateError: "Failed to update project.",
edit: "Edit Project",
memberAlreadyAdded: "This user is already on the project team.",
createSuccess: "Project created successfully.",
createError: "Failed to create project.",
updateSuccess: "Project updated successfully.",
updateError: "Failed to update project.",
edit: "Edit Project",
memberAlreadyAdded: "This user is already on the project team.",
roles: {
member: "Member",
manager: "Manager"
@@ -330,173 +331,173 @@ export const en = {
userNotFound: "No user found with this mobile number.",
alreadyInProject: "Already Added",
addToProject: "Add to Project",
noWorkspaceMembers: "No members found.",
},
tags: {
title: "Tags",
description: (workspaceName: string) => `Manage tags for ${workspaceName}`,
create: "Create Tag",
createTitle: "Create Tag",
editTitle: "Edit Tag",
deleteTitle: "Delete Tag",
deleteConfirmMessage: (name: string) => `Are you sure you want to delete ${name}?`,
searchPlaceholder: "Search tags...",
nameLabel: "Tag Name",
namePlaceholder: "e.g. Design",
colorLabel: "Color",
emptyState: "No tags found",
selectWorkspace: "Please select a workspace first.",
fetchError: "Failed to load tags",
createSuccess: "Tag created successfully.",
updateSuccess: "Tag updated successfully.",
saveError: "Failed to save tag.",
deleteSuccess: "Tag deleted successfully.",
deleteError: "Failed to delete tag.",
},
rates: {
workspaceSectionTitle: "Workspace User Rates",
projectSectionTitle: "Project User Rates",
workspaceRate: "Workspace rate",
projectOverride: "Project override",
inheritsWorkspaceRate: "Inherits workspace rate",
noRate: "No rate",
hourlyRatePlaceholder: "0.00",
currencyPlaceholder: "USD",
searchUnitPlaceholder: "Search unit...",
removeRate: "Remove rate",
workspaceSaveSuccess: "Workspace user rate saved.",
workspaceSaveError: "Failed to save workspace user rate.",
workspaceRemoveSuccess: "Workspace user rate removed.",
workspaceRemoveError: "Failed to remove workspace user rate.",
projectSaveSuccess: "Project user rate saved.",
projectSaveError: "Failed to save project user rate.",
projectRemoveSuccess: "Project user rate removed.",
projectRemoveError: "Failed to remove project user rate.",
},
timesheet: {
title: "Timesheet",
description: (workspaceName: string) => `Track time inside ${workspaceName}`,
selectWorkspace: "Please select a workspace first.",
addEntry: "Add Entry",
startTimer: "Start Timer",
stopTimer: "Stop Timer",
timerRunning: "Timer Running",
runningLabel: "Current timer",
runningBadge: "Running",
noRunningEntry: "No running entry",
searchPlaceholder: "Search time entries...",
orderingNewest: "Newest first",
orderingOldest: "Oldest first",
emptyState: "No time entries found",
emptyDescription: "No description",
createTitle: "Add Time Entry",
startTitle: "Start Timer",
editTitle: "Edit Time Entry",
createSuccess: "Time entry created successfully.",
startSuccess: "Timer started successfully.",
updateSuccess: "Time entry updated successfully.",
saveError: "Failed to save time entry.",
stopSuccess: "Timer stopped successfully.",
stopError: "Failed to stop timer.",
deleteSuccess: "Time entry deleted successfully.",
deleteError: "Failed to delete time entry.",
fetchError: "Failed to load time entries.",
optionsError: "Failed to load projects and tags.",
descriptionLabel: "Description",
descriptionPlaceholder: "What are you working on?",
projectLabel: "Project",
noProject: "No project",
startLabel: "Start",
endLabel: "End",
billable: "Billable",
noTagsHint: "Create tags first from the Tags page.",
clearFilters: "Clear filters",
customFromLabel: "From date",
customToLabel: "To date",
allClientsLabel: "All clients",
allProjectsLabel: "All projects",
allTagsLabel: "All tags",
showFiltersLabel: "Show filters",
hideFiltersLabel: "Hide filters",
applyFiltersLabel: "Apply",
clientFilterPrefix: "Client",
projectFilterPrefix: "Project",
tagFilterPrefix: "Tag",
fromFilterPrefix: "From",
toFilterPrefix: "To",
deletedProjectLabel: "Deleted project",
deletedTagLabel: "Deleted tag",
},
reports: {
title: "Reports",
description: (workspaceName: string) => `Review activity reports for ${workspaceName}`,
selectWorkspace: "Please select a workspace first.",
chartTab: "Chart",
tableTab: "Table",
period: "Period",
periodThisWeek: "This week",
periodThisMonth: "This month",
periodThisYear: "This year",
periodFirstHalf: "First half of year",
periodSecondHalf: "Second half of year",
periodCustom: "Custom period",
fromDate: "From date",
toDate: "To date",
user: "User",
allUsers: "All users",
searchUsers: "Search users...",
client: "Client",
allClients: "All clients",
searchClients: "Search clients...",
project: "Project",
allProjects: "All projects",
searchProjects: "Search projects...",
tags: "Tags",
allTags: "All tags",
searchTags: "Search tags...",
name: "Name",
clear: "Clear",
apply: "Apply",
totalHours: "Total hours",
billableHours: "Billable hours",
nonBillableHours: "Non-billable hours",
totalIncome: "Total income",
chartTitle: "Activity chart",
totalSeconds: "Total seconds",
exportExcel: "Export Excel",
exportPdf: "Export PDF",
date: "Date",
details: "Details",
total: "Total",
clientsTable: "Clients",
projectsTable: "Projects",
tagsTable: "Tags",
loadError: "Failed to load reports.",
loadDayDetailsError: "Failed to load day details.",
loadFiltersError: "Failed to load report filters.",
exportQueued: "Export queued. You will receive a notification with the download link.",
exportError: "Failed to queue report export.",
},
notifications: {
title: "Notifications",
open: "Open notifications",
empty: "No notifications yet.",
loading: "Loading notifications...",
loadingMore: "Loading more...",
loadMore: "Load more",
markAllRead: "Mark all as read",
markSeenError: "Failed to update notification",
markAllError: "Failed to update notifications",
deleteError: "Failed to delete notification",
loadError: "Failed to load notifications",
openError: "Failed to open notification",
newTitle: "New notification",
openAction: "Open",
summary: (total: number, unread: number) => `${total} total, ${unread} unread`,
},
}
noWorkspaceMembers: "No members found.",
},
tags: {
title: "Tags",
description: (workspaceName: string) => `Manage tags for ${workspaceName}`,
create: "Create Tag",
createTitle: "Create Tag",
editTitle: "Edit Tag",
deleteTitle: "Delete Tag",
deleteConfirmMessage: (name: string) => `Are you sure you want to delete ${name}?`,
searchPlaceholder: "Search tags...",
nameLabel: "Tag Name",
namePlaceholder: "e.g. Design",
colorLabel: "Color",
emptyState: "No tags found",
selectWorkspace: "Please select a workspace first.",
fetchError: "Failed to load tags",
createSuccess: "Tag created successfully.",
updateSuccess: "Tag updated successfully.",
saveError: "Failed to save tag.",
deleteSuccess: "Tag deleted successfully.",
deleteError: "Failed to delete tag.",
},
rates: {
workspaceSectionTitle: "Workspace User Rates",
projectSectionTitle: "Project User Rates",
workspaceRate: "Workspace rate",
projectOverride: "Project override",
inheritsWorkspaceRate: "Inherits workspace rate",
noRate: "No rate",
hourlyRatePlaceholder: "0.00",
currencyPlaceholder: "USD",
searchUnitPlaceholder: "Search unit...",
removeRate: "Remove rate",
workspaceSaveSuccess: "Workspace user rate saved.",
workspaceSaveError: "Failed to save workspace user rate.",
workspaceRemoveSuccess: "Workspace user rate removed.",
workspaceRemoveError: "Failed to remove workspace user rate.",
projectSaveSuccess: "Project user rate saved.",
projectSaveError: "Failed to save project user rate.",
projectRemoveSuccess: "Project user rate removed.",
projectRemoveError: "Failed to remove project user rate.",
},
timesheet: {
title: "Timesheet",
description: (workspaceName: string) => `Track time inside ${workspaceName}`,
selectWorkspace: "Please select a workspace first.",
addEntry: "Add Entry",
startTimer: "Start Timer",
stopTimer: "Stop Timer",
timerRunning: "Timer Running",
runningLabel: "Current timer",
runningBadge: "Running",
noRunningEntry: "No running entry",
searchPlaceholder: "Search time entries...",
orderingNewest: "Newest first",
orderingOldest: "Oldest first",
emptyState: "No time entries found",
emptyDescription: "No description",
createTitle: "Add Time Entry",
startTitle: "Start Timer",
editTitle: "Edit Time Entry",
createSuccess: "Time entry created successfully.",
startSuccess: "Timer started successfully.",
updateSuccess: "Time entry updated successfully.",
saveError: "Failed to save time entry.",
stopSuccess: "Timer stopped successfully.",
stopError: "Failed to stop timer.",
deleteSuccess: "Time entry deleted successfully.",
deleteError: "Failed to delete time entry.",
fetchError: "Failed to load time entries.",
optionsError: "Failed to load projects and tags.",
descriptionLabel: "Description",
descriptionPlaceholder: "What are you working on?",
projectLabel: "Project",
noProject: "No project",
startLabel: "Start",
endLabel: "End",
billable: "Billable",
noTagsHint: "Create tags first from the Tags page.",
clearFilters: "Clear filters",
customFromLabel: "From date",
customToLabel: "To date",
allClientsLabel: "All clients",
allProjectsLabel: "All projects",
allTagsLabel: "All tags",
showFiltersLabel: "Show filters",
hideFiltersLabel: "Hide filters",
applyFiltersLabel: "Apply",
clientFilterPrefix: "Client",
projectFilterPrefix: "Project",
tagFilterPrefix: "Tag",
fromFilterPrefix: "From",
toFilterPrefix: "To",
deletedProjectLabel: "Deleted project",
deletedTagLabel: "Deleted tag",
},
reports: {
title: "Reports",
description: (workspaceName: string) => `Review activity reports for ${workspaceName}`,
selectWorkspace: "Please select a workspace first.",
chartTab: "Chart",
tableTab: "Table",
period: "Period",
periodThisWeek: "This week",
periodThisMonth: "This month",
periodThisYear: "This year",
periodFirstHalf: "First half of year",
periodSecondHalf: "Second half of year",
periodCustom: "Custom period",
fromDate: "From date",
toDate: "To date",
user: "User",
allUsers: "All users",
searchUsers: "Search users...",
client: "Client",
allClients: "All clients",
searchClients: "Search clients...",
project: "Project",
allProjects: "All projects",
searchProjects: "Search projects...",
tags: "Tags",
allTags: "All tags",
searchTags: "Search tags...",
name: "Name",
clear: "Clear",
apply: "Apply",
totalHours: "Total hours",
billableHours: "Billable hours",
nonBillableHours: "Non-billable hours",
totalIncome: "Total income",
chartTitle: "Activity chart",
totalSeconds: "Total seconds",
exportExcel: "Export Excel",
exportPdf: "Export PDF",
date: "Date",
details: "Details",
total: "Total",
clientsTable: "Clients",
projectsTable: "Projects",
tagsTable: "Tags",
loadError: "Failed to load reports.",
loadDayDetailsError: "Failed to load day details.",
loadFiltersError: "Failed to load report filters.",
exportQueued: "Export queued. You will receive a notification with the download link.",
exportError: "Failed to queue report export.",
},
notifications: {
title: "Notifications",
open: "Open notifications",
empty: "No notifications yet.",
loading: "Loading notifications...",
loadingMore: "Loading more...",
loadMore: "Load more",
markAllRead: "Mark all as read",
markSeenError: "Failed to update notification",
markAllError: "Failed to update notifications",
deleteError: "Failed to delete notification",
loadError: "Failed to load notifications",
openError: "Failed to open notification",
newTitle: "New notification",
openAction: "Open",
summary: (total: number, unread: number) => `${total} total, ${unread} unread`,
},
}