Skip to content
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

Merging develop to main #1

Open
wants to merge 110 commits into
base: main
Choose a base branch
from
Open

Merging develop to main #1

wants to merge 110 commits into from

Conversation

devikasuresh20
Copy link
Contributor

@devikasuresh20 devikasuresh20 commented Sep 11, 2024

Summary by CodeRabbit

  • New Features

    • Introduced a comprehensive registration form for beneficiaries, integrating personal, location, and additional information management.
    • Enhanced user interface for managing ABHA details, including buttons for viewing, downloading, and generating ABHA cards.
    • Implemented dynamic forms for capturing location and other information with various input types and validations.
    • Added a personal information form with image upload capabilities and real-time validation feedback.
  • Bug Fixes

    • Addressed styling issues in various components for improved UI consistency.
  • Documentation

    • Updated documentation to reflect new features and usage instructions.
  • Tests

    • Added unit tests for new components to ensure functionality and reliability.

Copy link

coderabbitai bot commented Sep 11, 2024

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Walkthrough

The changes introduce a new RegistrationComponent in the Angular application, which serves as a comprehensive registration form for beneficiaries. This component integrates various functionalities to manage personal, location, and additional information using Angular's reactive forms. It includes validation, data fetching, and consent handling, along with structured nested groups for organized data collection. The implementation ensures efficient memory management and user feedback through error handling for API calls.

Changes

Files Change Summary
src/registrar/registration/*.html Introduced multiple components for managing ABHA, location, other, and personal information with dynamic forms and Angular Material styling.
src/registrar/registration/personal-information/*.ts Added PersonalInformationComponent with methods for managing personal information, validation, and image capture.
src/registrar/registration/registration.component.ts Introduced RegistrationComponent for handling the registration workflow, including data fetching, form submission, and consent management.

Sequence Diagram(s)

sequenceDiagram
    participant User
    participant RegistrationComponent
    participant RegistrarService

    User->>RegistrationComponent: Fill out registration form
    RegistrationComponent->>RegistrarService: Fetch necessary data
    User->>RegistrationComponent: Submit form
    RegistrationComponent->>RegistrarService: Submit beneficiary details
    RegistrarService-->>RegistrationComponent: Confirm submission
    RegistrationComponent-->>User: Display success message
Loading

🐰 In a meadow of forms where data flows,
ABHA and location, how the information grows!
With buttons to click and fields to fill,
Each detail captured with care and skill.
So hop to it, dear user, don’t delay,
Your info is precious, let’s gather today! 🌼


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?

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

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)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 46

Outside diff range and nitpick comments (32)
src/registrar/registration/other-information/other-information.component.spec.ts (1)

1-21: LGTM, but consider adding more test cases.

The test file follows the standard Angular testing conventions and has a basic test case that checks if the component is created successfully.

However, to ensure comprehensive testing coverage, consider adding more test cases to verify the component's functionality, such as:

  • Testing the component's template bindings and interactions.
  • Testing the component's inputs, outputs, and event emitters.
  • Testing the component's dependencies and services.
  • Testing the component's error handling and edge cases.
src/registrar/registration/personal-information/personal-information.component.spec.ts (1)

1-21: Test specification looks good, but consider adding more test cases.

The test specification follows the standard structure and conventions for Angular component testing. It sets up the testing module, creates an instance of the component, and includes a basic test case to ensure that the component is created successfully.

To further improve the test coverage, consider adding more comprehensive test cases that verify the component's behavior, such as:

  • Testing the component's template bindings and user interactions.
  • Mocking and testing the component's dependencies and services.
  • Verifying the component's outputs and event emissions.

These additional test cases will help ensure the component's functionality and catch potential issues.

src/registrar/biometric-authentication/biometric-authentication.component.spec.ts (1)

1-24: LGTM! Consider adding more test cases.

The test specification follows the standard structure and conventions for writing Angular component tests. The beforeEach function is used correctly to set up the testing environment before each test case.

The current test case is minimal and only checks if the component is created. Consider adding more comprehensive test cases to cover the component's behavior and interactions.

Tools
Biome

[error] 15-19: Disallow duplicate setup and teardown hooks.

Disallow beforeEach duplicacy inside the describe function.

(lint/suspicious/noDuplicateTestHooks)

src/registrar/biometric-authentication/biometric-authentication.component.html (1)

27-36: Consider removing the commented code or implementing the functionality.

The code segment for displaying an image and a message is currently commented out and not being used.

If this functionality is not required, consider removing the commented code to keep the template clean and maintainable.

If the functionality is intended to be used in the future, uncomment the code and ensure that the messageInfo property is properly set in the component class.

src/registrar/generate-abha-component/auth-method.html (2)

1-12: Consider moving the inline styles to a separate CSS file.

The close button has inline styles that can be moved to a separate CSS file for better separation of concerns and maintainability.

Apply this diff to move the inline styles to a separate CSS file:

-<button
-  class="pull-right close-btn"
-  style="border: unset !important;background-color: unset !important;"
-  matDialogClose
-  (click)="closeDialogAuth()"
-  mat-icon-button
->
+<button
+  class="pull-right close-btn"
+  matDialogClose
+  (click)="closeDialogAuth()"
+  mat-icon-button
+>

Then, add the following styles to a separate CSS file:

.close-btn {
  border: unset !important;
  background-color: unset !important;
}

14-33: Consider moving the hardcoded radio group options to a separate configuration file.

The radio group options are hardcoded and can be moved to a separate configuration file for better maintainability and reusability.

Apply this diff to move the hardcoded radio group options to a separate configuration file:

-<mat-radio-group
-  formControlName="modeofAuthMethod"
-  (change)="getAbhaAuthMethod()"
->
-  <mat-radio-button color="primary" value="AADHAAR_OTP"
-    >Aadhar</mat-radio-button
-  >
-  <mat-radio-button color="primary" value="AADHAAR_BIO"
-    >Biometric</mat-radio-button
-  >
-  <mat-radio-button color="primary" value="MOBILE_OTP"
-    >Mobile</mat-radio-button
-  >
-</mat-radio-group>
+<mat-radio-group
+  formControlName="modeofAuthMethod"
+  (change)="getAbhaAuthMethod()"
+>
+  <mat-radio-button
+    *ngFor="let option of authMethodOptions"
+    color="primary"
+    [value]="option.value"
+  >
+    {{ option.label }}
+  </mat-radio-button>
+</mat-radio-group>

Then, add the following configuration to the component:

authMethodOptions = [
  { value: 'AADHAAR_OTP', label: 'Aadhar' },
  { value: 'AADHAAR_BIO', label: 'Biometric' },
  { value: 'MOBILE_OTP', label: 'Mobile' },
];
README.md (2)

3-3: Excellent introduction, minor grammatical improvement suggested.

The introduction provides a clear and concise overview of the registration page and its configurability. Well done!

Consider adding the article "the" before "registration page" to improve readability, as suggested by the static analysis tool.

-As registration is a common process across multiple AMRIT modules, registration page needs to be configurable based on the service line and project.
+As registration is a common process across multiple AMRIT modules, the registration page needs to be configurable based on the service line and project.
Tools
LanguageTool

[uncategorized] ~3-~3: You might be missing the article “the” here.
Context: ... process across multiple AMRIT modules, registration page needs to be configurable based on ...

(AI_EN_LECTOR_MISSING_DETERMINER_THE)


10-21: Informative building from source section, minor spelling correction suggested.

The building from source section provides essential information for developers to set up the project. The prerequisites are clearly listed. Well done!

Consider using the official spelling "Node.js" instead of "Nodejs", as suggested by the static analysis tool.

-* Nodejs v18.10.0
+* Node.js v18.10.0
Tools
LanguageTool

[uncategorized] ~20-~20: The official spelling of this programming framework is “Node.js”.
Context: ...g the MMU service: * JDK 17 * Maven * Nodejs v18.10.0 * MySQL

(NODE_JS)

src/registrar/registration/consent-form/consent-form.component.html (2)

1-11: LGTM, but consider using a constant or an enum for the hardcoded value.

The code segment is structurally correct and follows good practices like using optional chaining for the currentLanguageSet object.

However, the close button click event binding passes a hardcoded value '1'. Consider using a constant or an enum for this value to improve readability and maintainability.


28-35: LGTM, but consider using a constant or an enum for the hardcoded value.

The code segment is structurally correct.

However, similar to the close button, the accept button click event binding passes a hardcoded value '1'. Consider using a constant or an enum for this value to improve readability and maintainability.

src/registrar/family-tagging/create-family-tagging/create-family-tagging.component.spec.ts (1)

42-44: Test case looks good, but add more comprehensive tests.

The test case is a simple smoke test that checks if the component can be created, which is a good starting point.

However, more comprehensive test cases should be added to test the component's behavior and edge cases, such as:

  • Testing the component's interaction with the template
  • Testing the component's methods and properties
  • Testing the component's interaction with dependencies (services, router, etc.)
  • Testing error scenarios
src/registrar/health-id-display-modal/health-id-display-modal.component.spec.ts (1)

42-44: Consider adding more test cases.

The current test suite only has a placeholder test case that checks if the component is created. Consider adding more test cases to cover the component's behavior and edge cases.

src/registrar/registration/personal-information/personal-information.component.css (3)

5-7: Remove commented code.

The commented out code segment can be removed if it's not needed.

-.col-xs-12:first-child {
-  display: none !important;
-}

13-43: LGTM with suggestions!

The code segment is approved with a few suggestions:

  1. Try to avoid using !important flag if possible, as it makes the styles harder to override.

  2. The deep selectors for bs-datepicker make the styles tightly coupled to that component. Consider moving those styles to the bs-datepicker component itself to make them more reusable.


45-60: Consider moving styles to the bs-datepicker component.

The deep selectors for bs-datepicker make the styles tightly coupled to that component. Consider moving those styles to the bs-datepicker component itself to make them more reusable.

src/registrar/generate-mobile-otp-generation/generate-mobile-otp-generation.component.spec.ts (1)

26-45: Add more test cases.

The test suite only contains a single test case that checks if the component is created. Please add more test cases to thoroughly test the component behavior, such as:

  • Test cases for the component's input properties and output events.
  • Test cases for the component's template bindings and user interactions.
  • Test cases for the component's dependency interactions, if any.
Tools
Biome

[error] 36-40: Disallow duplicate setup and teardown hooks.

Disallow beforeEach duplicacy inside the describe function.

(lint/suspicious/noDuplicateTestHooks)

src/registrar/health-id-otp-generation/health-id-otp-succespopup.html (1)

20-46: Move the inline CSS styles to a separate CSS file.

The "Yes" and "No" buttons are styled using inline CSS, which is not a best practice. Inline styles are difficult to maintain and reuse.

Consider moving the styles to a separate CSS file and using CSS classes to style the buttons.

src/registrar/registration/registration.component.css (1)

46-63: Remove commented out styles.

The styles on lines 46-63 are commented out and should be removed if they are no longer needed.

Apply this diff to remove the commented out styles:

-  /* .mat_blue {
-    background-color: #0277bd !important;
-    border-color: unset !important;
-    color: white;
-    border: unset;
-    border-radius: 20px;
-    line-height: 36px;
-    min-width: 88px;
-  }
-  .mat_blue:disabled {
-    background-color: #e0e0e0 !important;
-    border-color: unset !important;
-    color: rgba(0, 0, 0, 0.38);
-    border: unset;
-    border-radius: 3px;
-    line-height: 36px;
-    min-width: 88px;
-  } */
src/registrar/generate-abha-component/generate-abha-component.component.css (3)

1-4: Consider using padding on the container instead of negative margin.

The negative margin-left on the md2-pagination component might cause it to overflow outside its container.

It's better to add equivalent padding-left on the container element.


6-8: Add overflow and text-overflow properties to handle potential text overflow.

The white-space: nowrap prevents the text inside elements with column class from wrapping. This might cause text overflow issues if the column width is not sufficient.

Consider adding the following properties to handle text overflow gracefully:

.column {
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

120-122: Avoid using !important and use more specific selectors instead.

The !important rule is used to override any other styles. While it works, it's generally considered a bad practice and should be avoided when possible.

Try to use more specific selectors to achieve the desired styling without relying on !important. For example:

.mat-mdc-dialog-container .mdc-dialog__surface {
  overflow: visible;
}
src/registrar/registration/abha-information/abha-information.component.ts (1)

1-196: LGTM!

The code changes in the AbhaInformationComponent are approved. The component is well-structured and follows Angular's best practices for reactive forms and component interaction.

Consider adding more comments to explain the purpose and functionality of each method in the component. This will improve the code's readability and maintainability for other developers.

src/registrar/family-tagging/create-family-tagging/create-family-tagging.component.ts (1)

36-57: Component properties look good with a minor suggestion!

  • The property names are descriptive and follow the Angular style guide.
  • Type annotations are provided for most of the properties, which is a good practice.

Consider specifying more specific types for properties that have the "any" type, if possible. This can help catch type-related issues at compile time and improve code readability.

src/registrar/generate-mobile-otp-generation/generate-mobile-otp-generation.component.ts (1)

187-219: Consider a minor refactoring to avoid code duplication in the verifyMobileOtp method.

The verifyMobileOtp method is correctly implemented but can be slightly refactored to avoid code duplication.

Here's a suggestion:

  • Extract the common logic for creating the request object and calling the verifyMobileOTPForAadhar method into a separate method.
  • Call the extracted method with the appropriate parameters based on the condition.
src/registrar/biometric-authentication/biometric-authentication.component.ts (3)

60-86: captureData method is properly implemented.

The method correctly handles the AVDM capture process using the RdDeviceService. It sets the capturePID property and calls the generateAbha method when necessary.

Consider providing more specific error messages in the error handling block to help with debugging and troubleshooting.


125-191: posthealthIDButtonCall method is properly implemented.

The method correctly generates a health ID with UID by creating the request object and calling the generateHealthIdWithUID method of the RegistrarService. The response handling and success dialog opening are implemented correctly, and the health ID and ABHA details are set in the RegistrarService.

Consider providing more specific error messages in the error handling block to help with debugging and troubleshooting.


193-231: downloadABHAForBio method is properly implemented.

The method correctly downloads the ABHA card for biometric authentication by subscribing to the pidDetailDetails$ observable, creating the request object, and calling the confirmAadhar method of the RegistrarService. The response handling and dialog opening are implemented correctly.

Consider providing more specific error messages in the error handling block to help with debugging and troubleshooting.

src/registrar/search-dialog/search-dialog.component.ts (2)

49-60: Fix typo in interface name.

There is a typo in the interface name. It should be Beneficiary instead of Beneficary.

Apply this diff to fix the typo:

-interface Beneficary {
+interface Beneficiary {
   firstName: string;
   lastName: string;
   fatherName: string;
   dob: string;
   gender: string;
   genderName: string;
   govtIDtype: string;
   govtIDvalue: string;
   stateID: string;
   districtID: string;
 }

62-289: Remove unused methods and commented out code.

The SearchDialogComponent class looks good overall. However, there are a few unused methods and commented out code that can be removed to improve code quality and maintainability.

Consider removing the following unused methods and commented out code:

  • onIDCardSelected() method at line 210 is empty and unused.
  • getStates() method at line range 249-251 is commented out and unused.
  • getDistricts() method at line range 254-258 is unused.

Removing these unused methods and commented out code will make the code cleaner and more maintainable.

src/registrar/search-family/search-family.component.ts (1)

101-121: Consider splitting the method and removing console logs.

The ngOnInit method is performing multiple responsibilities, which can make the code harder to read and maintain. Consider splitting the method into smaller, focused methods to improve readability and maintainability.

Also, consider removing the console log statement that logs the form value or wrap it in a conditional statement to only log in development mode.

src/registrar/health-id-otp-generation/health-id-otp-generation.component.ts (1)

339-384: Use more descriptive variable names and add comments.

The verifyOTPOnSubmit function uses variable names like reqObj and res which don't convey much meaning.

Consider doing the following:

  • Use more descriptive variable names like verifyOTPRequest and verifyOTPResponse.
  • Add comments explaining the purpose of each code block and the expected API responses.

Using descriptive names and comments will make the code more readable and easier to understand for other developers.

src/registrar/registration/personal-information/personal-information.component.ts (1)

158-177: Remove the unnecessary break statement.

The break statement after the default case in the switch block is unnecessary and can be removed.

Apply this diff to remove the unnecessary break statement:

  default:
    regex = /^[a-zA-Z0-9 ]*$/;
-   break; // Add break statement here
}
Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

Commits

Files that changed from the base of the PR and between f5ecd6e and e1537b1.

Files ignored due to path filters (1)
  • src/assets/images/default-avatar.gif is excluded by !**/*.gif
Files selected for processing (80)
  • README.md (1 hunks)
  • src/registrar/beneficiary-details/beneficiary-details.component.css (1 hunks)
  • src/registrar/beneficiary-details/beneficiary-details.component.html (1 hunks)
  • src/registrar/beneficiary-details/beneficiary-details.component.spec.ts (1 hunks)
  • src/registrar/beneficiary-details/beneficiary-details.component.ts (1 hunks)
  • src/registrar/biometric-authentication/biometric-authentication.component.css (1 hunks)
  • src/registrar/biometric-authentication/biometric-authentication.component.html (1 hunks)
  • src/registrar/biometric-authentication/biometric-authentication.component.spec.ts (1 hunks)
  • src/registrar/biometric-authentication/biometric-authentication.component.ts (1 hunks)
  • src/registrar/dashboard/dashboard.component.css (1 hunks)
  • src/registrar/dashboard/dashboard.component.html (1 hunks)
  • src/registrar/dashboard/dashboard.component.spec.ts (1 hunks)
  • src/registrar/dashboard/dashboard.component.ts (1 hunks)
  • src/registrar/family-tagging/create-family-tagging/create-family-tagging.component.css (1 hunks)
  • src/registrar/family-tagging/create-family-tagging/create-family-tagging.component.html (1 hunks)
  • src/registrar/family-tagging/create-family-tagging/create-family-tagging.component.spec.ts (1 hunks)
  • src/registrar/family-tagging/create-family-tagging/create-family-tagging.component.ts (1 hunks)
  • src/registrar/family-tagging/edit-family-tagging/edit-family-tagging.component.css (1 hunks)
  • src/registrar/family-tagging/edit-family-tagging/edit-family-tagging.component.html (1 hunks)
  • src/registrar/family-tagging/edit-family-tagging/edit-family-tagging.component.spec.ts (1 hunks)
  • src/registrar/family-tagging/edit-family-tagging/edit-family-tagging.component.ts (1 hunks)
  • src/registrar/family-tagging/family-tagging-details/family-tagging-details.component.css (1 hunks)
  • src/registrar/family-tagging/family-tagging-details/family-tagging-details.component.html (1 hunks)
  • src/registrar/family-tagging/family-tagging-details/family-tagging-details.component.spec.ts (1 hunks)
  • src/registrar/family-tagging/family-tagging-details/family-tagging-details.component.ts (1 hunks)
  • src/registrar/generate-abha-component/auth-method.html (1 hunks)
  • src/registrar/generate-abha-component/generate-abha-component.component.css (1 hunks)
  • src/registrar/generate-abha-component/generate-abha-component.component.html (1 hunks)
  • src/registrar/generate-abha-component/generate-abha-component.component.spec.ts (1 hunks)
  • src/registrar/generate-abha-component/generate-abha-component.component.ts (1 hunks)
  • src/registrar/generate-mobile-otp-generation/generate-mobile-otp-generation.component.css (1 hunks)
  • src/registrar/generate-mobile-otp-generation/generate-mobile-otp-generation.component.html (1 hunks)
  • src/registrar/generate-mobile-otp-generation/generate-mobile-otp-generation.component.spec.ts (1 hunks)
  • src/registrar/generate-mobile-otp-generation/generate-mobile-otp-generation.component.ts (1 hunks)
  • src/registrar/health-id-display-modal/health-id-display-modal.component.css (1 hunks)
  • src/registrar/health-id-display-modal/health-id-display-modal.component.html (1 hunks)
  • src/registrar/health-id-display-modal/health-id-display-modal.component.spec.ts (1 hunks)
  • src/registrar/health-id-display-modal/health-id-display-modal.component.ts (1 hunks)
  • src/registrar/health-id-otp-generation/health-id-otp-generation.component.css (1 hunks)
  • src/registrar/health-id-otp-generation/health-id-otp-generation.component.html (1 hunks)
  • src/registrar/health-id-otp-generation/health-id-otp-generation.component.spec.ts (1 hunks)
  • src/registrar/health-id-otp-generation/health-id-otp-generation.component.ts (1 hunks)
  • src/registrar/health-id-otp-generation/health-id-otp-succespopup.html (1 hunks)
  • src/registrar/health-id-validatepopup/health-id-validatepopup.component.css (1 hunks)
  • src/registrar/health-id-validatepopup/health-id-validatepopup.component.html (1 hunks)
  • src/registrar/health-id-validatepopup/health-id-validatepopup.component.spec.ts (1 hunks)
  • src/registrar/health-id-validatepopup/health-id-validatepopup.component.ts (1 hunks)
  • src/registrar/registration-routing.module.ts (1 hunks)
  • src/registrar/registration.module.ts (1 hunks)
  • src/registrar/registration/abha-information/abha-information.component.html (1 hunks)
  • src/registrar/registration/abha-information/abha-information.component.spec.ts (1 hunks)
  • src/registrar/registration/abha-information/abha-information.component.ts (1 hunks)
  • src/registrar/registration/consent-form/consent-form.component.css (1 hunks)
  • src/registrar/registration/consent-form/consent-form.component.html (1 hunks)
  • src/registrar/registration/consent-form/consent-form.component.ts (1 hunks)
  • src/registrar/registration/location-information/location-information.component.css (1 hunks)
  • src/registrar/registration/location-information/location-information.component.html (1 hunks)
  • src/registrar/registration/location-information/location-information.component.spec.ts (1 hunks)
  • src/registrar/registration/location-information/location-information.component.ts (1 hunks)
  • src/registrar/registration/other-information/other-information.component.css (1 hunks)
  • src/registrar/registration/other-information/other-information.component.html (1 hunks)
  • src/registrar/registration/other-information/other-information.component.spec.ts (1 hunks)
  • src/registrar/registration/other-information/other-information.component.ts (1 hunks)
  • src/registrar/registration/personal-information/personal-information.component.css (1 hunks)
  • src/registrar/registration/personal-information/personal-information.component.html (1 hunks)
  • src/registrar/registration/personal-information/personal-information.component.spec.ts (1 hunks)
  • src/registrar/registration/personal-information/personal-information.component.ts (1 hunks)
  • src/registrar/registration/registration.component.css (1 hunks)
  • src/registrar/registration/registration.component.html (1 hunks)
  • src/registrar/registration/registration.component.spec.ts (1 hunks)
  • src/registrar/registration/registration.component.ts (1 hunks)
  • src/registrar/search-dialog/search-dialog.component.css (1 hunks)
  • src/registrar/search-dialog/search-dialog.component.html (1 hunks)
  • src/registrar/search-dialog/search-dialog.component.spec.ts (1 hunks)
  • src/registrar/search-dialog/search-dialog.component.ts (1 hunks)
  • src/registrar/search-family/search-family.component.css (1 hunks)
  • src/registrar/search-family/search-family.component.html (1 hunks)
  • src/registrar/search-family/search-family.component.ts (1 hunks)
  • src/registrar/search/search.component.css (1 hunks)
  • src/registrar/search/search.component.html (1 hunks)
Files not processed due to max files limit (16)
  • src/registrar/search/search.component.spec.ts
  • src/registrar/search/search.component.ts
  • src/registrar/services/familytagging.service.ts
  • src/registrar/services/rddevice.service.ts
  • src/registrar/services/registrar.service.ts
  • src/registrar/services/registration.service.spec.ts
  • src/registrar/services/registration.service.ts
  • src/registrar/set-password-for-abha/set-password-for-abha.component.css
  • src/registrar/set-password-for-abha/set-password-for-abha.component.html
  • src/registrar/set-password-for-abha/set-password-for-abha.component.spec.ts
  • src/registrar/set-password-for-abha/set-password-for-abha.component.ts
  • src/registrar/utility/registration-utility.ts
  • src/registrar/view-health-id-card/view-health-id-card.component.css
  • src/registrar/view-health-id-card/view-health-id-card.component.html
  • src/registrar/view-health-id-card/view-health-id-card.component.spec.ts
  • src/registrar/view-health-id-card/view-health-id-card.component.ts
Files skipped from review due to trivial changes (18)
  • src/registrar/beneficiary-details/beneficiary-details.component.css
  • src/registrar/biometric-authentication/biometric-authentication.component.css
  • src/registrar/dashboard/dashboard.component.css
  • src/registrar/dashboard/dashboard.component.html
  • src/registrar/family-tagging/create-family-tagging/create-family-tagging.component.css
  • src/registrar/family-tagging/edit-family-tagging/edit-family-tagging.component.css
  • src/registrar/generate-mobile-otp-generation/generate-mobile-otp-generation.component.css
  • src/registrar/health-id-display-modal/health-id-display-modal.component.css
  • src/registrar/health-id-otp-generation/health-id-otp-generation.component.css
  • src/registrar/health-id-validatepopup/health-id-validatepopup.component.spec.ts
  • src/registrar/registration/abha-information/abha-information.component.spec.ts
  • src/registrar/registration/consent-form/consent-form.component.css
  • src/registrar/registration/location-information/location-information.component.css
  • src/registrar/registration/location-information/location-information.component.spec.ts
  • src/registrar/registration/other-information/other-information.component.css
  • src/registrar/registration/registration.component.spec.ts
  • src/registrar/search-dialog/search-dialog.component.css
  • src/registrar/search-family/search-family.component.css
Additional context used
Biome
src/registrar/generate-abha-component/generate-abha-component.component.spec.ts

[error] 15-19: Disallow duplicate setup and teardown hooks.

Disallow beforeEach duplicacy inside the describe function.

(lint/suspicious/noDuplicateTestHooks)

src/registrar/biometric-authentication/biometric-authentication.component.spec.ts

[error] 15-19: Disallow duplicate setup and teardown hooks.

Disallow beforeEach duplicacy inside the describe function.

(lint/suspicious/noDuplicateTestHooks)

src/registrar/dashboard/dashboard.component.ts

[error] 31-32: This constructor is unnecessary.

Unsafe fix: Remove the unnecessary constructor.

(lint/complexity/noUselessConstructor)

src/registrar/dashboard/dashboard.component.spec.ts

[error] 37-41: Disallow duplicate setup and teardown hooks.

Disallow beforeEach duplicacy inside the describe function.

(lint/suspicious/noDuplicateTestHooks)

src/registrar/search-dialog/search-dialog.component.spec.ts

[error] 37-41: Disallow duplicate setup and teardown hooks.

Disallow beforeEach duplicacy inside the describe function.

(lint/suspicious/noDuplicateTestHooks)

src/registrar/family-tagging/edit-family-tagging/edit-family-tagging.component.spec.ts

[error] 36-40: Disallow duplicate setup and teardown hooks.

Disallow beforeEach duplicacy inside the describe function.

(lint/suspicious/noDuplicateTestHooks)

src/registrar/beneficiary-details/beneficiary-details.component.spec.ts

[error] 36-40: Disallow duplicate setup and teardown hooks.

Disallow beforeEach duplicacy inside the describe function.

(lint/suspicious/noDuplicateTestHooks)

src/registrar/family-tagging/create-family-tagging/create-family-tagging.component.spec.ts

[error] 36-40: Disallow duplicate setup and teardown hooks.

Disallow beforeEach duplicacy inside the describe function.

(lint/suspicious/noDuplicateTestHooks)

src/registrar/family-tagging/family-tagging-details/family-tagging-details.component.spec.ts

[error] 36-40: Disallow duplicate setup and teardown hooks.

Disallow beforeEach duplicacy inside the describe function.

(lint/suspicious/noDuplicateTestHooks)

src/registrar/health-id-display-modal/health-id-display-modal.component.spec.ts

[error] 36-40: Disallow duplicate setup and teardown hooks.

Disallow beforeEach duplicacy inside the describe function.

(lint/suspicious/noDuplicateTestHooks)

src/registrar/health-id-otp-generation/health-id-otp-generation.component.spec.ts

[error] 36-40: Disallow duplicate setup and teardown hooks.

Disallow beforeEach duplicacy inside the describe function.

(lint/suspicious/noDuplicateTestHooks)

src/registrar/generate-mobile-otp-generation/generate-mobile-otp-generation.component.spec.ts

[error] 36-40: Disallow duplicate setup and teardown hooks.

Disallow beforeEach duplicacy inside the describe function.

(lint/suspicious/noDuplicateTestHooks)

src/registrar/family-tagging/family-tagging-details/family-tagging-details.component.css

[error] 54-54: Expected a compound selector but instead found '/'.

Expected a compound selector here.

(parse)


[error] 54-54: expected , but instead found deep

Remove deep

(parse)


[error] 54-54: expected , but instead found /

Remove /

(parse)


[error] 54-54: expected , but instead found .

Remove .

(parse)

src/registrar/beneficiary-details/beneficiary-details.component.ts

[error] 125-125: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)


[error] 161-161: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)

src/registrar/family-tagging/edit-family-tagging/edit-family-tagging.component.ts

[error] 244-246: Unnecessary use of boolean literals in conditional expression.

Simplify your code by directly assigning the result without using a ternary operator.
If your goal is negation, you may use the logical NOT (!) or double NOT (!!) operator for clearer and concise code.
Check for more details about NOT operator.
Unsafe fix: Remove the conditional expression with

(lint/complexity/noUselessTernary)


[error] 277-279: Unnecessary use of boolean literals in conditional expression.

Simplify your code by directly assigning the result without using a ternary operator.
If your goal is negation, you may use the logical NOT (!) or double NOT (!!) operator for clearer and concise code.
Check for more details about NOT operator.
Unsafe fix: Remove the conditional expression with

(lint/complexity/noUselessTernary)


[error] 317-317: Unnecessary use of boolean literals in conditional expression.

Simplify your code by directly assigning the result without using a ternary operator.
If your goal is negation, you may use the logical NOT (!) or double NOT (!!) operator for clearer and concise code.
Check for more details about NOT operator.
Unsafe fix: Remove the conditional expression with

(lint/complexity/noUselessTernary)

src/registrar/registration/personal-information/personal-information.component.ts

[error] 228-228: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)


[error] 724-724: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)


[error] 727-727: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)


[error] 733-733: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)


[error] 737-739: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)


[error] 742-744: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)


[error] 747-747: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)


[error] 750-751: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)


[error] 798-798: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)


[error] 807-807: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)


[error] 430-430: isNaN is unsafe. It attempts a type coercion. Use Number.isNaN instead.

See the MDN documentation for more details.
Unsafe fix: Use Number.isNaN instead.

(lint/suspicious/noGlobalIsNan)

src/registrar/registration/registration.component.ts

[error] 214-214: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)

LanguageTool
README.md

[uncategorized] ~3-~3: You might be missing the article “the” here.
Context: ... process across multiple AMRIT modules, registration page needs to be configurable based on ...

(AI_EN_LECTOR_MISSING_DETERMINER_THE)


[uncategorized] ~20-~20: The official spelling of this programming framework is “Node.js”.
Context: ...g the MMU service: * JDK 17 * Maven * Nodejs v18.10.0 * MySQL

(NODE_JS)

Additional comments not posted (270)
src/registrar/generate-abha-component/generate-abha-component.component.spec.ts (2)

1-24: LGTM!

The code changes are approved.

Tools
Biome

[error] 15-19: Disallow duplicate setup and teardown hooks.

Disallow beforeEach duplicacy inside the describe function.

(lint/suspicious/noDuplicateTestHooks)


15-19: Skip the static analysis hint.

The duplicate beforeEach blocks are not causing any issues in this case, as they serve different purposes. The first block configures the testing module, and the second block creates an instance of the component. This is a common pattern in Angular testing.

Tools
Biome

[error] 15-19: Disallow duplicate setup and teardown hooks.

Disallow beforeEach duplicacy inside the describe function.

(lint/suspicious/noDuplicateTestHooks)

src/registrar/biometric-authentication/biometric-authentication.component.spec.ts (1)

15-19: Ignore the static analysis hint about duplicate setup and teardown hooks.

The static analysis hint about disallowing duplicate setup and teardown hooks seems to be a false positive. There is only one beforeEach function defined in the test suite, which is a valid and common practice in Angular component tests.

Tools
Biome

[error] 15-19: Disallow duplicate setup and teardown hooks.

Disallow beforeEach duplicacy inside the describe function.

(lint/suspicious/noDuplicateTestHooks)

src/registrar/biometric-authentication/biometric-authentication.component.html (2)

1-9: LGTM!

The code segment for the title section with the close button looks good and follows Angular best practices.


10-26: LGTM, but verify the captureData() method implementation.

The code segment for the instructions and capture button looks good and follows Angular best practices.

However, ensure that the captureData() method is properly implemented in the component class to handle the fingerprint capture functionality.

src/registrar/generate-abha-component/auth-method.html (1)

34-34: LGTM!

The code changes are approved.

README.md (1)

5-7: LGTM!

The features section provides a clear and comprehensive list of the key functionalities of the registration page. The content is well-structured and easy to understand.

src/registrar/dashboard/dashboard.component.ts (2)

1-21: LGTM!

The license header is correctly formatted and contains all the necessary information.


23-24: LGTM!

The imports are correctly formatted and contain the necessary dependencies.

src/registrar/registration/consent-form/consent-form.component.html (2)

12-27: LGTM!

The code segment is structurally correct and follows good practices like having the content in both Hindi and English for accessibility and using a textFormat class for styling the paragraphs.


36-36: LGTM!

The code segment is structurally correct.

src/registrar/registration/abha-information/abha-information.component.html (3)

1-11: LGTM!

The code changes are approved.


13-22: LGTM!

The code changes are approved.


33-43: LGTM!

The code changes are approved.

src/registrar/registration-routing.module.ts (3)

1-8: LGTM!

The import statements are correctly defined and follow the Angular module structure. The imported entities are used in the routes defined later in the file.


9-42: LGTM!

The routes are correctly defined and follow the Angular routing conventions. The canDeactivate guard is correctly used to prevent accidental navigation from the registration page. The route parameters are correctly defined for the search and family tagging routes.


44-48: LGTM!

The RegistrationRoutingModule is correctly defined and follows the Angular module conventions. The RouterModule is correctly imported and exported with the defined routes.

src/registrar/dashboard/dashboard.component.spec.ts (1)

27-46: Test suite structure looks good!

The test suite for DashboardComponent is well-structured with setup code and a test case.

The static analysis error about duplicate setup hooks is a false positive and can be ignored. The two beforeEach hooks are performing different setup tasks - one for the testing module configuration and another for the component creation.

As a future enhancement, consider adding more test cases to verify the component behavior and interactions.

Tools
Biome

[error] 37-41: Disallow duplicate setup and teardown hooks.

Disallow beforeEach duplicacy inside the describe function.

(lint/suspicious/noDuplicateTestHooks)

src/registrar/search-dialog/search-dialog.component.spec.ts (3)

1-21: LGTM!

The license header is correctly added.


23-25: LGTM!

The imports are correctly added.


27-35: LGTM!

The test suite is correctly set up with the required configuration.

src/registrar/family-tagging/edit-family-tagging/edit-family-tagging.component.spec.ts (1)

36-40: Ignore the static analysis hint about duplicate setup hooks.

The setup code using beforeEach at line range 36-40 is not duplicated. The static analysis hint seems to be a false positive.

Tools
Biome

[error] 36-40: Disallow duplicate setup and teardown hooks.

Disallow beforeEach duplicacy inside the describe function.

(lint/suspicious/noDuplicateTestHooks)

src/registrar/beneficiary-details/beneficiary-details.component.spec.ts (1)

26-45: LGTM!

The test suite setup is correctly using TestBed to configure the testing module and create the component.

The static analysis hint about duplicate setup hooks is a false positive. The two beforeEach blocks serve different purposes - one to configure the testing module and the other to create the component.

Tools
Biome

[error] 36-40: Disallow duplicate setup and teardown hooks.

Disallow beforeEach duplicacy inside the describe function.

(lint/suspicious/noDuplicateTestHooks)

src/registrar/family-tagging/create-family-tagging/create-family-tagging.component.spec.ts (3)

1-21: License header looks good!

The license header is correctly formatted and specifies the GNU General Public License version 3 or later, which is an appropriate open-source license for the project.


22-24: Imports look good!

The file imports the necessary testing utilities from @angular/core/testing and the CreateFamilyTaggingComponent being tested.


26-40: Test suite setup looks good!

The test suite setup follows the standard pattern for Angular component tests:

  • It declares the component and fixture variables.
  • The beforeEach block configures the testing module with the necessary declarations and creates the component.

Note: The static analysis warning about duplicate setup hooks is a false positive, as there is only one beforeEach block.

Tools
Biome

[error] 36-40: Disallow duplicate setup and teardown hooks.

Disallow beforeEach duplicacy inside the describe function.

(lint/suspicious/noDuplicateTestHooks)

src/registrar/family-tagging/family-tagging-details/family-tagging-details.component.spec.ts (2)

1-21: LGTM!

The license header is correctly added.


26-45: LGTM!

The test suite is correctly defined with setup code and a placeholder test case.

Tools
Biome

[error] 36-40: Disallow duplicate setup and teardown hooks.

Disallow beforeEach duplicacy inside the describe function.

(lint/suspicious/noDuplicateTestHooks)

src/registrar/health-id-display-modal/health-id-display-modal.component.spec.ts (2)

26-45: Test suite structure looks good!

The test suite has a standard structure with setup and a placeholder test case. The code changes are approved.

Tools
Biome

[error] 36-40: Disallow duplicate setup and teardown hooks.

Disallow beforeEach duplicacy inside the describe function.

(lint/suspicious/noDuplicateTestHooks)


36-40: Ignore the static analysis error.

The static analysis error for duplicate setup hooks is a false positive. There is only one beforeEach block in the test suite. This error can be ignored.

Tools
Biome

[error] 36-40: Disallow duplicate setup and teardown hooks.

Disallow beforeEach duplicacy inside the describe function.

(lint/suspicious/noDuplicateTestHooks)

src/registrar/health-id-otp-generation/health-id-otp-generation.component.spec.ts (5)

1-21: LGTM!

The copyright header is correctly added.


22-24: LGTM!

The necessary dependencies for testing are correctly imported.


26-29: LGTM!

The describe block for the component is correctly defined.


30-34: LGTM!

The beforeEach block to configure the testing module is correctly defined.


42-44: LGTM!

The test case is correctly defined.

src/registrar/registration/personal-information/personal-information.component.css (3)

1-3: LGTM!

The code segment is approved.


9-11: LGTM!

The code segment is approved.


62-73: LGTM!

The code segment is approved.

src/registrar/generate-mobile-otp-generation/generate-mobile-otp-generation.component.spec.ts (1)

36-40: Ignore the duplicate setup hook hint from static analysis.

The static analysis hint about disallowing duplicate setup hooks appears to be a false positive. There is only one beforeEach block in this test suite, so there is no duplication.

Tools
Biome

[error] 36-40: Disallow duplicate setup and teardown hooks.

Disallow beforeEach duplicacy inside the describe function.

(lint/suspicious/noDuplicateTestHooks)

src/registrar/generate-abha-component/generate-abha-component.component.html (4)

1-10: LGTM!

The title section is correctly implemented.


12-30: LGTM!

The form section with the radio group for selecting the mode of ABHA generation is correctly implemented.


31-46: LGTM, but verify the custom directive.

The Aadhar number input field is correctly implemented.

However, the purpose of the myMobileNumber directive used on the input field is unclear from the provided context. Please ensure that this directive is intended to be used here and that it serves the correct purpose.


48-60: LGTM!

The "Generate" button is correctly implemented with the appropriate bindings and styles.

src/registrar/health-id-otp-generation/health-id-otp-succespopup.html (3)

1-48: LGTM! The section correctly displays the success messages and user actions.

The section is well-structured and uses Angular's template syntax correctly for conditional rendering and data binding. The success messages and user actions are displayed as expected.


49-75: LGTM! The section correctly displays the success messages and user actions.

The section is well-structured and uses Angular's template syntax correctly for conditional rendering and data binding. The success messages and user actions are displayed as expected.


43-43: Verify the implementation and usage of the fetchOtp function.

The fetchOtp function is triggered when the "Yes" button is clicked, but the implementation of this function is not provided in the HTML file.

Ensure that the fetchOtp function is correctly implemented in the corresponding TypeScript file and that it handles the ABHA and ABHA number arguments correctly.

Run the following script to verify the function usage:

Verification successful

The fetchOtp function is correctly implemented and used.

The fetchOtp function is defined in src/registrar/health-id-otp-generation/health-id-otp-generation.component.ts and handles the two arguments as expected. The function's implementation involves UI operations, which align with its usage in the HTML file.

  • Location of implementation: src/registrar/health-id-otp-generation/health-id-otp-generation.component.ts
Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the implementation and usage of the `fetchOtp` function.

# Test: Search for the function definition.
ast-grep --lang typescript --pattern $'fetchOtp($_, $_) {
  $$$
}'

# Test: Search for the function usage. Expect: Only occurrences with two arguments.
rg --type typescript -A 5 $'fetchOtp'

Length of output: 588


Script:

#!/bin/bash
# Corrected script to verify the implementation and usage of the `fetchOtp` function.

# Test: Search for the function definition with two parameters.
ast-grep --lang typescript --pattern 'function fetchOtp($_, $_) {
  $$$
}'

# Test: Search for the function usage. Expect: Only occurrences with two arguments.
rg --type ts -A 5 'fetchOtp'

Length of output: 764

src/registrar/registration/consent-form/consent-form.component.ts (1)

34-63: LGTM!

The ConsentFormComponent class looks good:

  • The constructor is correctly injecting the required dependencies.
  • The ngOnInit method is correctly calling the assignSelectedLanguage method.
  • The assignSelectedLanguage method is using the SetLanguageComponent to set the language and assign the current language object.
  • The closeConsent method is navigating to the search page and closing the dialog with the grant value.
  • The acceptConsent method is navigating to the registration page and closing the dialog with the grant value.

The code changes are approved.

src/registrar/registration/registration.component.css (1)

1-128: LGTM!

The CSS styles are well-organized, follow a consistent naming convention, use appropriate units for sizing and spacing, and are responsive. The code changes are approved.

src/registrar/generate-abha-component/generate-abha-component.component.css (15)

10-14: LGTM!

The code changes are approved.


18-20: LGTM!

The code changes are approved.


22-28: LGTM!

The code changes are approved.


29-35: LGTM!

The code changes are approved.


37-40: LGTM!

The code changes are approved.


42-49: LGTM!

The code changes are approved.


51-58: LGTM!

The code changes are approved.


60-62: LGTM!

The code changes are approved.


64-66: LGTM!

The code changes are approved.


68-72: LGTM!

The code changes are approved.


74-77: LGTM!

The code changes are approved.


78-93: LGTM!

The code changes are approved.


94-96: LGTM!

The code changes are approved.


98-108: LGTM!

The code changes are approved.


110-119: LGTM!

The code changes are approved.

src/registrar/generate-mobile-otp-generation/generate-mobile-otp-generation.component.html (4)

1-10: LGTM!

The code changes are approved.


13-17: LGTM!

The code changes are approved.


20-59: LGTM!

The code changes are approved.


61-99: LGTM!

The code changes are approved.

src/registrar/health-id-validatepopup/health-id-validatepopup.component.css (20)

1-3: LGTM!

The code changes are approved.


5-9: LGTM!

The code changes are approved.


11-20: LGTM!

The code changes are approved.


21-24: LGTM!

The code changes are approved.


26-30: LGTM!

The code changes are approved.


32-36: LGTM!

The code changes are approved.


38-40: LGTM!

The code changes are approved.


41-56: LGTM!

The code changes are approved.


57-59: LGTM!

The code changes are approved.


60-64: LGTM!

The code changes are approved.


66-76: LGTM!

The code changes are approved.


78-81: LGTM!

The code changes are approved.


83-93: LGTM!

The code changes are approved.


95-105: LGTM!

The code changes are approved.


107-115: LGTM!

The code changes are approved.


117-120: LGTM!

The code changes are approved.


122-126: LGTM!

The code changes are approved.


128-141: LGTM!

The code changes are approved.


143-148: LGTM!

The code changes are approved.


150-155: LGTM!

The code changes are approved.

src/registrar/registration/location-information/location-information.component.html (6)

1-4: LGTM!

The template structure and form setup using Angular's reactive forms look good. Dynamically rendering form fields based on the formData array allows for flexibility.


6-16: LGTM!

The text input field rendering using <mat-form-field> and <input matInput> looks good. The form control binding and validations for required, min length, and max length are correctly implemented.


18-23: LGTM!

The date input field rendering using <mat-form-field> and <input matInput [matDatepicker]> looks good. The form control binding and required validation are correctly implemented.


25-32: LGTM!

The multiple select field rendering using <mat-form-field> and <mat-select multiple> looks good. The form control binding, required validation, and option rendering using <mat-option> with *ngFor are correctly implemented.


34-42: LGTM!

The radio button group rendering using <mat-radio-group> and <mat-radio-button> looks good. The form control binding, required validation, option rendering using <mat-radio-button> with *ngFor, and conditional label rendering are correctly implemented.


44-51: LGTM!

The dropdown field rendering using <mat-form-field> and <mat-select> looks good. The form control binding, required validation, and option rendering using <mat-option> with *ngFor are correctly implemented.

src/registrar/registration/other-information/other-information.component.ts (3)

1-18: LGTM!

The imports and component metadata are properly defined.


39-62: LGTM!

The ngOnInit method is properly implemented and follows Angular best practices.


85-117: LGTM!

The remaining methods and lifecycle hooks are properly implemented and follow Angular best practices.

src/registrar/search/search.component.css (21)

1-3: LGTM!

The code segment is correctly setting the table width to 100%.


5-7: LGTM!

The code segment is correctly right aligning the text in the md2-pagination element.


11-13: LGTM!

The code segment is correctly setting the height of the element with class spacer to 10px.


15-18: LGTM!

The code segment is correctly setting the minimum height of mat-card to 403px and padding to 15px.


20-22: LGTM!

The code segment is correctly setting the margin of the element with class pagination to 0.


24-26: LGTM!

The code segment is correctly setting the width of md-input-container elements within an element with id topRow to 60%.


28-31: LGTM!

The code segment is correctly setting the width of the element with id quickSearch to 40% and floating it to the right.


33-37: LGTM!

The code segment is correctly setting the margin of elements with class adv-button to 0 10px, width to 26%, and border-color to unset.


39-41: LGTM!

The code segment is correctly setting the left margin of button elements within an element with class buttonGrp to 5px.


43-54: LGTM!

The code segment is correctly styling the element with class searchBox by setting the background color, minimum height, overflow, border radius, border width, margin, box shadow, and width properties.


56-58: LGTM!

The code segment is correctly setting the font weight of elements with class search_icon to bold.


60-70: LGTM!

The code segment is correctly styling the elements with class search_button by setting the padding, width, minimum height, background, border, transform, transition, outline, and color properties.


72-75: LGTM!

The code segment is correctly removing the outline and border of elements with class search_button when they are active.


77-82: LGTM!

The code segment is correctly styling the elements with class search_textbox by setting the width, height, border, and padding-left properties.


84-86: LGTM!

The code segment is correctly setting the bottom margin of the element with id search_type to -1px.


88-93: LGTM!

The code segment is correctly styling the elements with class search_button when they are hovered by setting the transform and transition properties and removing the outline and border.


95-112: LGTM!

The code segment is correctly adjusting the styles for screens with a maximum width of 481px by:

  • Setting the margin and width of elements with classes adv-button, mat-button, mat-icon-button, and mat-raised-button.
  • Setting the width of md-input-container elements within an element with id topRow to 100%.
  • Setting the width of the element with id quickSearch to 100%.

114-116: LGTM!

The code segment is correctly setting the top margin of elements with class totalCount to 10px.


118-121: LGTM!

The code segment is correctly setting the color of placeholder text in input elements to gray with an opacity of 1 using the WebKit vendor prefix.


123-127: LGTM!

The code segment is correctly setting the color of placeholder text in input elements to gray with an opacity of 1 using the standard ::placeholder pseudo-element.


129-133: LGTM!

The code segment is correctly setting the color of placeholder text in input elements to gray with an opacity of 1 using the Microsoft vendor prefix for Internet Explorer 10-11.

src/registrar/health-id-otp-generation/health-id-otp-generation.component.html (2)

1-89: LGTM!

The code changes for entering mobile number for OTP generation are approved.


91-141: LGTM!

The code changes for entering OTP for health ID generation are approved.

src/registrar/registration/other-information/other-information.component.html (3)

2-65: LGTM! The dynamic form generation and field rendering looks good.

The form is correctly bound to the otherInfoFormGroup and the form fields are dynamically generated based on the formData array. The supported field types are rendered correctly.

The template is clean and readable.


8-15: LGTM! The form validation looks good.

The form validation is implemented correctly using Angular's reactive forms. The required, min length, and max length validations are applied based on the properties of each formData item.

The validation error messages are displayed correctly using <mat-error> elements.


1-67: LGTM! The form is accessible and user-friendly.

The form fields are properly labeled using <mat-label> elements and the placeholder attribute is used to provide additional hints to the user.

The readonly attribute is correctly used on the date field to prevent direct input and enforce selection through the date picker.

Overall, the form is accessible and provides a good user experience.

src/registrar/registration/personal-information/personal-information.component.html (5)

3-33: LGTM!

The image capture section is implemented correctly.


38-51: LGTM!

The text input fields are implemented correctly with proper bindings and validations.


53-58: LGTM!

The date input fields are implemented correctly with proper bindings and date picker functionality.


60-67: LGTM!

The multiple select fields are implemented correctly with proper bindings and dynamic options.


69-77: LGTM!

The radio button fields are implemented correctly with proper bindings and dynamic options.

src/registrar/family-tagging/create-family-tagging/create-family-tagging.component.html (3)

4-4: Great job using currentLanguageSet for localization!

The usage of currentLanguageSet object to display localized text for labels, placeholders, and error messages is a good practice. The safe navigation operator ?. is used correctly to avoid errors when currentLanguageSet or its properties are undefined. The localized text is also separated into logical groups like common for reusability.

Also applies to: 36-36, 39-39, 106-106, 109-109


7-12: Excellent usage of Angular Material components!

The template uses various Angular Material components like mat-icon, mat-form-field, mat-label, mat-select, mat-option, mat-error, and mat-dialog-actions to create a consistent and visually appealing UI. The usage of these components is a good practice as they provide a set of reusable and accessible UI components that follow Material Design guidelines. The components are used correctly with proper bindings and event handlers.

Also applies to: 20-41, 45-61, 67-86, 90-111, 117-133


17-17: Great usage of template-driven forms!

The template uses template-driven forms approach with ngModel for two-way data binding. The form fields are bound correctly to component properties using [(ngModel)]. The form validation is done correctly using required attribute and minlength and maxlength validators. The submit button is also disabled correctly when the form is invalid using [disabled]="newFamilyTaggingForm.invalid". Overall, the usage of template-driven forms is a good practice for simple forms with basic validation requirements.

Also applies to: 24-34, 49-60, 72-85, 94-110, 125-132

src/registrar/registration.module.ts (4)

1-106: LGTM!

The registration module is well-structured and organized. It follows the Angular best practices and conventions.

The module encapsulates the registration feature and its related components and services. It imports the necessary dependencies and exports the required components.

The code changes are approved.


41-66: LGTM!

The component declarations in the registration module are complete and correct. All the necessary components related to the registration feature are declared and exported.

The code changes are approved.


67-78: LGTM!

The module imports in the registration module are complete and correct. The module imports all the necessary Angular modules and custom modules required for the functionality of the registration feature.

There are no unused or unnecessary module imports.

The code changes are approved.


99-104: LGTM!

The service providers in the registration module are complete and correct. The module provides all the necessary services required by the components in the registration module.

There are no unused or unnecessary service providers.

The code changes are approved.

src/registrar/search-family/search-family.component.html (2)

23-143: LGTM!

The form fields and their bindings are implemented correctly:

  • The form fields are bound to the familySearchForm FormGroup using the formGroup directive.
  • The form fields are bound to the corresponding FormControl using the formControlName directive.
  • The form fields are populated with data from the component class using the *ngFor directive.
  • The form fields have appropriate validation attributes such as required, minlength, and maxlength.
  • The form fields have appropriate error messages for validation errors.

145-154: LGTM!

The form submission is implemented correctly:

  • The form submission is triggered by the search button click event.
  • The search button is disabled until the form is valid using the [disabled] directive.
  • The search button click event is bound to the getFamilySearchMaster() method in the component class.
src/registrar/generate-abha-component/generate-abha-component.component.ts (1)

130-166: LGTM!

The component follows Angular's best practices and has no major issues.

src/registrar/health-id-validatepopup/health-id-validatepopup.component.html (2)

1-65: LGTM!

The OTP validation section is implemented correctly using Angular's reactive forms and validation attributes. The form submission is handled based on certain conditions. The code follows Angular best practices and there are no apparent issues.


67-153: LGTM!

The ABHA card search section is implemented correctly using Angular's reactive forms and validation attributes. The search functionality is handled based on certain conditions. The code follows Angular best practices and there are no apparent issues.

src/registrar/registration/registration.component.html (4)

5-14: LGTM!

The "Family Tagging" button code looks good. It is displayed conditionally based on the patientRevisit and serviceLine variables, and has the correct click event to navigate to the family tagging page.


17-19: LGTM!

The form and stepper structure looks good:

  • Using Angular's reactive forms with formGroup binding is a good practice.
  • Dividing the form into multiple steps using mat-horizontal-stepper enhances maintainability and user experience.
  • Conditionally displaying steps based on enableXXXInfo variables provides flexibility.

28-29: LGTM!

Using child components for each step of the form is a good approach:

  • It promotes component reusability and maintainability.
  • It keeps the parent component clean and focused.
  • Passing necessary inputs (form group, form data, flags, etc.) to the child components ensures they have the required data and context.

Also applies to: 51-52, 76-77, 102-102


34-38: LGTM!

The form submission and navigation buttons are implemented correctly:

  • Conditional display of "Next" and "Back" buttons based on the current step and enableXXXInfo variables provides a clear navigation flow.
  • Having separate "Submit" and "Update" buttons for new registration and patient revisit, respectively, is a good practice.
  • Disabling the "Submit" and "Update" buttons when the form is invalid ([disabled]="!mainForm.valid") prevents submitting incomplete or incorrect data.

Also applies to: 57-60, 82-85, 107-110

src/registrar/beneficiary-details/beneficiary-details.component.html (2)

1-100: LGTM!

The code segment is well-structured and follows Angular template syntax. It effectively uses *ngIf to conditionally render the beneficiary details based on benFlowStatus. The table structure provides a clear presentation of the beneficiary details.


101-202: LGTM!

The code segment is well-structured and follows a similar pattern to the previous one. It effectively handles the case when benFlowStatus is false and displays additional details. The use of the titlecase pipe and the handling of null/undefined values for the family ID are good practices.

src/registrar/search-dialog/search-dialog.component.html (1)

1-196: LGTM!

The search dialog component template looks good:

  • It follows a structured layout using rows and columns for organizing the form fields.
  • It leverages Angular Material components for a consistent and visually appealing UI.
  • The use of reactive forms enables form validation and easier form submission handling.
  • Internationalization is implemented for language localization.
  • The code is readable and follows Angular best practices.
  • The form submission is disabled until the form is valid, ensuring data integrity.

The component appears to be a standalone dialog for searching beneficiaries based on the provided criteria.

The code changes are approved.

src/registrar/family-tagging/create-family-tagging/create-family-tagging.component.ts (12)

1-21: License header looks good!

The GNU GPL license header is complete and follows the standard format.


30-35: Component metadata and class declaration look good!

  • The component metadata is defined correctly with the selector, template, and styles.
  • The component class is declared properly and implements the necessary lifecycle hooks.

59-66: Component constructor looks good!

  • The constructor parameters are properly typed and follow the Angular dependency injection pattern.
  • The injected dependencies are valid and commonly used in Angular components.

68-78: ngOnInit method looks good!

  • Initializing component properties and performing necessary setup in ngOnInit follows the Angular component lifecycle.
  • Calling the CreatenewFamilyTaggingForm method to set up the form is a valid approach.
  • Invoking the getSurname and getRelationShipMaster methods to fetch data is appropriate in ngOnInit.

80-82: ngDoCheck method looks good!

  • Implementing the ngDoCheck lifecycle hook is a valid approach for detecting changes in the component.
  • Calling the assignSelectedLanguage method in ngDoCheck ensures that the language is updated whenever there are changes.

84-88: assignSelectedLanguage method looks good!

  • The method is responsible for setting the selected language for the component.
  • Creating an instance of SetLanguageComponent and calling its setLanguage method is a valid approach for language setup.
  • Assigning the currentLanguageObject to the component's currentLanguageSet property ensures that the current language is accessible in the component.

90-97: CreatenewFamilyTaggingForm method looks good!

  • The method is responsible for creating the form group for the family tagging form.
  • Using the FormBuilder to create the form group is a common and recommended approach in Angular.
  • The form group contains the necessary form controls for family tagging.

99-102: ResetForm method looks good!

  • The method is responsible for resetting the family tagging form.
  • Calling the reset method on the form is a valid approach to clear the form controls.
  • Setting the enableOther property to false ensures that the "other" field is disabled when the form is reset.

104-106: getSurname method looks good!

  • The method is responsible for retrieving the surname for the family tagging form.
  • Assigning the value of benFamilyName to the familyName property is a straightforward way to set the surname.

108-148: createNewFamilyTagging method looks good!

  • The method is responsible for creating a new family tagging by sending a request to the server.
  • Constructing the request object with the necessary data is a valid approach.
  • Using the familyTaggingService to send the request follows the Angular service pattern.
  • Handling the response and displaying messages using the confirmationService is a good practice for user feedback.

150-163: getRelationShipMaster method looks good!

  • The method is responsible for retrieving the relationship master data from the server.
  • Using the familyTaggingService to make the API call follows the Angular service pattern.
  • Handling the response and assigning the data to the relationShipType property is a valid approach.
  • Displaying an error message using the confirmationService is a good practice for user feedback.

165-187: populateRelation method looks good!

  • The method is responsible for populating the relationship options based on the isHead value.
  • The logic for filtering the relationShipType based on the isHead value is implemented correctly.
  • Assigning the filtered items to the relationShipList and relationWithHeadOfFamily is a valid approach.
  • The method clears the relationShipList, enableOther, and otherRelation properties before populating the relationships.
src/registrar/family-tagging/edit-family-tagging/edit-family-tagging.component.html (1)

1-215: LGTM!

The HTML template for the EditFamilyTaggingComponent is well-structured and follows Angular best practices. It uses appropriate Angular Material components for the form and table. The form has proper validation and disabling of the save button. The code is readable and maintainable.

src/registrar/generate-mobile-otp-generation/generate-mobile-otp-generation.component.ts (7)

1-21: License header looks good.

The GNU General Public License version 3 license header is correctly formatted and contains the necessary information.


60-65: ngOnInit method looks good.

The ngOnInit method correctly initializes the component by:

  • Assigning the selected language.
  • Initializing the txnId and bioVal properties from the injected data.
  • Initializing the generateMobileOTPForm property by calling the createmobileOTPValidationForm method.

67-69: ngDoCheck method looks good.

The ngDoCheck method correctly calls the assignSelectedLanguage method.


70-74: assignSelectedLanguage method looks good.

The assignSelectedLanguage method correctly assigns the selected language by:

  • Creating an instance of SetLanguageComponent and calling its setLanguage method.
  • Assigning the currentLanguageObject property of SetLanguageComponent to the currentLanguageSet property of the component.

76-81: createmobileOTPValidationForm method looks good.

The createmobileOTPValidationForm method correctly creates a form group for mobile OTP validation using the FormBuilder service with mobileNo and mobileOtp form controls.


83-85: closeDialog method looks good.

The closeDialog method correctly closes the dialog by calling the close method of the MatDialogRef service.


161-184: resendOTP method looks good.

The resendOTP method correctly resends the OTP by:

  • Setting the showProgressBar property to true.
  • Creating a request object with the mobile number and transaction ID.
  • Calling the checkAndGenerateMobileOTPHealthId method of the RegistrarService with the request object.
  • Setting the showProgressBar property to false if the response status code is 200 and the response data is truthy.
  • Showing an error message using the ConfirmationService if the response status code is not 200.
src/registrar/beneficiary-details/beneficiary-details.component.ts (9)

1-21: Copyright header looks good.

The copyright header follows the standard format and specifies the correct license.


42-103: Lifecycle hooks usage looks good.

The component correctly implements and uses the OnInit, DoCheck, and OnDestroy lifecycle hooks.


61-68: Service dependencies look good.

The component is injecting the necessary services through the constructor to retrieve and manage data.


105-130: Beneficiary details retrieval looks good.

The component is using the BeneficiaryDetailsService to retrieve the beneficiary details and image. The usage of observables and subscriptions is correct.

Tools
Biome

[error] 125-125: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)


132-165: Family details retrieval looks good.

The component is using the RegistrarService to retrieve the beneficiary family details and the BeneficiaryDetailsService to retrieve the beneficiary image. The usage of observables and subscriptions is correct.

Tools
Biome

[error] 161-161: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)


167-231: Health ID details retrieval looks good.

The component is using the RegistrarService to retrieve the beneficiary health ID details. The processing of the retrieved data and error handling using the ConfirmationService is implemented correctly.


92-96: Language assignment looks good.

The component is using the SetLanguageComponent to set the language and assign the current language object correctly.


98-103: Subscription management looks good.

The component is unsubscribing from the subscriptions in the ngOnDestroy hook to prevent memory leaks.


125-125: Skipping static analysis hints.

The suggestions to change to optional chaining are not applicable here. The code is already handling the case when data is undefined using an if condition.

Also applies to: 161-161

Tools
Biome

[error] 125-125: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)

src/registrar/biometric-authentication/biometric-authentication.component.ts (7)

1-15: Imports look good.

The imported components, services, and operators seem relevant to the component's functionality. No unused imports detected.


17-21: Component metadata is properly defined.

The selector, template, and styles are correctly specified in the @Component decorator.


22-42: Component class and constructor look good.

The component class is properly defined with relevant properties. The constructor injects the necessary dependencies for the component's functionality.


44-49: ngOnInit method is properly implemented.

The ngOnInit method correctly initializes the aadharBioNum and healthDataNum properties from the data object passed to the component.


51-58: ngDoCheck and assignSelectedLanguage methods look good.

The ngDoCheck method correctly calls the assignSelectedLanguage method to set the current language using the SetLanguageComponent service.


107-123: generateMobileOTPForBio method is properly implemented.

The method correctly generates a mobile OTP for biometric authentication by opening a dialog using the GenerateMobileOtpGenerationComponent and passing the necessary data. The dialog close event is handled appropriately, and the posthealthIDButtonCall method is called with the response.


233-235: closeDialog method is properly implemented.

The method correctly closes the dialog using the close method of the MatDialogRef.

src/registrar/search-dialog/search-dialog.component.ts (2)

1-21: License header looks good.

The license header contains the necessary information about the AMRIT project, copyright, and license terms.


23-47: Imports look good.

The imports are correctly formatted and organized. The custom module imports use relative paths.

src/registrar/family-tagging/family-tagging-details/family-tagging-details.component.html (1)

1-250: LGTM!

The Angular template code looks good overall:

  • The structure and usage of Angular Material components like mat-sidenav, mat-table, and mat-paginator are correct.
  • The template bindings to component properties and event handlers are used correctly.
  • The usage of structural directives like *ngIf and *ngFor is correct.
  • Accessibility attributes are used on relevant elements.
  • The mat-table and mat-paginator usage looks fine.

No major issues or improvements identified. Good job!

src/registrar/search-family/search-family.component.ts (3)

1-21: LGTM!

The license header is correctly formatted and contains the necessary information.


123-125: LGTM!

The code changes are approved.


127-135: LGTM!

The code changes are approved.

src/registrar/family-tagging/edit-family-tagging/edit-family-tagging.component.ts (7)

73-86: LGTM!

The code changes are approved.


98-113: LGTM!

The code changes are approved.


115-137: LGTM!

The code changes are approved.


140-153: LGTM!

The code changes are approved.


155-177: LGTM!

The code changes are approved.


201-303: LGTM!

The code changes are approved.

Tools
Biome

[error] 244-246: Unnecessary use of boolean literals in conditional expression.

Simplify your code by directly assigning the result without using a ternary operator.
If your goal is negation, you may use the logical NOT (!) or double NOT (!!) operator for clearer and concise code.
Check for more details about NOT operator.
Unsafe fix: Remove the conditional expression with

(lint/complexity/noUselessTernary)


[error] 277-279: Unnecessary use of boolean literals in conditional expression.

Simplify your code by directly assigning the result without using a ternary operator.
If your goal is negation, you may use the logical NOT (!) or double NOT (!!) operator for clearer and concise code.
Check for more details about NOT operator.
Unsafe fix: Remove the conditional expression with

(lint/complexity/noUselessTernary)


305-340: LGTM!

The code changes are approved.

Tools
Biome

[error] 317-317: Unnecessary use of boolean literals in conditional expression.

Simplify your code by directly assigning the result without using a ternary operator.
If your goal is negation, you may use the logical NOT (!) or double NOT (!!) operator for clearer and concise code.
Check for more details about NOT operator.
Unsafe fix: Remove the conditional expression with

(lint/complexity/noUselessTernary)

src/registrar/health-id-display-modal/health-id-display-modal.component.html (5)

1-30: LGTM!

The code segment for the modal dialog header looks good. It correctly uses *ngIf to conditionally display the title and progress bar overlay.


31-105: LGTM!

The code segment for displaying the health ID details table is implemented correctly. It properly uses Angular Material table directives and bindings. The conditional rendering of the table and "No record found" message is handled appropriately.


106-194: LGTM!

The code segment for displaying the health ID details table with the action column is implemented correctly. It follows the Angular Material table structure and uses appropriate directives and bindings. The print button in the action column is handled properly. The conditional rendering of the "No record found" message is also in place.


195-308: LGTM!

The code segment for mapping health ID to care context is implemented correctly. It uses Angular Material table directives and bindings appropriately. The radio buttons for selecting a health ID and the conditional enabling of the "Generate OTP" button are handled properly. The "No record found" message is displayed when the data source is empty, which is a good practice.


311-361: LGTM!

The code segment for the OTP form is implemented correctly. It uses Angular reactive forms with appropriate directives and validation attributes. The submit button is conditionally enabled based on form validity and OTP check, which is a good practice. The cancel button for resending the OTP is also implemented properly.

src/registrar/search/search.component.html (5)

1-34: Search box implementation looks good!

The search box is correctly implemented using an input field and a button. The search term is bound to the component using [(ngModel)] and the search is triggered on the enter key press or button click.


35-101: Buttons implementation looks good!

The buttons are correctly implemented. The Fingerprint Search button is hidden, the Registration button navigates to the registration page, and the Advance Search button opens a search dialog.


104-360: Beneficiary list table implementation looks good!

The beneficiary list table is correctly implemented using Angular Material's mat-table. It has a search box to filter the list, displays various columns, has an edit button for each row, and the rows are clickable to navigate to the beneficiary details page. The table also has a paginator to paginate the results.


297-317: ABHA address column implementation looks good!

The ABHA address column is correctly implemented with a button to view the health ID details. The button is implemented using Angular Material's mat-raised-button and the click event triggers the getHealthIDDetails function.


319-336: Image column implementation looks good!

The image column is correctly implemented to display a default avatar image. The image is clickable to view the patient's image and the click event triggers the patientImageView function.

src/registrar/family-tagging/family-tagging-details/family-tagging-details.component.ts (16)

1-21: LGTM!

The GNU General Public License version 3 header is correctly formatted and contains the necessary information.


41-45: LGTM!

The component metadata is correctly defined.


46-48: LGTM!

The component class is correctly defined and implements the necessary lifecycle hooks.


110-213: LGTM!

The ngOnInit method is correctly implemented and performs the necessary initialization actions.


215-217: LGTM!

The ngDoCheck method is correctly implemented.


219-223: LGTM!

The ngOnDestroy method is correctly implemented and performs the necessary cleanup actions.


225-229: LGTM!

The assignSelectedLanguage method is correctly implemented.


231-258: LGTM!

The CreateFamilyDialog method is correctly implemented and performs the necessary actions based on the dialog result.


260-268: LGTM!

The sideNavModeChange method is correctly implemented.


270-294: LGTM!

The openSearchFamily method is correctly implemented and performs the necessary actions based on the dialog result.


296-314: LGTM!

The loadSearchDetails method is correctly implemented and handles the service response.


316-323: LGTM!

The PatientRevistData method is correctly implemented.


325-327: LGTM!

The backToRegistration method is correctly implemented.


329-347: LGTM!

The getFamilyMembers method is correctly implemented and handles the service response.


349-370: LGTM!

The openFamilyTagDialog method is correctly implemented and performs the necessary actions based on the dialog result.


372-400: LGTM!

The getBeneficiaryDetailsAfterFamilyTag method is correctly implemented and handles the service response.

src/registrar/health-id-display-modal/health-id-display-modal.component.ts (18)

1-21: LGTM!

The GNU General Public License header is correctly added at the beginning of the file.


46-78: LGTM!

The component metadata is correctly defined with the selector, template, styles, and custom providers for date formatting.


80-118: LGTM!

The component class properties are correctly defined to store the component state and data.


119-130: LGTM!

The constructor is correctly defined and injects the necessary dependencies. The dialog reference is also configured to disable close.


132-179: LGTM!

The ngOnInit method is correctly defined and initializes the component state and data. The input data is parsed and processed as expected.


181-188: LGTM!

The ngDoCheck and assignSelectedLanguage methods are correctly defined and work together to set the current language.


189-193: LGTM!

The createOtpGenerationForm method is correctly defined and creates the OTP generation form using the form builder.


194-204: LGTM!

The createList method is correctly defined and creates a list of health IDs from the beneficiary details. The creation date of each health ID is formatted as expected.


206-208: LGTM!

The onRadioChange method is correctly defined and updates the selected health ID based on the radio button change.


209-245: LGTM!

The generateOtpForMapping method is correctly defined and generates an OTP for mapping the care context. The API call to the registrar service is made and the response is handled appropriately.


246-252: LGTM!

The numberOnly method is correctly defined and validates that only numeric characters are allowed in the input.


253-269: LGTM!

The checkOTP method is correctly defined and validates the OTP entered by the user. The length and characters of the OTP are checked as expected.


270-275: LGTM!

The isLetter and is_numeric methods are correctly defined and perform their respective validations.


277-319: LGTM!

The verifyOtp method is correctly defined and verifies the OTP entered by the user. The API call to the registrar service is made and the response is handled appropriately.


320-324: LGTM!

The resendOtp method is correctly defined and resets the OTP form and generates a new OTP as expected.


325-327: LGTM!

The closeDialog method is correctly defined and closes the dialog as expected.


329-345: LGTM!

The openDialogForprintHealthIDCard method is correctly defined and opens a dialog to print the health ID card. The necessary data is passed to the dialog as expected.


347-418: LGTM!

The printHealthIDCard method is correctly defined and generates and prints the health ID card. The API call to the registrar service is made and the response is handled appropriately. The dialog to print the health ID card is opened as expected.

src/registrar/health-id-validatepopup/health-id-validatepopup.component.ts (19)

51-74: LGTM!

The code changes are approved.


76-88: LGTM!

The code changes are approved.


90-92: LGTM!

The code changes are approved.


93-97: LGTM!

The code changes are approved.


98-104: LGTM!

The code changes are approved.


105-109: LGTM!

The code changes are approved.


110-115: LGTM!

The code changes are approved.


116-118: LGTM!

The code changes are approved.


120-136: LGTM!

The code changes are approved.


138-252: LGTM!

The code changes are approved.


254-256: LGTM!

The code changes are approved.


257-259: LGTM!

The code changes are approved.


260-354: LGTM!

The code changes are approved.


356-379: LGTM!

The code changes are approved.


380-387: LGTM!

The code changes are approved.


388-400: LGTM!

The code changes are approved.


401-470: LGTM!

The code changes are approved.


471-516: LGTM!

The code changes are approved.


517-533: LGTM!

The code changes are approved.

src/registrar/registration/personal-information/personal-information.component.ts (9)

29-58: Component metadata looks good.

The component selector, template, styles, and providers are properly defined.


60-82: Input properties and local variables are properly defined.

The input properties are decorated with @Input() to receive data from the parent component. The local variables are used to store data used within the component.


83-108: Constructor is properly defined.

The constructor injects the required services and subscribes to the registrationABHADetails$ observable to update the form values based on the received response.


110-144: ngOnInit method is properly implemented.

The method sets up the form controls based on the formData array, handles the revisit mode by patching the form values, and calls the setupFormValueChanges method to set up form value change subscriptions.


152-156: setDateLimits method is properly implemented.

The method sets the today and minDate properties based on the current date and the ageLimit to define the date limits for the calendar and age validation.


179-187: onInputChanged method is properly implemented.

The method handles the input value change and restricts the input value length based on the provided maxLength.


189-200: captureImage method is properly implemented.

The method captures the beneficiary image using the cameraService and updates the form values accordingly.


206-218: loadMasterDataObservable method is properly implemented.

The method loads the master data observable, assigns the response to the masterData property, and calls the loadPersonalDataForEditing method if the component is in revisit mode.


225-235: loadPersonalDataForEditing method is properly implemented.

The method loads the personal data for editing, assigns the response to the revisitData property, validates the marital status master, pushes the editing data to the form, and gets the beneficiary image.

Tools
Biome

[error] 228-228: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)

src/registrar/registration/registration.component.ts (3)

1-13: Import statements look good!

The import statements are properly organized and follow a consistent pattern. No unused imports were reported by the static analysis tools.


42-63: Constructor implementation looks good!

The constructor properly injects the required dependencies and initializes the mainForm using the FormBuilder. The use of FormBuilder is a good practice for creating reactive forms.


72-111: Validator methods implementation looks good!

The minValidator, maxValidator, and allowTextValidator methods are implemented correctly and provide useful validation functionality for form controls. They follow the expected signature for custom validators in Angular reactive forms.

Comment on lines +25 to +32
@Component({
selector: 'app-dashboard',
templateUrl: './dashboard.component.html',
styleUrls: ['./dashboard.component.css'],
})
export class DashboardComponent {
constructor() {}
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remove the unnecessary constructor.

The component class has an empty constructor, which is unnecessary and can be removed.

Apply this diff to remove the unnecessary constructor:

 export class DashboardComponent {
-  constructor() {}
 }
Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
@Component({
selector: 'app-dashboard',
templateUrl: './dashboard.component.html',
styleUrls: ['./dashboard.component.css'],
})
export class DashboardComponent {
constructor() {}
}
@Component({
selector: 'app-dashboard',
templateUrl: './dashboard.component.html',
styleUrls: ['./dashboard.component.css'],
})
export class DashboardComponent {
}
Tools
Biome

[error] 31-32: This constructor is unnecessary.

Unsafe fix: Remove the unnecessary constructor.

(lint/complexity/noUselessConstructor)

Comment on lines 23 to 32
<button
id="moveToPrintHealthIDCard"
style="margin: 5px"
mat-raised-button
color="primary"
class="full-width-login pull-right m-r-5 mat_blue"
(click)="generateAbhaCard()"
>
Generate ABHA Card
</button>
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fix the duplicate id.

The button has the same id as the second button, which could lead to unexpected behavior.

Apply this diff to fix the issue:

-<button
-id="moveToPrintHealthIDCard"
+<button
+id="moveToGenerateHealthIDCard"
 style="margin: 5px"
 mat-raised-button
 color="primary"
 class="full-width-login  pull-right m-r-5 mat_blue"
 (click)="generateAbhaCard()"
>
 Generate ABHA Card
</button>
Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
<button
id="moveToPrintHealthIDCard"
style="margin: 5px"
mat-raised-button
color="primary"
class="full-width-login pull-right m-r-5 mat_blue"
(click)="generateAbhaCard()"
>
Generate ABHA Card
</button>
<button
id="moveToGenerateHealthIDCard"
style="margin: 5px"
mat-raised-button
color="primary"
class="full-width-login pull-right m-r-5 mat_blue"
(click)="generateAbhaCard()"
>
Generate ABHA Card
</button>

Comment on lines +43 to +45
it('should be created', () => {
expect(component).toBeTruthy();
});
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reminder: Add actual tests.

The current test case is a placeholder. Please add actual tests to verify the functionality of the SearchDialogComponent.

Do you want me to generate some test cases or open a GitHub issue to track this task?

Comment on lines +26 to +45
describe('EditFamilyTaggingComponent', () => {
let component: EditFamilyTaggingComponent;
let fixture: ComponentFixture<EditFamilyTaggingComponent>;

beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [EditFamilyTaggingComponent],
}).compileComponents();
}));

beforeEach(() => {
fixture = TestBed.createComponent(EditFamilyTaggingComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});

it('should create', () => {
expect(component).toBeTruthy();
});
});
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Add more test cases.

The current test suite only checks if the component is created. It's missing test cases for the component's behavior.

Consider adding test cases to cover the following scenarios:

  • Test the component's initialization.
  • Test the component's interaction with the template.
  • Test the component's methods.
  • Test the component's input and output properties.
  • Test the component's error handling.

Do you want me to generate the additional test cases or open a GitHub issue to track this task?

Tools
Biome

[error] 36-40: Disallow duplicate setup and teardown hooks.

Disallow beforeEach duplicacy inside the describe function.

(lint/suspicious/noDuplicateTestHooks)

Comment on lines +42 to +44
it('should create', () => {
expect(component).toBeTruthy();
});
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Add more test cases.

The single test case is just checking if the component is created.

Consider adding more test cases to verify the behavior and rendering of the component.

Do you want me to generate additional test cases or open a GitHub issue to track this task?

Comment on lines +65 to +70
ngOnInit(){
this.serviceLine = localStorage.getItem('serviceName');
this.fetchLanguageResponse();
this.getRegistrationData();
this.checkPatientRevisit();
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Consider extracting logic from ngOnInit to improve readability and maintainability.

The ngOnInit method performs several tasks, such as retrieving data from local storage, fetching language response, getting registration data, checking patient revisit, and opening consent. This violates the Single Responsibility Principle and makes the method harder to understand and maintain.

Consider extracting some of the logic into separate methods or services to improve readability and maintainability. For example, you could move the language-related functionality to a separate service and the patient revisit check to a separate method.

Comment on lines +198 to +226
getRegistrationData(){
let location: any = localStorage.getItem('locationData');
let locationData = JSON.parse(location);
let services: any = localStorage.getItem('services');
let servicesData = JSON.parse(services);
console.log('servicesData', servicesData);
let reqObj = {
serviceLine: localStorage.getItem('serviceName'),
serviceLineId: localStorage.getItem('serviceID'),
stateId: locationData.stateID,
districtId: locationData.districtID,
blockId: locationData.blockID,
serviceProviderId: servicesData[0].serviceProviderID
}
console.log('reqObj', reqObj);
this.registrationService.fetchAllRegistrationData(reqObj).subscribe((res: any) => {
if(res && res.data && res.statusCode === 200){
if(res.data.length > 0){
this.filterData(res.data);
} else {
this.confirmationService.alert('No Project is mapped to the serviceline for choosed block', 'info')
}
}else {
this.confirmationService.alert(res.errorMessage, 'error');
}
}, (err: any) => {
this.confirmationService.alert(err.errorMessage, 'error');
})
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggestions for improving the getRegistrationData method:

  1. Provide more specific and informative error messages in the error handling block. Instead of a generic "issue in saving the data" message, include details about the error and possible solutions.

  2. Extract the success response handling logic into a separate method to improve readability and maintainability. This will make the getRegistrationData method more focused and easier to understand.

  3. Replace the magic strings used for local storage keys with constants. This will make the code more maintainable and less prone to errors caused by typos or inconsistencies.

Tools
Biome

[error] 214-214: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)

Comment on lines 319 to 399
submitBeneficiaryDetails() {
console.log('registration data', this.mainForm);
const newDate = this.dateFormatChange();
const valueToSend = this.mainForm.value;
valueToSend.personalInfoForm.dob = newDate;
const iEMRForm: any = this.iEMRForm();
const phoneMaps = iEMRForm.benPhoneMaps;

// createdBy, vanID, servicePointID
const serviceLineDetails: any = localStorage.getItem('serviceLineDetails');
const servicePointDetails = JSON.parse(serviceLineDetails);
iEMRForm['vanID'] = servicePointDetails.vanID;
iEMRForm['parkingPlaceID'] = servicePointDetails.parkingPlaceID;
iEMRForm['createdBy'] = localStorage.getItem('userName');
iEMRForm['providerServiceMapID'] = localStorage.getItem('providerServiceID');
iEMRForm['providerServiceMapId'] = localStorage.getItem('providerServiceID');
phoneMaps[0]['vanID'] = servicePointDetails.vanID;
phoneMaps[0]['parkingPlaceID'] = servicePointDetails.parkingPlaceID;
phoneMaps[0]['createdBy'] = localStorage.getItem('userName');
console.log('iemrform', iEMRForm);
const mainForm = this.mainFormData();
console.log('mainForm', mainForm);
console.log('personalInfoFormGENDER', this.mainForm.controls['personalInfoForm'].value);
const remaingData = this.findMissingKeys(iEMRForm, mainForm)
let finalRqObj = {
...remaingData,
...iEMRForm
}
console.log('finalRqObj', finalRqObj);
this.registrarService.submitBeneficiary(finalRqObj).subscribe((res: any) => {
if (res.statusCode === 200) {
this.confirmationService.alert(res.data.response, 'success');
const responseValue = res.data.response;
const benId = responseValue.replace(/^\D+/g, '');
const txt = res.data.response;
const numb = txt.replace(/\D/g, '');
const reqObj = {
beneficiaryRegID: null,
beneficiaryID: numb,
healthId: this.mainForm.controls['abhaInfoForm'].value['abha'],
healthIdNumber: this.mainForm.controls['abhaInfoForm'].value['abha'],
providerServiceMapId: localStorage.getItem('providerServiceID'),
authenticationMode: null,
createdBy: localStorage.getItem('userName'),
};
if
(this.mainForm.controls['abhaInfoForm'].value['abha'] !== undefined &&
this.mainForm.controls['abhaInfoForm'].value['abha'] !== null) {
this.registrarService.mapHealthId(reqObj).subscribe((res: any) => {
if (res.statusCode === 200) {
// this.confirmationService.alert(res.data.response, 'success');
console.log('success');
} else {
this.confirmationService.alert(
this.currentLanguageSet.alerts.info.issueInSavngData,
'error',
);
}
});
}
this.mainForm.reset();
this.disableGenerateOTP = false;
// this.confirmationService.alert(res.data.response, 'success');
// this.mainForm.reset();
}

else {
this.confirmationService.alert(
this.currentLanguageSet.alerts.info.issueInSavngData,
'error',
);
}

// else {
// this.confirmationService.alert(
// 'issue in saving the data',
// 'error'
// );
// }
});
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Refactor the submitBeneficiaryDetails method to improve maintainability and readability.

The submitBeneficiaryDetails method is quite complex and violates the Single Responsibility Principle. Here are a few suggestions to improve it:

  1. Extract the data manipulation logic (e.g., iEMRForm, findMissingKeys) into separate methods or services. This will make the code more modular, reusable, and easier to test.

  2. Move the API call and response handling to a dedicated service. This will separate concerns, improve testability, and make the component more focused.

  3. Use more descriptive variable names to improve code readability. For example, finalRqObj could be renamed to finalRequestObject or beneficiaryDetailsRequest.

  4. Handle errors more gracefully and provide informative error messages. Instead of generic messages like "issue in saving the data", include details about the error and possible solutions.

By applying these refactorings, the submitBeneficiaryDetails method will become more maintainable, readable, and easier to understand.

Comment on lines +516 to +545
updateBeneficiaryDetails(passToNurse = false) {
const finalReqObj: any = this.updateBenDataManipulation();
finalReqObj['passToNurse'] = passToNurse;

this.registrarService
.updateBeneficiary(finalReqObj)
.subscribe((res: any) => {
if (res && res.statusCode === 200) {
this.confirmationService.alert(res.data.response, 'success');
const personalForm = Object.assign(
{},
this.mainForm.value.personalInfoForm,
);
console.log("personalForm",personalForm);
const reqObj = {
beneficiaryRegID: null,
beneficiaryID: personalForm.beneficiaryID,
healthId: this.mainForm.controls['abhaInfoForm'].value['abha'],
healthIdNumber: this.mainForm.controls['abhaInfoForm'].value['abha'],
authenticationMode: null,
providerServiceMapId: localStorage.getItem('providerServiceID'),
createdBy: localStorage.getItem('userName'),
};
this.router.navigate(['/registrar/search/']);
}
else {
this.confirmationService.alert(res.errorMessage, 'error');
}
});
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Refactor the updateBeneficiaryDetails method to improve maintainability and readability.

The updateBeneficiaryDetails method can be improved in a similar way to the submitBeneficiaryDetails method:

  1. Extract the data manipulation logic from updateBenDataManipulation into separate methods or services. This will make the code more modular, reusable, and easier to test.

  2. Move the API call and response handling to a dedicated service. This will separate concerns, improve testability, and make the component more focused.

  3. Use more descriptive variable names to improve code readability. For example, reqObj could be renamed to updateBeneficiaryRequest or healthIdMappingRequest.

  4. Provide more informative error messages in the error handling block. Instead of a generic "issue in saving the data" message, include details about the error and possible solutions.

By applying these refactorings, the updateBeneficiaryDetails method will become more maintainable, readable, and easier to understand.

}
console.log('reqObj', reqObj);
this.registrationService.fetchAllRegistrationData(reqObj).subscribe((res: any) => {
if(res && res.data && res.statusCode === 200){
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Use optional chaining to prevent potential runtime errors.

The static analysis tool suggests using optional chaining when accessing the data property at line 214. Optional chaining ensures that the code doesn't throw an error if the res object or its data property is undefined or null.

Consider updating the code to use optional chaining as follows:

if (res?.data?.length > 0) {
  // ...
}

This will make the code more robust and less prone to runtime errors.

Tools
Biome

[error] 214-214: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)

Copy link

@coderabbitai coderabbitai bot left a 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 (1)
src/registrar/registration/personal-information/personal-information.component.ts (1)

162-181: Fix the placement of the break and return statements.

The allowTextValidator method correctly returns the appropriate regular expression based on the allowText parameter. However, there is a minor issue with the placement of the break statement and the return statement.

Apply this diff to fix the placement of the break and return statements:

-      default:
-        regex = /^[a-zA-Z0-9 ]*$/;
-        break; // Add break statement here
-    }
-
-    return regex; // Move this line outside the switch block
+      default:
+        regex = /^[a-zA-Z0-9 ]*$/;
+    }
+    return regex;
Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

Commits

Files that changed from the base of the PR and between e1537b1 and a67b0d1.

Files selected for processing (2)
  • src/registrar/registration/personal-information/personal-information.component.html (1 hunks)
  • src/registrar/registration/personal-information/personal-information.component.ts (1 hunks)
Additional context used
Biome
src/registrar/registration/personal-information/personal-information.component.ts

[error] 232-232: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)


[error] 728-728: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)


[error] 731-731: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)


[error] 737-737: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)


[error] 741-743: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)


[error] 746-748: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)


[error] 751-751: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)


[error] 754-755: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)


[error] 802-802: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)


[error] 811-811: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)


[error] 434-434: isNaN is unsafe. It attempts a type coercion. Use Number.isNaN instead.

See the MDN documentation for more details.
Unsafe fix: Use Number.isNaN instead.

(lint/suspicious/noGlobalIsNan)

Additional comments not posted (13)
src/registrar/registration/personal-information/personal-information.component.html (5)

2-2: LGTM!

The form structure and bindings look good. The use of reactive forms with dynamic form field generation based on the formData array is a nice approach. The bindings to the item object properties ensure that the form fields are correctly configured.

Also applies to: 36-42, 53-64, 67-74, 76-84, 86-95


6-21: *Simplify the ngIf conditions and improve accessibility.

Consider simplifying the *ngIf conditions for showing the default avatar or the uploaded image. Instead of using two separate *ngIf conditions, you can use a single condition with an else block:

<div *ngIf="personalInfoFormGroup.value?.image; else defaultAvatar">
  <a>
    <img
      [src]="personalInfoFormGroup.value.image"
      class="img-circle thumbnail-120"
      alt="Uploaded Beneficiary Image" />
  </a>
</div>
<ng-template #defaultAvatar>
  <a>
    <img
      src="assets/images/default-avatar.gif"
      class="img-circle thumbnail-120"
      alt="Default Avatar" />
  </a>
</ng-template>

Also, consider using a more descriptive alt text for the uploaded image to improve accessibility.

Verify that the captureImage() method is correctly implemented in the component class to handle the image upload functionality.


40-40: LGTM!

The form validations and error messages look comprehensive and cover various scenarios. The use of <mat-error> elements provides a consistent way to display validation errors. The custom validation for ageAtMarriage is a good addition to ensure data integrity.

Also applies to: 43-50


53-64: LGTM!

The date picker controls are implemented correctly and follow Angular Material's date picker usage. The (dateChange) event is a good way to trigger validations when the date value changes. Setting the max attribute to tomorrow for the "Date of Birth" field is a nice touch to prevent selecting future dates.


1-101: LGTM!

The form template follows good accessibility and semantic practices:

  • The use of <mat-form-field> elements ensures that the form fields have proper accessibility attributes and behaviors.
  • The <mat-label> elements provide clear labels for the form fields, enhancing usability and accessibility.
  • The placeholder attributes give additional context to the users about the expected input format or value.
  • The required attributes help convey which fields are mandatory, improving the form's usability.

Overall, the form template is well-structured and follows Angular's reactive forms approach, making it accessible and user-friendly.

src/registrar/registration/personal-information/personal-information.component.ts (8)

86-112: LGTM!

The constructor correctly initializes the tomorrow property and subscribes to the registrationABHADetails$ observable to populate form fields with the received response data. The implementation looks good.


114-148: LGTM!

The ngOnInit method correctly initializes the form controls based on the provided formData. It adds necessary form controls, validators, and patches the form with revisitData for patient revisit. The implementation looks good.


156-160: LGTM!

The setDateLimits method correctly sets the today and minDate properties for the calendar. It calculates the minDate by subtracting ageLimit + 1 years from the current date. The implementation looks good.


183-191: LGTM!

The onInputChanged method correctly handles the input change event and limits the input value to the provided maxLength. The implementation looks good.


193-204: LGTM!

The captureImage method correctly captures an image using the cameraService and updates the image form control with the captured image. For patient revisit, it also sets the imageChangeFlag form control to true. The implementation looks good.


210-222: LGTM!

The loadMasterDataObservable method correctly loads the master data from the registrationMasterDetails$ observable and assigns it to the masterData property. For patient revisit, it calls the loadPersonalDataForEditing method. The implementation looks good.


229-239: LGTM!

The loadPersonalDataForEditing method correctly loads the personal data for editing from the beneficiaryEditDetails$ observable. It assigns the response to the revisitData property, validates the marital status master, pushes the editing data to the form, and retrieves the beneficiary image. The implementation looks good.

Tools
Biome

[error] 232-232: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)


315-328: LGTM!

The changeLiteracyStatus method correctly handles the literacy status change and resets the educationQualification form control if the literacy status is not 'Literate'. The implementation looks good.

Comment on lines +241 to +290
onGenderSelected() {
const genderMaster = this.masterData.genderMaster;
genderMaster.forEach((element: any, i: any) => {
if (element.genderID === this.personalInfoFormGroup.value.gender) {
this.personalInfoFormGroup.patchValue({
genderName: element.genderName,
});
}
});
console.log(
'this.masterData',
genderMaster,
this.masterData.maritalStatusMaster
);

if (this.personalInfoFormGroup.value.gender === 3) {
this.confirmationService
.confirm('info', 'You have selected Transgender, please confirm')
.subscribe(
res => {
if (!res) {
this.personalInfoFormGroup.patchValue({
gender: null,
genderName: null,
});
} else {
this.maritalStatusMaster = this.masterData.maritalStatusMaster;
}
},
err => {}
);
} else {
this.maritalStatusMaster = this.masterData.maritalStatusMaster.filter(
(maritalStatus: any) => {
if (
this.personalInfoFormGroup.value.gender === 1 &&
maritalStatus.maritalStatusID !== 5
) {
return maritalStatus;
}
if (
this.personalInfoFormGroup.value.gender === 2 &&
maritalStatus.maritalStatusID !== 6
) {
return maritalStatus;
}
}
);
}
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Consider extracting the common logic for assigning the maritalStatusMaster.

The code for assigning the maritalStatusMaster based on the selected gender is duplicated in the onGenderSelected method. Consider extracting this logic into a separate method to improve code reusability and maintainability.

private assignMaritalStatusMaster(gender: number) {
  if (gender === 3) {
    this.maritalStatusMaster = this.masterData.maritalStatusMaster;
  } else {
    this.maritalStatusMaster = this.masterData.maritalStatusMaster.filter(
      (maritalStatus: any) => {
        if (gender === 1 && maritalStatus.maritalStatusID !== 5) {
          return maritalStatus;
        }
        if (gender === 2 && maritalStatus.maritalStatusID !== 6) {
          return maritalStatus;
        }
      }
    );
  }
}

Then, update the onGenderSelected method to call the assignMaritalStatusMaster method:

onGenderSelected() {
  // ...
  if (this.personalInfoFormGroup.value.gender === 3) {
    this.confirmationService
      .confirm('info', 'You have selected Transgender, please confirm')
      .subscribe(
        res => {
          if (!res) {
            this.personalInfoFormGroup.patchValue({
              gender: null,
              genderName: null,
            });
          } else {
            this.assignMaritalStatusMaster(this.personalInfoFormGroup.value.gender);
          }
        },
        err => {}
      );
  } else {
    this.assignMaritalStatusMaster(this.personalInfoFormGroup.value.gender);
  }
}

Comment on lines +292 to +313
validateMaritalStatusMaster(revisitData: any) {
if (revisitData.m_gender.genderID === 3) {
this.maritalStatusMaster = this.masterData.maritalStatusMaster;
} else {
this.maritalStatusMaster = this.masterData.maritalStatusMaster.filter(
(maritalStatus: any) => {
if (
revisitData.m_gender.genderID === 1 &&
maritalStatus.maritalStatusID !== 5
) {
return maritalStatus;
}
if (
revisitData.m_gender.genderID === 2 &&
maritalStatus.maritalStatusID !== 6
) {
return maritalStatus;
}
}
);
}
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reuse the assignMaritalStatusMaster method.

The logic for filtering the maritalStatusMaster based on the gender ID is similar to the logic in the onGenderSelected method. Consider reusing the assignMaritalStatusMaster method (suggested in the previous comment) in the validateMaritalStatusMaster method to avoid code duplication.

validateMaritalStatusMaster(revisitData: any) {
  this.assignMaritalStatusMaster(revisitData.m_gender.genderID);
}

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 11

Outside diff range and nitpick comments (5)
src/registrar/registration/personal-information/personal-information.component.ts (5)

83-106: Consider breaking down the component into smaller, focused components.

The PersonalInformationComponent has a lot of responsibilities, including form setup, form value changes, data loading, and data editing. This can make the component harder to understand and maintain.

Consider breaking down the component into smaller, focused components that each handle a specific responsibility. For example, you could have separate components for form setup, form value changes, data loading, and data editing.

This would make the code more modular, reusable, and easier to test.


146-156: Use more descriptive names for variables and methods.

The setDateLimits method uses variables like today and minDate, which are not very descriptive. Consider using more descriptive names like currentDate and minBirthDate to make the code more readable.


319-332: Consider renaming the changeLiteracyStatus method.

The changeLiteracyStatus method name suggests that it changes the literacy status, but it actually resets the educationQualification form control based on the literacy status. Consider renaming the method to something more descriptive, like resetEducationQualificationBasedOnLiteracyStatus.


407-421: Consider using a more descriptive name for the setupFormValueChanges method.

The setupFormValueChanges method name doesn't clearly describe what the method does. Consider renaming the method to something more descriptive, like setupAgeAndDOBValueChanges, since it sets up value changes for the age, age units, and date of birth form controls.


518-523: Consider renaming the checkFieldValidations method.

The checkFieldValidations method name suggests that it checks the field validations, but it actually calls other methods based on the field name. Consider renaming the method to something more descriptive, like callMethodsBasedOnFieldName.

Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

Commits

Files that changed from the base of the PR and between 41a065d and 88f1dad.

Files selected for processing (5)
  • src/registrar/registration/abha-information/abha-information.component.html (1 hunks)
  • src/registrar/registration/location-information/location-information.component.html (1 hunks)
  • src/registrar/registration/other-information/other-information.component.html (1 hunks)
  • src/registrar/registration/personal-information/personal-information.component.html (1 hunks)
  • src/registrar/registration/personal-information/personal-information.component.ts (1 hunks)
Files skipped from review as they are similar to previous changes (3)
  • src/registrar/registration/abha-information/abha-information.component.html
  • src/registrar/registration/location-information/location-information.component.html
  • src/registrar/registration/other-information/other-information.component.html
Additional context used
Biome
src/registrar/registration/personal-information/personal-information.component.ts

[error] 191-191: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)


[error] 192-192: Avoid the delete operator which can impact performance.

Unsafe fix: Use an undefined assignment instead.

(lint/performance/noDelete)


[error] 236-236: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)


[error] 732-732: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)


[error] 735-735: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)


[error] 741-741: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)


[error] 745-747: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)


[error] 750-752: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)


[error] 755-755: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)


[error] 758-759: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)


[error] 806-806: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)


[error] 815-815: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)


[error] 438-438: isNaN is unsafe. It attempts a type coercion. Use Number.isNaN instead.

See the MDN documentation for more details.
Unsafe fix: Use Number.isNaN instead.

(lint/suspicious/noGlobalIsNan)

Additional comments not posted (10)
src/registrar/registration/personal-information/personal-information.component.html (5)

2-193: LGTM!

The form implementation using Angular's reactive forms with dynamic rendering based on the formData array is a good approach. The form bindings and conditional rendering of form controls based on fieldType are implemented correctly.


46-83: LGTM!

The form control bindings using the formControlName directive and the conditional application of the required validator based on the isRequired property are implemented correctly. The minlength validator for text inputs and the custom validation for ageAtMarriage are also properly implemented.


1-194: LGTM!

The usage of Angular Material components throughout the form provides a consistent and visually appealing UI. The mat-form-field, mat-datepicker, mat-radio-group, mat-radio-button, and mat-select components are used appropriately for their respective form control types.


1-194: LGTM!

The form demonstrates good accessibility practices. The usage of mat-label for labeling form fields, placeholder attribute for additional guidance, alt attribute for the profile image, and readonly attribute for the date input field enhances the accessibility and user experience of the form.


58-83: LGTM!

The form's error handling is implemented correctly. The usage of mat-error components for displaying error messages and the conditional display based on the form control's validation state provides clear feedback to the user. The required, minlength, and custom ageAtMarriage validation error messages are displayed properly.

src/registrar/registration/personal-information/personal-information.component.ts (5)

245-294: Consider extracting the common logic for assigning the maritalStatusMaster.

The code for assigning the maritalStatusMaster based on the selected gender is duplicated in the onGenderSelected method. Consider extracting this logic into a separate method to improve code reusability and maintainability.

private assignMaritalStatusMaster(gender: number) {
  if (gender === 3) {
    this.maritalStatusMaster = this.masterData.maritalStatusMaster;
  } else {
    this.maritalStatusMaster = this.masterData.maritalStatusMaster.filter(
      (maritalStatus: any) => {
        if (gender === 1 && maritalStatus.maritalStatusID !== 5) {
          return maritalStatus;
        }
        if (gender === 2 && maritalStatus.maritalStatusID !== 6) {
          return maritalStatus;
        }
      }
    );
  }
}

Then, update the onGenderSelected method to call the assignMaritalStatusMaster method:

onGenderSelected() {
  // ...
  if (this.personalInfoFormGroup.value.gender === 3) {
    this.confirmationService
      .confirm('info', 'You have selected Transgender, please confirm')
      .subscribe(
        res => {
          if (!res) {
            this.personalInfoFormGroup.patchValue({
              gender: null,
              genderName: null,
            });
          } else {
            this.assignMaritalStatusMaster(this.personalInfoFormGroup.value.gender);
          }
        },
        err => {}
      );
  } else {
    this.assignMaritalStatusMaster(this.personalInfoFormGroup.value.gender);
  }
}

296-317: Reuse the assignMaritalStatusMaster method.

The logic for filtering the maritalStatusMaster based on the gender ID is similar to the logic in the onGenderSelected method. Consider reusing the assignMaritalStatusMaster method (suggested in the previous comment) in the validateMaritalStatusMaster method to avoid code duplication.

validateMaritalStatusMaster(revisitData: any) {
  this.assignMaritalStatusMaster(revisitData.m_gender.genderID);
}

423-430: LGTM!

The onAgeOrUnitEntered method correctly calculates the date of birth when both age and age units are entered.


528-537: LGTM!

The onIncomeChanged method correctly updates the incomeName form control based on the selected income ID.


580-587: LGTM!

The clearMarriageDetails method correctly clears the spouseName and ageAtMarriage form controls if they have a value.

Comment on lines 108 to 144
ngOnInit() {
this.formData.forEach((item: any) => {
if (item.fieldName && item.allowText) {
this.personalInfoFormGroup.addControl(
item.fieldName,
new FormControl(null, [
Validators.pattern(this.allowTextValidator(item.allowText)),
Validators.minLength(parseInt(item?.allowMin)),
Validators.maxLength(parseInt(item?.allowMax)),
]),
);
} else {
this.personalInfoFormGroup.addControl(
item.fieldName,
new FormControl(null),
);
}
});
this.personalInfoFormGroup.addControl('image', new FormControl());
console.log('personalInfoFormGroup Data', this.personalInfoFormGroup);
if (this.patientRevisit) {
this.personalInfoFormGroup.addControl(
'beneficiaryRegID',
new FormControl(),
);
this.personalInfoFormGroup.addControl('beneficiaryID', new FormControl());
this.personalInfoFormGroup.patchValue(this.revisitData);
this.personalInfoFormGroup
.get('phoneNo')
?.patchValue(this.revisitData.benPhoneMaps[0].phoneNo);
}
console.log('personal Form Data', this.formData);
console.log('this.revist data - personal info', this.revisitData);
this.setupFormValueChanges();

this.setDateLimits();
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Consider simplifying the form setup and value change logic.

The ngOnInit method has complex logic for setting up form controls, listening to form value changes, and calling other methods. This can make the code harder to understand and maintain.

Consider simplifying the form setup and value change logic by:

  • Using a separate method for setting up form controls.
  • Using a separate method for listening to form value changes.
  • Using a separate method for calling other methods based on form value changes.

This would make the code more readable and easier to maintain.

Comment on lines 158 to 177
allowTextValidator(allowText: any) {
let regex: RegExp;

switch (allowText) {
case 'alpha':
regex = /^[a-zA-Z]*$/;
break;
case 'numeric':
regex = /^[0-9]*$/;
break;
case 'alphaNumeric':
regex = /^[a-zA-Z0-9]*$/;
break;
default:
regex = /^[a-zA-Z0-9 ]*$/;
break; // Add break statement here
}

return regex; // Move this line outside the switch block
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Consider using a more robust validation library.

The allowTextValidator method uses a switch statement to determine the regular expression for validating input based on the allowText parameter. This can be error-prone and hard to maintain.

Consider using a more robust validation library like Validator.js or class-validator to handle input validation. This would make the code more reliable and easier to maintain.

Comment on lines +191 to +193
if (currentErrors && currentErrors['maxlength']) {
delete currentErrors['maxlength'];
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fix the unsafe delete operator usage.

The code uses the delete operator to remove the maxlength error from the form control. This can impact performance and is considered unsafe.

Consider using an undefined assignment instead, like this:

if (currentErrors && currentErrors['maxlength']) {
  currentErrors['maxlength'] = undefined;
}

This would avoid the performance impact of the delete operator.

Tools
Biome

[error] 191-191: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)


[error] 192-192: Avoid the delete operator which can impact performance.

Unsafe fix: Use an undefined assignment instead.

(lint/performance/noDelete)

Comment on lines +197 to +208
captureImage() {
this.cameraService.capture().subscribe((result: any) => {
if (result) {
if (this.patientRevisit) {
this.personalInfoFormGroup.patchValue({
imageChangeFlag: true,
});
}
this.personalInfoFormGroup.patchValue({ image: result });
}
});
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Consider moving the image capture logic to a separate service.

The captureImage method uses the cameraService to capture an image and patch the form value. This logic could be moved to a separate service to make the component more focused and easier to test.

For example, you could create an ImageCaptureService with a captureImage method that returns an observable of the captured image. Then, you could inject this service into the component and use it to capture the image and patch the form value.

This would make the component more focused and easier to test.

Comment on lines 214 to 226
loadMasterDataObservable() {
this.masterDataSubscription =
this.registrarService.registrationMasterDetails$.subscribe((res) => {
// console.log('res personal', res)
if (res !== null) {
this.masterData = res;
console.log('masterData');
if (this.patientRevisit) {
this.loadPersonalDataForEditing();
}
}
});
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Consider moving the master data loading logic to a separate service.

The loadMasterDataObservable method subscribes to the registrarService.registrationMasterDetails$ observable and assigns the result to the masterData property. This logic could be moved to a separate service to make the component more focused and easier to test.

For example, you could create a MasterDataService with a getMasterData method that returns an observable of the master data. Then, you could inject this service into the component and use it to load the master data.

This would make the component more focused and easier to test.

Comment on lines 337 to 401
getParentDetails() {
const searchTerm = this.personalInfoFormGroup.value.phoneNo;
const searchObject = {
beneficiaryRegID: null,
beneficiaryID: null,
phoneNo: null,
};
if (searchTerm && searchTerm.trim().length === 10) {
searchObject['phoneNo'] = searchTerm;
this.registrarService.identityQuickSearch(searchObject).subscribe(
(beneficiaryList: any) => {
if (
beneficiaryList &&
beneficiaryList.length > 0 &&
beneficiaryList[0].benPhoneMaps.length > 0
) {
console.log(
'ta d ad a d a',
JSON.stringify(beneficiaryList, null, 4),
);
this.personalInfoFormGroup.patchValue({
parentRegID: beneficiaryList[0].benPhoneMaps[0].parentBenRegID,
parentRelation: 11,
});
console.log(this.personalInfoFormGroup.value.parentRegID);
} else {
this.personalInfoFormGroup.patchValue({
parentRegID: null,
parentRelation: 1,
});
console.log(this.personalInfoFormGroup.value.parentRegID);

if (this.patientRevisit) {
this.personalInfoFormGroup.patchValue({
parentRegID: this.personalInfoFormGroup.value.beneficiaryRegID,
});
console.log(this.personalInfoFormGroup.value.parentRegID);
}
}
},
(error) => {
this.confirmationService.alert(error, 'error');
this.personalInfoFormGroup.patchValue({
parentRegID: null,
parentRelation: 1,
phoneNo: null,
});
},
);
} else {
if (this.patientRevisit) {
this.personalInfoFormGroup.patchValue({
parentRegID: this._parentBenRegID,
parentRelation: null,
phoneNo: null,
});
} else {
this.personalInfoFormGroup.patchValue({
parentRegID: null,
parentRelation: null,
phoneNo: null,
});
}
}
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Consider breaking down the getParentDetails method into smaller methods.

The getParentDetails method has complex logic for searching and assigning parent details based on the phone number. Consider breaking down this method into smaller methods that each handle a specific responsibility, like searching for the parent details, assigning the parent details, and handling errors.

This would make the code more readable and easier to maintain.

Comment on lines 432 to 461
calculateDOB() {
const ageValue = this.personalInfoFormGroup.get('age')!.value;
const ageUnits = this.personalInfoFormGroup.get('ageUnits')!.value;

if (ageValue && ageUnits) {
const valueEntered = parseInt(ageValue, 10);
if (!isNaN(valueEntered)) {
if (
valueEntered > this.ageLimit &&
ageUnits.toLowerCase() === 'years'
) {
this.confirmationService.alert(
'Age can only be set between Today to 120 Years',
'info',
);
this.personalInfoFormGroup.patchValue({ age: null });
} else {
const dob = moment().subtract(valueEntered, ageUnits).toDate();
const fromDate = moment(dob).toISOString();
console.log('dob after conversion', fromDate);
this.personalInfoFormGroup.patchValue(
{
dOB: fromDate,
},
{ emitEvent: false },
); // Prevent emitting the event to avoid circular updates
}
}
}
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Use Number.isNaN instead of isNaN.

The calculateDOB method uses the isNaN function to check if the entered age is a valid number. However, isNaN is considered unsafe because it attempts a type coercion.

Consider using Number.isNaN instead, like this:

if (ageValue && ageUnits) {
  const valueEntered = parseInt(ageValue, 10);
  if (!Number.isNaN(valueEntered)) {
    // ...
  }
}

This would avoid the type coercion and make the code safer.

Tools
Biome

[error] 438-438: isNaN is unsafe. It attempts a type coercion. Use Number.isNaN instead.

See the MDN documentation for more details.
Unsafe fix: Use Number.isNaN instead.

(lint/suspicious/noGlobalIsNan)

Comment on lines 463 to 516
dobChangeByCalender() {
const dobValue = this.personalInfoFormGroup.get('dOB')?.value;
const today = new Date();
if (dobValue) {
this.dateForCalendar = moment(dobValue);
const date = new Date(this.dateForCalendar);

if (
this.dateForCalendar &&
dobValue &&
this.personalInfoFormGroup.controls['dOB'].valid
) {
const dateDiff = Date.now() - date.getTime();
const age = new Date(dateDiff);
const yob = Math.abs(age.getUTCFullYear() - 1970);
const mob = Math.abs(age.getUTCMonth());
const dob = Math.abs(age.getUTCDate() - 1);
if (yob > 0) {
this.personalInfoFormGroup.patchValue(
{ age: yob, ageUnits: 'Years' },
{ emitEvent: false },
);
} else if (mob > 0) {
this.personalInfoFormGroup.patchValue(
{ age: mob, ageUnits: 'Months' },
{ emitEvent: false },
);
} else if (dob > 0) {
this.personalInfoFormGroup.patchValue(
{ age: dob, ageUnits: 'Days' },
{ emitEvent: false },
);
}

if (date.setHours(0, 0, 0, 0) === today.setHours(0, 0, 0, 0)) {
this.personalInfoFormGroup.patchValue(
{ age: 1, ageUnits: 'Days' },
{ emitEvent: false },
);
}

this.checkAgeAtMarriage();
} else if (dobValue === 'Invalid date') {
this.personalInfoFormGroup.patchValue({ dOB: null });
this.dateForCalendar = null;
this.confirmationService.alert(
this.currentLanguageSet.alerts.info.invalidData,
'info',
);
} else {
this.personalInfoFormGroup.patchValue({ age: null });
}
}
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Consider extracting the date difference calculation logic into a separate method.

The dobChangeByCalender method has complex logic for calculating the age based on the selected date of birth. Consider extracting this logic into a separate method that takes the date of birth as a parameter and returns an object with the calculated age values.

For example:

private calculateAgeFromDOB(dob: Date): { years: number; months: number; days: number } {
  const today = new Date();
  const dateDiff = today.getTime() - dob.getTime();
  const age = new Date(dateDiff);
  const years = age.getUTCFullYear() - 1970;
  const months = age.getUTCMonth();
  const days = age.getUTCDate() - 1;
  return { years, months, days };
}

Then, you could use this method in the dobChangeByCalender method like this:

const age = this.calculateAgeFromDOB(date);
if (age.years > 0) {
  this.personalInfoFormGroup.patchValue({ age: age.years, ageUnits: 'Years' }, { emitEvent: false });
} else if (age.months > 0) {
  this.personalInfoFormGroup.patchValue({ age: age.months, ageUnits: 'Months' }, { emitEvent: false });
} else if (age.days > 0) {
  this.personalInfoFormGroup.patchValue({ age: age.days, ageUnits: 'Days' }, { emitEvent: false });
}

This would make the code more readable and easier to maintain.

Comment on lines +545 to +574
onMaritalStatusChanged() {
if (
this.personalInfoFormGroup.value.maritalStatus === 1 ||
this.personalInfoFormGroup.value.maritalStatus === 7
) {
this.enableMarriageDetails = false;
this.clearMarriageDetails();
} else {
this.enableMarriageDetails = true;
}
if (this.personalInfoFormGroup.value.maritalStatus === 2) {
this.enableSpouseMandatory = true;
this.clearMarriageDetails();
} else {
this.enableSpouseMandatory = false;
this.clearMarriageDetails();
}

const maritalMaster = this.masterData.maritalStatusMaster;
maritalMaster.forEach((element: any, i: any) => {
if (
element.maritalStatusID ===
this.personalInfoFormGroup.value.maritalStatus
) {
this.personalInfoFormGroup.patchValue({
maritalStatusName: element.status,
});
}
});
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Consider extracting the common logic for updating the maritalStatusName.

The onMaritalStatusChanged method has duplicated logic for updating the maritalStatusName form control based on the selected marital status ID. Consider extracting this logic into a separate method to improve code reusability and maintainability.

For example:

private updateMaritalStatusName(maritalStatusId: number) {
  const maritalStatus = this.masterData.maritalStatusMaster.find(
    (status: any) => status.maritalStatusID === maritalStatusId
  );
  if (maritalStatus) {
    this.personalInfoFormGroup.patchValue({
      maritalStatusName: maritalStatus.status,
    });
  }
}

Then, you could call this method in the onMaritalStatusChanged method like this:

onMaritalStatusChanged() {
  // ...
  this.updateMaritalStatusName(this.personalInfoFormGroup.value.maritalStatus);
}

This would make the code more readable and easier to maintain.

Comment on lines 593 to 647
checkAgeAtMarriage() {
if (this.personalInfoFormGroup.value.ageAtMarriage !== null) {
if (this.personalInfoFormGroup.value.age === null) {
this.confirmationService.alert(
this.currentLanguageSet.alerts.info.pleaseenterBeneficiaryagefirst,
'info',
);
this.personalInfoFormGroup.patchValue({ ageAtMarriage: null });
} else if (
this.personalInfoFormGroup.value.ageUnits.toLowerCase() !== 'years'
) {
this.confirmationService.alert(
this.currentLanguageSet.alerts.info.marriageAge +
' ' +
this.ageforMarriage +
' ' +
this.currentLanguageSet.alerts.info.years,
'info',
);
this.personalInfoFormGroup.patchValue({ ageAtMarriage: null });
} else if (this.personalInfoFormGroup.value.age < this.ageforMarriage) {
this.confirmationService.alert(
this.currentLanguageSet.alerts.info.marriageAge +
' ' +
this.ageforMarriage +
' ' +
this.currentLanguageSet.alerts.info.years,
'info',
);
this.personalInfoFormGroup.patchValue({ ageAtMarriage: null });
} else if (
this.personalInfoFormGroup.value.ageAtMarriage < this.ageforMarriage
) {
this.confirmationService.alert(
this.currentLanguageSet.alerts.info.marriageAge +
' ' +
this.ageforMarriage +
' ' +
this.currentLanguageSet.alerts.info.years,
'info',
);
this.personalInfoFormGroup.patchValue({ ageAtMarriage: null });
} else if (
this.personalInfoFormGroup.value.age -
this.personalInfoFormGroup.value.ageAtMarriage <
0
) {
this.confirmationService.alert(
this.currentLanguageSet.common.marriageatageismorethantheactualage,
'info',
);
this.personalInfoFormGroup.patchValue({ ageAtMarriage: null });
}
}
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Consider breaking down the checkAgeAtMarriage method into smaller methods.

The checkAgeAtMarriage method has complex logic for validating the age at marriage based on various conditions. Consider breaking down this method into smaller methods that each handle a specific validation, like checking if the age is entered, checking if the age units are in years, checking if the age is greater than the minimum marriage age, and checking if the age at marriage is less than the current age.

This would make the code more readable and easier to maintain.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

Outside diff range and nitpick comments (1)
src/registrar/registration/registration.component.ts (1)

162-184: Consider removing commented out lines.

The callBeneficiaryDataObservable method is implemented correctly and follows the expected logic for retrieving and processing the beneficiary revisit data. However, there are commented out lines (176-177) that parse the otherFields JSON. If these lines are no longer needed, consider removing them to keep the code clean and maintainable.

Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

Commits

Files that changed from the base of the PR and between 88f1dad and 246dfa4.

Files selected for processing (1)
  • src/registrar/registration/registration.component.ts (1 hunks)
Additional context used
Biome
src/registrar/registration/registration.component.ts

[error] 214-214: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)

Additional comments not posted (11)
src/registrar/registration/registration.component.ts (11)

72-78: LGTM!

The minValidator method is implemented correctly and follows best practices. It validates if a control's value is greater than or equal to a minimum value and returns the appropriate validation result.


80-86: LGTM!

The maxValidator method is implemented correctly and follows best practices. It validates if a control's value is less than or equal to a maximum value and returns the appropriate validation result.


88-111: LGTM!

The allowTextValidator method is implemented correctly and follows best practices. It provides a flexible way to validate text patterns based on the allowText parameter using regular expressions. The method returns the appropriate validation result based on the pattern matching.


129-139: LGTM!

The checkPatientRevisit method is implemented correctly and follows the expected logic. It checks if the patient is revisiting based on the presence of a beneficiaryID parameter in the route snapshot. If the patient is revisiting, it calls the necessary methods to handle the revisit scenario.


141-156: LGTM!

The openConsent method is implemented correctly and follows the expected logic. It opens the ConsentFormComponent dialog if the patient is not revisiting and handles the consent status after the dialog is closed. The consent status is then sent to the registrarService for further processing.


198-226: LGTM!

The getRegistrationData method is implemented correctly and follows the expected logic for fetching and processing registration data. It retrieves the necessary data from local storage, constructs the request object, and subscribes to the fetchAllRegistrationData method of the registrationService. The response is handled appropriately based on the success or error scenarios, and the data is filtered using the filterData method if available.

Tools
Biome

[error] 214-214: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)


228-248: LGTM!

The filterData method is implemented correctly and follows the expected logic for filtering and processing the registration data. It efficiently groups the data by section name and section ID using the reduce method, creating an array of objects with the structure { sectionId, sectionName, fields }. It then sorts the fields within each section based on their rank using the map method. Finally, it calls the enableSteps method to enable the appropriate steps based on the filtered data.


250-271: LGTM!

The enableSteps method is implemented correctly and follows the expected logic for enabling the appropriate steps based on the filtered registration data. It iterates over the filteredFieldsData array and checks the section name to determine which steps to enable. It sets the corresponding enable flag and assigns the fields data to the respective properties based on the section name. Additionally, for the "ABHA Information" section, it checks the serviceLine property to determine if the step should be enabled.


319-400: LGTM!

The submitBeneficiaryDetails method is implemented correctly and follows the expected logic for submitting the beneficiary details. It retrieves the form values, performs the necessary data manipulation, and constructs the request object correctly. It calls the submitBeneficiary method of the registrarService to submit the beneficiary details and handles the success and error scenarios appropriately. Additionally, it maps the health ID if available in the form.


402-477: LGTM!

The iEMRForm method is implemented correctly and follows the expected logic for constructing the iEMR form object. It retrieves the necessary form values from the personalInfoForm, locationInfoForm, otherInfoForm, and abhaInfoForm form groups. It constructs the i_bendemographics object with the relevant form values and sets the genderID based on the selected gender name. Additionally, it constructs the benPhoneMaps array with the phone number and phone type ID.


479-487: LGTM!

The mainFormData method is implemented correctly and follows the expected logic for constructing the main form data object. It combines the values from the personalInfoForm, locationInfoForm, otherInfoForm, and abhaInfoForm form groups using the spread operator, resulting in a single object containing all the form data.

@github-advanced-security
Copy link

This pull request sets up GitHub code scanning for this repository. Once the scans have completed and the checks have passed, the analysis results for this pull request branch will appear on this overview. Once you merge this pull request, the 'Security' tab will show more code scanning analysis results (for example, for the default branch). Depending on your configuration and choice of analysis tool, future pull requests will be annotated with code scanning analysis results. For more information about GitHub code scanning, check out the documentation.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants