@hed-hog/operations 0.0.321 → 0.0.322

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 (31) hide show
  1. package/dist/controllers/operations-contracts.controller.d.ts +9 -9
  2. package/dist/controllers/operations-tasks.controller.d.ts +22 -0
  3. package/dist/controllers/operations-tasks.controller.d.ts.map +1 -1
  4. package/dist/controllers/operations-tasks.controller.js +37 -0
  5. package/dist/controllers/operations-tasks.controller.js.map +1 -1
  6. package/dist/dto/create-task.dto.d.ts.map +1 -1
  7. package/dist/dto/create-task.dto.js +0 -1
  8. package/dist/dto/create-task.dto.js.map +1 -1
  9. package/dist/dto/update-task.dto.d.ts.map +1 -1
  10. package/dist/dto/update-task.dto.js +0 -1
  11. package/dist/dto/update-task.dto.js.map +1 -1
  12. package/dist/operations.service.d.ts +22 -0
  13. package/dist/operations.service.d.ts.map +1 -1
  14. package/dist/operations.service.js +77 -22
  15. package/dist/operations.service.js.map +1 -1
  16. package/hedhog/data/route.yaml +39 -0
  17. package/hedhog/frontend/app/_components/person-select-with-create.tsx.ejs +49 -22
  18. package/hedhog/frontend/app/_components/project-details-screen.tsx.ejs +2968 -624
  19. package/hedhog/frontend/app/_components/project-form-screen.tsx.ejs +62 -68
  20. package/hedhog/frontend/app/_components/task-file-attachments.tsx.ejs +388 -0
  21. package/hedhog/frontend/app/_lib/types.ts.ejs +1 -0
  22. package/hedhog/frontend/app/my-tasks/page.tsx.ejs +121 -11
  23. package/hedhog/frontend/app/projects/page.tsx.ejs +105 -22
  24. package/hedhog/frontend/messages/en.json +143 -2
  25. package/hedhog/frontend/messages/pt.json +143 -2
  26. package/hedhog/table/operations_task_file.yaml +23 -0
  27. package/package.json +5 -5
  28. package/src/controllers/operations-tasks.controller.ts +43 -9
  29. package/src/dto/create-task.dto.ts +0 -1
  30. package/src/dto/update-task.dto.ts +0 -1
  31. package/src/operations.service.ts +144 -22
@@ -315,6 +315,45 @@
315
315
  - where:
316
316
  slug: admin-operations-director
317
317
 
318
+ - url: /operations/tasks/:id/files
319
+ method: GET
320
+ relations:
321
+ role:
322
+ - where:
323
+ slug: admin
324
+ - where:
325
+ slug: admin-operations-collaborator
326
+ - where:
327
+ slug: admin-operations-supervisor
328
+ - where:
329
+ slug: admin-operations-director
330
+
331
+ - url: /operations/tasks/:id/files
332
+ method: POST
333
+ relations:
334
+ role:
335
+ - where:
336
+ slug: admin
337
+ - where:
338
+ slug: admin-operations-collaborator
339
+ - where:
340
+ slug: admin-operations-supervisor
341
+ - where:
342
+ slug: admin-operations-director
343
+
344
+ - url: /operations/tasks/:id/files/:fileRelationId
345
+ method: DELETE
346
+ relations:
347
+ role:
348
+ - where:
349
+ slug: admin
350
+ - where:
351
+ slug: admin-operations-collaborator
352
+ - where:
353
+ slug: admin-operations-supervisor
354
+ - where:
355
+ slug: admin-operations-director
356
+
318
357
  - url: /operations/projects/:id/tasks
319
358
  method: GET
320
359
  relations:
@@ -1,5 +1,6 @@
1
1
  'use client';
2
2
 
3
+ import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar';
3
4
  import { Button } from '@/components/ui/button';
4
5
  import {
5
6
  Command,
@@ -49,6 +50,8 @@ import { z } from 'zod';
49
50
  type PersonOption = {
50
51
  id: number | string;
51
52
  name: string;
53
+ avatarId?: number | null;
54
+ avatar_id?: number | null;
52
55
  };
53
56
 
54
57
  type CreatePersonValues = {
@@ -661,7 +664,10 @@ export function PersonSelectWithCreate({
661
664
  }
662
665
 
663
666
  if (payload && 'data' in payload && Array.isArray(payload.data)) {
664
- return payload.data as PersonOption[];
667
+ return payload.data.map((p) => ({
668
+ ...p,
669
+ avatarId: (p as any).avatar_id ?? p.avatarId ?? null,
670
+ })) as PersonOption[];
665
671
  }
666
672
 
667
673
  return [];
@@ -674,14 +680,12 @@ export function PersonSelectWithCreate({
674
680
  ? String(value)
675
681
  : '';
676
682
  const hasValue = normalizedValue.length > 0;
677
- const displayLabel =
678
- hasValue
679
- ? (personOptionsData.find(
680
- (person) => String(person.id) === normalizedValue
681
- )?.name ??
682
- selectedPersonLabel ??
683
- `ID #${normalizedValue}`)
684
- : selectedPersonLabel || selectPlaceholder;
683
+ const displayLabel = hasValue
684
+ ? (personOptionsData.find((person) => String(person.id) === normalizedValue)
685
+ ?.name ??
686
+ selectedPersonLabel ??
687
+ `ID #${normalizedValue}`)
688
+ : selectedPersonLabel || selectPlaceholder;
685
689
  const hasSelection = hasValue || Boolean(selectedPersonLabel);
686
690
 
687
691
  return (
@@ -747,19 +751,42 @@ export function PersonSelectWithCreate({
747
751
  )}
748
752
  </CommandEmpty>
749
753
  <CommandGroup>
750
- {personOptionsData.map((person) => (
751
- <CommandItem
752
- key={String(person.id)}
753
- value={`${person.name}-${person.id}`}
754
- onSelect={() => {
755
- onChange(Number(person.id), person.name);
756
- setSelectedPersonLabel(person.name);
757
- setPersonOpen(false);
758
- }}
759
- >
760
- {person.name}
761
- </CommandItem>
762
- ))}
754
+ {personOptionsData.map((person) => {
755
+ const avatarId =
756
+ person.avatarId ?? person.avatar_id ?? null;
757
+ const avatarSrc =
758
+ typeof avatarId === 'number' && avatarId > 0
759
+ ? `${process.env.NEXT_PUBLIC_API_BASE_URL}/person/avatar/${avatarId}`
760
+ : undefined;
761
+ const initials = person.name
762
+ .trim()
763
+ .split(' ')
764
+ .filter(Boolean)
765
+ .slice(0, 2)
766
+ .map((w) => w[0]!.toUpperCase())
767
+ .join('');
768
+ return (
769
+ <CommandItem
770
+ key={String(person.id)}
771
+ value={`${person.name}-${person.id}`}
772
+ onSelect={() => {
773
+ onChange(Number(person.id), person.name);
774
+ setSelectedPersonLabel(person.name);
775
+ setPersonOpen(false);
776
+ }}
777
+ >
778
+ <Avatar className="mr-2 h-6 w-6 shrink-0">
779
+ {avatarSrc ? (
780
+ <AvatarImage src={avatarSrc} alt={person.name} />
781
+ ) : null}
782
+ <AvatarFallback className="text-[9px] font-medium">
783
+ {initials}
784
+ </AvatarFallback>
785
+ </Avatar>
786
+ {person.name}
787
+ </CommandItem>
788
+ );
789
+ })}
763
790
  </CommandGroup>
764
791
  </CommandList>
765
792
  </Command>