Compare commits

...

3 Commits

Author SHA1 Message Date
dbc0ebb118 fix(workspace): remove redundant buttons in workspace detail page
Some checks failed
Frontend CI/CD / build (push) Has been cancelled
Frontend CI/CD / deploy (push) Has been cancelled
2026-05-21 19:21:05 +03:30
c69b9d1520 fix(timesheet): soften editable description placeholder 2026-05-21 19:12:10 +03:30
08359041ed fix(timesheet): stop sending client clock for live timers 2026-05-21 13:01:51 +03:30
2 changed files with 21 additions and 54 deletions

View File

@@ -1260,10 +1260,10 @@ function EntryEditorFields({
<div className="grid min-w-0 flex-1 grid-cols-[minmax(430px,1fr)_minmax(0,220px)_40px_188px_40px] 2xl:grid-cols-[minmax(430px,1fr)_minmax(0,max-content)_40px_188px_40px] items-center">
<div className="flex min-w-0 items-center">
<Input
value={state.description}
onChange={(event) => onChange({ description: event.target.value })}
placeholder={t.timesheet?.descriptionPlaceholder || "What are you working on?"}
className="h-12 w-[200px] 2xl:w-[400px] shrink-0 rounded-none border-0 bg-transparent px-0 pe-3 text-sm shadow-none focus-visible:ring-0 focus-visible:ring-offset-0 truncate dark:bg-transparent dark:text-slate-100"
value={state.description}
onChange={(event) => onChange({ description: event.target.value })}
placeholder={t.timesheet?.descriptionPlaceholder || "What are you working on?"}
className="h-12 w-[200px] 2xl:w-[400px] shrink-0 rounded-none border-0 bg-transparent px-0 pe-3 text-sm shadow-none placeholder:text-slate-300 focus-visible:ring-0 focus-visible:ring-offset-0 truncate dark:bg-transparent dark:text-slate-100 dark:placeholder:text-slate-600"
/>
<span className="me-2 shrink-0 text-sm font-semibold leading-none text-sky-600 dark:text-sky-400"></span>
@@ -1342,11 +1342,11 @@ function EntryEditorFields({
<label className={`block font-medium text-slate-700 dark:text-slate-300 ${compact ? "mb-0.5 text-[11px]" : "mb-1 text-sm"}`}>
{t.timesheet?.descriptionLabel || "Description"}
</label>
<Input
value={state.description}
onChange={(event) => onChange({ description: event.target.value })}
placeholder={t.timesheet?.descriptionPlaceholder || "What are you working on?"}
className={compact ? "h-9 px-2 text-xs" : ""}
<Input
value={state.description}
onChange={(event) => onChange({ description: event.target.value })}
placeholder={t.timesheet?.descriptionPlaceholder || "What are you working on?"}
className={compact ? "h-9 px-2 text-xs placeholder:text-slate-300 dark:placeholder:text-slate-600" : "placeholder:text-slate-300 dark:placeholder:text-slate-600"}
/>
</div>
@@ -2413,7 +2413,6 @@ export default function Timesheet() {
workspace_id: activeWorkspace.id,
description: timerDraft.description.trim(),
project_id: timerDraft.projectId || null,
start_time: new Date().toISOString(),
tags: timerDraft.tags,
is_billable: timerDraft.isBillable,
});
@@ -2457,7 +2456,6 @@ export default function Timesheet() {
project_id: restartProjectId,
tags: restartTagIds,
is_billable: entry.is_billable,
start_time: new Date().toISOString(),
});
toast.success(t.timesheet?.startSuccess || "Timer started");
@@ -2645,11 +2643,11 @@ export default function Timesheet() {
<div className="flex min-w-0 items-center gap-2 px-3 py-3">
<div className="min-w-0 flex-1">
<Input
value={timerDraft.description}
placeholder={t.timesheet?.descriptionPlaceholder || "What are you working on?"}
onChange={(event) => setTimerDraft((current) => ({ ...current, description: event.target.value }))}
disabled={isStartingTimer}
className="h-12 rounded-none border-0 bg-transparent dark:bg-transparent px-5 text-sm shadow-none focus-visible:ring-0 focus-visible:ring-offset-0"
value={timerDraft.description}
placeholder={t.timesheet?.descriptionPlaceholder || "What are you working on?"}
onChange={(event) => setTimerDraft((current) => ({ ...current, description: event.target.value }))}
disabled={isStartingTimer}
className="h-12 rounded-none border-0 bg-transparent px-5 text-sm shadow-none placeholder:text-slate-300 focus-visible:ring-0 focus-visible:ring-offset-0 dark:bg-transparent dark:placeholder:text-slate-600"
/>
</div>
@@ -2753,11 +2751,11 @@ export default function Timesheet() {
>
<div className="space-y-3">
<Input
value={timerDraft.description}
placeholder={t.timesheet?.descriptionPlaceholder || "What are you working on?"}
onChange={(event) => setTimerDraft((current) => ({ ...current, description: event.target.value }))}
disabled={isStartingTimer}
className="h-10 border-slate-200 bg-slate-50 text-sm dark:border-slate-700 dark:bg-slate-900"
value={timerDraft.description}
placeholder={t.timesheet?.descriptionPlaceholder || "What are you working on?"}
onChange={(event) => setTimerDraft((current) => ({ ...current, description: event.target.value }))}
disabled={isStartingTimer}
className="h-10 border-slate-200 bg-slate-50 text-sm placeholder:text-slate-300 dark:border-slate-700 dark:bg-slate-900 dark:placeholder:text-slate-600"
/>
<div className="grid grid-cols-[minmax(0,1fr)_auto] gap-2">

View File

@@ -273,38 +273,6 @@ export default function WorkspaceDetail() {
{workspace.description || t.workspace?.noDescription}
</p>
</div>
<div className="flex flex-wrap items-center gap-2">
{canViewReports && (
<button
onClick={() => openWorkspaceRoute('/reports')}
className="inline-flex w-full h-11 items-center justify-center rounded-xl border border-slate-200 bg-slate-50 px-4 text-sm font-semibold text-slate-700 transition hover:border-slate-300 hover:bg-slate-100 dark:border-slate-700 dark:bg-slate-800 dark:text-slate-200 dark:hover:border-slate-600 dark:hover:bg-slate-700"
>
{t.workspace?.openReports || 'Open reports'}
</button>
)}
<div className="flex w-full items-center gap-2">
{canEdit && (
<button
onClick={() => navigate(`/workspaces/${id}/edit`)}
className="inline-flex w-full h-11 items-center justify-center gap-2 rounded-xl border px-4 text-sm font-semibold transition bg-blue-50 text-blue-600 dark:bg-blue-500/10 dark:text-blue-400 border-blue-200 hover:border-blue-300 hover:bg-blue-100 dark:border-blue-900/60 dark:hover:bg-blue-900/30"
>
<Edit2 className="h-4 w-4" />
<span className="lg:hidden">{t.actions?.edit || 'Edit'}</span>
</button>
)}
{canDelete && (
<button
onClick={handleDelete}
className="inline-flex w-full h-11 items-center justify-center gap-2 rounded-xl border border-red-200 bg-red-50 px-4 text-sm font-semibold text-red-700 transition hover:border-red-300 hover:bg-red-100 dark:border-red-900/60 dark:bg-red-900/20 dark:text-red-300 dark:hover:bg-red-900/30"
>
<Trash2 className="h-4 w-4" />
<span className="lg:hidden">{t.actions?.delete || 'Delete'}</span>
</button>
)}
</div>
</div>
</div>
</section>
@@ -389,9 +357,10 @@ export default function WorkspaceDetail() {
{canEdit && (
<button
onClick={() => navigate(`/workspaces/${id}/edit`)}
className="inline-flex h-10 items-center justify-center rounded-xl border border-slate-200 bg-slate-50 px-4 text-sm font-semibold text-slate-700 transition hover:border-slate-300 hover:bg-slate-100 dark:border-slate-700 dark:bg-slate-800 dark:text-slate-200 dark:hover:border-slate-600 dark:hover:bg-slate-700"
className="inline-flex gap-2 h-10 items-center justify-center rounded-xl border border-slate-200 bg-slate-50 px-4 text-sm font-semibold text-slate-700 transition hover:border-slate-300 hover:bg-slate-100 dark:border-slate-700 dark:bg-slate-800 dark:text-slate-200 dark:hover:border-slate-600 dark:hover:bg-slate-700"
>
{t.workspace?.manageMembers || 'Manage members'}
<Edit2 className="h-4 w-4" />
</button>
)}
</div>