Skip to content

dev: copy shortcuts, magic login links, improved settings page - #1

Merged
vamsi merged 1 commit into
makeplane:masterfrom
dakshesh14:main
Nov 24, 2022
Merged

dev: copy shortcuts, magic login links, improved settings page#1
vamsi merged 1 commit into
makeplane:masterfrom
dakshesh14:main

Conversation

@dakshesh14

Copy link
Copy Markdown
Contributor

fix:

  • mutation in my issue page
  • cycles page crashing on navigating there
  • changed from "/" to "ctrl/command + /" to open the command palette

refactor:

  • used custom search list box and custom list box in the select assignee, select parent issue, and select state select

feat:

  • see all the states and create a new state from the project settings page
  • showing workspace logo,
  • showing user profile picture if there are any
  • on the issue detail page press "ctrl/command + alt + c" to copy the issue URL.
  • made a magic link login page(UI+functionality)
  • made cosine similarity function to check similarity between two strings, using that in create issue modal to info the user if an issue with a similar title exists

@vercel

vercel Bot commented Nov 23, 2022

Copy link
Copy Markdown

@dakshesh14 is attempting to deploy a commit to the Caravel Team on Vercel.

A member of the Team first needs to authorize it.

@vamsi
vamsi merged commit 0680545 into makeplane:master Nov 24, 2022
vamsi pushed a commit that referenced this pull request Dec 6, 2022
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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants