feat(logs): add workspace activity log page

This commit is contained in:
2026-04-28 16:42:36 +03:30
parent 088ad8760b
commit 8bd0e908a1
11 changed files with 1247 additions and 22 deletions

View File

@@ -264,12 +264,13 @@ export const en = {
next: "Next",
},
sidebar: {
timesheet: "Timesheet",
reports: "Reports",
workspaces: 'Workspaces',
clients: 'Clients',
projects: "Projects",
sidebar: {
timesheet: "Timesheet",
reports: "Reports",
logs: "Logs",
workspaces: 'Workspaces',
clients: 'Clients',
projects: "Projects",
tags: "Tags",
expand: 'Expand',
collapse: 'Collapse',
@@ -437,7 +438,7 @@ export const en = {
deletedTagLabel: "Deleted tag",
},
reports: {
reports: {
title: "Reports",
description: (workspaceName: string) => `Review activity reports for ${workspaceName}`,
selectWorkspace: "Please select a workspace first.",
@@ -484,11 +485,83 @@ export const en = {
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: {
exportQueued: "Export queued. You will receive a notification with the download link.",
exportError: "Failed to queue report export.",
},
logs: {
eyebrow: "Workspace activity",
title: "Activity logs",
description: (workspaceName: string) => `Review what has happened inside ${workspaceName}.`,
selectWorkspace: "Please select a workspace first.",
unauthorized: "Only owners and admins can access workspace activity logs.",
loading: "Loading logs...",
loadingUsers: "Loading users...",
loadingDetails: "Loading details...",
loadError: "Failed to load logs.",
loadDetailsError: "Failed to load log details.",
loadFiltersError: "Failed to load log filters.",
search: "Search",
searchPlaceholder: "Search logs...",
section: "Section",
allSections: "All sections",
event: "Event",
allEvents: "All events",
actor: "Actor",
allActors: "All actors",
searchActors: "Search users...",
ordering: "Ordering",
newestFirst: "Newest first",
oldestFirst: "Oldest first",
fromDate: "From date",
toDate: "To date",
clear: "Clear",
apply: "Apply",
loadMore: "Load more",
totalLogs: "Total logs",
activeFilters: "Active filters",
latestActivity: "Latest activity",
resultsCount: (count: number) => `${count} results`,
empty: "No activity logs found",
emptyHint: "Adjust your filters or wait for new workspace activity.",
detailsTitle: "Activity details",
detailsHint: "Select an activity item to inspect the exact field changes.",
selectLogHint: "Select a log entry to see its details.",
target: "Target",
timestamp: "Timestamp",
remoteAddress: "Remote address",
previousValue: "Previous",
currentValue: "Current",
changesTitle: "Changes",
noDetails: "No field-level details are available for this activity.",
snapshot: "Serialized snapshot",
unknownActor: "Unknown actor",
summary: (actor: string, event: string, section: string, target: string) =>
`${actor} ${event.toLowerCase()} ${target} in ${section.toLowerCase()}`,
sections: {
workspace: "Workspace",
workspace_members: "Workspace members",
clients: "Clients",
projects: "Projects",
project_members: "Project members",
tags: "Tags",
time_entries: "Time entries",
rates: "Rates",
report_exports: "Report exports",
},
events: {
create: "Created",
update: "Updated",
delete: "Deleted",
restore: "Restored",
archive: "Archived",
unarchive: "Unarchived",
activate: "Activated",
deactivate: "Deactivated",
},
},
notifications: {
title: "Notifications",
open: "Open notifications",
empty: "No notifications yet.",