From 5683d94d0c6f9d4c48e63afbf6c859d901136a24 Mon Sep 17 00:00:00 2001 From: gakshita Date: Tue, 11 Feb 2025 16:09:27 +0530 Subject: [PATCH 1/2] fix: Handled workspace switcher closing on click --- .../workspace/sidebar/dropdown-item.tsx | 5 +++- .../components/workspace/sidebar/dropdown.tsx | 25 +++++-------------- 2 files changed, 10 insertions(+), 20 deletions(-) diff --git a/web/core/components/workspace/sidebar/dropdown-item.tsx b/web/core/components/workspace/sidebar/dropdown-item.tsx index 183a8fdb396..7638b657276 100644 --- a/web/core/components/workspace/sidebar/dropdown-item.tsx +++ b/web/core/components/workspace/sidebar/dropdown-item.tsx @@ -19,9 +19,10 @@ type TProps = { activeWorkspace: IWorkspace | null; handleItemClick: () => void; handleWorkspaceNavigation: (workspace: IWorkspace) => void; + handleClose: () => void; }; const SidebarDropdownItem = observer((props: TProps) => { - const { workspace, activeWorkspace, handleItemClick, handleWorkspaceNavigation } = props; + const { workspace, activeWorkspace, handleItemClick, handleWorkspaceNavigation, handleClose } = props; // router const { workspaceSlug } = useParams(); // hooks @@ -89,6 +90,7 @@ const SidebarDropdownItem = observer((props: TProps) => {
@@ -96,6 +98,7 @@ const SidebarDropdownItem = observer((props: TProps) => { diff --git a/web/core/components/workspace/sidebar/dropdown.tsx b/web/core/components/workspace/sidebar/dropdown.tsx index 8d131594840..ac9acf42e5b 100644 --- a/web/core/components/workspace/sidebar/dropdown.tsx +++ b/web/core/components/workspace/sidebar/dropdown.tsx @@ -46,20 +46,10 @@ export const SidebarDropdown = observer(() => { // popper-js init const { styles, attributes } = usePopper(referenceElement, popperElement, { placement: "right", - modifiers: [ - { - name: "preventOverflow", - options: { - padding: 12, - }, - }, - ], + modifiers: [{ name: "preventOverflow", options: { padding: 12 } }], }); - const handleWorkspaceNavigation = (workspace: IWorkspace) => - updateUserProfile({ - last_workspace_id: workspace?.id, - }); + const handleWorkspaceNavigation = (workspace: IWorkspace) => updateUserProfile({ last_workspace_id: workspace?.id }); const handleSignOut = async () => { await signOut().catch(() => @@ -86,14 +76,12 @@ export const SidebarDropdown = observer(() => { "flex-grow-0 justify-center": sidebarCollapsed, })} > - {({ open }) => ( + {({ open, close }) => ( <>
@@ -108,9 +96,7 @@ export const SidebarDropdown = observer(() => {
From c72084275de7ba98c29647562d4a0869061f1529 Mon Sep 17 00:00:00 2001 From: gakshita Date: Tue, 25 Feb 2025 16:37:37 +0530 Subject: [PATCH 2/2] fix: replaced date range picker with date picker at some places --- .../analytics-sidebar/sidebar-header.tsx | 133 ++++++++++++------ .../cycles/list/cycle-list-item-action.tsx | 120 ++++++++++------ .../modules/analytics-sidebar/root.tsx | 114 ++++++++------- .../components/modules/module-card-item.tsx | 51 ++++--- .../modules/module-list-item-action.tsx | 54 ++++--- 5 files changed, 296 insertions(+), 176 deletions(-) diff --git a/web/core/components/cycles/analytics-sidebar/sidebar-header.tsx b/web/core/components/cycles/analytics-sidebar/sidebar-header.tsx index c8d4cc487b4..6c5b3339335 100644 --- a/web/core/components/cycles/analytics-sidebar/sidebar-header.tsx +++ b/web/core/components/cycles/analytics-sidebar/sidebar-header.tsx @@ -3,7 +3,16 @@ import React, { FC, useEffect, useState } from "react"; import { observer } from "mobx-react"; import { Controller, useForm } from "react-hook-form"; -import { ArchiveIcon, ArchiveRestoreIcon, ChevronRight, EllipsisIcon, LinkIcon, Trash2 } from "lucide-react"; +import { + ArchiveIcon, + ArchiveRestoreIcon, + CalendarCheck2, + CalendarClock, + ChevronRight, + EllipsisIcon, + LinkIcon, + Trash2, +} from "lucide-react"; // types import { CYCLE_STATUS, CYCLE_UPDATED, EUserPermissions, EUserPermissionsLevel } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; @@ -11,7 +20,7 @@ import { ICycle } from "@plane/types"; // ui import { CustomMenu, setToast, TOAST_TYPE } from "@plane/ui"; // components -import { DateRangeDropdown } from "@/components/dropdowns"; +import { DateDropdown } from "@/components/dropdowns"; // helpers import { renderFormattedPayloadDate, getDate } from "@/helpers/date-time.helper"; import { copyUrlToClipboard } from "@/helpers/string.helper"; @@ -54,7 +63,7 @@ export const CycleSidebarHeader: FC = observer((props) => { const { t } = useTranslation(); // form info - const { control, reset } = useForm({ + const { control, reset, getValues } = useForm({ defaultValues, }); @@ -145,20 +154,13 @@ export const CycleSidebarHeader: FC = observer((props) => { } }; - const handleDateChange = async (startDate: Date | undefined, endDate: Date | undefined) => { - if (!startDate || !endDate) return; - + const handleDateChange = async (payload: { start_date?: string | null; end_date?: string | null }) => { let isDateValid = false; - const payload = { - start_date: renderFormattedPayloadDate(startDate), - end_date: renderFormattedPayloadDate(endDate), - }; - - if (cycleDetails?.start_date && cycleDetails.end_date) + if (cycleDetails?.start_date && cycleDetails?.end_date) isDateValid = await dateChecker({ ...payload, - cycle_id: cycleDetails.id, + cycle_id: cycleDetails?.id, }); else isDateValid = await dateChecker(payload); @@ -177,6 +179,7 @@ export const CycleSidebarHeader: FC = observer((props) => { }); reset({ ...cycleDetails }); } + return isDateValid; }; const isEditingAllowed = allowPermissions( @@ -285,39 +288,79 @@ export const CycleSidebarHeader: FC = observer((props) => { )}
+
+ ( + { + let isDateValid; + const valDate = val ? renderFormattedPayloadDate(val) : null; + if (getValues("end_date")) { + isDateValid = await handleDateChange({ + start_date: valDate, + end_date: renderFormattedPayloadDate(getValues("end_date")), + }); + } else { + isDateValid = await handleDateChange({ + start_date: valDate, + end_date: valDate, + }); + } + isDateValid && onChange(renderFormattedPayloadDate(val)); + }} + placeholder={t("common.order_by.start_date")} + icon={} + buttonVariant={value ? "border-with-text" : "border-without-text"} + buttonContainerClassName={`h-6 w-full flex ${!isEditingAllowed || isArchived || isCompleted ? "cursor-not-allowed" : "cursor-pointer"} items-center gap-1.5 text-custom-text-300 rounded text-xs`} + optionsClassName="z-10" + disabled={!isEditingAllowed || isArchived || isCompleted} + showTooltip + maxDate={getDate(getValues("end_date"))} + isClearable={false} + /> + )} + /> - ( - ( - { - onChangeStartDate(val?.from ? renderFormattedPayloadDate(val.from) : null); - onChangeEndDate(val?.to ? renderFormattedPayloadDate(val.to) : null); - handleDateChange(val?.from, val?.to); - }} - placeholder={{ - from: "Start date", - to: "End date", - }} - required={cycleDetails.status !== "draft"} - disabled={!isEditingAllowed || isArchived || isCompleted} - /> - )} - /> - )} - /> + ( + { + let isDateValid; + const valDate = val ? renderFormattedPayloadDate(val) : null; + if (getValues("start_date")) { + isDateValid = await handleDateChange({ + end_date: valDate, + start_date: renderFormattedPayloadDate(getValues("start_date")), + }); + } else { + isDateValid = await handleDateChange({ + end_date: valDate, + start_date: valDate, + }); + } + isDateValid && onChange(renderFormattedPayloadDate(val)); + }} + placeholder={t("common.order_by.due_date")} + icon={} + buttonVariant={value ? "border-with-text" : "border-without-text"} + buttonContainerClassName={`h-6 w-full flex ${!isEditingAllowed || isArchived || isCompleted ? "cursor-not-allowed" : "cursor-pointer"} items-center gap-1.5 text-custom-text-300 rounded text-xs`} + optionsClassName="z-10" + disabled={!isEditingAllowed || isArchived || isCompleted} + showTooltip + minDate={getDate(getValues("start_date"))} + isClearable={false} + /> + )} + /> +
); diff --git a/web/core/components/cycles/list/cycle-list-item-action.tsx b/web/core/components/cycles/list/cycle-list-item-action.tsx index f44b9bd6c15..f009ff19767 100644 --- a/web/core/components/cycles/list/cycle-list-item-action.tsx +++ b/web/core/components/cycles/list/cycle-list-item-action.tsx @@ -4,7 +4,7 @@ import React, { FC, MouseEvent, useEffect, useMemo, useState } from "react"; import { observer } from "mobx-react"; import { useParams, usePathname, useSearchParams } from "next/navigation"; import { Controller, useForm } from "react-hook-form"; -import { Eye, Users } from "lucide-react"; +import { CalendarCheck2, CalendarClock, Eye, Users } from "lucide-react"; // types import { CYCLE_FAVORITED, CYCLE_UNFAVORITED, EUserPermissions, EUserPermissionsLevel } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; @@ -23,7 +23,7 @@ import { } from "@plane/ui"; // components import { CycleQuickActions, TransferIssuesModal } from "@/components/cycles"; -import { DateRangeDropdown } from "@/components/dropdowns"; +import { DateDropdown } from "@/components/dropdowns"; import { ButtonAvatars } from "@/components/dropdowns/member/avatar"; // constants // helpers @@ -41,7 +41,6 @@ import { CycleAdditionalActions } from "@/plane-web/components/cycles"; import { CycleService } from "@/services/cycle.service"; const cycleService = new CycleService(); - type Props = { workspaceSlug: string; projectId: string; @@ -77,7 +76,7 @@ export const CycleListItemAction: FC = observer((props) => { const { getUserDetails } = useMember(); // form - const { control, reset } = useForm({ + const { control, reset, getValues } = useForm({ defaultValues, }); @@ -98,7 +97,6 @@ export const CycleListItemAction: FC = observer((props) => { workspaceSlug, projectId ); - const renderIcon = Boolean(cycleDetails.start_date) || Boolean(cycleDetails.end_date); // handlers const handleAddToFavorites = (e: MouseEvent) => { @@ -171,20 +169,13 @@ export const CycleListItemAction: FC = observer((props) => { } }; - const handleDateChange = async (startDate: Date | undefined, endDate: Date | undefined) => { - if (!startDate || !endDate) return; - + const handleDateChange = async (payload: { start_date?: string | null; end_date?: string | null }) => { let isDateValid = false; - const payload = { - start_date: renderFormattedPayloadDate(startDate), - end_date: renderFormattedPayloadDate(endDate), - }; - - if (cycleDetails && cycleDetails.start_date && cycleDetails.end_date) + if (cycleDetails?.start_date && cycleDetails?.end_date) isDateValid = await dateChecker({ ...payload, - cycle_id: cycleDetails.id, + cycle_id: cycleDetails?.id, }); else isDateValid = await dateChecker(payload); @@ -203,6 +194,7 @@ export const CycleListItemAction: FC = observer((props) => { }); reset({ ...cycleDetails }); } + return isDateValid; }; const createdByDetails = cycleDetails.created_by ? getUserDetails(cycleDetails.created_by) : undefined; @@ -268,35 +260,77 @@ export const CycleListItemAction: FC = observer((props) => { {!isActive && ( ( - ( - { - onChangeStartDate(val?.from ? renderFormattedPayloadDate(val.from) : null); - onChangeEndDate(val?.to ? renderFormattedPayloadDate(val.to) : null); - handleDateChange(val?.from, val?.to); - }} - placeholder={{ - from: "Start date", - to: "End date", - }} - required={cycleDetails.status !== "draft"} - disabled={isDisabled} - hideIcon={{ from: renderIcon ?? true, to: renderIcon }} - /> - )} + control={control} + rules={{ required: "Please select a date" }} + render={({ field: { value, onChange } }) => ( + { + let isDateValid; + const valDate = val ? renderFormattedPayloadDate(val) : null; + if (getValues("end_date")) { + isDateValid = await handleDateChange({ + start_date: valDate, + end_date: renderFormattedPayloadDate(getValues("end_date")), + }); + } else { + isDateValid = await handleDateChange({ + start_date: valDate, + end_date: valDate, + }); + } + isDateValid && onChange(renderFormattedPayloadDate(val)); + }} + placeholder={t("common.order_by.start_date")} + icon={} + buttonVariant={value ? "border-with-text" : "border-without-text"} + buttonContainerClassName={`h-6 w-full flex ${isDisabled ? "cursor-not-allowed" : "cursor-pointer"} items-center gap-1.5 text-custom-text-300 rounded text-xs`} + optionsClassName="z-10" + disabled={isDisabled} + renderByDefault={isMobile} + showTooltip + maxDate={getDate(getValues("end_date"))} + isClearable={false} + /> + )} + /> + )} + + {!isActive && ( + ( + { + let isDateValid; + const valDate = val ? renderFormattedPayloadDate(val) : null; + if (getValues("start_date")) { + isDateValid = await handleDateChange({ + end_date: valDate, + start_date: renderFormattedPayloadDate(getValues("start_date")), + }); + } else { + isDateValid = await handleDateChange({ + end_date: valDate, + start_date: valDate, + }); + } + isDateValid && onChange(renderFormattedPayloadDate(val)); + }} + placeholder={t("common.order_by.due_date")} + icon={} + buttonVariant={value ? "border-with-text" : "border-without-text"} + buttonContainerClassName={`h-6 w-full flex ${isDisabled ? "cursor-not-allowed" : "cursor-pointer"} items-center gap-1.5 text-custom-text-300 rounded text-xs`} + optionsClassName="z-10" + disabled={isDisabled} + renderByDefault={isMobile} + showTooltip + minDate={getDate(getValues("start_date"))} + isClearable={false} /> )} /> diff --git a/web/core/components/modules/analytics-sidebar/root.tsx b/web/core/components/modules/analytics-sidebar/root.tsx index 8f31bbb8090..6489e504b97 100644 --- a/web/core/components/modules/analytics-sidebar/root.tsx +++ b/web/core/components/modules/analytics-sidebar/root.tsx @@ -6,6 +6,7 @@ import { useParams } from "next/navigation"; import { Controller, useForm } from "react-hook-form"; import { ArchiveRestoreIcon, + CalendarCheck2, CalendarClock, ChevronDown, ChevronRight, @@ -42,7 +43,7 @@ import { TextArea, } from "@plane/ui"; // components -import { DateRangeDropdown, MemberDropdown } from "@/components/dropdowns"; +import { DateDropdown, MemberDropdown } from "@/components/dropdowns"; import { ArchiveModuleModal, DeleteModuleModal, @@ -104,7 +105,7 @@ export const ModuleAnalyticsSidebar: React.FC = observer((props) => { const estimateType = areEstimateEnabled && currentActiveEstimateId && estimateById(currentActiveEstimateId); const isEstimatePointValid = estimateType && estimateType?.type == EEstimateSystem.POINTS ? true : false; - const { reset, control } = useForm({ + const { reset, control, getValues } = useForm({ defaultValues, }); @@ -194,11 +195,8 @@ export const ModuleAnalyticsSidebar: React.FC = observer((props) => { }); }; - const handleDateChange = async (startDate: Date | undefined, targetDate: Date | undefined) => { - submitChanges({ - start_date: startDate ? renderFormattedPayloadDate(startDate) : null, - target_date: targetDate ? renderFormattedPayloadDate(targetDate) : null, - }); + const handleDateChange = async (data: Partial) => { + submitChanges(data); setToast({ type: TOAST_TYPE.SUCCESS, title: "Success!", @@ -411,50 +409,68 @@ export const ModuleAnalyticsSidebar: React.FC = observer((props) => { /> )} -
-
- - {t("date_range")} +
+
+
+ + Start date +
+
+ ( + { + console.log(val); + onChange(renderFormattedPayloadDate(val)); + handleDateChange({ start_date: val ? renderFormattedPayloadDate(val) : null }); + }} + placeholder={t("common.order_by.start_date")} + icon={} + buttonVariant={value ? "border-with-text" : "border-without-text"} + buttonContainerClassName={`h-6 w-full flex ${!isEditingAllowed || isArchived ? "cursor-not-allowed" : "cursor-pointer"} items-center gap-1.5 text-custom-text-300 rounded text-xs`} + optionsClassName="z-30" + disabled={!isEditingAllowed || isArchived} + showTooltip + maxDate={getDate(getValues("target_date"))} + /> + )} + /> +
-
- ( - { - const startDate = getDate(startDateValue); - const endDate = getDate(endDateValue); - return ( - { - onChangeStartDate(val?.from ? renderFormattedPayloadDate(val.from) : null); - onChangeEndDate(val?.to ? renderFormattedPayloadDate(val.to) : null); - handleDateChange(val?.from, val?.to); - }} - placeholder={{ - from: t("start_date"), - to: t("target_date"), - }} - disabled={!isEditingAllowed || isArchived} - /> - ); - }} - /> - )} - /> +
+
+ + Due date +
+
+ ( + { + onChange(renderFormattedPayloadDate(val)); + handleDateChange({ target_date: val ? renderFormattedPayloadDate(val) : null }); + }} + placeholder={t("common.order_by.due_date")} + icon={} + buttonVariant={value ? "border-with-text" : "border-without-text"} + buttonContainerClassName={`h-6 w-full flex ${!isEditingAllowed || isArchived ? "cursor-not-allowed" : "cursor-pointer"} items-center gap-1.5 text-custom-text-300 rounded text-xs`} + optionsClassName="z-30" + disabled={!isEditingAllowed || isArchived} + showTooltip + minDate={getDate(getValues("start_date"))} + /> + )} + /> +
-
- -
diff --git a/web/core/components/modules/module-card-item.tsx b/web/core/components/modules/module-card-item.tsx index 9585755eef3..4fe884b4729 100644 --- a/web/core/components/modules/module-card-item.tsx +++ b/web/core/components/modules/module-card-item.tsx @@ -4,7 +4,7 @@ import React, { SyntheticEvent, useRef } from "react"; import { observer } from "mobx-react"; import Link from "next/link"; import { useParams, usePathname, useSearchParams } from "next/navigation"; -import { Info, SquareUser } from "lucide-react"; +import { CalendarCheck2, CalendarClock, Info, SquareUser } from "lucide-react"; // plane package imports import { MODULE_STATUS, @@ -14,6 +14,7 @@ import { EUserPermissions, EUserPermissionsLevel, } from "@plane/constants"; +import { useTranslation } from "@plane/i18n"; import { IModule } from "@plane/types"; import { Card, @@ -26,7 +27,7 @@ import { setToast, } from "@plane/ui"; // components -import { DateRangeDropdown } from "@/components/dropdowns"; +import { DateDropdown } from "@/components/dropdowns"; import { ButtonAvatars } from "@/components/dropdowns/member/avatar"; import { ModuleQuickActions } from "@/components/modules"; import { ModuleStatusDropdown } from "@/components/modules/module-status-dropdown"; @@ -58,7 +59,7 @@ export const ModuleCardItem: React.FC = observer((props) => { const { getModuleById, addModuleToFavorites, removeModuleFromFavorites, updateModuleDetails } = useModule(); const { getUserDetails } = useMember(); const { captureEvent } = useEventTracker(); - + const { t } = useTranslation(); // derived values const moduleDetails = getModuleById(moduleId); const isEditingAllowed = allowPermissions( @@ -66,7 +67,6 @@ export const ModuleCardItem: React.FC = observer((props) => { EUserPermissionsLevel.PROJECT ); const isDisabled = !isEditingAllowed || !!moduleDetails?.archived_at; - const renderIcon = Boolean(moduleDetails?.start_date) || Boolean(moduleDetails?.target_date); const { isMobile } = usePlatformOS(); const handleAddToFavorites = (e: React.MouseEvent) => { @@ -236,27 +236,38 @@ export const ModuleCardItem: React.FC = observer((props) => { )}
-
- { +
+ { handleModuleDetailsChange({ - start_date: val?.from ? renderFormattedPayloadDate(val.from) : null, - target_date: val?.to ? renderFormattedPayloadDate(val.to) : null, + start_date: val ? renderFormattedPayloadDate(val) : null, }); }} - placeholder={{ - from: "Start date", - to: "End date", + placeholder={t("common.order_by.start_date")} + icon={} + buttonVariant={moduleDetails.start_date ? "border-with-text" : "border-without-text"} + buttonContainerClassName={`h-6 w-full flex ${isDisabled ? "cursor-not-allowed" : "cursor-pointer"} items-center gap-1.5 text-custom-text-300 rounded text-xs`} + optionsClassName="z-10" + disabled={isDisabled} + showTooltip + maxDate={getDate(moduleDetails.target_date)} + /> + { + handleModuleDetailsChange({ + target_date: val ? renderFormattedPayloadDate(val) : null, + }); }} + placeholder={t("common.order_by.due_date")} + icon={} + buttonVariant={moduleDetails.target_date ? "border-with-text" : "border-without-text"} + buttonContainerClassName={`h-6 w-full flex ${isDisabled ? "cursor-not-allowed" : "cursor-pointer"} items-center gap-1.5 text-custom-text-300 rounded text-xs`} + optionsClassName="z-10" disabled={isDisabled} - hideIcon={{ from: renderIcon ?? true, to: renderIcon }} + showTooltip + minDate={getDate(moduleDetails.start_date)} />
diff --git a/web/core/components/modules/module-list-item-action.tsx b/web/core/components/modules/module-list-item-action.tsx index c79860ac44d..e159b119ff0 100644 --- a/web/core/components/modules/module-list-item-action.tsx +++ b/web/core/components/modules/module-list-item-action.tsx @@ -4,15 +4,21 @@ import React, { FC } from "react"; import { observer } from "mobx-react"; import { useParams } from "next/navigation"; // icons -import { SquareUser } from "lucide-react"; +import { CalendarCheck2, CalendarClock, SquareUser } from "lucide-react"; // types -import { MODULE_STATUS, MODULE_FAVORITED, MODULE_UNFAVORITED , EUserPermissions, EUserPermissionsLevel } from "@plane/constants"; +import { + MODULE_STATUS, + MODULE_FAVORITED, + MODULE_UNFAVORITED, + EUserPermissions, + EUserPermissionsLevel, +} from "@plane/constants"; import { useTranslation } from "@plane/i18n"; import { IModule } from "@plane/types"; // ui import { FavoriteStar, TOAST_TYPE, Tooltip, setPromiseToast, setToast } from "@plane/ui"; // components -import { DateRangeDropdown } from "@/components/dropdowns"; +import { DateDropdown } from "@/components/dropdowns"; import { ModuleQuickActions } from "@/components/modules"; import { ModuleStatusDropdown } from "@/components/modules/module-status-dropdown"; // constants @@ -132,28 +138,38 @@ export const ModuleListItemAction: FC = observer((props) => { return ( <> - { + { handleModuleDetailsChange({ - start_date: val?.from ? renderFormattedPayloadDate(val.from) : null, - target_date: val?.to ? renderFormattedPayloadDate(val.to) : null, + start_date: val ? renderFormattedPayloadDate(val) : null, }); }} - placeholder={{ - from: t("start_date"), - to: t("end_date"), + placeholder={t("common.order_by.start_date")} + icon={} + buttonVariant={moduleDetails.start_date ? "border-with-text" : "border-without-text"} + buttonContainerClassName={`h-6 w-full flex ${isDisabled ? "cursor-not-allowed" : "cursor-pointer"} items-center gap-1.5 text-custom-text-300 rounded text-xs`} + optionsClassName="z-10" + disabled={isDisabled} + showTooltip + maxDate={getDate(moduleDetails.target_date)} + /> + { + handleModuleDetailsChange({ + target_date: val ? renderFormattedPayloadDate(val) : null, + }); }} + placeholder={t("common.order_by.due_date")} + icon={} + buttonVariant={moduleDetails.target_date ? "border-with-text" : "border-without-text"} + buttonContainerClassName={`h-6 w-full flex ${isDisabled ? "cursor-not-allowed" : "cursor-pointer"} items-center gap-1.5 text-custom-text-300 rounded text-xs`} + optionsClassName="z-10" disabled={isDisabled} - hideIcon={{ from: renderIcon ?? true, to: renderIcon }} + showTooltip + minDate={getDate(moduleDetails.start_date)} /> - {moduleStatus && (