From 7bb73b74baf3ff02e39c678c8e773d2ad09c9bf2 Mon Sep 17 00:00:00 2001 From: Aaryan Khandelwal <65252264+aaryan610@users.noreply.github.com> Date: Mon, 11 Sep 2023 14:35:58 +0530 Subject: [PATCH] refactor: priority icon component (#2132) --- .../analytics/custom-analytics/table.tsx | 8 ++-- .../issue/change-issue-priority.tsx | 12 +++--- web/components/core/filters/filters-list.tsx | 6 ++- .../core/views/board-view/board-header.tsx | 6 +-- web/components/core/views/issues-view.tsx | 5 ++- .../core/views/list-view/single-list.tsx | 5 ++- .../cycles/active-cycle-details.tsx | 4 +- web/components/icons/priority-icon.tsx | 41 ++++++++++--------- web/components/inbox/filters-dropdown.tsx | 4 +- web/components/inbox/filters-list.tsx | 8 +++- web/components/inbox/inbox-issue-card.tsx | 7 +--- web/components/inbox/inbox-main-content.tsx | 2 +- .../my-issues/my-issues-select-filters.tsx | 4 +- .../issues/my-issues/my-issues-view.tsx | 4 +- .../issues/peek-overview/issue-properties.tsx | 4 +- web/components/issues/select/priority.tsx | 15 +++++-- .../issues/sidebar-select/priority.tsx | 12 +++--- web/components/issues/sidebar.tsx | 2 +- .../issues/view-select/priority.tsx | 32 +++++++-------- .../profile/profile-issues-view.tsx | 4 +- web/components/views/select-filters.tsx | 5 ++- .../web-view/issue-properties-detail.tsx | 2 +- web/components/web-view/select-priority.tsx | 8 ++-- web/constants/project.ts | 4 +- .../archived-issues/[archivedIssueId].tsx | 2 +- .../projects/[projectId]/issues/[issueId].tsx | 2 +- web/types/issues.d.ts | 4 +- 27 files changed, 117 insertions(+), 95 deletions(-) diff --git a/web/components/analytics/custom-analytics/table.tsx b/web/components/analytics/custom-analytics/table.tsx index 75d1d7d40..5993bb63c 100644 --- a/web/components/analytics/custom-analytics/table.tsx +++ b/web/components/analytics/custom-analytics/table.tsx @@ -1,13 +1,13 @@ // nivo import { BarDatum } from "@nivo/bar"; // icons -import { getPriorityIcon } from "components/icons"; +import { PriorityIcon } from "components/icons"; // helpers import { addSpaceIfCamelCase } from "helpers/string.helper"; // helpers import { generateBarColor, renderMonthAndYear } from "helpers/analytics.helper"; // types -import { IAnalyticsParams, IAnalyticsResponse } from "types"; +import { IAnalyticsParams, IAnalyticsResponse, TIssuePriorities } from "types"; // constants import { ANALYTICS_X_AXIS_VALUES, ANALYTICS_Y_AXIS_VALUES, DATE_KEYS } from "constants/analytics"; @@ -53,7 +53,7 @@ export const AnalyticsTable: React.FC = ({ analytics, barGraphData, param >
{params.segment === "priority" ? ( - getPriorityIcon(key) + ) : ( = ({ analytics, barGraphData, param }`} > {params.x_axis === "priority" ? ( - getPriorityIcon(`${item.name}`) + ) : ( >; @@ -54,7 +56,7 @@ export const ChangeIssuePriority: React.FC = ({ setIsPaletteOpen, issue, [workspaceSlug, issueId, projectId, user] ); - const handleIssueState = (priority: string | null) => { + const handleIssueState = (priority: TIssuePriorities) => { submitChanges({ priority }); setIsPaletteOpen(false); }; @@ -68,7 +70,7 @@ export const ChangeIssuePriority: React.FC = ({ setIsPaletteOpen, issue, className="focus:outline-none" >
- {getPriorityIcon(priority)} + {priority ?? "None"}
{priority === issue.priority && }
diff --git a/web/components/core/filters/filters-list.tsx b/web/components/core/filters/filters-list.tsx index 10cd623f8..81a12bd86 100644 --- a/web/components/core/filters/filters-list.tsx +++ b/web/components/core/filters/filters-list.tsx @@ -2,7 +2,7 @@ import React from "react"; // icons import { XMarkIcon } from "@heroicons/react/24/outline"; -import { getPriorityIcon, StateGroupIcon } from "components/icons"; +import { PriorityIcon, StateGroupIcon } from "components/icons"; // ui import { Avatar } from "components/ui"; // helpers @@ -136,7 +136,9 @@ export const FiltersList: React.FC = ({ : "bg-custom-background-90 text-custom-text-200" }`} > - {getPriorityIcon(priority)} + + + {priority === "null" ? "None" : priority} = ({ ); break; case "priority": - icon = getPriorityIcon(groupTitle, "text-lg"); + icon = ; break; case "project": const project = projects?.find((p) => p.id === groupTitle); diff --git a/web/components/core/views/issues-view.tsx b/web/components/core/views/issues-view.tsx index 755b37aa1..556c4d98e 100644 --- a/web/components/core/views/issues-view.tsx +++ b/web/components/core/views/issues-view.tsx @@ -29,7 +29,7 @@ import { PlusIcon } from "@heroicons/react/24/outline"; import { getStatesList } from "helpers/state.helper"; import { orderArrayBy } from "helpers/array.helper"; // types -import { IIssue, IIssueFilterOptions, IState } from "types"; +import { IIssue, IIssueFilterOptions, IState, TIssuePriorities } from "types"; // fetch-keys import { CYCLE_DETAILS, @@ -184,7 +184,8 @@ export const IssuesView: React.FC = ({ // if the issue is moved to a different group, then we will change the group of the // dragged item(or issue) - if (selectedGroup === "priority") draggedItem.priority = destinationGroup; + if (selectedGroup === "priority") + draggedItem.priority = destinationGroup as TIssuePriorities; else if (selectedGroup === "state") { draggedItem.state = destinationGroup; draggedItem.state_detail = states?.find((s) => s.id === destinationGroup) as IState; diff --git a/web/components/core/views/list-view/single-list.tsx b/web/components/core/views/list-view/single-list.tsx index a005feef5..14829adc4 100644 --- a/web/components/core/views/list-view/single-list.tsx +++ b/web/components/core/views/list-view/single-list.tsx @@ -15,7 +15,7 @@ import { SingleListIssue } from "components/core"; import { Avatar, CustomMenu } from "components/ui"; // icons import { PlusIcon } from "@heroicons/react/24/outline"; -import { StateGroupIcon, getPriorityIcon } from "components/icons"; +import { PriorityIcon, StateGroupIcon } from "components/icons"; // helpers import { addSpaceIfCamelCase } from "helpers/string.helper"; import { renderEmoji } from "helpers/emoji.helper"; @@ -26,6 +26,7 @@ import { IIssueLabels, IIssueViewProps, IState, + TIssuePriorities, TStateGroups, UserAuth, } from "types"; @@ -134,7 +135,7 @@ export const SingleList: React.FC = ({ ); break; case "priority": - icon = getPriorityIcon(groupTitle, "text-lg"); + icon = ; break; case "project": const project = projects?.find((p) => p.id === groupTitle); diff --git a/web/components/cycles/active-cycle-details.tsx b/web/components/cycles/active-cycle-details.tsx index a2af4b289..062dd57e7 100644 --- a/web/components/cycles/active-cycle-details.tsx +++ b/web/components/cycles/active-cycle-details.tsx @@ -19,7 +19,7 @@ import { ActiveCycleProgressStats } from "components/cycles"; // icons import { CalendarDaysIcon } from "@heroicons/react/20/solid"; -import { getPriorityIcon } from "components/icons/priority-icon"; +import { PriorityIcon } from "components/icons/priority-icon"; import { TargetIcon, ContrastIcon, @@ -477,7 +477,7 @@ export const ActiveCycleDetails: React.FC = () => { : "border-orange-500/20 bg-orange-500/20 text-orange-500" }`} > - {getPriorityIcon(issue.priority, "text-sm")} +
diff --git a/web/components/icons/priority-icon.tsx b/web/components/icons/priority-icon.tsx index 58212ca5a..8473e264b 100644 --- a/web/components/icons/priority-icon.tsx +++ b/web/components/icons/priority-icon.tsx @@ -1,22 +1,25 @@ -export const getPriorityIcon = (priority: string | null, className?: string) => { +// types +import { TIssuePriorities } from "types"; + +type Props = { + priority: TIssuePriorities | null; + className?: string; +}; + +export const PriorityIcon: React.FC = ({ priority, className = "" }) => { if (!className || className === "") className = "text-xs flex items-center"; - priority = priority?.toLowerCase() ?? null; - - switch (priority) { - case "urgent": - return error; - case "high": - return signal_cellular_alt; - case "medium": - return ( - signal_cellular_alt_2_bar - ); - case "low": - return ( - signal_cellular_alt_1_bar - ); - default: - return block; - } + return ( + + {priority === "urgent" + ? "error" + : priority === "high" + ? "signal_cellular_alt" + : priority === "medium" + ? "signal_cellular_alt_2_bar" + : priority === "low" + ? "signal_cellular_alt_1_bar" + : "block"} + + ); }; diff --git a/web/components/inbox/filters-dropdown.tsx b/web/components/inbox/filters-dropdown.tsx index 7bb601949..9220db899 100644 --- a/web/components/inbox/filters-dropdown.tsx +++ b/web/components/inbox/filters-dropdown.tsx @@ -3,7 +3,7 @@ import useInboxView from "hooks/use-inbox-view"; // ui import { MultiLevelDropdown } from "components/ui"; // icons -import { getPriorityIcon } from "components/icons"; +import { PriorityIcon } from "components/icons"; // constants import { PRIORITIES } from "constants/project"; import { INBOX_STATUS } from "constants/inbox"; @@ -42,7 +42,7 @@ export const FiltersDropdown: React.FC = () => { id: priority === null ? "null" : priority, label: (
- {getPriorityIcon(priority)} {priority ?? "None"} + {priority ?? "None"}
), value: { diff --git a/web/components/inbox/filters-list.tsx b/web/components/inbox/filters-list.tsx index 503c4ab04..7d07fb8d4 100644 --- a/web/components/inbox/filters-list.tsx +++ b/web/components/inbox/filters-list.tsx @@ -2,9 +2,11 @@ import useInboxView from "hooks/use-inbox-view"; // icons import { XMarkIcon } from "@heroicons/react/24/outline"; -import { getPriorityIcon } from "components/icons"; +import { PriorityIcon } from "components/icons"; // helpers import { replaceUnderscoreIfSnakeCase } from "helpers/string.helper"; +// types +import { TIssuePriorities } from "types"; // constants import { INBOX_STATUS } from "constants/inbox"; @@ -48,7 +50,9 @@ export const InboxFiltersList = () => { : "bg-custom-background-90 text-custom-text-200" }`} > - {getPriorityIcon(priority)} + + +
= { name: "", description_html: "", estimate_point: null, diff --git a/web/components/issues/my-issues/my-issues-select-filters.tsx b/web/components/issues/my-issues/my-issues-select-filters.tsx index 87aa36b9b..ce8e03797 100644 --- a/web/components/issues/my-issues/my-issues-select-filters.tsx +++ b/web/components/issues/my-issues/my-issues-select-filters.tsx @@ -11,7 +11,7 @@ import { DateFilterModal } from "components/core"; // ui import { MultiLevelDropdown } from "components/ui"; // icons -import { StateGroupIcon, getPriorityIcon } from "components/icons"; +import { PriorityIcon, StateGroupIcon } from "components/icons"; // helpers import { checkIfArraysHaveSameElements } from "helpers/array.helper"; // types @@ -83,7 +83,7 @@ export const MyIssuesSelectFilters: React.FC = ({ id: priority === null ? "null" : priority, label: (
- {getPriorityIcon(priority)} {priority ?? "None"} + {priority ?? "None"}
), value: { diff --git a/web/components/issues/my-issues/my-issues-view.tsx b/web/components/issues/my-issues/my-issues-view.tsx index 3500e69e7..a66f4618b 100644 --- a/web/components/issues/my-issues/my-issues-view.tsx +++ b/web/components/issues/my-issues/my-issues-view.tsx @@ -18,7 +18,7 @@ import { CreateUpdateIssueModal, DeleteIssueModal } from "components/issues"; // helpers import { orderArrayBy } from "helpers/array.helper"; // types -import { IIssue, IIssueFilterOptions } from "types"; +import { IIssue, IIssueFilterOptions, TIssuePriorities } from "types"; // fetch-keys import { USER_ISSUES, WORKSPACE_LABELS } from "constants/fetch-keys"; import { PlusIcon } from "@heroicons/react/24/outline"; @@ -96,7 +96,7 @@ export const MyIssuesView: React.FC = ({ const sourceGroup = source.droppableId; const destinationGroup = destination.droppableId; - draggedItem[groupBy] = destinationGroup; + draggedItem[groupBy] = destinationGroup as TIssuePriorities; mutate<{ [key: string]: IIssue[]; diff --git a/web/components/issues/peek-overview/issue-properties.tsx b/web/components/issues/peek-overview/issue-properties.tsx index 98aa98316..d001634fc 100644 --- a/web/components/issues/peek-overview/issue-properties.tsx +++ b/web/components/issues/peek-overview/issue-properties.tsx @@ -19,7 +19,7 @@ import { CustomDatePicker, Icon } from "components/ui"; // helpers import { copyTextToClipboard } from "helpers/string.helper"; // types -import { IIssue } from "types"; +import { IIssue, TIssuePriorities } from "types"; type Props = { handleDeleteIssue: () => void; @@ -117,7 +117,7 @@ export const PeekOverviewIssueProperties: React.FC = ({
handleUpdateIssue({ priority: val })} + onChange={(val) => handleUpdateIssue({ priority: val })} disabled={readOnly} />
diff --git a/web/components/issues/select/priority.tsx b/web/components/issues/select/priority.tsx index b734e6a90..6a2a07cbd 100644 --- a/web/components/issues/select/priority.tsx +++ b/web/components/issues/select/priority.tsx @@ -3,12 +3,14 @@ import React from "react"; // ui import { CustomSelect } from "components/ui"; // icons -import { getPriorityIcon } from "components/icons/priority-icon"; +import { PriorityIcon } from "components/icons/priority-icon"; +// types +import { TIssuePriorities } from "types"; // constants import { PRIORITIES } from "constants/project"; type Props = { - value: string | null; + value: TIssuePriorities; onChange: (value: string) => void; }; @@ -18,7 +20,10 @@ export const IssuePrioritySelect: React.FC = ({ value, onChange }) => ( label={
- {getPriorityIcon(value, `text-xs ${value ? "" : "text-custom-text-200"}`)} + {value ?? "Priority"} @@ -32,7 +37,9 @@ export const IssuePrioritySelect: React.FC = ({ value, onChange }) => (
- {getPriorityIcon(priority)} + + + {priority ?? "None"}
diff --git a/web/components/issues/sidebar-select/priority.tsx b/web/components/issues/sidebar-select/priority.tsx index 67ae5133d..543f79707 100644 --- a/web/components/issues/sidebar-select/priority.tsx +++ b/web/components/issues/sidebar-select/priority.tsx @@ -3,13 +3,15 @@ import React from "react"; // ui import { CustomSelect } from "components/ui"; // icons -import { getPriorityIcon } from "components/icons/priority-icon"; +import { PriorityIcon } from "components/icons/priority-icon"; +// types +import { TIssuePriorities } from "types"; // constants import { PRIORITIES } from "constants/project"; type Props = { - value: string | null; - onChange: (val: string) => void; + value: TIssuePriorities; + onChange: (val: TIssuePriorities) => void; disabled?: boolean; }; @@ -31,7 +33,7 @@ export const SidebarPrioritySelect: React.FC = ({ value, onChange, disabl }`} > - {getPriorityIcon(value ?? "None", "!text-sm")} + {value ?? "None"} @@ -44,7 +46,7 @@ export const SidebarPrioritySelect: React.FC = ({ value, onChange, disabl {PRIORITIES.map((option) => ( <> - {getPriorityIcon(option, "text-sm")} + {option ?? "None"} diff --git a/web/components/issues/sidebar.tsx b/web/components/issues/sidebar.tsx index 4bdd30137..a33d17705 100644 --- a/web/components/issues/sidebar.tsx +++ b/web/components/issues/sidebar.tsx @@ -401,7 +401,7 @@ export const IssueDetailsSidebar: React.FC = ({ render={({ field: { value } }) => ( submitChanges({ priority: val })} + onChange={(val) => submitChanges({ priority: val })} disabled={memberRole.isGuest || memberRole.isViewer || uneditable} /> )} diff --git a/web/components/issues/view-select/priority.tsx b/web/components/issues/view-select/priority.tsx index f9872729c..1bdbf3428 100644 --- a/web/components/issues/view-select/priority.tsx +++ b/web/components/issues/view-select/priority.tsx @@ -2,18 +2,18 @@ import React from "react"; import { useRouter } from "next/router"; +// services +import trackEventServices from "services/track-event.service"; // ui import { CustomSelect, Tooltip } from "components/ui"; // icons -import { getPriorityIcon } from "components/icons/priority-icon"; +import { PriorityIcon } from "components/icons/priority-icon"; +// helpers +import { capitalizeFirstLetter } from "helpers/string.helper"; // types -import { ICurrentUserResponse, IIssue } from "types"; +import { ICurrentUserResponse, IIssue, TIssuePriorities } from "types"; // constants import { PRIORITIES } from "constants/project"; -// services -import trackEventServices from "services/track-event.service"; -// helper -import { capitalizeFirstLetter } from "helpers/string.helper"; type Props = { issue: IIssue; @@ -42,7 +42,7 @@ export const ViewPrioritySelect: React.FC = ({ return ( { + onChange={(data: TIssuePriorities) => { partialUpdateIssue({ priority: data }, issue); trackEventServices.trackIssuePartialPropertyUpdateEvent( { @@ -77,9 +77,9 @@ export const ViewPrioritySelect: React.FC = ({ position={tooltipPosition} > - {getPriorityIcon( - issue.priority && issue.priority !== "" ? issue.priority ?? "" : "None", - `text-sm ${ + = ({ : issue.priority === "low" ? "text-green-500" : "text-custom-text-200" - }` - )} - {noBorder - ? issue.priority && issue.priority !== "" - ? capitalizeFirstLetter(issue.priority) ?? "" - : "None" - : ""} + }`} + /> + {noBorder ? capitalizeFirstLetter(issue.priority ?? "None") : ""} @@ -108,7 +104,7 @@ export const ViewPrioritySelect: React.FC = ({ {PRIORITIES?.map((priority) => ( <> - {getPriorityIcon(priority, "text-sm")} + {priority ?? "None"} diff --git a/web/components/profile/profile-issues-view.tsx b/web/components/profile/profile-issues-view.tsx index 353b55ae2..f4d75974e 100644 --- a/web/components/profile/profile-issues-view.tsx +++ b/web/components/profile/profile-issues-view.tsx @@ -18,7 +18,7 @@ import { CreateUpdateIssueModal, DeleteIssueModal } from "components/issues"; // helpers import { orderArrayBy } from "helpers/array.helper"; // types -import { IIssue, IIssueFilterOptions } from "types"; +import { IIssue, IIssueFilterOptions, TIssuePriorities } from "types"; // fetch-keys import { USER_PROFILE_PROJECT_SEGREGATION, WORKSPACE_LABELS } from "constants/fetch-keys"; @@ -108,7 +108,7 @@ export const ProfileIssuesView = () => { const sourceGroup = source.droppableId; const destinationGroup = destination.droppableId; - draggedItem[groupByProperty] = destinationGroup; + draggedItem[groupByProperty] = destinationGroup as TIssuePriorities; mutateProfileIssues((prevData: any) => { if (!prevData) return prevData; diff --git a/web/components/views/select-filters.tsx b/web/components/views/select-filters.tsx index 77ef80682..52671f41f 100644 --- a/web/components/views/select-filters.tsx +++ b/web/components/views/select-filters.tsx @@ -13,7 +13,7 @@ import { DateFilterModal } from "components/core"; // ui import { Avatar, MultiLevelDropdown } from "components/ui"; // icons -import { StateGroupIcon, getPriorityIcon } from "components/icons"; +import { PriorityIcon, StateGroupIcon } from "components/icons"; // helpers import { getStatesList } from "helpers/state.helper"; import { checkIfArraysHaveSameElements } from "helpers/array.helper"; @@ -99,7 +99,8 @@ export const SelectFilters: React.FC = ({ id: priority === null ? "null" : priority, label: (
- {getPriorityIcon(priority)} {priority ?? "None"} + + {priority ?? "None"}
), value: { diff --git a/web/components/web-view/issue-properties-detail.tsx b/web/components/web-view/issue-properties-detail.tsx index 6a247365b..2fe0356f5 100644 --- a/web/components/web-view/issue-properties-detail.tsx +++ b/web/components/web-view/issue-properties-detail.tsx @@ -109,7 +109,7 @@ export const IssuePropertiesDetail: React.FC = (props) => { render={({ field: { value } }) => ( submitChanges({ priority: val })} + onChange={(val) => submitChanges({ priority: val })} /> )} /> diff --git a/web/components/web-view/select-priority.tsx b/web/components/web-view/select-priority.tsx index 87067bc7d..ce7eef343 100644 --- a/web/components/web-view/select-priority.tsx +++ b/web/components/web-view/select-priority.tsx @@ -8,15 +8,17 @@ import { ChevronDown } from "lucide-react"; import { PRIORITIES } from "constants/project"; // components -import { getPriorityIcon } from "components/icons"; +import { PriorityIcon } from "components/icons"; import { WebViewModal } from "./web-view-modal"; // helpers import { capitalizeFirstLetter } from "helpers/string.helper"; +// types +import { TIssuePriorities } from "types"; type Props = { value: any; - onChange: (value: any) => void; + onChange: (value: TIssuePriorities) => void; disabled?: boolean; }; @@ -59,7 +61,7 @@ export const PrioritySelect: React.FC = (props) => { : "border-custom-border-200 text-custom-text-200" }`} > - {getPriorityIcon(priority, "text-sm")} +
), })) || [] diff --git a/web/constants/project.ts b/web/constants/project.ts index 374ce26b9..1a366ead6 100644 --- a/web/constants/project.ts +++ b/web/constants/project.ts @@ -1,3 +1,5 @@ +import { TIssuePriorities } from "types"; + export const NETWORK_CHOICES: { key: 0 | 2; label: string; icon: string }[] = [ { key: 0, @@ -19,7 +21,7 @@ export const GROUP_CHOICES = { cancelled: "Cancelled", }; -export const PRIORITIES = ["urgent", "high", "medium", "low", null]; +export const PRIORITIES: TIssuePriorities[] = ["urgent", "high", "medium", "low", null]; export const MONTHS = [ "January", diff --git a/web/pages/[workspaceSlug]/projects/[projectId]/archived-issues/[archivedIssueId].tsx b/web/pages/[workspaceSlug]/projects/[projectId]/archived-issues/[archivedIssueId].tsx index a48207db3..e4a1c37b2 100644 --- a/web/pages/[workspaceSlug]/projects/[projectId]/archived-issues/[archivedIssueId].tsx +++ b/web/pages/[workspaceSlug]/projects/[projectId]/archived-issues/[archivedIssueId].tsx @@ -26,7 +26,7 @@ import { PROJECT_ISSUES_ACTIVITY, ISSUE_DETAILS } from "constants/fetch-keys"; // helper import { truncateText } from "helpers/string.helper"; -const defaultValues = { +const defaultValues: Partial = { name: "", description: "", description_html: "", diff --git a/web/pages/[workspaceSlug]/projects/[projectId]/issues/[issueId].tsx b/web/pages/[workspaceSlug]/projects/[projectId]/issues/[issueId].tsx index 916c0141e..c40f936de 100644 --- a/web/pages/[workspaceSlug]/projects/[projectId]/issues/[issueId].tsx +++ b/web/pages/[workspaceSlug]/projects/[projectId]/issues/[issueId].tsx @@ -27,7 +27,7 @@ import { PROJECT_ISSUES_ACTIVITY, ISSUE_DETAILS } from "constants/fetch-keys"; // helper import { truncateText } from "helpers/string.helper"; -const defaultValues = { +const defaultValues: Partial = { assignees_list: [], description: "", description_html: "", diff --git a/web/types/issues.d.ts b/web/types/issues.d.ts index 93e1598f3..cdc0a391a 100644 --- a/web/types/issues.d.ts +++ b/web/types/issues.d.ts @@ -102,7 +102,7 @@ export interface IIssue { name: string; parent: string | null; parent_detail: IIssueParent | null; - priority: string | null; + priority: TIssuePriorities; project: string; project_detail: IProjectLite; sequence_id: number; @@ -294,3 +294,5 @@ export interface IIssueViewProps { properties: Properties; showEmptyGroups: boolean; } + +export type TIssuePriorities = "urgent" | "high" | "medium" | "low" | null;