From 17027bc517e2e260a98c8365eb69deeb8d3175b0 Mon Sep 17 00:00:00 2001 From: Palanikannan M Date: Fri, 12 Sep 2025 15:39:18 +0530 Subject: [PATCH] Change the header of the pages --- .../web/core/components/pages/header/base.tsx | 95 +++++++++++++++++++ .../web/core/components/pages/header/root.tsx | 93 ++---------------- .../core/components/pages/pages-list-view.tsx | 7 +- 3 files changed, 106 insertions(+), 89 deletions(-) create mode 100644 apps/web/core/components/pages/header/base.tsx diff --git a/apps/web/core/components/pages/header/base.tsx b/apps/web/core/components/pages/header/base.tsx new file mode 100644 index 00000000000..7a15c11d761 --- /dev/null +++ b/apps/web/core/components/pages/header/base.tsx @@ -0,0 +1,95 @@ +import { useCallback, ReactNode } from "react"; +import { observer } from "mobx-react"; +import { ListFilter } from "lucide-react"; +// plane imports +import { useTranslation } from "@plane/i18n"; +import { type TPageFilterProps } from "@plane/types"; +import { Header, EHeaderVariant } from "@plane/ui"; +import { calculateTotalFilters } from "@plane/utils"; +// components +import { FiltersDropdown } from "@/components/issues/issue-layouts/filters"; +// hooks +import { useMember } from "@/hooks/store/use-member"; +// plane web hooks +import { EPageStoreType, usePageStore } from "@/plane-web/hooks/store"; +// local imports +import { PageAppliedFiltersList } from "../list/applied-filters"; +import { PageFiltersSelection } from "../list/filters"; +import { PageOrderByDropdown } from "../list/order-by"; +import { PageSearchInput } from "../list/search-input"; + +type BasePagesListHeaderRootProps = { + storeType: EPageStoreType; + tabNavigationComponent: ReactNode; +}; + +export const BasePagesListHeaderRoot: React.FC = observer((props) => { + const { storeType, tabNavigationComponent } = props; + const { t } = useTranslation(); + // store hooks + const { filters, updateFilters, clearAllFilters } = usePageStore(storeType); + const { + workspace: { workspaceMemberIds }, + } = useMember(); + + const handleRemoveFilter = useCallback( + (key: keyof TPageFilterProps, value: string | null) => { + let newValues = filters.filters?.[key]; + + if (key === "favorites") newValues = !!value; + if (Array.isArray(newValues)) { + if (!value) newValues = []; + else newValues = newValues.filter((val) => val !== value); + } + + updateFilters("filters", { [key]: newValues }); + }, + [filters.filters, updateFilters] + ); + + const isFiltersApplied = calculateTotalFilters(filters?.filters ?? {}) !== 0; + + return ( + <> +
+ {tabNavigationComponent} + + updateFilters("searchQuery", val)} + /> + { + if (val.key) updateFilters("sortKey", val.key); + if (val.order) updateFilters("sortBy", val.order); + }} + /> + } + title={t("common.filters")} + placement="bottom-end" + isFiltersApplied={isFiltersApplied} + > + + + +
+ {calculateTotalFilters(filters?.filters ?? {}) !== 0 && ( +
+ +
+ )} + + ); +}); diff --git a/apps/web/core/components/pages/header/root.tsx b/apps/web/core/components/pages/header/root.tsx index bd4012846a8..c7ae729eb57 100644 --- a/apps/web/core/components/pages/header/root.tsx +++ b/apps/web/core/components/pages/header/root.tsx @@ -1,100 +1,27 @@ -import { useCallback } from "react"; import { observer } from "mobx-react"; -import { ListFilter } from "lucide-react"; // plane imports -import { useTranslation } from "@plane/i18n"; -import { TPageFilterProps, TPageNavigationTabs } from "@plane/types"; -import { Header, EHeaderVariant } from "@plane/ui"; -import { calculateTotalFilters } from "@plane/utils"; -// components -import { FiltersDropdown } from "@/components/issues/issue-layouts/filters"; -// hooks -import { useMember } from "@/hooks/store/use-member"; +import { TPageNavigationTabs } from "@plane/types"; // plane web hooks -import { EPageStoreType, usePageStore } from "@/plane-web/hooks/store"; +import { EPageStoreType } from "@/plane-web/hooks/store"; // local imports -import { PageAppliedFiltersList } from "../list/applied-filters"; -import { PageFiltersSelection } from "../list/filters"; -import { PageOrderByDropdown } from "../list/order-by"; -import { PageSearchInput } from "../list/search-input"; import { PageTabNavigation } from "../list/tab-navigation"; +import { BasePagesListHeaderRoot } from "./base"; type Props = { pageType: TPageNavigationTabs; projectId: string; - storeType: EPageStoreType; workspaceSlug: string; }; export const PagesListHeaderRoot: React.FC = observer((props) => { - const { pageType, projectId, storeType, workspaceSlug } = props; - const { t } = useTranslation(); - // store hooks - const { filters, updateFilters, clearAllFilters } = usePageStore(storeType); - const { - workspace: { workspaceMemberIds }, - } = useMember(); - - const handleRemoveFilter = useCallback( - (key: keyof TPageFilterProps, value: string | null) => { - let newValues = filters.filters?.[key]; - - if (key === "favorites") newValues = !!value; - if (Array.isArray(newValues)) { - if (!value) newValues = []; - else newValues = newValues.filter((val) => val !== value); - } - - updateFilters("filters", { [key]: newValues }); - }, - [filters.filters, updateFilters] - ); - - const isFiltersApplied = calculateTotalFilters(filters?.filters ?? {}) !== 0; + const { pageType, projectId, workspaceSlug } = props; return ( - <> -
- - - - - updateFilters("searchQuery", val)} - /> - { - if (val.key) updateFilters("sortKey", val.key); - if (val.order) updateFilters("sortBy", val.order); - }} - /> - } - title={t("common.filters")} - placement="bottom-end" - isFiltersApplied={isFiltersApplied} - > - - - -
- {calculateTotalFilters(filters?.filters ?? {}) !== 0 && ( -
- -
- )} - + + } + /> ); }); diff --git a/apps/web/core/components/pages/pages-list-view.tsx b/apps/web/core/components/pages/pages-list-view.tsx index d4d4b6157a6..c8565744e4f 100644 --- a/apps/web/core/components/pages/pages-list-view.tsx +++ b/apps/web/core/components/pages/pages-list-view.tsx @@ -30,12 +30,7 @@ export const PagesListView: React.FC = observer((props) => {
{/* tab header */} {isAnyPageAvailable && ( - + )} {children}