Skip to content

Commit

Permalink
chore: render proper icons for due dates (#2114)
Browse files Browse the repository at this point in the history
  • Loading branch information
aaryan610 authored Sep 7, 2023
1 parent b47c7d3 commit d26aa1b
Show file tree
Hide file tree
Showing 4 changed files with 49 additions and 81 deletions.
33 changes: 16 additions & 17 deletions space/components/issues/board-views/block-due-date.tsx
Original file line number Diff line number Diff line change
@@ -1,17 +1,9 @@
"use client";

// helpers
import { renderFullDate } from "constants/helpers";
import { renderFullDate } from "helpers/date-time.helper";

export const findHowManyDaysLeft = (date: string | Date) => {
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 = (
export const dueDateIconDetails = (
date: string,
stateGroup: string
): {
Expand All @@ -26,17 +18,24 @@ const dueDateIcon = (
className = "";
} else {
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";
className = "text-red-500";
} else if (dueDate > today) {
iconName = "calendar_today";
className = "";
} else {
} else if (timeDifference === 0) {
iconName = "today";
className = "text-red-500";
} else if (timeDifference === 24 * 60 * 60 * 1000) {
iconName = "event";
className = "text-yellow-500";
} else {
iconName = "calendar_today";
className = "";
}
}

Expand All @@ -47,7 +46,7 @@ const dueDateIcon = (
};

export const IssueBlockDueDate = ({ due_date, group }: { due_date: string; group: string }) => {
const iconDetails = dueDateIcon(due_date, group);
const iconDetails = dueDateIconDetails(due_date, group);

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">
Expand Down
38 changes: 10 additions & 28 deletions space/components/issues/peek-overview/issue-properties.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,10 @@
import useToast from "hooks/use-toast";
// icons
import { Icon } from "components/ui";
import { copyTextToClipboard, addSpaceIfCamelCase } from "helpers/string.helper";
// 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
import { IIssue } from "types/issue";
import { IPeekMode } from "store/issue_details";
Expand All @@ -16,35 +17,16 @@ type Props = {
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 }) => {
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 stateGroup = issueGroupFilter(state.group);

const priority = issueDetails.priority ? issuePriorityFilter(issueDetails.priority) : null;

const dueDateIcon = dueDateIconDetails(issueDetails.target_date, state.group);

const handleCopyLink = () => {
const urlToCopy = window.location.href;

Expand Down Expand Up @@ -125,11 +107,11 @@ export const PeekOverviewIssueProperties: React.FC<Props> = ({ issueDetails, mod
</div>
<div>
{issueDetails.target_date ? (
<div
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
${validDate(issueDetails.target_date, state)}`}
>
{renderDateFormat(issueDetails.target_date)}
<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">
<span className={`material-symbols-rounded text-sm -my-0.5 ${dueDateIcon.className}`}>
{dueDateIcon.iconName}
</span>
{renderFullDate(issueDetails.target_date)}
</div>
) : (
<span className="text-custom-text-200">Empty</span>
Expand Down
36 changes: 0 additions & 36 deletions space/constants/helpers.ts

This file was deleted.

23 changes: 23 additions & 0 deletions space/helpers/date-time.helper.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,26 @@ export const timeAgo = (time: any) => {
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}`;
};

1 comment on commit d26aa1b

@vercel
Copy link

@vercel vercel bot commented on d26aa1b Sep 7, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Successfully deployed to the following URLs:

plane-dev – ./web/

plane-dev.vercel.app
plane-dev-git-develop-plane.vercel.app
plane-dev-plane.vercel.app

Please sign in to comment.