-
Notifications
You must be signed in to change notification settings - Fork 61
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat(j-s): Add punishment type to indictment overview #17198
feat(j-s): Add punishment type to indictment overview #17198
Conversation
WalkthroughThis pull request introduces multiple enhancements to the judicial system's backend, focusing on limited access functionality. Key additions include new methods in the Changes
Possibly related PRs
Suggested labels
Suggested reviewers
Tip CodeRabbit's docstrings feature is now available as part of our Early Access Program! Simply use the command Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media? 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
Documentation and Community
|
apps/judicial-system/api/src/app/modules/defendant/limitedAccessDefendant.resolver.ts
Show resolved
Hide resolved
apps/judicial-system/backend/src/app/modules/defendant/limitedAccessDefendant.controller.ts
Show resolved
Hide resolved
apps/judicial-system/web/src/routes/Prison/IndictmentOverview/IndictmentOverview.strings.ts
Outdated
Show resolved
Hide resolved
apps/judicial-system/web/src/routes/Prison/IndictmentOverview/IndictmentOverview.tsx
Outdated
Show resolved
Hide resolved
Datadog ReportAll test runs ✅ 14 Total Test Services: 0 Failed, 14 Passed Test ServicesThis report shows up to 10 services
🔻 Code Coverage Decreases vs Default Branch (2) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 2
🧹 Outside diff range and nitpick comments (4)
apps/judicial-system/backend/src/app/modules/defendant/limitedAccessDefendant.controller.ts (1)
30-37
: LGTM! Consider enhancing API documentation.The controller setup follows NestJS best practices with proper security guards and dependency injection. The limited access path aligns well with the PR objectives.
Consider adding
@ApiParam
decorators to document the path parameters:@ApiParam({ name: 'caseId', description: 'The ID of the case' }) @Controller('api/case/:caseId/limitedAccess/defendant')apps/judicial-system/backend/src/app/modules/defendant/test/limitedAccessDefendantController/updateDefendant.spec.ts (3)
16-19
: Consider using discriminated union for Then interfaceThe current interface allows both
result
anderror
to be present simultaneously, which shouldn't be possible in practice. Consider using a discriminated union type for better type safety:type Then = | { success: true; result: Defendant; error?: never } | { success: false; error: Error; result?: never }
49-50
: Remove unnecessary default error mockThe default error mock is immediately overridden in the test case. Consider removing it to avoid confusion.
- const mockUpdate = mockDefendantModel.update as jest.Mock - mockUpdate.mockRejectedValue(new Error('Some error'))
59-70
: Refactor promise chain to use async/awaitThe current promise chain with assignments in expressions has been flagged by static analysis. Consider using async/await for better readability and to avoid assignments in expressions.
try { then.result = await limitedAccessDefendantController.updateDefendant( caseId, defendantId, user, { id: caseId, courtCaseNumber, type } as Case, defendant, defendantUpdate, ) } catch (error) { then.error = error }🧰 Tools
🪛 Biome (1.9.4)
[error] 68-68: The assignment should not be in an expression.
The use of assignments in expressions is confusing.
Expressions are often considered as side-effect free.(lint/suspicious/noAssignInExpressions)
[error] 69-69: The assignment should not be in an expression.
The use of assignments in expressions is confusing.
Expressions are often considered as side-effect free.(lint/suspicious/noAssignInExpressions)
📜 Review details
Configuration used: .coderabbit.yaml
Review profile: CHILL
📒 Files selected for processing (2)
apps/judicial-system/backend/src/app/modules/defendant/limitedAccessDefendant.controller.ts
(1 hunks)apps/judicial-system/backend/src/app/modules/defendant/test/limitedAccessDefendantController/updateDefendant.spec.ts
(1 hunks)
🧰 Additional context used
📓 Path-based instructions (2)
apps/judicial-system/backend/src/app/modules/defendant/limitedAccessDefendant.controller.ts (1)
Pattern apps/**/*
: "Confirm that the code adheres to the following:
- NextJS best practices, including file structure, API routes, and static generation methods.
- Efficient state management and server-side rendering techniques.
- Optimal use of TypeScript for component and utility type safety."
apps/judicial-system/backend/src/app/modules/defendant/test/limitedAccessDefendantController/updateDefendant.spec.ts (1)
Pattern apps/**/*
: "Confirm that the code adheres to the following:
- NextJS best practices, including file structure, API routes, and static generation methods.
- Efficient state management and server-side rendering techniques.
- Optimal use of TypeScript for component and utility type safety."
📓 Learnings (1)
apps/judicial-system/backend/src/app/modules/defendant/test/limitedAccessDefendantController/updateDefendant.spec.ts (2)
Learnt from: gudjong
PR: island-is/island.is#16389
File: apps/judicial-system/backend/src/app/modules/case/test/limitedAccessCaseController/getCaseFilesRecordPdfRolesRules.spec.ts:1-1
Timestamp: 2024-11-12T15:15:20.157Z
Learning: The usage of `defenderRule` in the following test files is intentional and should remain unchanged:
- `apps/judicial-system/backend/src/app/modules/file/test/limitedAccessFileController/createPresignedPostRolesRules.spec.ts`
- `apps/judicial-system/backend/src/app/modules/file/test/limitedAccessFileController/deleteCaseFileRolesRules.spec.ts`
- `apps/judicial-system/backend/src/app/modules/file/test/limitedAccessFileController/createCaseFileRolesRules.spec.ts`
- `apps/judicial-system/backend/src/app/modules/file/test/limitedAccessFileController/getCaseFileSignedUrlRolesRules.spec.ts`
- `apps/judicial-system/backend/src/app/modules/case/test/limitedAccessCaseController/getRulingPdfRolesRules.spec.ts`
- `apps/judicial-system/backend/src/app/modules/case/test/limitedAccessCaseController/getRequestPdfRolesRules.spec.ts`
- `apps/judicial-system/backend/src/app/modules/case/test/limitedAccessCaseController/getCourtRecordPdfRolesRules.spec.ts`
- `apps/judicial-system/backend/src/app/modules/case/test/limitedAccessCaseController/getByIdRolesRules.spec.ts`
- `apps/judicial-system/backend/src/app/modules/case/test/limitedAccessCaseController/getAllFilesZipRolesRules.spec.ts`
- `apps/judicial-system/backend/src/app/modules/case/test/caseController/getAllRolesRules.spec.ts`
Learnt from: gudjong
PR: island-is/island.is#16389
File: apps/judicial-system/backend/src/app/modules/file/guards/test/limitedAccessViewCaseFileGuard.spec.ts:175-185
Timestamp: 2024-11-12T15:15:20.157Z
Learning: In the Jest tests for the `LimitedAccessViewCaseFileGuard` in `apps/judicial-system/backend/src/app/modules/file/guards/test/limitedAccessViewCaseFileGuard.spec.ts`, code duplication in the `beforeEach` blocks is acceptable and should remain unchanged.
🪛 Biome (1.9.4)
apps/judicial-system/backend/src/app/modules/defendant/test/limitedAccessDefendantController/updateDefendant.spec.ts
[error] 68-68: The assignment should not be in an expression.
The use of assignments in expressions is confusing.
Expressions are often considered as side-effect free.
(lint/suspicious/noAssignInExpressions)
[error] 69-69: The assignment should not be in an expression.
The use of assignments in expressions is confusing.
Expressions are often considered as side-effect free.
(lint/suspicious/noAssignInExpressions)
🔇 Additional comments (1)
apps/judicial-system/backend/src/app/modules/defendant/limitedAccessDefendant.controller.ts (1)
57-62
:
Add error handling for the service call.
The controller should handle potential errors from the service call and return appropriate HTTP responses.
- return this.defendantService.updateRequestCaseDefendant(
- theCase,
- defendant,
- updateDto,
- user,
- )
+ try {
+ return await this.defendantService.updateRequestCaseDefendant(
+ theCase,
+ defendant,
+ updateDto,
+ user,
+ )
+ } catch (error) {
+ this.logger.error('Failed to update defendant', error)
+ throw new InternalServerErrorException('Failed to update defendant')
+ }
apps/judicial-system/backend/src/app/modules/defendant/limitedAccessDefendant.controller.ts
Show resolved
Hide resolved
apps/judicial-system/backend/migrations/20241211095654-update-defendant.js
Show resolved
Hide resolved
apps/judicial-system/backend/src/app/modules/defendant/models/defendant.model.ts
Show resolved
Hide resolved
...kend/src/app/modules/defendant/test/limitedAccessDefendantController/updateDefendant.spec.ts
Outdated
Show resolved
Hide resolved
apps/judicial-system/web/src/routes/Prison/IndictmentOverview/IndictmentOverview.strings.ts
Outdated
Show resolved
Hide resolved
apps/judicial-system/web/src/routes/Prison/IndictmentOverview/IndictmentOverview.strings.ts
Outdated
Show resolved
Hide resolved
…s/update-punishment-type-prison-indictment-overview
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 2
♻️ Duplicate comments (1)
apps/judicial-system/backend/src/app/modules/defendant/test/limitedAccessDefendantController/updateDefendant.spec.ts (1)
49-51
: 🛠️ Refactor suggestionAdd test cases for error handling
The error mock is set up but there are no test cases verifying error scenarios.
Add test cases for:
- Error cases (e.g., invalid punishment type)
- Tests for non-INDICTMENT case types
- Validation of different punishment type values
Example:
describe('when case type is not INDICTMENT', () => { it('should throw an error when updating punishment type', async () => { const then = await givenWhenThen( { punishmentType: PunishmentType.IMPRISONMENT }, CaseType.CUSTODY ); expect(then.error).toBeDefined(); }); });
🧹 Nitpick comments (5)
apps/judicial-system/backend/src/app/modules/defendant/test/limitedAccessDefendantController/updateDefendant.spec.ts (2)
21-26
: Remove unused parameter from GivenWhenThen typeThe
courtCaseNumber
parameter is defined but not used in any test case.type GivenWhenThen = ( defendantUpdate: UpdateDefendantDto, - type: CaseType, - courtCaseNumber?: string, + type: CaseType ) => Promise<Then>
67-68
: Improve readability of promise handlingThe assignments in the promise chain can be refactored for better readability and to address the static analysis warnings.
- .then((result) => (then.result = result)) - .catch((error) => (then.error = error)) + .then((result) => { + then.result = result; + }) + .catch((error) => { + then.error = error; + });🧰 Tools
🪛 Biome (1.9.4)
[error] 67-67: The assignment should not be in an expression.
The use of assignments in expressions is confusing.
Expressions are often considered as side-effect free.(lint/suspicious/noAssignInExpressions)
[error] 68-68: The assignment should not be in an expression.
The use of assignments in expressions is confusing.
Expressions are often considered as side-effect free.(lint/suspicious/noAssignInExpressions)
apps/judicial-system/web/src/routes/Prison/IndictmentOverview/IndictmentOverview.tsx (3)
42-50
: Consider optimistic updates with error handling.The current implementation updates the UI state before confirming the API call's success. While this provides a better user experience through immediate feedback, it should include error handling.
Consider adding error handling:
const onChange = (updatedPunishmentType: PunishmentType) => { setPunishmentType(updatedPunishmentType) - defendant && + if (defendant) { limitedAccessUpdateDefendant({ caseId: workingCase.id, defendantId: defendant.id, punishmentType: updatedPunishmentType, - }) + }).catch((error) => { + console.error('Failed to update punishment type:', error) + setPunishmentType(defendant.punishmentType ?? undefined) + // TODO: Add user notification for the error + }) + } }
52-53
: Improve type safety in hasSetPunishmentType function.The function could be more explicit about its return type and parameter constraints.
Consider this improvement:
- const hasSetPunishmentType = (punishmentType: PunishmentType) => - !selectedPunishmentType && defendant?.punishmentType === punishmentType + const hasSetPunishmentType = (punishmentType: PunishmentType): boolean => { + return !selectedPunishmentType && defendant?.punishmentType === punishmentType + }
96-186
: Consider extracting radio button group into a separate component.The radio button implementation is repetitive and could benefit from being extracted into a reusable component.
Consider creating a new component like this:
interface PunishmentTypeRadioProps { type: PunishmentType; selectedType: PunishmentType | undefined; onChange: (type: PunishmentType) => void; hasSetPunishmentType: (type: PunishmentType) => boolean; label: string; } const PunishmentTypeRadio: React.FC<PunishmentTypeRadioProps> = ({ type, selectedType, onChange, hasSetPunishmentType, label, }) => ( <Box marginBottom={2}> <RadioButton id={`punishment-type-${type.toLowerCase()}`} name={`punishmentType${type}`} checked={selectedType === type || hasSetPunishmentType(type)} onChange={() => onChange(type)} large backgroundColor="white" label={label} /> </Box> );This would simplify the main component and reduce code duplication.
📜 Review details
Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (3)
apps/judicial-system/backend/src/app/modules/defendant/test/limitedAccessDefendantController/updateDefendant.spec.ts
(1 hunks)apps/judicial-system/web/src/routes/Prison/IndictmentOverview/IndictmentOverview.strings.ts
(1 hunks)apps/judicial-system/web/src/routes/Prison/IndictmentOverview/IndictmentOverview.tsx
(4 hunks)
🧰 Additional context used
📓 Path-based instructions (3)
apps/judicial-system/web/src/routes/Prison/IndictmentOverview/IndictmentOverview.tsx (1)
Pattern apps/**/*
: "Confirm that the code adheres to the following:
- NextJS best practices, including file structure, API routes, and static generation methods.
- Efficient state management and server-side rendering techniques.
- Optimal use of TypeScript for component and utility type safety."
apps/judicial-system/web/src/routes/Prison/IndictmentOverview/IndictmentOverview.strings.ts (1)
Pattern apps/**/*
: "Confirm that the code adheres to the following:
- NextJS best practices, including file structure, API routes, and static generation methods.
- Efficient state management and server-side rendering techniques.
- Optimal use of TypeScript for component and utility type safety."
apps/judicial-system/backend/src/app/modules/defendant/test/limitedAccessDefendantController/updateDefendant.spec.ts (1)
Pattern apps/**/*
: "Confirm that the code adheres to the following:
- NextJS best practices, including file structure, API routes, and static generation methods.
- Efficient state management and server-side rendering techniques.
- Optimal use of TypeScript for component and utility type safety."
📓 Learnings (3)
apps/judicial-system/web/src/routes/Prison/IndictmentOverview/IndictmentOverview.tsx (2)
Learnt from: oddsson
PR: island-is/island.is#16731
File: apps/judicial-system/web/src/routes/Shared/IndictmentOverview/IndictmentOverview.tsx:172-186
Timestamp: 2024-11-12T15:15:20.157Z
Learning: In `IndictmentOverview.tsx`, since the defendants data does not change, using `useMemo` to memoize the filtering logic is unnecessary.
Learnt from: thorhildurt
PR: island-is/island.is#17198
File: apps/judicial-system/web/src/routes/Prison/IndictmentOverview/IndictmentOverview.tsx:42-50
Timestamp: 2024-12-11T14:25:44.741Z
Learning: In `IndictmentOverview.tsx`, when updating the punishment type, update the UI state before making the API call to immediately reflect the change.
apps/judicial-system/web/src/routes/Prison/IndictmentOverview/IndictmentOverview.strings.ts (3)
Learnt from: oddsson
PR: island-is/island.is#16495
File: apps/judicial-system/web/src/components/BlueBoxWithIcon/BlueBoxWithDate.strings.ts:3-3
Timestamp: 2024-11-12T15:15:20.157Z
Learning: In `apps/judicial-system/web/src/components/BlueBoxWithIcon/BlueBoxWithDate.strings.ts`, prefer not to add explicit TypeScript type definitions for the messages object.
Learnt from: oddsson
PR: island-is/island.is#16831
File: apps/judicial-system/web/src/components/BlueBoxWithIcon/BlueBoxWithDate.tsx:204-337
Timestamp: 2024-11-19T09:28:36.448Z
Learning: Buttons in this project are considered accessible as is, and adding additional ARIA attributes like `aria-label` and `aria-disabled` is not required unless specifically needed.
Learnt from: thorhildurt
PR: island-is/island.is#17198
File: apps/judicial-system/web/src/routes/Prison/IndictmentOverview/IndictmentOverview.tsx:42-50
Timestamp: 2024-12-11T14:25:44.741Z
Learning: In `IndictmentOverview.tsx`, when updating the punishment type, update the UI state before making the API call to immediately reflect the change.
apps/judicial-system/backend/src/app/modules/defendant/test/limitedAccessDefendantController/updateDefendant.spec.ts (2)
Learnt from: gudjong
PR: island-is/island.is#16389
File: apps/judicial-system/backend/src/app/modules/case/test/limitedAccessCaseController/getCaseFilesRecordPdfRolesRules.spec.ts:1-1
Timestamp: 2024-11-12T15:15:20.157Z
Learning: The usage of `defenderRule` in the following test files is intentional and should remain unchanged:
- `apps/judicial-system/backend/src/app/modules/file/test/limitedAccessFileController/createPresignedPostRolesRules.spec.ts`
- `apps/judicial-system/backend/src/app/modules/file/test/limitedAccessFileController/deleteCaseFileRolesRules.spec.ts`
- `apps/judicial-system/backend/src/app/modules/file/test/limitedAccessFileController/createCaseFileRolesRules.spec.ts`
- `apps/judicial-system/backend/src/app/modules/file/test/limitedAccessFileController/getCaseFileSignedUrlRolesRules.spec.ts`
- `apps/judicial-system/backend/src/app/modules/case/test/limitedAccessCaseController/getRulingPdfRolesRules.spec.ts`
- `apps/judicial-system/backend/src/app/modules/case/test/limitedAccessCaseController/getRequestPdfRolesRules.spec.ts`
- `apps/judicial-system/backend/src/app/modules/case/test/limitedAccessCaseController/getCourtRecordPdfRolesRules.spec.ts`
- `apps/judicial-system/backend/src/app/modules/case/test/limitedAccessCaseController/getByIdRolesRules.spec.ts`
- `apps/judicial-system/backend/src/app/modules/case/test/limitedAccessCaseController/getAllFilesZipRolesRules.spec.ts`
- `apps/judicial-system/backend/src/app/modules/case/test/caseController/getAllRolesRules.spec.ts`
Learnt from: gudjong
PR: island-is/island.is#16389
File: apps/judicial-system/backend/src/app/modules/file/guards/test/limitedAccessViewCaseFileGuard.spec.ts:175-185
Timestamp: 2024-11-12T15:15:20.157Z
Learning: In the Jest tests for the `LimitedAccessViewCaseFileGuard` in `apps/judicial-system/backend/src/app/modules/file/guards/test/limitedAccessViewCaseFileGuard.spec.ts`, code duplication in the `beforeEach` blocks is acceptable and should remain unchanged.
🪛 Biome (1.9.4)
apps/judicial-system/backend/src/app/modules/defendant/test/limitedAccessDefendantController/updateDefendant.spec.ts
[error] 67-67: The assignment should not be in an expression.
The use of assignments in expressions is confusing.
Expressions are often considered as side-effect free.
(lint/suspicious/noAssignInExpressions)
[error] 68-68: The assignment should not be in an expression.
The use of assignments in expressions is confusing.
Expressions are often considered as side-effect free.
(lint/suspicious/noAssignInExpressions)
🔇 Additional comments (1)
apps/judicial-system/web/src/routes/Prison/IndictmentOverview/IndictmentOverview.tsx (1)
37-40
: 🛠️ Refactor suggestion
Improve defendant selection robustness.
The current implementation could be more defensive in handling the defendant selection.
Apply this diff to improve type safety and error handling:
const { defendants } = workingCase
- const defendant =
- defendants && defendants?.length > 0 ? defendants[0] : undefined
+ const defendant = defendants?.length > 0 ? defendants[0] : null
+
+ if (!defendant) {
+ console.warn('No defendant found for case:', workingCase.id)
+ }
Likely invalid or redundant comment.
...kend/src/app/modules/defendant/test/limitedAccessDefendantController/updateDefendant.spec.ts
Show resolved
Hide resolved
apps/judicial-system/web/src/routes/Prison/IndictmentOverview/IndictmentOverview.strings.ts
Outdated
Show resolved
Hide resolved
apps/judicial-system/web/src/routes/Prison/IndictmentOverview/IndictmentOverview.tsx
Outdated
Show resolved
Hide resolved
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Really nice work! 👏 Going to Approve because all comments were just considerations but feel free to ask for review again if you have any other thoughts or changes you'd like feedback on
…s/update-punishment-type-prison-indictment-overview
…s/update-punishment-type-prison-indictment-overview
https://github.com/island-is/island.is into j-s/update-punishment-type-prison-indictment-overview
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 1
📜 Review details
Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (2)
apps/judicial-system/web/src/routes/Prison/IndictmentOverview/IndictmentOverview.strings.ts
(1 hunks)apps/judicial-system/web/src/routes/Prison/IndictmentOverview/IndictmentOverview.tsx
(4 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
- apps/judicial-system/web/src/routes/Prison/IndictmentOverview/IndictmentOverview.strings.ts
🧰 Additional context used
📓 Path-based instructions (1)
apps/judicial-system/web/src/routes/Prison/IndictmentOverview/IndictmentOverview.tsx (1)
Pattern apps/**/*
: "Confirm that the code adheres to the following:
- NextJS best practices, including file structure, API routes, and static generation methods.
- Efficient state management and server-side rendering techniques.
- Optimal use of TypeScript for component and utility type safety."
📓 Learnings (1)
apps/judicial-system/web/src/routes/Prison/IndictmentOverview/IndictmentOverview.tsx (2)
Learnt from: oddsson
PR: island-is/island.is#16731
File: apps/judicial-system/web/src/routes/Shared/IndictmentOverview/IndictmentOverview.tsx:172-186
Timestamp: 2024-11-12T15:15:20.157Z
Learning: In `IndictmentOverview.tsx`, since the defendants data does not change, using `useMemo` to memoize the filtering logic is unnecessary.
Learnt from: thorhildurt
PR: island-is/island.is#17198
File: apps/judicial-system/web/src/routes/Prison/IndictmentOverview/IndictmentOverview.tsx:42-50
Timestamp: 2024-12-11T14:25:44.741Z
Learning: In `IndictmentOverview.tsx`, when updating the punishment type, update the UI state before making the API call to immediately reflect the change.
🔇 Additional comments (5)
apps/judicial-system/web/src/routes/Prison/IndictmentOverview/IndictmentOverview.tsx (5)
4-4
: LGTM: Imports are well-organized and follow best practices
The imports are properly categorized and all dependencies are necessary for the implementation.
Also applies to: 7-7, 10-24
29-31
: LGTM: Proper state management setup
The component correctly uses context and custom hooks for state management.
37-39
: Simplify defendant selection logic
The current implementation has redundant checks. Consider simplifying:
- const { defendants } = workingCase
- const defendant =
- defendants && defendants?.length > 0 ? defendants[0] : undefined
+ const defendant = workingCase.defendants?.length
+ ? workingCase.defendants[0]
+ : null
+
+ if (!defendant) {
+ console.warn('No defendant found for case:', workingCase.id)
+ }
41-51
: LGTM: Well-structured update handler
The implementation follows the confirmed pattern of updating UI state before making the API call, with proper error handling.
53-54
: LGTM: Clean and type-safe helper function
The helper function is well-implemented with proper null checking using optional chaining.
References
Fmst - Stöður hjá fangelsismálastofnun, málalisti og yfirlit máls
What
punishment_type
case
,subpoena
Why
Screen
Screen.Recording.2024-12-11.at.11.00.05.mov
Checklist:
Summary by CodeRabbit
New Features
Bug Fixes
Documentation
Chores