diff --git a/web/core/components/views/form.tsx b/web/core/components/views/form.tsx index 93b3fcbc2e8..e195099dc15 100644 --- a/web/core/components/views/form.tsx +++ b/web/core/components/views/form.tsx @@ -5,12 +5,12 @@ import { observer } from "mobx-react"; import { Controller, useForm } from "react-hook-form"; import { Layers } from "lucide-react"; // types -import { IProjectView, IIssueFilterOptions } from "@plane/types"; +import { IProjectView, IIssueFilterOptions, IIssueDisplayProperties, IIssueDisplayFilterOptions } from "@plane/types"; // ui import { Button, EmojiIconPicker, EmojiIconPickerTypes, Input, TextArea } from "@plane/ui"; // components import { Logo } from "@/components/common"; -import { AppliedFiltersList, FilterSelection, FiltersDropdown } from "@/components/issues"; +import { AppliedFiltersList, DisplayFiltersSelection, FilterSelection, FiltersDropdown } from "@/components/issues"; // constants import { EIssueLayoutTypes, ISSUE_DISPLAY_FILTERS_BY_LAYOUT } from "@/constants/issue"; import { EViewAccess } from "@/constants/views"; @@ -34,7 +34,7 @@ const defaultValues: Partial = { description: "", access: EViewAccess.PUBLIC, display_properties: getComputedDisplayProperties(), - display_filters: getComputedDisplayFilters(), + display_filters: { ...getComputedDisplayFilters(), group_by: "state" }, }; export const ProjectViewForm: React.FC = observer((props) => { @@ -224,46 +224,87 @@ export const ProjectViewForm: React.FC = observer((props) => { ( - onChange(selectedValue)} - value={value} - /> - )} - /> - ( - - { - const newValues = filters?.[key] ?? []; + name="display_filters" + render={({ field: { onChange: onDisplayFiltersChange, value: displayFilters } }) => ( + <> + {/* layout dropdown */} + + onDisplayFiltersChange({ + ...displayFilters, + layout: selectedValue, + }) + } + value={displayFilters.layout} + /> + + {/* filters dropdown */} + ( + + { + const newValues = filters?.[key] ?? []; + + if (Array.isArray(value)) { + value.forEach((val) => { + if (!newValues.includes(val)) newValues.push(val); + }); + } else { + if (filters?.[key]?.includes(value)) newValues.splice(newValues.indexOf(value), 1); + else newValues.push(value); + } - if (Array.isArray(value)) { - value.forEach((val) => { - if (!newValues.includes(val)) newValues.push(val); - }); - } else { - if (filters?.[key]?.includes(value)) newValues.splice(newValues.indexOf(value), 1); - else newValues.push(value); - } + onChange({ + ...filters, + [key]: newValues, + }); + }} + layoutDisplayFiltersOptions={ISSUE_DISPLAY_FILTERS_BY_LAYOUT.issues[displayFilters.layout]} + labels={projectLabels ?? undefined} + memberIds={projectMemberIds ?? undefined} + states={projectStates} + cycleViewDisabled={!currentProjectDetails?.cycle_view} + moduleViewDisabled={!currentProjectDetails?.module_view} + /> + + )} + /> - onChange({ - ...filters, - [key]: newValues, - }); - }} - layoutDisplayFiltersOptions={ISSUE_DISPLAY_FILTERS_BY_LAYOUT.issues.list} - labels={projectLabels ?? undefined} - memberIds={projectMemberIds ?? undefined} - states={projectStates} - cycleViewDisabled={!currentProjectDetails?.cycle_view} - moduleViewDisabled={!currentProjectDetails?.module_view} + {/* display filters dropdown */} + ( + + ) => { + onDisplayFiltersChange({ + ...displayFilters, + ...updatedDisplayFilter, + }); + }} + displayProperties={displayProperties ?? {}} + handleDisplayPropertiesUpdate={( + updatedDisplayProperties: Partial + ) => { + onDisplayPropertiesChange({ + ...displayProperties, + ...updatedDisplayProperties, + }); + }} + cycleViewDisabled={!currentProjectDetails?.cycle_view} + moduleViewDisabled={!currentProjectDetails?.module_view} + /> + + )} /> - + )} /> diff --git a/web/core/components/workspace/views/form.tsx b/web/core/components/workspace/views/form.tsx index 9f792df3bc0..6fce455a825 100644 --- a/web/core/components/workspace/views/form.tsx +++ b/web/core/components/workspace/views/form.tsx @@ -4,11 +4,11 @@ import { useEffect } from "react"; import { observer } from "mobx-react"; import { Controller, useForm } from "react-hook-form"; // types -import { IIssueFilterOptions, IWorkspaceView } from "@plane/types"; +import { IIssueDisplayFilterOptions, IIssueDisplayProperties, IIssueFilterOptions, IWorkspaceView } from "@plane/types"; // ui import { Button, Input, TextArea } from "@plane/ui"; // components -import { AppliedFiltersList, FilterSelection, FiltersDropdown } from "@/components/issues"; +import { AppliedFiltersList, DisplayFiltersSelection, FilterSelection, FiltersDropdown } from "@/components/issues"; // constants import { ISSUE_DISPLAY_FILTERS_BY_LAYOUT } from "@/constants/issue"; import { EViewAccess } from "@/constants/views"; @@ -155,6 +155,7 @@ export const WorkspaceViewForm: React.FC = observer((props) => {
+ {/* filters dropdown */} = observer((props) => { )} /> + + {/* display filters dropdown */} + ( + ( + + ) => { + onDisplayFiltersChange({ + ...displayFilters, + ...updatedDisplayFilter, + }); + }} + displayProperties={displayProperties ?? {}} + handleDisplayPropertiesUpdate={(updatedDisplayProperties: Partial) => { + onDisplayPropertiesChange({ + ...displayProperties, + ...updatedDisplayProperties, + }); + }} + /> + + )} + /> + )} + />
{selectedFilters && Object.keys(selectedFilters).length > 0 && (