From 7ce21a6488fc7d38a394b02f5b09c01f7300a4ed Mon Sep 17 00:00:00 2001 From: Prateek Shourya Date: Tue, 30 Sep 2025 18:19:43 +0530 Subject: [PATCH] [WEB-4969] feat: add toggle button for work item filters row visibility (#7865) * [WEB-4969] feat: add toggle button for work item filters row visibility * fix: improve error handling in filter update and refine visibility condition check * chore: correct visibility toggle parameter in filter store --- .../[projectId]/cycles/(detail)/header.tsx | 2 + .../[projectId]/modules/(detail)/header.tsx | 24 +++-- .../views/(detail)/[viewId]/header.tsx | 17 ++-- .../(projects)/workspace-views/header.tsx | 53 +++++------ .../issues/archived-issues-header.tsx | 11 ++- apps/web/core/components/issues/filters.tsx | 2 + .../roots/all-issue-layout-root.tsx | 2 +- .../roots/archived-issue-layout-root.tsx | 2 +- .../issue-layouts/roots/cycle-layout-root.tsx | 2 +- .../roots/module-layout-root.tsx | 2 +- .../roots/project-layout-root.tsx | 2 +- .../roots/project-view-layout-root.tsx | 2 +- .../profile/profile-issues-filter.tsx | 23 ++--- .../components/profile/profile-issues.tsx | 2 +- .../rich-filters/add-filters-button.tsx | 4 +- .../components/rich-filters/filters-row.tsx | 93 +++++++++++++------ .../rich-filters/filters-toggle.tsx | 76 +++++++++++++++ apps/web/core/components/views/form.tsx | 5 +- .../work-item-filters/filters-hoc/base.tsx | 10 +- .../work-item-filters/filters-hoc/shared.ts | 9 +- ...k-item-filters-row.tsx => filters-row.tsx} | 5 +- .../work-item-filters/filters-toggle.tsx | 22 +++++ .../core/components/workspace/views/form.tsx | 5 +- .../use-work-item-filter-instance.ts | 6 +- packages/constants/src/rich-filters/option.ts | 20 ++++ .../src/store/rich-filters/config-manager.ts | 2 +- .../src/store/rich-filters/filter-helpers.ts | 66 ++++++++++++- .../src/store/rich-filters/filter.ts | 28 +++++- .../store/work-item-filters/filter.store.ts | 29 +++--- .../src/store/work-item-filters/index.ts | 1 + .../src/store/work-item-filters/shared.ts | 8 ++ 31 files changed, 394 insertions(+), 141 deletions(-) create mode 100644 apps/web/core/components/rich-filters/filters-toggle.tsx rename apps/web/core/components/work-item-filters/{work-item-filters-row.tsx => filters-row.tsx} (74%) create mode 100644 apps/web/core/components/work-item-filters/filters-toggle.tsx create mode 100644 packages/shared-state/src/store/work-item-filters/shared.ts diff --git a/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/cycles/(detail)/header.tsx b/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/cycles/(detail)/header.tsx index 3ff62390b..848e0bfdb 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/cycles/(detail)/header.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/cycles/(detail)/header.tsx @@ -38,6 +38,7 @@ import { LayoutSelection, MobileLayoutSelection, } from "@/components/issues/issue-layouts/filters"; +import { WorkItemFiltersToggle } from "@/components/work-item-filters/filters-toggle"; // hooks import { useCommandPalette } from "@/hooks/store/use-command-palette"; import { useCycle } from "@/hooks/store/use-cycle"; @@ -209,6 +210,7 @@ export const CycleIssuesHeader: React.FC = observer(() => { activeLayout={activeLayout} /> + { const [analyticsModal, setAnalyticsModal] = useState(false); // router const router = useAppRouter(); - const { workspaceSlug, projectId, moduleId } = useParams(); + const { workspaceSlug, projectId, moduleId: routerModuleId } = useParams(); + const moduleId = routerModuleId ? routerModuleId.toString() : undefined; // hooks const { isMobile } = usePlatformOS(); // store hooks @@ -75,7 +76,7 @@ export const ModuleIssuesHeader: React.FC = observer(() => { // derived values const isSidebarCollapsed = storedValue ? (storedValue === "true" ? true : false) : false; const activeLayout = issueFilters?.displayFilters?.layout; - const moduleDetails = moduleId ? getModuleById(moduleId.toString()) : undefined; + const moduleDetails = moduleId ? getModuleById(moduleId) : undefined; const canUserCreateIssue = allowPermissions( [EUserPermissions.ADMIN, EUserPermissions.MEMBER], EUserPermissionsLevel.PROJECT @@ -197,6 +198,7 @@ export const ModuleIssuesHeader: React.FC = observer(() => { activeLayout={activeLayout} /> + {moduleId && } { > - + {moduleId && ( + + )} diff --git a/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/views/(detail)/[viewId]/header.tsx b/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/views/(detail)/[viewId]/header.tsx index 83d94e5dc..355aadd76 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/views/(detail)/[viewId]/header.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/views/(detail)/[viewId]/header.tsx @@ -31,6 +31,7 @@ import { SwitcherIcon, SwitcherLabel } from "@/components/common/switcher-label" import { DisplayFiltersSelection, FiltersDropdown, LayoutSelection } from "@/components/issues/issue-layouts/filters"; // constants import { ViewQuickActions } from "@/components/views/quick-actions"; +import { WorkItemFiltersToggle } from "@/components/work-item-filters/filters-toggle"; // hooks import { useCommandPalette } from "@/hooks/store/use-command-palette"; import { useIssues } from "@/hooks/store/use-issues"; @@ -45,8 +46,9 @@ export const ProjectViewIssuesHeader: React.FC = observer(() => { // refs const parentRef = useRef(null); // router - const { workspaceSlug, projectId, viewId } = useParams(); const router = useAppRouter(); + const { workspaceSlug, projectId, viewId: routerViewId } = useParams(); + const viewId = routerViewId ? routerViewId.toString() : undefined; // store hooks const { issuesFilter: { issueFilters, updateFilters }, @@ -163,8 +165,8 @@ export const ProjectViewIssuesHeader: React.FC = observer(() => { )} - {!viewDetails?.is_locked ? ( - <> + <> + {!viewDetails.is_locked && ( { onChange={(layout) => handleLayoutChange(layout)} selectedLayout={activeLayout} /> + )} + {viewId && } + {!viewDetails.is_locked && ( { moduleViewDisabled={!currentProjectDetails?.module_view} /> - - ) : ( - <> - )} + )} + {canUserCreateIssue ? (