Skip to content

154 overview progress indicators#155

Merged
InfinityBowman merged 6 commits into
mainfrom
154-overview-progress-indicators
Dec 26, 2025
Merged

154 overview progress indicators#155
InfinityBowman merged 6 commits into
mainfrom
154-overview-progress-indicators

Conversation

@InfinityBowman
Copy link
Copy Markdown
Owner

@InfinityBowman InfinityBowman commented Dec 25, 2025

Summary by CodeRabbit

  • New Features

    • Project Progress dashboard with circular progress visuals, per-member progress and team/collaboration tools.
    • Quality Assessment added as a collapsible section.
    • Contact prompt for requesting early access when project creation is restricted.
  • UI/UX Improvements

    • Overview layout and header/controls refreshed; settings area clarified and responsive.
  • Improvements

    • Reconciliation progress now persists current page and view mode.
  • Removals

    • Zag documentation/tooling and its README docs removed.

✏️ Tip: You can customize this high-level summary in your review settings.

@InfinityBowman InfinityBowman linked an issue Dec 25, 2025 that may be closed by this pull request
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Dec 25, 2025

Caution

Review failed

The pull request is closed.

📝 Walkthrough

Walkthrough

This PR removes the Zag documentation tooling from the MCP package and deletes its server registration and docs, while adding new web UI pieces: a ContactPrompt component, a CircularProgress component, and a substantial OverviewTab UI refactor including per-user progress and collaboration sections.

Changes

Cohort / File(s) Summary
MCP — Zag tool removal
packages/mcp/README.md, packages/mcp/src/server.ts, packages/mcp/src/tools/zag.ts
Deleted the Zag tool implementation, its server registration, and README command block; removes fetch/parse/caching logic and the zag_docs tool API.
New ContactPrompt component
packages/web/src/components/project-ui/ContactPrompt.jsx
Added a ContactPrompt component that displays entitlement/quota messaging, mail icon, and "Request Early Access" link; used where project creation is restricted.
ProjectDashboard integration
packages/web/src/components/project-ui/ProjectDashboard.jsx
Replaced inline entitlement/quota messages with ContactPrompt; added helpers restrictionType() and quotaLimit() and adjusted header layout classes for responsive wrapping.
Overview tab — UI refactor
packages/web/src/components/project-ui/overview-tab/OverviewTab.jsx, .../ChartSection.jsx
Major restructuring: new Project Progress hero, per-user progress memos, Team & Collaboration section with member progress, collapsible Quality Assessment (ChartSection), and updated header/Settings layout.
New CircularProgress
packages/web/src/components/project-ui/overview-tab/CircularProgress.jsx
New Solid.js component using D3 to render animated circular progress with variants, label, optional percentage, and size-driven truncation.
NoteEditor behavior tweak
packages/web/src/components/checklist-ui/common/NoteEditor.jsx
Removed local hasBeenManuallyToggled state and its update; collapsible open state now managed without that manual-toggle flag.
Yjs sync param renames
packages/web/src/primitives/useProject/checklists.js, .../pdfs.js, .../reconciliation.js
Renamed third parameter isSynced_isSynced across checklist/pdf/reconciliation ops; reconciliation now persists/returns optional currentPage and viewMode metadata.
Tests — async sync waits
packages/web/src/primitives/__tests__/useProject.test.js
Tests updated to await Yjs syncs with small delays and promise wiring; assertions deferred until synchronization completes.
Landing pricing layout
packages/landing/src/routes/pricing.jsx
Removed certain flex/grid modifiers from pricing layout containers (styling/layout class changes).

Sequence Diagram(s)

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~75 minutes

Possibly related PRs

Poem

🐰 I nibbled zag-docs from the tree,

New prompts and circles hop with me,
Progress spins, teammates aligned,
Mailbox opens, early access signed,
Hooray — a rabbit's patch, fresh and free! ✨

Pre-merge checks and finishing touches

❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 40.00% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title '154 overview progress indicators' directly references the main objective of this PR by mentioning 'overview progress indicators', which aligns with the substantial changes to OverviewTab.jsx introducing progress calculations and a CircularProgress component.

📜 Recent review details

Configuration used: defaults

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 8a8fde1 and eff2fc1.

📒 Files selected for processing (7)
  • packages/landing/src/routes/pricing.jsx
  • packages/web/src/components/checklist-ui/common/NoteEditor.jsx
  • packages/web/src/components/project-ui/overview-tab/CircularProgress.jsx
  • packages/web/src/primitives/__tests__/useProject.test.js
  • packages/web/src/primitives/useProject/checklists.js
  • packages/web/src/primitives/useProject/pdfs.js
  • packages/web/src/primitives/useProject/reconciliation.js

Comment @coderabbitai help to get the list of available commands and usage tips.

@cloudflare-workers-and-pages
Copy link
Copy Markdown

cloudflare-workers-and-pages Bot commented Dec 25, 2025

Deploying with  Cloudflare Workers  Cloudflare Workers

The latest updates on your project. Learn more about integrating Git with Workers.

Status Name Latest Commit Preview URL Updated (UTC)
✅ Deployment successful!
View logs
corates eff2fc1 Commit Preview URL Dec 26 2025, 12:52 AM

Copy link
Copy Markdown

@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

🧹 Nitpick comments (7)
packages/web/src/components/project-ui/overview-tab/ChartSection.jsx (1)

244-261: Consider adding responsive layout for mobile devices.

The horizontal layout with justify-between might not work well on small screens where the description text and button compete for space. Stack them vertically on mobile to improve readability and usability.

Proposed responsive layout adjustment
-        <div class='flex items-start justify-between gap-4'>
+        <div class='flex flex-col items-start justify-between gap-4 sm:flex-row'>
           <div class='flex-1'>
             <p class='text-sm text-gray-600'>
               Visual representation of AMSTAR-2 quality assessment ratings across completed
               checklists. Use the settings to customize chart appearance, labels, and export
               options.
             </p>
           </div>
           <button
             onClick={() => setShowSettingsModal(true)}
             class='inline-flex shrink-0 items-center gap-1.5 rounded-lg px-3 py-1.5 text-sm font-medium text-gray-600 transition-colors hover:bg-gray-100 hover:text-gray-900'
             title='Chart Settings'
           >
             <BiRegularCog class='h-4 w-4' />
             Settings
           </button>
         </div>

Based on learnings: responsive design principles should be applied to UI components.

packages/web/src/components/project-ui/ContactPrompt.jsx (1)

16-30: Consider using createMemo for derived title and message.

The getTitle() and getMessage() functions derive values from reactive props. Per the coding guidelines, "Use createMemo for derived values that depend on reactive state, ensuring computed values update only when their dependencies change."

While the current pattern works, using createMemo would align with the guidelines and make the reactive dependencies explicit.

Refactor to use createMemo
+import { createMemo } from 'solid-js';
 import { FiMail } from 'solid-icons/fi';
 import { LANDING_URL } from '@config/api.js';

 export default function ContactPrompt(props) {
   const restrictionType = () => props.restrictionType ?? 'entitlement';
   const projectCount = () => props.projectCount ?? 0;
   const quotaLimit = () => props.quotaLimit ?? null;

   const contactUrl = () => `${LANDING_URL}/contact`;

-  const getTitle = () => {
+  const getTitle = createMemo(() => {
     if (restrictionType() === 'entitlement') {
       return 'Project Creation Not Available';
     }
     return 'Project Limit Reached';
-  };
+  });

-  const getMessage = () => {
+  const getMessage = createMemo(() => {
     if (restrictionType() === 'entitlement') {
       return 'CoRATES is in early access. Request access to create projects by contacting us.';
     }
     const limit = quotaLimit();
     const limitText = limit === null || limit === -1 ? '∞' : limit;
     return `You've reached your project limit (${projectCount()}/${limitText}). Request early access for more projects.`;
-  };
+  });
packages/web/src/components/project-ui/ProjectDashboard.jsx (1)

45-53: Use createMemo for derived helper functions.

The restrictionType() and quotaLimit() functions derive values from reactive sources (hasEntitlement and quotas). Per the coding guidelines: "Use createMemo for derived values that depend on reactive state, ensuring computed values update only when their dependencies change."

Using createMemo ensures these values are cached and only recomputed when their dependencies change, rather than on every access.

Refactor to use createMemo
+import { createEffect, createSignal, onCleanup, For, Show, createMemo } from 'solid-js';

  // ... existing code ...

-  // Determine restriction type and quota limit for ContactPrompt
-  const restrictionType = () => {
+  const restrictionType = createMemo(() => {
     return !hasEntitlement('project.create') ? 'entitlement' : 'quota';
-  };
+  });

-  const quotaLimit = () => {
+  const quotaLimit = createMemo(() => {
     const limit = quotas()['projects.max'];
     return isUnlimitedQuota(limit) ? -1 : limit;
-  };
+  });
packages/web/src/components/project-ui/overview-tab/CircularProgress.jsx (3)

30-30: Consider using createMemo for derived values.

Per coding guidelines, createMemo should be used for derived values. While functional accessors work, createMemo provides caching and prevents unnecessary recalculations.

Suggested change
-  const clampedValue = () => Math.max(0, Math.min(100, value()));
+  const clampedValue = createMemo(() => Math.max(0, Math.min(100, value())));

Same applies to getVariantColor on line 17:

-  const getVariantColor = () => {
+  const variantColor = createMemo(() => {
     switch (variant()) {
       // ...
     }
-  };
+  });

Then use variantColor() on line 77.


32-137: Add cleanup to interrupt D3 transitions on unmount.

If the component unmounts while a D3 transition is in progress, it may attempt to update the removed DOM nodes. Add onCleanup to interrupt any running transitions.

Suggested fix
+import { createEffect, onCleanup } from 'solid-js';
 import * as d3 from 'd3';
 
 // Inside the component:
   createEffect(() => {
     if (!svgRef) return;
+
+    // Interrupt any running transitions before clearing
+    d3.select(svgRef).selectAll('*').interrupt();
 
     const radius = size() / 2 - 8;
     // ... rest of effect
+
+    onCleanup(() => {
+      d3.select(svgRef).selectAll('*').interrupt();
+    });
   });

100-100: Font sizes don't scale with the size prop.

The hardcoded 24px font size won't look proportional for different size values. Consider scaling relative to the size.

Suggested approach
+  // Scale font sizes based on component size
+  const valueFontSize = () => Math.round(size() * 0.15); // ~24px at 160
+  const labelFontSize = () => Math.round(size() * 0.07); // ~11px at 160

   // Then in the effect:
-        .attr('font-size', '24px')
+        .attr('font-size', `${valueFontSize()}px`)

   // And for label:
-        .attr('font-size', '11px')
+        .attr('font-size', `${labelFontSize()}px`)
packages/web/src/components/project-ui/overview-tab/OverviewTab.jsx (1)

24-354: Consider extracting sub-components for maintainability.

At 354 lines, this file is approaching the threshold where refactoring would improve maintainability. Consider extracting focused sub-components such as:

  • ProgressHero (lines 157-212)
  • MemberList (lines 232-308)
  • StatsGrid (lines 181-210)

These could live in the same directory with a barrel export from index.js.

📜 Review details

Configuration used: defaults

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 17cce03 and 8a8fde1.

📒 Files selected for processing (8)
  • packages/mcp/README.md
  • packages/mcp/src/server.ts
  • packages/mcp/src/tools/zag.ts
  • packages/web/src/components/project-ui/ContactPrompt.jsx
  • packages/web/src/components/project-ui/ProjectDashboard.jsx
  • packages/web/src/components/project-ui/overview-tab/ChartSection.jsx
  • packages/web/src/components/project-ui/overview-tab/CircularProgress.jsx
  • packages/web/src/components/project-ui/overview-tab/OverviewTab.jsx
💤 Files with no reviewable changes (3)
  • packages/mcp/src/server.ts
  • packages/mcp/src/tools/zag.ts
  • packages/mcp/README.md
🧰 Additional context used
📓 Path-based instructions (14)
**/*

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

Do not use emojis in code, comments, documentation, or commit messages

NEVER use emojis anywhere in code, comments, documentation, plan files, or commit messages. This includes unicode symbols. For UI icons, use solid-icons library or SVGs only.

Files:

  • packages/web/src/components/project-ui/ContactPrompt.jsx
  • packages/web/src/components/project-ui/overview-tab/OverviewTab.jsx
  • packages/web/src/components/project-ui/overview-tab/CircularProgress.jsx
  • packages/web/src/components/project-ui/ProjectDashboard.jsx
  • packages/web/src/components/project-ui/overview-tab/ChartSection.jsx
packages/web/src/**/*.{js,jsx,ts,tsx}

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

packages/web/src/**/*.{js,jsx,ts,tsx}: For UI icons, use the solid-icons library or SVGs only. Do not use emojis
Ensure browser compatibility for all frontend code (Safari is usually problematic)
Keep files small, focused, and modular. If a file exceeds a high number of lines, consider refactoring by extracting sub-modules into a folder with index.jsx and helper components, moving complex logic into separate utility files or primitives, or splitting large forms into section components
Do NOT prop-drill application state. Shared or cross-feature state must live in external stores under packages/web/src/stores/ or relative to the component file
Use createMemo for derived values to ensure they update reactively

Use import aliases from jsconfig.json instead of relative paths

Files:

  • packages/web/src/components/project-ui/ContactPrompt.jsx
  • packages/web/src/components/project-ui/overview-tab/OverviewTab.jsx
  • packages/web/src/components/project-ui/overview-tab/CircularProgress.jsx
  • packages/web/src/components/project-ui/ProjectDashboard.jsx
  • packages/web/src/components/project-ui/overview-tab/ChartSection.jsx
**/*.{js,jsx,ts,tsx}

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

**/*.{js,jsx,ts,tsx}: Prefer modern ES6+ syntax and features
Use aliases for imports when appropriate to improve readability

**/*.{js,jsx,ts,tsx}: Prefer modern ES6+ syntax and features in JavaScript/TypeScript code
Comments should explain why something is being done, not narrate what the code does. Avoid comments that repeat variable names or describe obvious code behavior.

Files:

  • packages/web/src/components/project-ui/ContactPrompt.jsx
  • packages/web/src/components/project-ui/overview-tab/OverviewTab.jsx
  • packages/web/src/components/project-ui/overview-tab/CircularProgress.jsx
  • packages/web/src/components/project-ui/ProjectDashboard.jsx
  • packages/web/src/components/project-ui/overview-tab/ChartSection.jsx
packages/web/src/components/**/*.{js,jsx,ts,tsx}

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

packages/web/src/components/**/*.{js,jsx,ts,tsx}: Use responsive design principles for UI components
Group related components in subdirectories with an index.js barrel export
Use Zag.js for UI components and design system
Zag component exist in packages/web/src/components/zag/* and should be reused. Check the README.md in that folder for a list of existing components before adding new components and when debugging
Components should receive at most 1–5 props, and only for local configuration, not shared state. If a component would need more than 5 props, move the shared data into an external store, a primitive, or Solid context
Do not destructure props in SolidJS components as it breaks reactivity. Instead, access props directly from the props object or wrap them in a function to ensure they are always up-to-date
Components should be lean and focused. They should not implement business logic; move that into stores, utilities, or primitives
Never have a component act as a God component coordinating multiple large concerns

Files:

  • packages/web/src/components/project-ui/ContactPrompt.jsx
  • packages/web/src/components/project-ui/overview-tab/OverviewTab.jsx
  • packages/web/src/components/project-ui/overview-tab/CircularProgress.jsx
  • packages/web/src/components/project-ui/ProjectDashboard.jsx
  • packages/web/src/components/project-ui/overview-tab/ChartSection.jsx
packages/{web,ui}/src/**/*.{jsx,tsx}

📄 CodeRabbit inference engine (.cursor/rules/corates.mdc)

Group related components in subdirectories with barrel exports

Files:

  • packages/web/src/components/project-ui/ContactPrompt.jsx
  • packages/web/src/components/project-ui/overview-tab/OverviewTab.jsx
  • packages/web/src/components/project-ui/overview-tab/CircularProgress.jsx
  • packages/web/src/components/project-ui/ProjectDashboard.jsx
  • packages/web/src/components/project-ui/overview-tab/ChartSection.jsx
packages/{web,landing}/src/**/*.{jsx,tsx}

📄 CodeRabbit inference engine (.cursor/rules/corates.mdc)

packages/{web,landing}/src/**/*.{jsx,tsx}: Use Ark UI components from @corates/ui package, not local component implementations
Use solid-icons library (e.g., solid-icons/bi, solid-icons/fi) for icon imports

Files:

  • packages/web/src/components/project-ui/ContactPrompt.jsx
  • packages/web/src/components/project-ui/overview-tab/OverviewTab.jsx
  • packages/web/src/components/project-ui/overview-tab/CircularProgress.jsx
  • packages/web/src/components/project-ui/ProjectDashboard.jsx
  • packages/web/src/components/project-ui/overview-tab/ChartSection.jsx
packages/web/src/**/*.{jsx,tsx}

📄 CodeRabbit inference engine (.cursor/rules/corates.mdc)

packages/web/src/**/*.{jsx,tsx}: In SolidJS, do NOT prop-drill application state. Import stores directly where needed instead.
In SolidJS, do NOT destructure props. Access props.field directly or wrap in a function: () => props.field
In SolidJS components, components should receive at most 1-5 props (local config only, not shared state)

Files:

  • packages/web/src/components/project-ui/ContactPrompt.jsx
  • packages/web/src/components/project-ui/overview-tab/OverviewTab.jsx
  • packages/web/src/components/project-ui/overview-tab/CircularProgress.jsx
  • packages/web/src/components/project-ui/ProjectDashboard.jsx
  • packages/web/src/components/project-ui/overview-tab/ChartSection.jsx
packages/web/src/**/*.{jsx,tsx,js,ts}

📄 CodeRabbit inference engine (.cursor/rules/corates.mdc)

In SolidJS, use createMemo for derived values

Files:

  • packages/web/src/components/project-ui/ContactPrompt.jsx
  • packages/web/src/components/project-ui/overview-tab/OverviewTab.jsx
  • packages/web/src/components/project-ui/overview-tab/CircularProgress.jsx
  • packages/web/src/components/project-ui/ProjectDashboard.jsx
  • packages/web/src/components/project-ui/overview-tab/ChartSection.jsx
packages/web/src/**/*.{js,ts,jsx,tsx}

📄 CodeRabbit inference engine (.cursor/rules/error-handling.mdc)

packages/web/src/**/*.{js,ts,jsx,tsx}: Always use handleFetchError from @/lib/error-utils.js for fetch calls in frontend code with options like { showToast: true } for error handling
Use createFormErrorSignals from @/lib/form-errors.js for form validation error handling with field-level and global error management

Files:

  • packages/web/src/components/project-ui/ContactPrompt.jsx
  • packages/web/src/components/project-ui/overview-tab/OverviewTab.jsx
  • packages/web/src/components/project-ui/overview-tab/CircularProgress.jsx
  • packages/web/src/components/project-ui/ProjectDashboard.jsx
  • packages/web/src/components/project-ui/overview-tab/ChartSection.jsx
packages/{web,workers}/src/**/*.{js,ts,jsx,tsx}

📄 CodeRabbit inference engine (.cursor/rules/error-handling.mdc)

packages/{web,workers}/src/**/*.{js,ts,jsx,tsx}: Never throw string literals; always throw Error objects or return domain errors from API routes
Use error utility functions like isErrorCode from @corates/shared or @/lib/error-utils.js to check specific error types instead of manual string comparisons

Files:

  • packages/web/src/components/project-ui/ContactPrompt.jsx
  • packages/web/src/components/project-ui/overview-tab/OverviewTab.jsx
  • packages/web/src/components/project-ui/overview-tab/CircularProgress.jsx
  • packages/web/src/components/project-ui/ProjectDashboard.jsx
  • packages/web/src/components/project-ui/overview-tab/ChartSection.jsx
{packages/web/**,packages/landing/**}/**/*.{jsx,tsx,js,ts}

📄 CodeRabbit inference engine (.cursor/rules/solidjs.mdc)

{packages/web/**,packages/landing/**}/**/*.{jsx,tsx,js,ts}: Never destructure props in SolidJS components - destructuring breaks reactivity. Access props directly (e.g., props.name) or wrap in a function (e.g., const name = () => props.name) to maintain reactivity.
Import stores directly in components rather than prop-drilling store data through component hierarchies.
Use separate read and write patterns for stores: import the store directly for reading data (e.g., projectStore.getProjectList()) and import action stores separately for writing (e.g., projectActionsStore.createProject()).
Use createSignal from solid-js for managing simple reactive values. Prefer derived state with signals or memo over effects when possible.
Use createStore from solid-js/store for managing complex objects and arrays that require granular reactivity, enabling fine-grained updates where only affected parts re-render.
Use createMemo from solid-js for derived values that depend on reactive state, ensuring computed values update only when their dependencies change.
Always clean up effects that create subscriptions or timers using the onCleanup function from solid-js. Use effects sparingly, only when derived values won't work well.
Keep components lean and focused on rendering. Move business logic to stores (for shared state and operations), primitives (for reusable hooks/logic), or utilities (for pure functions).
Use the Show component from solid-js for conditional rendering instead of JavaScript ternary operators or logical AND operators.
Use the For component from solid-js for rendering lists. It provides better performance and keying compared to JavaScript's map function in JSX.
When manipulating children in wrapper components, use the children helper from solid-js to ensure proper reactivity and handling of child elements.

Files:

  • packages/web/src/components/project-ui/ContactPrompt.jsx
  • packages/web/src/components/project-ui/overview-tab/OverviewTab.jsx
  • packages/web/src/components/project-ui/overview-tab/CircularProgress.jsx
  • packages/web/src/components/project-ui/ProjectDashboard.jsx
  • packages/web/src/components/project-ui/overview-tab/ChartSection.jsx
packages/{web,ui}/**/*.{js,jsx,ts,tsx}

📄 CodeRabbit inference engine (.cursor/rules/ui-components.mdc)

packages/{web,ui}/**/*.{js,jsx,ts,tsx}: Import UI components from '@corates/ui' package instead of local component files. Do not import Ark UI components from local paths like '@/components/zag/' or 'packages/web/src/components/zag/'
Always use 'solid-icons' library for icons. Never use emoji characters or text as icon replacements. Import from specific icon sets like 'solid-icons/bi', 'solid-icons/fi', 'solid-icons/ai', etc.

Files:

  • packages/web/src/components/project-ui/ContactPrompt.jsx
  • packages/web/src/components/project-ui/overview-tab/OverviewTab.jsx
  • packages/web/src/components/project-ui/overview-tab/CircularProgress.jsx
  • packages/web/src/components/project-ui/ProjectDashboard.jsx
  • packages/web/src/components/project-ui/overview-tab/ChartSection.jsx
packages/web/**/*.{js,jsx,ts,tsx}

📄 CodeRabbit inference engine (.cursor/rules/ui-components.mdc)

Use import aliases from 'packages/web/jsconfig.json' instead of relative paths. Aliases include: '@/' (src/), '@components/' (src/components/), '@auth-ui/' (src/components/auth-ui/), '@checklist-ui/' (src/components/checklist-ui/), '@project-ui/' (src/components/project-ui/), '@routes/' (src/routes/), '@primitives/' (src/primitives/), '@api/' (src/api/), '@config/' (src/config/), and '@lib/' (src/lib/)

Files:

  • packages/web/src/components/project-ui/ContactPrompt.jsx
  • packages/web/src/components/project-ui/overview-tab/OverviewTab.jsx
  • packages/web/src/components/project-ui/overview-tab/CircularProgress.jsx
  • packages/web/src/components/project-ui/ProjectDashboard.jsx
  • packages/web/src/components/project-ui/overview-tab/ChartSection.jsx
packages/{web,ui}/**/*.{jsx,tsx}

📄 CodeRabbit inference engine (.cursor/rules/ui-components.mdc)

Use Tailwind CSS classes for styling components

Files:

  • packages/web/src/components/project-ui/ContactPrompt.jsx
  • packages/web/src/components/project-ui/overview-tab/OverviewTab.jsx
  • packages/web/src/components/project-ui/overview-tab/CircularProgress.jsx
  • packages/web/src/components/project-ui/ProjectDashboard.jsx
  • packages/web/src/components/project-ui/overview-tab/ChartSection.jsx
🧠 Learnings (9)
📓 Common learnings
Learnt from: CR
Repo: InfinityBowman/corates PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-12-19T14:49:49.730Z
Learning: Applies to packages/web/src/components/**/*.{js,jsx,ts,tsx} : Use Zag.js for UI components and design system
📚 Learning: 2025-12-24T17:23:10.082Z
Learnt from: CR
Repo: InfinityBowman/corates PR: 0
File: .cursor/rules/solidjs.mdc:0-0
Timestamp: 2025-12-24T17:23:10.082Z
Learning: Applies to {packages/web/**,packages/landing/**}/**/*.{jsx,tsx,js,ts} : Use `createMemo` from solid-js for derived values that depend on reactive state, ensuring computed values update only when their dependencies change.

Applied to files:

  • packages/web/src/components/project-ui/overview-tab/OverviewTab.jsx
📚 Learning: 2025-12-24T17:23:10.082Z
Learnt from: CR
Repo: InfinityBowman/corates PR: 0
File: .cursor/rules/solidjs.mdc:0-0
Timestamp: 2025-12-24T17:23:10.082Z
Learning: Applies to {packages/web/**,packages/landing/**}/**/*.{jsx,tsx,js,ts} : Use `createSignal` from solid-js for managing simple reactive values. Prefer derived state with signals or memo over effects when possible.

Applied to files:

  • packages/web/src/components/project-ui/overview-tab/OverviewTab.jsx
  • packages/web/src/components/project-ui/overview-tab/CircularProgress.jsx
📚 Learning: 2025-12-24T17:23:10.082Z
Learnt from: CR
Repo: InfinityBowman/corates PR: 0
File: .cursor/rules/solidjs.mdc:0-0
Timestamp: 2025-12-24T17:23:10.082Z
Learning: Applies to {packages/web/**,packages/landing/**}/**/*.{jsx,tsx,js,ts} : Use the `Show` component from solid-js for conditional rendering instead of JavaScript ternary operators or logical AND operators.

Applied to files:

  • packages/web/src/components/project-ui/overview-tab/OverviewTab.jsx
  • packages/web/src/components/project-ui/ProjectDashboard.jsx
📚 Learning: 2025-12-24T17:23:10.082Z
Learnt from: CR
Repo: InfinityBowman/corates PR: 0
File: .cursor/rules/solidjs.mdc:0-0
Timestamp: 2025-12-24T17:23:10.082Z
Learning: Applies to {packages/web/**,packages/landing/**}/**/*.{jsx,tsx,js,ts} : Use `createStore` from solid-js/store for managing complex objects and arrays that require granular reactivity, enabling fine-grained updates where only affected parts re-render.

Applied to files:

  • packages/web/src/components/project-ui/overview-tab/OverviewTab.jsx
📚 Learning: 2025-12-24T17:22:48.927Z
Learnt from: CR
Repo: InfinityBowman/corates PR: 0
File: .cursor/rules/corates.mdc:0-0
Timestamp: 2025-12-24T17:22:48.927Z
Learning: Applies to packages/{web,landing}/src/**/*.{jsx,tsx} : Use Ark UI components from corates/ui package, not local component implementations

Applied to files:

  • packages/web/src/components/project-ui/overview-tab/OverviewTab.jsx
  • packages/web/src/components/project-ui/overview-tab/CircularProgress.jsx
📚 Learning: 2025-12-24T17:22:48.927Z
Learnt from: CR
Repo: InfinityBowman/corates PR: 0
File: .cursor/rules/corates.mdc:0-0
Timestamp: 2025-12-24T17:22:48.927Z
Learning: Applies to packages/web/src/**/*.{jsx,tsx,js,ts} : In SolidJS, use createMemo for derived values

Applied to files:

  • packages/web/src/components/project-ui/overview-tab/OverviewTab.jsx
📚 Learning: 2025-12-24T17:22:48.927Z
Learnt from: CR
Repo: InfinityBowman/corates PR: 0
File: .cursor/rules/corates.mdc:0-0
Timestamp: 2025-12-24T17:22:48.927Z
Learning: Applies to packages/{web,landing}/src/**/*.{jsx,tsx} : Use solid-icons library (e.g., solid-icons/bi, solid-icons/fi) for icon imports

Applied to files:

  • packages/web/src/components/project-ui/overview-tab/OverviewTab.jsx
📚 Learning: 2025-12-19T14:49:49.730Z
Learnt from: CR
Repo: InfinityBowman/corates PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-12-19T14:49:49.730Z
Learning: Applies to packages/web/src/components/**/*.{js,jsx,ts,tsx} : Use responsive design principles for UI components

Applied to files:

  • packages/web/src/components/project-ui/overview-tab/ChartSection.jsx
🧬 Code graph analysis (1)
packages/web/src/components/project-ui/ProjectDashboard.jsx (4)
packages/web/src/components/project-ui/ContactPrompt.jsx (4)
  • restrictionType (10-10)
  • quotaLimit (12-12)
  • ContactPrompt (9-56)
  • projectCount (11-11)
packages/web/src/primitives/useSubscription.js (2)
  • hasEntitlement (105-105)
  • quotas (98-98)
packages/web/src/lib/entitlements.js (3)
  • hasEntitlement (60-63)
  • limit (76-76)
  • quotas (75-75)
packages/shared/src/plans/plans.ts (1)
  • isUnlimitedQuota (79-81)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: Workers Builds: corates
🔇 Additional comments (8)
packages/web/src/components/project-ui/ContactPrompt.jsx (1)

32-55: LGTM - Clean component structure.

The component structure is clean and follows SolidJS best practices:

  • Props are not destructured, maintaining reactivity
  • Uses solid-icons library for icons as required
  • Tailwind CSS classes are used appropriately
  • Import aliases are used correctly
  • Component remains focused and lean (3 props, within guidelines)
packages/web/src/components/project-ui/ProjectDashboard.jsx (2)

149-176: Good responsive layout improvement and ContactPrompt integration.

The addition of flex-wrap and gap-4 improves responsiveness, and the ContactPrompt component is properly integrated in the header fallback with correct props passed through.


203-224: ContactPrompt properly integrated in empty state.

The ContactPrompt component is correctly used in the empty projects fallback, maintaining the same restriction logic and user guidance flow.

packages/web/src/components/project-ui/overview-tab/CircularProgress.jsx (1)

128-135: Text truncation uses approximate character width.

The calculation (size() * 0.75) / 6 assumes ~6px per character, which varies by font. This is acceptable for a simple truncation but may occasionally overflow or truncate too aggressively.

packages/web/src/components/project-ui/overview-tab/OverviewTab.jsx (4)

55-100: Well-structured progress calculations using createMemo.

The memoized progress calculations follow SolidJS best practices. The logic correctly identifies completed appraisals (including AWAITING_RECONCILE status) and computes per-user statistics efficiently.


164-178: Good use of CircularProgress with dynamic variant.

The variant selection logic provides meaningful visual feedback based on completion percentage. The implementation correctly passes reactive values to the component.


234-306: Member list with per-user progress follows SolidJS patterns.

The For component is used correctly for list rendering, and the Show component handles conditional progress display. The userProgress accessor defined within the callback maintains proper reactivity.


321-345: Quality Assessment section with collapsible behavior.

Good use of the Collapsible component from @corates/ui. The state management with chartsExpanded signal is appropriate, and the trigger provides clear UX feedback.

Comment on lines +151 to +153
// Determine if Reviewer Assignment should be shown
const shouldShowReviewerAssignment = () =>
isOwner() && studies().length > 0 && unassignedStudies().length > 0;
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion | 🟠 Major

Use createMemo for derived value.

shouldShowReviewerAssignment is a derived value depending on reactive state (isOwner(), studies(), unassignedStudies()). Per coding guidelines, derived values should use createMemo for proper caching and reactive updates.

Suggested fix
-  // Determine if Reviewer Assignment should be shown
-  const shouldShowReviewerAssignment = () =>
-    isOwner() && studies().length > 0 && unassignedStudies().length > 0;
+  // Determine if Reviewer Assignment should be shown
+  const shouldShowReviewerAssignment = createMemo(() =>
+    isOwner() && studies().length > 0 && unassignedStudies().length > 0
+  );
🤖 Prompt for AI Agents
In packages/web/src/components/project-ui/overview-tab/OverviewTab.jsx around
lines 151 to 153, the derived boolean shouldShowReviewerAssignment is created as
a plain function but depends on reactive signals; replace it with a createMemo
so the value is cached and updates reactively: import createMemo from 'solid-js'
if needed and change the declaration to use createMemo(() => isOwner() &&
studies().length > 0 && unassignedStudies().length > 0); keep using
shouldShowReviewerAssignment() where it's referenced.

@InfinityBowman InfinityBowman merged commit 8ff05f0 into main Dec 26, 2025
2 of 3 checks passed
@InfinityBowman InfinityBowman deleted the 154-overview-progress-indicators branch December 26, 2025 00:52
@coderabbitai coderabbitai Bot mentioned this pull request Apr 7, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Overview progress indicators

2 participants