Skip to content

refactor: migrate web TextArea to @makeplane/propel TextArea - #9747

Open
codingwolf-at wants to merge 10 commits into
previewfrom
refactor/makeplane-propel-textarea
Open

refactor: migrate web TextArea to @makeplane/propel TextArea#9747
codingwolf-at wants to merge 10 commits into
previewfrom
refactor/makeplane-propel-textarea

Conversation

@codingwolf-at

@codingwolf-at codingwolf-at commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Description

Migrates TextArea from @plane/ui to @makeplane/propel across apps/web (community edition only — admin, space, and packages/editor untouched).

Two patterns, applied consistently across all 12 call sites:

  • Validated form fields (8 files: cycle/module/view/project-state/project/API-token description fields, issue title) — Field + TextAreaGroup + TextArea size="lg" surface="field" from @makeplane/propel/components/text-area. hasError maps to Field invalid, giving the danger border for free via Propel's built-in data-invalid wiring.
  • Standalone / no-validation fields (4 files: read-only description display in cycle/module analytics sidebars, page editor title) — bare TextArea from the same components/text-area subpath, no Field/TextAreaGroup wrapper.

All imports resolve from @makeplane/propel/components/text-area only (no elements/* subpath imports).

Also bumps the @makeplane/propel lockfile entry for the web importer from 0.2.0 to 0.3.0 in pnpm-lock.yaml (already the pinned catalog version; the web importer's lockfile entry was stale and 0.2.0 has no text-area export).

Known visual deltas (Propel has no equivalent for these, and per migration convention we don't hack around it with className):

  • apps/web/core/components/pages/editor/title.tsx — page title loses font-bold tracking-[-2%]; Propel's size scale has no bold variant. The read-only <h6> view (untouched) still renders bold, so edit vs. view mode differ slightly. Flagged for design review.
Old prop (@plane/ui) New prop (@makeplane/propel)
hasError Field invalid
textAreaSize (default sm) size="lg"
mode="primary" surface="field" (wrapped in TextAreaGroup)
className (chrome overrides) dropped — no className on Propel primitives

Type of Change

  • Code refactoring

Screenshots and Media (if applicable)

Instance Context File
Issue detail title Work item detail page, title field text-area--issue-detail-title--default
Cycle sidebar description Cycle detail page, read-only description text-area--cycle-detail-sidebar-description--default
Cycle update modal Cycles list → Edit text-area--cycle-update-modal--default
Module sidebar description Module detail page, read-only description text-area--module-detail-sidebar-description--default
Module update modal Modules list → Edit text-area--module-update-modal--default
Project view create modal Project → Views → Add view text-area--project-view-create-modal--default
Workspace view create modal Workspace → Views → Add view text-area--workspace-view-create-modal--default
Project settings description Project Settings → General text-area--project-settings-general-description--default
Project states inline create Project Settings → States → Add state text-area--project-states-inline-create--default
Create Project modal Projects → Add Project text-area--create-project-modal--default
API token create modal Workspace Settings → Personal Access Tokens → Add text-area--api-token-create-modal--default

autoResize + maxRows verified interactively on each field (grows with content, caps at the configured row count, scrolls internally past that — confirmed via real typed input, not just visual inspection).

Test Scenarios

  • pnpm turbo run check:lint check:types check:format build --filter=web — all green
  • Manual pass recommended per area:
    • Cycles: create/edit form description, sidebar description display
    • Modules: create/edit form description, sidebar description display
    • Projects: settings general form description, create-wizard description
    • Project states (workflow): create/update form description
    • Views: workspace-level and project-level form description
    • API tokens: create-token modal description
    • Issue title editing (peek view, issue detail, inbox) — including empty-title validation (red border)
    • Page editor title — including small/large font-size preference toggle

Summary by CodeRabbit

  • Improvements
    • Standardized description fields across API tokens, cycles, modules, projects, states, views, and workspaces with consistent styling and validation feedback.
    • Description fields now resize automatically, with up to eight visible rows where applicable.
    • Improved long module name wrapping.
  • UI Updates
    • Refined issue title alignment across inbox, detail, and peek-overview views.
    • Updated form text areas with a more consistent editing experience.

Updated various forms across the application to utilize TextAreaGroup for better structure and error handling. This change enhances the consistency of the description fields in forms, ensuring they are wrapped in a Field component for validation and styling. The updates were made in the CreateApiTokenForm, CycleForm, ModuleForm, ProjectDetailsForm, and others.
@codingwolf-at codingwolf-at self-assigned this Sep 3, 2026
@coderabbitai

coderabbitai Bot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Team

Run ID: 09f06657-965a-44fe-b668-ad0bf1e8fe73

📥 Commits

Reviewing files that changed from the base of the PR and between 5d978e1 and c2d4014.

📒 Files selected for processing (3)
  • apps/web/core/components/issues/title-input.tsx
  • apps/web/core/components/modules/analytics-sidebar/root.tsx
  • apps/web/core/components/project-states/create-update/form.tsx

Included review availability: Your plan provides up to 10 included reviews per hour; 9 remain after this review.


📝 Walkthrough

Walkthrough

The changes migrate description and issue title inputs from Plane UI text areas to Propel components. Fields now use automatic resizing and Field-based validation state. Issue title call sites lose negative-margin overrides. The page editor title component is deleted.

Changes

Web input component migration

Layer / File(s) Summary
Description form migration
apps/web/core/components/{api-token/modal/form.tsx,cycles/form.tsx,modules/form.tsx,project-states/create-update/form.tsx,project/create/common-attributes.tsx,project/form.tsx,views/form.tsx,workspace/views/form.tsx}
Description fields now use Propel Field, TextAreaGroup, and TextArea components with automatic resizing and bounded row counts.
Read-only description fields
apps/web/core/components/cycles/analytics-sidebar/sidebar-details.tsx, apps/web/core/components/modules/analytics-sidebar/root.tsx
Analytics descriptions now use Propel text areas with inline surface styling and automatic resizing.
Issue title input migration
apps/web/core/components/issues/title-input.tsx, apps/web/core/components/inbox/content/issue-root.tsx, apps/web/core/components/issues/issue-detail/main-content.tsx, apps/web/core/components/issues/peek-overview/issue-detail.tsx
IssueTitleInput now uses Propel field components, accepts textarea or input change events, and no longer receives negative-margin container styling.
Page editor title removal
apps/web/core/components/pages/editor/title.tsx
The PageEditorTitle component file was deleted.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Merge Risk: ⚪ Minimal · up to c2d40

This change migrates web text areas to Propel components while preserving controlled state, validation handling, and intended title behavior. No concrete current-head merge-blocking risk remains.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 6 functions across 11 files. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description check ✅ Passed The description clearly explains the TextArea migration, affected areas, implementation patterns, lockfile update, known visual delta, screenshots, and test scenarios. The optional References section …
Title check ✅ Passed The title clearly and concisely summarizes the primary change: migrating web TextArea usage to @makeplane/propel TextArea.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Full details: Description check

Explanation

The description clearly explains the TextArea migration, affected areas, implementation patterns, lockfile update, known visual delta, screenshots, and test scenarios. The optional References section is not included, but no related issue is required by the provided template.

  • Fix all pre-merge checks with AI
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch refactor/makeplane-propel-textarea

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

@github-actions

github-actions Bot commented Sep 3, 2026

Copy link
Copy Markdown

React Doctor found 3 new issues in 3 files · 3 warnings · score 86 / 100 (Great) · 3 fixed · vs preview

3 warnings

core/components/cycles/analytics-sidebar/sidebar-details.tsx

  • ⚠️ L30 React function has high control-flow complexity no-high-complexity-react-function

core/components/issues/issue-detail/main-content.tsx

  • ⚠️ L47 React function has high control-flow complexity no-high-complexity-react-function

core/components/issues/peek-overview/issue-detail.tsx

  • ⚠️ L47 React function has high control-flow complexity no-high-complexity-react-function

Reviewed by React Doctor for commit c2d4014. See inline comments for fixes.

@codingwolf-at codingwolf-at changed the title Refactor/makeplane propel textarea [WIP] refactor: migrate web TextArea to @makeplane/propel TextArea Sep 3, 2026
…nd maxRows

Updated various forms to improve the TextArea components by adding auto-resize functionality and setting a maximum number of rows. This change enhances user experience by allowing better visibility and management of text input across the CreateApiTokenForm, CycleForm, ModuleForm, ProjectDetailsForm, and others.
Removed the redundant containerClassName="-ml-3" from TextArea components in InboxIssueMainContent, IssueMainContent, and PeekOverviewIssueDetails to streamline the code and improve consistency across the application.
… analytics sidebars

Updated the TextArea components in CycleSidebarDetails and ModuleAnalyticsSidebar to remove the maxRows property, allowing for unrestricted text input. This change enhances the user experience by providing more flexibility in text entry.
Eliminated the optional className prop from the IssueTitleInputProps interface to streamline the component's API and improve consistency across the application.
…ionality

Deleted the PageEditorTitle component from the editor, simplifying the codebase and enhancing maintainability. This change aligns with ongoing efforts to improve component structure and reduce redundancy in the application.
@codingwolf-at
codingwolf-at marked this pull request as ready for review September 3, 2026 10:20
@coldtea-pr-lens

coldtea-pr-lens Bot commented Sep 3, 2026

Copy link
Copy Markdown

◈ PR Lens

🟢 +0 new · 🟠 ~4 changed · 🔴 -1 removed · 1 flow · 17 files · commit c2d4014


Architecture

Architecture diagram for makeplane/plane at c2d4014

5 components touched across 3 lanes.

Open full size


Inside the changed components — 2 views

Component view — Issue Title & Detail Inputs

Issue title inputs and container wrappers in detail, peek, and inbox views migrated to Propel Field and inline auto-resizing TextArea.

Architecture view of Component view — Issue Title & Detail Inputs in makeplane/plane

Component view — Entity Modal & Sidebar Forms

Form inputs across project, cycle, module, state, view, and API token dialogs migrated to Propel Field validation wrappers and TextAreaGroup.

Architecture view of Component view — Entity Modal & Sidebar Forms in makeplane/plane

Data flow

Data flow diagram for makeplane/plane at c2d4014

Editing form field with Propel Field and TextArea

Open full size


Drill down
Client Applications — 4 components
🟡 CHANGED Plane Web App

Main React web client application consuming Propel design system form components.

🟡 CHANGED Issue Title & View Inputs

Issue title inputs and container wrappers in detail, peek, and inbox views migrated to inline Propel Field and TextArea.

🟡 CHANGED Entity Modal & Sidebar Forms

Creation dialogs, settings forms, and analytics sidebars for projects, cycles, modules, states, views, and API tokens migrated to Propel Field and TextAreaGroup.

🔴 REMOVED Page Editor Title Component

Deprecated standalone page editor title input component removed from the web client.

External Packages — 1 component
🟡 CHANGED @⁠makeplane/propel (v0.3.0)

Design system package providing Field validation wrappers, TextArea, and auto-resizing TextAreaGroup components.


View

  • Architecture lens
  • Data flow lens
  • Expand every detail
  • Show unchanged neighbours

Tip

The CLI's render picks up .github/pr-lens.yml automatically and applies your corrections (renames, exclusions, lane pins) at draw time.

🪧 More tips
  • Run PR Lens on your own machine: npx skills add coldteadotai/pr-lens installs the agent skill. Then tell your coding agent: "Diagram the change you just made with PR Lens and attach it to the pull request."
  • Draw a diff before it is even a pull request: npx @coldtea/pr-lens-cli analyze --base origin/main reads the diff with your own model key, and npx @coldtea/pr-lens-cli render .pr-lens/graph.json draws the same lenses on your machine.
  • The boxes under View are live. Tick Architecture lens or Data flow lens to choose which diagrams appear, or Expand every detail to open every drill-down at once. The comment redraws in place a few seconds later.
  • Show unchanged neighbours lists the components this change did not touch alongside the ones it did, so the drill-down shows what the changed code sits next to.
  • GitHub will not let you zoom an image in a comment. The link under each diagram opens it full size on a page of its own, where you can.
  • Would you rather run it from CI on a key of your own? Add .github/workflows/pr-lens.yml with coldteadotai/pr-lens/packages/action@v0 and a model key in your repository secrets, say GEMINI_API_KEY. The Action asks Gemini by default, or OpenAI and any endpoint speaking /chat/completions through its provider input.
  • PR Lens is free for open source. A star on the repository is what keeps it going.
  • Push a new commit and the whole comment re-renders for the new head. An older run never overwrites a newer one, so a slow render cannot put a stale diagram back.
  • The diagrams follow your GitHub theme, so dark mode gets the dark render and light mode the light one, and the moving dots show this pull request's data in motion.

◈ Rendered by PR Lens · crafted with ❤️ by the Coldtea team · Something drawn wrong?

id="description"
name="description"
placeholder="Describe this state for your members."
value={formData?.description}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

The textarea mounts uncontrolled because formData initially equals undefined. Propel then ignores the description populated by the effect, so existing state descriptions appear blank.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Fixed in af26810d81value now defaults to "" so the textarea stays controlled and existing state descriptions populate.

onFocus={() => setIsLengthVisible(true)}
onBlur={() => setIsLengthVisible(false)}
/>
<Field name="title" invalid={title?.length === 0}>

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

The issue title changes from a 20px borderless heading to a bordered 90px-tall field with 16px regular text. Long titles also begin scrolling after four rows. Was this intentional ??

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Addressed in 55e04833a5 — switched to surface="inline" with unbounded autoResize so the title stays heading-like and grows with content.

value={moduleDetails.description}
disabled
/>
<TextArea size="lg" surface="inline" autoResize value={moduleDetails.description} disabled />

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

The inline surface relies on flex sizing, but its parent is not a flex container. The textarea therefore falls back to its narrow intrinsic width instead of filling the sidebar. please validate this once in UI.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Fixed in c2d40147d4 — moved the description into the existing flex column so the inline textarea fills the sidebar.

Updated the description field in the StateForm component to default to an empty string when no value is provided. This change improves the handling of form data and ensures consistent behavior in the input field.
Updated the IssueTitleInput component to eliminate the TextAreaGroup wrapper, replacing it with a div for improved structure. Additionally, adjusted the TextArea properties to set the surface to "inline" and changed the rows to 1, enhancing the input's appearance and functionality.
Removed redundant wrapping of the description TextArea in the ModuleAnalyticsSidebar component, simplifying the code while maintaining functionality. This change enhances readability and consistency in the component's structure.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants