diff --git a/web/ce/components/issues/worklog/activity/filter-root.tsx b/web/ce/components/issues/worklog/activity/filter-root.tsx new file mode 100644 index 00000000000..a0ad26578bf --- /dev/null +++ b/web/ce/components/issues/worklog/activity/filter-root.tsx @@ -0,0 +1,28 @@ +"use client"; + +import { FC } from "react"; +// components +import { ActivityFilter } from "@/components/issues"; +// plane web constants +import { TActivityFilters, ACTIVITY_FILTER_TYPE_OPTIONS, TActivityFilterOption } from "@/plane-web/constants/issues"; + +export type TActivityFilterRoot = { + selectedFilters: TActivityFilters[]; + toggleFilter: (filter: TActivityFilters) => void; +}; + +export const ActivityFilterRoot: FC = (props) => { + const { selectedFilters, toggleFilter } = props; + + const filters: TActivityFilterOption[] = Object.entries(ACTIVITY_FILTER_TYPE_OPTIONS).map(([key, value]) => { + const filterKey = key as TActivityFilters; + return { + key: filterKey, + label: value.label, + isSelected: selectedFilters.includes(filterKey), + onClick: () => toggleFilter(filterKey), + }; + }); + + return ; +}; diff --git a/web/ce/components/issues/worklog/activity/index.ts b/web/ce/components/issues/worklog/activity/index.ts index 6060c4afc1f..0c803acab8a 100644 --- a/web/ce/components/issues/worklog/activity/index.ts +++ b/web/ce/components/issues/worklog/activity/index.ts @@ -1,2 +1,4 @@ export * from "./root"; export * from "./worklog-create-button"; + +export * from "./filter-root"; diff --git a/web/ce/constants/issues.ts b/web/ce/constants/issues.ts index 91abbb984ec..ac31c1ec9e6 100644 --- a/web/ce/constants/issues.ts +++ b/web/ce/constants/issues.ts @@ -18,6 +18,13 @@ export const ACTIVITY_FILTER_TYPE_OPTIONS: Record void; +}; + export const filterActivityOnSelectedFilters = ( activity: TIssueActivityComment[], filter: TActivityFilters[] diff --git a/web/core/components/issues/issue-detail/issue-activity/activity-filter.tsx b/web/core/components/issues/issue-detail/issue-activity/activity-filter.tsx index cecdfa072a5..319058a017f 100644 --- a/web/core/components/issues/issue-detail/issue-activity/activity-filter.tsx +++ b/web/core/components/issues/issue-detail/issue-activity/activity-filter.tsx @@ -1,85 +1,59 @@ -import React, { FC, Fragment } from "react"; +import React, { FC } from "react"; import { observer } from "mobx-react"; import { Check, ListFilter } from "lucide-react"; -import { Popover, Transition } from "@headlessui/react"; -// ui -import { Button } from "@plane/ui"; +import { Button, PopoverMenu } from "@plane/ui"; // helper import { cn } from "@/helpers/common.helper"; // constants -import { TActivityFilters, ACTIVITY_FILTER_TYPE_OPTIONS } from "@/plane-web/constants/issues"; +import { TActivityFilterOption, TActivityFilters } from "@/plane-web/constants/issues"; -type Props = { +type TActivityFilter = { selectedFilters: TActivityFilters[]; - toggleFilter: (filter: TActivityFilters) => void; + filterOptions: TActivityFilterOption[]; }; -export const ActivityFilter: FC = observer((props) => { - const { selectedFilters, toggleFilter } = props; - return ( - - {({ open }) => ( - <> - - - +export const ActivityFilter: FC = observer((props) => { + const { selectedFilters = [], filterOptions } = props; - } + className="relative" + > + Filters + + } + panelClassName="p-2 rounded-md border border-custom-border-200 bg-custom-background-100" + data={filterOptions} + keyExtractor={(item) => item.key} + render={(item) => ( +
+
- -
- {Object.keys(ACTIVITY_FILTER_TYPE_OPTIONS).map((key) => { - const filterKey = key as TActivityFilters; - const filter = ACTIVITY_FILTER_TYPE_OPTIONS[filterKey]; - const isSelected = selectedFilters.includes(filterKey); - return ( -
toggleFilter(filterKey)} - > -
- {isSelected && } -
-
- {filter.label} -
-
- ); - })} -
-
- - + {item.isSelected && } +
+
+ {item.label} +
+
)} -
+ /> ); }); diff --git a/web/core/components/issues/issue-detail/issue-activity/root.tsx b/web/core/components/issues/issue-detail/issue-activity/root.tsx index da30f24b04a..dad83881dcb 100644 --- a/web/core/components/issues/issue-detail/issue-activity/root.tsx +++ b/web/core/components/issues/issue-detail/issue-activity/root.tsx @@ -7,12 +7,12 @@ import { TIssueComment } from "@plane/types"; // ui import { TOAST_TYPE, setToast } from "@plane/ui"; // components -import { ActivityFilter, IssueCommentCreate } from "@/components/issues"; +import { IssueCommentCreate } from "@/components/issues"; import { IssueActivityCommentRoot } from "@/components/issues/issue-detail"; // hooks import { useIssueDetail, useProject } from "@/hooks/store"; // plane web components -import { IssueActivityWorklogCreateButton } from "@/plane-web/components/issues/worklog"; +import { ActivityFilterRoot, IssueActivityWorklogCreateButton } from "@/plane-web/components/issues/worklog"; // plane web constants import { TActivityFilters, defaultActivityFilters } from "@/plane-web/constants/issues"; @@ -120,7 +120,7 @@ export const IssueActivity: FC = observer((props) => { issueId={issueId} disabled={disabled} /> - + diff --git a/web/ee/components/issues/worklog/activity/filter-root.tsx b/web/ee/components/issues/worklog/activity/filter-root.tsx new file mode 100644 index 00000000000..90acdbb5cd3 --- /dev/null +++ b/web/ee/components/issues/worklog/activity/filter-root.tsx @@ -0,0 +1 @@ +export * from "ce/components/issues/worklog/activity/filter-root"; diff --git a/web/ee/components/issues/worklog/activity/index.ts b/web/ee/components/issues/worklog/activity/index.ts index 6060c4afc1f..0c803acab8a 100644 --- a/web/ee/components/issues/worklog/activity/index.ts +++ b/web/ee/components/issues/worklog/activity/index.ts @@ -1,2 +1,4 @@ export * from "./root"; export * from "./worklog-create-button"; + +export * from "./filter-root"; diff --git a/web/helpers/date-time.helper.ts b/web/helpers/date-time.helper.ts index 4053a961c2a..4b79cfde50d 100644 --- a/web/helpers/date-time.helper.ts +++ b/web/helpers/date-time.helper.ts @@ -323,14 +323,13 @@ export const convertMinutesToHoursAndMinutes = (mins: number): { hours: number; }; /** - * @description converts minutes to days, hours and minutes + * @description converts minutes to hours and minutes string * @param { number } totalMinutes - * @returns { string } days, hours and minutes + * @returns { string } 0h 0m + * @example convertMinutesToHoursAndMinutes(150) // Output: 2h 10m */ -export const convertMinutesToDaysHoursMinutes = (totalMinutes: number): string => { - const days = Math.floor(totalMinutes / (60 * 24)); - const hours = Math.floor((totalMinutes % (60 * 24)) / 60); - const minutes = totalMinutes % 60; +export const convertMinutesToHoursMinutesString = (totalMinutes: number): string => { + const { hours, minutes } = convertMinutesToHoursAndMinutes(totalMinutes); - return `${days ? `${days}d ` : ``}${hours ? `${hours}h ` : ``}${minutes ? `${minutes}m ` : ``} `; + return `${hours ? `${hours}h ` : ``}${minutes ? `${minutes}m ` : ``}`; };