@hed-hog/operations 0.0.285 → 0.0.286
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/hedhog/frontend/app/_components/kanban-board.tsx.ejs +604 -61
- package/hedhog/frontend/app/_lib/mocks/projects.mock.ts.ejs +398 -3
- package/hedhog/frontend/app/_lib/mocks/tasks.mock.ts.ejs +29 -0
- package/hedhog/frontend/app/_lib/types/operations.ts.ejs +67 -6
- package/hedhog/frontend/app/allocations/page.tsx.ejs +2 -1
- package/hedhog/frontend/app/certifications/page.tsx.ejs +2 -1
- package/hedhog/frontend/app/contracts/page.tsx.ejs +2 -1
- package/hedhog/frontend/app/evaluations/page.tsx.ejs +2 -1
- package/hedhog/frontend/app/goals/page.tsx.ejs +2 -1
- package/hedhog/frontend/app/projects/[id]/page.tsx.ejs +857 -107
- package/hedhog/frontend/app/projects/page.tsx.ejs +1044 -81
- package/hedhog/frontend/app/rewards/page.tsx.ejs +2 -1
- package/hedhog/frontend/app/tasks/page.tsx.ejs +968 -16
- package/hedhog/frontend/messages/en.json +306 -4
- package/hedhog/frontend/messages/pt.json +306 -4
- package/package.json +5 -5
|
@@ -11,9 +11,146 @@ export const projectsMock: Project[] = [
|
|
|
11
11
|
hoursLogged: 386,
|
|
12
12
|
startDate: '2026-01-08',
|
|
13
13
|
endDate: '2026-06-30',
|
|
14
|
-
description:
|
|
14
|
+
description:
|
|
15
|
+
'Frontend and middleware modernization for the main commerce experience.',
|
|
15
16
|
contractId: 'ctr-orion',
|
|
16
17
|
budget: 128000,
|
|
18
|
+
health: {
|
|
19
|
+
overall: 'stable',
|
|
20
|
+
scope: 'stable',
|
|
21
|
+
schedule: 'attention',
|
|
22
|
+
budget: 'stable',
|
|
23
|
+
quality: 'excellent',
|
|
24
|
+
},
|
|
25
|
+
milestones: [
|
|
26
|
+
{
|
|
27
|
+
id: 'ms-orion-web-1',
|
|
28
|
+
title: 'Checkout architecture approved',
|
|
29
|
+
date: '2026-02-10',
|
|
30
|
+
status: 'done',
|
|
31
|
+
description:
|
|
32
|
+
'Core checkout orchestration and rollback strategy approved.',
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
id: 'ms-orion-web-2',
|
|
36
|
+
title: 'Mobile redesign beta',
|
|
37
|
+
date: '2026-04-02',
|
|
38
|
+
status: 'next',
|
|
39
|
+
description:
|
|
40
|
+
'Mobile PDP and cart refinements available to pilot stores.',
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
id: 'ms-orion-web-3',
|
|
44
|
+
title: 'Go-live window',
|
|
45
|
+
date: '2026-06-25',
|
|
46
|
+
status: 'next',
|
|
47
|
+
description:
|
|
48
|
+
'Final release cut with observability and rollback checklists.',
|
|
49
|
+
},
|
|
50
|
+
],
|
|
51
|
+
risks: [
|
|
52
|
+
{
|
|
53
|
+
id: 'risk-orion-web-1',
|
|
54
|
+
title: 'Payment fallback latency in peak season',
|
|
55
|
+
ownerUserId: 'usr-diego',
|
|
56
|
+
severity: 'high',
|
|
57
|
+
status: 'open',
|
|
58
|
+
impact: 'Potential conversion drop during high traffic windows.',
|
|
59
|
+
mitigation: 'Add edge caching and asynchronous fallback queue.',
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
id: 'risk-orion-web-2',
|
|
63
|
+
title: 'Client QA team availability reduced',
|
|
64
|
+
ownerUserId: 'usr-ana',
|
|
65
|
+
severity: 'medium',
|
|
66
|
+
status: 'mitigated',
|
|
67
|
+
impact: 'Approval cycle can delay final release by one sprint.',
|
|
68
|
+
mitigation: 'Shared acceptance criteria and mid-sprint QA handoff.',
|
|
69
|
+
},
|
|
70
|
+
],
|
|
71
|
+
dependencies: [
|
|
72
|
+
{
|
|
73
|
+
id: 'dep-orion-web-1',
|
|
74
|
+
title: 'Pricing API stabilization',
|
|
75
|
+
owner: 'Platform Squad',
|
|
76
|
+
type: 'internal',
|
|
77
|
+
status: 'watch',
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
id: 'dep-orion-web-2',
|
|
81
|
+
title: 'Storefront CDN contract update',
|
|
82
|
+
owner: 'Orion Procurement',
|
|
83
|
+
type: 'client',
|
|
84
|
+
status: 'on-track',
|
|
85
|
+
},
|
|
86
|
+
],
|
|
87
|
+
decisions: [
|
|
88
|
+
{
|
|
89
|
+
id: 'dec-orion-web-1',
|
|
90
|
+
date: '2026-02-14',
|
|
91
|
+
title: 'Adopt phased rollout by region',
|
|
92
|
+
ownerUserId: 'usr-ana',
|
|
93
|
+
summary:
|
|
94
|
+
'Release by region to reduce blast radius and accelerate learning.',
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
id: 'dec-orion-web-2',
|
|
98
|
+
date: '2026-03-05',
|
|
99
|
+
title: 'Prioritize checkout reliability over catalog animation scope',
|
|
100
|
+
ownerUserId: 'usr-carla',
|
|
101
|
+
summary:
|
|
102
|
+
'Shifted effort from low-impact visual scope to transactional reliability.',
|
|
103
|
+
},
|
|
104
|
+
],
|
|
105
|
+
nextActions: [
|
|
106
|
+
'Concluir fallback de pricing e validar em carga.',
|
|
107
|
+
'Executar dry-run do plano de rollout regional.',
|
|
108
|
+
'Fechar checklist de observabilidade de checkout.',
|
|
109
|
+
],
|
|
110
|
+
monthlyForecast: [
|
|
111
|
+
{
|
|
112
|
+
month: 'Jan',
|
|
113
|
+
plannedCost: 14000,
|
|
114
|
+
actualCost: 13200,
|
|
115
|
+
plannedProgress: 14,
|
|
116
|
+
actualProgress: 12,
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
month: 'Feb',
|
|
120
|
+
plannedCost: 18000,
|
|
121
|
+
actualCost: 19250,
|
|
122
|
+
plannedProgress: 30,
|
|
123
|
+
actualProgress: 28,
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
month: 'Mar',
|
|
127
|
+
plannedCost: 22000,
|
|
128
|
+
actualCost: 23500,
|
|
129
|
+
plannedProgress: 48,
|
|
130
|
+
actualProgress: 45,
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
month: 'Apr',
|
|
134
|
+
plannedCost: 21000,
|
|
135
|
+
actualCost: 0,
|
|
136
|
+
plannedProgress: 63,
|
|
137
|
+
actualProgress: 0,
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
month: 'May',
|
|
141
|
+
plannedCost: 19500,
|
|
142
|
+
actualCost: 0,
|
|
143
|
+
plannedProgress: 82,
|
|
144
|
+
actualProgress: 0,
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
month: 'Jun',
|
|
148
|
+
plannedCost: 17000,
|
|
149
|
+
actualCost: 0,
|
|
150
|
+
plannedProgress: 100,
|
|
151
|
+
actualProgress: 0,
|
|
152
|
+
},
|
|
153
|
+
],
|
|
17
154
|
},
|
|
18
155
|
{
|
|
19
156
|
id: 'prj-orion-data',
|
|
@@ -25,9 +162,98 @@ export const projectsMock: Project[] = [
|
|
|
25
162
|
hoursLogged: 244,
|
|
26
163
|
startDate: '2026-02-03',
|
|
27
164
|
endDate: '2026-09-15',
|
|
28
|
-
description:
|
|
165
|
+
description:
|
|
166
|
+
'Data governance and reporting layer for omnichannel operations.',
|
|
29
167
|
contractId: 'ctr-orion',
|
|
30
168
|
budget: 98000,
|
|
169
|
+
health: {
|
|
170
|
+
overall: 'attention',
|
|
171
|
+
scope: 'stable',
|
|
172
|
+
schedule: 'critical',
|
|
173
|
+
budget: 'attention',
|
|
174
|
+
quality: 'stable',
|
|
175
|
+
},
|
|
176
|
+
milestones: [
|
|
177
|
+
{
|
|
178
|
+
id: 'ms-orion-data-1',
|
|
179
|
+
title: 'Data ownership mapping',
|
|
180
|
+
date: '2026-03-07',
|
|
181
|
+
status: 'done',
|
|
182
|
+
description:
|
|
183
|
+
'Ownership and stewardship model approved by operations and BI.',
|
|
184
|
+
},
|
|
185
|
+
{
|
|
186
|
+
id: 'ms-orion-data-2',
|
|
187
|
+
title: 'Warehouse latency dashboard',
|
|
188
|
+
date: '2026-04-20',
|
|
189
|
+
status: 'delayed',
|
|
190
|
+
description: 'Delayed due to source system inconsistencies.',
|
|
191
|
+
},
|
|
192
|
+
],
|
|
193
|
+
risks: [
|
|
194
|
+
{
|
|
195
|
+
id: 'risk-orion-data-1',
|
|
196
|
+
title: 'Source systems have inconsistent SKU IDs',
|
|
197
|
+
ownerUserId: 'usr-gabi',
|
|
198
|
+
severity: 'high',
|
|
199
|
+
status: 'open',
|
|
200
|
+
impact: 'Executive dashboards may show wrong reconciled volume.',
|
|
201
|
+
mitigation:
|
|
202
|
+
'Introduce temporary canonical mapping table and nightly audit.',
|
|
203
|
+
},
|
|
204
|
+
],
|
|
205
|
+
dependencies: [
|
|
206
|
+
{
|
|
207
|
+
id: 'dep-orion-data-1',
|
|
208
|
+
title: 'ERP extract contract extension',
|
|
209
|
+
owner: 'Client IT',
|
|
210
|
+
type: 'client',
|
|
211
|
+
status: 'blocked',
|
|
212
|
+
},
|
|
213
|
+
],
|
|
214
|
+
decisions: [
|
|
215
|
+
{
|
|
216
|
+
id: 'dec-orion-data-1',
|
|
217
|
+
date: '2026-03-02',
|
|
218
|
+
title: 'Adopt weekly release train for analytics assets',
|
|
219
|
+
ownerUserId: 'usr-carla',
|
|
220
|
+
summary: 'Move from ad-hoc delivery to weekly controlled releases.',
|
|
221
|
+
},
|
|
222
|
+
],
|
|
223
|
+
nextActions: [
|
|
224
|
+
'Destravar contrato de extracao ERP com TI do cliente.',
|
|
225
|
+
'Concluir camada de reconciliacao de SKUs.',
|
|
226
|
+
],
|
|
227
|
+
monthlyForecast: [
|
|
228
|
+
{
|
|
229
|
+
month: 'Feb',
|
|
230
|
+
plannedCost: 11000,
|
|
231
|
+
actualCost: 12100,
|
|
232
|
+
plannedProgress: 12,
|
|
233
|
+
actualProgress: 10,
|
|
234
|
+
},
|
|
235
|
+
{
|
|
236
|
+
month: 'Mar',
|
|
237
|
+
plannedCost: 15000,
|
|
238
|
+
actualCost: 16800,
|
|
239
|
+
plannedProgress: 24,
|
|
240
|
+
actualProgress: 20,
|
|
241
|
+
},
|
|
242
|
+
{
|
|
243
|
+
month: 'Apr',
|
|
244
|
+
plannedCost: 17000,
|
|
245
|
+
actualCost: 0,
|
|
246
|
+
plannedProgress: 38,
|
|
247
|
+
actualProgress: 0,
|
|
248
|
+
},
|
|
249
|
+
{
|
|
250
|
+
month: 'May',
|
|
251
|
+
plannedCost: 16500,
|
|
252
|
+
actualCost: 0,
|
|
253
|
+
plannedProgress: 55,
|
|
254
|
+
actualProgress: 0,
|
|
255
|
+
},
|
|
256
|
+
],
|
|
31
257
|
},
|
|
32
258
|
{
|
|
33
259
|
id: 'prj-zenith-cloud',
|
|
@@ -39,9 +265,97 @@ export const projectsMock: Project[] = [
|
|
|
39
265
|
hoursLogged: 322,
|
|
40
266
|
startDate: '2026-01-12',
|
|
41
267
|
endDate: '2026-07-31',
|
|
42
|
-
description:
|
|
268
|
+
description:
|
|
269
|
+
'Ops stabilization and incident reduction program after migration.',
|
|
43
270
|
contractId: 'ctr-zenith',
|
|
44
271
|
budget: 115000,
|
|
272
|
+
health: {
|
|
273
|
+
overall: 'stable',
|
|
274
|
+
scope: 'stable',
|
|
275
|
+
schedule: 'stable',
|
|
276
|
+
budget: 'stable',
|
|
277
|
+
quality: 'attention',
|
|
278
|
+
},
|
|
279
|
+
milestones: [
|
|
280
|
+
{
|
|
281
|
+
id: 'ms-zenith-1',
|
|
282
|
+
title: 'Alert routing automation',
|
|
283
|
+
date: '2026-03-15',
|
|
284
|
+
status: 'done',
|
|
285
|
+
description: 'Critical incidents now route by service ownership.',
|
|
286
|
+
},
|
|
287
|
+
{
|
|
288
|
+
id: 'ms-zenith-2',
|
|
289
|
+
title: 'Quarterly resilience test',
|
|
290
|
+
date: '2026-05-12',
|
|
291
|
+
status: 'next',
|
|
292
|
+
description: 'Failure simulation for top-priority services.',
|
|
293
|
+
},
|
|
294
|
+
],
|
|
295
|
+
risks: [
|
|
296
|
+
{
|
|
297
|
+
id: 'risk-zenith-1',
|
|
298
|
+
title: 'On-call fatigue after migration incidents',
|
|
299
|
+
ownerUserId: 'usr-bruno',
|
|
300
|
+
severity: 'medium',
|
|
301
|
+
status: 'accepted',
|
|
302
|
+
impact: 'Potential drop in response quality and team morale.',
|
|
303
|
+
mitigation: 'Rotate on-call and enforce cooldown policies.',
|
|
304
|
+
},
|
|
305
|
+
],
|
|
306
|
+
dependencies: [
|
|
307
|
+
{
|
|
308
|
+
id: 'dep-zenith-1',
|
|
309
|
+
title: 'Client security review for runbook tooling',
|
|
310
|
+
owner: 'Zenith Security Board',
|
|
311
|
+
type: 'client',
|
|
312
|
+
status: 'on-track',
|
|
313
|
+
},
|
|
314
|
+
],
|
|
315
|
+
decisions: [
|
|
316
|
+
{
|
|
317
|
+
id: 'dec-zenith-1',
|
|
318
|
+
date: '2026-03-16',
|
|
319
|
+
title: 'Switch major incidents to follow-the-sun protocol',
|
|
320
|
+
ownerUserId: 'usr-ana',
|
|
321
|
+
summary:
|
|
322
|
+
'Distribute high-severity handling to reduce response bottlenecks.',
|
|
323
|
+
},
|
|
324
|
+
],
|
|
325
|
+
nextActions: [
|
|
326
|
+
'Publicar runbook atualizado no comite mensal.',
|
|
327
|
+
'Executar simulacao de falha em ambiente controlado.',
|
|
328
|
+
],
|
|
329
|
+
monthlyForecast: [
|
|
330
|
+
{
|
|
331
|
+
month: 'Jan',
|
|
332
|
+
plannedCost: 16000,
|
|
333
|
+
actualCost: 15700,
|
|
334
|
+
plannedProgress: 16,
|
|
335
|
+
actualProgress: 17,
|
|
336
|
+
},
|
|
337
|
+
{
|
|
338
|
+
month: 'Feb',
|
|
339
|
+
plannedCost: 17000,
|
|
340
|
+
actualCost: 17400,
|
|
341
|
+
plannedProgress: 31,
|
|
342
|
+
actualProgress: 30,
|
|
343
|
+
},
|
|
344
|
+
{
|
|
345
|
+
month: 'Mar',
|
|
346
|
+
plannedCost: 19500,
|
|
347
|
+
actualCost: 18800,
|
|
348
|
+
plannedProgress: 45,
|
|
349
|
+
actualProgress: 47,
|
|
350
|
+
},
|
|
351
|
+
{
|
|
352
|
+
month: 'Apr',
|
|
353
|
+
plannedCost: 18200,
|
|
354
|
+
actualCost: 0,
|
|
355
|
+
plannedProgress: 58,
|
|
356
|
+
actualProgress: 0,
|
|
357
|
+
},
|
|
358
|
+
],
|
|
45
359
|
},
|
|
46
360
|
{
|
|
47
361
|
id: 'prj-atlas-crm',
|
|
@@ -56,5 +370,86 @@ export const projectsMock: Project[] = [
|
|
|
56
370
|
description: 'Sales and service CRM rollout with operational dashboards.',
|
|
57
371
|
contractId: 'ctr-atlas',
|
|
58
372
|
budget: 89000,
|
|
373
|
+
health: {
|
|
374
|
+
overall: 'stable',
|
|
375
|
+
scope: 'excellent',
|
|
376
|
+
schedule: 'stable',
|
|
377
|
+
budget: 'stable',
|
|
378
|
+
quality: 'stable',
|
|
379
|
+
},
|
|
380
|
+
milestones: [
|
|
381
|
+
{
|
|
382
|
+
id: 'ms-atlas-1',
|
|
383
|
+
title: 'Discovery and process mapping',
|
|
384
|
+
date: '2026-03-18',
|
|
385
|
+
status: 'done',
|
|
386
|
+
description:
|
|
387
|
+
'Cross-functional mapping completed for sales and support flows.',
|
|
388
|
+
},
|
|
389
|
+
{
|
|
390
|
+
id: 'ms-atlas-2',
|
|
391
|
+
title: 'Pilot launch',
|
|
392
|
+
date: '2026-05-30',
|
|
393
|
+
status: 'next',
|
|
394
|
+
description: 'Pilot branch launch for LATAM service teams.',
|
|
395
|
+
},
|
|
396
|
+
],
|
|
397
|
+
risks: [
|
|
398
|
+
{
|
|
399
|
+
id: 'risk-atlas-1',
|
|
400
|
+
title: 'Data migration quality from legacy CRM',
|
|
401
|
+
ownerUserId: 'usr-elisa',
|
|
402
|
+
severity: 'medium',
|
|
403
|
+
status: 'open',
|
|
404
|
+
impact: 'Historical data can affect reporting confidence.',
|
|
405
|
+
mitigation:
|
|
406
|
+
'Two-step migration with sample reconciliation by business users.',
|
|
407
|
+
},
|
|
408
|
+
],
|
|
409
|
+
dependencies: [
|
|
410
|
+
{
|
|
411
|
+
id: 'dep-atlas-1',
|
|
412
|
+
title: 'Vendor integration environment',
|
|
413
|
+
owner: 'CRM Vendor',
|
|
414
|
+
type: 'vendor',
|
|
415
|
+
status: 'watch',
|
|
416
|
+
},
|
|
417
|
+
],
|
|
418
|
+
decisions: [
|
|
419
|
+
{
|
|
420
|
+
id: 'dec-atlas-1',
|
|
421
|
+
date: '2026-03-20',
|
|
422
|
+
title: 'Adopt phased migration by business unit',
|
|
423
|
+
ownerUserId: 'usr-carla',
|
|
424
|
+
summary: 'Move migration in waves to protect frontline operations.',
|
|
425
|
+
},
|
|
426
|
+
],
|
|
427
|
+
nextActions: [
|
|
428
|
+
'Confirmar escopo da primeira onda de migracao.',
|
|
429
|
+
'Publicar roteiro de treinamento dos usuarios finais.',
|
|
430
|
+
],
|
|
431
|
+
monthlyForecast: [
|
|
432
|
+
{
|
|
433
|
+
month: 'Mar',
|
|
434
|
+
plannedCost: 10500,
|
|
435
|
+
actualCost: 9600,
|
|
436
|
+
plannedProgress: 10,
|
|
437
|
+
actualProgress: 12,
|
|
438
|
+
},
|
|
439
|
+
{
|
|
440
|
+
month: 'Apr',
|
|
441
|
+
plannedCost: 13000,
|
|
442
|
+
actualCost: 0,
|
|
443
|
+
plannedProgress: 24,
|
|
444
|
+
actualProgress: 0,
|
|
445
|
+
},
|
|
446
|
+
{
|
|
447
|
+
month: 'May',
|
|
448
|
+
plannedCost: 14800,
|
|
449
|
+
actualCost: 0,
|
|
450
|
+
plannedProgress: 41,
|
|
451
|
+
actualProgress: 0,
|
|
452
|
+
},
|
|
453
|
+
],
|
|
59
454
|
},
|
|
60
455
|
];
|
|
@@ -7,10 +7,12 @@ export const tasksMock: Task[] = [
|
|
|
7
7
|
projectId: 'prj-orion-web',
|
|
8
8
|
projectName: 'Orion Commerce Revamp',
|
|
9
9
|
status: 'review',
|
|
10
|
+
priority: 'high',
|
|
10
11
|
labels: ['QA', 'E-commerce'],
|
|
11
12
|
assignedUserId: 'usr-fabio',
|
|
12
13
|
dueDate: '2026-03-18',
|
|
13
14
|
estimatedHours: 10,
|
|
15
|
+
order: 1,
|
|
14
16
|
description: 'Regression pass for payment and address validation flows.',
|
|
15
17
|
},
|
|
16
18
|
{
|
|
@@ -19,10 +21,12 @@ export const tasksMock: Task[] = [
|
|
|
19
21
|
projectId: 'prj-orion-web',
|
|
20
22
|
projectName: 'Orion Commerce Revamp',
|
|
21
23
|
status: 'in-progress',
|
|
24
|
+
priority: 'critical',
|
|
22
25
|
labels: ['Backend', 'API'],
|
|
23
26
|
assignedUserId: 'usr-diego',
|
|
24
27
|
dueDate: '2026-03-20',
|
|
25
28
|
estimatedHours: 16,
|
|
29
|
+
order: 1,
|
|
26
30
|
description: 'Fallback logic for inventory and pricing sync gaps.',
|
|
27
31
|
},
|
|
28
32
|
{
|
|
@@ -31,10 +35,12 @@ export const tasksMock: Task[] = [
|
|
|
31
35
|
projectId: 'prj-orion-web',
|
|
32
36
|
projectName: 'Orion Commerce Revamp',
|
|
33
37
|
status: 'todo',
|
|
38
|
+
priority: 'medium',
|
|
34
39
|
labels: ['UX', 'Frontend'],
|
|
35
40
|
assignedUserId: 'usr-elisa',
|
|
36
41
|
dueDate: '2026-03-21',
|
|
37
42
|
estimatedHours: 14,
|
|
43
|
+
order: 1,
|
|
38
44
|
description: 'Polish responsive product detail page spacing and hierarchy.',
|
|
39
45
|
},
|
|
40
46
|
{
|
|
@@ -43,10 +49,12 @@ export const tasksMock: Task[] = [
|
|
|
43
49
|
projectId: 'prj-orion-data',
|
|
44
50
|
projectName: 'Orion Data Foundation',
|
|
45
51
|
status: 'backlog',
|
|
52
|
+
priority: 'low',
|
|
46
53
|
labels: ['Discovery'],
|
|
47
54
|
assignedUserId: 'usr-carla',
|
|
48
55
|
dueDate: '2026-03-24',
|
|
49
56
|
estimatedHours: 8,
|
|
57
|
+
order: 1,
|
|
50
58
|
description: 'Confirm ownership and cadence for operational KPIs.',
|
|
51
59
|
},
|
|
52
60
|
{
|
|
@@ -55,10 +63,12 @@ export const tasksMock: Task[] = [
|
|
|
55
63
|
projectId: 'prj-orion-data',
|
|
56
64
|
projectName: 'Orion Data Foundation',
|
|
57
65
|
status: 'in-progress',
|
|
66
|
+
priority: 'high',
|
|
58
67
|
labels: ['BI', 'Ops'],
|
|
59
68
|
assignedUserId: 'usr-gabi',
|
|
60
69
|
dueDate: '2026-03-22',
|
|
61
70
|
estimatedHours: 18,
|
|
71
|
+
order: 1,
|
|
62
72
|
description: 'Visualize shipping delay drivers and same-day SLA misses.',
|
|
63
73
|
},
|
|
64
74
|
{
|
|
@@ -67,10 +77,12 @@ export const tasksMock: Task[] = [
|
|
|
67
77
|
projectId: 'prj-zenith-cloud',
|
|
68
78
|
projectName: 'Zenith Cloud Stabilization',
|
|
69
79
|
status: 'done',
|
|
80
|
+
priority: 'medium',
|
|
70
81
|
labels: ['Automation', 'Cloud'],
|
|
71
82
|
assignedUserId: 'usr-bruno',
|
|
72
83
|
dueDate: '2026-03-15',
|
|
73
84
|
estimatedHours: 12,
|
|
85
|
+
order: 1,
|
|
74
86
|
description: 'Connect PagerDuty routing rules to service ownership matrix.',
|
|
75
87
|
},
|
|
76
88
|
{
|
|
@@ -79,10 +91,27 @@ export const tasksMock: Task[] = [
|
|
|
79
91
|
projectId: 'prj-atlas-crm',
|
|
80
92
|
projectName: 'Atlas CRM Implementation',
|
|
81
93
|
status: 'todo',
|
|
94
|
+
priority: 'medium',
|
|
82
95
|
labels: ['PMO'],
|
|
83
96
|
assignedUserId: 'usr-carla',
|
|
84
97
|
dueDate: '2026-03-26',
|
|
85
98
|
estimatedHours: 9,
|
|
99
|
+
order: 2,
|
|
86
100
|
description: 'Track implementation dependencies before build phase starts.',
|
|
87
101
|
},
|
|
102
|
+
{
|
|
103
|
+
id: 'tsk-108',
|
|
104
|
+
title: 'Write escalation playbook for incident command',
|
|
105
|
+
projectId: 'prj-zenith-cloud',
|
|
106
|
+
projectName: 'Zenith Cloud Stabilization',
|
|
107
|
+
status: 'backlog',
|
|
108
|
+
priority: 'high',
|
|
109
|
+
labels: ['Ops', 'Runbook'],
|
|
110
|
+
assignedUserId: '',
|
|
111
|
+
dueDate: '2026-03-28',
|
|
112
|
+
estimatedHours: 6,
|
|
113
|
+
order: 2,
|
|
114
|
+
description:
|
|
115
|
+
'Define owner rotation and escalation trees for sev-1 incidents.',
|
|
116
|
+
},
|
|
88
117
|
];
|
|
@@ -7,16 +7,29 @@ export type ProjectStatus =
|
|
|
7
7
|
| 'paused'
|
|
8
8
|
| 'completed';
|
|
9
9
|
|
|
10
|
+
export type ProjectHealthStatus =
|
|
11
|
+
| 'excellent'
|
|
12
|
+
| 'stable'
|
|
13
|
+
| 'attention'
|
|
14
|
+
| 'critical';
|
|
15
|
+
|
|
16
|
+
export type ProjectRiskSeverity = 'low' | 'medium' | 'high';
|
|
17
|
+
|
|
18
|
+
export type ProjectRiskStatus = 'open' | 'mitigated' | 'accepted';
|
|
19
|
+
|
|
20
|
+
export type ProjectMilestoneStatus = 'done' | 'next' | 'delayed';
|
|
21
|
+
|
|
22
|
+
export type ProjectDependencyType = 'internal' | 'client' | 'vendor';
|
|
23
|
+
|
|
24
|
+
export type ProjectDependencyStatus = 'on-track' | 'watch' | 'blocked';
|
|
25
|
+
|
|
10
26
|
export type ContractType = 'tm' | 'monthly' | 'fixed';
|
|
11
27
|
|
|
12
28
|
export type ContractStatus = 'active' | 'draft' | 'expired' | 'renewal';
|
|
13
29
|
|
|
14
|
-
export type TaskStatus =
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
| 'in-progress'
|
|
18
|
-
| 'review'
|
|
19
|
-
| 'done';
|
|
30
|
+
export type TaskStatus = 'backlog' | 'todo' | 'in-progress' | 'review' | 'done';
|
|
31
|
+
|
|
32
|
+
export type TaskPriority = 'low' | 'medium' | 'high' | 'critical';
|
|
20
33
|
|
|
21
34
|
export interface OperationsUser {
|
|
22
35
|
id: string;
|
|
@@ -57,6 +70,51 @@ export interface Project {
|
|
|
57
70
|
description: string;
|
|
58
71
|
contractId: string;
|
|
59
72
|
budget: number;
|
|
73
|
+
health?: {
|
|
74
|
+
overall: ProjectHealthStatus;
|
|
75
|
+
scope: ProjectHealthStatus;
|
|
76
|
+
schedule: ProjectHealthStatus;
|
|
77
|
+
budget: ProjectHealthStatus;
|
|
78
|
+
quality: ProjectHealthStatus;
|
|
79
|
+
};
|
|
80
|
+
milestones?: {
|
|
81
|
+
id: string;
|
|
82
|
+
title: string;
|
|
83
|
+
date: string;
|
|
84
|
+
status: ProjectMilestoneStatus;
|
|
85
|
+
description: string;
|
|
86
|
+
}[];
|
|
87
|
+
risks?: {
|
|
88
|
+
id: string;
|
|
89
|
+
title: string;
|
|
90
|
+
ownerUserId: string;
|
|
91
|
+
severity: ProjectRiskSeverity;
|
|
92
|
+
status: ProjectRiskStatus;
|
|
93
|
+
impact: string;
|
|
94
|
+
mitigation: string;
|
|
95
|
+
}[];
|
|
96
|
+
dependencies?: {
|
|
97
|
+
id: string;
|
|
98
|
+
title: string;
|
|
99
|
+
owner: string;
|
|
100
|
+
type: ProjectDependencyType;
|
|
101
|
+
status: ProjectDependencyStatus;
|
|
102
|
+
}[];
|
|
103
|
+
decisions?: {
|
|
104
|
+
id: string;
|
|
105
|
+
date: string;
|
|
106
|
+
title: string;
|
|
107
|
+
ownerUserId: string;
|
|
108
|
+
summary: string;
|
|
109
|
+
}[];
|
|
110
|
+
nextActions?: string[];
|
|
111
|
+
monthlyForecast?: {
|
|
112
|
+
month: string;
|
|
113
|
+
plannedCost: number;
|
|
114
|
+
actualCost: number;
|
|
115
|
+
plannedProgress: number;
|
|
116
|
+
actualProgress: number;
|
|
117
|
+
}[];
|
|
60
118
|
}
|
|
61
119
|
|
|
62
120
|
export interface Task {
|
|
@@ -65,10 +123,13 @@ export interface Task {
|
|
|
65
123
|
projectId: string;
|
|
66
124
|
projectName: string;
|
|
67
125
|
status: TaskStatus;
|
|
126
|
+
priority: TaskPriority;
|
|
68
127
|
labels: string[];
|
|
69
128
|
assignedUserId: string;
|
|
70
129
|
dueDate: string;
|
|
71
130
|
estimatedHours: number;
|
|
131
|
+
order: number;
|
|
132
|
+
archived?: boolean;
|
|
72
133
|
description: string;
|
|
73
134
|
}
|
|
74
135
|
|
|
@@ -24,6 +24,7 @@ import { useOperationsData } from '../_lib/hooks/use-operations-data';
|
|
|
24
24
|
import { formatDate } from '../_lib/utils/format';
|
|
25
25
|
|
|
26
26
|
const PAGE_SIZE_OPTIONS = [10, 20, 30, 50];
|
|
27
|
+
const DEFAULT_PAGE_SIZE = PAGE_SIZE_OPTIONS[0] ?? 10;
|
|
27
28
|
|
|
28
29
|
export default function AllocationsPage() {
|
|
29
30
|
const t = useTranslations('operations.AllocationsPage');
|
|
@@ -31,7 +32,7 @@ export default function AllocationsPage() {
|
|
|
31
32
|
const [searchInput, setSearchInput] = useState('');
|
|
32
33
|
const [search, setSearch] = useState('');
|
|
33
34
|
const [currentPage, setCurrentPage] = useState(1);
|
|
34
|
-
const [pageSize, setPageSize] = useState(
|
|
35
|
+
const [pageSize, setPageSize] = useState(DEFAULT_PAGE_SIZE);
|
|
35
36
|
|
|
36
37
|
const filteredAllocations = useMemo(
|
|
37
38
|
() =>
|
|
@@ -23,6 +23,7 @@ import {
|
|
|
23
23
|
} from '../_lib/utils/growth';
|
|
24
24
|
|
|
25
25
|
const PAGE_SIZE_OPTIONS = [4, 8, 12];
|
|
26
|
+
const DEFAULT_PAGE_SIZE = PAGE_SIZE_OPTIONS[0] ?? 4;
|
|
26
27
|
|
|
27
28
|
export default function OperationsCertificationsPage() {
|
|
28
29
|
const t = useTranslations('operations.CertificationsPage');
|
|
@@ -37,7 +38,7 @@ export default function OperationsCertificationsPage() {
|
|
|
37
38
|
const [employeeFilter, setEmployeeFilter] = useState('all');
|
|
38
39
|
const [categoryFilter, setCategoryFilter] = useState('all');
|
|
39
40
|
const [currentPage, setCurrentPage] = useState(1);
|
|
40
|
-
const [pageSize, setPageSize] = useState(
|
|
41
|
+
const [pageSize, setPageSize] = useState(DEFAULT_PAGE_SIZE);
|
|
41
42
|
|
|
42
43
|
const categories = Array.from(new Set(certificationCatalog.map((item) => item.category)));
|
|
43
44
|
|
|
@@ -37,6 +37,7 @@ import {
|
|
|
37
37
|
} from '../_lib/utils/status';
|
|
38
38
|
|
|
39
39
|
const PAGE_SIZE_OPTIONS = [10, 20, 30, 50];
|
|
40
|
+
const DEFAULT_PAGE_SIZE = PAGE_SIZE_OPTIONS[0] ?? 10;
|
|
40
41
|
|
|
41
42
|
export default function ContractsPage() {
|
|
42
43
|
const t = useTranslations('operations.ContractsPage');
|
|
@@ -45,7 +46,7 @@ export default function ContractsPage() {
|
|
|
45
46
|
const [search, setSearch] = useState('');
|
|
46
47
|
const [status, setStatus] = useState('all');
|
|
47
48
|
const [currentPage, setCurrentPage] = useState(1);
|
|
48
|
-
const [pageSize, setPageSize] = useState(
|
|
49
|
+
const [pageSize, setPageSize] = useState(DEFAULT_PAGE_SIZE);
|
|
49
50
|
|
|
50
51
|
const filteredContracts = useMemo(
|
|
51
52
|
() =>
|
|
@@ -25,6 +25,7 @@ import {
|
|
|
25
25
|
} from '../_lib/utils/growth';
|
|
26
26
|
|
|
27
27
|
const PAGE_SIZE_OPTIONS = [4, 8, 12];
|
|
28
|
+
const DEFAULT_PAGE_SIZE = PAGE_SIZE_OPTIONS[0] ?? 4;
|
|
28
29
|
|
|
29
30
|
export default function OperationsEvaluationsPage() {
|
|
30
31
|
const t = useTranslations('operations.EvaluationsPage');
|
|
@@ -36,7 +37,7 @@ export default function OperationsEvaluationsPage() {
|
|
|
36
37
|
const [cycleFilter, setCycleFilter] = useState('all');
|
|
37
38
|
const [projectFilter, setProjectFilter] = useState('all');
|
|
38
39
|
const [currentPage, setCurrentPage] = useState(1);
|
|
39
|
-
const [pageSize, setPageSize] = useState(
|
|
40
|
+
const [pageSize, setPageSize] = useState(DEFAULT_PAGE_SIZE);
|
|
40
41
|
const [selectedEvaluationId, setSelectedEvaluationId] = useState(evaluations[0]?.id ?? '');
|
|
41
42
|
|
|
42
43
|
const filteredEvaluations = useMemo(
|