plane/web/components/custom-attributes/objects-select.tsx

86 lines
2.3 KiB
TypeScript
Raw Normal View History

import { useEffect } from "react";
import { useRouter } from "next/router";
import { observer } from "mobx-react-lite";
2023-10-02 07:39:59 +00:00
// mobx store
import { useMobxStore } from "lib/mobx/store-provider";
// ui
import { CustomSearchSelect } from "components/ui";
2023-10-02 07:39:59 +00:00
// icons
2023-09-19 13:57:19 +00:00
import { TableProperties } from "lucide-react";
2023-10-02 07:39:59 +00:00
// helpers
import { renderEmoji } from "helpers/emoji.helper";
type Props = {
onChange: (val: string | null) => void;
projectId: string;
value: string | null;
};
export const ObjectsSelect: React.FC<Props> = observer(({ onChange, projectId, value }) => {
const router = useRouter();
const { workspaceSlug } = router.query;
2023-09-20 16:00:12 +00:00
const { customAttributes } = useMobxStore();
const options:
| {
value: any;
query: string;
2023-09-19 13:57:19 +00:00
content: JSX.Element;
}[]
| undefined = customAttributes.objects?.map((object) => ({
value: object.id,
query: object.display_name,
2023-09-19 13:57:19 +00:00
content: (
<div className="flex items-center gap-2 text-xs">
{object.icon ? renderEmoji(object.icon) : <TableProperties size={14} strokeWidth={1.5} />}
<span>{object.display_name}</span>
2023-09-19 13:57:19 +00:00
</div>
),
}));
2023-09-19 13:57:19 +00:00
options?.unshift({
value: null,
query: "default",
content: (
<div className="flex items-center gap-2">
<TableProperties size={14} strokeWidth={1.5} />
<span>Default</span>
</div>
),
});
useEffect(() => {
if (!workspaceSlug) return;
if (!customAttributes.objects)
customAttributes.fetchObjects(workspaceSlug.toString(), projectId);
2023-09-20 16:00:12 +00:00
}, [customAttributes, projectId, workspaceSlug]);
const selectedObject = customAttributes.objects?.find((o) => o.id === value);
2023-09-19 13:57:19 +00:00
return (
<CustomSearchSelect
2023-09-19 13:57:19 +00:00
label={
<span className="flex items-center gap-2">
<div className="flex items-center gap-2 text-xs">
{selectedObject?.icon ? (
renderEmoji(selectedObject.icon)
2023-09-19 13:57:19 +00:00
) : (
<TableProperties size={14} strokeWidth={1.5} />
)}
<span>{selectedObject?.display_name ?? "Default"}</span>
2023-09-19 13:57:19 +00:00
</div>
</span>
}
value={value}
maxHeight="md"
optionsClassName="!min-w-[10rem]"
onChange={onChange}
options={options}
position="right"
2023-09-19 13:34:54 +00:00
noChevron
/>
);
});