mirror of
https://github.com/makeplane/plane
synced 2024-06-14 14:31:34 +00:00
chore: render proper icons for due dates (#2114)
This commit is contained in:
parent
b47c7d363f
commit
d26aa1b2da
@ -1,17 +1,9 @@
|
|||||||
"use client";
|
"use client";
|
||||||
|
|
||||||
// helpers
|
// helpers
|
||||||
import { renderFullDate } from "constants/helpers";
|
import { renderFullDate } from "helpers/date-time.helper";
|
||||||
|
|
||||||
export const findHowManyDaysLeft = (date: string | Date) => {
|
export const dueDateIconDetails = (
|
||||||
const today = new Date();
|
|
||||||
const eventDate = new Date(date);
|
|
||||||
const timeDiff = Math.abs(eventDate.getTime() - today.getTime());
|
|
||||||
|
|
||||||
return Math.ceil(timeDiff / (1000 * 3600 * 24));
|
|
||||||
};
|
|
||||||
|
|
||||||
const dueDateIcon = (
|
|
||||||
date: string,
|
date: string,
|
||||||
stateGroup: string
|
stateGroup: string
|
||||||
): {
|
): {
|
||||||
@ -26,17 +18,24 @@ const dueDateIcon = (
|
|||||||
className = "";
|
className = "";
|
||||||
} else {
|
} else {
|
||||||
const today = new Date();
|
const today = new Date();
|
||||||
const dueDate = new Date(date);
|
today.setHours(0, 0, 0, 0);
|
||||||
|
const targetDate = new Date(date);
|
||||||
|
targetDate.setHours(0, 0, 0, 0);
|
||||||
|
|
||||||
if (dueDate < today) {
|
const timeDifference = targetDate.getTime() - today.getTime();
|
||||||
|
|
||||||
|
if (timeDifference < 0) {
|
||||||
iconName = "event_busy";
|
iconName = "event_busy";
|
||||||
className = "text-red-500";
|
className = "text-red-500";
|
||||||
} else if (dueDate > today) {
|
} else if (timeDifference === 0) {
|
||||||
iconName = "calendar_today";
|
|
||||||
className = "";
|
|
||||||
} else {
|
|
||||||
iconName = "today";
|
iconName = "today";
|
||||||
className = "text-red-500";
|
className = "text-red-500";
|
||||||
|
} else if (timeDifference === 24 * 60 * 60 * 1000) {
|
||||||
|
iconName = "event";
|
||||||
|
className = "text-yellow-500";
|
||||||
|
} else {
|
||||||
|
iconName = "calendar_today";
|
||||||
|
className = "";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -47,7 +46,7 @@ const dueDateIcon = (
|
|||||||
};
|
};
|
||||||
|
|
||||||
export const IssueBlockDueDate = ({ due_date, group }: { due_date: string; group: string }) => {
|
export const IssueBlockDueDate = ({ due_date, group }: { due_date: string; group: string }) => {
|
||||||
const iconDetails = dueDateIcon(due_date, group);
|
const iconDetails = dueDateIconDetails(due_date, group);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="rounded flex px-2.5 py-1 items-center border-[0.5px] border-custom-border-300 gap-1 text-custom-text-100 text-xs">
|
<div className="rounded flex px-2.5 py-1 items-center border-[0.5px] border-custom-border-300 gap-1 text-custom-text-100 text-xs">
|
||||||
|
@ -2,9 +2,10 @@
|
|||||||
import useToast from "hooks/use-toast";
|
import useToast from "hooks/use-toast";
|
||||||
// icons
|
// icons
|
||||||
import { Icon } from "components/ui";
|
import { Icon } from "components/ui";
|
||||||
import { copyTextToClipboard, addSpaceIfCamelCase } from "helpers/string.helper";
|
|
||||||
// helpers
|
// helpers
|
||||||
import { renderDateFormat } from "constants/helpers";
|
import { copyTextToClipboard, addSpaceIfCamelCase } from "helpers/string.helper";
|
||||||
|
import { renderFullDate } from "helpers/date-time.helper";
|
||||||
|
import { dueDateIconDetails } from "../board-views/block-due-date";
|
||||||
// types
|
// types
|
||||||
import { IIssue } from "types/issue";
|
import { IIssue } from "types/issue";
|
||||||
import { IPeekMode } from "store/issue_details";
|
import { IPeekMode } from "store/issue_details";
|
||||||
@ -16,35 +17,16 @@ type Props = {
|
|||||||
mode?: IPeekMode;
|
mode?: IPeekMode;
|
||||||
};
|
};
|
||||||
|
|
||||||
const validDate = (date: any, state: string): string => {
|
|
||||||
if (date === null || ["backlog", "unstarted", "cancelled"].includes(state))
|
|
||||||
return `bg-gray-500/10 text-gray-500 border-gray-500/50`;
|
|
||||||
else {
|
|
||||||
const today = new Date();
|
|
||||||
const dueDate = new Date(date);
|
|
||||||
|
|
||||||
if (dueDate < today) return `bg-red-500/10 text-red-500 border-red-500/50`;
|
|
||||||
else return `bg-green-500/10 text-green-500 border-green-500/50`;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
export const PeekOverviewIssueProperties: React.FC<Props> = ({ issueDetails, mode }) => {
|
export const PeekOverviewIssueProperties: React.FC<Props> = ({ issueDetails, mode }) => {
|
||||||
const { setToastAlert } = useToast();
|
const { setToastAlert } = useToast();
|
||||||
|
|
||||||
const startDate = issueDetails.start_date;
|
|
||||||
const targetDate = issueDetails.target_date;
|
|
||||||
|
|
||||||
const minDate = startDate ? new Date(startDate) : null;
|
|
||||||
minDate?.setDate(minDate.getDate());
|
|
||||||
|
|
||||||
const maxDate = targetDate ? new Date(targetDate) : null;
|
|
||||||
maxDate?.setDate(maxDate.getDate());
|
|
||||||
|
|
||||||
const state = issueDetails.state_detail;
|
const state = issueDetails.state_detail;
|
||||||
const stateGroup = issueGroupFilter(state.group);
|
const stateGroup = issueGroupFilter(state.group);
|
||||||
|
|
||||||
const priority = issueDetails.priority ? issuePriorityFilter(issueDetails.priority) : null;
|
const priority = issueDetails.priority ? issuePriorityFilter(issueDetails.priority) : null;
|
||||||
|
|
||||||
|
const dueDateIcon = dueDateIconDetails(issueDetails.target_date, state.group);
|
||||||
|
|
||||||
const handleCopyLink = () => {
|
const handleCopyLink = () => {
|
||||||
const urlToCopy = window.location.href;
|
const urlToCopy = window.location.href;
|
||||||
|
|
||||||
@ -125,11 +107,11 @@ export const PeekOverviewIssueProperties: React.FC<Props> = ({ issueDetails, mod
|
|||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
{issueDetails.target_date ? (
|
{issueDetails.target_date ? (
|
||||||
<div
|
<div className="h-6 rounded flex items-center gap-1 px-2.5 py-1 border border-custom-border-100 text-custom-text-100 text-xs bg-custom-background-80">
|
||||||
className={`h-[24px] rounded-md flex px-2.5 py-1 items-center border border-custom-border-100 gap-1 text-custom-text-100 text-xs font-medium
|
<span className={`material-symbols-rounded text-sm -my-0.5 ${dueDateIcon.className}`}>
|
||||||
${validDate(issueDetails.target_date, state)}`}
|
{dueDateIcon.iconName}
|
||||||
>
|
</span>
|
||||||
{renderDateFormat(issueDetails.target_date)}
|
{renderFullDate(issueDetails.target_date)}
|
||||||
</div>
|
</div>
|
||||||
) : (
|
) : (
|
||||||
<span className="text-custom-text-200">Empty</span>
|
<span className="text-custom-text-200">Empty</span>
|
||||||
|
@ -1,36 +0,0 @@
|
|||||||
export const renderDateFormat = (date: string | Date | null) => {
|
|
||||||
if (!date) return "N/A";
|
|
||||||
|
|
||||||
var d = new Date(date),
|
|
||||||
month = "" + (d.getMonth() + 1),
|
|
||||||
day = "" + d.getDate(),
|
|
||||||
year = d.getFullYear();
|
|
||||||
|
|
||||||
if (month.length < 2) month = "0" + month;
|
|
||||||
if (day.length < 2) day = "0" + day;
|
|
||||||
|
|
||||||
return [year, month, day].join("-");
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @description Returns date and month, if date is of the current year
|
|
||||||
* @description Returns date, month adn year, if date is of a different year than current
|
|
||||||
* @param {string} date
|
|
||||||
* @example renderFullDate("2023-01-01") // 1 Jan
|
|
||||||
* @example renderFullDate("2021-01-01") // 1 Jan, 2021
|
|
||||||
*/
|
|
||||||
|
|
||||||
export const renderFullDate = (date: string): string => {
|
|
||||||
if (!date) return "";
|
|
||||||
|
|
||||||
const months: string[] = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
|
|
||||||
|
|
||||||
const currentDate: Date = new Date();
|
|
||||||
const [year, month, day]: number[] = date.split("-").map(Number);
|
|
||||||
|
|
||||||
const formattedMonth: string = months[month - 1];
|
|
||||||
const formattedDay: string = day < 10 ? `0${day}` : day.toString();
|
|
||||||
|
|
||||||
if (currentDate.getFullYear() === year) return `${formattedDay} ${formattedMonth}`;
|
|
||||||
else return `${formattedDay} ${formattedMonth}, ${year}`;
|
|
||||||
};
|
|
@ -12,3 +12,26 @@ export const timeAgo = (time: any) => {
|
|||||||
time = +new Date();
|
time = +new Date();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @description Returns date and month, if date is of the current year
|
||||||
|
* @description Returns date, month adn year, if date is of a different year than current
|
||||||
|
* @param {string} date
|
||||||
|
* @example renderFullDate("2023-01-01") // 1 Jan
|
||||||
|
* @example renderFullDate("2021-01-01") // 1 Jan, 2021
|
||||||
|
*/
|
||||||
|
|
||||||
|
export const renderFullDate = (date: string): string => {
|
||||||
|
if (!date) return "";
|
||||||
|
|
||||||
|
const months: string[] = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
|
||||||
|
|
||||||
|
const currentDate: Date = new Date();
|
||||||
|
const [year, month, day]: number[] = date.split("-").map(Number);
|
||||||
|
|
||||||
|
const formattedMonth: string = months[month - 1];
|
||||||
|
const formattedDay: string = day < 10 ? `0${day}` : day.toString();
|
||||||
|
|
||||||
|
if (currentDate.getFullYear() === year) return `${formattedDay} ${formattedMonth}`;
|
||||||
|
else return `${formattedDay} ${formattedMonth}, ${year}`;
|
||||||
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user