diff --git a/web/app/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/views/(list)/layout.tsx b/web/app/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/views/(list)/layout.tsx index 69493402d..3143612c2 100644 --- a/web/app/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/views/(list)/layout.tsx +++ b/web/app/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/views/(list)/layout.tsx @@ -3,11 +3,12 @@ import { AppHeader, ContentWrapper } from "@/components/core"; // local components import { ProjectViewsHeader } from "./header"; +import { ViewMobileHeader } from "./mobile-header"; export default function ProjectViewsListLayout({ children }: { children: React.ReactNode }) { return ( <> - } /> + } mobileHeader={} /> {children} ); diff --git a/web/app/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/views/(list)/mobile-header.tsx b/web/app/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/views/(list)/mobile-header.tsx new file mode 100644 index 000000000..f710ee041 --- /dev/null +++ b/web/app/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/views/(list)/mobile-header.tsx @@ -0,0 +1,57 @@ +"use client"; + +import { observer } from "mobx-react"; +// icons +import { ChevronDown, ListFilter } from "lucide-react"; +// components +import { FiltersDropdown } from "@/components/issues/issue-layouts"; +import { ViewFiltersSelection } from "@/components/views/filters/filter-selection"; +import { ViewOrderByDropdown } from "@/components/views/filters/order-by"; +// hooks +import { useMember, useProjectView } from "@/hooks/store"; + +export const ViewMobileHeader = observer(() => { + // store hooks + const { filters, updateFilters } = useProjectView(); + const { + project: { projectMemberIds }, + } = useMember(); + + return ( + <> +
+
+ { + if (val.key) updateFilters("sortKey", val.key); + if (val.order) updateFilters("sortBy", val.order); + }} + isMobile + /> +
+
+ } + title="Filters" + placement="bottom-end" + isFiltersApplied={false} + menuButton={ + + Filters + + + } + > + + +
+
+ + ); +}); diff --git a/web/core/components/views/filters/order-by.tsx b/web/core/components/views/filters/order-by.tsx index 3f607e53d..e00c18ca1 100644 --- a/web/core/components/views/filters/order-by.tsx +++ b/web/core/components/views/filters/order-by.tsx @@ -7,17 +7,16 @@ import { TViewFiltersSortBy, TViewFiltersSortKey } from "@plane/types"; import { CustomMenu, getButtonStyling } from "@plane/ui"; // constants import { VIEW_SORTING_KEY_OPTIONS } from "@/constants/views"; -// helpers -import { cn } from "@/helpers/common.helper"; type Props = { onChange: (value: { key?: TViewFiltersSortKey; order?: TViewFiltersSortBy }) => void; sortBy: TViewFiltersSortBy; sortKey: TViewFiltersSortKey; + isMobile?: boolean; }; export const ViewOrderByDropdown: React.FC = (props) => { - const { onChange, sortBy, sortKey } = props; + const { onChange, sortBy, sortKey, isMobile = false } = props; const orderByDetails = VIEW_SORTING_KEY_OPTIONS.find((option) => sortKey === option.key); const isDescending = sortBy === "desc"; @@ -27,14 +26,20 @@ export const ViewOrderByDropdown: React.FC = (props) => { { key: "desc", label: "Descending", isSelected: isDescending }, ]; + const buttonClassName = isMobile + ? "flex items-center text-sm text-custom-text-200" + : `${getButtonStyling("neutral-primary", "sm")} px-2 text-custom-text-300`; + + const chevronClassName = isMobile ? "h-4 w-4 text-custom-text-200" : "h-3 w-3"; + return ( - - {orderByDetails?.label} - - + + {!isMobile && } + {orderByDetails?.label} + + } placement="bottom-end" maxHeight="lg" diff --git a/web/core/components/views/view-list-header.tsx b/web/core/components/views/view-list-header.tsx index 952472ef5..a055b4573 100644 --- a/web/core/components/views/view-list-header.tsx +++ b/web/core/components/views/view-list-header.tsx @@ -89,26 +89,28 @@ export const ViewListHeader = observer(() => { )} - { - if (val.key) updateFilters("sortKey", val.key); - if (val.order) updateFilters("sortBy", val.order); - }} - /> - } - title="Filters" - placement="bottom-end" - isFiltersApplied={false} - > - + { + if (val.key) updateFilters("sortKey", val.key); + if (val.order) updateFilters("sortBy", val.order); + }} /> - + } + title="Filters" + placement="bottom-end" + isFiltersApplied={false} + > + + + ); });