@hed-hog/operations 0.0.302 → 0.0.304

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 (167) hide show
  1. package/README.md +200 -43
  2. package/dist/controllers/operations-approvals.controller.d.ts +9 -0
  3. package/dist/controllers/operations-approvals.controller.d.ts.map +1 -0
  4. package/dist/controllers/operations-approvals.controller.js +64 -0
  5. package/dist/controllers/operations-approvals.controller.js.map +1 -0
  6. package/dist/controllers/operations-collaborators.controller.d.ts +223 -0
  7. package/dist/controllers/operations-collaborators.controller.d.ts.map +1 -0
  8. package/dist/controllers/operations-collaborators.controller.js +96 -0
  9. package/dist/controllers/operations-collaborators.controller.js.map +1 -0
  10. package/dist/controllers/operations-contracts.controller.d.ts +683 -0
  11. package/dist/controllers/operations-contracts.controller.d.ts.map +1 -0
  12. package/dist/controllers/operations-contracts.controller.js +198 -0
  13. package/dist/controllers/operations-contracts.controller.js.map +1 -0
  14. package/dist/controllers/operations-org-structure.controller.d.ts +108 -0
  15. package/dist/controllers/operations-org-structure.controller.d.ts.map +1 -0
  16. package/dist/controllers/operations-org-structure.controller.js +143 -0
  17. package/dist/controllers/operations-org-structure.controller.js.map +1 -0
  18. package/dist/controllers/operations-projects.controller.d.ts +169 -0
  19. package/dist/controllers/operations-projects.controller.d.ts.map +1 -0
  20. package/dist/controllers/operations-projects.controller.js +87 -0
  21. package/dist/controllers/operations-projects.controller.js.map +1 -0
  22. package/dist/controllers/operations-tasks.controller.d.ts +54 -0
  23. package/dist/controllers/operations-tasks.controller.d.ts.map +1 -0
  24. package/dist/controllers/operations-tasks.controller.js +79 -0
  25. package/dist/controllers/operations-tasks.controller.js.map +1 -0
  26. package/dist/controllers/operations-timesheets.controller.d.ts +99 -0
  27. package/dist/controllers/operations-timesheets.controller.d.ts.map +1 -0
  28. package/dist/controllers/operations-timesheets.controller.js +154 -0
  29. package/dist/controllers/operations-timesheets.controller.js.map +1 -0
  30. package/dist/dto/create-collaborator-type.dto.d.ts +10 -0
  31. package/dist/dto/create-collaborator-type.dto.d.ts.map +1 -0
  32. package/dist/dto/create-collaborator-type.dto.js +56 -0
  33. package/dist/dto/create-collaborator-type.dto.js.map +1 -0
  34. package/dist/dto/create-collaborator.dto.d.ts +42 -0
  35. package/dist/dto/create-collaborator.dto.d.ts.map +1 -0
  36. package/dist/dto/create-collaborator.dto.js +228 -0
  37. package/dist/dto/create-collaborator.dto.js.map +1 -0
  38. package/dist/dto/create-schedule-adjustment-request.dto.d.ts +17 -0
  39. package/dist/dto/create-schedule-adjustment-request.dto.d.ts.map +1 -0
  40. package/dist/dto/create-schedule-adjustment-request.dto.js +89 -0
  41. package/dist/dto/create-schedule-adjustment-request.dto.js.map +1 -0
  42. package/dist/dto/create-task.dto.d.ts +8 -0
  43. package/dist/dto/create-task.dto.d.ts.map +1 -0
  44. package/dist/dto/create-task.dto.js +50 -0
  45. package/dist/dto/create-task.dto.js.map +1 -0
  46. package/dist/dto/create-time-off-request.dto.d.ts +9 -0
  47. package/dist/dto/create-time-off-request.dto.d.ts.map +1 -0
  48. package/dist/dto/create-time-off-request.dto.js +54 -0
  49. package/dist/dto/create-time-off-request.dto.js.map +1 -0
  50. package/dist/dto/create-timesheet-entry.dto.d.ts +12 -0
  51. package/dist/dto/create-timesheet-entry.dto.d.ts.map +1 -0
  52. package/dist/dto/create-timesheet-entry.dto.js +75 -0
  53. package/dist/dto/create-timesheet-entry.dto.js.map +1 -0
  54. package/dist/dto/list-collaborator-types.dto.d.ts +4 -0
  55. package/dist/dto/list-collaborator-types.dto.d.ts.map +1 -0
  56. package/dist/dto/list-collaborator-types.dto.js +29 -0
  57. package/dist/dto/list-collaborator-types.dto.js.map +1 -0
  58. package/dist/dto/list-collaborators.dto.d.ts +8 -0
  59. package/dist/dto/list-collaborators.dto.d.ts.map +1 -0
  60. package/dist/dto/list-collaborators.dto.js +42 -0
  61. package/dist/dto/list-collaborators.dto.js.map +1 -0
  62. package/dist/dto/list-project-options.dto.d.ts +4 -0
  63. package/dist/dto/list-project-options.dto.d.ts.map +1 -0
  64. package/dist/dto/list-project-options.dto.js +8 -0
  65. package/dist/dto/list-project-options.dto.js.map +1 -0
  66. package/dist/dto/list-tasks.dto.d.ts +7 -0
  67. package/dist/dto/list-tasks.dto.d.ts.map +1 -0
  68. package/dist/dto/list-tasks.dto.js +38 -0
  69. package/dist/dto/list-tasks.dto.js.map +1 -0
  70. package/dist/dto/list-timesheet-entries.dto.d.ts +10 -0
  71. package/dist/dto/list-timesheet-entries.dto.d.ts.map +1 -0
  72. package/dist/dto/list-timesheet-entries.dto.js +54 -0
  73. package/dist/dto/list-timesheet-entries.dto.js.map +1 -0
  74. package/dist/dto/update-collaborator-type.dto.d.ts +4 -0
  75. package/dist/dto/update-collaborator-type.dto.d.ts.map +1 -0
  76. package/dist/dto/update-collaborator-type.dto.js +8 -0
  77. package/dist/dto/update-collaborator-type.dto.js.map +1 -0
  78. package/dist/dto/update-collaborator.dto.d.ts +4 -0
  79. package/dist/dto/update-collaborator.dto.d.ts.map +1 -0
  80. package/dist/dto/update-collaborator.dto.js +8 -0
  81. package/dist/dto/update-collaborator.dto.js.map +1 -0
  82. package/dist/dto/update-task.dto.d.ts +8 -0
  83. package/dist/dto/update-task.dto.d.ts.map +1 -0
  84. package/dist/dto/update-task.dto.js +51 -0
  85. package/dist/dto/update-task.dto.js.map +1 -0
  86. package/dist/operations.controller.d.ts +0 -1045
  87. package/dist/operations.controller.d.ts.map +1 -1
  88. package/dist/operations.controller.js +0 -429
  89. package/dist/operations.controller.js.map +1 -1
  90. package/dist/operations.module.d.ts.map +1 -1
  91. package/dist/operations.module.js +23 -2
  92. package/dist/operations.module.js.map +1 -1
  93. package/dist/operations.service.d.ts +373 -8
  94. package/dist/operations.service.d.ts.map +1 -1
  95. package/dist/operations.service.js +1598 -111
  96. package/dist/operations.service.js.map +1 -1
  97. package/dist/operations.service.spec.js +315 -1
  98. package/dist/operations.service.spec.js.map +1 -1
  99. package/dist/services/shared/operations-access.service.d.ts +16 -0
  100. package/dist/services/shared/operations-access.service.d.ts.map +1 -0
  101. package/dist/services/shared/operations-access.service.js +48 -0
  102. package/dist/services/shared/operations-access.service.js.map +1 -0
  103. package/hedhog/data/dashboard.yaml +20 -0
  104. package/hedhog/data/dashboard_component.yaml +274 -0
  105. package/hedhog/data/dashboard_component_role.yaml +174 -0
  106. package/hedhog/data/dashboard_item.yaml +299 -0
  107. package/hedhog/data/dashboard_role.yaml +20 -0
  108. package/hedhog/data/menu.yaml +30 -13
  109. package/hedhog/data/operations_collaborator_type.yaml +76 -0
  110. package/hedhog/data/route.yaml +183 -0
  111. package/hedhog/frontend/app/_components/async-options-combobox.tsx.ejs +231 -0
  112. package/hedhog/frontend/app/_components/collaborator-details-screen.tsx.ejs +134 -49
  113. package/hedhog/frontend/app/_components/collaborator-form-screen.tsx.ejs +772 -93
  114. package/hedhog/frontend/app/_components/department-select-with-create.tsx.ejs +38 -16
  115. package/hedhog/frontend/app/_components/project-form-screen.tsx.ejs +875 -632
  116. package/hedhog/frontend/app/_components/timesheet-task-create-sheet.tsx.ejs +213 -0
  117. package/hedhog/frontend/app/_lib/api.ts.ejs +30 -1
  118. package/hedhog/frontend/app/_lib/types.ts.ejs +142 -39
  119. package/hedhog/frontend/app/_lib/utils/format.ts.ejs +33 -2
  120. package/hedhog/frontend/app/approvals/page.tsx.ejs +116 -98
  121. package/hedhog/frontend/app/collaborator-types/page.tsx.ejs +502 -0
  122. package/hedhog/frontend/app/collaborators/page.tsx.ejs +109 -68
  123. package/hedhog/frontend/app/contracts/page.tsx.ejs +99 -102
  124. package/hedhog/frontend/app/contracts/templates/page.tsx.ejs +98 -102
  125. package/hedhog/frontend/app/departments/page.tsx.ejs +96 -75
  126. package/hedhog/frontend/app/projects/page.tsx.ejs +137 -127
  127. package/hedhog/frontend/app/schedule-adjustments/page.tsx.ejs +244 -120
  128. package/hedhog/frontend/app/team/page.tsx.ejs +15 -2
  129. package/hedhog/frontend/app/time-off/page.tsx.ejs +158 -82
  130. package/hedhog/frontend/app/timesheets/page.tsx.ejs +814 -357
  131. package/hedhog/frontend/messages/en.json +243 -51
  132. package/hedhog/frontend/messages/pt.json +458 -268
  133. package/hedhog/table/operations_collaborator.yaml +26 -13
  134. package/hedhog/table/operations_collaborator_equity_participation.yaml +43 -0
  135. package/hedhog/table/operations_collaborator_type.yaml +33 -0
  136. package/hedhog/table/operations_job_title.yaml +24 -0
  137. package/hedhog/table/operations_project_assignment.yaml +9 -0
  138. package/hedhog/table/operations_project_role.yaml +39 -0
  139. package/hedhog/table/operations_task.yaml +30 -0
  140. package/hedhog/table/operations_timesheet_entry.yaml +12 -0
  141. package/package.json +6 -6
  142. package/src/controllers/operations-approvals.controller.ts +24 -0
  143. package/src/controllers/operations-collaborators.controller.ts +60 -0
  144. package/src/controllers/operations-contracts.controller.ts +138 -0
  145. package/src/controllers/operations-org-structure.controller.ts +92 -0
  146. package/src/controllers/operations-projects.controller.ts +50 -0
  147. package/src/controllers/operations-tasks.controller.ts +52 -0
  148. package/src/controllers/operations-timesheets.controller.ts +100 -0
  149. package/src/dto/create-collaborator-type.dto.ts +43 -0
  150. package/src/dto/create-collaborator.dto.ts +223 -0
  151. package/src/dto/create-schedule-adjustment-request.dto.ts +91 -0
  152. package/src/dto/create-task.dto.ts +35 -0
  153. package/src/dto/create-time-off-request.dto.ts +53 -0
  154. package/src/dto/create-timesheet-entry.dto.ts +67 -0
  155. package/src/dto/list-collaborator-types.dto.ts +15 -0
  156. package/src/dto/list-collaborators.dto.ts +30 -0
  157. package/src/dto/list-project-options.dto.ts +3 -0
  158. package/src/dto/list-tasks.dto.ts +25 -0
  159. package/src/dto/list-timesheet-entries.dto.ts +40 -0
  160. package/src/dto/update-collaborator-type.dto.ts +3 -0
  161. package/src/dto/update-collaborator.dto.ts +3 -0
  162. package/src/dto/update-task.dto.ts +36 -0
  163. package/src/operations.controller.ts +1 -278
  164. package/src/operations.module.ts +23 -2
  165. package/src/operations.service.spec.ts +450 -0
  166. package/src/operations.service.ts +4641 -2163
  167. package/src/services/shared/operations-access.service.ts +52 -0
@@ -37,12 +37,12 @@ import {
37
37
  getStatusBadgeClass,
38
38
  } from '../_lib/utils/format';
39
39
 
40
- type PendingDecision = {
41
- approval: OperationsApproval;
42
- action: 'approve' | 'reject';
43
- };
44
-
45
- export default function OperationsApprovalsPage() {
40
+ type PendingDecision = {
41
+ approval: OperationsApproval;
42
+ action: 'approve' | 'reject';
43
+ };
44
+
45
+ export default function OperationsApprovalsPage() {
46
46
  const t = useTranslations('operations.ApprovalsPage');
47
47
  const commonT = useTranslations('operations.Common');
48
48
  const { request, showToastHandler, currentLocaleCode } = useApp();
@@ -50,73 +50,73 @@ export default function OperationsApprovalsPage() {
50
50
  const [search, setSearch] = useState('');
51
51
  const [statusFilter, setStatusFilter] = useState('all');
52
52
  const [targetFilter, setTargetFilter] = useState('all');
53
- const [decisionNote, setDecisionNote] = useState('');
54
- const [pendingDecision, setPendingDecision] = useState<PendingDecision | null>(
55
- null
56
- );
57
-
58
- const getStatusLabel = (value?: string | null) => {
59
- if (!value) {
60
- return '-';
61
- }
62
-
63
- const key = `options.statuses.${value}`;
64
- return t.has(key) ? t(key) : formatEnumLabel(value);
65
- };
66
-
67
- const getTargetTypeLabel = (value?: string | null) => {
68
- if (!value) {
69
- return '-';
70
- }
71
-
72
- const key = `options.targetTypes.${value}`;
73
- return t.has(key) ? t(key) : formatEnumLabel(value);
74
- };
75
-
76
- const getTimeOffTypeLabel = (value?: string | null) => {
77
- if (!value) {
78
- return '-';
79
- }
80
-
81
- const key = `options.timeOffTypes.${value}`;
82
- return t.has(key) ? t(key) : formatEnumLabel(value);
83
- };
84
-
85
- const getScheduleScopeLabel = (value?: string | null) => {
86
- if (!value) {
87
- return '-';
88
- }
89
-
90
- const key = `options.scheduleScopes.${value}`;
91
- return t.has(key) ? t(key) : formatEnumLabel(value);
92
- };
93
-
94
- const getTargetLabel = (approval: OperationsApproval) => {
95
- switch (approval.targetType) {
96
- case 'timesheet':
97
- return `${getTargetTypeLabel('timesheet')} ${formatDateRange(
98
- approval.timesheetWeekStartDate,
99
- approval.timesheetWeekEndDate
100
- )}`;
101
- case 'time_off_request':
102
- return `${getTimeOffTypeLabel(approval.timeOffType)} ${formatDateRange(
103
- approval.timeOffStartDate,
104
- approval.timeOffEndDate
105
- )}`;
106
- case 'schedule_adjustment_request':
107
- return `${getScheduleScopeLabel(approval.scheduleRequestScope)} ${formatDateRange(
108
- approval.scheduleStartDate,
109
- approval.scheduleEndDate
110
- )}`;
111
- default:
112
- return getTargetTypeLabel(approval.targetType);
113
- }
114
- };
53
+ const [decisionNote, setDecisionNote] = useState('');
54
+ const [pendingDecision, setPendingDecision] =
55
+ useState<PendingDecision | null>(null);
56
+
57
+ const getStatusLabel = (value?: string | null) => {
58
+ if (!value) {
59
+ return '-';
60
+ }
61
+
62
+ const key = `options.statuses.${value}`;
63
+ return t.has(key) ? t(key) : formatEnumLabel(value);
64
+ };
65
+
66
+ const getTargetTypeLabel = (value?: string | null) => {
67
+ if (!value) {
68
+ return '-';
69
+ }
70
+
71
+ const key = `options.targetTypes.${value}`;
72
+ return t.has(key) ? t(key) : formatEnumLabel(value);
73
+ };
74
+
75
+ const getTimeOffTypeLabel = (value?: string | null) => {
76
+ if (!value) {
77
+ return '-';
78
+ }
79
+
80
+ const key = `options.timeOffTypes.${value}`;
81
+ return t.has(key) ? t(key) : formatEnumLabel(value);
82
+ };
83
+
84
+ const getScheduleScopeLabel = (value?: string | null) => {
85
+ if (!value) {
86
+ return '-';
87
+ }
88
+
89
+ const key = `options.scheduleScopes.${value}`;
90
+ return t.has(key) ? t(key) : formatEnumLabel(value);
91
+ };
92
+
93
+ const getTargetLabel = (approval: OperationsApproval) => {
94
+ switch (approval.targetType) {
95
+ case 'timesheet':
96
+ return `${getTargetTypeLabel('timesheet')} ${formatDateRange(
97
+ approval.timesheetWeekStartDate,
98
+ approval.timesheetWeekEndDate
99
+ )}`;
100
+ case 'time_off_request':
101
+ return `${getTimeOffTypeLabel(approval.timeOffType)} ${formatDateRange(
102
+ approval.timeOffStartDate,
103
+ approval.timeOffEndDate
104
+ )}`;
105
+ case 'schedule_adjustment_request':
106
+ return `${getScheduleScopeLabel(approval.scheduleRequestScope)} ${formatDateRange(
107
+ approval.scheduleStartDate,
108
+ approval.scheduleEndDate
109
+ )}`;
110
+ default:
111
+ return getTargetTypeLabel(approval.targetType);
112
+ }
113
+ };
115
114
 
116
115
  const { data: approvals = [], refetch } = useQuery<OperationsApproval[]>({
117
116
  queryKey: ['operations-approvals', currentLocaleCode],
118
117
  enabled: access.isSupervisor,
119
- queryFn: () => fetchOperations<OperationsApproval[]>(request, '/operations/approvals'),
118
+ queryFn: () =>
119
+ fetchOperations<OperationsApproval[]>(request, '/operations/approvals'),
120
120
  });
121
121
 
122
122
  const filteredRows = useMemo(
@@ -124,10 +124,17 @@ export default function OperationsApprovalsPage() {
124
124
  approvals.filter((item) => {
125
125
  const matchesSearch = !search.trim()
126
126
  ? true
127
- : [item.requesterName, item.approverName, item.decisionNote, getTargetLabel(item)]
127
+ : [
128
+ item.requesterName,
129
+ item.approverName,
130
+ item.decisionNote,
131
+ getTargetLabel(item),
132
+ ]
128
133
  .filter(Boolean)
129
134
  .some((value) =>
130
- String(value).toLowerCase().includes(search.trim().toLowerCase())
135
+ String(value)
136
+ .toLowerCase()
137
+ .includes(search.trim().toLowerCase())
131
138
  );
132
139
  const matchesStatus =
133
140
  statusFilter === 'all' ? true : item.status === statusFilter;
@@ -142,16 +149,19 @@ export default function OperationsApprovalsPage() {
142
149
  {
143
150
  key: 'pending',
144
151
  title: t('cards.pending'),
152
+ description: t('cards.pendingDescription'),
145
153
  value: approvals.filter((item) => item.status === 'pending').length,
146
154
  },
147
155
  {
148
156
  key: 'approved',
149
157
  title: t('cards.approved'),
158
+ description: t('cards.approvedDescription'),
150
159
  value: approvals.filter((item) => item.status === 'approved').length,
151
160
  },
152
161
  {
153
162
  key: 'rejected',
154
163
  title: t('cards.rejected'),
164
+ description: t('cards.rejectedDescription'),
155
165
  value: approvals.filter((item) => item.status === 'rejected').length,
156
166
  },
157
167
  ];
@@ -230,12 +240,12 @@ export default function OperationsApprovalsPage() {
230
240
  value: statusFilter,
231
241
  onChange: setStatusFilter,
232
242
  placeholder: commonT('labels.status'),
233
- options: [
234
- { value: 'all', label: commonT('filters.allStatuses') },
235
- { value: 'pending', label: getStatusLabel('pending') },
236
- { value: 'approved', label: getStatusLabel('approved') },
237
- { value: 'rejected', label: getStatusLabel('rejected') },
238
- ],
243
+ options: [
244
+ { value: 'all', label: commonT('filters.allStatuses') },
245
+ { value: 'pending', label: getStatusLabel('pending') },
246
+ { value: 'approved', label: getStatusLabel('approved') },
247
+ { value: 'rejected', label: getStatusLabel('rejected') },
248
+ ],
239
249
  },
240
250
  {
241
251
  id: 'target',
@@ -243,18 +253,18 @@ export default function OperationsApprovalsPage() {
243
253
  value: targetFilter,
244
254
  onChange: setTargetFilter,
245
255
  placeholder: commonT('labels.requestType'),
246
- options: [
247
- { value: 'all', label: commonT('filters.allTypes') },
248
- { value: 'timesheet', label: getTargetTypeLabel('timesheet') },
249
- {
250
- value: 'time_off_request',
251
- label: getTargetTypeLabel('time_off_request'),
252
- },
253
- {
254
- value: 'schedule_adjustment_request',
255
- label: getTargetTypeLabel('schedule_adjustment_request'),
256
- },
257
- ],
256
+ options: [
257
+ { value: 'all', label: commonT('filters.allTypes') },
258
+ { value: 'timesheet', label: getTargetTypeLabel('timesheet') },
259
+ {
260
+ value: 'time_off_request',
261
+ label: getTargetTypeLabel('time_off_request'),
262
+ },
263
+ {
264
+ value: 'schedule_adjustment_request',
265
+ label: getTargetTypeLabel('schedule_adjustment_request'),
266
+ },
267
+ ],
258
268
  },
259
269
  ]}
260
270
  />
@@ -269,7 +279,7 @@ export default function OperationsApprovalsPage() {
269
279
  <TableHead>{commonT('labels.submittedAt')}</TableHead>
270
280
  <TableHead>{commonT('labels.approver')}</TableHead>
271
281
  <TableHead>{commonT('labels.status')}</TableHead>
272
- <TableHead className="w-[180px] text-right">
282
+ <TableHead className="w-45 text-right">
273
283
  {commonT('labels.actions')}
274
284
  </TableHead>
275
285
  </TableRow>
@@ -291,7 +301,9 @@ export default function OperationsApprovalsPage() {
291
301
  </div>
292
302
  </TableCell>
293
303
  <TableCell>
294
- <div>{approval.approverName || commonT('labels.notAssigned')}</div>
304
+ <div>
305
+ {approval.approverName || commonT('labels.notAssigned')}
306
+ </div>
295
307
  <div className="text-xs text-muted-foreground">
296
308
  {approval.targetType === 'timesheet'
297
309
  ? [
@@ -304,14 +316,15 @@ export default function OperationsApprovalsPage() {
304
316
  .join(' • ') || commonT('labels.notAvailable')
305
317
  : approval.targetType === 'time_off_request'
306
318
  ? approval.timeOffReason || commonT('labels.noNotes')
307
- : approval.scheduleReason || commonT('labels.noNotes')}
319
+ : approval.scheduleReason ||
320
+ commonT('labels.noNotes')}
308
321
  </div>
309
322
  </TableCell>
310
323
  <TableCell>
311
- <StatusBadge
312
- label={getStatusLabel(approval.status)}
313
- className={getStatusBadgeClass(approval.status)}
314
- />
324
+ <StatusBadge
325
+ label={getStatusLabel(approval.status)}
326
+ className={getStatusBadgeClass(approval.status)}
327
+ />
315
328
  </TableCell>
316
329
  <TableCell>
317
330
  {approval.status === 'pending' ? (
@@ -386,10 +399,13 @@ export default function OperationsApprovalsPage() {
386
399
  </DialogHeader>
387
400
 
388
401
  <div className="space-y-2">
389
- <label className="text-sm font-medium">{commonT('labels.noteOptional')}</label>
402
+ <label className="text-sm font-medium">
403
+ {commonT('labels.noteOptional')}
404
+ </label>
390
405
  <Textarea
391
406
  rows={4}
392
407
  value={decisionNote}
408
+ placeholder={t('dialog.notePlaceholder')}
393
409
  onChange={(event) => setDecisionNote(event.target.value)}
394
410
  />
395
411
  </div>
@@ -406,7 +422,9 @@ export default function OperationsApprovalsPage() {
406
422
  </Button>
407
423
  <Button
408
424
  variant={
409
- pendingDecision?.action === 'approve' ? 'default' : 'destructive'
425
+ pendingDecision?.action === 'approve'
426
+ ? 'default'
427
+ : 'destructive'
410
428
  }
411
429
  onClick={() => void decide()}
412
430
  >