@hed-hog/operations 0.0.305 → 0.0.309

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.
Files changed (138) hide show
  1. package/dist/controllers/operations-approvals.controller.d.ts +114 -1
  2. package/dist/controllers/operations-approvals.controller.d.ts.map +1 -1
  3. package/dist/controllers/operations-approvals.controller.js +16 -3
  4. package/dist/controllers/operations-approvals.controller.js.map +1 -1
  5. package/dist/controllers/operations-collaborators.controller.d.ts +16 -1
  6. package/dist/controllers/operations-collaborators.controller.d.ts.map +1 -1
  7. package/dist/controllers/operations-collaborators.controller.js +16 -3
  8. package/dist/controllers/operations-collaborators.controller.js.map +1 -1
  9. package/dist/controllers/operations-contracts.controller.d.ts +14 -453
  10. package/dist/controllers/operations-contracts.controller.d.ts.map +1 -1
  11. package/dist/controllers/operations-contracts.controller.js +11 -112
  12. package/dist/controllers/operations-contracts.controller.js.map +1 -1
  13. package/dist/controllers/operations-org-structure.controller.d.ts +65 -2
  14. package/dist/controllers/operations-org-structure.controller.d.ts.map +1 -1
  15. package/dist/controllers/operations-org-structure.controller.js +18 -5
  16. package/dist/controllers/operations-org-structure.controller.js.map +1 -1
  17. package/dist/controllers/operations-projects.controller.d.ts +28 -4
  18. package/dist/controllers/operations-projects.controller.d.ts.map +1 -1
  19. package/dist/controllers/operations-projects.controller.js +17 -5
  20. package/dist/controllers/operations-projects.controller.js.map +1 -1
  21. package/dist/controllers/operations-timesheets.controller.d.ts +52 -4
  22. package/dist/controllers/operations-timesheets.controller.d.ts.map +1 -1
  23. package/dist/controllers/operations-timesheets.controller.js +28 -11
  24. package/dist/controllers/operations-timesheets.controller.js.map +1 -1
  25. package/dist/dto/list-approvals.dto.d.ts +6 -0
  26. package/dist/dto/list-approvals.dto.d.ts.map +1 -0
  27. package/dist/dto/list-approvals.dto.js +28 -0
  28. package/dist/dto/list-approvals.dto.js.map +1 -0
  29. package/dist/dto/list-collaborator-types.dto.d.ts +3 -1
  30. package/dist/dto/list-collaborator-types.dto.d.ts.map +1 -1
  31. package/dist/dto/list-collaborator-types.dto.js +7 -1
  32. package/dist/dto/list-collaborator-types.dto.js.map +1 -1
  33. package/dist/dto/list-collaborators.dto.d.ts +1 -0
  34. package/dist/dto/list-collaborators.dto.d.ts.map +1 -1
  35. package/dist/dto/list-collaborators.dto.js +5 -0
  36. package/dist/dto/list-collaborators.dto.js.map +1 -1
  37. package/dist/dto/list-contracts.dto.d.ts +8 -0
  38. package/dist/dto/list-contracts.dto.d.ts.map +1 -0
  39. package/dist/dto/list-contracts.dto.js +38 -0
  40. package/dist/dto/list-contracts.dto.js.map +1 -0
  41. package/dist/dto/list-departments.dto.d.ts +5 -0
  42. package/dist/dto/list-departments.dto.d.ts.map +1 -0
  43. package/dist/dto/list-departments.dto.js +23 -0
  44. package/dist/dto/list-departments.dto.js.map +1 -0
  45. package/dist/dto/list-projects.dto.d.ts +5 -0
  46. package/dist/dto/list-projects.dto.d.ts.map +1 -0
  47. package/dist/dto/list-projects.dto.js +23 -0
  48. package/dist/dto/list-projects.dto.js.map +1 -0
  49. package/dist/dto/list-schedule-adjustments.dto.d.ts +5 -0
  50. package/dist/dto/list-schedule-adjustments.dto.d.ts.map +1 -0
  51. package/dist/dto/list-schedule-adjustments.dto.js +23 -0
  52. package/dist/dto/list-schedule-adjustments.dto.js.map +1 -0
  53. package/dist/dto/list-time-off-requests.dto.d.ts +5 -0
  54. package/dist/dto/list-time-off-requests.dto.d.ts.map +1 -0
  55. package/dist/dto/list-time-off-requests.dto.js +23 -0
  56. package/dist/dto/list-time-off-requests.dto.js.map +1 -0
  57. package/dist/dto/list-timesheets.dto.d.ts +5 -0
  58. package/dist/dto/list-timesheets.dto.d.ts.map +1 -0
  59. package/dist/dto/list-timesheets.dto.js +23 -0
  60. package/dist/dto/list-timesheets.dto.js.map +1 -0
  61. package/dist/dto/reorder-collaborator-types.dto.d.ts +4 -0
  62. package/dist/dto/reorder-collaborator-types.dto.d.ts.map +1 -0
  63. package/dist/dto/reorder-collaborator-types.dto.js +25 -0
  64. package/dist/dto/reorder-collaborator-types.dto.js.map +1 -0
  65. package/dist/dto/update-collaborator-type.dto.d.ts +3 -1
  66. package/dist/dto/update-collaborator-type.dto.d.ts.map +1 -1
  67. package/dist/dto/update-collaborator-type.dto.js +2 -1
  68. package/dist/dto/update-collaborator-type.dto.js.map +1 -1
  69. package/dist/operations.service.d.ts +362 -271
  70. package/dist/operations.service.d.ts.map +1 -1
  71. package/dist/operations.service.js +1195 -1098
  72. package/dist/operations.service.js.map +1 -1
  73. package/dist/operations.service.spec.js +73 -22
  74. package/dist/operations.service.spec.js.map +1 -1
  75. package/hedhog/data/menu.yaml +19 -55
  76. package/hedhog/data/operations_collaborator_type.yaml +76 -76
  77. package/hedhog/data/route.yaml +52 -70
  78. package/hedhog/frontend/app/_components/async-options-combobox.tsx.ejs +5 -3
  79. package/hedhog/frontend/app/_components/collaborator-form-screen.tsx.ejs +8 -1
  80. package/hedhog/frontend/app/_components/collaborator-select-with-create.tsx.ejs +15 -10
  81. package/hedhog/frontend/app/_components/contract-details-screen.tsx.ejs +108 -213
  82. package/hedhog/frontend/app/_components/contract-form-screen.tsx.ejs +251 -2039
  83. package/hedhog/frontend/app/_components/project-details-screen.tsx.ejs +167 -60
  84. package/hedhog/frontend/app/_components/project-form-screen.tsx.ejs +70 -301
  85. package/hedhog/frontend/app/_components/system-user-select-with-create.tsx.ejs +102 -51
  86. package/hedhog/frontend/app/_components/timesheet-task-create-sheet.tsx.ejs +1 -0
  87. package/hedhog/frontend/app/_lib/types.ts.ejs +19 -24
  88. package/hedhog/frontend/app/_lib/utils/format.ts.ejs +14 -9
  89. package/hedhog/frontend/app/approvals/page.tsx.ejs +843 -151
  90. package/hedhog/frontend/app/collaborator-types/page.tsx.ejs +457 -154
  91. package/hedhog/frontend/app/collaborators/page.tsx.ejs +118 -49
  92. package/hedhog/frontend/app/contracts/[id]/page.tsx.ejs +2 -2
  93. package/hedhog/frontend/app/contracts/page.tsx.ejs +215 -617
  94. package/hedhog/frontend/app/departments/page.tsx.ejs +257 -113
  95. package/hedhog/frontend/app/projects/page.tsx.ejs +90 -51
  96. package/hedhog/frontend/app/schedule-adjustments/page.tsx.ejs +546 -118
  97. package/hedhog/frontend/app/time-off/page.tsx.ejs +400 -123
  98. package/hedhog/frontend/app/timesheets/page.tsx.ejs +647 -342
  99. package/hedhog/frontend/messages/en.json +148 -14
  100. package/hedhog/frontend/messages/pt.json +199 -56
  101. package/hedhog/table/operations_collaborator.yaml +18 -18
  102. package/hedhog/table/operations_collaborator_equity_participation.yaml +43 -43
  103. package/hedhog/table/operations_collaborator_type.yaml +33 -33
  104. package/hedhog/table/operations_contract.yaml +0 -9
  105. package/hedhog/table/operations_contract_document.yaml +33 -33
  106. package/package.json +4 -4
  107. package/src/controllers/operations-approvals.controller.ts +9 -3
  108. package/src/controllers/operations-collaborators.controller.ts +15 -2
  109. package/src/controllers/operations-contracts.controller.ts +8 -92
  110. package/src/controllers/operations-org-structure.controller.ts +17 -4
  111. package/src/controllers/operations-projects.controller.ts +10 -4
  112. package/src/controllers/operations-timesheets.controller.ts +30 -8
  113. package/src/dto/create-collaborator-type.dto.ts +43 -43
  114. package/src/dto/create-collaborator.dto.ts +223 -223
  115. package/src/dto/list-approvals.dto.ts +12 -0
  116. package/src/dto/list-collaborator-types.dto.ts +20 -15
  117. package/src/dto/list-collaborators.dto.ts +34 -30
  118. package/src/dto/list-contracts.dto.ts +20 -0
  119. package/src/dto/list-departments.dto.ts +8 -0
  120. package/src/dto/list-projects.dto.ts +8 -0
  121. package/src/dto/list-schedule-adjustments.dto.ts +8 -0
  122. package/src/dto/list-time-off-requests.dto.ts +8 -0
  123. package/src/dto/list-timesheets.dto.ts +8 -0
  124. package/src/dto/reorder-collaborator-types.dto.ts +10 -0
  125. package/src/dto/update-collaborator-type.dto.ts +4 -3
  126. package/src/dto/update-collaborator.dto.ts +3 -3
  127. package/src/operations.service.spec.ts +96 -30
  128. package/src/operations.service.ts +1738 -1777
  129. package/hedhog/frontend/app/_components/contract-creation-wizard.tsx.ejs +0 -631
  130. package/hedhog/frontend/app/_components/contract-template-form-screen.tsx.ejs +0 -526
  131. package/hedhog/frontend/app/_components/contract-template-select-with-create.tsx.ejs +0 -247
  132. package/hedhog/frontend/app/_components/contract-wizard-sheet.tsx.ejs +0 -3520
  133. package/hedhog/frontend/app/contracts/templates/page.tsx.ejs +0 -380
  134. package/hedhog/frontend/app/team/page.tsx.ejs +0 -352
  135. package/hedhog/table/operations_contract_financial_term.yaml +0 -40
  136. package/hedhog/table/operations_contract_revision.yaml +0 -38
  137. package/hedhog/table/operations_contract_signature.yaml +0 -38
  138. package/hedhog/table/operations_contract_template.yaml +0 -58
@@ -1,6 +1,11 @@
1
1
  'use client';
2
2
 
3
- import { EmptyState, Page, SearchBar } from '@/components/entity-list';
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: projects = [], refetch } = useQuery<OperationsProject[]>({
121
- queryKey: ['operations-projects-list', currentLocaleCode],
122
- queryFn: () =>
123
- fetchOperations<OperationsProject[]>(request, '/operations/projects'),
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
- const filteredRows = useMemo(
127
- () =>
128
- projects.filter((item) => {
129
- const matchesSearch = !search.trim()
130
- ? true
131
- : [
132
- item.name,
133
- item.code,
134
- item.clientName,
135
- item.managerName,
136
- item.contractName,
137
- ]
138
- .filter(Boolean)
139
- .some((value) =>
140
- String(value)
141
- .toLowerCase()
142
- .includes(search.trim().toLowerCase())
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={setSearch}
249
- onSearch={() => undefined}
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: setStatusFilter,
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: formatEnumLabel('planning') },
261
- { value: 'active', label: formatEnumLabel('active') },
262
- { value: 'at_risk', label: formatEnumLabel('at_risk') },
263
- { value: 'paused', label: formatEnumLabel('paused') },
264
- { value: 'completed', label: formatEnumLabel('completed') },
265
- { value: 'archived', label: formatEnumLabel('archived') },
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={formatEnumLabel(project.status)}
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={formatEnumLabel(project.contractStatus)}
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={formatEnumLabel(project.status)}
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={formatEnumLabel(project.contractStatus)}
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) => {