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}
+ >
+
+
+
);
});