@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.
Files changed (123) 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 +31 -4
  22. package/dist/controllers/operations-timesheets.controller.d.ts.map +1 -1
  23. package/dist/controllers/operations-timesheets.controller.js +16 -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/operations.service.d.ts +340 -271
  66. package/dist/operations.service.d.ts.map +1 -1
  67. package/dist/operations.service.js +1007 -1043
  68. package/dist/operations.service.js.map +1 -1
  69. package/dist/operations.service.spec.js +0 -22
  70. package/dist/operations.service.spec.js.map +1 -1
  71. package/hedhog/data/menu.yaml +0 -36
  72. package/hedhog/data/route.yaml +42 -73
  73. package/hedhog/frontend/app/_components/collaborator-form-screen.tsx.ejs +8 -1
  74. package/hedhog/frontend/app/_components/collaborator-select-with-create.tsx.ejs +15 -10
  75. package/hedhog/frontend/app/_components/contract-details-screen.tsx.ejs +108 -213
  76. package/hedhog/frontend/app/_components/contract-form-screen.tsx.ejs +251 -2039
  77. package/hedhog/frontend/app/_components/project-details-screen.tsx.ejs +167 -60
  78. package/hedhog/frontend/app/_components/project-form-screen.tsx.ejs +70 -301
  79. package/hedhog/frontend/app/_components/system-user-select-with-create.tsx.ejs +102 -51
  80. package/hedhog/frontend/app/_lib/types.ts.ejs +19 -24
  81. package/hedhog/frontend/app/_lib/utils/format.ts.ejs +14 -9
  82. package/hedhog/frontend/app/approvals/page.tsx.ejs +842 -150
  83. package/hedhog/frontend/app/collaborator-types/page.tsx.ejs +445 -153
  84. package/hedhog/frontend/app/collaborators/page.tsx.ejs +118 -49
  85. package/hedhog/frontend/app/contracts/[id]/page.tsx.ejs +2 -2
  86. package/hedhog/frontend/app/contracts/page.tsx.ejs +215 -617
  87. package/hedhog/frontend/app/departments/page.tsx.ejs +257 -113
  88. package/hedhog/frontend/app/projects/page.tsx.ejs +90 -51
  89. package/hedhog/frontend/app/schedule-adjustments/page.tsx.ejs +412 -147
  90. package/hedhog/frontend/app/time-off/page.tsx.ejs +400 -123
  91. package/hedhog/frontend/app/timesheets/page.tsx.ejs +460 -365
  92. package/hedhog/frontend/messages/en.json +143 -14
  93. package/hedhog/frontend/messages/pt.json +192 -54
  94. package/hedhog/table/operations_contract.yaml +0 -9
  95. package/package.json +4 -4
  96. package/src/controllers/operations-approvals.controller.ts +9 -3
  97. package/src/controllers/operations-collaborators.controller.ts +15 -2
  98. package/src/controllers/operations-contracts.controller.ts +8 -92
  99. package/src/controllers/operations-org-structure.controller.ts +17 -4
  100. package/src/controllers/operations-projects.controller.ts +10 -4
  101. package/src/controllers/operations-timesheets.controller.ts +17 -8
  102. package/src/dto/list-approvals.dto.ts +12 -0
  103. package/src/dto/list-collaborator-types.dto.ts +7 -2
  104. package/src/dto/list-collaborators.dto.ts +4 -0
  105. package/src/dto/list-contracts.dto.ts +20 -0
  106. package/src/dto/list-departments.dto.ts +8 -0
  107. package/src/dto/list-projects.dto.ts +8 -0
  108. package/src/dto/list-schedule-adjustments.dto.ts +8 -0
  109. package/src/dto/list-time-off-requests.dto.ts +8 -0
  110. package/src/dto/list-timesheets.dto.ts +8 -0
  111. package/src/dto/reorder-collaborator-types.dto.ts +10 -0
  112. package/src/operations.service.spec.ts +0 -30
  113. package/src/operations.service.ts +1557 -1806
  114. package/hedhog/frontend/app/_components/contract-creation-wizard.tsx.ejs +0 -631
  115. package/hedhog/frontend/app/_components/contract-template-form-screen.tsx.ejs +0 -526
  116. package/hedhog/frontend/app/_components/contract-template-select-with-create.tsx.ejs +0 -247
  117. package/hedhog/frontend/app/_components/contract-wizard-sheet.tsx.ejs +0 -3520
  118. package/hedhog/frontend/app/contracts/templates/page.tsx.ejs +0 -380
  119. package/hedhog/frontend/app/team/page.tsx.ejs +0 -352
  120. package/hedhog/table/operations_contract_financial_term.yaml +0 -40
  121. package/hedhog/table/operations_contract_revision.yaml +0 -38
  122. package/hedhog/table/operations_contract_signature.yaml +0 -38
  123. 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) => {