@hed-hog/operations 0.0.306 → 0.0.310
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-approvals.controller.d.ts +114 -1
- package/dist/controllers/operations-approvals.controller.d.ts.map +1 -1
- package/dist/controllers/operations-approvals.controller.js +16 -3
- package/dist/controllers/operations-approvals.controller.js.map +1 -1
- package/dist/controllers/operations-collaborators.controller.d.ts +16 -1
- package/dist/controllers/operations-collaborators.controller.d.ts.map +1 -1
- package/dist/controllers/operations-collaborators.controller.js +16 -3
- package/dist/controllers/operations-collaborators.controller.js.map +1 -1
- package/dist/controllers/operations-contracts.controller.d.ts +14 -453
- package/dist/controllers/operations-contracts.controller.d.ts.map +1 -1
- package/dist/controllers/operations-contracts.controller.js +11 -112
- package/dist/controllers/operations-contracts.controller.js.map +1 -1
- package/dist/controllers/operations-org-structure.controller.d.ts +65 -2
- package/dist/controllers/operations-org-structure.controller.d.ts.map +1 -1
- package/dist/controllers/operations-org-structure.controller.js +18 -5
- package/dist/controllers/operations-org-structure.controller.js.map +1 -1
- package/dist/controllers/operations-projects.controller.d.ts +28 -4
- package/dist/controllers/operations-projects.controller.d.ts.map +1 -1
- package/dist/controllers/operations-projects.controller.js +17 -5
- package/dist/controllers/operations-projects.controller.js.map +1 -1
- package/dist/controllers/operations-timesheets.controller.d.ts +31 -4
- package/dist/controllers/operations-timesheets.controller.d.ts.map +1 -1
- package/dist/controllers/operations-timesheets.controller.js +16 -11
- package/dist/controllers/operations-timesheets.controller.js.map +1 -1
- package/dist/dto/list-approvals.dto.d.ts +6 -0
- package/dist/dto/list-approvals.dto.d.ts.map +1 -0
- package/dist/dto/list-approvals.dto.js +28 -0
- package/dist/dto/list-approvals.dto.js.map +1 -0
- package/dist/dto/list-collaborator-types.dto.d.ts +3 -1
- package/dist/dto/list-collaborator-types.dto.d.ts.map +1 -1
- package/dist/dto/list-collaborator-types.dto.js +7 -1
- package/dist/dto/list-collaborator-types.dto.js.map +1 -1
- package/dist/dto/list-collaborators.dto.d.ts +1 -0
- package/dist/dto/list-collaborators.dto.d.ts.map +1 -1
- package/dist/dto/list-collaborators.dto.js +5 -0
- package/dist/dto/list-collaborators.dto.js.map +1 -1
- package/dist/dto/list-contracts.dto.d.ts +8 -0
- package/dist/dto/list-contracts.dto.d.ts.map +1 -0
- package/dist/dto/list-contracts.dto.js +38 -0
- package/dist/dto/list-contracts.dto.js.map +1 -0
- package/dist/dto/list-departments.dto.d.ts +5 -0
- package/dist/dto/list-departments.dto.d.ts.map +1 -0
- package/dist/dto/list-departments.dto.js +23 -0
- package/dist/dto/list-departments.dto.js.map +1 -0
- package/dist/dto/list-projects.dto.d.ts +5 -0
- package/dist/dto/list-projects.dto.d.ts.map +1 -0
- package/dist/dto/list-projects.dto.js +23 -0
- package/dist/dto/list-projects.dto.js.map +1 -0
- package/dist/dto/list-schedule-adjustments.dto.d.ts +5 -0
- package/dist/dto/list-schedule-adjustments.dto.d.ts.map +1 -0
- package/dist/dto/list-schedule-adjustments.dto.js +23 -0
- package/dist/dto/list-schedule-adjustments.dto.js.map +1 -0
- package/dist/dto/list-time-off-requests.dto.d.ts +5 -0
- package/dist/dto/list-time-off-requests.dto.d.ts.map +1 -0
- package/dist/dto/list-time-off-requests.dto.js +23 -0
- package/dist/dto/list-time-off-requests.dto.js.map +1 -0
- package/dist/dto/list-timesheets.dto.d.ts +5 -0
- package/dist/dto/list-timesheets.dto.d.ts.map +1 -0
- package/dist/dto/list-timesheets.dto.js +23 -0
- package/dist/dto/list-timesheets.dto.js.map +1 -0
- package/dist/dto/reorder-collaborator-types.dto.d.ts +4 -0
- package/dist/dto/reorder-collaborator-types.dto.d.ts.map +1 -0
- package/dist/dto/reorder-collaborator-types.dto.js +25 -0
- package/dist/dto/reorder-collaborator-types.dto.js.map +1 -0
- package/dist/operations.service.d.ts +340 -271
- package/dist/operations.service.d.ts.map +1 -1
- package/dist/operations.service.js +1007 -1043
- package/dist/operations.service.js.map +1 -1
- package/dist/operations.service.spec.js +0 -22
- package/dist/operations.service.spec.js.map +1 -1
- package/hedhog/data/menu.yaml +0 -36
- package/hedhog/data/route.yaml +42 -73
- package/hedhog/frontend/app/_components/collaborator-form-screen.tsx.ejs +8 -1
- package/hedhog/frontend/app/_components/collaborator-select-with-create.tsx.ejs +15 -10
- package/hedhog/frontend/app/_components/contract-details-screen.tsx.ejs +108 -213
- package/hedhog/frontend/app/_components/contract-form-screen.tsx.ejs +251 -2039
- package/hedhog/frontend/app/_components/project-details-screen.tsx.ejs +167 -60
- package/hedhog/frontend/app/_components/project-form-screen.tsx.ejs +70 -301
- package/hedhog/frontend/app/_components/system-user-select-with-create.tsx.ejs +102 -51
- package/hedhog/frontend/app/_lib/types.ts.ejs +19 -24
- package/hedhog/frontend/app/_lib/utils/format.ts.ejs +14 -9
- package/hedhog/frontend/app/approvals/page.tsx.ejs +842 -150
- package/hedhog/frontend/app/collaborator-types/page.tsx.ejs +445 -153
- package/hedhog/frontend/app/collaborators/page.tsx.ejs +118 -49
- package/hedhog/frontend/app/contracts/[id]/page.tsx.ejs +2 -2
- package/hedhog/frontend/app/contracts/page.tsx.ejs +215 -617
- package/hedhog/frontend/app/departments/page.tsx.ejs +257 -113
- package/hedhog/frontend/app/projects/page.tsx.ejs +90 -51
- package/hedhog/frontend/app/schedule-adjustments/page.tsx.ejs +412 -147
- package/hedhog/frontend/app/time-off/page.tsx.ejs +400 -123
- package/hedhog/frontend/app/timesheets/page.tsx.ejs +460 -365
- package/hedhog/frontend/messages/en.json +143 -14
- package/hedhog/frontend/messages/pt.json +192 -54
- package/hedhog/table/operations_contract.yaml +0 -9
- package/package.json +4 -4
- package/src/controllers/operations-approvals.controller.ts +9 -3
- package/src/controllers/operations-collaborators.controller.ts +15 -2
- package/src/controllers/operations-contracts.controller.ts +8 -92
- package/src/controllers/operations-org-structure.controller.ts +17 -4
- package/src/controllers/operations-projects.controller.ts +10 -4
- package/src/controllers/operations-timesheets.controller.ts +17 -8
- package/src/dto/list-approvals.dto.ts +12 -0
- package/src/dto/list-collaborator-types.dto.ts +7 -2
- package/src/dto/list-collaborators.dto.ts +4 -0
- package/src/dto/list-contracts.dto.ts +20 -0
- package/src/dto/list-departments.dto.ts +8 -0
- package/src/dto/list-projects.dto.ts +8 -0
- package/src/dto/list-schedule-adjustments.dto.ts +8 -0
- package/src/dto/list-time-off-requests.dto.ts +8 -0
- package/src/dto/list-timesheets.dto.ts +8 -0
- package/src/dto/reorder-collaborator-types.dto.ts +10 -0
- package/src/operations.service.spec.ts +0 -30
- package/src/operations.service.ts +1557 -1806
- package/hedhog/frontend/app/_components/contract-creation-wizard.tsx.ejs +0 -631
- package/hedhog/frontend/app/_components/contract-template-form-screen.tsx.ejs +0 -526
- package/hedhog/frontend/app/_components/contract-template-select-with-create.tsx.ejs +0 -247
- package/hedhog/frontend/app/_components/contract-wizard-sheet.tsx.ejs +0 -3520
- package/hedhog/frontend/app/contracts/templates/page.tsx.ejs +0 -380
- package/hedhog/frontend/app/team/page.tsx.ejs +0 -352
- package/hedhog/table/operations_contract_financial_term.yaml +0 -40
- package/hedhog/table/operations_contract_revision.yaml +0 -38
- package/hedhog/table/operations_contract_signature.yaml +0 -38
- package/hedhog/table/operations_contract_template.yaml +0 -58
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
|
-
import {
|
|
3
|
+
import {
|
|
4
|
+
EmptyState,
|
|
5
|
+
Page,
|
|
6
|
+
PaginationFooter,
|
|
7
|
+
SearchBar,
|
|
8
|
+
} from '@/components/entity-list';
|
|
4
9
|
import { Button } from '@/components/ui/button';
|
|
5
10
|
import { Card, CardContent } from '@/components/ui/card';
|
|
6
11
|
import { KpiCardsGrid } from '@/components/ui/kpi-cards-grid';
|
|
@@ -41,12 +46,8 @@ import { ProjectFormScreen } from '../_components/project-form-screen';
|
|
|
41
46
|
import { StatusBadge } from '../_components/status-badge';
|
|
42
47
|
import { fetchOperations, mutateOperations } from '../_lib/api';
|
|
43
48
|
import { useOperationsAccess } from '../_lib/hooks/use-operations-access';
|
|
44
|
-
import type { OperationsProject } from '../_lib/types';
|
|
45
|
-
import {
|
|
46
|
-
formatDate,
|
|
47
|
-
formatEnumLabel,
|
|
48
|
-
getStatusBadgeClass,
|
|
49
|
-
} from '../_lib/utils/format';
|
|
49
|
+
import type { OperationsProject, PaginatedResponse } from '../_lib/types';
|
|
50
|
+
import { formatDate, getStatusBadgeClass } from '../_lib/utils/format';
|
|
50
51
|
|
|
51
52
|
const PROJECT_VIEW_STORAGE_KEY = 'operations-projects-view-mode';
|
|
52
53
|
|
|
@@ -60,6 +61,21 @@ function parseEditProjectId(value: string | null) {
|
|
|
60
61
|
export default function OperationsProjectsPage() {
|
|
61
62
|
const t = useTranslations('operations.ProjectsPage');
|
|
62
63
|
const commonT = useTranslations('operations.Common');
|
|
64
|
+
const projectFormT = useTranslations('operations.ProjectFormPage');
|
|
65
|
+
const contractFormT = useTranslations('operations.ContractFormPage');
|
|
66
|
+
|
|
67
|
+
const tProjectStatus = (status: string | null | undefined) =>
|
|
68
|
+
status
|
|
69
|
+
? (projectFormT as unknown as (k: string) => string)(
|
|
70
|
+
`options.statuses.${status}`
|
|
71
|
+
)
|
|
72
|
+
: '-';
|
|
73
|
+
const tContractStatus = (status: string | null | undefined) =>
|
|
74
|
+
status
|
|
75
|
+
? (contractFormT as unknown as (k: string) => string)(
|
|
76
|
+
`options.statuses.${status}`
|
|
77
|
+
)
|
|
78
|
+
: '-';
|
|
63
79
|
const { request, showToastHandler, currentLocaleCode, getSettingValue } =
|
|
64
80
|
useApp();
|
|
65
81
|
const access = useOperationsAccess();
|
|
@@ -68,6 +84,8 @@ export default function OperationsProjectsPage() {
|
|
|
68
84
|
const searchParams = useSearchParams();
|
|
69
85
|
const [search, setSearch] = useState('');
|
|
70
86
|
const [statusFilter, setStatusFilter] = useState('all');
|
|
87
|
+
const [page, setPage] = useState(1);
|
|
88
|
+
const [pageSize, setPageSize] = useState(12);
|
|
71
89
|
const [viewMode, setViewMode] = useState<ProjectViewMode>(() => {
|
|
72
90
|
if (typeof window === 'undefined') {
|
|
73
91
|
return 'table';
|
|
@@ -117,38 +135,40 @@ export default function OperationsProjectsPage() {
|
|
|
117
135
|
updateSheetQuery({ editId: projectId });
|
|
118
136
|
};
|
|
119
137
|
|
|
120
|
-
const { data:
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
138
|
+
const { data: projectsResponse, refetch } = useQuery<
|
|
139
|
+
PaginatedResponse<OperationsProject>
|
|
140
|
+
>({
|
|
141
|
+
queryKey: [
|
|
142
|
+
'operations-projects-list',
|
|
143
|
+
currentLocaleCode,
|
|
144
|
+
search,
|
|
145
|
+
statusFilter,
|
|
146
|
+
page,
|
|
147
|
+
pageSize,
|
|
148
|
+
],
|
|
149
|
+
queryFn: () => {
|
|
150
|
+
const params = new URLSearchParams({
|
|
151
|
+
page: String(page),
|
|
152
|
+
pageSize: String(pageSize),
|
|
153
|
+
});
|
|
125
154
|
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
);
|
|
144
|
-
|
|
145
|
-
const matchesStatus =
|
|
146
|
-
statusFilter === 'all' ? true : item.status === statusFilter;
|
|
147
|
-
|
|
148
|
-
return matchesSearch && matchesStatus;
|
|
149
|
-
}),
|
|
150
|
-
[projects, search, statusFilter]
|
|
151
|
-
);
|
|
155
|
+
if (search.trim()) {
|
|
156
|
+
params.set('search', search.trim());
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
if (statusFilter !== 'all') {
|
|
160
|
+
params.set('status', statusFilter);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
return fetchOperations<PaginatedResponse<OperationsProject>>(
|
|
164
|
+
request,
|
|
165
|
+
`/operations/projects?${params.toString()}`
|
|
166
|
+
);
|
|
167
|
+
},
|
|
168
|
+
placeholderData: (previous) => previous,
|
|
169
|
+
});
|
|
170
|
+
const projects = projectsResponse?.data ?? [];
|
|
171
|
+
const filteredRows = projects;
|
|
152
172
|
|
|
153
173
|
const statsCards = useMemo(
|
|
154
174
|
() => [
|
|
@@ -245,24 +265,31 @@ export default function OperationsProjectsPage() {
|
|
|
245
265
|
<SearchBar
|
|
246
266
|
className="w-full"
|
|
247
267
|
searchQuery={search}
|
|
248
|
-
onSearchChange={
|
|
249
|
-
|
|
268
|
+
onSearchChange={(value) => {
|
|
269
|
+
setSearch(value);
|
|
270
|
+
setPage(1);
|
|
271
|
+
}}
|
|
272
|
+
showSearchButton={false}
|
|
273
|
+
debounceMs={500}
|
|
250
274
|
placeholder={t('searchPlaceholder')}
|
|
251
275
|
controls={[
|
|
252
276
|
{
|
|
253
277
|
id: 'status',
|
|
254
278
|
type: 'select',
|
|
255
279
|
value: statusFilter,
|
|
256
|
-
onChange:
|
|
280
|
+
onChange: (value) => {
|
|
281
|
+
setStatusFilter(value);
|
|
282
|
+
setPage(1);
|
|
283
|
+
},
|
|
257
284
|
placeholder: commonT('labels.status'),
|
|
258
285
|
options: [
|
|
259
286
|
{ value: 'all', label: commonT('filters.allStatuses') },
|
|
260
|
-
{ value: 'planning', label:
|
|
261
|
-
{ value: 'active', label:
|
|
262
|
-
{ value: 'at_risk', label:
|
|
263
|
-
{ value: 'paused', label:
|
|
264
|
-
{ value: 'completed', label:
|
|
265
|
-
{ value: 'archived', label:
|
|
287
|
+
{ value: 'planning', label: tProjectStatus('planning') },
|
|
288
|
+
{ value: 'active', label: tProjectStatus('active') },
|
|
289
|
+
{ value: 'at_risk', label: tProjectStatus('at_risk') },
|
|
290
|
+
{ value: 'paused', label: tProjectStatus('paused') },
|
|
291
|
+
{ value: 'completed', label: tProjectStatus('completed') },
|
|
292
|
+
{ value: 'archived', label: tProjectStatus('archived') },
|
|
266
293
|
],
|
|
267
294
|
},
|
|
268
295
|
]}
|
|
@@ -326,7 +353,7 @@ export default function OperationsProjectsPage() {
|
|
|
326
353
|
</div>
|
|
327
354
|
</div>
|
|
328
355
|
<StatusBadge
|
|
329
|
-
label={
|
|
356
|
+
label={tProjectStatus(project.status)}
|
|
330
357
|
className={getStatusBadgeClass(project.status)}
|
|
331
358
|
/>
|
|
332
359
|
</div>
|
|
@@ -376,7 +403,7 @@ export default function OperationsProjectsPage() {
|
|
|
376
403
|
</span>
|
|
377
404
|
{project.contractStatus ? (
|
|
378
405
|
<StatusBadge
|
|
379
|
-
label={
|
|
406
|
+
label={tContractStatus(project.contractStatus)}
|
|
380
407
|
className={getStatusBadgeClass(
|
|
381
408
|
project.contractStatus
|
|
382
409
|
)}
|
|
@@ -497,7 +524,7 @@ export default function OperationsProjectsPage() {
|
|
|
497
524
|
</TableCell>
|
|
498
525
|
<TableCell>
|
|
499
526
|
<StatusBadge
|
|
500
|
-
label={
|
|
527
|
+
label={tProjectStatus(project.status)}
|
|
501
528
|
className={getStatusBadgeClass(project.status)}
|
|
502
529
|
/>
|
|
503
530
|
</TableCell>
|
|
@@ -526,7 +553,7 @@ export default function OperationsProjectsPage() {
|
|
|
526
553
|
<TableCell className="hidden 2xl:table-cell">
|
|
527
554
|
{project.contractStatus ? (
|
|
528
555
|
<StatusBadge
|
|
529
|
-
label={
|
|
556
|
+
label={tContractStatus(project.contractStatus)}
|
|
530
557
|
className={getStatusBadgeClass(
|
|
531
558
|
project.contractStatus
|
|
532
559
|
)}
|
|
@@ -604,6 +631,18 @@ export default function OperationsProjectsPage() {
|
|
|
604
631
|
/>
|
|
605
632
|
)}
|
|
606
633
|
|
|
634
|
+
<PaginationFooter
|
|
635
|
+
currentPage={projectsResponse?.page ?? page}
|
|
636
|
+
pageSize={projectsResponse?.pageSize ?? pageSize}
|
|
637
|
+
totalItems={projectsResponse?.total ?? 0}
|
|
638
|
+
onPageChange={setPage}
|
|
639
|
+
onPageSizeChange={(value) => {
|
|
640
|
+
setPageSize(value);
|
|
641
|
+
setPage(1);
|
|
642
|
+
}}
|
|
643
|
+
pageSizeOptions={[12, 24, 48]}
|
|
644
|
+
/>
|
|
645
|
+
|
|
607
646
|
<Sheet
|
|
608
647
|
open={isSheetOpen}
|
|
609
648
|
onOpenChange={(open) => {
|