From 0decde5a70e829a3f7e89ea7073f79a9ea435ccf Mon Sep 17 00:00:00 2001 From: Prateek Shourya Date: Mon, 29 Sep 2025 15:55:01 +0530 Subject: [PATCH 1/3] [WEB-4969] feat: add toggle button for work item filters row visibility --- .../[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 | 86 +++++++++++++------ .../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, 389 insertions(+), 139 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 0dcf1f534fb..79f74b32b64 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 @@ -37,6 +37,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"; @@ -208,6 +209,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 @@ -74,7 +75,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 @@ -196,6 +197,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 66416cd43cc..594d8a48707 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 @@ -30,6 +30,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"; @@ -44,8 +45,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 }, @@ -162,8 +164,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 ? (