@hed-hog/operations 0.0.331 → 0.0.338
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-contracts.controller.d.ts +12 -12
- package/dist/operations.service.d.ts.map +1 -1
- package/dist/operations.service.js +8 -1
- package/dist/operations.service.js.map +1 -1
- package/dist/operations.service.spec.js +6 -0
- package/dist/operations.service.spec.js.map +1 -1
- package/hedhog/frontend/app/_components/collaborator-details-screen.tsx.ejs +476 -0
- package/hedhog/frontend/app/_components/collaborator-select-with-create.tsx.ejs +261 -0
- package/hedhog/frontend/app/_components/collaborator-tasks-tab.tsx.ejs +358 -358
- package/hedhog/frontend/app/_components/collaborator-timesheets-tab.tsx.ejs +6 -6
- package/hedhog/frontend/app/_components/contract-content-editor.tsx.ejs +258 -0
- package/hedhog/frontend/app/_components/my-project-summary-screen.tsx.ejs +84 -84
- package/hedhog/frontend/app/_components/person-select-with-create.tsx.ejs +1 -0
- package/hedhog/frontend/app/_components/project-cost-report-screen.tsx.ejs +23 -23
- package/hedhog/frontend/app/_components/project-details-screen.tsx.ejs +4 -4
- package/hedhog/frontend/app/_components/task-detail-sheet.tsx.ejs +803 -803
- package/hedhog/frontend/app/_components/task-form-sheet.tsx.ejs +629 -629
- package/hedhog/frontend/app/_lib/api.ts.ejs +480 -480
- package/hedhog/frontend/app/_lib/types.ts.ejs +5 -5
- package/hedhog/frontend/app/my-tasks/page.tsx.ejs +74 -74
- package/hedhog/frontend/messages/operations/operations/en.json +2100 -0
- package/hedhog/frontend/messages/operations/operations/pt.json +2111 -0
- package/hedhog/frontend/widgets/capacity-distribution.tsx.ejs +16 -16
- package/hedhog/frontend/widgets/effort-by-project.tsx.ejs +16 -16
- package/hedhog/frontend/widgets/headcount-by-area.tsx.ejs +16 -16
- package/hedhog/frontend/widgets/index.ts.ejs +25 -25
- package/hedhog/frontend/widgets/managed-projects-status.tsx.ejs +16 -16
- package/hedhog/frontend/widgets/my-hours-period-kpi.tsx.ejs +16 -16
- package/hedhog/frontend/widgets/my-open-requests-kpi.tsx.ejs +16 -16
- package/hedhog/frontend/widgets/my-pending-requests-list.tsx.ejs +16 -16
- package/hedhog/frontend/widgets/my-project-allocations-kpi.tsx.ejs +16 -16
- package/hedhog/frontend/widgets/my-quick-actions.tsx.ejs +16 -16
- package/hedhog/frontend/widgets/my-relevant-deadlines.tsx.ejs +16 -16
- package/hedhog/frontend/widgets/my-timesheet-status-kpi.tsx.ejs +16 -16
- package/hedhog/frontend/widgets/my-weekly-journey.tsx.ejs +16 -16
- package/hedhog/frontend/widgets/portfolio-costs-kpi.tsx.ejs +16 -16
- package/hedhog/frontend/widgets/portfolio-effort-kpi.tsx.ejs +16 -16
- package/hedhog/frontend/widgets/portfolio-projects-kpi.tsx.ejs +16 -16
- package/hedhog/frontend/widgets/portfolio-risk-kpi.tsx.ejs +16 -16
- package/hedhog/frontend/widgets/project-status-overview.tsx.ejs +16 -16
- package/hedhog/frontend/widgets/shared-operations-widget.tsx.ejs +169 -169
- package/hedhog/frontend/widgets/strategic-deadlines.tsx.ejs +16 -16
- package/hedhog/frontend/widgets/team-approval-queue.tsx.ejs +16 -16
- package/hedhog/frontend/widgets/team-capacity-kpi.tsx.ejs +16 -16
- package/hedhog/frontend/widgets/team-headcount-kpi.tsx.ejs +16 -16
- package/hedhog/frontend/widgets/team-hours-kpi.tsx.ejs +16 -16
- package/hedhog/frontend/widgets/team-pending-approvals-kpi.tsx.ejs +16 -16
- package/hedhog/frontend/widgets/team-utilization-overview.tsx.ejs +16 -16
- package/hedhog/frontend/widgets/team-workload-alerts.tsx.ejs +16 -16
- package/hedhog/table/operations_collaborator.yaml +8 -8
- package/hedhog/table/operations_task.yaml +76 -76
- package/hedhog/table/operations_task_activity.yaml +51 -51
- package/package.json +5 -5
- package/src/controllers/operations-tasks.controller.ts +156 -156
- package/src/dashboard/widgets/MyQuickActions.tsx +22 -22
- package/src/dto/create-collaborator.dto.ts +4 -4
- package/src/operations.service.spec.ts +1006 -988
- package/src/operations.service.ts +8 -1
|
@@ -414,11 +414,11 @@ export type OperationsTaskOption = {
|
|
|
414
414
|
projectId: number;
|
|
415
415
|
projectAssignmentId: number | null;
|
|
416
416
|
projectName: string;
|
|
417
|
-
projectCode?: string | null;
|
|
418
|
-
dueDate?: string | null;
|
|
419
|
-
estimateHours?: number | null;
|
|
420
|
-
tags?: string | null;
|
|
421
|
-
assigneeName?: string | null;
|
|
417
|
+
projectCode?: string | null;
|
|
418
|
+
dueDate?: string | null;
|
|
419
|
+
estimateHours?: number | null;
|
|
420
|
+
tags?: string | null;
|
|
421
|
+
assigneeName?: string | null;
|
|
422
422
|
assigneeUserPhotoId?: number | null;
|
|
423
423
|
assigneePersonAvatarId?: number | null;
|
|
424
424
|
commentCount?: number | null;
|
|
@@ -8,42 +8,42 @@ import {
|
|
|
8
8
|
} from '@/components/entity-list';
|
|
9
9
|
import { Button } from '@/components/ui/button';
|
|
10
10
|
import { Card, CardContent } from '@/components/ui/card';
|
|
11
|
-
import {
|
|
12
|
-
Dialog,
|
|
13
|
-
DialogContent,
|
|
14
|
-
DialogDescription,
|
|
11
|
+
import {
|
|
12
|
+
Dialog,
|
|
13
|
+
DialogContent,
|
|
14
|
+
DialogDescription,
|
|
15
15
|
DialogFooter,
|
|
16
16
|
DialogHeader,
|
|
17
|
-
DialogTitle,
|
|
18
|
-
} from '@/components/ui/dialog';
|
|
19
|
-
import { Input } from '@/components/ui/input';
|
|
20
|
-
import { KpiCardsGrid } from '@/components/ui/kpi-cards-grid';
|
|
21
|
-
import { Label } from '@/components/ui/label';
|
|
22
|
-
import { Progress } from '@/components/ui/progress';
|
|
23
|
-
import {
|
|
24
|
-
Select,
|
|
25
|
-
SelectContent,
|
|
26
|
-
SelectItem,
|
|
27
|
-
SelectTrigger,
|
|
28
|
-
SelectValue,
|
|
29
|
-
} from '@/components/ui/select';
|
|
30
|
-
import {
|
|
31
|
-
Sheet,
|
|
32
|
-
SheetContent,
|
|
33
|
-
SheetHeader,
|
|
34
|
-
SheetTitle,
|
|
35
|
-
} from '@/components/ui/sheet';
|
|
36
|
-
import {
|
|
37
|
-
Table,
|
|
38
|
-
TableBody,
|
|
39
|
-
TableCell,
|
|
17
|
+
DialogTitle,
|
|
18
|
+
} from '@/components/ui/dialog';
|
|
19
|
+
import { Input } from '@/components/ui/input';
|
|
20
|
+
import { KpiCardsGrid } from '@/components/ui/kpi-cards-grid';
|
|
21
|
+
import { Label } from '@/components/ui/label';
|
|
22
|
+
import { Progress } from '@/components/ui/progress';
|
|
23
|
+
import {
|
|
24
|
+
Select,
|
|
25
|
+
SelectContent,
|
|
26
|
+
SelectItem,
|
|
27
|
+
SelectTrigger,
|
|
28
|
+
SelectValue,
|
|
29
|
+
} from '@/components/ui/select';
|
|
30
|
+
import {
|
|
31
|
+
Sheet,
|
|
32
|
+
SheetContent,
|
|
33
|
+
SheetHeader,
|
|
34
|
+
SheetTitle,
|
|
35
|
+
} from '@/components/ui/sheet';
|
|
36
|
+
import {
|
|
37
|
+
Table,
|
|
38
|
+
TableBody,
|
|
39
|
+
TableCell,
|
|
40
40
|
TableHead,
|
|
41
41
|
TableHeader,
|
|
42
|
-
TableRow,
|
|
43
|
-
} from '@/components/ui/table';
|
|
44
|
-
import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';
|
|
45
|
-
import { ToggleGroup, ToggleGroupItem } from '@/components/ui/toggle-group';
|
|
46
|
-
import { RichTextEditor } from '@/components/rich-text-editor';
|
|
42
|
+
TableRow,
|
|
43
|
+
} from '@/components/ui/table';
|
|
44
|
+
import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';
|
|
45
|
+
import { ToggleGroup, ToggleGroupItem } from '@/components/ui/toggle-group';
|
|
46
|
+
import { RichTextEditor } from '@/components/rich-text-editor';
|
|
47
47
|
import {
|
|
48
48
|
closestCenter,
|
|
49
49
|
DndContext,
|
|
@@ -85,16 +85,16 @@ import Link from 'next/link';
|
|
|
85
85
|
import { useCallback, useMemo, useState } from 'react';
|
|
86
86
|
import { OperationsHeader } from '../_components/operations-header';
|
|
87
87
|
import { StatusBadge } from '../_components/status-badge';
|
|
88
|
-
import {
|
|
89
|
-
TaskDetailSheet,
|
|
90
|
-
TaskCommentsSection,
|
|
91
|
-
type TaskDetailSheetData,
|
|
92
|
-
} from '../_components/task-detail-sheet';
|
|
93
|
-
import { TaskFileAttachments } from '../_components/task-file-attachments';
|
|
94
|
-
import { TimesheetEntryCreateSheet } from '../_components/timesheet-entry-create-sheet';
|
|
95
|
-
import { fetchOperations, mutateOperations } from '../_lib/api';
|
|
96
|
-
import { useMentionItems } from '../_lib/hooks/use-mention-items';
|
|
97
|
-
import { usePersistedPageSize } from '@/hooks/use-persisted-page-size';
|
|
88
|
+
import {
|
|
89
|
+
TaskDetailSheet,
|
|
90
|
+
TaskCommentsSection,
|
|
91
|
+
type TaskDetailSheetData,
|
|
92
|
+
} from '../_components/task-detail-sheet';
|
|
93
|
+
import { TaskFileAttachments } from '../_components/task-file-attachments';
|
|
94
|
+
import { TimesheetEntryCreateSheet } from '../_components/timesheet-entry-create-sheet';
|
|
95
|
+
import { fetchOperations, mutateOperations } from '../_lib/api';
|
|
96
|
+
import { useMentionItems } from '../_lib/hooks/use-mention-items';
|
|
97
|
+
import { usePersistedPageSize } from '@/hooks/use-persisted-page-size';
|
|
98
98
|
import type {
|
|
99
99
|
OperationsCollaborator,
|
|
100
100
|
OperationsProjectOption,
|
|
@@ -168,25 +168,25 @@ function parseTaskId(value: UniqueIdentifier | null | undefined) {
|
|
|
168
168
|
return match ? Number(match[1]) : null;
|
|
169
169
|
}
|
|
170
170
|
|
|
171
|
-
function parseColumnId(
|
|
172
|
-
value: UniqueIdentifier | null | undefined
|
|
173
|
-
): BoardColumnId | null {
|
|
174
|
-
if (!value) return null;
|
|
175
|
-
const match = String(value).match(/^col-(.+)$/);
|
|
176
|
-
const id = match?.[1];
|
|
177
|
-
return KANBAN_COLUMNS.some((c) => c.id === id) ? (id as BoardColumnId) : null;
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
function normalizeDateInputValue(value?: string | null) {
|
|
181
|
-
if (!value) return '';
|
|
182
|
-
const match = String(value)
|
|
183
|
-
.trim()
|
|
184
|
-
.match(/^\d{4}-\d{2}-\d{2}/);
|
|
185
|
-
return match?.[0] ?? '';
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
function splitTasksByColumn(tasks: OperationsTaskOption[]): BoardColumns {
|
|
189
|
-
return {
|
|
171
|
+
function parseColumnId(
|
|
172
|
+
value: UniqueIdentifier | null | undefined
|
|
173
|
+
): BoardColumnId | null {
|
|
174
|
+
if (!value) return null;
|
|
175
|
+
const match = String(value).match(/^col-(.+)$/);
|
|
176
|
+
const id = match?.[1];
|
|
177
|
+
return KANBAN_COLUMNS.some((c) => c.id === id) ? (id as BoardColumnId) : null;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
function normalizeDateInputValue(value?: string | null) {
|
|
181
|
+
if (!value) return '';
|
|
182
|
+
const match = String(value)
|
|
183
|
+
.trim()
|
|
184
|
+
.match(/^\d{4}-\d{2}-\d{2}/);
|
|
185
|
+
return match?.[0] ?? '';
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
function splitTasksByColumn(tasks: OperationsTaskOption[]): BoardColumns {
|
|
189
|
+
return {
|
|
190
190
|
todo: tasks.filter((t) => t.status === 'todo'),
|
|
191
191
|
doing: tasks.filter((t) => t.status === 'doing'),
|
|
192
192
|
review: tasks.filter((t) => t.status === 'review'),
|
|
@@ -334,10 +334,10 @@ export default function OperationsMyTasksPage() {
|
|
|
334
334
|
const t = useTranslations('operations.MyTasksPage');
|
|
335
335
|
const commonT = useTranslations('operations.Common');
|
|
336
336
|
const detailT = useTranslations('operations.ProjectDetailsPage');
|
|
337
|
-
|
|
338
|
-
const { request, currentLocaleCode, getSettingValue } = useApp();
|
|
339
|
-
const mentionItems = useMentionItems(request);
|
|
340
|
-
const [search, setSearch] = useState('');
|
|
337
|
+
|
|
338
|
+
const { request, currentLocaleCode, getSettingValue } = useApp();
|
|
339
|
+
const mentionItems = useMentionItems(request);
|
|
340
|
+
const [search, setSearch] = useState('');
|
|
341
341
|
const [statusFilter, setStatusFilter] = useState('all');
|
|
342
342
|
const [page, setPage] = useState(1);
|
|
343
343
|
const [pageSize, setPageSize] = usePersistedPageSize({
|
|
@@ -366,11 +366,11 @@ export default function OperationsMyTasksPage() {
|
|
|
366
366
|
const [deletePromptTask, setDeletePromptTask] =
|
|
367
367
|
useState<OperationsTaskOption | null>(null);
|
|
368
368
|
const [taskFormOpen, setTaskFormOpen] = useState(false);
|
|
369
|
-
const [editingTaskId, setEditingTaskId] = useState<number | null>(null);
|
|
370
|
-
const [archivingTaskId, setArchivingTaskId] = useState<number | null>(null);
|
|
371
|
-
const [taskFormLoading, setTaskFormLoading] = useState(false);
|
|
372
|
-
const [taskFormData, setTaskFormData] =
|
|
373
|
-
useState<TaskFormState>(EMPTY_TASK_FORM);
|
|
369
|
+
const [editingTaskId, setEditingTaskId] = useState<number | null>(null);
|
|
370
|
+
const [archivingTaskId, setArchivingTaskId] = useState<number | null>(null);
|
|
371
|
+
const [taskFormLoading, setTaskFormLoading] = useState(false);
|
|
372
|
+
const [taskFormData, setTaskFormData] =
|
|
373
|
+
useState<TaskFormState>(EMPTY_TASK_FORM);
|
|
374
374
|
const [activeDragTask, setActiveDragTask] =
|
|
375
375
|
useState<OperationsTaskOption | null>(null);
|
|
376
376
|
const [isTimesheetEntrySheetOpen, setIsTimesheetEntrySheetOpen] =
|
|
@@ -1527,10 +1527,10 @@ export default function OperationsMyTasksPage() {
|
|
|
1527
1527
|
</Dialog>
|
|
1528
1528
|
|
|
1529
1529
|
|
|
1530
|
-
<Sheet
|
|
1531
|
-
open={taskFormOpen}
|
|
1532
|
-
onOpenChange={(open) => {
|
|
1533
|
-
setTaskFormOpen(open);
|
|
1530
|
+
<Sheet
|
|
1531
|
+
open={taskFormOpen}
|
|
1532
|
+
onOpenChange={(open) => {
|
|
1533
|
+
setTaskFormOpen(open);
|
|
1534
1534
|
if (!open) setEditingTaskId(null);
|
|
1535
1535
|
}}
|
|
1536
1536
|
>
|