2026-01-27 08:24:22 +00:00
|
|
|
/**
|
|
|
|
|
* Copyright (c) 2023-present Plane Software, Inc. and contributors
|
|
|
|
|
* SPDX-License-Identifier: AGPL-3.0-only
|
|
|
|
|
* See the LICENSE file for details.
|
|
|
|
|
*/
|
|
|
|
|
|
2025-10-14 11:15:07 +00:00
|
|
|
import React, { useCallback, useEffect, useRef, useState } from "react";
|
2024-04-30 11:51:24 +00:00
|
|
|
import { observer } from "mobx-react";
|
feat: app dir migration (#4743)
* feat: creating new app dir structure for web app
* fix: moving few pages to app dir
* fix: adding profile settings layout
* fix: errors on app dir.
* chore: remove pages routes.
* chore: add sign-in/ sign-up, invitations, onboarding pages.
* [WEB-1374] fix: clear changes made on modal close (#4555)
* [WEB-1480] fix: preserve page access when making a copy (#4568)
* [WEB-1465] fix: theme fluctuation on initial load. (#4638)
* [WEB-1445] fix: issue creation on sub groups when cycle/ module grouping is applied. (#4636)
* [WEB-1244] fix: add better image insertion and replacement logic in the editor (#4508)
* fix: add better image insertion and replacement logic
* refactor: image handling in editor
* chore: remove passing uploadKey around
* refactor: remove unused code
* fix: redundant files removed
* fix: add is editor ready to discard api to control behvaiours from our app
* fix: focus issues and image insertion position when not using slash command
* fix: import order fixed
* fix: notification mark all as read (#4643)
* chore: remove enter key extension (#4648)
* [WEB-1467] chore: run the API's required to bootstrap the application in parallel. (#4642)
* [WEB - 1482] fix: uploads when using block storages other than s3 and minio (#4647)
* fix: minio storage and redirection
* dev: disconnect web url and app base url configuration.
* fix: negate check while trying to discard (#4653)
* fix: email notification preferences (#4656)
* [WEB-1493] chore: product tour asset and app sidebar quick action hover (#4655)
* chore: product tour asset updated
* fix: app sidebar quick action hover
* fix: project state setting state name remove camel case logic (#4652)
* [WEB-1419] chore: enable module creation with dates older than today. (#4659)
* [WEB-1216] chore: increase module empty state for consistency. (#4658)
* fix: build errors
* [WEB-1235] chore: module and cycle sidebar graph improvement (#4650)
* chore: module and cycle sidebar graph improvement
* chore: code refactor
* [WEB-1424] chore: page and view logo implementation, and emoji/icon (#4662)
* [WEB-1424] chore: page and view logo implementation, and emoji/icon picker improvement (#4583)
* chore: added logo_props
* chore: logo props in cycles, views and modules
* chore: emoji icon picker types updated
* chore: info icon added to plane ui package
* chore: icon color adjust helper function added
* style: icon picker ui improvement and default color options updated
* chore: update page logo action added in store
* chore: emoji code to unicode helper function added
* chore: common logo renderer component added
* chore: app header project logo updated
* chore: project logo updated across platform
* chore: page logo picker added
* chore: control link component improvement
* chore: list item improvement
* chore: emoji picker component updated
* chore: space app and package logo prop type updated
* chore: migration
* chore: logo added to project view
* chore: page logo picker added in create modal and breadcrumbs
* chore: view logo picker added in create modal and updated breadcrumbs
* fix: build error
* chore: AIO docker images for preview deployments (#4605)
* fix: adding single docker base file
* action added
* fix action
* dockerfile.base modified
* action fix
* dockerfile
* fix: base aio dockerfile
* fix: dockerfile.base
* fix: dockerfile base
* fix: modified folder structure
* fix: action
* fix: dockerfile
* fix: dockerfile.base
* fix: supervisor file name changed
* fix: base dockerfile updated
* fix dockerfile base
* fix: base dockerfile
* fix: docker files
* fix: base dockerfile
* update base image
* modified docker aio base
* aio base modified to debian-12-slim
* fixes
* finalize the dockerfiles with volume exposure
* modified the aio build and dockerfile
* fix: codacy suggestions implemented
* fix: codacy fix
* update aio build action
---------
Co-authored-by: sriram veeraghanta <veeraghanta.sriram@gmail.com>
* fix: merge conflict
* chore: lucide react added to planu ui package
* chore: new emoji picker component added with lucid icon and code refactor
* chore: logo component updated
* chore: emoji picker updated for pages and views
---------
Co-authored-by: NarayanBavisetti <narayan3119@gmail.com>
Co-authored-by: Manish Gupta <59428681+mguptahub@users.noreply.github.com>
Co-authored-by: sriram veeraghanta <veeraghanta.sriram@gmail.com>
* fix: build error
---------
Co-authored-by: Anmol Singh Bhatia <121005188+anmolsinghbhatia@users.noreply.github.com>
Co-authored-by: NarayanBavisetti <narayan3119@gmail.com>
Co-authored-by: Manish Gupta <59428681+mguptahub@users.noreply.github.com>
Co-authored-by: Anmol Singh Bhatia <anmolsinghbhatia@plane.so>
* refactor: drag handle component (#4663)
* refactor: checkbox ui component (#4665)
* [WEB-1325] chore: refactor inbox issue store to avoid data loss. (#4640)
* [WEB-1325] chore: refactor inbox issue store to avoid data loss.
* chore: inbox store improvement.
* chore: priority dropdown accepts undefined (#4666)
* chore: added buttonClassName prop to label dropdown (#4671)
* chore: created new constants for marketing website page links (#4670)
* chore: added a prop to render default state conditionally (#4669)
* [WEB-1501] dev: multiple select core components (#4667)
* dev: multiple select core components
* chore: added export statement
* chore: created a new constant for archivable state groups (#4668)
* chore: added primary variant to the alert modal (#4664)
* [WEB-1436] chore: pages improvement. (#4657)
* add empty state if no pages are available.
* set access to private in create page modal when the modal is open form private tab.
* [WEB-1440] chore: update cycle empty state to use project level access. (#4672)
* fix: checkbox ui component (#4675)
* fix: ai buttons overlapping issue (#4621)
* [WEB - 1500] chore: add extra fields on instance and create changelog table to store release change logs (#4673)
* chore: add extra fields on instance and create changelog table to store release change logs
* dev: rename new_version to latest_version
* [WEB - 1505] chore: alter instance id field (#4676)
* chore: instance id
* dev: update to max length
* feat: creating new app dir structure for web app
* fix: moving few pages to app dir
* feat: creating new app dir structure for web app
* fix: moving few pages to app dir
* fix: errors on app dir.
* chore: remove pages routes.
* chore: add sign-in/ sign-up, invitations, onboarding pages.
* fix: instance serializer
* fix: instance register script (#4681)
* fix: instance register script
* dev: remove api key and add latest version and current version in types
* [WEB-1492] fix: resolved issue creation error in layouts while group_by and sub_group_by filters applied in quick add (#4682)
* fix: resolved issue creation error in layouts while group_by and sub_group_by filters applied in quick add
* fix: updated braces in conditions
* fix: inbox issue store update logic. (#4683)
* chore: update package version
* [WEB-1184] feat: issue bulk operations (#4674)
* feat: issue bulk operations
* style: bulk operations action bar
* chore: remove edition separation
* style: fix overlapping of response container in AI popover. (#4684)
* [WEB-1498] style: fix comments reaction alignment. (#4686)
* [WEB-1503] chore: add `autofocus` to name field in inline create/ update state component. (#4685)
* [WEB-1312] fix: trim file name before uploading (#4661)
* fix: trim file name before uploading
* fix: check the cursor position before inserting image
* dev: add trimming for file assets
* dev: add filename validation above if
* dev: make the validation to 50 to support user uploads
---------
Co-authored-by: pablohashescobar <nikhilschacko@gmail.com>
* [WEB-1481] fix: multiple API calls in inbox issues on closed issues tab. (#4691)
* fix: multiple API calls on scroll and closed issues tab.
* fix: pagination loader on initial load.
* feat: Add components required for estimates (#4690)
* Add sortable, radio and typography components
* Remove stray css classes
* Prevent drag of items from other draggable
* Minor cleanup
* Update yarn.lock
* Remove radio input component as it was build on
headless ui v2.0.0 and now we are using v1.7.0
* Fix build errors
* Update dependencies in use memo.
* [WEB-1521] chore: add configuration to enable/disable sign-ups. (#4697)
* fix: regenerating lock file
* fix: docker image build errors
* fix: remove `setupInterceptors` to avoid circular dependency.
* chore: migrate all `accounts` related routes.
* chore: migrate all `profiles` related routes.
* chore: workspace invitation and onboarding migration / fixes.
* chore: installation provider migrations.
* regression: focus changing issue with the peek overview editor (#4700)
* [WEB-1459] chore: save users all / favorite project list collapse state into localstorage. (#4701)
* [WEB-1501] chore: update selected entity details on entities list change (#4702)
* chore: update selected entity detials on entities list change
* chore: addd selectionHelpers as a prop
* [WEB-1517] chore: remove drag handle from list drag block (#4698)
* remove drag handle from list drag block
* align list group header with list item
* rearrange chevron for list subissues and rearrange spaces
* adding default draggable property to control link
* remove unnecessary dependencies for useEffect
* fix: email validation (#4707)
* fix: email validation on complete login or sign up functionality
* dev: add try catch block
* dev: split up code
* dev: empty return
* fix: cache invalidation on new members invite (#4699)
* fix: build test pull request running on non draft PRs (#4708)
* fix: cache invalidation on new members invite (#4699)
* fix: add version max length (#4713)
* chore: migrations for `routing` hooks.
* [WEB-1533] chore: fix alignment issues in List and Spreadsheet view (#4714)
* fix alignment issues in List and Spreadsheet view
* fix spreadsheet indentation
* chore: migration for workspace dashboard/ views/ analytics/ settings and active-cycles.
* chore: handle undefined identifier case
* fix: Overflowing loader in issue edit modal (#4720)
* [WEB-1529] chore: workspace sidebar updates. (#4710)
* fix: temporary fix exiting lines with slashes (#4725)
* [WEB-1537] fix: inline code block size fixed for headers, etc (#4709)
* fix: inline code block size fixed for headers, etc
* feat: persisting focus accurately post converting the code block into text
* fix: typo in error handling
* [WEB-1526] feat: add auto merge behaviour to task lists and fix infinite backspace case (#4703)
* feat: add auto merge behaviour to task lists
* fix: unhandled cases for taskItem and taskList
* fix: css task list such that toggling task list doesn't shift things
* fix: task list jumps around while trying create/delete things in between two task lists
* fix: remove filtering for generic transactions i.e. transactions with some meta data while tying to join things
* chore: migration for profile activity along with headers refactor.
* [WEB-1201] dev: dropdowns (#4721)
* chore: lodash package added
* chore: dropdown key down hook added
* dev: dropdown component
* chore: build error and code refactor
* chore: readme file updated
* chore: added disabled prop to multiple select components (#4724)
* chore: added disabled prop to mutliple select group hoc
* style: fix empty space
* fix: don't add as a sub-issue if parent has been removed (#4731)
* fix: member list item custom menu placement (#4729)
* [WEB-1535] chore: project logo picker improvement (#4718)
* chore: emoji icon picker improvement
* chore: emoji icon picker improvement
* fix: resolved border flicker on issue title (#4727)
* chore: profile activity empty state added (#4732)
* [WEB-1481] fix: inbox issue list update after changing issue status. (#4715)
* style: fix ux copy style on project feature preview page. (#4734)
* chore: remove clear seleciton logic on escape key press (#4735)
* chore: migrations for projects and project issues.
* chore: issue and properties filter dropdown improvement (#4733)
* save all filters and properties for views (#4728)
* chore: migrations for issue details route.
* chore: migration for cycle routes.
* chore: migration for module routes.
* chore: migrations for project views routes.
* chore: migrations for project pages routes.
* chore: migration for project inbox routes.
* chore: migration for project settings routes.
* chore: migrations for draft issues routes.
* chore: migrations for project archives routes.
* chore: remove unused headers.
* temp: comment out auth constant and use-reload-confirmation code to avoid errors.
---------
Co-authored-by: Prateek Shourya <prateekshourya29@gmail.com>
Co-authored-by: rahulramesha <71900764+rahulramesha@users.noreply.github.com>
Co-authored-by: Aaryan Khandelwal <65252264+aaryan610@users.noreply.github.com>
Co-authored-by: M. Palanikannan <73993394+Palanikannan1437@users.noreply.github.com>
Co-authored-by: Anmol Singh Bhatia <121005188+anmolsinghbhatia@users.noreply.github.com>
Co-authored-by: Nikhil <118773738+pablohashescobar@users.noreply.github.com>
Co-authored-by: NarayanBavisetti <narayan3119@gmail.com>
Co-authored-by: Manish Gupta <59428681+mguptahub@users.noreply.github.com>
Co-authored-by: Anmol Singh Bhatia <anmolsinghbhatia@plane.so>
Co-authored-by: guru_sainath <gurusainath007@gmail.com>
Co-authored-by: pablohashescobar <nikhilschacko@gmail.com>
Co-authored-by: Satish Gandham <satish.iitg@gmail.com>
Co-authored-by: Henit Chobisa <chobisa.henit@gmail.com>
Co-authored-by: Aaryan Khandelwal <aaryankhandu123@gmail.com>
2024-06-10 07:07:38 +00:00
|
|
|
import { useParams } from "next/navigation";
|
refactor: migrate web icons to @makeplane/propel (#9731)
* refactor: migrate web icons to @makeplane/propel
Replace confirmed icon symbols across apps/web with their audited
@makeplane/propel/icons targets. Unresolved symbols and the State,
Priority and Brand icons stay on their existing imports.
Lucide size props become explicit width/height, including the two
relation icons and the inbox status icon that forward a size variable.
Two aliased imports resolve to targets the file already imported, so
the aliases are dropped rather than importing the same symbol twice.
Widen the member dropdown chain and the AI menu from LucideIcon to
ComponentType<SVGProps<SVGSVGElement>> so both Lucide and Propel icons
satisfy them; both only ever render the icon with a className.
CycleGroupIcon is deliberately not migrated: it dispatches a different
glyph and color per cycle status, which CyclesOutline cannot express.
apps/web already declared @makeplane/propel, so no dependency change
was needed.
* fix: address icon migration review on web
Restore the six user-facing strings the identifier rename overwrote.
The migration replaced every occurrence of a source symbol name,
including ones inside string literals and JSX text, so the GitHub
empty state read "StarOutline us on GitHub", the exporter column key,
header and button label became "DownloadOutline", the project card
action title became "SettingsOutline" and a tooltip became "PinOutline".
Drop 122 strokeWidth props and 10 text-2 classes. Propel glyphs paint
with fill="currentColor", so strokeWidth never changed weight, and
text-2 was a bad conversion of stroke-2, which is a stroke width rather
than a colour and has no meaning on a fill path.
Use StarFilled for the two favorited sidebar stars. Lucide's Star with
fill-yellow-500 was a solid star, and StarOutline is a ring path, so
filling it does not reproduce that shape.
2026-09-02 15:06:43 +00:00
|
|
|
import { CloseOutline, FilterOutline, SearchOutline } from "@makeplane/propel/icons";
|
2024-09-12 14:40:04 +00:00
|
|
|
// plane helpers
|
2025-02-06 15:11:31 +00:00
|
|
|
import { MODULE_VIEW_LAYOUTS } from "@plane/constants";
|
2024-12-06 09:26:49 +00:00
|
|
|
import { useOutsideClickDetector } from "@plane/hooks";
|
2024-04-30 11:51:24 +00:00
|
|
|
// types
|
2025-02-06 15:11:31 +00:00
|
|
|
import { useTranslation } from "@plane/i18n";
|
refactor: migrate web @plane/propel Tooltip to @makeplane/propel (#9726)
* refactor: migrate web @plane/propel Tooltip to @makeplane/propel
Move all 144 Tooltip call sites in apps/web from the in-repo
@plane/propel/tooltip to the published
@makeplane/propel/components/tooltip.
Prop mapping applied on every site:
- tooltipContent -> label (string)
- tooltipHeading -> folded into label + layout="stacked"
- position -> side/align (top/center omitted; it is the published default)
- isMobile -> disabled (OR'd with any existing disabled)
- renderByDefault -> dropped; the in-repo Tooltip declared but never
used it
- className -> dropped, or mapped to sideOffset/alignOffset (3 sites)
layout is "single" for short bounded copy and "stacked" wherever the
label interpolates unbounded data (names, titles, URLs, joined lists) —
"single" is whitespace-nowrap, so long labels would overflow.
Behavior change: tooltips now open after the published 600ms default
instead of the in-repo 200ms. delay is deliberately not set per site.
ReactNode content:
- Editor toolbars map name + <kbd>shortcut</kbd> onto the published
shortcut prop
- <br/> and fragment copy folds into one wrapping stacked string
- stickies/action-bar rendered a full <StickyNote> hover preview, not a
tooltip; it moves to PreviewCard/PreviewCardTrigger/PreviewCardContent
Published label is a string, so DropdownButtonProps.tooltipContent,
date-range's customTooltipContent, and the two rich-filters components
narrow from ReactNode to string. rich-filters/root.tsx guards
filterConfig.tooltipContent, which stays ReactNode in @plane/types.
Folded labels use ?? "" where the source expression is nullable so they
cannot render the string "undefined" where the in-repo tooltip rendered
nothing.
Zero @plane/propel/tooltip references remain under apps/web.
* fix: address review findings on the Tooltip migration
Accessibility (CodeRabbit): Base UI wires no aria-describedby or
aria-labelledby between the tooltip trigger and its popup — verified by
rendering the published Tooltip and inspecting the DOM, the trigger comes
out as `<button data-base-ui-tooltip-trigger>` with no aria at all and the
popup has role="tooltip" but no id. So a `label` never reaches assistive
tech, and the four icon-only triggers announced as bare "button". Add an
explicit aria-label at each: extended-project-sidebar, layout-switcher,
layout-selection, and access-field. Pre-existing gap (the in-repo tooltip
sat on the same unwired Base UI trigger), fixed here since the PR touches
these sites.
AccessField now requires i18n_label and drops the optional pre-i18n
`label`, so the computed label is non-empty by construction and serves as
both the tooltip copy and the accessible name. Its only caller already
passes i18n_label for every specifier, which also retires the TODO.
Correctness: inbox issue-properties interpolated a nullable name into a
template literal, so a duplicate work item with no name rendered the
literal "undefined"; pass the name with ?? "" instead.
CodeQL useless conditional: drop `|| ""` from stickyId in action-bar —
both call sites already sit behind a guard proving recentStickyId truthy,
and StickyNote treats "" and undefined identically.
React Doctor prefer-module-scope-static-value: hoist badgeContent to
module scope as BADGE_CONTENT; it holds only static strings.
React Doctor js-combine-iterations: collapse the filter/map chains to a
single pass. The two layout switchers skip inside map instead of
pre-filtering; LabelSummary reduces project labels into the selected
names once rather than filter -> map -> join.
2026-09-01 11:45:12 +00:00
|
|
|
import { Tooltip } from "@makeplane/propel/components/tooltip";
|
2025-10-14 11:15:07 +00:00
|
|
|
import type { TModuleFilters } from "@plane/types";
|
2024-04-30 11:51:24 +00:00
|
|
|
// ui
|
2025-06-16 11:48:41 +00:00
|
|
|
import { cn, calculateTotalFilters } from "@plane/utils";
|
2024-12-19 10:56:35 +00:00
|
|
|
// plane utils
|
2024-04-30 11:51:24 +00:00
|
|
|
// components
|
2025-08-15 07:40:26 +00:00
|
|
|
import { FiltersDropdown } from "@/components/issues/issue-layouts/filters";
|
2024-04-30 11:51:24 +00:00
|
|
|
import { ModuleFiltersSelection, ModuleOrderByDropdown } from "@/components/modules/dropdowns";
|
|
|
|
|
// constants
|
2024-05-07 09:26:19 +00:00
|
|
|
// helpers
|
2024-04-30 11:51:24 +00:00
|
|
|
// hooks
|
2025-08-18 15:57:16 +00:00
|
|
|
import { useMember } from "@/hooks/store/use-member";
|
2025-08-15 07:40:26 +00:00
|
|
|
import { useModuleFilter } from "@/hooks/store/use-module-filter";
|
2024-04-30 11:51:24 +00:00
|
|
|
import { usePlatformOS } from "@/hooks/use-platform-os";
|
2025-02-06 15:11:31 +00:00
|
|
|
import { ModuleLayoutIcon } from "./module-layout-icon";
|
2025-12-12 15:20:14 +00:00
|
|
|
import { IconButton } from "@plane/propel/icon-button";
|
2025-02-06 15:11:31 +00:00
|
|
|
// i18n
|
2024-04-30 11:51:24 +00:00
|
|
|
|
2025-11-20 12:09:40 +00:00
|
|
|
export const ModuleViewHeader = observer(function ModuleViewHeader() {
|
2024-04-30 11:51:24 +00:00
|
|
|
// refs
|
|
|
|
|
const inputRef = useRef<HTMLInputElement>(null);
|
|
|
|
|
// router
|
feat: app dir migration (#4743)
* feat: creating new app dir structure for web app
* fix: moving few pages to app dir
* fix: adding profile settings layout
* fix: errors on app dir.
* chore: remove pages routes.
* chore: add sign-in/ sign-up, invitations, onboarding pages.
* [WEB-1374] fix: clear changes made on modal close (#4555)
* [WEB-1480] fix: preserve page access when making a copy (#4568)
* [WEB-1465] fix: theme fluctuation on initial load. (#4638)
* [WEB-1445] fix: issue creation on sub groups when cycle/ module grouping is applied. (#4636)
* [WEB-1244] fix: add better image insertion and replacement logic in the editor (#4508)
* fix: add better image insertion and replacement logic
* refactor: image handling in editor
* chore: remove passing uploadKey around
* refactor: remove unused code
* fix: redundant files removed
* fix: add is editor ready to discard api to control behvaiours from our app
* fix: focus issues and image insertion position when not using slash command
* fix: import order fixed
* fix: notification mark all as read (#4643)
* chore: remove enter key extension (#4648)
* [WEB-1467] chore: run the API's required to bootstrap the application in parallel. (#4642)
* [WEB - 1482] fix: uploads when using block storages other than s3 and minio (#4647)
* fix: minio storage and redirection
* dev: disconnect web url and app base url configuration.
* fix: negate check while trying to discard (#4653)
* fix: email notification preferences (#4656)
* [WEB-1493] chore: product tour asset and app sidebar quick action hover (#4655)
* chore: product tour asset updated
* fix: app sidebar quick action hover
* fix: project state setting state name remove camel case logic (#4652)
* [WEB-1419] chore: enable module creation with dates older than today. (#4659)
* [WEB-1216] chore: increase module empty state for consistency. (#4658)
* fix: build errors
* [WEB-1235] chore: module and cycle sidebar graph improvement (#4650)
* chore: module and cycle sidebar graph improvement
* chore: code refactor
* [WEB-1424] chore: page and view logo implementation, and emoji/icon (#4662)
* [WEB-1424] chore: page and view logo implementation, and emoji/icon picker improvement (#4583)
* chore: added logo_props
* chore: logo props in cycles, views and modules
* chore: emoji icon picker types updated
* chore: info icon added to plane ui package
* chore: icon color adjust helper function added
* style: icon picker ui improvement and default color options updated
* chore: update page logo action added in store
* chore: emoji code to unicode helper function added
* chore: common logo renderer component added
* chore: app header project logo updated
* chore: project logo updated across platform
* chore: page logo picker added
* chore: control link component improvement
* chore: list item improvement
* chore: emoji picker component updated
* chore: space app and package logo prop type updated
* chore: migration
* chore: logo added to project view
* chore: page logo picker added in create modal and breadcrumbs
* chore: view logo picker added in create modal and updated breadcrumbs
* fix: build error
* chore: AIO docker images for preview deployments (#4605)
* fix: adding single docker base file
* action added
* fix action
* dockerfile.base modified
* action fix
* dockerfile
* fix: base aio dockerfile
* fix: dockerfile.base
* fix: dockerfile base
* fix: modified folder structure
* fix: action
* fix: dockerfile
* fix: dockerfile.base
* fix: supervisor file name changed
* fix: base dockerfile updated
* fix dockerfile base
* fix: base dockerfile
* fix: docker files
* fix: base dockerfile
* update base image
* modified docker aio base
* aio base modified to debian-12-slim
* fixes
* finalize the dockerfiles with volume exposure
* modified the aio build and dockerfile
* fix: codacy suggestions implemented
* fix: codacy fix
* update aio build action
---------
Co-authored-by: sriram veeraghanta <veeraghanta.sriram@gmail.com>
* fix: merge conflict
* chore: lucide react added to planu ui package
* chore: new emoji picker component added with lucid icon and code refactor
* chore: logo component updated
* chore: emoji picker updated for pages and views
---------
Co-authored-by: NarayanBavisetti <narayan3119@gmail.com>
Co-authored-by: Manish Gupta <59428681+mguptahub@users.noreply.github.com>
Co-authored-by: sriram veeraghanta <veeraghanta.sriram@gmail.com>
* fix: build error
---------
Co-authored-by: Anmol Singh Bhatia <121005188+anmolsinghbhatia@users.noreply.github.com>
Co-authored-by: NarayanBavisetti <narayan3119@gmail.com>
Co-authored-by: Manish Gupta <59428681+mguptahub@users.noreply.github.com>
Co-authored-by: Anmol Singh Bhatia <anmolsinghbhatia@plane.so>
* refactor: drag handle component (#4663)
* refactor: checkbox ui component (#4665)
* [WEB-1325] chore: refactor inbox issue store to avoid data loss. (#4640)
* [WEB-1325] chore: refactor inbox issue store to avoid data loss.
* chore: inbox store improvement.
* chore: priority dropdown accepts undefined (#4666)
* chore: added buttonClassName prop to label dropdown (#4671)
* chore: created new constants for marketing website page links (#4670)
* chore: added a prop to render default state conditionally (#4669)
* [WEB-1501] dev: multiple select core components (#4667)
* dev: multiple select core components
* chore: added export statement
* chore: created a new constant for archivable state groups (#4668)
* chore: added primary variant to the alert modal (#4664)
* [WEB-1436] chore: pages improvement. (#4657)
* add empty state if no pages are available.
* set access to private in create page modal when the modal is open form private tab.
* [WEB-1440] chore: update cycle empty state to use project level access. (#4672)
* fix: checkbox ui component (#4675)
* fix: ai buttons overlapping issue (#4621)
* [WEB - 1500] chore: add extra fields on instance and create changelog table to store release change logs (#4673)
* chore: add extra fields on instance and create changelog table to store release change logs
* dev: rename new_version to latest_version
* [WEB - 1505] chore: alter instance id field (#4676)
* chore: instance id
* dev: update to max length
* feat: creating new app dir structure for web app
* fix: moving few pages to app dir
* feat: creating new app dir structure for web app
* fix: moving few pages to app dir
* fix: errors on app dir.
* chore: remove pages routes.
* chore: add sign-in/ sign-up, invitations, onboarding pages.
* fix: instance serializer
* fix: instance register script (#4681)
* fix: instance register script
* dev: remove api key and add latest version and current version in types
* [WEB-1492] fix: resolved issue creation error in layouts while group_by and sub_group_by filters applied in quick add (#4682)
* fix: resolved issue creation error in layouts while group_by and sub_group_by filters applied in quick add
* fix: updated braces in conditions
* fix: inbox issue store update logic. (#4683)
* chore: update package version
* [WEB-1184] feat: issue bulk operations (#4674)
* feat: issue bulk operations
* style: bulk operations action bar
* chore: remove edition separation
* style: fix overlapping of response container in AI popover. (#4684)
* [WEB-1498] style: fix comments reaction alignment. (#4686)
* [WEB-1503] chore: add `autofocus` to name field in inline create/ update state component. (#4685)
* [WEB-1312] fix: trim file name before uploading (#4661)
* fix: trim file name before uploading
* fix: check the cursor position before inserting image
* dev: add trimming for file assets
* dev: add filename validation above if
* dev: make the validation to 50 to support user uploads
---------
Co-authored-by: pablohashescobar <nikhilschacko@gmail.com>
* [WEB-1481] fix: multiple API calls in inbox issues on closed issues tab. (#4691)
* fix: multiple API calls on scroll and closed issues tab.
* fix: pagination loader on initial load.
* feat: Add components required for estimates (#4690)
* Add sortable, radio and typography components
* Remove stray css classes
* Prevent drag of items from other draggable
* Minor cleanup
* Update yarn.lock
* Remove radio input component as it was build on
headless ui v2.0.0 and now we are using v1.7.0
* Fix build errors
* Update dependencies in use memo.
* [WEB-1521] chore: add configuration to enable/disable sign-ups. (#4697)
* fix: regenerating lock file
* fix: docker image build errors
* fix: remove `setupInterceptors` to avoid circular dependency.
* chore: migrate all `accounts` related routes.
* chore: migrate all `profiles` related routes.
* chore: workspace invitation and onboarding migration / fixes.
* chore: installation provider migrations.
* regression: focus changing issue with the peek overview editor (#4700)
* [WEB-1459] chore: save users all / favorite project list collapse state into localstorage. (#4701)
* [WEB-1501] chore: update selected entity details on entities list change (#4702)
* chore: update selected entity detials on entities list change
* chore: addd selectionHelpers as a prop
* [WEB-1517] chore: remove drag handle from list drag block (#4698)
* remove drag handle from list drag block
* align list group header with list item
* rearrange chevron for list subissues and rearrange spaces
* adding default draggable property to control link
* remove unnecessary dependencies for useEffect
* fix: email validation (#4707)
* fix: email validation on complete login or sign up functionality
* dev: add try catch block
* dev: split up code
* dev: empty return
* fix: cache invalidation on new members invite (#4699)
* fix: build test pull request running on non draft PRs (#4708)
* fix: cache invalidation on new members invite (#4699)
* fix: add version max length (#4713)
* chore: migrations for `routing` hooks.
* [WEB-1533] chore: fix alignment issues in List and Spreadsheet view (#4714)
* fix alignment issues in List and Spreadsheet view
* fix spreadsheet indentation
* chore: migration for workspace dashboard/ views/ analytics/ settings and active-cycles.
* chore: handle undefined identifier case
* fix: Overflowing loader in issue edit modal (#4720)
* [WEB-1529] chore: workspace sidebar updates. (#4710)
* fix: temporary fix exiting lines with slashes (#4725)
* [WEB-1537] fix: inline code block size fixed for headers, etc (#4709)
* fix: inline code block size fixed for headers, etc
* feat: persisting focus accurately post converting the code block into text
* fix: typo in error handling
* [WEB-1526] feat: add auto merge behaviour to task lists and fix infinite backspace case (#4703)
* feat: add auto merge behaviour to task lists
* fix: unhandled cases for taskItem and taskList
* fix: css task list such that toggling task list doesn't shift things
* fix: task list jumps around while trying create/delete things in between two task lists
* fix: remove filtering for generic transactions i.e. transactions with some meta data while tying to join things
* chore: migration for profile activity along with headers refactor.
* [WEB-1201] dev: dropdowns (#4721)
* chore: lodash package added
* chore: dropdown key down hook added
* dev: dropdown component
* chore: build error and code refactor
* chore: readme file updated
* chore: added disabled prop to multiple select components (#4724)
* chore: added disabled prop to mutliple select group hoc
* style: fix empty space
* fix: don't add as a sub-issue if parent has been removed (#4731)
* fix: member list item custom menu placement (#4729)
* [WEB-1535] chore: project logo picker improvement (#4718)
* chore: emoji icon picker improvement
* chore: emoji icon picker improvement
* fix: resolved border flicker on issue title (#4727)
* chore: profile activity empty state added (#4732)
* [WEB-1481] fix: inbox issue list update after changing issue status. (#4715)
* style: fix ux copy style on project feature preview page. (#4734)
* chore: remove clear seleciton logic on escape key press (#4735)
* chore: migrations for projects and project issues.
* chore: issue and properties filter dropdown improvement (#4733)
* save all filters and properties for views (#4728)
* chore: migrations for issue details route.
* chore: migration for cycle routes.
* chore: migration for module routes.
* chore: migrations for project views routes.
* chore: migrations for project pages routes.
* chore: migration for project inbox routes.
* chore: migration for project settings routes.
* chore: migrations for draft issues routes.
* chore: migrations for project archives routes.
* chore: remove unused headers.
* temp: comment out auth constant and use-reload-confirmation code to avoid errors.
---------
Co-authored-by: Prateek Shourya <prateekshourya29@gmail.com>
Co-authored-by: rahulramesha <71900764+rahulramesha@users.noreply.github.com>
Co-authored-by: Aaryan Khandelwal <65252264+aaryan610@users.noreply.github.com>
Co-authored-by: M. Palanikannan <73993394+Palanikannan1437@users.noreply.github.com>
Co-authored-by: Anmol Singh Bhatia <121005188+anmolsinghbhatia@users.noreply.github.com>
Co-authored-by: Nikhil <118773738+pablohashescobar@users.noreply.github.com>
Co-authored-by: NarayanBavisetti <narayan3119@gmail.com>
Co-authored-by: Manish Gupta <59428681+mguptahub@users.noreply.github.com>
Co-authored-by: Anmol Singh Bhatia <anmolsinghbhatia@plane.so>
Co-authored-by: guru_sainath <gurusainath007@gmail.com>
Co-authored-by: pablohashescobar <nikhilschacko@gmail.com>
Co-authored-by: Satish Gandham <satish.iitg@gmail.com>
Co-authored-by: Henit Chobisa <chobisa.henit@gmail.com>
Co-authored-by: Aaryan Khandelwal <aaryankhandu123@gmail.com>
2024-06-10 07:07:38 +00:00
|
|
|
const { projectId } = useParams();
|
2024-04-30 11:51:24 +00:00
|
|
|
// hooks
|
|
|
|
|
const { isMobile } = usePlatformOS();
|
|
|
|
|
// store hooks
|
|
|
|
|
const {
|
|
|
|
|
workspace: { workspaceMemberIds },
|
|
|
|
|
} = useMember();
|
|
|
|
|
const {
|
|
|
|
|
currentProjectDisplayFilters: displayFilters,
|
|
|
|
|
currentProjectFilters: filters,
|
|
|
|
|
searchQuery,
|
|
|
|
|
updateDisplayFilters,
|
|
|
|
|
updateFilters,
|
|
|
|
|
updateSearchQuery,
|
|
|
|
|
} = useModuleFilter();
|
2025-02-06 15:11:31 +00:00
|
|
|
const { t } = useTranslation();
|
2024-04-30 11:51:24 +00:00
|
|
|
|
|
|
|
|
// states
|
|
|
|
|
const [isSearchOpen, setIsSearchOpen] = useState(searchQuery !== "" ? true : false);
|
|
|
|
|
|
|
|
|
|
// handlers
|
|
|
|
|
const handleFilters = useCallback(
|
|
|
|
|
(key: keyof TModuleFilters, value: string | string[]) => {
|
|
|
|
|
if (!projectId) return;
|
|
|
|
|
const newValues = filters?.[key] ?? [];
|
|
|
|
|
|
|
|
|
|
if (Array.isArray(value))
|
|
|
|
|
value.forEach((val) => {
|
|
|
|
|
if (!newValues.includes(val)) newValues.push(val);
|
|
|
|
|
else newValues.splice(newValues.indexOf(val), 1);
|
|
|
|
|
});
|
|
|
|
|
else {
|
|
|
|
|
if (filters?.[key]?.includes(value)) newValues.splice(newValues.indexOf(value), 1);
|
|
|
|
|
else newValues.push(value);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
updateFilters(projectId.toString(), { [key]: newValues });
|
|
|
|
|
},
|
|
|
|
|
[filters, projectId, updateFilters]
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
const handleInputKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {
|
|
|
|
|
if (e.key === "Escape") {
|
|
|
|
|
if (searchQuery && searchQuery.trim() !== "") updateSearchQuery("");
|
|
|
|
|
else {
|
|
|
|
|
setIsSearchOpen(false);
|
|
|
|
|
inputRef.current?.blur();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// outside click detector hook
|
|
|
|
|
useOutsideClickDetector(inputRef, () => {
|
|
|
|
|
if (isSearchOpen && searchQuery.trim() === "") setIsSearchOpen(false);
|
|
|
|
|
});
|
2024-05-07 09:26:19 +00:00
|
|
|
|
2024-06-21 09:38:57 +00:00
|
|
|
useEffect(() => {
|
|
|
|
|
if (searchQuery.trim() !== "") setIsSearchOpen(true);
|
|
|
|
|
}, [searchQuery]);
|
|
|
|
|
|
2024-05-08 08:10:58 +00:00
|
|
|
const isFiltersApplied = calculateTotalFilters(filters ?? {}) !== 0 || displayFilters?.favorites;
|
2024-05-07 09:26:19 +00:00
|
|
|
|
2024-04-30 11:51:24 +00:00
|
|
|
return (
|
2026-03-02 15:10:50 +00:00
|
|
|
<div className="hidden h-full items-center gap-2 self-end sm:flex">
|
2024-04-30 11:51:24 +00:00
|
|
|
<div className="flex items-center">
|
|
|
|
|
{!isSearchOpen && (
|
2025-12-12 15:20:14 +00:00
|
|
|
<IconButton
|
|
|
|
|
variant="ghost"
|
|
|
|
|
size="lg"
|
2026-03-02 15:10:50 +00:00
|
|
|
className="p- -mr-1"
|
2024-04-30 11:51:24 +00:00
|
|
|
onClick={() => {
|
|
|
|
|
setIsSearchOpen(true);
|
|
|
|
|
inputRef.current?.focus();
|
|
|
|
|
}}
|
refactor: migrate web icons to @makeplane/propel (#9731)
* refactor: migrate web icons to @makeplane/propel
Replace confirmed icon symbols across apps/web with their audited
@makeplane/propel/icons targets. Unresolved symbols and the State,
Priority and Brand icons stay on their existing imports.
Lucide size props become explicit width/height, including the two
relation icons and the inbox status icon that forward a size variable.
Two aliased imports resolve to targets the file already imported, so
the aliases are dropped rather than importing the same symbol twice.
Widen the member dropdown chain and the AI menu from LucideIcon to
ComponentType<SVGProps<SVGSVGElement>> so both Lucide and Propel icons
satisfy them; both only ever render the icon with a className.
CycleGroupIcon is deliberately not migrated: it dispatches a different
glyph and color per cycle status, which CyclesOutline cannot express.
apps/web already declared @makeplane/propel, so no dependency change
was needed.
* fix: address icon migration review on web
Restore the six user-facing strings the identifier rename overwrote.
The migration replaced every occurrence of a source symbol name,
including ones inside string literals and JSX text, so the GitHub
empty state read "StarOutline us on GitHub", the exporter column key,
header and button label became "DownloadOutline", the project card
action title became "SettingsOutline" and a tooltip became "PinOutline".
Drop 122 strokeWidth props and 10 text-2 classes. Propel glyphs paint
with fill="currentColor", so strokeWidth never changed weight, and
text-2 was a bad conversion of stroke-2, which is a stroke width rather
than a colour and has no meaning on a fill path.
Use StarFilled for the two favorited sidebar stars. Lucide's Star with
fill-yellow-500 was a solid star, and StarOutline is a ring path, so
filling it does not reproduce that shape.
2026-09-02 15:06:43 +00:00
|
|
|
icon={SearchOutline}
|
2025-12-12 15:20:14 +00:00
|
|
|
/>
|
2024-04-30 11:51:24 +00:00
|
|
|
)}
|
|
|
|
|
<div
|
|
|
|
|
className={cn(
|
2026-03-02 15:10:50 +00:00
|
|
|
"ml-auto flex w-0 items-center justify-start gap-1 overflow-hidden rounded-md border border-transparent bg-surface-1 text-placeholder opacity-0 transition-[width] ease-linear",
|
2024-04-30 11:51:24 +00:00
|
|
|
{
|
2026-03-02 15:10:50 +00:00
|
|
|
"w-64 border-subtle px-2.5 py-1.5 opacity-100": isSearchOpen,
|
2024-04-30 11:51:24 +00:00
|
|
|
}
|
|
|
|
|
)}
|
|
|
|
|
>
|
refactor: migrate web icons to @makeplane/propel (#9731)
* refactor: migrate web icons to @makeplane/propel
Replace confirmed icon symbols across apps/web with their audited
@makeplane/propel/icons targets. Unresolved symbols and the State,
Priority and Brand icons stay on their existing imports.
Lucide size props become explicit width/height, including the two
relation icons and the inbox status icon that forward a size variable.
Two aliased imports resolve to targets the file already imported, so
the aliases are dropped rather than importing the same symbol twice.
Widen the member dropdown chain and the AI menu from LucideIcon to
ComponentType<SVGProps<SVGSVGElement>> so both Lucide and Propel icons
satisfy them; both only ever render the icon with a className.
CycleGroupIcon is deliberately not migrated: it dispatches a different
glyph and color per cycle status, which CyclesOutline cannot express.
apps/web already declared @makeplane/propel, so no dependency change
was needed.
* fix: address icon migration review on web
Restore the six user-facing strings the identifier rename overwrote.
The migration replaced every occurrence of a source symbol name,
including ones inside string literals and JSX text, so the GitHub
empty state read "StarOutline us on GitHub", the exporter column key,
header and button label became "DownloadOutline", the project card
action title became "SettingsOutline" and a tooltip became "PinOutline".
Drop 122 strokeWidth props and 10 text-2 classes. Propel glyphs paint
with fill="currentColor", so strokeWidth never changed weight, and
text-2 was a bad conversion of stroke-2, which is a stroke width rather
than a colour and has no meaning on a fill path.
Use StarFilled for the two favorited sidebar stars. Lucide's Star with
fill-yellow-500 was a solid star, and StarOutline is a ring path, so
filling it does not reproduce that shape.
2026-09-02 15:06:43 +00:00
|
|
|
<SearchOutline className="h-3.5 w-3.5" />
|
2024-04-30 11:51:24 +00:00
|
|
|
<input
|
|
|
|
|
ref={inputRef}
|
2025-12-12 15:20:14 +00:00
|
|
|
className="w-full max-w-[234px] border-none bg-transparent text-13 text-primary placeholder:text-placeholder focus:outline-none"
|
2024-04-30 11:51:24 +00:00
|
|
|
placeholder="Search"
|
|
|
|
|
value={searchQuery}
|
|
|
|
|
onChange={(e) => updateSearchQuery(e.target.value)}
|
|
|
|
|
onKeyDown={handleInputKeyDown}
|
|
|
|
|
/>
|
|
|
|
|
{isSearchOpen && (
|
|
|
|
|
<button
|
|
|
|
|
type="button"
|
|
|
|
|
className="grid place-items-center"
|
|
|
|
|
onClick={() => {
|
|
|
|
|
// updateSearchQuery("");
|
|
|
|
|
setIsSearchOpen(false);
|
|
|
|
|
}}
|
|
|
|
|
>
|
refactor: migrate web icons to @makeplane/propel (#9731)
* refactor: migrate web icons to @makeplane/propel
Replace confirmed icon symbols across apps/web with their audited
@makeplane/propel/icons targets. Unresolved symbols and the State,
Priority and Brand icons stay on their existing imports.
Lucide size props become explicit width/height, including the two
relation icons and the inbox status icon that forward a size variable.
Two aliased imports resolve to targets the file already imported, so
the aliases are dropped rather than importing the same symbol twice.
Widen the member dropdown chain and the AI menu from LucideIcon to
ComponentType<SVGProps<SVGSVGElement>> so both Lucide and Propel icons
satisfy them; both only ever render the icon with a className.
CycleGroupIcon is deliberately not migrated: it dispatches a different
glyph and color per cycle status, which CyclesOutline cannot express.
apps/web already declared @makeplane/propel, so no dependency change
was needed.
* fix: address icon migration review on web
Restore the six user-facing strings the identifier rename overwrote.
The migration replaced every occurrence of a source symbol name,
including ones inside string literals and JSX text, so the GitHub
empty state read "StarOutline us on GitHub", the exporter column key,
header and button label became "DownloadOutline", the project card
action title became "SettingsOutline" and a tooltip became "PinOutline".
Drop 122 strokeWidth props and 10 text-2 classes. Propel glyphs paint
with fill="currentColor", so strokeWidth never changed weight, and
text-2 was a bad conversion of stroke-2, which is a stroke width rather
than a colour and has no meaning on a fill path.
Use StarFilled for the two favorited sidebar stars. Lucide's Star with
fill-yellow-500 was a solid star, and StarOutline is a ring path, so
filling it does not reproduce that shape.
2026-09-02 15:06:43 +00:00
|
|
|
<CloseOutline className="h-3 w-3" />
|
2024-04-30 11:51:24 +00:00
|
|
|
</button>
|
|
|
|
|
)}
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
<ModuleOrderByDropdown
|
|
|
|
|
value={displayFilters?.order_by}
|
|
|
|
|
onChange={(val) => {
|
|
|
|
|
if (!projectId || val === displayFilters?.order_by) return;
|
|
|
|
|
updateDisplayFilters(projectId.toString(), {
|
|
|
|
|
order_by: val,
|
|
|
|
|
});
|
|
|
|
|
}}
|
|
|
|
|
/>
|
2024-05-07 09:26:19 +00:00
|
|
|
<FiltersDropdown
|
refactor: migrate web icons to @makeplane/propel (#9731)
* refactor: migrate web icons to @makeplane/propel
Replace confirmed icon symbols across apps/web with their audited
@makeplane/propel/icons targets. Unresolved symbols and the State,
Priority and Brand icons stay on their existing imports.
Lucide size props become explicit width/height, including the two
relation icons and the inbox status icon that forward a size variable.
Two aliased imports resolve to targets the file already imported, so
the aliases are dropped rather than importing the same symbol twice.
Widen the member dropdown chain and the AI menu from LucideIcon to
ComponentType<SVGProps<SVGSVGElement>> so both Lucide and Propel icons
satisfy them; both only ever render the icon with a className.
CycleGroupIcon is deliberately not migrated: it dispatches a different
glyph and color per cycle status, which CyclesOutline cannot express.
apps/web already declared @makeplane/propel, so no dependency change
was needed.
* fix: address icon migration review on web
Restore the six user-facing strings the identifier rename overwrote.
The migration replaced every occurrence of a source symbol name,
including ones inside string literals and JSX text, so the GitHub
empty state read "StarOutline us on GitHub", the exporter column key,
header and button label became "DownloadOutline", the project card
action title became "SettingsOutline" and a tooltip became "PinOutline".
Drop 122 strokeWidth props and 10 text-2 classes. Propel glyphs paint
with fill="currentColor", so strokeWidth never changed weight, and
text-2 was a bad conversion of stroke-2, which is a stroke width rather
than a colour and has no meaning on a fill path.
Use StarFilled for the two favorited sidebar stars. Lucide's Star with
fill-yellow-500 was a solid star, and StarOutline is a ring path, so
filling it does not reproduce that shape.
2026-09-02 15:06:43 +00:00
|
|
|
icon={<FilterOutline className="h-3 w-3" />}
|
2024-05-07 09:26:19 +00:00
|
|
|
title="Filters"
|
|
|
|
|
placement="bottom-end"
|
|
|
|
|
isFiltersApplied={isFiltersApplied}
|
|
|
|
|
>
|
2024-04-30 11:51:24 +00:00
|
|
|
<ModuleFiltersSelection
|
|
|
|
|
displayFilters={displayFilters ?? {}}
|
|
|
|
|
filters={filters ?? {}}
|
|
|
|
|
handleDisplayFiltersUpdate={(val) => {
|
|
|
|
|
if (!projectId) return;
|
|
|
|
|
updateDisplayFilters(projectId.toString(), val);
|
|
|
|
|
}}
|
|
|
|
|
handleFiltersUpdate={handleFilters}
|
|
|
|
|
memberIds={workspaceMemberIds ?? undefined}
|
|
|
|
|
/>
|
|
|
|
|
</FiltersDropdown>
|
2026-03-02 15:10:50 +00:00
|
|
|
<div className="hidden items-center gap-1 rounded-sm bg-layer-3 p-1 md:flex">
|
2024-04-30 11:51:24 +00:00
|
|
|
{MODULE_VIEW_LAYOUTS.map((layout) => (
|
refactor: migrate web @plane/propel Tooltip to @makeplane/propel (#9726)
* refactor: migrate web @plane/propel Tooltip to @makeplane/propel
Move all 144 Tooltip call sites in apps/web from the in-repo
@plane/propel/tooltip to the published
@makeplane/propel/components/tooltip.
Prop mapping applied on every site:
- tooltipContent -> label (string)
- tooltipHeading -> folded into label + layout="stacked"
- position -> side/align (top/center omitted; it is the published default)
- isMobile -> disabled (OR'd with any existing disabled)
- renderByDefault -> dropped; the in-repo Tooltip declared but never
used it
- className -> dropped, or mapped to sideOffset/alignOffset (3 sites)
layout is "single" for short bounded copy and "stacked" wherever the
label interpolates unbounded data (names, titles, URLs, joined lists) —
"single" is whitespace-nowrap, so long labels would overflow.
Behavior change: tooltips now open after the published 600ms default
instead of the in-repo 200ms. delay is deliberately not set per site.
ReactNode content:
- Editor toolbars map name + <kbd>shortcut</kbd> onto the published
shortcut prop
- <br/> and fragment copy folds into one wrapping stacked string
- stickies/action-bar rendered a full <StickyNote> hover preview, not a
tooltip; it moves to PreviewCard/PreviewCardTrigger/PreviewCardContent
Published label is a string, so DropdownButtonProps.tooltipContent,
date-range's customTooltipContent, and the two rich-filters components
narrow from ReactNode to string. rich-filters/root.tsx guards
filterConfig.tooltipContent, which stays ReactNode in @plane/types.
Folded labels use ?? "" where the source expression is nullable so they
cannot render the string "undefined" where the in-repo tooltip rendered
nothing.
Zero @plane/propel/tooltip references remain under apps/web.
* fix: address review findings on the Tooltip migration
Accessibility (CodeRabbit): Base UI wires no aria-describedby or
aria-labelledby between the tooltip trigger and its popup — verified by
rendering the published Tooltip and inspecting the DOM, the trigger comes
out as `<button data-base-ui-tooltip-trigger>` with no aria at all and the
popup has role="tooltip" but no id. So a `label` never reaches assistive
tech, and the four icon-only triggers announced as bare "button". Add an
explicit aria-label at each: extended-project-sidebar, layout-switcher,
layout-selection, and access-field. Pre-existing gap (the in-repo tooltip
sat on the same unwired Base UI trigger), fixed here since the PR touches
these sites.
AccessField now requires i18n_label and drops the optional pre-i18n
`label`, so the computed label is non-empty by construction and serves as
both the tooltip copy and the accessible name. Its only caller already
passes i18n_label for every specifier, which also retires the TODO.
Correctness: inbox issue-properties interpolated a nullable name into a
template literal, so a duplicate work item with no name rendered the
literal "undefined"; pass the name with ?? "" instead.
CodeQL useless conditional: drop `|| ""` from stickyId in action-bar —
both call sites already sit behind a guard proving recentStickyId truthy,
and StickyNote treats "" and undefined identically.
React Doctor prefer-module-scope-static-value: hoist badgeContent to
module scope as BADGE_CONTENT; it holds only static strings.
React Doctor js-combine-iterations: collapse the filter/map chains to a
single pass. The two layout switchers skip inside map instead of
pre-filtering; LabelSummary reduces project labels into the selected
names once rather than filter -> map -> join.
2026-09-01 11:45:12 +00:00
|
|
|
<Tooltip key={layout.key} label={t(layout.i18n_title)} disabled={isMobile}>
|
2024-04-30 11:51:24 +00:00
|
|
|
<button
|
|
|
|
|
type="button"
|
|
|
|
|
className={cn(
|
2025-12-12 15:20:14 +00:00
|
|
|
"group grid h-5.5 w-7 place-items-center overflow-hidden rounded-sm transition-all hover:bg-layer-transparent-hover",
|
2024-04-30 11:51:24 +00:00
|
|
|
{
|
2025-12-12 15:20:14 +00:00
|
|
|
"bg-layer-transparent-active hover:bg-layer-transparent-active":
|
|
|
|
|
displayFilters?.layout === layout.key,
|
2024-04-30 11:51:24 +00:00
|
|
|
}
|
|
|
|
|
)}
|
|
|
|
|
onClick={() => {
|
|
|
|
|
if (!projectId) return;
|
|
|
|
|
updateDisplayFilters(projectId.toString(), { layout: layout.key });
|
|
|
|
|
}}
|
|
|
|
|
>
|
2025-02-06 15:11:31 +00:00
|
|
|
<ModuleLayoutIcon layoutType={layout.key} />
|
2024-04-30 11:51:24 +00:00
|
|
|
</button>
|
|
|
|
|
</Tooltip>
|
|
|
|
|
))}
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
);
|
|
|
|
|
});
|