@hed-hog/operations 0.0.329 → 0.0.330
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/controllers/operations-tasks.controller.d.ts +4 -4
- package/dist/operations.service.d.ts +4 -4
- package/dist/operations.service.d.ts.map +1 -1
- package/dist/operations.service.js +24 -4
- package/dist/operations.service.js.map +1 -1
- package/dist/operations.service.spec.js +1 -1
- package/dist/operations.service.spec.js.map +1 -1
- package/hedhog/data/dashboard_component_role.yaml +8 -8
- package/hedhog/data/dashboard_role.yaml +1 -1
- package/hedhog/data/menu.yaml +6 -16
- package/hedhog/data/role.yaml +1 -1
- package/hedhog/data/route.yaml +55 -55
- package/hedhog/frontend/app/_components/async-options-combobox.tsx.ejs +15 -9
- package/hedhog/frontend/app/_components/project-costs-section.tsx.ejs +51 -81
- package/hedhog/frontend/app/_components/project-details-screen.tsx.ejs +39 -11
- package/hedhog/frontend/app/_components/project-form-screen.tsx.ejs +21 -4
- package/hedhog/frontend/app/_components/task-file-attachments.tsx.ejs +10 -8
- package/hedhog/frontend/app/_lib/hooks/use-values-visibility.ts.ejs +61 -0
- package/hedhog/frontend/app/approvals/page.tsx.ejs +5 -1
- package/hedhog/frontend/app/collaborators/page.tsx.ejs +68 -34
- package/hedhog/frontend/app/my-projects/page.tsx.ejs +45 -6
- package/hedhog/frontend/app/my-tasks/page.tsx.ejs +1 -1
- package/hedhog/frontend/app/projects/page.tsx.ejs +60 -5
- package/hedhog/frontend/app/reports/collaborators/page.tsx.ejs +65 -52
- package/hedhog/frontend/app/reports/projects/page.tsx.ejs +80 -82
- package/hedhog/frontend/app/schedule-adjustments/page.tsx.ejs +7 -1
- package/hedhog/frontend/messages/en.json +223 -16
- package/hedhog/frontend/messages/pt.json +223 -16
- package/package.json +4 -4
- package/src/operations.service.spec.ts +1 -1
- package/src/operations.service.ts +25 -5
|
@@ -48,6 +48,7 @@ import {
|
|
|
48
48
|
TrendingUp,
|
|
49
49
|
} from 'lucide-react';
|
|
50
50
|
import Link from 'next/link';
|
|
51
|
+
import { useTranslations } from 'next-intl';
|
|
51
52
|
import { useState } from 'react';
|
|
52
53
|
import { OperationsHeader } from '../../_components/operations-header';
|
|
53
54
|
import { fetchOperations } from '../../_lib/api';
|
|
@@ -57,13 +58,6 @@ import type {
|
|
|
57
58
|
} from '../../_lib/types';
|
|
58
59
|
import { formatCurrency, formatHours } from '../../_lib/utils/format';
|
|
59
60
|
|
|
60
|
-
const statusLabels: Record<string, string> = {
|
|
61
|
-
on_track: 'No prazo',
|
|
62
|
-
attention: 'Atenção',
|
|
63
|
-
late: 'Atrasado',
|
|
64
|
-
paused: 'Pausado',
|
|
65
|
-
};
|
|
66
|
-
|
|
67
61
|
const statusClasses: Record<string, string> = {
|
|
68
62
|
on_track: 'border-emerald-200 bg-emerald-50 text-emerald-700',
|
|
69
63
|
attention: 'border-amber-200 bg-amber-50 text-amber-700',
|
|
@@ -71,12 +65,6 @@ const statusClasses: Record<string, string> = {
|
|
|
71
65
|
paused: 'border-slate-200 bg-slate-100 text-slate-700',
|
|
72
66
|
};
|
|
73
67
|
|
|
74
|
-
const contractLabels: Record<string, string> = {
|
|
75
|
-
fixed_price: 'Preço fechado',
|
|
76
|
-
time_materials: 'Hora / Material',
|
|
77
|
-
retainer: 'Recorrente',
|
|
78
|
-
};
|
|
79
|
-
|
|
80
68
|
const scenarioLabels: Record<OperationsReportScenario, string> = {
|
|
81
69
|
base: 'Base',
|
|
82
70
|
growth: 'Crescimento',
|
|
@@ -92,20 +80,12 @@ function formatPercent(value: number) {
|
|
|
92
80
|
return `${Math.round(Number(value || 0))}%`;
|
|
93
81
|
}
|
|
94
82
|
|
|
95
|
-
function getStatusLabel(status: string) {
|
|
96
|
-
return statusLabels[status] ?? status;
|
|
97
|
-
}
|
|
98
|
-
|
|
99
83
|
function getStatusClass(status: string) {
|
|
100
84
|
return (
|
|
101
85
|
statusClasses[status] ?? 'border-slate-200 bg-slate-100 text-slate-700'
|
|
102
86
|
);
|
|
103
87
|
}
|
|
104
88
|
|
|
105
|
-
function getContractLabel(contractType: string) {
|
|
106
|
-
return contractLabels[contractType] ?? contractType.replace(/_/g, ' ');
|
|
107
|
-
}
|
|
108
|
-
|
|
109
89
|
function KpiLabel({ text, tooltip }: { text: string; tooltip: string }) {
|
|
110
90
|
return (
|
|
111
91
|
<span className="flex items-center gap-1">
|
|
@@ -123,6 +103,7 @@ function KpiLabel({ text, tooltip }: { text: string; tooltip: string }) {
|
|
|
123
103
|
}
|
|
124
104
|
|
|
125
105
|
export default function OperationsProjectReportsPage() {
|
|
106
|
+
const t = useTranslations('operations.ReportsProjectsPage');
|
|
126
107
|
const defaults = getDefaultRange();
|
|
127
108
|
const { request } = useApp();
|
|
128
109
|
const [startDate, setStartDate] = useState(defaults.from);
|
|
@@ -182,15 +163,15 @@ export default function OperationsProjectReportsPage() {
|
|
|
182
163
|
return (
|
|
183
164
|
<Page>
|
|
184
165
|
<OperationsHeader
|
|
185
|
-
title=
|
|
186
|
-
description=
|
|
187
|
-
current=
|
|
166
|
+
title={t('title')}
|
|
167
|
+
description={t('description')}
|
|
168
|
+
current={t('breadcrumb')}
|
|
188
169
|
/>
|
|
189
170
|
|
|
190
171
|
<div className="grid gap-3 rounded-lg border bg-card p-3 md:grid-cols-[1fr_1fr_180px_180px_180px_auto]">
|
|
191
172
|
<div className="space-y-1">
|
|
192
173
|
<span className="text-xs font-medium text-muted-foreground">
|
|
193
|
-
|
|
174
|
+
{t('filters.start')}
|
|
194
175
|
</span>
|
|
195
176
|
<Input
|
|
196
177
|
type="date"
|
|
@@ -199,7 +180,7 @@ export default function OperationsProjectReportsPage() {
|
|
|
199
180
|
/>
|
|
200
181
|
</div>
|
|
201
182
|
<div className="space-y-1">
|
|
202
|
-
<span className="text-xs font-medium text-muted-foreground">
|
|
183
|
+
<span className="text-xs font-medium text-muted-foreground">{t('filters.end')}</span>
|
|
203
184
|
<Input
|
|
204
185
|
type="date"
|
|
205
186
|
value={endDate}
|
|
@@ -208,31 +189,31 @@ export default function OperationsProjectReportsPage() {
|
|
|
208
189
|
</div>
|
|
209
190
|
<div className="space-y-1">
|
|
210
191
|
<span className="text-xs font-medium text-muted-foreground">
|
|
211
|
-
|
|
192
|
+
{t('filters.status')}
|
|
212
193
|
</span>
|
|
213
194
|
<Select value={statusFilter} onValueChange={setStatusFilter}>
|
|
214
195
|
<SelectTrigger className="w-full">
|
|
215
196
|
<SelectValue />
|
|
216
197
|
</SelectTrigger>
|
|
217
198
|
<SelectContent>
|
|
218
|
-
<SelectItem value="all">
|
|
219
|
-
<SelectItem value="on_track">
|
|
220
|
-
<SelectItem value="attention">
|
|
221
|
-
<SelectItem value="late">
|
|
222
|
-
<SelectItem value="paused">
|
|
199
|
+
<SelectItem value="all">{t('filters.all')}</SelectItem>
|
|
200
|
+
<SelectItem value="on_track">{t('status.on_track')}</SelectItem>
|
|
201
|
+
<SelectItem value="attention">{t('status.attention')}</SelectItem>
|
|
202
|
+
<SelectItem value="late">{t('status.late')}</SelectItem>
|
|
203
|
+
<SelectItem value="paused">{t('status.paused')}</SelectItem>
|
|
223
204
|
</SelectContent>
|
|
224
205
|
</Select>
|
|
225
206
|
</div>
|
|
226
207
|
<div className="space-y-1">
|
|
227
208
|
<span className="text-xs font-medium text-muted-foreground">
|
|
228
|
-
|
|
209
|
+
{t('filters.client')}
|
|
229
210
|
</span>
|
|
230
211
|
<Select value={clientFilter} onValueChange={setClientFilter}>
|
|
231
212
|
<SelectTrigger className="w-full">
|
|
232
213
|
<SelectValue />
|
|
233
214
|
</SelectTrigger>
|
|
234
215
|
<SelectContent>
|
|
235
|
-
<SelectItem value="all">
|
|
216
|
+
<SelectItem value="all">{t('filters.all')}</SelectItem>
|
|
236
217
|
{clients.map((client) => (
|
|
237
218
|
<SelectItem key={client} value={client}>
|
|
238
219
|
{client}
|
|
@@ -243,7 +224,7 @@ export default function OperationsProjectReportsPage() {
|
|
|
243
224
|
</div>
|
|
244
225
|
<div className="space-y-1">
|
|
245
226
|
<span className="text-xs font-medium text-muted-foreground">
|
|
246
|
-
|
|
227
|
+
{t('filters.scenario')}
|
|
247
228
|
</span>
|
|
248
229
|
<Select
|
|
249
230
|
value={scenario}
|
|
@@ -255,9 +236,9 @@ export default function OperationsProjectReportsPage() {
|
|
|
255
236
|
<SelectValue />
|
|
256
237
|
</SelectTrigger>
|
|
257
238
|
<SelectContent>
|
|
258
|
-
<SelectItem value="base">
|
|
259
|
-
<SelectItem value="growth">
|
|
260
|
-
<SelectItem value="conservative">
|
|
239
|
+
<SelectItem value="base">{t('scenario.base')}</SelectItem>
|
|
240
|
+
<SelectItem value="growth">{t('scenario.growth')}</SelectItem>
|
|
241
|
+
<SelectItem value="conservative">{t('scenario.conservative')}</SelectItem>
|
|
261
242
|
</SelectContent>
|
|
262
243
|
</Select>
|
|
263
244
|
</div>
|
|
@@ -273,7 +254,7 @@ export default function OperationsProjectReportsPage() {
|
|
|
273
254
|
setScenario('base');
|
|
274
255
|
}}
|
|
275
256
|
>
|
|
276
|
-
|
|
257
|
+
{t('actions.clear')}
|
|
277
258
|
</Button>
|
|
278
259
|
</div>
|
|
279
260
|
</div>
|
|
@@ -286,12 +267,12 @@ export default function OperationsProjectReportsPage() {
|
|
|
286
267
|
key: 'active',
|
|
287
268
|
title: (
|
|
288
269
|
<KpiLabel
|
|
289
|
-
text=
|
|
290
|
-
tooltip=
|
|
270
|
+
text={t('cards.projects.title')}
|
|
271
|
+
tooltip={t('cards.projects.tooltip')}
|
|
291
272
|
/>
|
|
292
273
|
),
|
|
293
274
|
value: data?.rows.length ?? 0,
|
|
294
|
-
description:
|
|
275
|
+
description: t('cards.projects.description', { count: summary.atRisk }),
|
|
295
276
|
icon: FolderKanban,
|
|
296
277
|
accentClassName: 'from-sky-500/20 via-cyan-400/10 to-transparent',
|
|
297
278
|
iconContainerClassName: 'bg-sky-50 text-sky-700',
|
|
@@ -300,12 +281,12 @@ export default function OperationsProjectReportsPage() {
|
|
|
300
281
|
key: 'budget',
|
|
301
282
|
title: (
|
|
302
283
|
<KpiLabel
|
|
303
|
-
text=
|
|
304
|
-
tooltip=
|
|
284
|
+
text={t('cards.budget.title')}
|
|
285
|
+
tooltip={t('cards.budget.tooltip')}
|
|
305
286
|
/>
|
|
306
287
|
),
|
|
307
288
|
value: formatCurrency(summary.contractedRevenue),
|
|
308
|
-
description:
|
|
289
|
+
description: t('cards.budget.description', { count: data?.rows.length ?? 0 }),
|
|
309
290
|
icon: Banknote,
|
|
310
291
|
accentClassName:
|
|
311
292
|
'from-emerald-500/20 via-green-400/10 to-transparent',
|
|
@@ -315,12 +296,14 @@ export default function OperationsProjectReportsPage() {
|
|
|
315
296
|
key: 'allocated-cost',
|
|
316
297
|
title: (
|
|
317
298
|
<KpiLabel
|
|
318
|
-
text=
|
|
319
|
-
tooltip=
|
|
299
|
+
text={t('cards.allocatedCost.title')}
|
|
300
|
+
tooltip={t('cards.allocatedCost.tooltip')}
|
|
320
301
|
/>
|
|
321
302
|
),
|
|
322
303
|
value: formatCurrency(summary.allocatedCost),
|
|
323
|
-
description:
|
|
304
|
+
description: t('cards.allocatedCost.description', {
|
|
305
|
+
value: formatCurrency(summary.consumedHoursCost),
|
|
306
|
+
}),
|
|
324
307
|
icon: Gauge,
|
|
325
308
|
accentClassName: 'from-rose-500/20 via-red-400/10 to-transparent',
|
|
326
309
|
iconContainerClassName: 'bg-rose-50 text-rose-700',
|
|
@@ -329,12 +312,18 @@ export default function OperationsProjectReportsPage() {
|
|
|
329
312
|
key: 'planned-profit',
|
|
330
313
|
title: (
|
|
331
314
|
<KpiLabel
|
|
332
|
-
text=
|
|
333
|
-
tooltip=
|
|
315
|
+
text={t('cards.plannedProfit.title')}
|
|
316
|
+
tooltip={t('cards.plannedProfit.tooltip')}
|
|
334
317
|
/>
|
|
335
318
|
),
|
|
336
319
|
value: formatCurrency(summary.plannedProfit),
|
|
337
|
-
description:
|
|
320
|
+
description: t('cards.plannedProfit.description', {
|
|
321
|
+
value: formatPercent(
|
|
322
|
+
summary.contractedRevenue > 0
|
|
323
|
+
? (summary.plannedProfit / summary.contractedRevenue) * 100
|
|
324
|
+
: 0
|
|
325
|
+
),
|
|
326
|
+
}),
|
|
338
327
|
icon: TrendingUp,
|
|
339
328
|
accentClassName:
|
|
340
329
|
'from-violet-500/20 via-fuchsia-400/10 to-transparent',
|
|
@@ -344,12 +333,14 @@ export default function OperationsProjectReportsPage() {
|
|
|
344
333
|
key: 'hours',
|
|
345
334
|
title: (
|
|
346
335
|
<KpiLabel
|
|
347
|
-
text=
|
|
348
|
-
tooltip=
|
|
336
|
+
text={t('cards.hours.title')}
|
|
337
|
+
tooltip={t('cards.hours.tooltip')}
|
|
349
338
|
/>
|
|
350
339
|
),
|
|
351
340
|
value: formatHours(summary.actualHours),
|
|
352
|
-
description:
|
|
341
|
+
description: t('cards.hours.description', {
|
|
342
|
+
value: formatHours(summary.billableHours),
|
|
343
|
+
}),
|
|
353
344
|
icon: Clock3,
|
|
354
345
|
layout: 'compact',
|
|
355
346
|
accentClassName:
|
|
@@ -360,12 +351,14 @@ export default function OperationsProjectReportsPage() {
|
|
|
360
351
|
key: 'consumed-hours-cost',
|
|
361
352
|
title: (
|
|
362
353
|
<KpiLabel
|
|
363
|
-
text=
|
|
364
|
-
tooltip=
|
|
354
|
+
text={t('cards.consumedHoursCost.title')}
|
|
355
|
+
tooltip={t('cards.consumedHoursCost.tooltip')}
|
|
365
356
|
/>
|
|
366
357
|
),
|
|
367
358
|
value: formatCurrency(summary.consumedHoursCost),
|
|
368
|
-
description:
|
|
359
|
+
description: t('cards.consumedHoursCost.description', {
|
|
360
|
+
value: formatHours(summary.actualHours),
|
|
361
|
+
}),
|
|
369
362
|
icon: Receipt,
|
|
370
363
|
layout: 'compact',
|
|
371
364
|
accentClassName:
|
|
@@ -376,12 +369,14 @@ export default function OperationsProjectReportsPage() {
|
|
|
376
369
|
key: 'idleness-rate',
|
|
377
370
|
title: (
|
|
378
371
|
<KpiLabel
|
|
379
|
-
text=
|
|
380
|
-
tooltip=
|
|
372
|
+
text={t('cards.idlenessRate.title')}
|
|
373
|
+
tooltip={t('cards.idlenessRate.tooltip')}
|
|
381
374
|
/>
|
|
382
375
|
),
|
|
383
376
|
value: formatPercent(summary.idlenessRate),
|
|
384
|
-
description:
|
|
377
|
+
description: t('cards.idlenessRate.description', {
|
|
378
|
+
value: formatCurrency(summary.idlenessCost),
|
|
379
|
+
}),
|
|
385
380
|
icon: TimerOff,
|
|
386
381
|
layout: 'compact',
|
|
387
382
|
accentClassName:
|
|
@@ -392,12 +387,14 @@ export default function OperationsProjectReportsPage() {
|
|
|
392
387
|
key: 'idleness-cost',
|
|
393
388
|
title: (
|
|
394
389
|
<KpiLabel
|
|
395
|
-
text=
|
|
396
|
-
tooltip=
|
|
390
|
+
text={t('cards.idlenessCost.title')}
|
|
391
|
+
tooltip={t('cards.idlenessCost.tooltip')}
|
|
397
392
|
/>
|
|
398
393
|
),
|
|
399
394
|
value: formatCurrency(summary.idlenessCost),
|
|
400
|
-
description:
|
|
395
|
+
description: t('cards.idlenessCost.description', {
|
|
396
|
+
value: formatPercent(summary.idlenessRate),
|
|
397
|
+
}),
|
|
401
398
|
icon: CircleDollarSign,
|
|
402
399
|
layout: 'compact',
|
|
403
400
|
accentClassName:
|
|
@@ -410,27 +407,26 @@ export default function OperationsProjectReportsPage() {
|
|
|
410
407
|
|
|
411
408
|
<Card>
|
|
412
409
|
<CardHeader>
|
|
413
|
-
<CardTitle>
|
|
410
|
+
<CardTitle>{t('table.title')}</CardTitle>
|
|
414
411
|
<CardDescription>
|
|
415
|
-
|
|
416
|
-
ociosidade e risco por projeto.
|
|
412
|
+
{t('table.description')}
|
|
417
413
|
</CardDescription>
|
|
418
414
|
</CardHeader>
|
|
419
415
|
<CardContent className="overflow-x-auto">
|
|
420
416
|
<Table>
|
|
421
417
|
<TableHeader>
|
|
422
418
|
<TableRow>
|
|
423
|
-
<TableHead>
|
|
424
|
-
<TableHead>
|
|
425
|
-
<TableHead>
|
|
426
|
-
<TableHead>
|
|
427
|
-
<TableHead>
|
|
428
|
-
<TableHead>
|
|
429
|
-
<TableHead>
|
|
430
|
-
<TableHead>
|
|
431
|
-
<TableHead>
|
|
432
|
-
<TableHead>
|
|
433
|
-
<TableHead>
|
|
419
|
+
<TableHead>{t('table.columns.project')}</TableHead>
|
|
420
|
+
<TableHead>{t('table.columns.status')}</TableHead>
|
|
421
|
+
<TableHead>{t('table.columns.budget')}</TableHead>
|
|
422
|
+
<TableHead>{t('table.columns.allocatedCost')}</TableHead>
|
|
423
|
+
<TableHead>{t('table.columns.plannedProfit')}</TableHead>
|
|
424
|
+
<TableHead>{t('table.columns.hours')}</TableHead>
|
|
425
|
+
<TableHead>{t('table.columns.consumedHoursCost')}</TableHead>
|
|
426
|
+
<TableHead>{t('table.columns.idlenessRate')}</TableHead>
|
|
427
|
+
<TableHead>{t('table.columns.idlenessCost')}</TableHead>
|
|
428
|
+
<TableHead>{t('table.columns.risk')}</TableHead>
|
|
429
|
+
<TableHead>{t('table.columns.recommendation')}</TableHead>
|
|
434
430
|
<TableHead />
|
|
435
431
|
</TableRow>
|
|
436
432
|
</TableHeader>
|
|
@@ -452,7 +448,7 @@ export default function OperationsProjectReportsPage() {
|
|
|
452
448
|
<div className="font-medium">{row.name}</div>
|
|
453
449
|
<div className="text-xs text-muted-foreground">
|
|
454
450
|
{row.client} · {row.manager} · {row.squad} ·{' '}
|
|
455
|
-
{
|
|
451
|
+
{t(`contractType.${row.contractType}`)}
|
|
456
452
|
</div>
|
|
457
453
|
</TableCell>
|
|
458
454
|
<TableCell>
|
|
@@ -460,7 +456,7 @@ export default function OperationsProjectReportsPage() {
|
|
|
460
456
|
variant="outline"
|
|
461
457
|
className={getStatusClass(row.status)}
|
|
462
458
|
>
|
|
463
|
-
{
|
|
459
|
+
{t(`status.${row.status}`)}
|
|
464
460
|
</Badge>
|
|
465
461
|
</TableCell>
|
|
466
462
|
<TableCell>
|
|
@@ -482,7 +478,9 @@ export default function OperationsProjectReportsPage() {
|
|
|
482
478
|
<TableCell>
|
|
483
479
|
<div>{formatHours(row.actualHours)}</div>
|
|
484
480
|
<div className="text-xs text-muted-foreground">
|
|
485
|
-
{
|
|
481
|
+
{t('table.billableHours', {
|
|
482
|
+
value: formatHours(row.billableHours),
|
|
483
|
+
})}
|
|
486
484
|
</div>
|
|
487
485
|
</TableCell>
|
|
488
486
|
<TableCell>
|
|
@@ -508,7 +506,7 @@ export default function OperationsProjectReportsPage() {
|
|
|
508
506
|
: 'border-emerald-200 bg-emerald-50 text-emerald-700'
|
|
509
507
|
}
|
|
510
508
|
>
|
|
511
|
-
{row.risk}
|
|
509
|
+
{t(`risk.${row.risk}`)}
|
|
512
510
|
</Badge>
|
|
513
511
|
</TableCell>
|
|
514
512
|
<TableCell className="min-w-72 text-sm text-muted-foreground">
|
|
@@ -523,7 +521,7 @@ export default function OperationsProjectReportsPage() {
|
|
|
523
521
|
size="icon"
|
|
524
522
|
variant="ghost"
|
|
525
523
|
className="size-8"
|
|
526
|
-
title=
|
|
524
|
+
title={t('actions.viewDetails')}
|
|
527
525
|
>
|
|
528
526
|
<ExternalLink className="size-4" />
|
|
529
527
|
</Button>
|
|
@@ -163,10 +163,12 @@ function SchedulePanel({
|
|
|
163
163
|
days,
|
|
164
164
|
locale,
|
|
165
165
|
emptyLabel,
|
|
166
|
+
dayOffLabel,
|
|
166
167
|
}: {
|
|
167
168
|
days: ScheduleDay[];
|
|
168
169
|
locale: string;
|
|
169
170
|
emptyLabel: string;
|
|
171
|
+
dayOffLabel: string;
|
|
170
172
|
}) {
|
|
171
173
|
const lines = groupScheduleLines(days, locale);
|
|
172
174
|
if (!lines.length)
|
|
@@ -182,7 +184,7 @@ function SchedulePanel({
|
|
|
182
184
|
{line.dayLabel}
|
|
183
185
|
</span>
|
|
184
186
|
{line.isOff ? (
|
|
185
|
-
<span className="text-muted-foreground">
|
|
187
|
+
<span className="text-muted-foreground">{dayOffLabel}</span>
|
|
186
188
|
) : (
|
|
187
189
|
<span className="text-foreground">
|
|
188
190
|
{line.time}
|
|
@@ -539,6 +541,7 @@ export default function OperationsScheduleAdjustmentsPage() {
|
|
|
539
541
|
days={requestItem.currentSchedule ?? []}
|
|
540
542
|
locale={currentLocaleCode}
|
|
541
543
|
emptyLabel={commonT('labels.notAssigned')}
|
|
544
|
+
dayOffLabel={commonT('labels.dayOff')}
|
|
542
545
|
/>
|
|
543
546
|
</div>
|
|
544
547
|
<div className="bg-card px-4 py-3">
|
|
@@ -552,6 +555,7 @@ export default function OperationsScheduleAdjustmentsPage() {
|
|
|
552
555
|
}
|
|
553
556
|
locale={currentLocaleCode}
|
|
554
557
|
emptyLabel={commonT('labels.notAssigned')}
|
|
558
|
+
dayOffLabel={commonT('labels.dayOff')}
|
|
555
559
|
/>
|
|
556
560
|
</div>
|
|
557
561
|
</div>
|
|
@@ -946,6 +950,7 @@ export default function OperationsScheduleAdjustmentsPage() {
|
|
|
946
950
|
days={selectedRequest.currentSchedule ?? []}
|
|
947
951
|
locale={currentLocaleCode}
|
|
948
952
|
emptyLabel={commonT('labels.notAssigned')}
|
|
953
|
+
dayOffLabel={commonT('labels.dayOff')}
|
|
949
954
|
/>
|
|
950
955
|
</div>
|
|
951
956
|
</div>
|
|
@@ -961,6 +966,7 @@ export default function OperationsScheduleAdjustmentsPage() {
|
|
|
961
966
|
}
|
|
962
967
|
locale={currentLocaleCode}
|
|
963
968
|
emptyLabel={commonT('labels.notAssigned')}
|
|
969
|
+
dayOffLabel={commonT('labels.dayOff')}
|
|
964
970
|
/>
|
|
965
971
|
</div>
|
|
966
972
|
</div>
|