import { useEffect, useState } from "react"; import { observer } from "mobx-react"; import { Controller, useForm } from "react-hook-form"; // types import { IProjectView, IIssueFilterOptions } from "@plane/types"; // ui import { Button, EmojiIconPicker, EmojiIconPickerTypes, Input, PhotoFilterIcon, TextArea } from "@plane/ui"; // components import { Logo } from "@/components/common"; import { AppliedFiltersList, FilterSelection, FiltersDropdown } from "@/components/issues"; // constants import { ISSUE_DISPLAY_FILTERS_BY_LAYOUT } from "@/constants/issue"; // helpers import { convertHexEmojiToDecimal } from "@/helpers/emoji.helper"; // hooks import { useLabel, useMember, useProject, useProjectState } from "@/hooks/store"; type Props = { data?: IProjectView | null; handleClose: () => void; handleFormSubmit: (values: IProjectView) => Promise; preLoadedData?: Partial | null; }; const defaultValues: Partial = { name: "", description: "", }; export const ProjectViewForm: React.FC = observer((props) => { const { handleFormSubmit, handleClose, data, preLoadedData } = props; // state const [isOpen, setIsOpen] = useState(false); // store hooks const { currentProjectDetails } = useProject(); const { projectStates } = useProjectState(); const { projectLabels } = useLabel(); const { project: { projectMemberIds }, } = useMember(); // form info const { control, formState: { errors, isSubmitting }, handleSubmit, reset, setValue, watch, } = useForm({ defaultValues, }); const logoValue = watch("logo_props"); const selectedFilters: IIssueFilterOptions = {}; Object.entries(watch("filters") ?? {}).forEach(([key, value]) => { if (!value) return; if (Array.isArray(value) && value.length === 0) return; selectedFilters[key as keyof IIssueFilterOptions] = value; }); // for removing filters from a key const handleRemoveFilter = (key: keyof IIssueFilterOptions, value: string | null) => { // If value is null then remove all the filters of that key if (!value) { setValue("filters", { ...selectedFilters, [key]: null, }); return; } const newValues = selectedFilters?.[key] ?? []; if (Array.isArray(value)) { value.forEach((val) => { if (newValues.includes(val)) newValues.splice(newValues.indexOf(val), 1); }); } else { if (selectedFilters?.[key]?.includes(value)) newValues.splice(newValues.indexOf(value), 1); } setValue("filters", { ...selectedFilters, [key]: newValues, }); }; const handleCreateUpdateView = async (formData: IProjectView) => { await handleFormSubmit({ name: formData.name, description: formData.description, logo_props: formData.logo_props, filters: formData.filters, display_filters: formData.display_filters, display_properties: formData.display_properties, } as IProjectView); reset({ ...defaultValues, }); }; const clearAllFilters = () => { if (!selectedFilters) return; setValue("filters", {}); }; useEffect(() => { reset({ ...defaultValues, ...preLoadedData, ...data, }); }, [data, preLoadedData, reset]); return (

{data ? "Update" : "Create"} View

setIsOpen(val)} className="flex items-center justify-center flex-shrink0" buttonClassName="flex items-center justify-center" label={ <> {logoValue?.in_use ? ( ) : ( )} } onChange={(val: any) => { let logoValue = {}; if (val?.type === "emoji") logoValue = { value: convertHexEmojiToDecimal(val.value.unified), url: val.value.imageUrl, }; else if (val?.type === "icon") logoValue = val.value; setValue("logo_props", { in_use: val?.type, [val?.type]: logoValue, }); setIsOpen(false); }} defaultIconColor={logoValue?.in_use && logoValue?.in_use === "icon" ? logoValue?.icon?.color : undefined} defaultOpen={ logoValue?.in_use && logoValue?.in_use === "emoji" ? EmojiIconPickerTypes.EMOJI : EmojiIconPickerTypes.ICON } />
( )} /> {errors?.name?.message}
(