dev: copy shortcuts, magic login links, improved settings page - #1
Merged
Conversation
|
@dakshesh14 is attempting to deploy a commit to the Caravel Team on Vercel. A member of the Team first needs to authorize it. |
vamsi
pushed a commit
that referenced
this pull request
Dec 6, 2022
1 task
1 task
1 task
1 task
ColeEdanza
added a commit
to ColeEdanza/plane
that referenced
this pull request
May 26, 2026
…lapse, footer, sidebar groups Five compound UI changes implementing the Plane.so blog redesign (items makeplane#2, makeplane#3, makeplane#5, makeplane#6, makeplane#7; makeplane#1/makeplane#4/makeplane#8/makeplane#9/makeplane#10/makeplane#11 out of scope per Cole). - Compact parent pill next to the work-item ID (new IssueParentPill in parent/pill.tsx); fat parent breadcrumb row above the title removed in both the full-screen page and all peek modes. - Inline properties row under the title: Assignee, Priority, Start, Due as borderless pills with vertical dividers (border-strong), text-body-sm font, gap-x-5 spacing, hover background via transparent-with-text variant. State stays in the peek header from prior commit 03d84b1. - DescriptionCollapse wrapper around the rich-text editor: clamps to ~200px via ResizeObserver, fade gradient when collapsed, auto-expands on focus, Show more / Show less toggle. Wraps both surfaces. - IssueMetadataFooter at the bottom of main content: created-by, created, updated, and completed (when set) in a compact row with full-timestamp hover tooltips. - Sidebar regrouped into three collapsible sections (Properties / Project structure / Custom properties). Assignee, Priority, Start, Due removed from the sidebar since they're inline now. Parent stays as the only way to *add* a parent when none is set. Title bumped from text-20 to text-28 font-semibold leading-snug py-1; the prior leading-tight clipped ascenders inside the auto-resize textarea. Touches: apps/web/core/components/issues/issue-detail/main-content.tsx apps/web/core/components/issues/issue-detail/sidebar.tsx apps/web/core/components/issues/issue-detail/parent/index.ts apps/web/core/components/issues/peek-overview/issue-detail.tsx + 4 new files: parent/pill.tsx, inline-properties.tsx, description-collapse.tsx, metadata-footer.tsx Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
manhhn01
referenced
this pull request
in manhhn01/planex
Jul 20, 2026
* chore: add InfraWatch build workflow for Plane images Build and push 6 Plane images to infrawatchlabs/ Docker Hub: - plane-web, plane-space, plane-admin, plane-live, plane-api, plane-proxy Uses standard docker/build-push-action (no makeplane custom actions). Trigger: workflow_dispatch only, with optional release version tag. All builds run in parallel with GHA cache. * chore: remove GHA build cache — not needed for infrequent builds * chore: add Docker Hub registry cache-from for faster rebuilds * chore: bump actions/checkout to v6 * chore: bump docker actions to latest (setup-buildx v4, login v4) * chore: align build workflow with makeplane build-push action - Add cache-to: registry (push buildcache tag to Docker Hub) - Add cache-from: buildcache tag (not :latest — dedicated cache layer) - Add semver validation for release versions - Add stable tag for releases (version + :stable), latest for branch builds - Add DOCKER_BUILDKIT=1 env var - Skipped (not needed): private registry, FIPS, AIO, ARM64, build-args * refactor: use matrix strategy for parallel builds (208 → 104 lines) --------- Co-authored-by: Manish Gupta <manish@plane.so> (cherry picked from commit ace3d75)
manhhn01
referenced
this pull request
in manhhn01/planex
Jul 20, 2026
INFRAWATCHLABS.md documents every change we've made from upstream master — categorized by conflict risk. Includes sync workflow and quick conflict resolution guide. Patch file regenerated to include all merged PRs (#1-makeplane#8). Co-authored-by: MG <mg@infrawatchlabs.com> (cherry picked from commit c6507f4)
blitzy Bot
referenced
this pull request
in blitzy-research/plane
Jul 31, 2026
Duplicating a work item whose name was 249-255 characters returned HTTP 500 (psycopg StringDataRightTruncation -> django.db.utils.DataError) because the handler appended the mandated " (Copy)" suffix without accounting for Issue.name being a CharField(max_length=255); the mirrored page duplicate precedent operates on an unbounded TextField, so the idiom was not length safe when transplanted. The copied base name is now trimmed against the field's own max_length before the insert, so the mandated suffix always survives and the insert can never overflow the column. Sources at or below the threshold are unaffected: their clone name is still exactly name + " (Copy)". Addresses QA finding #1 (MAJOR, functional) on the work item duplicate endpoint. Re-verified at runtime: 249 and 255 character sources now return 201 with a 255 character clone name ending in " (Copy)", persisted to the row; the short name control, the fresh id/sequence_id, completed_at, archived_at, is_draft, external identity, description fidelity, assignee and label re-creation, clean history, 404/403/405 contract and the pytest baselines are all unchanged.
DoctorFogarty
pushed a commit
to DoctorFogarty/plane
that referenced
this pull request
Aug 7, 2026
dev: copy shortcuts, magic login links, improved settings page
DoctorFogarty
pushed a commit
to DoctorFogarty/plane
that referenced
this pull request
Aug 7, 2026
QuentinDowsers
pushed a commit
to Dowsers/plane
that referenced
this pull request
Aug 31, 2026
…, feature 2) Implements the frontend for "Reactions emoji sur les Pages" (docs/feature-specs/10-docs-wiki.md in plane-selfhost), on top of the backend already committed at d5730c9. - New TPageReaction type (packages/types/src/page/core.ts) and PageReactionService (apps/web/core/services/page/page-reaction.service.ts), mirroring IssueReactionService's list/create/remove shape against the project-scoped .../pages/<page_id>/reactions/[<reaction_code>/] endpoints. - New PageReactions component (apps/web/core/components/pages/editor/ reactions.tsx), mirroring IssueReaction's EmojiReactionGroup/ EmojiReactionPicker UX (@plane/propel/emoji-reaction) almost verbatim, including the same `-`-joined codepoint-decimal reaction encoding and client-side toggle (POST if the user hasn't reacted with that emoji yet, DELETE if they have - the backend deliberately rejects a duplicate POST with 400 rather than toggling server-side). - Store-architecture choice: reactions live as a plain observable array (`reactions: TPageReaction[]`) plus fetch/create/remove actions directly on the page instance (BasePage/ProjectPage), NOT as a separate global reaction-map MobX store keyed by page id the way IssueReactionStore is. Reasoning: unlike issues (many rendered at once across list/kanban/peek views, which is why IssueReactionStore's map-of-maps shape earns its keep), only one Page is ever open in the editor at a time in this fork, and existing Page sub-resource state (is_favorite, is_locked, label_ids) already lives as plain fields directly on the page instance rather than in a separate lookup store - reactions follow that closer, simpler precedent instead of introducing a second shape. `ProjectPage`'s constructor wires the three new `TBasePageServices` methods (listReactions/createReaction/removeReaction) to a `PageReactionService` instance the same way lock/unlock/archive/restore already wire to `ProjectPageService`. - Revalidation: `ProjectPageStore.fetchPageDetails` fires `pageInstance.fetchReactions()` fire-and-forget right after the page itself is fetched/instantiated (reactions aren't embedded in the Page's own GET response) - mirrors `ProjectInboxStore.fetchInboxIssueById` fetching reactions/activity/comments/attachments alongside the main issue. This piggybacks on the page detail route's existing `useSWR` revalidateOnFocus/revalidateOnReconnect config for free, satisfying this feature's "ordinary revalidation, no realtime push" scope decision (real-time propagation over the Hocuspocus/Yjs channel was evaluated and explicitly deferred, backend-side, at d5730c9). - Placement (the spec's own open question makeplane#1, deliberately left to the implementer): rendered just above the title, in a new row reusing the existing `page-header-container`/`blockWidthClassName` pair already used one row above it for the icon/logo picker (apps/web/core/ components/pages/editor/editor-body.tsx) - no new layout scaffolding. Explicitly NOT placed in PageEditorToolbarRoot next to PageCollaboratorsList (the spec's own "near the collaborators avatar stack" suggestion): that whole toolbar collapses to zero height whenever `isContentEditable` is false (archived/locked/read-only) - exactly the states where reactions must stay visible per exigences 1/8/9. Also not placed after the editor content ("bottom of content"): the editor's container carries a large `pb-64` bottom padding that would leave a large dead gap between the visible text and the reactions bar. - Deliberate deviation from the IssueReaction template: no `disabled` prop/state at all. IssueReaction disables on `isArchived`; PageReactions never disables on archived_at/is_locked, since exigences 8/9 explicitly require reactions to stay allowed on both archived and locked pages. - Drive-by fix: touching editor-body.tsx tripped this repo's pre-commit lint-staged hook on three pre-existing oxlint findings unrelated to this feature (a shadowed `props` param, and two jsx-a11y findings on the pre-existing floating table-of-contents button). Renamed the shadowed param and added two scoped eslint-disable comments (documented inline, same pattern already used at issue-detail/links/link-detail.tsx:52) rather than restructuring that unrelated button, to avoid an out-of-scope visual/behavioral change. Verification: `react-router typegen` + `tsc --noEmit` clean (0 errors, after rebuilding @plane/types via `turbo run build --filter="./packages/*"` - 12/12 packages built successfully), `oxlint --deny-warnings` clean (0 warnings) on all 8 touched/created files, pre-commit hook passed. No real browser check was performed - this session has never had a working way to launch a real browser against this stack. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
QuentinDowsers
pushed a commit
to Dowsers/plane
that referenced
this pull request
Aug 31, 2026
…egory 11, feature 1, part 3/3) JIT provisioning (exigence 9/10): plane.authentication.adapter.saml. SAMLAdapter reuses the shared Adapter.complete_login_or_signup() choke point (JIT user creation, is_bot rejection, invite-processing callback) rather than reimplementing it - creates a new is_password_autoset=True User for an unknown email, or links (never duplicates) an existing password/OAuth User by email, in both cases creating/updating an Account row (provider="saml", provider_account_id=NameID, metadata=latest attributes). Instance-level enforce_sso (exigence 11): a new check in the SHARED Adapter.complete_login_or_signup() (not just CredentialAdapter) blocks email/OTP, password, AND every OAuth provider alike for a domain covered by an enabled+verified SAMLVerifiedDomain whose config has enforce_sso=True - composes independently alongside feature 6's workspace-level enforce_sso_only (which deliberately never blocks OAuth, so it lives in a different, credential-only choke point). Excluded for the SAML adapter's own login completion. Live DB reads only, no caching, so exigence 16's "immediate fallback on disable" falls out by construction - verified by a test that flips enforce_sso off mid-test and confirms the very next login attempt succeeds. Endpoints: - Admin (instance-admin only, via BaseAPIView's existing InstanceAdminPermission default - decision makeplane#6): CRUD on /api/instances/admin/saml-configurations/, add+verify domains (DNS TXT only, via feature 6's shared plane.utils.domain_verification - decision makeplane#1), test-connection (builds a signed AuthnRequest redirect, real result reported later out-of-band by the ACS endpoint's own test-mode branch). - Public (/auth/... namespace, matching this fork's existing unauthenticated-auth-endpoint convention): SP metadata XML, /auth/saml/discover (email -> routing decision), SP-initiated login redirect, and the ACS endpoint - the one deliberate csrf_exempt in this codebase (documented in-line), since it's the sole endpoint required to accept a genuinely cross-origin POST from the IdP's own auto-submitting form with no prior CSRF handshake possible. Found and fixed a real bug during testing: InstanceSAMLConfiguration's default .delete() is this codebase's inherited SOFT delete, which does NOT trigger real FK CASCADE and does NOT touch is_enabled - a soft-deleted-but-still-enabled config would have kept silently routing/enforcing SSO for its domains (saml_configuration__is_enabled=True lookups traverse the FK via raw SQL JOIN, bypassing the soft-delete-aware manager entirely), breaking exigence 16. Fixed by hard-deleting (delete(soft=False), an established pattern elsewhere in this codebase) in the admin DELETE endpoint, plus a defense-in-depth saml_configuration__deleted_at__isnull=True filter in plane.utils.saml_enforcement itself. Verified via a 23-test throwaway pytest suite (not part of this commit, per this initiative's convention - deleted in the next/final checkpoint) adding, on top of the 18 from the previous commit: JIT-provisions-new-user and JIT-links-existing-user-by-email (exigence 9/10), enforce_sso blocking both a real password login AND a simulated OAuth completion plus immediate un-blocking after disable (exigence 11/16), instance-admin-only access (403 for an authenticated non-admin, 401 for anonymous), and a full admin CRUD + domain-uniqueness-per-active-config (exigence 4) + test-connection lifecycle against a live DRF test client. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
QuentinDowsers
pushed a commit
to Dowsers/plane
that referenced
this pull request
Aug 31, 2026
Category 11 (docs/feature-specs/11-admin-security-sso.md in plane-selfhost), feature 2 "SCIM 2.0 natif" - the actual RFC 7643/7644 protocol surface, in a new, genuinely separate plane.scim package (plain DRF APIView subclasses, NOT plane.app's BaseAPIView/BaseViewSet - per this feature's own pre-implementation research finding SCIM's pagination/filtering/PATCH/error-envelope conventions fundamentally incompatible with this fork's existing machinery). - plane.scim.authentication.SCIMTokenAuthentication: Bearer-header auth, hashed-token lookup (plane.utils.scim_token, HMAC-SHA256, never plaintext), workspace resolved FROM the token (no slug anywhere in plane/scim/urls.py), live ENABLE_SCIM re-check on every request (not just at token-creation time). - plane.scim.pagination: hand-rolled startIndex/count envelope (not BasePaginator's opaque cursor) - empty-workspace GET /Users returns a fully spec-shaped 200 envelope by construction (totalResults=0, Resources=[]), the IdP-connection-test scenario the spec's own UX section calls out. - plane.scim.filters: minimal filter grammar, userName eq "..." and emails.value eq "..." only - anything else is a real SCIM 400 (invalidFilter), never a silently-empty result. - plane.scim.exceptions: RFC 7644 error envelope, wired as this package's own get_exception_handler() override (global EXCEPTION_HANDLER setting untouched for every other view). - plane.scim.resources: SCIM User <-> WorkspaceMember mapping. SCIM "id" is WorkspaceMember.id (not the global User.id) - a workspace-scoped connection deactivates/removes within ONE workspace, and the same User can in principle be SCIM-provisioned into more than one. Role comes only from the urn:...:extension:plane:2.0:User.role attribute (decision makeplane#1, no Groups resource in v1) - "owner" is not a valid value and is rejected explicitly (SCIM can never grant Owner). - plane.scim.provisioning: create (dedupes by email against an existing global User, else provisions one in the same is_password_autoset/ is_email_verified "no credential yet" state this fork's own JIT/bot provisioning already uses - no invitation email sent), PATCH (op-based, replace-only, scoped to active/name.givenName/name.familyName/emails, validated atomically before any operation is applied), PUT (full replace, reuses the PATCH active-transition path), DELETE (always active:false, never physical deletion - exigence 7). Last-Owner protection (decision makeplane#6): deactivation checks workspace.owner_id directly, real SCIM 409. Deactivation also cascades ProjectMember rows (mirrors WorkSpaceMemberViewSet.destroy()'s own pattern) since ProjectEntityPermission checks ProjectMember.is_active independently of WorkspaceMember.is_active - skipping this would leave a deprovisioned user with live project access. - plane.scim.throttling.SCIMTieredRateThrottle: reuses the RateLimitTier model/concept (the "scim_sync" row seeded in the previous commit) and the identical Redis sliding-window Lua script from plane.api.rate_limit, but NOT that module's TieredSlidingWindowRateThrottle class itself, which is hard-coupled to APIToken's plaintext X-Api-Key lookup - resolves the token from request.auth instead. - Webhook dispatch: "scim_provisioning" added to plane.bgtasks.webhook_task.WORKSPACE_SECURITY_EVENTS, reusing Webhook.workspace_security (decision makeplane#4) for the spec's member.scim_provisioned/deprovisioned events. - Mounted at /api/scim/v2/ in plane/urls.py (listed before the "api/" plane.app.urls include), plane.scim registered in INSTALLED_APPS (owns no models itself). manage.py check and makemigrations --check --dry-run both pass; ruff clean on the whole plane/scim package and every touched file. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
fix:
refactor:
feat: