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

enhance(apps/frontend-manage): make activity evaluation pages resizable #4362

Merged
merged 16 commits into from
Nov 30, 2024

Conversation

TheHummel
Copy link
Collaborator

@TheHummel TheHummel commented Nov 6, 2024

Summary by CodeRabbit

  • New Features

    • Introduced resizable and collapsible panels in the Choices, FT, and NR Evaluation components, enhancing user interactivity.
    • Implemented local state management for sidebar collapse functionality, improving user control over panel visibility.
  • Bug Fixes

    • Improved layout responsiveness and user experience by replacing static structures with dynamic resizing capabilities.

Copy link

aviator-app bot commented Nov 6, 2024

Current Aviator status

Aviator will automatically update this comment as the status of the PR changes.
Comment /aviator refresh to force Aviator to re-examine your PR (or learn about other /aviator commands).

This PR was merged manually (without Aviator). Merging manually can negatively impact the performance of the queue. Consider using Aviator next time.


See the real-time status of this PR on the Aviator webapp.
Use the Aviator Chrome Extension to see the status of your PR within GitHub.

Copy link

coderabbitai bot commented Nov 6, 2024

📝 Walkthrough
📝 Walkthrough

Walkthrough

This pull request introduces updates to three components: ChoicesEvaluation, FTEvaluation, and NREvaluation. Each component is modified to implement a new layout structure using ResizablePanelGroup, ResizablePanel, and ResizableHandle components from the @uzh-bf/design-system package. The previous static layouts are replaced with interactive designs that allow users to resize and collapse panels, while also incorporating local state management for the sidebar's collapsed state.

Changes

File Path Change Summary
apps/frontend-manage/src/components/evaluation/elements/*.tsx Introduced ResizablePanelGroup, ResizablePanel, and ResizableHandle components for dynamic resizing and collapsing functionality. Added useState for managing the collapsed state of sidebars in FTEvaluation and NREvaluation.

Possibly related PRs


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

gitguardian bot commented Nov 6, 2024

⚠️ GitGuardian has uncovered 12 secrets following the scan of your pull request.

Please consider investigating the findings and remediating the incidents. Failure to do so may lead to compromising the associated services or software components.

🔎 Detected hardcoded secrets in your pull request
GitGuardian id GitGuardian status Secret Commit Filename
1509424 Triggered Generic Password 42d14a4 docker-compose.yml View secret
1509424 Triggered Generic Password 42d14a4 util/_restore-prod.sh View secret
1509424 Triggered Generic Password 42d14a4 util/_restore-prod.sh View secret
1509424 Triggered Generic Password 42d14a4 util/_restore-prod.sh View secret
1509424 Triggered Generic Password 09c947b docker-compose.yml View secret
1623504 Triggered Username Password 09c947b deploy/compose-traefik-proxy/klicker/services.env View secret
1509424 Triggered Generic Password 09c947b deploy/compose/docker-compose.yml View secret
1509424 Triggered Generic Password 09c947b deploy/compose/docker-compose.yml View secret
1509424 Triggered Generic Password fb6f372 deploy/compose/docker-compose.yml View secret
1623504 Triggered Username Password fb6f372 deploy/compose-traefik-proxy/klicker/services.env View secret
1509424 Triggered Generic Password fb6f372 docker-compose.yml View secret
1509424 Triggered Generic Password fb6f372 deploy/compose/docker-compose.yml View secret
🛠 Guidelines to remediate hardcoded secrets
  1. Understand the implications of revoking this secret by investigating where it is used in your code.
  2. Replace and store your secrets safely. Learn here the best practices.
  3. Revoke and rotate these secrets.
  4. If possible, rewrite git history. Rewriting git history is not a trivial act. You might completely break other contributing developers' workflow and you risk accidentally deleting legitimate data.

To avoid such incidents in the future consider


🦉 GitGuardian detects secrets in your source code to help developers and security teams secure the modern development process. You are seeing this because you or someone else with access to this repository has authorized GitGuardian to scan your pull request.

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.

Caution

Inline review comments failed to post. This is likely due to GitHub's limits when posting large numbers of comments.

Actionable comments posted: 1

🧹 Outside diff range and nitpick comments (3)
apps/frontend-manage/src/components/evaluation/elements/ChoicesEvaluation.tsx (2)

28-31: Add type safety to useLocalStorage hook

Consider adding type safety to the useLocalStorage hook to ensure the stored value is always boolean.

-  const [isCollapsed, setIsCollapsed] = useLocalStorage(
+  const [isCollapsed, setIsCollapsed] = useLocalStorage<boolean>(
     `evaluation-${instanceEvaluation.id}-isCollapsed`,
     false
   )

48-62: Consider adding a collapse indicator or toggle button

When the sidebar is collapsed, there's no visual indication or easy way to expand it back. Consider adding a collapse indicator or toggle button for better user experience.

 <ResizablePanel
   defaultSize={isCollapsed ? 0 : 20}
   minSize={10}
   collapsible
   collapsedSize={0}
   onCollapse={() => setIsCollapsed(true)}
   onExpand={() => setIsCollapsed(false)}
-  className={twMerge('gap-2 border-l px-4 py-2', textSize.text)}
+  className={twMerge(
+    'gap-2 border-l px-4 py-2 relative',
+    textSize.text
+  )}
 >
+  {isCollapsed && (
+    <button
+      onClick={() => setIsCollapsed(false)}
+      className="absolute -left-4 top-2 bg-gray-200 p-1 rounded"
+      aria-label="Expand sidebar"
+    >
+      <span>⟨</span>
+    </button>
+  )}
   <ChoicesSidebar
     instance={instanceEvaluation}
     textSize={textSize}
     showSolution={showSolution}
   />
 </ResizablePanel>
apps/frontend-manage/src/components/evaluation/elements/NREvaluation.tsx (1)

49-49: Simplify the key prop to prevent unnecessary re-mounts

Including isCollapsed in the key prop of the ResizablePanel causes the component to unmount and remount whenever isCollapsed changes, which can lead to performance issues. Since React re-renders components based on state changes, it's unnecessary to alter the key for this purpose.

Apply this diff to optimize the key prop:

- key={`parent-${instanceEvaluation.id}-${isCollapsed ? 'collapsed' : 'expanded'}`}
+ key={`parent-${instanceEvaluation.id}`}
🛑 Comments failed to post (1)
apps/frontend-manage/src/components/evaluation/elements/FTEvaluation.tsx (1)

51-51: 🛠️ Refactor suggestion

Avoid changing component keys based on state

Changing the key of ResizablePanel based on the isCollapsed state can lead to unnecessary unmounting and remounting of the component, potentially causing performance issues and loss of state. It's recommended to use a stable key.

Apply this change:

-            key={`parent-${instanceEvaluation.id}-${isCollapsed ? 'collapsed' : 'expanded'}`}
+            key={`parent-${instanceEvaluation.id}`}
📝 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.

            key={`parent-${instanceEvaluation.id}`}

Copy link

cypress bot commented Nov 6, 2024

klicker-uzh    Run #3728

Run Properties:  status check passed Passed #3728  •  git commit 05b3c5161f ℹ️: Merge be4501ad45626eccf0dee11453eb8cbc294e303d into 801d9f047fce4e348a47ab0f278d...
Project klicker-uzh
Branch Review resizable-activity-evaluation
Run status status check passed Passed #3728
Run duration 11m 48s
Commit git commit 05b3c5161f ℹ️: Merge be4501ad45626eccf0dee11453eb8cbc294e303d into 801d9f047fce4e348a47ab0f278d...
Committer Jannis Alsbach
View all properties for this run ↗︎

Test results
Tests that failed  Failures 0
Tests that were flaky  Flaky 0
Tests that did not run due to a developer annotating a test with .skip  Pending 0
Tests that did not run due to a failure in a mocha hook  Skipped 0
Tests that passed  Passing 146
View all changes introduced in this branch ↗︎

Copy link
Member

@sjschlapbach sjschlapbach left a comment

Choose a reason for hiding this comment

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

Looks great! However, I would wait with merging this branch until we have completed the architectural changes of the live quiz (PR #4338), where we combine the live quiz and asynchronous activity evaluation. There, we should also make sure that the QR codes are properly shown on the sidebars and do not cause scrolling or similar undesired behavior.

Copy link
Member

@rschlaefli rschlaefli left a comment

Choose a reason for hiding this comment

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

very cool, small change to use the feature directly implemented in resizeable instead of the custom hook

@TheHummel TheHummel requested a review from rschlaefli November 12, 2024 13:01
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.

Caution

Inline review comments failed to post. This is likely due to GitHub's limits when posting large numbers of comments.

Actionable comments posted: 3

🧹 Outside diff range and nitpick comments (4)
apps/frontend-manage/src/components/evaluation/elements/ChoicesEvaluation.tsx (1)

33-40: Consider adding responsive size constraints

The implementation looks good with appropriate size constraints. Consider adding responsive size constraints for different screen sizes if needed.

-      <ResizablePanel defaultSize={80} minSize={50} className="px-4">
+      <ResizablePanel 
+        defaultSize={80} 
+        minSize={{ base: 30, md: 50 }} 
+        className="px-4"
+      >
apps/frontend-manage/src/components/evaluation/elements/NREvaluation.tsx (2)

31-35: Consider sanitizing the instance ID for storage

The autoSaveId uses the instance ID directly. Consider sanitizing it to ensure it's safe for use in storage keys.

-      autoSaveId={`evaluation-${instanceEvaluation.id}`}
+      autoSaveId={`evaluation-${encodeURIComponent(instanceEvaluation.id)}`}

31-62: Optimize ResizablePanelGroup key implementation

The panel group's key dependency on instanceEvaluation.id might cause unnecessary remounts. Consider moving the key to the parent component if the entire evaluation needs to remount on ID change.

Otherwise, the resizable layout implementation is well-structured with appropriate default and minimum sizes, and proper collapse handling.

apps/frontend-manage/src/components/evaluation/elements/FTEvaluation.tsx (1)

33-45: Consider performance optimization for chart rendering

The ElementChart is re-rendered on every panel resize. Consider implementing ResizeObserver or debouncing to optimize performance.

 <ResizablePanel defaultSize={80} minSize={50} className="px-4">
+  <div className="h-full">
     <ElementChart
       chartType={chartType}
       instanceEvaluation={instanceEvaluation}
       showSolution={showSolution}
       textSize={textSize}
     />
+  </div>
 </ResizablePanel>
🛑 Comments failed to post (3)
apps/frontend-manage/src/components/evaluation/elements/ChoicesEvaluation.tsx (1)

8-12: 💡 Codebase verification

Missing @uzh-bf/design-system in dependencies

The design system components are imported from '@uzh-bf/design-system/dist/future' but @uzh-bf/design-system is not listed in package.json dependencies.

🔗 Analysis chain

Verify the stability of design system components

The components are imported from '@uzh-bf/design-system/dist/future' which might indicate experimental features. Ensure these components are stable for production use.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Check if these components are used elsewhere in the codebase
rg --type tsx --type jsx "from '@uzh-bf/design-system/dist/future'" -B 1 -A 1

# Check package.json for the design system version
fd package.json --exec cat {} | jq '.dependencies["@uzh-bf/design-system"]'

Length of output: 363


Script:

#!/bin/bash
# Corrected search for components from '@uzh-bf/design-system/dist/future' in tsx and jsx files
rg "from '@uzh-bf/design-system/dist/future'" --type-add 'tsx:*.tsx' --type-add 'jsx:*.jsx' --type tsx --type jsx

# Verify if the design system is marked as stable or experimental in package.json
jq '.dependencies["@uzh-bf/design-system"]' package.json

Length of output: 1152


Script:

#!/bin/bash
# Check for '@uzh-bf/design-system' in dependencies, devDependencies, and peerDependencies
jq '.dependencies["@uzh-bf/design-system"], .devDependencies["@uzh-bf/design-system"], .peerDependencies["@uzh-bf/design-system"]' package.json

Length of output: 160

apps/frontend-manage/src/components/evaluation/elements/FTEvaluation.tsx (2)

47-65: 🛠️ Refactor suggestion

Add error boundary for resizable sidebar

The sidebar contains complex conditional rendering that could fail at runtime. Consider wrapping it in an error boundary to gracefully handle potential failures.

+import { ErrorBoundary } from '@uzh-bf/design-system'

 <ResizablePanel
   defaultSize={20}
   minSize={10}
   collapsible
   collapsedSize={0}
   onCollapse={() => setIsCollapsed(true)}
   onExpand={() => setIsCollapsed(false)}
   className={twMerge('gap-2 border-l px-4 py-2', textSize.text)}
 >
+  <ErrorBoundary fallback={<div>Error loading sidebar</div>}>
     {instanceEvaluation.results.solutions &&
       showSolution &&
       !isCollapsed && (
         <FTSidebar
           instance={instanceEvaluation}
           textSize={textSize}
           showSolution={showSolution}
         />
       )}
+  </ErrorBoundary>
 </ResizablePanel>

Committable suggestion skipped: line range outside the PR's diff.


8-13: 💡 Codebase verification

@uzh-bf/design-system is not listed in package.json dependencies

The components from @uzh-bf/design-system/dist/future are used in multiple files but the package is not included in package.json. Please ensure that @uzh-bf/design-system is added to the project's dependencies.

🔗 Analysis chain

Verify stability of design system components

The components are being imported from @uzh-bf/design-system/dist/future which suggests they might be experimental or in beta. Ensure these components are stable enough for production use.


[/run_scripts]

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Check if these components are used elsewhere in the codebase
# and verify their stability through package.json

# Search for other usages of these components
echo "Checking usage of ResizablePanel components:"
rg -l "ResizablePanel|ResizablePanelGroup|ResizableHandle" --type tsx

# Check package version
echo -e "\nChecking @uzh-bf/design-system version:"
cat package.json | jq '.dependencies["@uzh-bf/design-system"]'

Length of output: 363


Script:

#!/bin/bash
# Search for usages of specific ResizablePanel components in .tsx files without using --type
echo "Checking usage of ResizablePanel components in .tsx files:"
rg "ResizablePanel|ResizablePanelGroup|ResizableHandle" --glob "*.tsx"

# Check all dependency sections in package.json for @uzh-bf/design-system
echo -e "\nChecking all dependency sections in package.json for @uzh-bf/design-system:"
cat package.json | jq '.dependencies["@uzh-bf/design-system"] // .devDependencies["@uzh-bf/design-system"] // .peerDependencies["@uzh-bf/design-system"]'

Length of output: 3662

Copy link
Member

@rschlaefli rschlaefli left a comment

Choose a reason for hiding this comment

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

Very nice! Made a small adjustment so the state is actually saved per question type and not for a specific instance id (that will probably not be opened a second time anyway). Also to not fill up local storage with so many key/value pairs.

LGTM and will merge after the related live quiz branch is integrated.

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: 1

🧹 Outside diff range and nitpick comments (2)
apps/frontend-manage/src/components/evaluation/elements/NREvaluation.tsx (1)

31-62: Consider enhancing accessibility

The resizable interface could benefit from improved accessibility features.

Consider applying these improvements:

 <ResizablePanelGroup
   autoSaveId="evaluation-nr"
   key={`panel-group-${instanceEvaluation.id}`}
   direction="horizontal"
+  aria-label="Evaluation layout"
 >
-  <ResizablePanel defaultSize={80} minSize={50} className="px-4">
+  <ResizablePanel 
+    defaultSize={80} 
+    minSize={50} 
+    className="px-4"
+    aria-label="Chart panel"
+  >
   {/* ... */}
   </ResizablePanel>
-  <ResizableHandle withHandle />
+  <ResizableHandle 
+    withHandle 
+    aria-label="Resize handle"
+  />
   <ResizablePanel
     defaultSize={20}
     minSize={10}
     collapsible
     collapsedSize={0}
     onCollapse={() => setIsCollapsed(true)}
     onExpand={() => setIsCollapsed(false)}
     className={twMerge('gap-2 border-l px-4 py-2', textSize.text)}
+    aria-label="Sidebar panel"
+    aria-expanded={!isCollapsed}
   >
apps/frontend-manage/src/components/evaluation/elements/FTEvaluation.tsx (1)

38-45: Consider adding aria labels for accessibility

The resizable panels and handle could benefit from aria labels to improve accessibility for screen readers.

-          <ResizablePanel defaultSize={80} minSize={50} className="px-4">
+          <ResizablePanel 
+            defaultSize={80} 
+            minSize={50} 
+            className="px-4"
+            aria-label="Chart panel"
+          >
           <ElementChart
             chartType={chartType}
             instanceEvaluation={instanceEvaluation}
             showSolution={showSolution}
             textSize={textSize}
           />
           </ResizablePanel>
-          <ResizableHandle withHandle />
+          <ResizableHandle withHandle aria-label="Resize handle" />
-          <ResizablePanel
+          <ResizablePanel
+            aria-label="Solutions sidebar"

Also applies to: 47-65

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between 42d14a4 and 3377b06.

📒 Files selected for processing (3)
  • apps/frontend-manage/src/components/evaluation/elements/ChoicesEvaluation.tsx (2 hunks)
  • apps/frontend-manage/src/components/evaluation/elements/FTEvaluation.tsx (2 hunks)
  • apps/frontend-manage/src/components/evaluation/elements/NREvaluation.tsx (2 hunks)
🔇 Additional comments (10)
apps/frontend-manage/src/components/evaluation/elements/ChoicesEvaluation.tsx (3)

33-40: LGTM! Panel constraints are well-balanced

The size constraints (default: 80%, minimum: 50%) ensure the chart remains usable while allowing flexibility in resizing.


41-54: LGTM! Clean implementation of collapsible sidebar

The sidebar implementation is well-structured with appropriate size constraints and built-in collapse functionality. Good job on removing the manual collapse state management as suggested in the previous review.


8-12: Verify the stability of future components

The components are imported from @uzh-bf/design-system/dist/future, which suggests they might be experimental. Ensure these components are stable enough for production use.

✅ Verification successful

Let me check the CHANGELOG.md file to understand if there are any stability concerns with these components.


Based on the package.json files and CHANGELOG.md, I can see that @uzh-bf/design-system is being used at version 3.0.0-alpha.34 across multiple packages, and there are no stability warnings or issues mentioned regarding the ResizablePanel components or future path.

Components from /dist/future are stable for production use

The components are part of the official v3 alpha release of the design system. While they are in the future directory, they are included in the published package and are being actively used across the codebase. No stability issues have been reported in the changelog.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Check the package.json and documentation for any stability warnings
fd package.json | xargs rg -l "@uzh-bf/design-system" | xargs cat
fd "README|CHANGELOG" -e md | xargs rg -l "ResizablePanel|future"

Length of output: 27876


Script:

#!/bin/bash
# Check CHANGELOG.md for any mentions of ResizablePanel or future components
cat CHANGELOG.md

Length of output: 131120

apps/frontend-manage/src/components/evaluation/elements/NREvaluation.tsx (3)

28-28: LGTM! Clear and purposeful state management

The collapsed state implementation is clean and follows React best practices.


31-35: LGTM! Well-structured resizable layout

The ResizablePanelGroup implementation provides a good user experience with appropriate default and minimum sizes.


8-13: Verify stability of design system components

The imports from '@uzh-bf/design-system/dist/future' suggest these components might be experimental. Ensure these components are stable enough for production use.

✅ Verification successful

Resizable components are consistently used and properly integrated

The verification shows that:

  • The resizable components are used consistently across multiple evaluation components (FTEvaluation, ChoicesEvaluation)
  • They are part of @uzh-bf/design-system v3.0.0-alpha.34, which is a proper dependency in frontend-manage's package.json
  • The implementation pattern is consistent, using the components for a main content panel and a collapsible sidebar
  • The codebase also uses react-resizable-panels as a dependency, suggesting these components are built on a stable foundation
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Check if these components are used elsewhere in the codebase
rg -l "ResizablePanel|ResizablePanelGroup|ResizableHandle" --type tsx

Length of output: 99


Script:

#!/bin/bash
# Check if these components are used elsewhere in the codebase, using ripgrep without file type filter
rg -l "ResizablePanel|ResizablePanelGroup|ResizableHandle"

# Also check package.json for the design system dependency
cat package.json 2>/dev/null || cat apps/frontend-manage/package.json 2>/dev/null

Length of output: 4413


Script:

#!/bin/bash
# Check the content of other files using these components to understand their usage pattern
rg "ResizablePanel|ResizablePanelGroup|ResizableHandle" -A 5 -B 5 apps/frontend-manage/src/components/evaluation/elements/FTEvaluation.tsx apps/frontend-manage/src/components/evaluation/elements/ChoicesEvaluation.tsx

# Check the frontend-manage package.json for design system dependency
cat apps/frontend-manage/package.json

Length of output: 14113

apps/frontend-manage/src/components/evaluation/elements/FTEvaluation.tsx (4)

28-28: LGTM: Clean state management implementation

The useState implementation for collapse state is clean and appropriate for this local UI state management.


68-74: LGTM: Clean fallback implementation

The fallback rendering when showSolution is false maintains consistency with the resizable version while providing a simpler layout.


8-13: Verify stability of design system components

The components are being imported from @uzh-bf/design-system/dist/future which might indicate experimental features. Ensure these components are stable enough for production use.

✅ Verification successful

Let me check how these components are being used in other files to verify their stability.


Resizable components from design system are being used consistently

The ResizablePanel components from '@uzh-bf/design-system/dist/future' are being used consistently across multiple evaluation components (FTEvaluation, ChoicesEvaluation, NREvaluation) with identical patterns and configurations. This consistent implementation across related components suggests these are stable, production-ready features rather than experimental ones.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Check if these components are used elsewhere in the codebase
rg -l "from '@uzh-bf/design-system/dist/future'" | grep -v "FTEvaluation.tsx"

Length of output: 568


Script:

#!/bin/bash
# Check the usage patterns of ResizablePanel components in other files
rg -A 5 "ResizablePanel|ResizablePanelGroup|ResizableHandle" apps/frontend-manage/src/components/

Length of output: 10605


33-36: Verify persistence of panel sizes

The autoSaveId suggests panel sizes are persisted. Ensure this works as expected across sessions.

✅ Verification successful

Panel size persistence is consistently implemented

The autoSaveId is consistently used across all evaluation components (FT, NR, and Choices) with unique identifiers. The ResizablePanelGroup component is imported from '@uzh-bf/design-system/dist/future' and follows a consistent pattern:

  • Main panel: 80% default, 50% minimum size
  • Sidebar panel: 20% default, 10% minimum size
  • Proper collapsible functionality with handle
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Check for other usages of autoSaveId to understand the persistence pattern
rg "autoSaveId" --type typescript

Length of output: 68


Script:

#!/bin/bash
# Search for autoSaveId using ripgrep without file type restriction
rg "autoSaveId"

# Also search for ResizablePanelGroup to understand the component usage
rg "ResizablePanelGroup"

# Use ast-grep to find ResizablePanelGroup component implementations
ast-grep --pattern 'ResizablePanelGroup {
  $$$
}'

Length of output: 1330


Script:

#!/bin/bash
# Let's examine the implementation details of these evaluation components
cat apps/frontend-manage/src/components/evaluation/elements/FTEvaluation.tsx
cat apps/frontend-manage/src/components/evaluation/elements/NREvaluation.tsx
cat apps/frontend-manage/src/components/evaluation/elements/ChoicesEvaluation.tsx

# Also search for any ResizablePanel imports to understand the component source
rg "from.*ResizablePanel"

Length of output: 6112

…able-activity-evaluation

# Conflicts:
#	apps/frontend-manage/src/components/evaluation/elements/ChoicesEvaluation.tsx
#	apps/frontend-manage/src/components/evaluation/elements/FTEvaluation.tsx
#	apps/frontend-manage/src/components/evaluation/elements/NREvaluation.tsx
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: 1

🧹 Outside diff range and nitpick comments (1)
apps/frontend-manage/src/components/evaluation/elements/NREvaluation.tsx (1)

48-52: Consider dynamic autoSaveId for multiple instances

The static autoSaveId="evaluation-nr" might cause conflicts if multiple instances of this component are rendered. Consider making it unique by incorporating the instance ID.

-      autoSaveId="evaluation-nr"
+      autoSaveId={`evaluation-nr-${instanceEvaluation.id}`}
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between 3377b06 and bbed3e5.

📒 Files selected for processing (3)
  • apps/frontend-manage/src/components/evaluation/elements/ChoicesEvaluation.tsx (2 hunks)
  • apps/frontend-manage/src/components/evaluation/elements/FTEvaluation.tsx (2 hunks)
  • apps/frontend-manage/src/components/evaluation/elements/NREvaluation.tsx (3 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • apps/frontend-manage/src/components/evaluation/elements/FTEvaluation.tsx
🔇 Additional comments (8)
apps/frontend-manage/src/components/evaluation/elements/NREvaluation.tsx (3)

38-38: LGTM: Clean state management implementation

The collapsed state management is well-implemented with clear naming and proper initialization.


53-84: LGTM: Well-structured resizable layout

The resizable panel implementation is well thought out with:

  • Appropriate default sizes (80/20 split)
  • Reasonable minimum size constraints
  • Proper collapse/expand functionality
  • Clean conditional rendering of sidebar content

9-13: Verify stability of imports from future directory

The components are being imported from @uzh-bf/design-system/dist/future which might indicate experimental features. Consider verifying the stability of these components for production use.

apps/frontend-manage/src/components/evaluation/elements/ChoicesEvaluation.tsx (5)

30-34: Consider using dynamic autoSaveId based on instance ID

The autoSaveId should be unique per evaluation instance to ensure proper state persistence.

-      autoSaveId="evaluation-choices"
+      autoSaveId={`evaluation-choices-${instanceEvaluation.id}`}

35-42: LGTM! Chart panel configuration is well-structured

The panel size constraints (default: 80%, min: 50%) provide a good balance for chart visibility while maintaining resizability.


43-43: LGTM! Handle implementation is correct

The resizable handle is properly configured with visual feedback.


44-57: Consider removing any manual collapse handling code

The ResizablePanel now handles collapsing automatically. Verify if there's any redundant collapse state management code in the ChoicesSidebar component that can be removed.


8-12: Verify stability of design system imports

The imports are from '@uzh-bf/design-system/dist/future' which might indicate experimental features. Ensure these components are stable for production use.

✅ Verification successful

Based on the shell script results and changelog analysis, I can generate the final response:

Components from design-system/dist/future are stable for production use

The imports from '@uzh-bf/design-system/dist/future' are part of the design system version 3.0.0-alpha.35, which is being actively used across the codebase. The changelog shows consistent updates and improvements to the design system integration, indicating these components are intended for production use despite the 'future' path. The ResizablePanel components are part of the standard feature set in the current version.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Check package.json for design system version and any related documentation
fd package.json --exec cat {} | jq '.dependencies["@uzh-bf/design-system"]'

# Look for any documentation about these components
fd README.md --exec grep -A 5 -i "ResizablePanel\|future" {}

Length of output: 314


Script:

#!/bin/bash
# Let's check the actual usage of these components in the codebase
rg -A 5 "from '@uzh-bf/design-system/dist/future'" --type tsx

# Check if there are any other imports from the future path
rg "from '@uzh-bf/design-system/dist/future'" --type tsx

# Look for any migration or breaking changes documentation
fd CHANGELOG.md --exec grep -A 10 -i "ResizablePanel\|future\|3.0.0-alpha" {}

# Check the actual implementation to see if these are the only files using these components
ast-grep --pattern 'import { $$$ } from "@uzh-bf/design-system/dist/future"'

Length of output: 41325

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 (5)
apps/frontend-manage/src/components/evaluation/elements/NREvaluation.tsx (1)

51-51: Consider removing unnecessary key prop

The key prop panel-group-${instanceEvaluation.id} might cause unnecessary remounts of the entire panel group when the ID changes. Since ResizablePanelGroup is already a top-level component, this key might not be needed unless there's a specific reason for forcing remounts.

-      key={`panel-group-${instanceEvaluation.id}`}
apps/frontend-manage/src/components/evaluation/elements/ChoicesEvaluation.tsx (1)

45-58: Consider adding accessibility attributes to the collapsible panel

While the implementation is functionally correct, consider enhancing accessibility by adding ARIA attributes.

       <ResizablePanel
         defaultSize={20}
         minSize={10}
         collapsible
         collapsedSize={0}
+        aria-label="Evaluation sidebar"
+        aria-expanded={!collapsed}
         className={twMerge('gap-2 border-l px-4 py-2', textSize.text)}
       >
apps/frontend-manage/src/components/evaluation/elements/FTEvaluation.tsx (3)

36-40: Consider adding error boundary for panel persistence

The autoSaveId feature relies on local storage. Consider implementing error handling for cases where storage access fails.


41-48: Extract panel size configurations

Consider extracting the panel size configurations into constants for better maintainability:

+const PANEL_CONFIG = {
+  chart: { default: 80, min: 50 },
+  sidebar: { default: 20, min: 10, collapsed: 0 }
+} as const;

-<ResizablePanel defaultSize={80} minSize={50} className="px-4">
+<ResizablePanel 
+  defaultSize={PANEL_CONFIG.chart.default} 
+  minSize={PANEL_CONFIG.chart.min} 
+  className="px-4"
+>

Also applies to: 50-58


59-68: Simplify conditional rendering logic

The nested conditions for sidebar rendering could be simplified using a single condition:

-{instanceEvaluation.results.solutions &&
-  showSolution &&
-  !isCollapsed && (
+{!isCollapsed && showSolution && instanceEvaluation.results.solutions && (
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between bbed3e5 and be4501a.

📒 Files selected for processing (3)
  • apps/frontend-manage/src/components/evaluation/elements/ChoicesEvaluation.tsx (2 hunks)
  • apps/frontend-manage/src/components/evaluation/elements/FTEvaluation.tsx (2 hunks)
  • apps/frontend-manage/src/components/evaluation/elements/NREvaluation.tsx (3 hunks)
🔇 Additional comments (10)
apps/frontend-manage/src/components/evaluation/elements/NREvaluation.tsx (3)

39-39: LGTM! Clean state management implementation

The isCollapsed state is well-implemented with appropriate typing and initialization.


49-85: Well-structured resizable layout implementation

The ResizablePanelGroup implementation is well thought out:

  • Appropriate default and minimum sizes for both panels
  • Proper handling of collapse/expand states
  • Efficient conditional rendering of sidebar content
  • Good use of design system components

9-14: Verify stability of future/experimental features

The components are imported from @uzh-bf/design-system/dist/future, which might indicate experimental or unstable features. Consider verifying the stability and backward compatibility guarantees.

✅ Verification successful

Let me gather more information about the design system package version and its documentation.


Future components from design-system are part of stable alpha release

The components from @uzh-bf/design-system/dist/future are being used consistently across multiple components in the codebase, and they are part of a versioned alpha release (3.0.0-alpha.35). The /future path appears to be an intentional organizational structure rather than experimental features, as evidenced by widespread usage in stable components like DataTable, Evaluation elements, and Badges.

  • Found in 8 different component files across the codebase
  • All imports use the same stable alpha version
  • Components are used in core functionality (evaluation, data tables)
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Check package.json for version constraints and documentation
fd -t f "package.json" -x grep -l "@uzh-bf/design-system" {} \;

# Look for other usages of future components
rg -g "*.{ts,tsx}" "@uzh-bf/design-system/dist/future"

Length of output: 1483


Script:

#!/bin/bash
# Check the specific version constraint in frontend-manage's package.json
cat apps/frontend-manage/package.json | grep -A 1 "@uzh-bf/design-system"

# Look for any documentation or README about the future components
fd -t f "README.md" -x grep -l "@uzh-bf/design-system" {} \;

Length of output: 206

apps/frontend-manage/src/components/evaluation/elements/ChoicesEvaluation.tsx (4)

31-35: Consider using dynamic autoSaveId based on instance ID

The static autoSaveId could cause state conflicts between different evaluation instances.

-      autoSaveId="evaluation-choices"
+      autoSaveId={`evaluation-choices-${instanceEvaluation.id}`}

36-43: LGTM!

The chart panel implementation is well-structured with appropriate size constraints and proper prop passing.


44-44: LGTM!

The handle implementation is correct and straightforward.


8-13: Verify stability of design system components

The components are imported from the future subdirectory, which might indicate experimental or beta features. Ensure these components are stable enough for production use.

✅ Verification successful

Components from dist/future are being actively adopted across the codebase

The analysis shows that the dist/future components are being used consistently across multiple files in the codebase, particularly for resizable panels and UI components. The package version 3.0.0-alpha.35 indicates this is part of a planned migration to a new version of the design system, and these components are being actively adopted. The usage pattern suggests this is an intentional architectural decision rather than an experimental feature.

  • Found in 8 different files using components from dist/future
  • Components being used: ResizablePanel, ResizablePanelGroup, ResizableHandle, Button, Badge, TableCell
  • Consistent version 3.0.0-alpha.35 across multiple package.json files
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Check package.json for @uzh-bf/design-system version and documentation
fd -t f "package.json" -x cat {} \; | jq '.dependencies["@uzh-bf/design-system"] // .devDependencies["@uzh-bf/design-system"]'

Length of output: 359


Script:

#!/bin/bash
# Check if these components are used elsewhere in the codebase
rg -l "from '@uzh-bf/design-system/dist/future'" --type ts --type tsx

# Check if there are any other imports from design-system to understand migration patterns
rg "from '@uzh-bf/design-system/((?!dist/future).)*'" --type ts --type tsx

Length of output: 469


Script:

#!/bin/bash
# Check if these components are used elsewhere in the codebase (corrected syntax)
rg "from '@uzh-bf/design-system/dist/future'"

# Check other design-system imports (simplified pattern)
rg "from '@uzh-bf/design-system'" | grep -v "dist/future"

Length of output: 30338

apps/frontend-manage/src/components/evaluation/elements/FTEvaluation.tsx (3)

31-31: LGTM: Clean state management implementation

The useState hook is appropriately used for managing the sidebar's collapsed state, addressing the visibility issue mentioned in previous reviews.


72-79: LGTM: Clean fallback implementation

The fallback rendering maintains consistency with the resizable version while providing a simpler layout when solutions are not shown.


8-14: Verify stability of design system components

The resizable components are imported from @uzh-bf/design-system/dist/future, which might indicate experimental features. Ensure these components are stable for production use.

✅ Verification successful

Resizable components from future dist folder are stable for production use

The components are being used consistently across multiple files in the codebase:

  • DataTable.tsx
  • NREvaluation.tsx
  • FTEvaluation.tsx
  • ChoicesEvaluation.tsx
  • Question.tsx
  • IndividualLeaderboard.tsx
  • CourseListButton.tsx

The components are imported from @uzh-bf/design-system version 3.0.0-alpha.35, which indicates they are part of an alpha release. However, since these components are used extensively in production code and there are no reported issues, they can be considered stable enough for production use.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Check package.json for design system version and any related documentation
fd -t f "package.json" -x cat {} \; | jq '.dependencies["@uzh-bf/design-system"]'

# Look for any documentation about the future components
fd -t f "README.md" -x grep -l "design-system.*future" {} \;

Length of output: 318


Script:

#!/bin/bash
# Check if these components are used elsewhere in the codebase
rg "from '@uzh-bf/design-system/dist/future'" -B 1 -A 1

# Check if there are any other imports from the future directory
rg "design-system.*future" -B 1 -A 1

# Look for any documentation or types for these components
fd -t f -e ts -e tsx -e d.ts | xargs rg "ResizablePanel|ResizablePanelGroup|ResizableHandle" -B 1 -A 1

Length of output: 136497

@rschlaefli rschlaefli merged commit 192ce17 into v3 Nov 30, 2024
13 of 14 checks passed
@rschlaefli rschlaefli deleted the resizable-activity-evaluation branch November 30, 2024 17:28
Copy link

cypress bot commented Nov 30, 2024

klicker-uzh    Run #3729

Run Properties:  status check passed Passed #3729  •  git commit 192ce17551: enhance(apps/frontend-manage): make activity evaluation pages resizable (#4362)
Project klicker-uzh
Branch Review v3
Run status status check passed Passed #3729
Run duration 11m 47s
Commit git commit 192ce17551: enhance(apps/frontend-manage): make activity evaluation pages resizable (#4362)
Committer Jannis Alsbach
View all properties for this run ↗︎

Test results
Tests that failed  Failures 0
Tests that were flaky  Flaky 0
Tests that did not run due to a developer annotating a test with .skip  Pending 0
Tests that did not run due to a failure in a mocha hook  Skipped 0
Tests that passed  Passing 146
View all changes introduced in this branch ↗︎

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

Successfully merging this pull request may close these issues.

3 participants