Skip to content

[WEB-5537]refactor: rename IssueUserProperty to ProjectUserProperty and update related references #8206

Merged
sriramveeraghanta merged 18 commits into
previewfrom
chore-user-property-migrations
Jan 6, 2026
Merged

[WEB-5537]refactor: rename IssueUserProperty to ProjectUserProperty and update related references #8206
sriramveeraghanta merged 18 commits into
previewfrom
chore-user-property-migrations

Conversation

@pablohashescobar
Copy link
Copy Markdown
Member

@pablohashescobar pablohashescobar commented Dec 1, 2025

Description

  • rename IssueUserProperty to ProjectUserProperty
  • add fields sort_order and preferences to ProjectUserProperty
  • migration script for migrating data from ProjectMembers to ProjectUserProperty
  • change references of IssueUserProperty to ProjectUserProperty

Type of Change

  • Improvement (change that would cause existing functionality to not work as expected)
  • Code refactoring

Test Scenarios

  • project workitem grouping and filtering
  • project sorting in the sidebar

References

WEB-5537


Note

Renames IssueUserProperty to ProjectUserProperty across backend, adds preferences and sort_order with data migrations, updates related endpoints and member flows, and adds allowed_rate_limit to APIToken.

  • Models & Migrations
    • Rename IssueUserPropertyProjectUserProperty (table to project_user_properties), update relations/constraints and serializer names.
    • Add preferences and sort_order to ProjectUserProperty; migrate values from ProjectMember (bulk update).
    • Add APIToken.allowed_rate_limit and migrate existing non-service tokens to null workspace.
    • Remove IssueUserProperty model; expose ProjectUserProperty from db.models.project.
  • API & Endpoints
    • Replace IssueUserDisplayPropertyEndpoint with ProjectUserDisplayPropertyEndpoint at workspaces/<slug>/projects/<project_id>/user-properties/ (partial update via serializer; creates if missing).
    • Update imports/usages in issue/project views, serializers, and URLs to use ProjectUserProperty.
  • Project membership & seeding
    • On project create/member add/invite accept/seed: create ProjectUserProperty records; compute sort_order using member’s workspace min where applicable.
    • ProjectMember.save now auto-creates corresponding ProjectUserProperty with derived sort_order.
    • Management command create_project_member now targets ProjectUserProperty.
  • Tests
    • Contract tests updated to assert creation of ProjectUserProperty for project members.

Written by Cursor Bugbot for commit d75efb3. This will update automatically on new commits. Configure here.

Summary by CodeRabbit

  • New Features

    • Per-project user preferences now include navigation settings and persistent sort order.
  • Improvements

    • Member ordering and onboarding produce more consistent member lists.
    • UI tab preferences persist at the project level for consistent navigation across sessions.
    • Invitation and member join flows align with project-level preferences.
  • Database Migrations

    • Migrations consolidate existing per-user project properties, add preferences and sort-order fields, and migrate prior values.

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

@pablohashescobar pablohashescobar requested review from Copilot and dheeru0198 and removed request for Copilot December 1, 2025 09:30
@makeplane
Copy link
Copy Markdown

makeplane Bot commented Dec 1, 2025

Linked to Plane Work Item(s)

This comment was auto-generated by Plane

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Dec 1, 2025

📝 Walkthrough

Walkthrough

Replaces IssueUserProperty with ProjectUserProperty: removes the old model, adds ProjectUserProperty (preferences, sort_order), updates models, views, serializers, URLs, tasks, CLI, migrations, tests, and frontend types/hooks; includes data migrations to transfer existing values.

Changes

Cohort / File(s) Summary
Database models & exports
apps/api/plane/db/models/issue.py, apps/api/plane/db/models/project.py, apps/api/plane/db/models/__init__.py
Removes IssueUserProperty; adds ProjectUserProperty (fields: preferences, sort_order, JSON defaults); updates exports and ProjectMember.save to create/use ProjectUserProperty. Schema/table and model location changed.
Migrations
apps/api/plane/db/migrations/0114_*.py, apps/api/plane/db/migrations/0115_*.py
0114 renames table/model and adds fields/constraints; 0115 migrates preferences/sort_order from members to properties and adjusts API tokens. Contains RunPython data migrations.
Views & API logic
apps/api/plane/api/views/project.py, apps/api/plane/app/views/project/..., apps/api/plane/app/views/issue/...
Replaces imports/usages of IssueUserProperty with ProjectUserProperty; removes some property creation during project creation; renames IssueUserDisplayPropertyEndpoint → ProjectUserDisplayPropertyEndpoint. Check project creation, invite, and member flows.
Serializers, URLs & public exports
apps/api/plane/app/serializers/issue.py, apps/api/plane/app/serializers/__init__.py, apps/api/plane/app/urls/issue.py, apps/api/plane/app/views/__init__.py
Renames IssueUserPropertySerializerProjectUserPropertySerializer; updates URL to use ProjectUserDisplayPropertyEndpoint; updates module-level exports.
Background tasks & CLI
apps/api/plane/bgtasks/workspace_seed_task.py, apps/api/plane/db/management/commands/create_project_member.py
Seed and CLI now bulk-create / get_or_create ProjectUserProperty; removed some sort_order computation in management command.
Member flows & invites
apps/api/plane/app/views/project/invite.py, apps/api/plane/app/views/project/member.py
Bulk_create now creates ProjectUserProperty records; post-join member creation uses project_id (not workspace_id); new min-based sort_order logic via ProjectUserProperty. Review sorting and property-sync logic.
Tests & frontend types/hooks
apps/api/plane/tests/contract/app/test_project_app.py, apps/web/core/components/navigation/use-tab-preferences.ts, packages/types/src/view-props.ts, packages/types/src/project/projects.ts
Tests updated to expect ProjectUserProperty; frontend hook switched to use project user properties and updated preferences payload; new IProjectUserPropertiesResponse added; removed ProjectPreferences type.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Poem

🐇 I hopped from Issue to Project with a twitch of my whiskers,
New fields tucked in pockets, sort orders like whisker-kissers.
Migrations that hum, serializers that sing,
Preferences now bundled — a neat little thing.
A carrot for the code, and a happy small spring.

Pre-merge checks and finishing touches

❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 25.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
Title check ✅ Passed The title clearly and concisely summarizes the main change: renaming IssueUserProperty to ProjectUserProperty and updating references throughout the codebase.
Description check ✅ Passed The description covers all required template sections with sufficient detail: lists key changes (rename, new fields, migrations), identifies the type of change (Improvement and Code refactoring), describes test scenarios, and provides references to the issue.
✨ Finishing touches
  • 📝 Generate docstrings

📜 Recent review details

Configuration used: defaults

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 2ce67a1 and ffb017f.

📒 Files selected for processing (1)
  • apps/web/core/components/navigation/use-tab-preferences.ts
🧰 Additional context used
📓 Path-based instructions (4)
**/*.{ts,tsx,mts,cts}

📄 CodeRabbit inference engine (.github/instructions/typescript.instructions.md)

**/*.{ts,tsx,mts,cts}: Use const type parameters for more precise literal inference in TypeScript 5.0+
Use the satisfies operator to validate types without widening them
Leverage inferred type predicates to reduce the need for explicit is return types in filter/check functions
Use NoInfer<T> utility to block inference for specific type arguments when they should be determined by other arguments
Utilize narrowing in switch(true) blocks for control flow analysis (TypeScript 5.3+)
Rely on narrowing from direct boolean comparisons for type guards
Trust preserved narrowing in closures when variables aren't modified after the check (TypeScript 5.4+)
Use constant indices to narrow object/array properties (TypeScript 5.5+)
Use standard ECMAScript decorators (Stage 3) instead of legacy experimentalDecorators
Use using declarations for explicit resource management with Disposable pattern instead of manual cleanup (TypeScript 5.2+)
Use with { type: "json" } for import attributes; avoid deprecated assert syntax (TypeScript 5.3/5.8+)
Use import type explicitly when importing types to ensure they are erased during compilation, respecting verbatimModuleSyntax flag
Use .ts, .mts, .cts extensions in import type statements (TypeScript 5.2+)
Use import type { Type } from "mod" with { "resolution-mode": "import" } for specific module resolution contexts (TypeScript 5.3+)
Use new iterator methods (map, filter, etc.) if targeting modern environments (TypeScript 5.6+)
Utilize new Set methods like union, intersection, etc., when available (TypeScript 5.5+)
Use Object.groupBy / Map.groupBy standard methods for grouping instead of external libraries (TypeScript 5.4+)
Use Promise.withResolvers() for creating promises with exposed resolve/reject functions (TypeScript 5.7+)
Use copying array methods (toSorted, toSpliced, with) for immutable array operations (TypeScript 5.2+)
Avoid accessing instance fields via super in classes (TypeScript 5....

Files:

  • apps/web/core/components/navigation/use-tab-preferences.ts
**/*.{ts,tsx}

📄 CodeRabbit inference engine (AGENTS.md)

Enable TypeScript strict mode and ensure all files are fully typed

Files:

  • apps/web/core/components/navigation/use-tab-preferences.ts
**/*.{js,jsx,ts,tsx,json,css}

📄 CodeRabbit inference engine (AGENTS.md)

Use Prettier with Tailwind plugin for code formatting, run pnpm fix:format

Files:

  • apps/web/core/components/navigation/use-tab-preferences.ts
**/*.{js,jsx,ts,tsx}

📄 CodeRabbit inference engine (AGENTS.md)

**/*.{js,jsx,ts,tsx}: Use ESLint with shared config across packages, adhering to max warnings limits per package
Use camelCase for variable and function names, PascalCase for components and types
Use try-catch with proper error types and log errors appropriately

Files:

  • apps/web/core/components/navigation/use-tab-preferences.ts
🧠 Learnings (1)
📓 Common learnings
Learnt from: NarayanBavisetti
Repo: makeplane/plane PR: 7460
File: apps/api/plane/app/serializers/draft.py:112-122
Timestamp: 2025-07-23T18:18:06.875Z
Learning: In the Plane codebase serializers, workspace_id is not consistently passed in serializer context, so parent issue validation in DraftIssueCreateSerializer only checks project_id rather than both workspace_id and project_id. The existing project member authentication system already validates that users can only access projects they belong to, providing sufficient security without risking breaking functionality by adding workspace_id validation where the context might not be available.
🧬 Code graph analysis (1)
apps/web/core/components/navigation/use-tab-preferences.ts (3)
apps/web/core/services/project/project.service.ts (2)
  • getProjectUserProperties (95-101)
  • updateProjectUserProperties (103-113)
apps/web/core/components/navigation/tab-navigation-utils.ts (2)
  • DEFAULT_TAB_KEY (9-9)
  • TTabPreferences (2-5)
apps/space/core/store/publish/publish.store.ts (1)
  • workspaceSlug (93-95)
⏰ 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). (3)
  • GitHub Check: check:types
  • GitHub Check: check:lint
  • GitHub Check: Analyze (javascript)
🔇 Additional comments (4)
apps/web/core/components/navigation/use-tab-preferences.ts (4)

24-38: LGTM!

The store access changes align well with the backend refactoring from IssueUserProperty to ProjectUserProperty. The nested navigation preferences structure matches the expected API contract, and the fallback values are appropriate.


40-48: LGTM!

The memoization dependencies are correct, and the loading state logic properly handles the case where preferences haven't been fetched yet.


53-63: LGTM!

The nested preferences structure correctly matches the expected API contract. Preserving existing pages preferences with a fallback prevents unintentional data loss.


69-88: LGTM!

The async error handling with .then()/.catch() is correct. The return; on line 79 is unnecessary but harmless.


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 and usage tips.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🧹 Nitpick comments (2)
apps/api/plane/db/models/api.py (1)

35-39: New allowed_rate_limit field is consistent with migration; consider minor cleanups

The allowed_rate_limit CharField with default "60/min" looks fine and matches the migration; this should be safe for existing tokens. You may also want to (optionally) add help_text clarifying the expected format and fix the existing typo "API Tokems" in verbose_name_plural while you’re in this model.

apps/api/plane/db/migrations/0113_alter_issueuserproperty_table.py (1)

1-38: Migration sequence and new fields look consistent with the model changes

The migration cleanly renames the IssueUserProperty table/model to ProjectUserProperty and adds the allowed_rate_limit, preferences, and sort_order fields in line with the model definitions. If you want extra long‑term safety, you could inline a simple dict default for preferences in this migration instead of importing get_default_preferences, but it’s not strictly required.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 8db95d9 and 6a09e51.

📒 Files selected for processing (16)
  • apps/api/plane/api/views/project.py (3 hunks)
  • apps/api/plane/app/serializers/issue.py (2 hunks)
  • apps/api/plane/app/urls/issue.py (1 hunks)
  • apps/api/plane/app/views/issue/base.py (3 hunks)
  • apps/api/plane/app/views/project/base.py (3 hunks)
  • apps/api/plane/app/views/project/invite.py (2 hunks)
  • apps/api/plane/app/views/project/member.py (3 hunks)
  • apps/api/plane/bgtasks/workspace_seed_task.py (2 hunks)
  • apps/api/plane/db/management/commands/create_project_member.py (2 hunks)
  • apps/api/plane/db/migrations/0113_alter_issueuserproperty_table.py (1 hunks)
  • apps/api/plane/db/migrations/0114_auto_20251201_0857.py (1 hunks)
  • apps/api/plane/db/models/__init__.py (1 hunks)
  • apps/api/plane/db/models/api.py (1 hunks)
  • apps/api/plane/db/models/issue.py (0 hunks)
  • apps/api/plane/db/models/project.py (1 hunks)
  • apps/api/plane/tests/contract/app/test_project_app.py (3 hunks)
💤 Files with no reviewable changes (1)
  • apps/api/plane/db/models/issue.py
🧰 Additional context used
🧠 Learnings (3)
📚 Learning: 2025-07-23T18:18:06.875Z
Learnt from: NarayanBavisetti
Repo: makeplane/plane PR: 7460
File: apps/api/plane/app/serializers/draft.py:112-122
Timestamp: 2025-07-23T18:18:06.875Z
Learning: In the Plane codebase serializers, workspace_id is not consistently passed in serializer context, so parent issue validation in DraftIssueCreateSerializer only checks project_id rather than both workspace_id and project_id. The existing project member authentication system already validates that users can only access projects they belong to, providing sufficient security without risking breaking functionality by adding workspace_id validation where the context might not be available.

Applied to files:

  • apps/api/plane/app/views/project/member.py
  • apps/api/plane/app/serializers/issue.py
  • apps/api/plane/api/views/project.py
  • apps/api/plane/tests/contract/app/test_project_app.py
  • apps/api/plane/bgtasks/workspace_seed_task.py
📚 Learning: 2025-10-29T09:17:54.815Z
Learnt from: NarayanBavisetti
Repo: makeplane/plane PR: 7905
File: apps/api/plane/app/views/search/base.py:241-276
Timestamp: 2025-10-29T09:17:54.815Z
Learning: In apps/api/plane/app/views/search/base.py, the `filter_intakes` method uses `Issue.objects` (base manager) instead of `Issue.issue_objects` (custom manager) because the custom manager filters out all intake statuses, which would prevent querying pending and snoozed intake issues.

Applied to files:

  • apps/api/plane/api/views/project.py
  • apps/api/plane/app/views/issue/base.py
📚 Learning: 2025-09-12T07:29:36.083Z
Learnt from: dheeru0198
Repo: makeplane/plane PR: 7625
File: apps/api/plane/bgtasks/workspace_seed_task.py:95-98
Timestamp: 2025-09-12T07:29:36.083Z
Learning: In the Plane codebase, workspace seed data should have project features (cycle_view, module_view, issue_views_view) enabled by default, even when regular project creation has these features disabled. This provides users with a complete demo experience in the seeded workspace.

Applied to files:

  • apps/api/plane/bgtasks/workspace_seed_task.py
🧬 Code graph analysis (14)
apps/api/plane/app/views/project/member.py (1)
apps/api/plane/db/models/project.py (2)
  • Project (64-158)
  • ProjectUserProperty (317-348)
apps/api/plane/app/serializers/issue.py (1)
apps/api/plane/db/models/project.py (1)
  • ProjectUserProperty (317-348)
apps/api/plane/db/models/__init__.py (1)
apps/api/plane/db/models/project.py (1)
  • ProjectUserProperty (317-348)
apps/api/plane/db/management/commands/create_project_member.py (1)
apps/api/plane/db/models/project.py (1)
  • ProjectUserProperty (317-348)
apps/api/plane/app/urls/issue.py (1)
apps/api/plane/app/views/issue/base.py (1)
  • IssueUserDisplayPropertyEndpoint (718-735)
apps/api/plane/api/views/project.py (2)
apps/api/plane/db/models/project.py (1)
  • ProjectUserProperty (317-348)
apps/api/plane/app/views/project/base.py (3)
  • create (238-299)
  • create (501-508)
  • create (578-606)
apps/api/plane/db/migrations/0114_auto_20251201_0857.py (2)
apps/api/plane/db/models/project.py (2)
  • ProjectMember (191-235)
  • ProjectUserProperty (317-348)
apps/api/plane/db/migrations/0113_alter_issueuserproperty_table.py (1)
  • Migration (8-38)
apps/api/plane/app/views/issue/base.py (1)
apps/api/plane/db/models/project.py (1)
  • ProjectUserProperty (317-348)
apps/api/plane/tests/contract/app/test_project_app.py (1)
apps/api/plane/db/models/project.py (1)
  • ProjectUserProperty (317-348)
apps/api/plane/bgtasks/workspace_seed_task.py (1)
apps/api/plane/db/models/project.py (1)
  • ProjectUserProperty (317-348)
apps/api/plane/db/models/project.py (1)
apps/api/plane/db/models/issue.py (3)
  • get_default_filters (43-54)
  • get_default_display_filters (57-66)
  • get_default_display_properties (69-84)
apps/api/plane/app/views/project/base.py (2)
apps/api/plane/db/models/project.py (1)
  • ProjectUserProperty (317-348)
apps/api/plane/app/views/project/member.py (1)
  • create (42-150)
apps/api/plane/app/views/project/invite.py (1)
apps/api/plane/db/models/project.py (1)
  • ProjectUserProperty (317-348)
apps/api/plane/db/migrations/0113_alter_issueuserproperty_table.py (2)
apps/api/plane/db/migrations/0114_auto_20251201_0857.py (1)
  • Migration (31-42)
apps/api/plane/db/models/project.py (1)
  • get_default_preferences (60-61)
⏰ 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). (4)
  • GitHub Check: Agent
  • GitHub Check: Cursor Bugbot
  • GitHub Check: Lint API
  • GitHub Check: Analyze (javascript)
🔇 Additional comments (22)
apps/api/plane/app/urls/issue.py (1)

211-217: Comment rename correctly reflects underlying model

The updated ## ProjectUserProperty comments around the user-properties/ route align with the new model name and keep the URL behavior unchanged.

apps/api/plane/db/models/__init__.py (1)

48-56: Public model surface correctly switched to ProjectUserProperty

Exporting ProjectUserProperty from .project (with IssueUserProperty no longer present) correctly aligns the public API with the new model.

apps/api/plane/app/serializers/issue.py (2)

16-41: Model import updated correctly to ProjectUserProperty

Switching the import in plane.db.models from the old property model to ProjectUserProperty keeps this serializer file aligned with the new model layout.


349-353: IssueUserPropertySerializer now bound to ProjectUserProperty

Pointing the serializer’s Meta.model to ProjectUserProperty matches the refactor and stays compatible with existing views that use this serializer. The read_only_fields list still matches the new model’s base fields, so no further changes seem necessary.

apps/api/plane/app/views/project/base.py (1)

24-37: Project creation flow now correctly seeds ProjectUserProperty

Importing and creating ProjectUserProperty for the creator (and distinct project lead) keeps per-user project properties in sync with the new model and respects the unique (user, project) constraint. The conditional on project_lead still prevents duplicate records for the same user.

Also applies to: 245-266

apps/api/plane/db/management/commands/create_project_member.py (1)

6-12: Management command now seeds ProjectUserProperty instead of IssueUserProperty

Updating the import and using ProjectUserProperty.objects.get_or_create(user=user, project=project) keeps this command aligned with the new model while preserving idempotent behavior.

Also applies to: 69-71

apps/api/plane/tests/contract/app/test_project_app.py (1)

6-13: Tests correctly updated to assert ProjectUserProperty creation

Switching the import and expectations from IssueUserProperty to ProjectUserProperty matches the refactor: you now assert a property for the creator and two properties when a distinct project lead is set, which aligns with the updated create flow.

Also applies to: 80-87, 116-121

apps/api/plane/bgtasks/workspace_seed_task.py (2)

23-23: LGTM!

The import correctly references the renamed ProjectUserProperty model.


121-160: LGTM!

The bulk creation correctly uses ProjectUserProperty instead of IssueUserProperty. The new fields preferences and sort_order are not explicitly set, which is acceptable as they have sensible defaults defined in the model.

apps/api/plane/app/views/issue/base.py (3)

54-54: LGTM!

Import correctly updated to ProjectUserProperty.


720-729: LGTM!

The patch method correctly uses ProjectUserProperty.objects.get() and accesses fields that exist in the new model definition. Note that the serializer is still named IssueUserPropertySerializer, which appears to be intentional as it's not part of this refactor's scope.


732-735: LGTM!

The get method correctly uses ProjectUserProperty.objects.get_or_create() with appropriate fields matching the model's unique constraints.

apps/api/plane/app/views/project/member.py (3)

16-16: LGTM!

Import statement correctly includes ProjectUserProperty.


121-127: LGTM!

ProjectUserProperty instantiation correctly sets the required fields. The new fields preferences and sort_order will use their default values, consistent with the pattern used elsewhere in the codebase.


132-132: LGTM!

bulk_create correctly uses ProjectUserProperty with appropriate parameters including ignore_conflicts=True to handle the unique constraint on user and project.

apps/api/plane/api/views/project.py (3)

21-21: LGTM!

Import correctly updated to ProjectUserProperty.


220-220: LGTM!

ProjectUserProperty creation for the requesting user correctly sets project_id and user. The new fields will use their default values.


231-234: LGTM!

ProjectUserProperty creation for the project lead is correctly implemented with appropriate conditional logic. Using user_id as a keyword argument is valid.

apps/api/plane/db/migrations/0114_auto_20251201_0857.py (2)

5-28: LGTM!

The data migration correctly copies preferences and sort_order from ProjectMember to ProjectUserProperty for matching user-project pairs. The implementation is efficient using dictionary-based lookups and bulk updates with an appropriate batch size.


31-42: LGTM!

The migration structure is correct with appropriate dependency on the previous migration and a no-op reverse operation, which is standard for data migrations.

apps/api/plane/app/views/project/invite.py (2)

27-27: LGTM!

Import correctly updated to ProjectUserProperty.


163-174: LGTM!

The bulk creation of ProjectUserProperty is correctly implemented with appropriate fields and ignore_conflicts=True to handle the unique constraint on user and project.

Comment thread apps/api/plane/db/models/project.py
@sriramveeraghanta
Copy link
Copy Markdown
Member

@pablohashescobar Update the ProjectUserProperty Serializers to support updating the additional properties.

Comment thread apps/api/plane/app/views/issue/base.py Outdated
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

This PR refactors the IssueUserProperty model to ProjectUserProperty, reflecting its broader scope beyond issue-specific properties. The refactoring includes adding preferences and sort_order fields migrated from ProjectMember, and also adds allowed_rate_limit to the APIToken model.

Key changes:

  • Renamed IssueUserProperty to ProjectUserProperty and moved from issue.py to project.py
  • Added preferences and sort_order fields to ProjectUserProperty, populated via data migration from ProjectMember
  • Updated all references across views, serializers, tests, management commands, and background tasks

Reviewed changes

Copilot reviewed 16 out of 16 changed files in this pull request and generated 1 comment.

Show a summary per file
File Description
apps/api/plane/db/models/issue.py Removed IssueUserProperty model definition
apps/api/plane/db/models/project.py Added ProjectUserProperty model with additional fields
apps/api/plane/db/models/init.py Updated import from IssueUserProperty to ProjectUserProperty
apps/api/plane/db/models/api.py Added allowed_rate_limit field to APIToken
apps/api/plane/db/migrations/0113_alter_issueuserproperty_table.py Migration to rename model, alter table, and add new fields
apps/api/plane/db/migrations/0114_alter_projectuserproperty_options_and_more.py Data migration from ProjectMember to ProjectUserProperty
apps/api/plane/app/serializers/issue.py Updated IssueUserPropertySerializer to use ProjectUserProperty model
apps/api/plane/app/views/issue/base.py Updated references to use ProjectUserProperty
apps/api/plane/app/views/project/base.py Updated project creation to use ProjectUserProperty
apps/api/plane/app/views/project/member.py Updated member addition to use ProjectUserProperty
apps/api/plane/app/views/project/invite.py Updated invite acceptance to use ProjectUserProperty
apps/api/plane/api/views/project.py Updated API project creation to use ProjectUserProperty
apps/api/plane/bgtasks/workspace_seed_task.py Updated seed task to use ProjectUserProperty
apps/api/plane/db/management/commands/create_project_member.py Updated management command to use ProjectUserProperty
apps/api/plane/app/urls/issue.py Updated comments to reflect rename
apps/api/plane/tests/contract/app/test_project_app.py Updated tests to assert ProjectUserProperty creation

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread apps/api/plane/app/serializers/issue.py Outdated
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 6a09e51 and e43d9b6.

📒 Files selected for processing (3)
  • apps/api/plane/db/migrations/0113_alter_issueuserproperty_table.py (1 hunks)
  • apps/api/plane/db/migrations/0114_alter_projectuserproperty_options_and_more.py (1 hunks)
  • apps/api/plane/db/models/project.py (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • apps/api/plane/db/models/project.py
🧰 Additional context used
🧠 Learnings (1)
📓 Common learnings
Learnt from: NarayanBavisetti
Repo: makeplane/plane PR: 7460
File: apps/api/plane/app/serializers/draft.py:112-122
Timestamp: 2025-07-23T18:18:06.875Z
Learning: In the Plane codebase serializers, workspace_id is not consistently passed in serializer context, so parent issue validation in DraftIssueCreateSerializer only checks project_id rather than both workspace_id and project_id. The existing project member authentication system already validates that users can only access projects they belong to, providing sufficient security without risking breaking functionality by adding workspace_id validation where the context might not be available.
🧬 Code graph analysis (2)
apps/api/plane/db/migrations/0114_alter_projectuserproperty_options_and_more.py (2)
apps/api/plane/db/models/project.py (2)
  • ProjectMember (191-235)
  • ProjectUserProperty (317-348)
apps/api/plane/db/migrations/0113_alter_issueuserproperty_table.py (1)
  • Migration (8-54)
apps/api/plane/db/migrations/0113_alter_issueuserproperty_table.py (2)
apps/api/plane/db/migrations/0114_alter_projectuserproperty_options_and_more.py (1)
  • Migration (31-39)
apps/api/plane/db/models/project.py (1)
  • get_default_preferences (60-61)
⏰ 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). (3)
  • GitHub Check: CodeQL analysis (python)
  • GitHub Check: Agent
  • GitHub Check: Cursor Bugbot

Copy link
Copy Markdown

@cursor cursor Bot left a comment

Choose a reason for hiding this comment

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

This is the final PR Bugbot will review for you during this billing cycle

Your free Bugbot reviews will reset on December 20

Details

Your team is on the Bugbot Free tier. On this plan, Bugbot will review limited PRs each billing cycle for each member of your team.

To receive Bugbot reviews on all of your PRs, visit the Cursor dashboard to activate Pro and start your 14-day free trial.

Comment thread apps/api/plane/app/views/issue/base.py Outdated
Comment thread apps/api/plane/app/views/issue/base.py Outdated
…ertyEndpoint to ProjectUserPropertySerializer and ProjectUserDisplayPropertyEndpoint, updating all related references
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between f75d40f and d874227.

📒 Files selected for processing (5)
  • apps/api/plane/app/serializers/__init__.py (1 hunks)
  • apps/api/plane/app/serializers/issue.py (2 hunks)
  • apps/api/plane/app/urls/issue.py (2 hunks)
  • apps/api/plane/app/views/__init__.py (1 hunks)
  • apps/api/plane/app/views/issue/base.py (3 hunks)
🚧 Files skipped from review as they are similar to previous changes (2)
  • apps/api/plane/app/serializers/issue.py
  • apps/api/plane/app/views/issue/base.py
🧰 Additional context used
🧠 Learnings (1)
📚 Learning: 2025-07-23T18:18:06.875Z
Learnt from: NarayanBavisetti
Repo: makeplane/plane PR: 7460
File: apps/api/plane/app/serializers/draft.py:112-122
Timestamp: 2025-07-23T18:18:06.875Z
Learning: In the Plane codebase serializers, workspace_id is not consistently passed in serializer context, so parent issue validation in DraftIssueCreateSerializer only checks project_id rather than both workspace_id and project_id. The existing project member authentication system already validates that users can only access projects they belong to, providing sufficient security without risking breaking functionality by adding workspace_id validation where the context might not be available.

Applied to files:

  • apps/api/plane/app/serializers/__init__.py
🧬 Code graph analysis (3)
apps/api/plane/app/serializers/__init__.py (1)
apps/api/plane/app/serializers/issue.py (1)
  • ProjectUserPropertySerializer (349-353)
apps/api/plane/app/views/__init__.py (1)
apps/api/plane/app/views/issue/base.py (1)
  • ProjectUserDisplayPropertyEndpoint (718-735)
apps/api/plane/app/urls/issue.py (1)
apps/api/plane/app/views/issue/base.py (1)
  • ProjectUserDisplayPropertyEndpoint (718-735)
⏰ 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). (2)
  • GitHub Check: Analyze (javascript)
  • GitHub Check: Cursor Bugbot
🔇 Additional comments (2)
apps/api/plane/app/serializers/__init__.py (1)

55-55: LGTM!

The serializer rename correctly reflects the model rename from IssueUserProperty to ProjectUserProperty.

apps/api/plane/app/views/__init__.py (1)

118-118: LGTM!

The public export correctly reflects the endpoint rename from IssueUserDisplayPropertyEndpoint to ProjectUserDisplayPropertyEndpoint, maintaining consistency with the model rename.

Comment thread apps/api/plane/app/urls/issue.py
…perties by creating new entries and improve response handling
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

🧹 Nitpick comments (1)
apps/api/plane/app/views/issue/base.py (1)

718-745: Endpoint now supports updating new fields; consider minor cleanups

The renamed ProjectUserDisplayPropertyEndpoint now uses ProjectUserPropertySerializer with partial=True, so preferences and sort_order (and other writable fields) can be updated via PATCH, which addresses the earlier review concern. You could optionally:

  • Replace the explicit try/except + create in patch with a single get_or_create call (to mirror get and reduce duplication).
  • Rename issue_property to project_user_property or user_property for clarity post‑refactor.
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between d874227 and 280c3ce.

📒 Files selected for processing (1)
  • apps/api/plane/app/views/issue/base.py (3 hunks)
🧰 Additional context used
🧠 Learnings (1)
📚 Learning: 2025-07-23T18:18:06.875Z
Learnt from: NarayanBavisetti
Repo: makeplane/plane PR: 7460
File: apps/api/plane/app/serializers/draft.py:112-122
Timestamp: 2025-07-23T18:18:06.875Z
Learning: In the Plane codebase serializers, workspace_id is not consistently passed in serializer context, so parent issue validation in DraftIssueCreateSerializer only checks project_id rather than both workspace_id and project_id. The existing project member authentication system already validates that users can only access projects they belong to, providing sufficient security without risking breaking functionality by adding workspace_id validation where the context might not be available.

Applied to files:

  • apps/api/plane/app/views/issue/base.py
🧬 Code graph analysis (1)
apps/api/plane/app/views/issue/base.py (2)
apps/api/plane/app/serializers/issue.py (3)
  • ProjectUserPropertySerializer (349-353)
  • create (194-269)
  • create (580-583)
apps/api/plane/db/models/project.py (1)
  • ProjectUserProperty (317-348)
⏰ 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). (2)
  • GitHub Check: Cursor Bugbot
  • GitHub Check: Analyze (javascript)
🔇 Additional comments (1)
apps/api/plane/app/views/issue/base.py (1)

37-38: Imports correctly updated to ProjectUserProperty model/serializer

The imports for ProjectUserPropertySerializer and ProjectUserProperty are consistent with the refactor and are used appropriately in this module; no issues from this change set.

Also applies to: 54-59

Comment thread apps/api/plane/db/models/project.py
Comment thread apps/api/plane/db/migrations/0115_auto_20260105_0836.py
…y excluding bot users from workspace removal
dheeru0198
dheeru0198 previously approved these changes Dec 8, 2025
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

🧹 Nitpick comments (1)
apps/api/plane/db/models/project.py (1)

221-234: Consider using get_or_create() to prevent IntegrityError in edge cases.

The ProjectMember.save() method uses .create() when creating the associated ProjectUserProperty. While the if self._state.adding check ensures this only runs for new members, edge cases could still cause issues:

  1. Race conditions: If two concurrent requests create the same project member, both might attempt to create ProjectUserProperty, causing one to fail with an IntegrityError.
  2. Manual creation: If ProjectUserProperty is created manually (e.g., in migrations or data scripts) before ProjectMember is saved, the subsequent save will fail.

Using get_or_create() would make this code more robust:

ProjectUserProperty.objects.get_or_create(
    workspace_id=self.project.workspace_id,
    project=self.project,
    user=self.member,
    defaults={
        'sort_order': (min_sort_order - 10000 if min_sort_order is not None else 65535),
    }
)
🔎 Proposed refactor using get_or_create
         if self._state.adding and self.member:
             # Get the minimum sort_order for this member in the workspace
             min_sort_order_result = ProjectUserProperty.objects.filter(
                 workspace_id=self.project.workspace_id, user=self.member
             ).aggregate(min_sort_order=models.Min("sort_order"))
             min_sort_order = min_sort_order_result.get("min_sort_order")
 
             # create project user property with project sort order
-            ProjectUserProperty.objects.create(
+            ProjectUserProperty.objects.get_or_create(
                 workspace_id=self.project.workspace_id,
                 project=self.project,
                 user=self.member,
-                sort_order=(min_sort_order - 10000 if min_sort_order is not None else 65535),
+                defaults={
+                    'sort_order': (min_sort_order - 10000 if min_sort_order is not None else 65535),
+                }
             )
📜 Review details

Configuration used: defaults

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 3d7212b and da31afa.

📒 Files selected for processing (9)
  • apps/api/plane/api/views/project.py
  • apps/api/plane/app/views/__init__.py
  • apps/api/plane/app/views/issue/base.py
  • apps/api/plane/app/views/project/base.py
  • apps/api/plane/app/views/project/member.py
  • apps/api/plane/bgtasks/workspace_seed_task.py
  • apps/api/plane/db/models/__init__.py
  • apps/api/plane/db/models/issue.py
  • apps/api/plane/db/models/project.py
💤 Files with no reviewable changes (1)
  • apps/api/plane/db/models/issue.py
🚧 Files skipped from review as they are similar to previous changes (3)
  • apps/api/plane/app/views/project/base.py
  • apps/api/plane/app/views/issue/base.py
  • apps/api/plane/app/views/project/member.py
🧰 Additional context used
🧠 Learnings (4)
📚 Learning: 2025-07-23T18:18:06.875Z
Learnt from: NarayanBavisetti
Repo: makeplane/plane PR: 7460
File: apps/api/plane/app/serializers/draft.py:112-122
Timestamp: 2025-07-23T18:18:06.875Z
Learning: In the Plane codebase serializers, workspace_id is not consistently passed in serializer context, so parent issue validation in DraftIssueCreateSerializer only checks project_id rather than both workspace_id and project_id. The existing project member authentication system already validates that users can only access projects they belong to, providing sufficient security without risking breaking functionality by adding workspace_id validation where the context might not be available.

Applied to files:

  • apps/api/plane/api/views/project.py
  • apps/api/plane/bgtasks/workspace_seed_task.py
📚 Learning: 2025-10-29T09:17:54.815Z
Learnt from: NarayanBavisetti
Repo: makeplane/plane PR: 7905
File: apps/api/plane/app/views/search/base.py:241-276
Timestamp: 2025-10-29T09:17:54.815Z
Learning: In apps/api/plane/app/views/search/base.py, the `filter_intakes` method uses `Issue.objects` (base manager) instead of `Issue.issue_objects` (custom manager) because the custom manager filters out all intake statuses, which would prevent querying pending and snoozed intake issues.

Applied to files:

  • apps/api/plane/api/views/project.py
📚 Learning: 2025-12-23T14:18:32.899Z
Learnt from: dheeru0198
Repo: makeplane/plane PR: 8339
File: apps/api/plane/db/models/api.py:35-35
Timestamp: 2025-12-23T14:18:32.899Z
Learning: Django REST Framework rate limit strings are flexible: only the first character of the time unit matters. Acceptable formats include: "60/s", "60/sec", "60/second" (all equivalent), "60/m", "60/min", "60/minute" (all equivalent), "60/h", "60/hr", "60/hour" (all equivalent), and "60/d", "60/day" (all equivalent). Abbreviations like "min" are valid and do not need to be changed to "minute". Apply this guidance to any Python files in the project that configure DRF throttling rules.

Applied to files:

  • apps/api/plane/api/views/project.py
  • apps/api/plane/app/views/__init__.py
  • apps/api/plane/db/models/project.py
  • apps/api/plane/bgtasks/workspace_seed_task.py
  • apps/api/plane/db/models/__init__.py
📚 Learning: 2025-09-12T07:29:36.083Z
Learnt from: dheeru0198
Repo: makeplane/plane PR: 7625
File: apps/api/plane/bgtasks/workspace_seed_task.py:95-98
Timestamp: 2025-09-12T07:29:36.083Z
Learning: In the Plane codebase, workspace seed data should have project features (cycle_view, module_view, issue_views_view) enabled by default, even when regular project creation has these features disabled. This provides users with a complete demo experience in the seeded workspace.

Applied to files:

  • apps/api/plane/bgtasks/workspace_seed_task.py
🧬 Code graph analysis (4)
apps/api/plane/api/views/project.py (1)
apps/api/plane/db/models/project.py (1)
  • ProjectUserProperty (336-367)
apps/api/plane/app/views/__init__.py (1)
apps/api/plane/app/views/issue/base.py (1)
  • ProjectUserDisplayPropertyEndpoint (726-753)
apps/api/plane/db/models/project.py (1)
apps/api/plane/db/models/issue.py (3)
  • get_default_filters (43-54)
  • get_default_display_filters (57-66)
  • get_default_display_properties (69-84)
apps/api/plane/bgtasks/workspace_seed_task.py (1)
apps/api/plane/db/models/project.py (1)
  • ProjectUserProperty (336-367)
⏰ 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). (2)
  • GitHub Check: Build packages
  • GitHub Check: Analyze (javascript)
🔇 Additional comments (7)
apps/api/plane/app/views/__init__.py (1)

117-117: LGTM! Export correctly reflects the endpoint rename.

The updated export from IssueUserDisplayPropertyEndpoint to ProjectUserDisplayPropertyEndpoint is consistent with the broader refactoring to rename IssueUserProperty to ProjectUserProperty. The implementation in apps/api/plane/app/views/issue/base.py correctly uses the new model and serializer.

apps/api/plane/db/models/__init__.py (1)

56-56: LGTM! Clean export update.

The addition of ProjectUserProperty to the project module exports correctly reflects the model rename and relocation from the issue module. The public API surface has been updated consistently.

apps/api/plane/api/views/project.py (2)

21-21: LGTM! Import updated correctly.

The import change from IssueUserProperty to ProjectUserProperty aligns with the model rename across the codebase.


220-229: LGTM! Explicit ProjectUserProperty creation correctly removed.

The removal of explicit ProjectUserProperty.objects.create() calls is correct. Since ProjectMember.save() now automatically creates the corresponding ProjectUserProperty entry (as implemented in apps/api/plane/db/models/project.py lines 221-234), these manual creations are no longer needed. Both the creator and project lead will have ProjectUserProperty records created automatically when their ProjectMember records are created.

apps/api/plane/bgtasks/workspace_seed_task.py (2)

24-24: LGTM! Import updated correctly.

The import change from IssueUserProperty to ProjectUserProperty is consistent with the model rename.


124-163: LGTM! Bulk create correctly uses ProjectUserProperty.

The bulk creation of ProjectUserProperty instances for workspace seed data is correct. Since this is a bulk operation that bypasses ProjectMember.save(), the manual creation is appropriate. The fields passed (project, user_id, workspace_id, display_filters, display_properties, created_by_id) align with the new model definition.

apps/api/plane/db/models/project.py (1)

336-367: LGTM! ProjectUserProperty model definition is correct.

The new ProjectUserProperty model is well-defined with appropriate fields, constraints, and metadata. The unique constraint ensures one property record per user-project pair, and the sort_order field enables custom project ordering in the UI.

Note: A past review comment flagged a potential circular import issue with the imports on line 337. While that concern is being tracked separately, the model definition itself is correct.

dheeru0198
dheeru0198 previously approved these changes Jan 5, 2026
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

🧹 Nitpick comments (2)
apps/api/plane/db/migrations/0115_auto_20260105_0836.py (1)

31-39: API token migration seems unrelated to the core PR objective.

This migration updates API token workspace associations, which appears unrelated to the ProjectUserProperty refactor that is the focus of this PR. While the code itself is correct (the filter clause can use user__is_bot to traverse relationships, and the update only touches workspace_id which is directly on APIToken), consider whether this belongs in a separate migration or PR for better separation of concerns.

Note: A similar concern was raised in a past review but was marked as addressed. The current code is syntactically valid Django ORM.

apps/api/plane/db/migrations/0114_projectuserproperty_delete_issueuserproperty_and_more.py (1)

14-49: Migration structure looks correct.

The migration properly handles the model rename from IssueUserProperty to ProjectUserProperty with the following operations in the correct order:

  1. Table rename to project_user_properties
  2. Model rename
  3. New fields added (preferences, sort_order)
  4. Model options and constraints updated

The past review concern about syntax errors between the AddField and AlterModelOptions operations (line 32) has been addressed—the comma separator is present, making this valid Python syntax. The only minor issue is trailing whitespace on line 32, which doesn't affect functionality.

Optional: Clean up trailing whitespace
         migrations.AddField(
             model_name='projectuserproperty',
             name='sort_order',
             field=models.FloatField(default=65535),
-        ),        
+        ),
         migrations.AlterModelOptions(
📜 Review details

Configuration used: defaults

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between b39c769 and d3a50b7.

📒 Files selected for processing (2)
  • apps/api/plane/db/migrations/0114_projectuserproperty_delete_issueuserproperty_and_more.py
  • apps/api/plane/db/migrations/0115_auto_20260105_0836.py
🧰 Additional context used
🧠 Learnings (2)
📓 Common learnings
Learnt from: NarayanBavisetti
Repo: makeplane/plane PR: 7460
File: apps/api/plane/app/serializers/draft.py:112-122
Timestamp: 2025-07-23T18:18:06.875Z
Learning: In the Plane codebase serializers, workspace_id is not consistently passed in serializer context, so parent issue validation in DraftIssueCreateSerializer only checks project_id rather than both workspace_id and project_id. The existing project member authentication system already validates that users can only access projects they belong to, providing sufficient security without risking breaking functionality by adding workspace_id validation where the context might not be available.
📚 Learning: 2025-12-23T14:18:32.899Z
Learnt from: dheeru0198
Repo: makeplane/plane PR: 8339
File: apps/api/plane/db/models/api.py:35-35
Timestamp: 2025-12-23T14:18:32.899Z
Learning: Django REST Framework rate limit strings are flexible: only the first character of the time unit matters. Acceptable formats include: "60/s", "60/sec", "60/second" (all equivalent), "60/m", "60/min", "60/minute" (all equivalent), "60/h", "60/hr", "60/hour" (all equivalent), and "60/d", "60/day" (all equivalent). Abbreviations like "min" are valid and do not need to be changed to "minute". Apply this guidance to any Python files in the project that configure DRF throttling rules.

Applied to files:

  • apps/api/plane/db/migrations/0115_auto_20260105_0836.py
  • apps/api/plane/db/migrations/0114_projectuserproperty_delete_issueuserproperty_and_more.py
🧬 Code graph analysis (2)
apps/api/plane/db/migrations/0115_auto_20260105_0836.py (3)
apps/api/plane/db/models/project.py (2)
  • ProjectMember (204-254)
  • ProjectUserProperty (336-367)
apps/api/plane/db/models/api.py (1)
  • APIToken (19-44)
apps/api/plane/db/migrations/0114_projectuserproperty_delete_issueuserproperty_and_more.py (1)
  • Migration (8-50)
apps/api/plane/db/migrations/0114_projectuserproperty_delete_issueuserproperty_and_more.py (1)
apps/api/plane/db/models/project.py (1)
  • get_default_preferences (60-61)
⏰ 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). (3)
  • GitHub Check: check:lint
  • GitHub Check: check:types
  • GitHub Check: Analyze (javascript)
🔇 Additional comments (1)
apps/api/plane/db/migrations/0115_auto_20260105_0836.py (1)

5-28: The migration will not fail due to missing fields on ProjectMember.

ProjectMember has both preferences (added in migration 0040) and sort_order (added in migration 0039) fields defined in the model, so the query on line 10 is valid.

However, the function name move_issue_user_properties_to_project_user_properties is misleading—it copies data FROM ProjectMember TO ProjectUserProperty, not from IssueUserProperty. Consider renaming to copy_projectmember_properties_to_projectuserproperty or similar for clarity.

dheeru0198
dheeru0198 previously approved these changes Jan 5, 2026
@anmolsinghbhatia anmolsinghbhatia dismissed stale reviews from dheeru0198 and themself via 2ce67a1 January 5, 2026 15:45
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
apps/web/core/components/navigation/use-tab-preferences.ts (1)

98-108: Fix async error handling in handleHideTab and handleShowTab.

Both functions call the async updatePreferences without awaiting it inside a try-catch block. This means the try-catch cannot catch any errors from the Promise, as it only covers synchronous code. Any errors will become unhandled promise rejections, and the error toasts will never display.

Compare with handleToggleDefaultTab (lines 72-87), which correctly uses .then().catch() to handle the async operation.

🔎 Proposed fix for both functions

Fix for handleHideTab:

  const handleHideTab = (tabKey: string) => {
    const newPreferences = {
      ...tabPreferences,
      hiddenTabs: [...tabPreferences.hiddenTabs, tabKey],
    };
-   try {
-     updatePreferences(newPreferences);
-   } catch (error) {
-     console.error("Error hiding tab:", error);
-     setToast({
-       type: TOAST_TYPE.ERROR,
-       title: "Error!",
-       message: "Failed to hide tab. Please try again later.",
-     });
-   }
+   updatePreferences(newPreferences)
+     .catch((error) => {
+       console.error("Error hiding tab:", error);
+       setToast({
+         type: TOAST_TYPE.ERROR,
+         title: "Error!",
+         message: "Failed to hide tab. Please try again later.",
+       });
+     });
  };

Fix for handleShowTab:

  const handleShowTab = (tabKey: string) => {
    const newPreferences = {
      ...tabPreferences,
      hiddenTabs: tabPreferences.hiddenTabs.filter((key) => key !== tabKey),
    };
-   try {
-     updatePreferences(newPreferences);
-   } catch (error) {
-     console.error("Error showing tab:", error);
-     setToast({
-       type: TOAST_TYPE.ERROR,
-       title: "Error!",
-       message: "Something went wrong. Please try again later.",
-     });
-   }
+   updatePreferences(newPreferences)
+     .catch((error) => {
+       console.error("Error showing tab:", error);
+       setToast({
+         type: TOAST_TYPE.ERROR,
+         title: "Error!",
+         message: "Something went wrong. Please try again later.",
+       });
+     });
  };

Also applies to: 118-128

🧹 Nitpick comments (1)
apps/web/core/components/navigation/use-tab-preferences.ts (1)

79-79: Optional: Remove unnecessary explicit return.

The explicit return statement doesn't affect control flow or behavior here, as it's the last statement in the .then() callback and the returned value is unused.

🔎 Proposed simplification
        setToast({
          type: TOAST_TYPE.SUCCESS,
          title: "Success!",
          message: "Default tab updated successfully.",
        });
-       return;
      })
📜 Review details

Configuration used: defaults

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between d3a50b7 and 2ce67a1.

📒 Files selected for processing (3)
  • apps/web/core/components/navigation/use-tab-preferences.ts
  • packages/types/src/project/projects.ts
  • packages/types/src/view-props.ts
💤 Files with no reviewable changes (1)
  • packages/types/src/project/projects.ts
🧰 Additional context used
📓 Path-based instructions (4)
**/*.{ts,tsx,mts,cts}

📄 CodeRabbit inference engine (.github/instructions/typescript.instructions.md)

**/*.{ts,tsx,mts,cts}: Use const type parameters for more precise literal inference in TypeScript 5.0+
Use the satisfies operator to validate types without widening them
Leverage inferred type predicates to reduce the need for explicit is return types in filter/check functions
Use NoInfer<T> utility to block inference for specific type arguments when they should be determined by other arguments
Utilize narrowing in switch(true) blocks for control flow analysis (TypeScript 5.3+)
Rely on narrowing from direct boolean comparisons for type guards
Trust preserved narrowing in closures when variables aren't modified after the check (TypeScript 5.4+)
Use constant indices to narrow object/array properties (TypeScript 5.5+)
Use standard ECMAScript decorators (Stage 3) instead of legacy experimentalDecorators
Use using declarations for explicit resource management with Disposable pattern instead of manual cleanup (TypeScript 5.2+)
Use with { type: "json" } for import attributes; avoid deprecated assert syntax (TypeScript 5.3/5.8+)
Use import type explicitly when importing types to ensure they are erased during compilation, respecting verbatimModuleSyntax flag
Use .ts, .mts, .cts extensions in import type statements (TypeScript 5.2+)
Use import type { Type } from "mod" with { "resolution-mode": "import" } for specific module resolution contexts (TypeScript 5.3+)
Use new iterator methods (map, filter, etc.) if targeting modern environments (TypeScript 5.6+)
Utilize new Set methods like union, intersection, etc., when available (TypeScript 5.5+)
Use Object.groupBy / Map.groupBy standard methods for grouping instead of external libraries (TypeScript 5.4+)
Use Promise.withResolvers() for creating promises with exposed resolve/reject functions (TypeScript 5.7+)
Use copying array methods (toSorted, toSpliced, with) for immutable array operations (TypeScript 5.2+)
Avoid accessing instance fields via super in classes (TypeScript 5....

Files:

  • packages/types/src/view-props.ts
  • apps/web/core/components/navigation/use-tab-preferences.ts
**/*.{ts,tsx}

📄 CodeRabbit inference engine (AGENTS.md)

Enable TypeScript strict mode and ensure all files are fully typed

Files:

  • packages/types/src/view-props.ts
  • apps/web/core/components/navigation/use-tab-preferences.ts
**/*.{js,jsx,ts,tsx,json,css}

📄 CodeRabbit inference engine (AGENTS.md)

Use Prettier with Tailwind plugin for code formatting, run pnpm fix:format

Files:

  • packages/types/src/view-props.ts
  • apps/web/core/components/navigation/use-tab-preferences.ts
**/*.{js,jsx,ts,tsx}

📄 CodeRabbit inference engine (AGENTS.md)

**/*.{js,jsx,ts,tsx}: Use ESLint with shared config across packages, adhering to max warnings limits per package
Use camelCase for variable and function names, PascalCase for components and types
Use try-catch with proper error types and log errors appropriately

Files:

  • packages/types/src/view-props.ts
  • apps/web/core/components/navigation/use-tab-preferences.ts
🧠 Learnings (1)
📓 Common learnings
Learnt from: NarayanBavisetti
Repo: makeplane/plane PR: 7460
File: apps/api/plane/app/serializers/draft.py:112-122
Timestamp: 2025-07-23T18:18:06.875Z
Learning: In the Plane codebase serializers, workspace_id is not consistently passed in serializer context, so parent issue validation in DraftIssueCreateSerializer only checks project_id rather than both workspace_id and project_id. The existing project member authentication system already validates that users can only access projects they belong to, providing sufficient security without risking breaking functionality by adding workspace_id validation where the context might not be available.
🧬 Code graph analysis (2)
packages/types/src/view-props.ts (1)
packages/types/src/project/projects.ts (1)
  • IProjectMemberNavigationPreferences (108-111)
apps/web/core/components/navigation/use-tab-preferences.ts (3)
apps/web/core/services/project/project.service.ts (2)
  • getProjectUserProperties (95-101)
  • updateProjectUserProperties (103-113)
apps/web/core/components/navigation/tab-navigation-utils.ts (2)
  • DEFAULT_TAB_KEY (9-9)
  • TTabPreferences (2-5)
apps/space/core/store/publish/publish.store.ts (1)
  • workspaceSlug (93-95)
⏰ 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). (2)
  • GitHub Check: Build packages
  • GitHub Check: Analyze (javascript)
🔇 Additional comments (5)
apps/web/core/components/navigation/use-tab-preferences.ts (3)

26-26: LGTM! Store access correctly refactored.

The migration from project member preferences to project user properties is well-executed. The nested structure (preferences.navigation.default_tab and preferences.navigation.hide_in_more_menu) aligns with the new data model described in the PR objectives.

Also applies to: 36-38


43-46: LGTM! Improved memoization.

The dependency array now tracks the specific derived values (defaultTab, hideInMoreMenu) rather than the entire storePreferences object, preventing unnecessary recomputations when unrelated preferences change.


54-62: LGTM! Correct update structure.

The update payload correctly spreads existing preferences before setting the navigation sub-object, ensuring other preference fields aren't inadvertently cleared. The structure aligns with the new ProjectUserProperty model.

packages/types/src/view-props.ts (2)

1-1: LGTM: Correct use of type-only import.

The import uses import type as recommended for type-only imports that are erased during compilation.


198-206: The preferences field structure correctly matches the backend ProjectUserPropertySerializer. The IProjectMemberNavigationPreferences type includes default_tab (string) and hide_in_more_menu (string[]), which aligns with the default structure returned by get_default_preferences(). No type mismatches exist.

dheeru0198
dheeru0198 previously approved these changes Jan 6, 2026
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
apps/web/core/components/navigation/use-tab-preferences.ts (2)

93-108: Unhandled Promise rejection: missing await or .catch().

The try-catch block won't catch errors from updatePreferences() because it's an async function returning a Promise. Without await, any rejection becomes an unhandled Promise rejection and the error toast will never display.

This is inconsistent with handleToggleDefaultTab which correctly uses .then()/.catch().

🔎 Proposed fix using async/await
-  const handleHideTab = (tabKey: string) => {
+  const handleHideTab = async (tabKey: string) => {
     const newPreferences = {
       ...tabPreferences,
       hiddenTabs: [...tabPreferences.hiddenTabs, tabKey],
     };
     try {
-      updatePreferences(newPreferences);
+      await updatePreferences(newPreferences);
     } catch (error) {
       console.error("Error hiding tab:", error);
       setToast({
         type: TOAST_TYPE.ERROR,
         title: "Error!",
         message: "Failed to hide tab. Please try again later.",
       });
     }
   };

113-128: Same issue: unhandled Promise rejection.

Same problem as handleHideTab — the try-catch won't catch the Promise rejection from updatePreferences().

🔎 Proposed fix using async/await
-  const handleShowTab = (tabKey: string) => {
+  const handleShowTab = async (tabKey: string) => {
     const newPreferences = {
       ...tabPreferences,
       hiddenTabs: tabPreferences.hiddenTabs.filter((key) => key !== tabKey),
     };
     try {
-      updatePreferences(newPreferences);
+      await updatePreferences(newPreferences);
     } catch (error) {
       console.error("Error showing tab:", error);
       setToast({
         type: TOAST_TYPE.ERROR,
         title: "Error!",
         message: "Something went wrong. Please try again later.",
       });
     }
   };
📜 Review details

Configuration used: defaults

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 2ce67a1 and ffb017f.

📒 Files selected for processing (1)
  • apps/web/core/components/navigation/use-tab-preferences.ts
🧰 Additional context used
📓 Path-based instructions (4)
**/*.{ts,tsx,mts,cts}

📄 CodeRabbit inference engine (.github/instructions/typescript.instructions.md)

**/*.{ts,tsx,mts,cts}: Use const type parameters for more precise literal inference in TypeScript 5.0+
Use the satisfies operator to validate types without widening them
Leverage inferred type predicates to reduce the need for explicit is return types in filter/check functions
Use NoInfer<T> utility to block inference for specific type arguments when they should be determined by other arguments
Utilize narrowing in switch(true) blocks for control flow analysis (TypeScript 5.3+)
Rely on narrowing from direct boolean comparisons for type guards
Trust preserved narrowing in closures when variables aren't modified after the check (TypeScript 5.4+)
Use constant indices to narrow object/array properties (TypeScript 5.5+)
Use standard ECMAScript decorators (Stage 3) instead of legacy experimentalDecorators
Use using declarations for explicit resource management with Disposable pattern instead of manual cleanup (TypeScript 5.2+)
Use with { type: "json" } for import attributes; avoid deprecated assert syntax (TypeScript 5.3/5.8+)
Use import type explicitly when importing types to ensure they are erased during compilation, respecting verbatimModuleSyntax flag
Use .ts, .mts, .cts extensions in import type statements (TypeScript 5.2+)
Use import type { Type } from "mod" with { "resolution-mode": "import" } for specific module resolution contexts (TypeScript 5.3+)
Use new iterator methods (map, filter, etc.) if targeting modern environments (TypeScript 5.6+)
Utilize new Set methods like union, intersection, etc., when available (TypeScript 5.5+)
Use Object.groupBy / Map.groupBy standard methods for grouping instead of external libraries (TypeScript 5.4+)
Use Promise.withResolvers() for creating promises with exposed resolve/reject functions (TypeScript 5.7+)
Use copying array methods (toSorted, toSpliced, with) for immutable array operations (TypeScript 5.2+)
Avoid accessing instance fields via super in classes (TypeScript 5....

Files:

  • apps/web/core/components/navigation/use-tab-preferences.ts
**/*.{ts,tsx}

📄 CodeRabbit inference engine (AGENTS.md)

Enable TypeScript strict mode and ensure all files are fully typed

Files:

  • apps/web/core/components/navigation/use-tab-preferences.ts
**/*.{js,jsx,ts,tsx,json,css}

📄 CodeRabbit inference engine (AGENTS.md)

Use Prettier with Tailwind plugin for code formatting, run pnpm fix:format

Files:

  • apps/web/core/components/navigation/use-tab-preferences.ts
**/*.{js,jsx,ts,tsx}

📄 CodeRabbit inference engine (AGENTS.md)

**/*.{js,jsx,ts,tsx}: Use ESLint with shared config across packages, adhering to max warnings limits per package
Use camelCase for variable and function names, PascalCase for components and types
Use try-catch with proper error types and log errors appropriately

Files:

  • apps/web/core/components/navigation/use-tab-preferences.ts
🧠 Learnings (1)
📓 Common learnings
Learnt from: NarayanBavisetti
Repo: makeplane/plane PR: 7460
File: apps/api/plane/app/serializers/draft.py:112-122
Timestamp: 2025-07-23T18:18:06.875Z
Learning: In the Plane codebase serializers, workspace_id is not consistently passed in serializer context, so parent issue validation in DraftIssueCreateSerializer only checks project_id rather than both workspace_id and project_id. The existing project member authentication system already validates that users can only access projects they belong to, providing sufficient security without risking breaking functionality by adding workspace_id validation where the context might not be available.
🧬 Code graph analysis (1)
apps/web/core/components/navigation/use-tab-preferences.ts (3)
apps/web/core/services/project/project.service.ts (2)
  • getProjectUserProperties (95-101)
  • updateProjectUserProperties (103-113)
apps/web/core/components/navigation/tab-navigation-utils.ts (2)
  • DEFAULT_TAB_KEY (9-9)
  • TTabPreferences (2-5)
apps/space/core/store/publish/publish.store.ts (1)
  • workspaceSlug (93-95)
⏰ 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). (3)
  • GitHub Check: check:types
  • GitHub Check: check:lint
  • GitHub Check: Analyze (javascript)
🔇 Additional comments (4)
apps/web/core/components/navigation/use-tab-preferences.ts (4)

24-38: LGTM!

The store access changes align well with the backend refactoring from IssueUserProperty to ProjectUserProperty. The nested navigation preferences structure matches the expected API contract, and the fallback values are appropriate.


40-48: LGTM!

The memoization dependencies are correct, and the loading state logic properly handles the case where preferences haven't been fetched yet.


53-63: LGTM!

The nested preferences structure correctly matches the expected API contract. Preserving existing pages preferences with a fallback prevents unintentional data loss.


69-88: LGTM!

The async error handling with .then()/.catch() is correct. The return; on line 79 is unnecessary but harmless.

@sriramveeraghanta sriramveeraghanta merged commit ea1f92e into preview Jan 6, 2026
10 checks passed
@sriramveeraghanta sriramveeraghanta deleted the chore-user-property-migrations branch January 6, 2026 10:07
tant added a commit to tant/plane that referenced this pull request Jan 11, 2026
KooshaPari added a commit to KooshaPari/Planify that referenced this pull request Mar 29, 2026
)

* [PAI-963] feat: enhance CustomSelect component with context for dropdown management (makeplane#8202)

* feat: enhance CustomSelect component with context for dropdown management

* refactor: streamline CustomSelect component structure and improve dropdown options rendering

* [WEB-5603] feat: enhance workspace settings layout and members page (makeplane#8266)

* feat: enhance workspace settings layout and members page with new components

* refactor: update workspace settings layout and members page to use default exports

* refactor: settings layout import changes

* refactor: simplify workspaceSlug usage in settings layout

* [WEB-5592] chore: add static files update settings for static files support (makeplane#8251)

* chore: add static files collection and update settings for static files support

* chore: add WhiteNoise middleware for static file handling

* chore(deps): upgrade WhiteNoise to version 6.11.0 and add static file reverse proxy in Caddyfile

* [WEB-5256]chore: quick actions refactor (makeplane#8019)

* chore: quick actions refactor

* chore: lint fix

* chore: unified factory for actions

* chore: lint fix

* * chore: removed redundant files
* chore: updated imports

* chore: updated interfaces to types

* chore: updated undefined handling

* [WIKI-829] fix: add option to only show placeholder on empty editor (makeplane#8232)

* feat: add placeholderOnEmpty functionality to editor components

* Update packages/editor/src/core/extensions/placeholder.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* refactor: rename placeholderOnEmpty to showPlaceholderOnEmpty across editor components

* chore : make optional

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* [WIKI-830] fix: copy clipboard functionality in the editor (makeplane#8229)

* feat: enhance clipboard functionality for markdown and HTML content

* fix: improve error handling and state management in CustomImageNodeView component

* fix: correct asset retrieval query by removing workspace filter in DuplicateAssetEndpoint

* fix: update meta tag creation in PasteAssetPlugin for clipboard HTML content

* feat: implement copyMarkdownToClipboard utility for enhanced clipboard functionality

* refactor: replace copyMarkdownToClipboard utility with copyTextToClipboard for simplified clipboard operations

* refactor: streamline clipboard operations by replacing copyTextToClipboard with copyMarkdownToClipboard in editor components

* refactor: simplify PasteAssetPlugin by removing unnecessary meta tag handling and streamlining HTML processing

* feat: implement asset duplication processing on paste for enhanced clipboard functionality

* chore:remove async from copy markdown method

* chore: add paste html

* remove:prevent default

* refactor: remove hasChanges from processAssetDuplication return type for simplified asset processing

* fix: format options-dropdown.tsx

* feat: add timezone selection to workspace settings (makeplane#8248)

* feat: add timezone selection to workspace onboarding, creation and settings

* refactor: remove timezone selection from workspace creation and onboarding forms

* [WEB-5285] feat: enhance ChangeTrackerMixin to capture changed fields on save (makeplane#8270)

- Added an override for the save method in ChangeTrackerMixin to store changed fields before resetting tracking.
- Implemented a new method, _reset_tracked_fields, to ensure subsequent saves detect changes relative to the last saved state.
- Updated IssueComment to utilize _changes_on_save for determining changed fields, improving accuracy in tracking modifications.

* [WEB-5585]chore: timeline chart refactor (makeplane#8246)

* chore: timeline chart refactor

* fix: format

* [WEB-5575]feat: enhance APITokenLogMiddleware to support logging to MongoDB (makeplane#8241)

* feat: enhance APITokenLogMiddleware to support logging to MongoDB

- Added functionality to log external API requests to MongoDB, with a fallback to PostgreSQL if MongoDB is unavailable.
- Implemented error handling for MongoDB connection and logging operations.
- Introduced additional fields for MongoDB logs, including timestamps and user identifiers.
- Refactored request logging logic to streamline the process and improve maintainability.

* fix: improve MongoDB availability checks in APITokenLogMiddleware

- Enhanced the logic for determining MongoDB availability by checking if the collection is not None.
- Added a check for MongoDB configuration before attempting to retrieve the collection.
- Updated error handling to ensure the middleware correctly reflects the state of MongoDB connectivity.

* feat: implement logging functionality in logger_task for API activity

- Added a new logger_task module to handle logging of API activity to MongoDB and PostgreSQL.
- Introduced functions for safely decoding request/response bodies and processing logs based on MongoDB availability.
- Refactored APITokenLogMiddleware to utilize the new logging functions, improving code organization and maintainability.

* refactor: simplify MongoDB logging in logger_task and middleware

- Removed direct dependency on MongoDB collection in log_to_mongo function, now retrieving it internally.
- Updated process_logs to check MongoDB configuration before logging, enhancing error handling.
- Cleaned up logger.py by removing unused imports related to MongoDB.

* feat: add Celery task decorator to process_logs function in logger_task

- Introduced the @shared_task decorator to the process_logs function, enabling asynchronous processing of log data.
- Updated function signature to include a return type of None for clarity.

* [WEB-5609] fix: extended sidebar item pin/unpin makeplane#8287

* [WEB-5608] chore: Hide "Pro" Features in Community Edition (makeplane#8288)

* chore: Hide "Pro" Features in Community Edition

* refactor: remove time tracking feature and simplify project features list

* chore: moving star us button to the top navigation (makeplane#8289)

* chore: optimize turborepo (makeplane#8286)

* [WIKI-844] fix: realtime sync post vite migration with title editor sync and indexed db access (makeplane#8294)

* fix: robust way to handle socket connection and read from indexeddb cache when reqd

* fix: realtime sync working with failure handling

* fix: title editor added

* merge preview into fix/realtime-sync

* check

* page renderer props

* lint errors

* lint errors

* lint errors

* sanitize html

* sanitize html

* format fix

* fix lint

* [WEB-4440] fix: duplicate sequence when creating multiple workitems in rapid succession (makeplane#8298)

- Replace advisory lock with transaction-level lock in Issue model save method
- Updated the save method in the Issue model to use a transaction-level advisory lock for better concurrency control.
- Simplified the locking mechanism by removing the explicit unlock step, as the lock is automatically released at the end of the transaction.
- Maintained existing functionality for sequence and sort order management while improving code clarity.

* chore: format files in API server (makeplane#8292)

* chore: fix ruff checks (makeplane#8305)

* fix: editor sync changes (makeplane#8306)

* chore: upate function declarations

* chore: formatted files

* chore: fix/check tooling improvements with turbo (makeplane#8304)

* fix: broken lock file

* chore: add Plane sync label to github templates makeplane#8303

Co-authored-by: Pushya Mitra Thiruvooru <pushya@Pushyas-MacBook-Pro.local>

* [WEB-5624] chore: added webhook translations makeplane#8312

* chore(deps): upgrade next themes package

* [WEB-5654]fix: custom select selection and dropdown close makeplane#8324

* [WEB-5124] chore: intake work item toast enhancements (makeplane#8329)

* [WEB-5647] chore: list layout work item identifier enhancements (makeplane#8326)

* chore: file formating

* [WEB-5650] feat: Enable Gitea OAuth configuration  (makeplane#8325)

* feat: implement OAuth configuration helper and integrate into auth forms

* fix: ensure OAuth providers are disabled by default if not configured

* [WEB-5602] feat: new design system (makeplane#8220)

* chore: init tailwind v4

* chore: update all configs

* chore: add source to parse monorepo packages

* chore: combine all css files

* feat: added extended colors

* chore: update typography

* chore: update extended color var names

* refactor: remove initial spacing variable and update dark mode selector

* chore: update css files

* chore: update animations

* chore: remove spacing tokens

* fix: external css files

* chore: update tailwind-merge version

* chore: update font family

* chore: added brief agents.md and story for new design system

* chore: enhance design system documentation with rare exceptions for visual separation

* chore: add fontsource package for typography

* chore: material symbols font added

* chore: update shadow default

* chore: add stroke and outline theme vars

* chore: update ring and fill colors

* chore: overwrite tailwind typography tokens

* chore: add high contrast mode tokens

* chore: update scrollbar colors

* chore: backward compatibility for buttons and placeholders

* chore: add priority colors

* chore: update urgent priority color

* chore: update plan colors

* chore: add missing utility class

* chore: update height and padding classes

* chore: update label colors

* chore: add missing utlity

* chore: add typography plugin to space app

* chore: replace existing classNames with new design system tokens makeplane#8244 (makeplane#8278)

* chore: update border colors

* chore: update all borders

* chore: update text colors

* chore: update css variables

* chore: update font sizes and weights

* chore: update bg colors

* chore: sync changes

* fix: uncomment spacing-1200 variable in variables.css

* chore: update primary colors

* refactor: updated border to border-subtle

* refactor: update various components and improve UI consistency across the application

* updated classnames

* updated classnames

* refactor: update color-related class names to use new design system variables for consistency

* chore: default automations

* chore: update text sizes

* chore: home and power k

* chore: home and power k

* chore: replace ui package button components

* chore: update text sizes

* chore: updated issue identifier (makeplane#8275)

* refactor: top navigation and sidebar design token (makeplane#8276)

* chore: update all button components (makeplane#8277)

* chore: new button component

* chore: update existing buttons

* chore: overwrite tailwind typography tokens

* fix: twMerge config + fixed cn instances

* refactor: toast design token updated (makeplane#8279)

* chore: update existing buttons

* chore: tooltip design token updatged (makeplane#8280)

* chore: moved cn utility to propel (makeplane#8281)

* chore: update space app UI (makeplane#8285)

* chore; update space app filters component

* fix: button whitespace wrap

* chore: space app votes

* chore: update dropdown components

* refactor: auth, onboarding, sidebar, and common component design token migration (makeplane#8291)

* chore: checkbox component design token updated

* chore: indicator and oauth component design token updated

* chore: sidebar design token updated

* chore: auth and onboarding design token updated

* chore: update divider color

* style: update background colors and hover effects across list components

* fix: tailwind merge

* refactor: toggle switch design token migration and header utility classname added (makeplane#8295)

* chore: toggle component design token updated

* chore: h-header utility class added

* chore: updated color tokens for work item detail page (makeplane#8296)

* chore: update react-day-picker UI

* refactor: update button sizes and styles in filters components

* refactor: breadcrumbs design token updated (makeplane#8297)

* chore: update priority icon colors

* refactor: updated layout variables

* chore: update plan card primary CTA

* Chore update editor design system (makeplane#8299)

* refactor: update styles for callout, color selector, logo selector, and image uploader

* refactor:fix image

* chore: update settings UI

* chore: updated notifications color and size tokens (makeplane#8302)

* chore: update sm button border radius

* fix: logo renderer

* chore: icon button component

* chore: remove deprecated classes

* chore: remove deprecated classes

* chore: update editor list spacing

* fix: icon button size

* chore: improvements (makeplane#8309)

* chore: update cycles and modules pages

* refactor: update background styles across various components to use new design system colors

* fix: button type errors

* chore: update modals design system (makeplane#8310)

* refactor: callout bg

* refactor: code  bg

* refactor: modal size and variant

---------

Co-authored-by: Aaryan Khandelwal <aaryankhandu123@gmail.com>

* chore: update next-themes

* design: update billing and plans component styles and remove unused utility functions (makeplane#8313)

* refactor: empty state design token migration and improvements (makeplane#8315)

* fix: profile page

* refactor: tabs design token updated (makeplane#8316)

* chore: updated buttons and tokens for work items (makeplane#8317)

* fix: adjust trial button spacing in checkout modal

* chore: update add button hover state

* fix: type error (makeplane#8318)

* fix: type error

* chore: code refactor

* refactor: update button sizes and background styles in rich filters components

* refactor: update editor bg

* refactor: enhance Gantt chart sidebar functionality and styling

- Removed unused  prop from .
- Updated  to include new props for better block management and scrolling behavior.
- Improved auto-scroll functionality for Gantt chart items.
- Adjusted styles in  component for consistent design.

* regression: gantt design

* chore: new badge component

* fix: favorite star

* chore: update backgroung, typography and button sizes across workspace settings general and members pages

* fix: header button sizes

* fix: emoji icon logo (makeplane#8323)

* more fixes

* chore: update settings sidebar

* refactor: avatar component

* chore: updated work item detail sidebar (makeplane#8327)

* refactor: update link preview

* fix: work item property dropdowns

* fix: dropdown buttons border radius

* chore: update power k translation

* chore: updated profile activity design (makeplane#8328)

* chore: update settings pages

* chore: update work item sidebar alignments (makeplane#8330)

* refactor: admin design system

* chore: update page header

---------

Co-authored-by: Jayash Tripathy <76092296+JayashTripathy@users.noreply.github.com>
Co-authored-by: VipinDevelops <vipinchaudhary1809@gmail.com>
Co-authored-by: Vamsi Krishna <46787868+vamsikrishnamathala@users.noreply.github.com>
Co-authored-by: Anmol Singh Bhatia <121005188+anmolsinghbhatia@users.noreply.github.com>
Co-authored-by: gakshita <akshitagoyal1516@gmail.com>
Co-authored-by: Palanikannan M <akashmalinimurugu@gmail.com>
Co-authored-by: Prateek Shourya <prateekshourya29@gmail.com>
Co-authored-by: b-saikrishnakanth <bsaikrishnakanth97@gmail.com>
Co-authored-by: M. Palanikannan <73993394+Palanikannan1437@users.noreply.github.com>

* fix: formatting

* reexport types

* fix: lint error

---------

Co-authored-by: Jayash Tripathy <76092296+JayashTripathy@users.noreply.github.com>
Co-authored-by: VipinDevelops <vipinchaudhary1809@gmail.com>
Co-authored-by: Vamsi Krishna <46787868+vamsikrishnamathala@users.noreply.github.com>
Co-authored-by: Anmol Singh Bhatia <121005188+anmolsinghbhatia@users.noreply.github.com>
Co-authored-by: gakshita <akshitagoyal1516@gmail.com>
Co-authored-by: Palanikannan M <akashmalinimurugu@gmail.com>
Co-authored-by: Prateek Shourya <prateekshourya29@gmail.com>
Co-authored-by: b-saikrishnakanth <bsaikrishnakanth97@gmail.com>
Co-authored-by: M. Palanikannan <73993394+Palanikannan1437@users.noreply.github.com>

* [WEB-5668] fix: add fetchWorkspaceLevelProjectEntities method and update project-related fetch keys (makeplane#8347)

* [SILO-783] feat: added porters and new serializer based exporter (makeplane#8335)

* [WEB-5699] refactor: update styling and classnames of charts according to new design system (makeplane#8345)

* refactor: update styling and class names according to new design system in charts

* refactor: clean up

* feat: custom theming enhancements (makeplane#8342)

* [WEB-5671] chore: settings workspace members enhancements makeplane#8346

* [WEB-5666] chore: set project timezone same as workspace timezone in project (makeplane#8340)

* [WEB-5614] fix: new design system consistency (makeplane#8351)

* chore: tooltip enhancements

* chore: project card enhancements

* chore: work item card enhancements

* chore: update component styles and class names for consistency across the application

---------

Co-authored-by: Anmol Singh Bhatia <anmolsinghbhatia@plane.so>

* [WEB-5708] regression: remove material icon instances from the Space app (makeplane#8353)

* chore: sync changes (makeplane#8343)

* [WEB-5614] chore: work item detail and list layout enhancements makeplane#8355

* regression: replace old css vars with the new design system tokens (makeplane#8354)

* chore: replace old css vars

* fix: replace shadow and primary colors

* chore: remove hardcoded colors

* [WEB-5614] chore: custom theme on colour improvement makeplane#8356

* [WEB-5732] style: update work item detail properties UI (makeplane#8357)

* [WEB-5730] fix: user mention colors makeplane#8358

* [WEB-5614] fix: empty state and padding token fixes (makeplane#8359)

* [WEB-5614] chore: update component styles and class names for consistency across projects makeplane#8360

* [WEB-5614] chore: logo and icon enhancements makeplane#8362

* fix: work item property icon renderer (makeplane#8363)

* [WEB-5614] fix: sidebar and label dropdown makeplane#8364

* fix: material icons font file (makeplane#8366)

* [WEB-5614] chore: lucide icon code refactor makeplane#8365

* fix: nested context menu UI (makeplane#8367)

* [WEB-5708] style: space app kanban card UI (makeplane#8368)

* [WEB-5742] fix: input field background makeplane#8369

* [WEB-5641] chore: sub work item quick menu padding makeplane#8370

* chore: replace old classNames (makeplane#8372)

* chore: update component styles and class names for consistency across the application (makeplane#8376)

* [WEB-5660] [WEB-5737] fix: cycle and module sidebar makeplane#8375

* [WEB-5676] style: gantt column outline makeplane#8374

* [WEB-5614] chore: platform design token enhancements (makeplane#8373)

* [WEB-5649] [WEB-5675] fix: local font files makeplane#8377

* [WEB-5614] chore: primitive token updated (makeplane#8378)

* fix: tooltip imports (makeplane#8379)

* [WEB-5614] chore: platform header and breadcrumb enhancements (makeplane#8383)

* [WEB-5652] fix: kanban quick add UI makeplane#8382

* [WEB-5726] fix: showing an empty state on deleted work item link makeplane#8381

* fix: space app default background (makeplane#8384)

* [WIKI-849] feat: debounce for mention search (makeplane#8380)

* fix: font imports (makeplane#8387)

* chore: platform layout enhancements (makeplane#8386)

* fix: image uploader bg in light mode (makeplane#8385)

* [WEB-5614] refactor: update styling and structure across various components (makeplane#8388)

* fix: input fields bg (makeplane#8389)

* fix: custom z-index classNames (makeplane#8395)

* [WEB-5454] fix: optimize date validation logic in CycleCreateUpdateModal makeplane#8394

* [WEB-5614] chore: work item detail comment and sidebar enhancements (makeplane#8397)

* [WEB-5675] chore: implement `fontsource` as the fonts library (makeplane#8398)

* [WEB-5762] fix: workitem detail sidebar properties design consistency (makeplane#8400)

* [WEB-5761]fix: intake spacing issue (makeplane#8399)

* [WEB-5614] chore: sidebar enhancement makeplane#8401

* [WEB-5768]chore: updated comment UI makeplane#8402

* [WEB-5614] chore: package and layout enhancements makeplane#8403

* chore: update storybook dependency

* [WEB-5657] feat: add synchronization configuration for multiple providers in authentication adapter  (makeplane#8336)

* feat: add sync functionality for OAuth providers

- Implemented `check_sync_enabled` method to verify if sync is enabled for Google, GitHub, GitLab, and Gitea.
- Added `sync_user_data` method to update user details, including first name, last name, display name, and avatar.
- Updated configuration variables to include sync options for each provider.
- Integrated sync check into the login/signup process.

* feat: add sync toggle for OAuth providers in configuration forms

* fix: remove default value for sync options in OAuth configuration forms

* chore: delete old avatar and upload a new one

* chore: update class method

* chore: add email nullable

* refactor: streamline sync check for multiple providers and improve avatar deletion logic

* fix: ensure ENABLE_SYNC configurations default to "0" for Gitea, Github, Gitlab, and Google forms

* fix: simplify toggle switch value handling in ControllerSwitch component

---------

Co-authored-by: b-saikrishnakanth <bsaikrishnakanth97@gmail.com>

* [WEB-5657] chore: synchronization configuration for multiple providers in authentication adapter makeplane#8409

* [WEB-5746]fix: workspace member modal z-index makeplane#8410

* [WEB-5773] fix: editor image full screen modal (makeplane#8413)

* [WEB-5774] fix: editor nodes background colors (makeplane#8416)

* [WEB-5776]chore: updated design system for alert modal makeplane#8415

* [WEB-5775] fix: mentions search on empty query makeplane#8417

* [WEB-5662][WEB-5770] fix: alignment of cycles in sidebar and layout selection dropdown button (makeplane#8414)

* fix: alpha colors (makeplane#8418)

* [WEB-5784] fix: truncation issue in wi properties (makeplane#8422)

* fix: update background surface 2 variables in tailwind config

* fix: improve layout and truncation handling in issue link and list items

* docs: update readme with react router badge (makeplane#8424)

Updated feature list and modified the local development section.

* [WEB-5788] fix: board layout group by icon makeplane#8426

* [WEB-5792] regression: editor font family makeplane#8427

* [WIKI-740] refactor: editor table performance (makeplane#8411)

* [WEB-5786] fix: updated font size for dates at Kanban card makeplane#8429

* [WEB-5772] fix: theme switch flicker (makeplane#8428)

* [WEB-5784] fix: truncation of links in work items (makeplane#8430)

* [WEB-5772] chore: theme switcher and editor colors enhancements (makeplane#8436)

* [WEB-5772] chore: theme switcher code refactor makeplane#8438

* chore: workspace events (makeplane#8439)

* chore: adding invite and joined events

* chore: adding workspace create and update events

* [WEB-5798] refactor: web and admin auth related components and update admin designs (makeplane#8431)

* refactor: web and admin auth related components and update admin designs.

* fix: format

* [WEB-5581] fix: resolve logo spinner hydration and theme loading issues (makeplane#8450)

- Fix hydration mismatch by lazy loading components that depend on theme
- Ensure LogoSpinner renders with correct theme on initial load

* [WEB-5791] fix: broken favicon in links (makeplane#8396)

* fix: using base url of a redirect url

* chore: internal networks check for the final_url

* fix: none final_url

* fix: exception handling

* fix: exception handling

* chore: remove unused imports

* refactor: moved ip address check logic into separate function

* fix: ValueError logic

* [WEB-5667] fix: estimate value display in analytics makeplane#8448

* [WEB-5779] fix: handle loading state while fetching project cover image (makeplane#8419)

* refactor: replace cover image handling with CoverImage component across profile and project forms

* fix: extend CoverImage component to accept additional img props

* Update apps/web/core/components/common/cover-image.tsx

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* fix: handle undefined cover image URL in ProfileSidebar component

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* [WEB-5782]chore: migrated modals to @plane/ui (makeplane#8420)

* chore: migrated modal to @plane/ui

* chore: fixed spacings

* [WEB-5808] chore: sidebar project list enhancements (makeplane#8451)

* chore: sidebar project list enhancements

* chore: code refactor

* chore: code refactor

* [WEB-5324] refactor: add Unified OAuth Configuration and Missing Gitea Options (makeplane#8050)

* refactor: add Unified OAuth Configuration and Missing Gitea Options

- Replaced the AuthenticationModes component with a more streamlined implementation using AuthenticationMethodCard.
- Removed obsolete authentication modes files from the codebase.
- Enhanced the AuthRoot component to utilize the new OAuth configuration hook for better management of authentication options.
- Updated type definitions for instance authentication modes to reflect the new structure.

* refactor: update OAuth type imports and remove obsolete types

- Replaced local type imports with centralized imports from @plane/types in core, extended, and index OAuth hooks.
- Removed the now redundant types.ts file as its definitions have been migrated.
- Enhanced type definitions for OAuth options to improve consistency across the application.

* feat: add new Gitea logo and update OAuth icon imports to use standard HTML img tags

* chore: remove unused authentication logos and upgrade button component

* [WEB-5574]chore: notification card refactor (makeplane#8234)

* chore: notification card refactor

* chore: moved base activity types to constants package

* [WEB-5804] refactor: decouple filter value types from filter configurations (makeplane#8441)

* [WEB-5804] refactor: decouple filter value types from filter configurations

Remove value type constraints from filter configurations to support
operator-specific value types. Different operators can accept different
value types for the same filter property, so value types should be
determined at the operator level rather than the filter level.

- Remove generic value type parameter from TFilterConfig
- Update TOperatorConfigMap to accept union of all value types
- Simplify filter config factory signatures across all filter types
- Add forceUpdate parameter to updateConditionValue method

* refactor: remove filter value type constraints from filter configurations

Eliminate the generic value type parameter from filter configurations to allow for operator-specific value types. This change enhances flexibility by enabling different operators to accept various value types for the same filter property.

- Updated TFilterConfig and related interfaces to remove value type constraints
- Adjusted filter configuration methods and types accordingly
- Refactored date operator support to align with the new structure

* [WEB-5785]fix: favorites icon size makeplane#8449

* [WEB-5781]chore: removed info banner for preferences makeplane#8442

* [WEB-5809] refactor: tailwind config inline variables (makeplane#8437)

* refactor: actions icon migration (makeplane#8219)

* chore: gitignore updated

* chore: check icon added to propel package

* feat: search icon migration

* chore: check icon migration

* chore: plus icon added to propel package

* chore: code refactor

* chore: plus icon migration and code refactor

* chore: trash icon added to propel package

* chore: code refactor

* chore: trash icon migration

* chore: edit icon added to propel package

* chore: new tab icon added to propel package

* chore: edit icon migration

* chore: newtab icon migration

* chore: lock icon added to propel package

* chore: lock icon migration

* chore: globe icon added to propel package

* chore: globe icon migration

* chore: copy icon added to propel package

* chore: copy icon migration

* chore: link icon added to propel package

* chore: link icon migration

* chore: link icon migration

* chore: info icon added to propel package

* chore: code refactor

* chore: code refactor

* chore: code refactor

* chore: code refactor

* regression: red and green color backgrounds (makeplane#8456)

* [WEB-5815] chore: removed the deleted states (makeplane#8457)

* Typo: database extension error message (makeplane#8461)

* [WEB-5179] chore: icon utils code refactor makeplane#8458

* [WEB-5790] feat: new email templates (makeplane#8423)

* chore: remove unused get_client_ip import (makeplane#8453)

Remove unused import `get_client_ip` from workspace/invite.py.
Identified by ruff linter (F401 error).

Signed-off-by: majiayu000 <1835304752@qq.com>

* [WEB-5822] fix: migrate ImagePickerPopover to Propel Tabs component and render only enabled tabs makeplane#8290

- Replace custom tab implementation with Propel Tabs
- Dynamically render only enabled tabs based on configuration
- Filter tabs by isEnabled property for cleaner conditional rendering
- Improve tab navigation and accessibility with Propel components

* chore: navigation preference enhancements (makeplane#8468)

* [WEB-5472] refactor: components of project creation flow (makeplane#8462)

* [WEB-857] regression: image uploader error state makeplane#8471

* [WEB-4959]chore: refactor project member page makeplane#8464

* [WEB-5472] refactor: project form makeplane#8472

* migration: added webhook version, navigation related fields and allowed_rate_limit for APIToken (makeplane#8339)

* migration: added version field in webhook

* chore: add max_length

* chore: added product tour fields

* chore: updated the migration file

* chore: removed the duplicated migration file

* chore: added allowed_rate_limit for api_tokens

* chore: changed key feature tour to product tour

* chore: added is_subscribed_to_changelog field

---------

Co-authored-by: NarayanBavisetti <narayan3119@gmail.com>

* fix: correct spelling error in database.ts log message (makeplane#8452)

Fix "convertion" -> "conversion" in error log message.

Signed-off-by: majiayu000 <1835304752@qq.com>

* [WEB-5598] refactor: streamline object creation in workspace seed task and improve error handling in workspace creation makeplane#8264

* chore: remove posthog events (makeplane#8465)

* chore: remove posthog events

* chore: remove event tracking

* chore: lint errors

* chore: minor changes based on comments

* fix: type errors

* Revert "[WEB-4959]chore: refactor project member page makeplane#8464" (makeplane#8476)

This reverts commit c97e418.

* chore: remove unused right sidebar component and clean up workspace member settings (makeplane#8477)

* [WEB-5537]refactor: rename IssueUserProperty to ProjectUserProperty and update related references  (makeplane#8206)

* refactor: rename IssueUserProperty to ProjectUserProperty and update related references across the codebase

* migrate: move issue user properties to project user properties and update related fields and constraints

* refactor: rename IssueUserPropertySerializer and IssueUserDisplayPropertyEndpoint to ProjectUserPropertySerializer and ProjectUserDisplayPropertyEndpoint, updating all related references

* fix: enhance ProjectUserDisplayPropertyEndpoint to handle missing properties by creating new entries and improve response handling

* fix: correct formatting in migration for ProjectUserProperty model options

* migrate: add migration to update existing non-service API tokens to remove workspace association

* migrate: refine migration to update existing non-service API tokens by excluding bot users from workspace removal

* chore: changed the project sort order in project user property

* chore: remove allowed_rate_limit from APIToken

* chore: updated user-properties endpoint for frontend

* chore: removed the extra projectuserproperty

* chore: updated the migration file

* chore: code refactor

* fix: type error

---------

Co-authored-by: NarayanBavisetti <narayan3119@gmail.com>
Co-authored-by: sangeethailango <sangeethailango21@gmail.com>
Co-authored-by: vamsikrishnamathala <matalav55@gmail.com>
Co-authored-by: Anmol Singh Bhatia <anmolsinghbhatia@plane.so>

* [WIKI-826] chore: add unique id as key to logo selector (makeplane#8494)

* [VPAT-50] chore(security): add X-Frame-Options header to nginx configuration to prevent clickjacking attacks (makeplane#8507)

* [VPAT-50] chore(security): add X-Frame-Options header to nginx configuration to prevent clickjacking attacks

* [SECURITY] chore: enhance nginx configuration with additional security headers

* chore: updated migration file name (makeplane#8515)

* chore(deps): react router upgraded

* [WEB-5890] migration: added getting_started_checklist, tips, explored_feature fields on the workspace member table (makeplane#8489)

* migration: added getting_started_checklist and tips field

* fix: remove defaults and added explored_features field

* fix: added user table migration

* [WEB-5907] fix: magic code sign-in at Space app. makeplane#8552

* [WIKI-735] fix: table insert handle z-index makeplane#8545

* [WEB-5898] chore: update tailwind config makeplane#8516

* chore(deps): bump lodash-es in the npm_and_yarn group across 1 directory (makeplane#8573)

Bumps the npm_and_yarn group with 1 update in the / directory: [lodash-es](https://github.com/lodash/lodash).


Updates `lodash-es` from 4.17.21 to 4.17.23
- [Release notes](https://github.com/lodash/lodash/releases)
- [Commits](lodash/lodash@4.17.21...4.17.23)

---
updated-dependencies:
- dependency-name: lodash-es
  dependency-version: 4.17.23
  dependency-type: direct:production
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* [WEB-5845] chore: changing description field to description json (makeplane#8230)

* chore: migrating description to description json

* chore: replace description with description_json

* chore: updated migration file

* chore: updated the migration file

* chore: added description key in external endpoint

* chore: updated the migration file

* chore: updated the typo

---------

Co-authored-by: Aaryan Khandelwal <aaryankhandu123@gmail.com>

* chore: fix typos in comments (makeplane#8553)

* [GIT-61] chore: allow .md files to be uploaded (makeplane#8571)

* chore: allow .md files to be uploaded

* chore: allow .md files to be uploaded

* [WEB-5860] [WEB-5861] [WEB-5862] style: improved settings interface (makeplane#8520)

* style: improved profile settings

* chore: minor improvements

* style: improved workspace settings

* style: workspace settings content

* style: improved project settings

* fix: project settings flat map

* chore: add back navigation from settings pages

* style: settings content

* style: estimates list

* refactor: remove old code

* refactor: removed unnecessary line breaks

* refactor: create a common component for page header

* chore: add fade-in animation to sidebar

* fix: formatting

* fix: project settings sidebar header

* fix: workspace settings sidebar header

* fix: settings content wrapper scroll

* chore: separate project settings features

* fix: formatting

* refactor: custom theme selector

* refactor: settings headings

* refactor: settings headings

* fix: project settings sidebar padding

* fix: sidebar header padding

* fix: sidebar item permissions

* fix: missing editable check

* refactor: remove unused files

* chore: remove unnecessary code

* chore: add missing translations

* fix: formatting

* [GIT-45] fix: allow markdown file attachments (makeplane#8524)

* fix: allow markdown file attachments

- Add text/markdown to ATTACHMENT_MIME_TYPES
- Fixes issue where .md files were rejected with 'Invalid file type' error

* added the support for frontend mime type too

* fix: node view renders (makeplane#8559)

* fix node renders

* fix handlers

* fix: duplicate id

* fix: pdf export (makeplane#8564)

* feat: pdf export

* fix: tests

* fix: tests

---------

Co-authored-by: sriram veeraghanta <veeraghanta.sriram@gmail.com>

* migration: back migrate all product tour fields to set true (makeplane#8575)

* [GIT-66] improvement: prevent disabling last enabled authentication method (makeplane#8570)

* fully translated into Ukrainian language (makeplane#8579)

* chore:  add copyright (makeplane#8584)

* feat: adding new copyright info on all files

* chore: adding CI

* fix: module percentage calculation (makeplane#8595)

* fix: file fomatting

* [SECUR-113] fix: ssrf for work item links (makeplane#8607)

* [SECUR-104] fix: Arbitrary Modification of API Token Rate Limits#8612

* chore(deps): upgrade django version

* [WEB-6058] chore : add logic to handle save#8614

* chore(deps): update the node pacakges

* fix: type fix for description payload (makeplane#8619)

* fix: type fix

* fix: duplicate type fix

* chore(deps): update lodash package

* [WEB-6149] migration: change estimate point key max value to 50 makeplane#8620

* fix: remove ee folder from web (makeplane#8622)

* chore: merge constants and services (makeplane#8623)

* fix: remove constants and services

* fix: formatting

* fix: types check

* chore: merge helpers and layouts (makeplane#8624)

* fix: remove constants and services

* fix: formatting

* chore: merge helpers and layouts

* fix: workspace disbale flag handling

* chore(deps): bump cryptography (makeplane#8625)

Bumps the pip group with 1 update in the /apps/api/requirements directory: [cryptography](https://github.com/pyca/cryptography).


Updates `cryptography` from 44.0.1 to 46.0.5
- [Changelog](https://github.com/pyca/cryptography/blob/main/CHANGELOG.rst)
- [Commits](pyca/cryptography@44.0.1...46.0.5)

---
updated-dependencies:
- dependency-name: cryptography
  dependency-version: 46.0.5
  dependency-type: direct:production
  dependency-group: pip
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* style: update ASCII art in install script header (makeplane#8628)

* [WEB-6038] fix: work item empty title flicker makeplane#8618

* fix: workitem description input inital load (makeplane#8617)

* [WEB-6137] fix: work item peek view outside click makeplane#8610

* [SECUR-105] fix: csv injection vulnerability sanitization makeplane#8611

* [WIKI-877] fix: order of this dropdown options in pages makeplane#8563

* [WEB-5899]fix: project sort order (makeplane#8530)

* fix: project sort order

* chore: updated queryset for sort_order

* chore: admin folder structure (makeplane#8632)

* chore: admin folder structure

* fix: copy right check and formatting

* fix: types

* i18n(ru): expand Russian translation coverage (makeplane#8603)

Added missing translations for:
- Profile preferences (language, timezone settings)
- Account settings sections (preferences, notifications, security, api-tokens, activity)
- Workspace settings (billing, exports, webhooks headings/descriptions)
- Project settings (states, labels, estimates, automations headings/descriptions)
- Power-K command palette (contextual actions, navigation, creation, preferences, help)
- Sidebar elements (stickies, your_work, pin/unpin)
- Common actions (copy_markdown, overview)
- Navigation customization options

* chore(deps): update axios dependency

* [GIT-57 | WEB-5912] fix: app sidebar ux and responsiveness (makeplane#8560)

* fix: project extended sidebar accordion ux

* fix: app sidebar mobile responsiveness ux

* chore: code refactor

* refactor: table drag preview using decorations (makeplane#8597)

* refactor: table drag preview using decorations

* fix: history meta for table drag state

* [WEB-5884] chore: layout loader enhancements makeplane#8500

* [WEB-1201] chore: dropdown options hierarchy improvements (makeplane#8501)

* chore: sortBySelectedFirst and sortByCurrentUserThenSelected utils added

* chore: members dropdown updated

* chore: module dropdown updated

* chore: project and label dropdown updated

* chore: code refactor

* [GIT-44] refactor(auth): add PASSWORD_TOO_WEAK error code (makeplane#8522)

* refactor(auth): add PASSWORD_TOO_WEAK error code and update related error handling in password change flow

* fix(auth): update import to use type for EAuthenticationErrorCodes in security page

* Update apps/web/app/(all)/profile/security/page.tsx

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update apps/web/app/(all)/[workspaceSlug]/(settings)/settings/account/security/page.tsx

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* refactor: updated auth error exception accross zxcvbn usages

* fix: improve error handling for password strength validation and update error messages

* i18n(ru): update Russian translations for stickies and automation description

Added translation for 'stickies' and improved formatting of the automation description in Russian locale.

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update translations.ts: issue-artifacts discoverd (makeplane#7979)

* [WEB-5873] fix: user avatar ui consistency (makeplane#8495)

* fix: user avatar ui consistency

* chore: code refactor

* [SILO-820] fix: update serializer for module detail API endpoint to use ModuleUpdateSerializer (makeplane#8496)

* [VPAT-51] fix: update workspace invitation flow to use token for validation makeplane#8508

- Modified the invite link to include a token for enhanced security.
- Updated the WorkspaceJoinEndpoint to validate the token instead of the email.
- Adjusted the workspace invitation task to generate links with the token.
- Refactored the frontend to handle token in the invitation process.

Co-authored-by: sriram veeraghanta <veeraghanta.sriram@gmail.com>

* [WEB-5871] chore: added intake count for projects (makeplane#8497)

* chore: add intake_count in project list endpoint

* chore: sidebar project navigation intake count added

* fix: filter out closed intake issues in the count

* chore: code refactor

* chore: code refactor

* fix: filter out deleted intake issues

---------

Co-authored-by: Anmol Singh Bhatia <anmolsinghbhatia@plane.so>

* [WEB-5829] fix: Intake open work count (makeplane#8547)

* fix: open intake count at sidebar header

* chore: reverted inbox store arguments to core store

* fix: intake count update

* [WEB-5863] fix: estimate point input validation makeplane#8492

Co-authored-by: sriram veeraghanta <veeraghanta.sriram@gmail.com>

* [VPAT-55] chore(security): implement input validation across authentication and workspace forms (makeplane#8528)

* chore(security): implement input validation across authentication and workspace forms

  - Add OWASP-compliant autocomplete attributes to all auth input fields
  - Create centralized validation utilities blocking injection-risk characters
  - Apply validation to names, display names, workspace names, and slugs
  - Block special characters: < > ' " % # { } [ ] * ^ !
  - Secure sensitive input fields across admin, web, and space apps

* chore: add missing workspace name validation to settings and admin forms

* feat: enhance validation regex for international names and usernames

- Updated regex patterns to support Unicode characters for person names, display names, company names, and slugs.
- Improved validation functions to block injection-risk characters in names and slugs.

* [VPAT-16] improvement: add file validation to prevent malicious uploads makeplane#8493

Add client-side checks for double extensions, dangerous file types,
dot files, and path traversal patterns. Addresses security audit
recommendations for file upload validation.

* [WEB-5827] fix: persist external cover image URLs (Unsplash) in project updates makeplane#8482

* [VPAT-27] chore(security): disable autocomplete on sensitive input fields makeplane#8517

Disable autocomplete on authentication and security-related forms to prevent
browsers from storing sensitive credentials. This affects sign-in, password
reset, account security, and onboarding forms across admin, web, and space apps.

Modified components:
- Auth forms (email, password, unique code, forgot/reset/set password)
- Account security pages
- Instance setup and profile onboarding
- Shared UI components (auth-input, password-input)

* [WEB-5917] fix: generate clean plain text from HTML email template makeplane#8535

* [WEB-5878] chore: add validation for project name/identifier for special characters (makeplane#8529)

* chore: update ProjectSerializer to raise validation for special characters in name and identifier

* chore: update external endpoints

* fix: external api serializer validation

* update serializer to send error code

* fix: move the regex expression to Project model

* [WEB-6194]migration: added archived_at in IssueView makeplane#8641

* migration: added archived_at in IssueView

* fix: lint

* fix: IDOR Vulnerabilities in Asset & Attachment Endpoints (makeplane#8644)

* fix: idor issues in project assets and issue attachements

* fix: comments

* fix: Member Information Disclosure via Public Endpoint makeplane#8646

* chore: Add forum link and remove discord link on readme (makeplane#8655)

* Update README to remove Discord and add Forum link

Removed Discord badge and replaced Releases link with Forum link.

* Fix forum link in README.md

* fix: Update healthcheck endpoint in Dockerfile to target /spaces/ path (makeplane#8674)

* Change Dependabot update interval from weekly to daily

* [WIKI-887] fix: add scroll in heading layout (makeplane#8596)

* fix: add scroll in heading layout

* chore: remove visible scroll  bar

* fix :format

* chore: fix outline scroll

* chore: fix format

* chore: fix translation

---------

Co-authored-by: Aaryan Khandelwal <aaryankhandu123@gmail.com>

* fix: merge lists in editor (makeplane#8639)

* chore: replace prettier with oxfmt (makeplane#8676)

* fix: replace eslint with oxlint (makeplane#8677)

* fix: replace eslint with oxlint

* chore: adding max warning

* fix: formatting

* chore(deps): minimatch and rollup package vulnerabilities (makeplane#8675)

* fix: package updates

* fix: package upgrades

* fix: minimatch package vulnerabilities

* fix: ajv package vulnerabilities

* fix: lint

* fix: format

* [SILO-1028] feat: Project Summary external API (makeplane#8661)

* add project summary endpoint

* update response structure

* [WIKI-852] chore: update page version save logic (makeplane#8440)

* chore: updated the logic for page version task

* chore: updated the html variable

* chore: handled the exception

* chore: changed the function name

* chore: added a custom variable

* [WEB-5225] feat: enhance authentication logging with detailed error and info message (makeplane#7998)

* feat: enhance authentication logging with detailed error and info messages

- Added logging for various authentication events in the Adapter and its subclasses, including email validation, user existence checks, and password strength validation.
- Implemented error handling for GitHub OAuth email retrieval, ensuring proper logging of unexpected responses and missing primary emails.
- Updated logging configuration in local and production settings to include a dedicated logger for authentication events.

* chore: address copilot comments

* chore: addressed some additional comments

* chore: update log

* fix: lint

* [WEB-6420] chore: migrate community references from Discord to Forum (makeplane#8657)

* chore: replace Discord references with Forum links

* chore: migrate help and community CTAs from Discord to Forum

* refactor: replace Discord icons with lucide MessageSquare

* chore: rename Discord labels and keys to Forum

* chore: remove obsolete Discord icon component

* chore: update Discord references to Forum in templates

* chore: code refactoring

* fix: dependabot and codeql CI

* fix: disable react-in-jsx-scope rule in oxlint config (makeplane#8682)

After makeplane#8677 replaced ESLint with OxLint, the react-in-jsx-scope rule
was not disabled. This causes all commits touching JSX files to fail
the pre-commit hook (oxlint --deny-warnings).

React 17+ uses automatic JSX runtime so explicit React imports are
not required.

Fixes makeplane#8681

* chore: space folders (makeplane#8707)

* chore: change the space folders structure

* fix: format

* chore(deps): django version upgrade

* [GIT-40]fix: apply sub-issue display filter when adding work items makeplane#8534

* [WEB-5606] fix: work item preview word break makeplane#8537

* [WIKI-892] fix: description input component re-render makeplane#8600

* [WIKI-785] refactor: editor markdown handler makeplane#8546

* [WEB-5911] fix: error outline button text color makeplane#8531

* [SECUR-116] fix: ssrf webhook url for ip address makeplane#8716

* [WEB-6420] chore: self-host social icons in project invitation email (makeplane#8718)

* chore: add self-hosted social icon assets for email templates

* chore: pass current_site to project invitation email context

* chore: replace mailinblue CDN icons with self-hosted static assets

* feat: Complete Agent and Worktrees modules

- Add Agent CRUD API and frontend
- Add Worktrees page with CRUD
- Add extended routes for /agents and /worktrees
- Add custom sidebar navigation

---------

Signed-off-by: majiayu000 <1835304752@qq.com>
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: pratapalakshmi <137189067+pratapalakshmi@users.noreply.github.com>
Co-authored-by: b-saikrishnakanth <130811169+b-saikrishnakanth@users.noreply.github.com>
Co-authored-by: Nikhil <118773738+pablohashescobar@users.noreply.github.com>
Co-authored-by: Vamsi Krishna <46787868+vamsikrishnamathala@users.noreply.github.com>
Co-authored-by: Vipin Chaudhary <VipinChaudhary1809@gmail.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: sriram veeraghanta <veeraghanta.sriram@gmail.com>
Co-authored-by: Dheeraj Kumar Ketireddy <dheeraj.ketireddy@plane.so>
Co-authored-by: Anmol Singh Bhatia <121005188+anmolsinghbhatia@users.noreply.github.com>
Co-authored-by: Aaron <lifeiscontent@users.noreply.github.com>
Co-authored-by: M. Palanikannan <73993394+Palanikannan1437@users.noreply.github.com>
Co-authored-by: pushya22 <130810100+pushya22@users.noreply.github.com>
Co-authored-by: Pushya Mitra Thiruvooru <pushya@Pushyas-MacBook-Pro.local>
Co-authored-by: Aaryan Khandelwal <65252264+aaryan610@users.noreply.github.com>
Co-authored-by: Jayash Tripathy <76092296+JayashTripathy@users.noreply.github.com>
Co-authored-by: gakshita <akshitagoyal1516@gmail.com>
Co-authored-by: Palanikannan M <akashmalinimurugu@gmail.com>
Co-authored-by: Prateek Shourya <prateekshourya29@gmail.com>
Co-authored-by: b-saikrishnakanth <bsaikrishnakanth97@gmail.com>
Co-authored-by: Henit Chobisa <chobisa.henit@gmail.com>
Co-authored-by: Sangeetha <sangeethailango21@gmail.com>
Co-authored-by: Anmol Singh Bhatia <anmolsinghbhatia@plane.so>
Co-authored-by: Bavisetti Narayan <72156168+NarayanBavisetti@users.noreply.github.com>
Co-authored-by: Shaikh Naasir <yoursdeveloper@protonmail.com>
Co-authored-by: lif <1835304752@qq.com>
Co-authored-by: NarayanBavisetti <narayan3119@gmail.com>
Co-authored-by: vamsikrishnamathala <matalav55@gmail.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Aaryan Khandelwal <aaryankhandu123@gmail.com>
Co-authored-by: yy <yhymmt37@gmail.com>
Co-authored-by: punto <119956578+AshrithSathu@users.noreply.github.com>
Co-authored-by: Ship it <161483884+vcscroll@users.noreply.github.com>
Co-authored-by: Akshat Jain <akshatjain9782@gmail.com>
Co-authored-by: stelmsk <151884118+stelmsk@users.noreply.github.com>
Co-authored-by: Cornelius <70640137+conny3496@users.noreply.github.com>
Co-authored-by: Vihar Kurama <vihar.kurama@gmail.com>
Co-authored-by: Saurabh Kumar <70131915+Saurabhkmr98@users.noreply.github.com>
Co-authored-by: darkingtail <51188676+darkingtail@users.noreply.github.com>
Co-authored-by: Claude Code <claude@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

🔄migrations Contains Migration changes ready to merge

Projects

None yet

Development

Successfully merging this pull request may close these issues.

9 participants