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

feat(portals-admin): Set up for Parliamentary Lists #15892

Merged
merged 25 commits into from
Sep 24, 2024
Merged

Conversation

albinagu
Copy link
Member

@albinagu albinagu commented Sep 4, 2024

WIP: Admin - Parliamentary Lists

Checklist:

  • I have performed a self-review of my own code
  • I have made corresponding changes to the documentation
  • My changes generate no new warnings
  • I have added tests that prove my fix is effective or that my feature works
  • Formatting passes locally with my changes
  • I have rebased against main before asking for a review

Summary by CodeRabbit

  • New Features

    • Introduced new components for managing parliamentary signature collections, including ParliamentaryRoot, ParliamentaryConstituency, ParliamentaryList, and Constituency.
    • Enhanced localization support with new message definitions relevant to parliamentary contexts.
    • Added functionality for displaying constituency-specific signature lists and improved navigation within the parliamentary portal.
  • Bug Fixes

    • Updated navigation paths and conditional rendering logic to ensure proper display based on the context (presidential or parliamentary).
  • Documentation

    • Improved clarity in routing and component structure for better user navigation and experience.
  • Chores

    • Refactored code to streamline functionality and improve modularity between presidential and parliamentary features.

Copy link
Contributor

coderabbitai bot commented Sep 4, 2024

Walkthrough

The pull request introduces significant updates to the signature collection feature within the admin portal. It enhances localization support by adding new message definitions for parliamentary contexts, modifies navigation structures, and restructures routing for parliamentary and presidential functionalities. Additionally, new components are introduced for displaying constituency and list views, along with GraphQL mutations for managing signature comparisons and deadlines.

Changes

File Path Change Summary
libs/portals/admin/signature-collection/src/lib/messages.ts Added new message definitions for the signature collection feature, including signatureListsConstituencyTitle and a new section parliamentaryMessages with multiple related messages.
libs/portals/admin/signature-collection/src/loaders/AllLists.loader.ts, libs/portals/admin/signature-collection/src/loaders/List.loader.ts Updated import paths for GraphQL documents and simplified function signatures by removing unnecessary parameters in listsLoader and listLoader.
libs/portals/admin/signature-collection/src/module.tsx Restructured routing and imports for parliamentary and presidential functionalities; introduced new lazy-loaded components for parliamentary routes.
libs/portals/admin/signature-collection/src/screens-parliamentary/Constituency/index.tsx, libs/portals/admin/signature-collection/src/screens-parliamentary/List/index.tsx Added Constituency and List components for displaying constituency-specific and detailed signature collection views, respectively.
libs/portals/admin/signature-collection/src/screens-parliamentary/index.tsx Introduced ParliamentaryRoot component as the main interface for parliamentary signature collection, integrating navigation and filtering capabilities.
libs/portals/admin/signature-collection/src/screens-presidential/AllLists/index.tsx Modified rendering logic to conditionally display lists based on collection.isPresidential.
libs/portals/admin/signature-collection/src/shared-components/compareLists/index.tsx, libs/portals/admin/signature-collection/src/shared-components/completeReview/index.tsx, libs/portals/admin/signature-collection/src/shared-components/createCollection/index.tsx Updated import paths and modified component logic for CompareLists, ActionReviewComplete, and CreateCollection components, including simplifications and adjustments to button properties.
libs/portals/admin/signature-collection/src/shared-components/signees/index.tsx Refactored Signees component to optimize filtering logic and remove unnecessary data display.

Possibly related PRs

Suggested labels

automerge, high priority

Suggested reviewers

  • juni-haukur

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.

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.

@albinagu albinagu added the deploy-feature Deploys features to dev label Sep 4, 2024
Copy link
Contributor

github-actions bot commented Sep 4, 2024

Affected services are: portals-admin,
Feature deployment of your services will begin shortly. Your feature will be accessible here:
https://adminparliamentary-beta.dev01.devland.is/stjornbord

Deployed services: portals-admin.
Excluded services: ``

@datadog-island-is
Copy link

datadog-island-is bot commented Sep 4, 2024

Datadog Report

Branch report: admin_parliamentary
Commit report: 1d1e711
Test service: web

✅ 0 Failed, 84 Passed, 0 Skipped, 33.85s Total Time
➡️ Test Sessions change in coverage: 1 no change

Copy link

codecov bot commented Sep 4, 2024

Codecov Report

All modified and coverable lines are covered by tests ✅

Project coverage is 36.69%. Comparing base (f55aa92) to head (b62dbbd).

Additional details and impacted files

Impacted file tree graph

@@           Coverage Diff           @@
##             main   #15892   +/-   ##
=======================================
  Coverage   36.69%   36.69%           
=======================================
  Files        6761     6761           
  Lines      139068   139068           
  Branches    39501    39501           
=======================================
  Hits        51035    51035           
  Misses      88033    88033           
Flag Coverage Δ
web 1.84% <ø> (ø)

Flags with carried forward coverage won't be shown. Click here to find out more.


Continue to review full report in Codecov by Sentry.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update f55aa92...b62dbbd. Read the comment docs.

@albinagu albinagu removed the deploy-feature Deploys features to dev label Sep 24, 2024
@albinagu albinagu marked this pull request as ready for review September 24, 2024 13:01
@albinagu albinagu requested a review from a team as a code owner September 24, 2024 13:01
Copy link
Contributor

@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: 18

Outside diff range and nitpick comments (29)
libs/portals/admin/signature-collection/src/screens-presidential/List/components/completeReview/toggleListReview.graphql (1)

1-5: LGTM! Consider adding a comment for clarity.

The GraphQL mutation is well-structured and follows best practices. It's appropriately placed in a library directory, potentially allowing for reuse across different parts of the admin portal.

Consider adding a brief comment at the top of the file to explain the purpose of this mutation, e.g.:

# Toggles the review status of a signature collection list
mutation toggleListReview($input: SignatureCollectionListIdInput!) {
  # ... rest of the mutation
}

This would enhance readability and maintainability, especially for other developers who might use this mutation.

libs/portals/admin/signature-collection/src/screens-presidential/List/components/extendDeadline/extendDeadline.graphql (1)

1-5: LGTM! Consider adding a comment for clarity.

The GraphQL mutation is well-structured and follows good practices. It's appropriately placed in a library directory, which aligns with the project's organization. The mutation name is clear, and it uses GraphQL's type system effectively.

Consider adding a brief comment at the top of the file to explain the purpose of this mutation. For example:

# Mutation to extend the deadline for signature collection in the admin portal
mutation ExtendDeadline($input: SignatureCollectionExtendDeadlineInput!) {
  signatureCollectionAdminExtendDeadline(input: $input) {
    success
  }
}

This would enhance readability and provide context for other developers who might work with this file in the future.

libs/portals/admin/signature-collection/src/screens-presidential/AllLists/components/compareLists/removeSignatureFromList.graphql (1)

1-6: LGTM! Consider a more specific mutation name.

The GraphQL mutation is well-structured and follows best practices. It provides a clear operation for removing a signature from a list in the admin context.

Consider renaming the mutation to be more specific, e.g., RemoveSignatureFromListAdmin. This would make the mutation's purpose immediately clear to other developers.

-mutation UnsignAdmin($input: SignatureCollectionSignatureIdInput!) {
+mutation RemoveSignatureFromListAdmin($input: SignatureCollectionSignatureIdInput!) {
   signatureCollectionAdminUnsign(input: $input) {
     success
     reasons
   }
 }
libs/portals/admin/signature-collection/src/lib/paths.ts (1)

1-9: LGTM! Clear separation of concerns with room for minor improvement.

The changes to the SignatureCollectionPaths enum effectively separate presidential and parliamentary paths, enhancing clarity and maintainability. The structure allows for easy reuse across different NextJS apps and supports effective tree-shaking.

For consistency, consider using plural forms for all root paths:

 export enum SignatureCollectionPaths {
   // Presidential
   PresidentialLists = '/medmaelasofnun',
   PresidentialList = '/medmaelasofnun/:listId',

   // Parliamentary
-  ParliamentaryRoot = '/althingiskosningar',
+  ParliamentaryLists = '/althingiskosningar',
   ParliamentaryConstituency = '/althingiskosningar/:constituencyName',
   ParliamentaryConstituencyList = '/althingiskosningar/:constituencyName/:listId',
 }

This change would make ParliamentaryLists consistent with PresidentialLists, improving the overall naming convention.

libs/portals/admin/signature-collection/src/screens-presidential/AllLists/components/compareLists/skeleton.tsx (1)

3-20: LGTM: Well-structured and reusable Skeleton component.

The Skeleton component is well-implemented as a functional component, focusing on a single responsibility. It's reusable and can be easily integrated into different parts of the application, aligning with the coding guidelines for the libs directory.

Consider extracting the repeated SkeletonLoader props into a constant to reduce repetition:

const skeletonProps = { height: 50, width: "100%", borderRadius: "large" as const };

export const Skeleton = () => (
  <T.Row>
    {[...Array(4)].map((_, index) => (
      <T.Data key={index}>
        <SkeletonLoader {...skeletonProps} />
      </T.Data>
    ))}
  </T.Row>
);

This refactoring improves maintainability and reduces the likelihood of inconsistencies.

libs/portals/admin/signature-collection/src/lib/navigation.ts (1)

13-20: Navigation structure update looks good, minor suggestion for consistency

The addition of a new child navigation item for parliamentary lists and the update to the existing item for presidential lists align well with the PR objectives. This change enhances the navigation structure and improves separation of concerns between parliamentary and presidential lists.

For consistency, consider adding a description to the new parliamentary list item, similar to the presidential list item:

 {
   name: parliamentaryMessages.listTitle,
   path: SignatureCollectionPaths.ParliamentaryRoot,
   activeIfExact: true,
+  description: parliamentaryMessages.listDescription, // Add this line
 },

This addition would maintain consistency across navigation items and potentially improve user experience.

libs/portals/admin/signature-collection/src/screens-presidential/AllLists/AllLists.loader.ts (2)

22-24: LGTM! Consider using type alias for consistency.

The removal of the unused params parameter simplifies the function signature without affecting its behavior. Good job on maintaining proper TypeScript usage with explicit return types.

For improved consistency and maintainability, consider using the ListsLoaderReturn type alias in the return type declaration:

- return async (): Promise<{
-   allLists: SignatureCollectionList[]
-   collectionStatus: string
-   collection: SignatureCollection
- }> => {
+ return async (): Promise<ListsLoaderReturn> => {

This change would make the code more DRY and easier to maintain in the future.


Line range hint 25-45: LGTM! Consider adding explicit error handling.

The implementation is well-structured, follows best practices for GraphQL queries, and adheres to the coding guidelines for libs/**/* files. Good job on ensuring reusability across different NextJS apps.

Consider adding explicit error handling to improve robustness:

+ try {
    const { data: collectionStatusData } = await client.query<CollectionQuery>({
      query: CollectionDocument,
      fetchPolicy: 'network-only',
    })
    const collection = collectionStatusData?.signatureCollectionAdminCurrent
    const { data } = await client.query<AllListsQuery>({
      query: AllListsDocument,
      fetchPolicy: 'network-only',
      variables: {
        input: {
          collectionId: collection?.id,
        },
      },
    })

    const allLists = data?.signatureCollectionAdminLists ?? []
    const collectionStatus =
      collectionStatusData?.signatureCollectionAdminCurrent?.status

    return { allLists, collectionStatus, collection }
+ } catch (error) {
+   console.error('Error fetching signature collection data:', error)
+   throw error
+ }

This addition would provide better visibility into potential issues during data fetching.

libs/portals/admin/signature-collection/src/screens-parliamentary/components/sortSignees/index.tsx (2)

17-28: Sorting logic is efficient and reusable.

The createSortItem helper function is well-designed, promoting code reusability. The sorting logic maintains immutability by creating a new array before sorting, which is a good practice. The sorting options cover both ascending and descending orders for name and date, providing comprehensive sorting capabilities.

Consider extracting the sorting logic into a custom hook for better reusability across different components if this sorting functionality is needed elsewhere in the application. This would align with the guideline of creating reusable hooks across different NextJS apps.

Example:

// useSortSignees.ts
export const useSortSignees = (initialSignees: Signature[]) => {
  const [signees, setSignees] = useState(initialSignees);
  const [page, setPage] = useState(1);

  const sortSignees = useCallback((compareFunction: (a: Signature, b: Signature) => number) => {
    const sorted = [...signees].sort(compareFunction);
    setSignees(sorted);
    setPage(1);
  }, [signees]);

  return { signees, sortSignees, page, setPage };
};

30-52: Render logic is well-implemented with proper use of UI components and localization.

The component effectively uses the DropdownMenu from '@island.is/island-ui/core', promoting UI consistency. Localization is correctly implemented using the useLocale hook, which is a good practice for internationalization. The render logic is concise and readable, with sorting options created using the createSortItem helper function.

To improve performance and adhere to best practices for effective tree-shaking, consider memoizing the sorting options array:

import React, { useMemo } from 'react';

// ... (rest of the imports)

const SortSignees = ({ signees, setSignees, setPage }) => {
  const { formatMessage } = useLocale();

  const sortOptions = useMemo(() => [
    createSortItem(formatMessage(m.sortAlphabeticallyAsc), (a, b) =>
      a.signee.name.localeCompare(b.signee.name),
    ),
    createSortItem(formatMessage(m.sortAlphabeticallyDesc), (a, b) =>
      b.signee.name.localeCompare(a.signee.name),
    ),
    createSortItem(formatMessage(m.sortDateAsc), (a, b) =>
      a.created.localeCompare(b.created),
    ),
    createSortItem(formatMessage(m.sortDateDesc), (a, b) =>
      b.created.localeCompare(a.created),
    ),
  ], [formatMessage]);

  return (
    <DropdownMenu
      title={formatMessage(m.sortBy)}
      icon="swapVertical"
      items={sortOptions}
    />
  );
};

This change ensures that the sorting options are only recalculated when formatMessage changes, potentially improving performance for larger lists.

libs/portals/admin/signature-collection/src/screens-presidential/List/List.loader.ts (1)

32-32: LGTM! Consider updating the input type for consistency.

The change from params.id to params.listId improves clarity and specificity. It's consistent with the other changes in this file.

For complete consistency, consider updating the input type definition (if it exists) to use listId instead of id. This would ensure type safety throughout the codebase.

libs/portals/admin/signature-collection/src/screens-parliamentary/SingleListView/index.tsx (2)

12-17: Component structure is well-organized, with a minor suggestion for improvement.

The component structure looks good:

  1. Utilizes functional component with hooks, following modern React practices.
  2. Uses TypeScript for type safety with the loaded data.

Consider adding a type guard or assertion to ensure list is not undefined:

const { list } = useLoaderData() as { list: SignatureCollectionList };
if (!list) {
  throw new Error('List data not found');
}

This will provide additional type safety and runtime checks.


18-48: Render logic is well-structured and follows best practices.

The component's render logic demonstrates several strengths:

  1. Utilizes reusable UI components from @island.is/island-ui/core for layout.
  2. Implements responsive design using the grid system.
  3. Properly uses localization for text content.
  4. Separates concerns by using custom components for different functionalities.

Consider adding an aria-label to the main container for improved accessibility:

-  <GridContainer>
+  <GridContainer aria-label={formatMessage(parliamentaryMessages.singleListViewLabel)}>

Don't forget to add the corresponding message in your localization file.

libs/portals/admin/signature-collection/src/screens-parliamentary/index.tsx (2)

1-20: LGTM! Consider destructuring imports for better tree-shaking.

The imports and component declaration look good. The component is exported as default, which is beneficial for tree-shaking.

For even better tree-shaking, consider destructuring the imports from '@island.is/island-ui/core' like this:

import ActionCard from '@island.is/island-ui/core/ActionCard'
import FilterInput from '@island.is/island-ui/core/FilterInput'
// ... and so on for other components

This approach allows for more granular tree-shaking at the component level.


21-24: LGTM! Consider adding a type assertion for better type safety.

The hooks usage is correct and follows React best practices. The component properly retrieves the necessary data and functions.

For improved type safety, consider adding a type assertion to the useLoaderData hook:

const { collection } = useLoaderData() as ListsLoaderReturn

This ensures that the retrieved data matches the expected structure and provides better TypeScript support.

libs/portals/admin/signature-collection/src/screens-parliamentary/SingleConstituencyView/index.tsx (3)

1-14: Imports look good, consider grouping them for better readability.

The imports are appropriate for the component's functionality and follow TypeScript conventions. However, for better readability and maintainability, consider grouping the imports as follows:

  1. External libraries
  2. Internal components and utilities
  3. Types and interfaces

Here's a suggested regrouping:

import { useLoaderData, useNavigate, useParams } from 'react-router-dom'
import { useLocale } from '@island.is/localization'
import {
  ActionCard,
  GridColumn,
  GridContainer,
  GridRow,
  Stack,
} from '@island.is/island-ui/core'

import { IntroHeader, PortalNavigation } from '@island.is/portals/core'
import { signatureCollectionNavigation } from '../../lib/navigation'
import { m, parliamentaryMessages } from '../../lib/messages'
import { SignatureCollectionPaths } from '../../lib/paths'

import { ListsLoaderReturn } from '../../screens-presidential/AllLists/AllLists.loader'

16-26: Component logic is sound, consider adding error handling.

The component logic is well-structured and follows React best practices. The use of hooks for localization, navigation, and data loading is appropriate. The filtering of lists based on the constituency name is simple and effective.

Consider adding error handling for cases where the constituencyName might not be found in the allLists array. This could be done by checking if constituencyLists is empty after filtering:

const constituencyLists = allLists.filter(
  (list) => list.area.name === constituencyName,
)

if (constituencyLists.length === 0) {
  // Handle the case where no lists are found for the given constituency
  // This could be showing an error message or redirecting to a 404 page
}

27-89: UI structure is well-organized, consider improving accessibility.

The UI structure is well-organized and makes good use of the @island.is/island-ui/core components. The grid layout provides a responsive design, and the mapping of constituencyLists to ActionCards is efficient.

To improve accessibility, consider adding an aria-label to the Stack component containing the ActionCards:

-              <Stack space={3}>
+              <Stack space={3} aria-label={formatMessage(parliamentaryMessages.constituencyListsLabel)}>

Also, ensure that the "Skoða nánar" (View details) text on the CTA button is translated using the localization system:

-                      label: 'Skoða nánar',
+                      label: formatMessage(parliamentaryMessages.viewDetailsLabel),

Don't forget to add these new message keys to your messages file.

libs/portals/admin/signature-collection/src/screens-parliamentary/components/extendDeadline/index.tsx (3)

25-54: LGTM! Consider enhancing error handling.

The state management and side effects are well-implemented:

  • React hooks are used effectively for state management.
  • The useEffect hook ensures synchronization between props and local state.
  • The mutation function is well-structured with proper success and error handling.

Consider adding more specific error handling in the catch block. Instead of directly using e.message, you could create a custom error message or use a fallback:

} catch (e) {
  const errorMessage = e instanceof Error ? e.message : 'An unknown error occurred';
  toast.error(formatMessage(m.updateListEndTimeError, { error: errorMessage }));
}

This approach provides more control over the error message displayed to the user.


56-74: LGTM! Consider enhancing accessibility.

The main render function is well-implemented:

  • It uses appropriate UI components from the island-ui/core library.
  • The date formatting is handled correctly.
  • The structure is clean and easy to understand.

Consider adding an aria-label to the button that opens the modal to improve accessibility:

<Button
  icon="calendar"
  iconType="outline"
  variant="ghost"
  onClick={() => setModalChangeDateIsOpen(true)}
  aria-label={formatMessage(m.openDatePickerModal)}
>
</Button>

This change would require adding a new message to your localization file for the aria-label text.


75-104: LGTM! Consider adding a cancel button.

The modal implementation is well-structured and functional:

  • It uses appropriate UI components and handles state correctly.
  • The DatePicker is properly configured with localization.
  • The submit button correctly calls the extendDeadline function and closes the modal.

Consider adding a cancel button to the modal for better user experience:

<Box display="flex" justifyContent="spaceBetween" marginTop={5}>
  <Button
    variant="ghost"
    onClick={() => setModalChangeDateIsOpen(false)}
  >
    {formatMessage(m.cancel)}
  </Button>
  <Button
    loading={loading}
    onClick={() => {
      extendDeadline(endDate)
      setModalChangeDateIsOpen(false)
    }}
  >
    {formatMessage(m.updateListEndTime)}
  </Button>
</Box>

This change would require adding a new message to your localization file for the cancel button text.

libs/portals/admin/signature-collection/src/screens-parliamentary/components/signees.tsx (1)

49-165: LGTM: Well-structured JSX with room for minor improvement.

The component's JSX structure is well-organized, utilizing appropriate UI components and implementing responsive design with GridRow and GridColumn. The conditional rendering effectively handles different states of the component.

Consider adding an aria-label to the search input for improved accessibility:

<FilterInput
  name="searchSignee"
  value={searchTerm}
  onChange={(v) => setSearchTerm(v)}
  placeholder={formatMessage(m.searchInListPlaceholder)}
  backgroundColor="white"
+ aria-label={formatMessage(m.searchInListAriaLabel)}
/>

Don't forget to add the corresponding message to your localization file.

libs/portals/admin/signature-collection/src/screens-presidential/AllLists/index.tsx (5)

Line range hint 229-288: Consider enhancing reusability with prop-based rendering

The addition of collection.isPresidential check improves the component's flexibility for presidential lists. However, this might limit its reusability across different NextJS apps within the monorepo.

Consider refactoring this logic to use props for determining the list type and rendering conditions. This approach would enhance the component's reusability and make it more adaptable to different contexts.

Example:

interface ListsProps {
  isPresidential: boolean;
  // ... other props
}

const Lists: React.FC<ListsProps> = ({ isPresidential, ...otherProps }) => {
  // ... component logic

  return (
    // ... other JSX
    {lists?.length > 0 && isPresidential ? (
      // ... presidential list rendering
    ) : (
      // ... other list rendering
    )}
    // ... other JSX
  );
};

This change would allow the component to be used for both presidential and non-presidential lists, improving its reusability across the monorepo.


285-286: Approved: Navigation path update improves context specificity

The change from SignatureCollectionPaths.SignatureList to SignatureCollectionPaths.PresidentialList aligns well with the presidential context. The use of :listId instead of :id enhances code clarity.

To further improve consistency and type safety, consider using a typed parameter for the replace method:

SignatureCollectionPaths.PresidentialList.replace(':listId', list.id.toString())

This ensures that list.id is explicitly converted to a string, preventing potential type mismatches.


Line range hint 314-332: Consider extracting pagination logic for improved reusability

The addition of the collection.isPresidential check for pagination rendering is consistent with previous changes. However, to enhance reusability across different NextJS apps in the monorepo, consider extracting the pagination logic into a separate component.

Example:

interface PaginationWrapperProps {
  isVisible: boolean;
  lists: Array<any>; // Replace 'any' with the correct type
  page: number;
  setPage: (page: number) => void;
}

const PaginationWrapper: React.FC<PaginationWrapperProps> = ({
  isVisible,
  lists,
  page,
  setPage,
}) => {
  if (!isVisible || lists.length === 0) return null;

  return (
    <Box marginTop={5}>
      <Pagination
        totalItems={lists.length}
        itemsPerPage={pageSize}
        page={page}
        renderLink={(page, className, children) => (
          <Box
            cursor="pointer"
            className={className}
            onClick={() => setPage(page)}
            component="button"
          >
            {children}
          </Box>
        )}
      />
    </Box>
  );
};

This approach would improve the component's modularity and make it easier to reuse or replace the pagination functionality across different parts of the application.


349-351: Approved: Consistent conditional rendering with a suggestion for type safety

The addition of conditional rendering for the ReviewCandidates component based on collection.isPresidential is consistent with previous changes and improves the context-specific rendering of the component.

To enhance type safety and prevent potential runtime errors, consider adding a type guard or default value for collection.candidates:

<ReviewCandidates candidates={collection?.candidates ?? []} />

This ensures that even if collection is undefined or doesn't have a candidates property, an empty array will be passed to the component, maintaining type consistency and preventing potential runtime errors.


Line range hint 1-359: Overall assessment: Good changes with room for improvement in reusability

The changes made to this component generally improve its functionality for handling presidential lists. However, there are opportunities to enhance its reusability and adherence to the coding guidelines for libs/**/* files:

  1. Consider using more TypeScript interfaces or types for props and exported entities to improve type safety and documentation.
  2. Evaluate the possibility of making the component more generic by using props instead of directly accessing collection.isPresidential. This would improve its reusability across different NextJS apps in the monorepo.
  3. Look for opportunities to extract reusable logic into custom hooks or utility functions, which could be shared across the monorepo.
  4. Ensure that any new exports are tree-shakable to maintain effective bundling practices.

By addressing these points, the component will better align with the coding guidelines and improve its overall quality and reusability within the monorepo.

libs/portals/admin/signature-collection/src/lib/messages.ts (1)

15-19: Consider adding a description for better context.

The new signatureListsConstituencyTitle message follows the correct pattern and naming convention. However, adding a brief description would provide better context for translators and developers.

Consider adding a description, for example:

 signatureListsConstituencyTitle: {
   id: 'admin-portal.signature-collection:signatureListsConstituencyTitle',
   defaultMessage: 'Kjördæmi',
-  description: '',
+  description: 'Title for the constituency in signature lists',
 },
libs/portals/admin/signature-collection/src/module.tsx (1)

Line range hint 68-74: Ensure TypeScript types are defined for component props

The AllLists and List components receive an allowedToProcess prop derived from user scopes. Ensure that these components have their props properly typed using TypeScript interfaces or types. This enhances type safety and aligns with the coding guidelines for defining props and exporting types.

Example:

interface AllListsProps {
  allowedToProcess: boolean
}

const AllLists: React.FC<AllListsProps> = ({ allowedToProcess }) => {
  // component implementation
}
Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL

Commits

Files that changed from the base of the PR and between 11e807e and 6828e5f.

Files selected for processing (21)
  • libs/portals/admin/signature-collection/src/lib/messages.ts (2 hunks)
  • libs/portals/admin/signature-collection/src/lib/navigation.ts (1 hunks)
  • libs/portals/admin/signature-collection/src/lib/paths.ts (1 hunks)
  • libs/portals/admin/signature-collection/src/module.tsx (3 hunks)
  • libs/portals/admin/signature-collection/src/screens-parliamentary/SingleConstituencyView/index.tsx (1 hunks)
  • libs/portals/admin/signature-collection/src/screens-parliamentary/SingleListView/index.tsx (1 hunks)
  • libs/portals/admin/signature-collection/src/screens-parliamentary/components/compareLists/index.tsx (1 hunks)
  • libs/portals/admin/signature-collection/src/screens-parliamentary/components/completeReview/index.tsx (1 hunks)
  • libs/portals/admin/signature-collection/src/screens-parliamentary/components/extendDeadline/index.tsx (1 hunks)
  • libs/portals/admin/signature-collection/src/screens-parliamentary/components/signees.tsx (1 hunks)
  • libs/portals/admin/signature-collection/src/screens-parliamentary/components/sortSignees/index.tsx (1 hunks)
  • libs/portals/admin/signature-collection/src/screens-parliamentary/index.tsx (1 hunks)
  • libs/portals/admin/signature-collection/src/screens-presidential/AllLists/AllLists.loader.ts (1 hunks)
  • libs/portals/admin/signature-collection/src/screens-presidential/AllLists/components/compareLists/compareLists.graphql (1 hunks)
  • libs/portals/admin/signature-collection/src/screens-presidential/AllLists/components/compareLists/removeSignatureFromList.graphql (1 hunks)
  • libs/portals/admin/signature-collection/src/screens-presidential/AllLists/components/compareLists/skeleton.tsx (1 hunks)
  • libs/portals/admin/signature-collection/src/screens-presidential/AllLists/index.tsx (4 hunks)
  • libs/portals/admin/signature-collection/src/screens-presidential/List/List.loader.ts (3 hunks)
  • libs/portals/admin/signature-collection/src/screens-presidential/List/components/completeReview/toggleListReview.graphql (1 hunks)
  • libs/portals/admin/signature-collection/src/screens-presidential/List/components/extendDeadline/extendDeadline.graphql (1 hunks)
  • libs/portals/admin/signature-collection/src/screens-presidential/List/components/skeleton.tsx (1 hunks)
Additional context used
Path-based instructions (21)
libs/portals/admin/signature-collection/src/lib/messages.ts (1)

Pattern libs/**/*: "Confirm that the code adheres to the following:

  • Reusability of components and hooks across different NextJS apps.
  • TypeScript usage for defining props and exporting types.
  • Effective tree-shaking and bundling practices."
libs/portals/admin/signature-collection/src/lib/navigation.ts (1)

Pattern libs/**/*: "Confirm that the code adheres to the following:

  • Reusability of components and hooks across different NextJS apps.
  • TypeScript usage for defining props and exporting types.
  • Effective tree-shaking and bundling practices."
libs/portals/admin/signature-collection/src/lib/paths.ts (1)

Pattern libs/**/*: "Confirm that the code adheres to the following:

  • Reusability of components and hooks across different NextJS apps.
  • TypeScript usage for defining props and exporting types.
  • Effective tree-shaking and bundling practices."
libs/portals/admin/signature-collection/src/module.tsx (1)

Pattern libs/**/*: "Confirm that the code adheres to the following:

  • Reusability of components and hooks across different NextJS apps.
  • TypeScript usage for defining props and exporting types.
  • Effective tree-shaking and bundling practices."
libs/portals/admin/signature-collection/src/screens-parliamentary/SingleConstituencyView/index.tsx (1)

Pattern libs/**/*: "Confirm that the code adheres to the following:

  • Reusability of components and hooks across different NextJS apps.
  • TypeScript usage for defining props and exporting types.
  • Effective tree-shaking and bundling practices."
libs/portals/admin/signature-collection/src/screens-parliamentary/SingleListView/index.tsx (1)

Pattern libs/**/*: "Confirm that the code adheres to the following:

  • Reusability of components and hooks across different NextJS apps.
  • TypeScript usage for defining props and exporting types.
  • Effective tree-shaking and bundling practices."
libs/portals/admin/signature-collection/src/screens-parliamentary/components/compareLists/index.tsx (1)

Pattern libs/**/*: "Confirm that the code adheres to the following:

  • Reusability of components and hooks across different NextJS apps.
  • TypeScript usage for defining props and exporting types.
  • Effective tree-shaking and bundling practices."
libs/portals/admin/signature-collection/src/screens-parliamentary/components/completeReview/index.tsx (1)

Pattern libs/**/*: "Confirm that the code adheres to the following:

  • Reusability of components and hooks across different NextJS apps.
  • TypeScript usage for defining props and exporting types.
  • Effective tree-shaking and bundling practices."
libs/portals/admin/signature-collection/src/screens-parliamentary/components/extendDeadline/index.tsx (1)

Pattern libs/**/*: "Confirm that the code adheres to the following:

  • Reusability of components and hooks across different NextJS apps.
  • TypeScript usage for defining props and exporting types.
  • Effective tree-shaking and bundling practices."
libs/portals/admin/signature-collection/src/screens-parliamentary/components/signees.tsx (1)

Pattern libs/**/*: "Confirm that the code adheres to the following:

  • Reusability of components and hooks across different NextJS apps.
  • TypeScript usage for defining props and exporting types.
  • Effective tree-shaking and bundling practices."
libs/portals/admin/signature-collection/src/screens-parliamentary/components/sortSignees/index.tsx (1)

Pattern libs/**/*: "Confirm that the code adheres to the following:

  • Reusability of components and hooks across different NextJS apps.
  • TypeScript usage for defining props and exporting types.
  • Effective tree-shaking and bundling practices."
libs/portals/admin/signature-collection/src/screens-parliamentary/index.tsx (1)

Pattern libs/**/*: "Confirm that the code adheres to the following:

  • Reusability of components and hooks across different NextJS apps.
  • TypeScript usage for defining props and exporting types.
  • Effective tree-shaking and bundling practices."
libs/portals/admin/signature-collection/src/screens-presidential/AllLists/AllLists.loader.ts (1)

Pattern libs/**/*: "Confirm that the code adheres to the following:

  • Reusability of components and hooks across different NextJS apps.
  • TypeScript usage for defining props and exporting types.
  • Effective tree-shaking and bundling practices."
libs/portals/admin/signature-collection/src/screens-presidential/AllLists/components/compareLists/compareLists.graphql (1)

Pattern libs/**/*: "Confirm that the code adheres to the following:

  • Reusability of components and hooks across different NextJS apps.
  • TypeScript usage for defining props and exporting types.
  • Effective tree-shaking and bundling practices."
libs/portals/admin/signature-collection/src/screens-presidential/AllLists/components/compareLists/removeSignatureFromList.graphql (1)

Pattern libs/**/*: "Confirm that the code adheres to the following:

  • Reusability of components and hooks across different NextJS apps.
  • TypeScript usage for defining props and exporting types.
  • Effective tree-shaking and bundling practices."
libs/portals/admin/signature-collection/src/screens-presidential/AllLists/components/compareLists/skeleton.tsx (1)

Pattern libs/**/*: "Confirm that the code adheres to the following:

  • Reusability of components and hooks across different NextJS apps.
  • TypeScript usage for defining props and exporting types.
  • Effective tree-shaking and bundling practices."
libs/portals/admin/signature-collection/src/screens-presidential/AllLists/index.tsx (1)

Pattern libs/**/*: "Confirm that the code adheres to the following:

  • Reusability of components and hooks across different NextJS apps.
  • TypeScript usage for defining props and exporting types.
  • Effective tree-shaking and bundling practices."
libs/portals/admin/signature-collection/src/screens-presidential/List/List.loader.ts (1)

Pattern libs/**/*: "Confirm that the code adheres to the following:

  • Reusability of components and hooks across different NextJS apps.
  • TypeScript usage for defining props and exporting types.
  • Effective tree-shaking and bundling practices."
libs/portals/admin/signature-collection/src/screens-presidential/List/components/completeReview/toggleListReview.graphql (1)

Pattern libs/**/*: "Confirm that the code adheres to the following:

  • Reusability of components and hooks across different NextJS apps.
  • TypeScript usage for defining props and exporting types.
  • Effective tree-shaking and bundling practices."
libs/portals/admin/signature-collection/src/screens-presidential/List/components/extendDeadline/extendDeadline.graphql (1)

Pattern libs/**/*: "Confirm that the code adheres to the following:

  • Reusability of components and hooks across different NextJS apps.
  • TypeScript usage for defining props and exporting types.
  • Effective tree-shaking and bundling practices."
libs/portals/admin/signature-collection/src/screens-presidential/List/components/skeleton.tsx (1)

Pattern libs/**/*: "Confirm that the code adheres to the following:

  • Reusability of components and hooks across different NextJS apps.
  • TypeScript usage for defining props and exporting types.
  • Effective tree-shaking and bundling practices."
Biome
libs/portals/admin/signature-collection/src/screens-parliamentary/components/compareLists/index.tsx

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

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)

Additional comments not posted (32)
libs/portals/admin/signature-collection/src/screens-presidential/AllLists/components/compareLists/compareLists.graphql (2)

1-2: LGTM: Mutation structure and input type are well-defined.

The BulkCompare mutation is correctly structured with a descriptive name and appropriate input type. The operation name signatureCollectionAdminBulkCompareSignaturesAllLists clearly indicates its purpose of comparing signatures across all lists.


3-14: LGTM: Returned fields structure is comprehensive and well-organized.

The returned fields provide a complete set of information for each signature comparison result:

  • List identification (id, listId, listTitle)
  • Signee details (name, nationalId, address)
  • Signature status (isDigital, valid)
  • Timestamp (created)

This structure allows for efficient processing and display of comparison results.

libs/portals/admin/signature-collection/src/screens-presidential/AllLists/components/compareLists/skeleton.tsx (1)

1-1: LGTM: Import statement is well-structured and follows best practices.

The import statement correctly destructures the required components from the shared UI library, promoting reusability across different NextJS apps as per the coding guidelines.

libs/portals/admin/signature-collection/src/lib/navigation.ts (4)

3-3: LGTM: New import for parliamentary messages

The addition of parliamentaryMessages import is consistent with TypeScript usage and supports the new navigation item. This change enhances the localization support for parliamentary contexts.


8-8: Icon update looks good

Changing the icon from 'settings' to 'receipt' is a minor UI improvement. It likely better represents the signature collection functionality.


Line range hint 1-24: Overall changes align well with guidelines and PR objectives

The modifications to navigation.ts successfully set up the structure for Parliamentary Lists while maintaining adherence to the coding guidelines:

  1. The changes enhance reusability across different NextJS apps by providing a flexible navigation structure that separates parliamentary and presidential lists.
  2. TypeScript is used effectively for defining types and props, as seen in the use of PortalNavigationItem and the imported message types.
  3. The modular structure of the navigation object supports effective tree-shaking and bundling practices.

These changes lay a solid foundation for the new Parliamentary Lists feature while maintaining code quality and consistency.


11-11: Path update aligns with PR objectives

The change from SignatureCollectionPaths.SignatureLists to SignatureCollectionPaths.ParliamentaryRoot supports the setup for Parliamentary Lists. This modification enhances the navigation structure for the new feature.

To ensure consistency across the application, please verify that all references to the old path have been updated:

Verification successful

Path update verified successfully

All references to SignatureCollectionPaths.SignatureLists have been updated to SignatureCollectionPaths.ParliamentaryRoot. The navigation structure changes are consistent throughout the application.

Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Search for any remaining references to the old path
rg "SignatureCollectionPaths.SignatureLists" --type typescript

Length of output: 97


Script:

#!/bin/bash
# Search for any remaining references to the old path in TypeScript files
rg "SignatureCollectionPaths.SignatureLists" -g "*.ts" -g "*.tsx"

Length of output: 65

libs/portals/admin/signature-collection/src/screens-presidential/List/components/skeleton.tsx (2)

1-1: LGTM: Imports are concise and from the correct library.

The imports are correctly sourced from the project's UI library '@island.is/island-ui/core' and include only the necessary components.


24-24: LGTM: Export statement is correct.

The default export of the Skeleton component is appropriate for a single-component file and follows common React practices.

libs/portals/admin/signature-collection/src/screens-parliamentary/components/sortSignees/index.tsx (3)

1-4: Imports and type definitions look good.

The component correctly imports necessary dependencies from '@island.is' packages and uses the 'Signature' type from the API schema. This adheres to the guideline of using TypeScript for defining props and ensures consistency with the API.


6-15: Component definition and props are well-structured.

The SortSignees component is correctly defined as a function component with TypeScript props. The props (signees, setSignees, and setPage) are well-typed, adhering to the guideline of using TypeScript for defining props. This structure promotes type safety and improves code maintainability.


1-52: Overall, the SortSignees component is well-implemented and adheres to project guidelines.

The component successfully implements sorting functionality for signature lists, using TypeScript for type safety and following React best practices. It adheres to the coding guidelines for the libs directory, including reusability and effective use of TypeScript. The component structure, props definition, and render logic are all well-implemented.

Some suggestions for improvement have been made, including:

  1. Extracting the sorting logic into a custom hook for better reusability.
  2. Memoizing the sorting options array for potential performance improvements.

These suggestions aim to further enhance the component's reusability and performance, aligning with the project's guidelines for components in the libs directory.

libs/portals/admin/signature-collection/src/screens-presidential/List/List.loader.ts (2)

42-42: LGTM! Consistent change.

This change is consistent with the previous instance, maintaining improved clarity and specificity by using params.listId.


52-52: LGTM! Consistent change with positive overall impact.

This change is consistent with the previous instances, maintaining improved clarity and specificity by using params.listId.

The overall impact of these changes is positive:

  1. Improved code clarity and consistency across the loader function.
  2. Maintained TypeScript usage for type safety.
  3. Preserved the reusability of the loader function across different NextJS apps.
  4. No apparent negative impact on functionality or performance.

These changes align well with the coding guidelines for files in the libs directory.

libs/portals/admin/signature-collection/src/screens-parliamentary/SingleListView/index.tsx (2)

1-10: Imports look good and follow project guidelines.

The imports demonstrate good practices:

  1. Utilizing reusable components from @island.is libraries.
  2. Using TypeScript for type definitions (e.g., SignatureCollectionList).
  3. Importing localization utilities, which supports maintainability.

These practices align well with the coding guidelines for files in the libs directory.


1-50: Overall, excellent implementation of the SingleListView component.

This component demonstrates high-quality code that aligns well with the project's guidelines:

  1. Effectively uses reusable components from @island.is libraries.
  2. Implements TypeScript for improved type safety and developer experience.
  3. Follows best practices for React functional components and hooks.
  4. Properly implements localization for better maintainability.
  5. Uses a responsive layout structure.

The component is well-structured and should be easily maintainable. Great job on creating a reusable and type-safe component for the admin portal!

libs/portals/admin/signature-collection/src/screens-parliamentary/index.tsx (3)

26-42: LGTM! Well-structured and responsive layout.

The component's structure is well-organized, using a responsive grid layout. It effectively reuses components from the island.is ecosystem, promoting consistency across the application.


1-88: Overall assessment: Well-structured component with room for improvements.

The ParliamentaryRoot component is well-organized and adheres to the coding guidelines for libs directory files. It demonstrates good practices in terms of reusability, TypeScript usage, and integration with the island.is ecosystem.

Key points:

  1. The component structure promotes reusability across different NextJS apps.
  2. TypeScript is used effectively for defining props and types.
  3. The layout is responsive and uses consistent UI components.

Areas for improvement:

  1. Enhance tree-shaking by destructuring imports.
  2. Implement the filter functionality.
  3. Improve localization for hardcoded strings.
  4. Use more robust methods for route generation.
  5. Add error handling for potential undefined values.

Addressing these points will further improve the component's quality and maintainability.


43-80: ⚠️ Potential issue

Implement filter functionality and improve localization.

The content rendering logic is generally good, but there are a few areas for improvement:

  1. The FilterInput has a placeholder onChange handler. Implement the actual filtering logic.
  2. The text "Kjördæmi: 6" is hardcoded and not localized. Consider making this dynamic and localizable.
  3. The navigation to constituency details uses string replacement. Consider using a more robust method for route generation.

Here's a suggested improvement for the constituency navigation:

import { generatePath } from 'react-router-dom';

// ...

onClick: () => {
  navigate(
    generatePath(SignatureCollectionPaths.ParliamentaryConstituency, {
      constituencyName: area.name,
    })
  )
},

This approach is more type-safe and less prone to errors.

To ensure the SignatureCollectionPaths.ParliamentaryConstituency is correctly defined, run the following script:

This script will help us confirm that the path is correctly defined with the :constituencyName parameter.

Verification successful

[/run_scripts]


Path parameterization verified successfully.

The SignatureCollectionPaths.ParliamentaryConstituency is correctly defined with the :constituencyName parameter. Implementing generatePath for route generation will enhance type safety and reduce potential errors.

Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the definition of SignatureCollectionPaths.ParliamentaryConstituency

rg --type typescript "ParliamentaryConstituency.*=.*:constituencyName" libs/portals/admin/signature-collection/src/

Length of output: 152


Script:

#!/bin/bash
# Description: Retry verifying the definition of SignatureCollectionPaths.ParliamentaryConstituency without specifying file type

rg "ParliamentaryConstituency\s*=\s*.*:constituencyName" libs/portals/admin/signature-collection/src/

Length of output: 231

libs/portals/admin/signature-collection/src/screens-parliamentary/components/completeReview/index.tsx (5)

1-16: Imports and component definition look good.

The imports are well-organized and the component is properly defined using TypeScript for props. This adheres to the coding guidelines for libs, ensuring type safety and facilitating tree-shaking.


17-20: Effective use of hooks and state management.

The component makes good use of various hooks, including custom hooks for localization and GraphQL mutations. The use of useRevalidator from React Router demonstrates good integration practices, enhancing the component's reusability across different NextJS apps.


47-95: Well-structured JSX with good use of UI components.

The component's render logic is clean and makes good use of the UI library components. The conditional rendering based on the list status is implemented effectively, and the use of formatMessage ensures proper localization.


54-57: Clarify the intention of the commented-out disabled prop.

There's a commented-out disabled prop on the button. It's not clear why this is commented out.

Could you clarify the intention behind this commented code? If it's no longer needed, consider removing it. If it's meant to be used, please uncomment and test it.


1-97: Component adheres well to coding guidelines for libs.

This component demonstrates good practices as required for the libs directory:

  1. It's designed to be reusable across different NextJS apps.
  2. TypeScript is effectively used for defining props and exporting types.
  3. The component's logic is self-contained, facilitating easy integration and tree-shaking.

Great job on following the established coding guidelines!

libs/portals/admin/signature-collection/src/screens-parliamentary/components/extendDeadline/index.tsx (2)

1-24: LGTM! Adheres to coding guidelines.

The imports and component declaration follow best practices:

  • Appropriate UI components and hooks are imported.
  • TypeScript is used to define prop types, enhancing type safety.
  • The component is exported, promoting reusability across different NextJS apps.

These aspects align well with the coding guidelines for files in the libs directory.


109-109: LGTM! Proper export for reusability.

The component is correctly exported as the default export. This adheres to the coding guideline of ensuring reusability of components across different NextJS apps.

libs/portals/admin/signature-collection/src/screens-parliamentary/components/signees.tsx (2)

1-21: LGTM: Imports and component declaration look good.

The imports are well-organized and the component declaration follows TypeScript best practices. The file's location in the libs directory suggests it's designed for reusability across different NextJS apps, which aligns with the coding guidelines.


21-21: LGTM: Component structure and exports are well-defined.

The Signees component is correctly defined as a function component and exported as the default export. This follows React best practices and allows for easy import in other files. The component name matching the file name is a good convention that enhances code readability and maintainability.

Also applies to: 166-170

libs/portals/admin/signature-collection/src/lib/messages.ts (1)

Line range hint 1-529: LGTM! Code complies with coding guidelines for libs/**/* files.

The changes in this file adhere to the coding guidelines for libs/**/* files:

  1. The messages are exported, ensuring reusability across different NextJS apps.
  2. TypeScript is used correctly for defining message types.
  3. The use of defineMessages from react-intl supports effective tree-shaking and bundling practices.
libs/portals/admin/signature-collection/src/module.tsx (2)

56-56: Confirm updated path definitions for presidential routes

The paths for presidential routes have been updated to SignatureCollectionPaths.PresidentialLists and SignatureCollectionPaths.PresidentialList. Verify that these paths are correctly defined in SignatureCollectionPaths and that all references in the codebase have been updated to prevent broken links.

Run the following script to check the path definitions and their usage:

Also applies to: 68-68

Verification successful

Path definitions for presidential routes are correctly implemented and referenced.

All instances of SignatureCollectionPaths.PresidentialLists and SignatureCollectionPaths.PresidentialList are properly defined and used consistently across the codebase, ensuring there are no broken links.

Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify presidential path definitions and usage

# Test: Search for path definitions
rg --type ts 'PresidentialLists|PresidentialList' ./lib/paths.ts

# Test: Search for path usage across the codebase
rg --type ts 'SignatureCollectionPaths.PresidentialLists|SignatureCollectionPaths.PresidentialList' ./ --glob '!node_modules'

Length of output: 767


Script:

#!/bin/bash
# Description: Locate the definition of SignatureCollectionPaths

# Test: Search for the definition of SignatureCollectionPaths
rg --type ts 'export\s+const\s+SignatureCollectionPaths' ./ --glob '!node_modules' -A 10

Length of output: 90


Script:

#!/bin/bash
# Description: Locate the definition of SignatureCollectionPaths with varied patterns

# Test: Search for different declaration patterns of SignatureCollectionPaths
rg --type ts '(export\s+const|export\s+enum|export\s+interface|const|let|var)\s+SignatureCollectionPaths\s*=' ./ --glob '!node_modules' -A 10

Length of output: 143


Script:

#!/bin/bash
# Description: Broad search for any occurrence of SignatureCollectionPaths to locate its definition or imports

# Search for any occurrence of SignatureCollectionPaths
rg 'SignatureCollectionPaths' ./ --glob '!node_modules' -C 5

Length of output: 30615


9-17: Verify the existence and exports of parliamentary components

The components ParliamentaryRoot, ParliamentaryConstituency, and ParliamentaryList are being lazy-loaded from the ./screens-parliamentary directory. Ensure these components exist at the specified paths and are correctly exported to prevent runtime errors.

Run the following script to confirm the components exist and have default exports:

Verification successful

Parliamentary components exist and have default exports.

Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify parliamentary components

# Test: Find component files and check for default exports
fd --type f --extension tsx 'Parliamentary*.tsx' ./screens-parliamentary | xargs -I {} grep -H 'export default' {}

Length of output: 231


Script:

#!/bin/bash
# Description: Locate the screens-parliamentary directory and verify default exports

# Step 1: Find the correct path to the screens-parliamentary directory
screens_path=$(fd --type d 'screens-parliamentary' .)

if [ -z "$screens_path" ]; then
  echo "Error: screens-parliamentary directory not found."
  exit 1
fi

# Step 2: Verify that the parliamentary component files have default exports
fd --type f --extension tsx 'Parliamentary*.tsx' "$screens_path" | xargs -I {} grep -H 'export default' {}

Length of output: 370


Script:

#!/bin/bash
# Description: List all .tsx files in the screens-parliamentary directory

fd --type f --extension tsx . ./libs/portals/admin/signature-collection/src/screens-parliamentary/

Length of output: 1071


Script:

#!/bin/bash
# Description: Verify default exports of parliamentary components

# Define the paths to the component files
component_files=(
  "./libs/portals/admin/signature-collection/src/screens-parliamentary/index.tsx"
  "./libs/portals/admin/signature-collection/src/screens-parliamentary/SingleConstituencyView/index.tsx"
  "./libs/portals/admin/signature-collection/src/screens-parliamentary/SingleListView/index.tsx"
)

# Iterate over each file and check for a default export
for file in "${component_files[@]}"; do
  if [ -f "$file" ]; then
    grep -H 'export default' "$file"
  else
    echo "Error: File $file does not exist."
  fi
done

Length of output: 1448

libs/portals/admin/signature-collection/src/screens-parliamentary/components/compareLists/index.tsx (1)

69-69: Avoid displaying raw error messages to users

Copy link
Contributor

@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 (11)
libs/portals/admin/signature-collection/src/shared-components/sortSignees/index.tsx (1)

Line range hint 1-53: LGTM! Consider named imports for better tree-shaking.

The component adheres well to the coding guidelines:

  • It's reusable across different NextJS apps dealing with signature sorting.
  • TypeScript is used effectively for prop definitions.
  • The overall structure supports tree-shaking.

For even better tree-shaking, consider using named imports for the island-ui/core package if possible:

import { DropdownMenu } from '@island.is/island-ui/core'

This change would allow for more efficient tree-shaking by explicitly importing only the needed component.

libs/portals/admin/signature-collection/src/shared-components/completeReview/index.tsx (1)

Line range hint 1-95: Ensure adherence to coding guidelines for reusable components.

The component generally adheres to the coding guidelines for libs directory components. It uses TypeScript for prop definitions and appears to be designed for reusability. However, please ensure that:

  1. The changes to import paths and prop types don't affect the component's reusability across different NextJS apps.
  2. The component remains self-contained and doesn't introduce any app-specific logic that could hinder its use in other contexts.
  3. All exported types are properly defined and exported for use in other components or apps.

Consider the following improvements:

  1. Extract the toggleReview function into a custom hook to enhance reusability and testability.
  2. Use a constant for the modal ID instead of a string literal to improve maintainability.
  3. Consider using a custom type for the component props to improve readability and reusability:
type ActionReviewCompleteProps = {
  listId: string;
  listStatus?: string;
};

const ActionReviewComplete: React.FC<ActionReviewCompleteProps> = ({ listId, listStatus }) => {
  // ... component logic
};
libs/portals/admin/signature-collection/src/shared-components/extendDeadline/index.tsx (4)

23-23: LGTM: Props interface update improves flexibility.

The change to make allowedToProcess an optional prop (allowedToProcess?: boolean) improves the component's flexibility. This is a good practice in React component design.

Consider adding a default value for allowedToProcess to ensure consistent behavior when the prop is not provided. You can do this in the function parameters:

const ActionExtendDeadline = ({
  listId,
  endTime,
  allowedToProcess = false,
}: {
  listId: string
  endTime: string
  allowedToProcess?: boolean
}) => {
  // ...
}

Line range hint 1-111: LGTM: Component structure promotes reusability.

The ActionExtendDeadline component is well-structured and uses shared UI components, which aligns with the reusability guideline for libs. It encapsulates the deadline extension functionality, making it potentially reusable across different NextJS apps.

To further enhance reusability, consider accepting a custom mutation function as a prop. This would allow the component to be used in different contexts with varying backend implementations. For example:

type ExtendDeadlineMutationFn = (newEndDate: string) => Promise<boolean>;

const ActionExtendDeadline = ({
  listId,
  endTime,
  allowedToProcess = false,
  onExtendDeadline,
}: {
  listId: string
  endTime: string
  allowedToProcess?: boolean
  onExtendDeadline: ExtendDeadlineMutationFn
}) => {
  // ...

  const extendDeadline = async (newEndDate: string) => {
    try {
      const success = await onExtendDeadline(newEndDate);
      if (success) {
        toast.success(formatMessage(m.updateListEndTimeSuccess))
        revalidate()
      } else {
        toast.error(formatMessage(m.updateListEndTimeError))
      }
    } catch (e) {
      toast.error(e.message)
    }
  }

  // ...
}

This change would make the component more flexible and easier to use in different contexts.


Line range hint 1-111: Enhance TypeScript usage for better type safety.

While the component uses TypeScript for props definition, there are opportunities to improve type safety and code readability by adding more type annotations.

Consider adding the following type annotations:

  1. For the extendDeadline function:
const extendDeadline = async (newEndDate: string): Promise<void> => {
  // ...
}
  1. For the format function call:
value={format(new Date(endDate), 'dd.MM.yyyy HH:mm')}
  1. For the DatePicker handleChange prop:
handleChange={(date: Date | null) => setEndDate(date ? date.toISOString() : endTime)}

These additions will improve type safety and make the code more self-documenting.


Line range hint 1-7: LGTM: Effective import practices for tree-shaking.

The use of named imports from external libraries is good for enabling effective tree-shaking. This practice allows bundlers to eliminate unused code, potentially reducing the final bundle size.

To further optimize imports, consider grouping related imports from the same package. For example:

import {
  Box,
  Button,
  DatePicker,
  Input,
} from '@island.is/island-ui/core'
import { toast } from '@island.is/island-ui/core'

Could be combined into:

import {
  Box,
  Button,
  DatePicker,
  Input,
  toast,
} from '@island.is/island-ui/core'

This change doesn't affect tree-shaking but can make the imports more organized and easier to maintain.

libs/portals/admin/signature-collection/src/shared-components/signees/index.tsx (3)

17-19: LGTM! Consider using absolute imports for better maintainability.

The updated import paths reflect the project's new directory structure. While the relative imports are consistent with the previous approach, consider using absolute imports for better maintainability and easier refactoring in the future.

You could update the import statements to use absolute paths:

import SortSignees from '@island.is/portals/admin/signature-collection/shared-components/sortSignees'
import { pageSize } from '@island.is/portals/admin/signature-collection/lib/utils'
import { m } from '@island.is/portals/admin/signature-collection/lib/messages'

This approach would require updating your TypeScript configuration to support path aliases, but it would make the imports more resilient to file moves and easier to understand at a glance.


Line range hint 1-185: Good adherence to coding guidelines. Consider named exports for better tree-shaking.

The code adheres well to the coding guidelines:

  1. The component seems designed for reusability across different NextJS apps.
  2. TypeScript is used effectively for defining props (e.g., numberOfSignatures: number).

To further improve tree-shaking capabilities, consider using named exports instead of default exports.

Update the export statement at the end of the file:

export { Signees }

And update the component declaration:

export const Signees = ({ numberOfSignatures }: { numberOfSignatures: number }) => {
  // ... component logic ...
}

This change allows for more efficient tree-shaking in bundlers that support it.


Incomplete Removal of Address-Related Data

The search revealed existing references to address-related fields in the codebase. Please address the following files:

  • libs/service-portal/signature-collection/src/screens/Presidential/OwnerView/ViewList/SigneesOverview.tsx
  • libs/application/templates/signature-collection/presidential-list-signing/src/forms/Draft.ts
  • libs/clients/signature-collection/src/lib/signature-collection.service.spec.ts
Analysis chain

Line range hint 1-185: Verify the intentional removal of address-related data.

The AI summary mentions the removal of the signee's address from the table header and corresponding data cell. However, this change is not directly visible in the provided code. Please confirm if this removal was intentional and consider the following points:

  1. Does this change affect any other parts of the application that might expect address data?
  2. Has the data model or API response structure changed to no longer include address information?
  3. Are there any UI/UX implications of removing this information that need to be addressed?

To help verify the impact of this change, you can run the following script:

This will help identify any other components or files that might still be expecting or using the address information.

Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Search for any remaining references to address-related fields in the codebase
rg --type typescript --type javascript 'signee.*address|address.*signee'

Length of output: 109


Script:

#!/bin/bash
# Search for any remaining references to address-related fields in the codebase
rg 'signee.*address|address.*signee' --glob '*.{ts,tsx,js,jsx}'

Length of output: 484

libs/portals/admin/signature-collection/src/shared-components/compareLists/index.tsx (2)

Line range hint 1-191: Suggestions for improved adherence to coding guidelines

The component generally adheres well to the coding guidelines for the libs directory. However, consider the following improvements:

  1. Export the prop types for better reusability and type checking across the project:
export interface CompareListsProps {
  collectionId: string;
}

const CompareLists = ({ collectionId }: CompareListsProps) => {
  // ... component implementation
}
  1. Consider moving utility functions like formatNationalId, createFileList, and getFileData to a shared utility file if they're not already there. This would enhance reusability across different NextJS apps.

These changes will further improve the component's adherence to the coding guidelines, particularly in terms of reusability and TypeScript usage.


Line range hint 1-191: Suggestions for improving component structure and functionality

While the component is functional, consider the following improvements:

  1. Enhance error handling, especially for the file upload process. Consider using a try-catch block in the onChange function and provide more specific error messages to the user.

  2. The component is quite large. Consider splitting it into smaller, more focused components. For example:

    • FileUploadSection
    • ResultsTable
    • UnsignButton
  3. Improve loading state management for async operations. Consider using a single loading state for the entire component or more granular loading states for different operations.

  4. Use TypeScript to define the shape of the uploadResults state instead of using any.

These changes will improve the maintainability and robustness of the component.

Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL

Commits

Files that changed from the base of the PR and between 6828e5f and 0ec0d5e.

Files selected for processing (9)
  • libs/portals/admin/signature-collection/src/screens-parliamentary/SingleListView/index.tsx (1 hunks)
  • libs/portals/admin/signature-collection/src/screens-parliamentary/index.tsx (1 hunks)
  • libs/portals/admin/signature-collection/src/screens-presidential/AllLists/index.tsx (5 hunks)
  • libs/portals/admin/signature-collection/src/screens-presidential/List/index.tsx (1 hunks)
  • libs/portals/admin/signature-collection/src/shared-components/compareLists/index.tsx (1 hunks)
  • libs/portals/admin/signature-collection/src/shared-components/completeReview/index.tsx (2 hunks)
  • libs/portals/admin/signature-collection/src/shared-components/extendDeadline/index.tsx (2 hunks)
  • libs/portals/admin/signature-collection/src/shared-components/signees/index.tsx (1 hunks)
  • libs/portals/admin/signature-collection/src/shared-components/sortSignees/index.tsx (1 hunks)
Files skipped from review as they are similar to previous changes (3)
  • libs/portals/admin/signature-collection/src/screens-parliamentary/SingleListView/index.tsx
  • libs/portals/admin/signature-collection/src/screens-parliamentary/index.tsx
  • libs/portals/admin/signature-collection/src/screens-presidential/AllLists/index.tsx
Additional context used
Path-based instructions (6)
libs/portals/admin/signature-collection/src/screens-presidential/List/index.tsx (1)

Pattern libs/**/*: "Confirm that the code adheres to the following:

  • Reusability of components and hooks across different NextJS apps.
  • TypeScript usage for defining props and exporting types.
  • Effective tree-shaking and bundling practices."
libs/portals/admin/signature-collection/src/shared-components/compareLists/index.tsx (1)

Pattern libs/**/*: "Confirm that the code adheres to the following:

  • Reusability of components and hooks across different NextJS apps.
  • TypeScript usage for defining props and exporting types.
  • Effective tree-shaking and bundling practices."
libs/portals/admin/signature-collection/src/shared-components/completeReview/index.tsx (1)

Pattern libs/**/*: "Confirm that the code adheres to the following:

  • Reusability of components and hooks across different NextJS apps.
  • TypeScript usage for defining props and exporting types.
  • Effective tree-shaking and bundling practices."
libs/portals/admin/signature-collection/src/shared-components/extendDeadline/index.tsx (1)

Pattern libs/**/*: "Confirm that the code adheres to the following:

  • Reusability of components and hooks across different NextJS apps.
  • TypeScript usage for defining props and exporting types.
  • Effective tree-shaking and bundling practices."
libs/portals/admin/signature-collection/src/shared-components/signees/index.tsx (1)

Pattern libs/**/*: "Confirm that the code adheres to the following:

  • Reusability of components and hooks across different NextJS apps.
  • TypeScript usage for defining props and exporting types.
  • Effective tree-shaking and bundling practices."
libs/portals/admin/signature-collection/src/shared-components/sortSignees/index.tsx (1)

Pattern libs/**/*: "Confirm that the code adheres to the following:

  • Reusability of components and hooks across different NextJS apps.
  • TypeScript usage for defining props and exporting types.
  • Effective tree-shaking and bundling practices."
Additional comments not posted (6)
libs/portals/admin/signature-collection/src/shared-components/sortSignees/index.tsx (1)

4-4: LGTM! Verify the new import path.

The change to a shallower import path is good for maintainability. However, please ensure that this new path is correct and consistent across the project.

Run the following script to verify the existence of the imported file:

Verification successful

Verified! The new import path for m is correct and the messages.ts file exists in the specified location.

Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the existence of the imported messages file

# Test: Check if the file exists
fd --type f --full-path "libs/portals/admin/signature-collection/src/lib/messages.(ts|js|tsx|jsx)"

Length of output: 160

libs/portals/admin/signature-collection/src/shared-components/completeReview/index.tsx (1)

7-8: Verify the correctness of the updated import paths.

The import paths for m and ListStatus have been updated to more direct paths. While this simplifies the imports, please ensure that these new paths are correct and consistent with the current project structure.

Run the following script to verify the existence of the imported modules:

Verification successful

Import paths are correct and verified.

The updated import paths for m and ListStatus have been confirmed to exist and export the necessary members.

Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the existence of imported modules

# Test: Check if the files exist
fd --type f --full-path "lib/messages.ts" --exec echo "messages.ts exists"
fd --type f --full-path "lib/utils.ts" --exec echo "utils.ts exists"

# Test: Verify imports
rg --type typescript 'export const m =' lib/messages.ts
rg --type typescript 'export enum ListStatus' lib/utils.ts

Length of output: 8766


Script:

#!/bin/bash
# Description: Verify the existence of imported modules and their exports without using --type flag

# Test: Check if the specific files exist in the target directory
if [ -f "libs/portals/admin/signature-collection/src/lib/messages.ts" ]; then
  echo "messages.ts exists in the target directory"
else
  echo "messages.ts does not exist in the target directory"
fi

if [ -f "libs/portals/admin/signature-collection/src/lib/utils.ts" ]; then
  echo "utils.ts exists in the target directory"
else
  echo "utils.ts does not exist in the target directory"
fi

# Test: Verify exports in the specific files
rg 'export const m =' "libs/portals/admin/signature-collection/src/lib/messages.ts"
rg 'export enum ListStatus' "libs/portals/admin/signature-collection/src/lib/utils.ts"

Length of output: 556

libs/portals/admin/signature-collection/src/shared-components/extendDeadline/index.tsx (1)

14-14: Verify the correctness of the updated import path.

The import path for m has been simplified, which is generally a good practice. However, please ensure that this change doesn't break the import and that the messages module is correctly located at ../../lib/messages relative to this file.

Verification successful

To address the issue with the rg command not recognizing the typescript file type, please run the following updated scripts:


Import path verification successful.

The updated import path for m is correct and the messages.ts file exports m as expected.

Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the existence of the messages file and its exports

# Test 1: Check if the file exists
fd -p "libs/portals/admin/signature-collection/src/lib/messages.(ts|js|tsx|jsx)" -x echo "Messages file found: {}"

# Test 2: Check if the file exports 'm'
rg -t typescript -t javascript "export const m =" "libs/portals/admin/signature-collection/src/lib"

Length of output: 334


Script:

#!/bin/bash
# Description: Verify that the 'messages.ts' file exports 'm'

# Test 1: Check if the messages file exports 'm'
rg "export\s+const\s+m\s*=" "libs/portals/admin/signature-collection/src/lib/messages.ts"

Length of output: 123

libs/portals/admin/signature-collection/src/screens-presidential/List/index.tsx (2)

20-22: Improved component reusability

The changes to import statements enhance the reusability of components across different NextJS apps, which aligns well with our coding guidelines. Moving these components to a shared location (shared-components) is a good practice that can reduce code duplication and improve maintainability.


20-22: Verify exports in shared-components

To ensure effective tree-shaking and bundling practices, please confirm that the components ActionReviewComplete, Signees, and ActionExtendDeadline are properly exported from their respective files in the shared-components directory. This will help maintain optimal bundle sizes and support tree-shaking in the build process.

libs/portals/admin/signature-collection/src/shared-components/compareLists/index.tsx (1)

18-19: LGTM: Import paths updated correctly

The import statements have been updated to reflect the new project structure. This change simplifies the import paths and improves code organization. The new paths are consistent and should work correctly with the restructured project.

@coderabbitai coderabbitai bot mentioned this pull request Dec 11, 2024
6 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
automerge Merge this PR as soon as all checks pass
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants