feat(timesheet): add tags management and responsive time tracking flows

This commit is contained in:
2026-04-24 22:23:50 +03:30
parent c4d8379924
commit 987d2e2b59
13 changed files with 3710 additions and 134 deletions

View File

@@ -10,6 +10,11 @@ export const en = {
lightMode: "Light Mode",
darkMode: "Dark Mode",
loadingText: "Loading...",
loading: "Loading...",
add: "Add",
create: "Create",
remove: "Remove",
noMoreResults: "No more results.",
actions: {
create: "Create",
@@ -146,10 +151,12 @@ 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",
back: "Back to Workspaces",
detailTitle: "Workspace Details",
save: "Save",
create: "Create",
noWorkspaceTitle: "Welcome!",
noWorkspaceDesc: "Please create your first workspace.",
back: "Back to Workspaces",
roleLabel: "Your Role",
roles: {
owner: "Owner",
@@ -237,13 +244,15 @@ export const en = {
next: "Next",
},
sidebar: {
workspaces: 'Workspaces',
clients: 'Clients',
projects: "Projects",
expand: 'Expand',
collapse: 'Collapse',
},
sidebar: {
timesheet: "Timesheet",
workspaces: 'Workspaces',
clients: 'Clients',
projects: "Projects",
tags: "Tags",
expand: 'Expand',
collapse: 'Collapse',
},
ordering: {
createdAtDesc: "Newest First",
@@ -253,7 +262,7 @@ export const en = {
nameDesc: "Name (Z-A)",
},
projects: {
projects: {
title: "Projects",
description: (workspaceName: string) => `Manage projects for ${workspaceName}`,
active: "Active Projects",
@@ -281,6 +290,105 @@ export const en = {
restore: "Restore",
archive: "Archive",
clientFetchError: "Failed to load clients.",
},
}
namePlaceholder: "Project name...",
teamMembers: "Team Members",
creator: "Creator",
addUser: "Add user by mobile",
addFromWorkspace: "Add from workspace",
searchMembers: "Search members...",
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.",
roles: {
member: "Member",
manager: "Manager"
},
projectMembers: "Project Members",
removeAllWorkspaceMembers: "Remove All",
searchWorkspaceMembers: "Search by name or enter mobile number...",
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",
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.",
},
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",
customToLabel: "To",
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",
},
}