chore: Issue poprties options in kanban are passing through props (#2490)

This commit is contained in:
guru_sainath 2023-10-19 16:23:30 +05:30 committed by GitHub
parent c0793ec8a5
commit 082e48c9cf
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 319 additions and 189 deletions

View File

@ -53,6 +53,7 @@ const GroupByKanBan: React.FC<IGroupByKanBan> = observer(
<div className="flex-shrink-0 w-full bg-custom-background-90 py-1 sticky top-0 z-[2]"> <div className="flex-shrink-0 w-full bg-custom-background-90 py-1 sticky top-0 z-[2]">
<KanBanGroupByHeaderRoot <KanBanGroupByHeaderRoot
column_id={getValueFromObject(_list, listKey) as string} column_id={getValueFromObject(_list, listKey) as string}
column_value={_list}
sub_group_by={sub_group_by} sub_group_by={sub_group_by}
group_by={group_by} group_by={group_by}
issues_count={issues?.[getValueFromObject(_list, listKey) as string]?.length || 0} issues_count={issues?.[getValueFromObject(_list, listKey) as string]?.length || 0}

View File

@ -1,15 +1,13 @@
// mobx import { FC } from "react";
import { observer } from "mobx-react-lite"; import { observer } from "mobx-react-lite";
// components // components
import { HeaderGroupByCard } from "./group-by-card"; import { HeaderGroupByCard } from "./group-by-card";
import { HeaderSubGroupByCard } from "./sub-group-by-card"; import { HeaderSubGroupByCard } from "./sub-group-by-card";
import { Avatar } from "components/ui"; import { Avatar } from "components/ui";
// store
import { useMobxStore } from "lib/mobx/store-provider";
import { RootStore } from "store/root";
export interface IAssigneesHeader { export interface IAssigneesHeader {
column_id: string; column_id: string;
column_value: any;
sub_group_by: string | null; sub_group_by: string | null;
group_by: string | null; group_by: string | null;
header_type: "group_by" | "sub_group_by"; header_type: "group_by" | "sub_group_by";
@ -20,11 +18,19 @@ export interface IAssigneesHeader {
export const Icon = ({ user }: any) => <Avatar user={user} height="22px" width="22px" fontSize="12px" />; export const Icon = ({ user }: any) => <Avatar user={user} height="22px" width="22px" fontSize="12px" />;
export const AssigneesHeader: React.FC<IAssigneesHeader> = observer( export const AssigneesHeader: FC<IAssigneesHeader> = observer((props) => {
({ column_id, sub_group_by, group_by, header_type, issues_count, kanBanToggle, handleKanBanToggle }) => { const {
const { project: projectStore }: RootStore = useMobxStore(); column_id,
column_value,
sub_group_by,
group_by,
header_type,
issues_count,
kanBanToggle,
handleKanBanToggle,
} = props;
const assignee = (column_id && projectStore?.getProjectMemberByUserId(column_id)) ?? null; const assignee = column_value ?? null;
return ( return (
<> <>
@ -52,5 +58,4 @@ export const AssigneesHeader: React.FC<IAssigneesHeader> = observer(
))} ))}
</> </>
); );
} });
);

View File

@ -1,15 +1,13 @@
// mobx import { FC } from "react";
import { observer } from "mobx-react-lite"; import { observer } from "mobx-react-lite";
// components // components
import { HeaderGroupByCard } from "./group-by-card"; import { HeaderGroupByCard } from "./group-by-card";
import { HeaderSubGroupByCard } from "./sub-group-by-card"; import { HeaderSubGroupByCard } from "./sub-group-by-card";
import { Icon } from "./assignee"; import { Icon } from "./assignee";
// store
import { useMobxStore } from "lib/mobx/store-provider";
import { RootStore } from "store/root";
export interface ICreatedByHeader { export interface ICreatedByHeader {
column_id: string; column_id: string;
column_value: any;
sub_group_by: string | null; sub_group_by: string | null;
group_by: string | null; group_by: string | null;
header_type: "group_by" | "sub_group_by"; header_type: "group_by" | "sub_group_by";
@ -18,11 +16,19 @@ export interface ICreatedByHeader {
handleKanBanToggle: any; handleKanBanToggle: any;
} }
export const CreatedByHeader: React.FC<ICreatedByHeader> = observer( export const CreatedByHeader: FC<ICreatedByHeader> = observer((props) => {
({ column_id, sub_group_by, group_by, header_type, issues_count, kanBanToggle, handleKanBanToggle }) => { const {
const { project: projectStore }: RootStore = useMobxStore(); column_id,
column_value,
sub_group_by,
group_by,
header_type,
issues_count,
kanBanToggle,
handleKanBanToggle,
} = props;
const createdBy = (column_id && projectStore?.getProjectMemberByUserId(column_id)) ?? null; const createdBy = column_value ?? null;
return ( return (
<> <>
@ -50,5 +56,4 @@ export const CreatedByHeader: React.FC<ICreatedByHeader> = observer(
))} ))}
</> </>
); );
} });
);

View File

@ -1,4 +1,5 @@
// components // components
import { ProjectHeader } from "./project";
import { StateHeader } from "./state"; import { StateHeader } from "./state";
import { StateGroupHeader } from "./state-group"; import { StateGroupHeader } from "./state-group";
import { AssigneesHeader } from "./assignee"; import { AssigneesHeader } from "./assignee";
@ -10,6 +11,7 @@ import { observer } from "mobx-react-lite";
export interface IKanBanGroupByHeaderRoot { export interface IKanBanGroupByHeaderRoot {
column_id: string; column_id: string;
column_value: any;
sub_group_by: string | null; sub_group_by: string | null;
group_by: string | null; group_by: string | null;
issues_count: number; issues_count: number;
@ -18,11 +20,25 @@ export interface IKanBanGroupByHeaderRoot {
} }
export const KanBanGroupByHeaderRoot: React.FC<IKanBanGroupByHeaderRoot> = observer( export const KanBanGroupByHeaderRoot: React.FC<IKanBanGroupByHeaderRoot> = observer(
({ column_id, sub_group_by, group_by, issues_count, kanBanToggle, handleKanBanToggle }) => ( ({ column_id, column_value, sub_group_by, group_by, issues_count, kanBanToggle, handleKanBanToggle }) => (
<> <>
{group_by && group_by === "project" && (
<ProjectHeader
column_id={column_id}
column_value={column_value}
sub_group_by={sub_group_by}
group_by={group_by}
header_type={`group_by`}
issues_count={issues_count}
kanBanToggle={kanBanToggle}
handleKanBanToggle={handleKanBanToggle}
/>
)}
{group_by && group_by === "state" && ( {group_by && group_by === "state" && (
<StateHeader <StateHeader
column_id={column_id} column_id={column_id}
column_value={column_value}
sub_group_by={sub_group_by} sub_group_by={sub_group_by}
group_by={group_by} group_by={group_by}
header_type={`group_by`} header_type={`group_by`}
@ -34,6 +50,7 @@ export const KanBanGroupByHeaderRoot: React.FC<IKanBanGroupByHeaderRoot> = obser
{group_by && group_by === "state_detail.group" && ( {group_by && group_by === "state_detail.group" && (
<StateGroupHeader <StateGroupHeader
column_id={column_id} column_id={column_id}
column_value={column_value}
sub_group_by={sub_group_by} sub_group_by={sub_group_by}
group_by={group_by} group_by={group_by}
header_type={`group_by`} header_type={`group_by`}
@ -45,6 +62,7 @@ export const KanBanGroupByHeaderRoot: React.FC<IKanBanGroupByHeaderRoot> = obser
{group_by && group_by === "priority" && ( {group_by && group_by === "priority" && (
<PriorityHeader <PriorityHeader
column_id={column_id} column_id={column_id}
column_value={column_value}
sub_group_by={sub_group_by} sub_group_by={sub_group_by}
group_by={group_by} group_by={group_by}
header_type={`group_by`} header_type={`group_by`}
@ -56,6 +74,7 @@ export const KanBanGroupByHeaderRoot: React.FC<IKanBanGroupByHeaderRoot> = obser
{group_by && group_by === "labels" && ( {group_by && group_by === "labels" && (
<LabelHeader <LabelHeader
column_id={column_id} column_id={column_id}
column_value={column_value}
sub_group_by={sub_group_by} sub_group_by={sub_group_by}
group_by={group_by} group_by={group_by}
header_type={`group_by`} header_type={`group_by`}
@ -67,6 +86,7 @@ export const KanBanGroupByHeaderRoot: React.FC<IKanBanGroupByHeaderRoot> = obser
{group_by && group_by === "assignees" && ( {group_by && group_by === "assignees" && (
<AssigneesHeader <AssigneesHeader
column_id={column_id} column_id={column_id}
column_value={column_value}
sub_group_by={sub_group_by} sub_group_by={sub_group_by}
group_by={group_by} group_by={group_by}
header_type={`group_by`} header_type={`group_by`}
@ -78,6 +98,7 @@ export const KanBanGroupByHeaderRoot: React.FC<IKanBanGroupByHeaderRoot> = obser
{group_by && group_by === "created_by" && ( {group_by && group_by === "created_by" && (
<CreatedByHeader <CreatedByHeader
column_id={column_id} column_id={column_id}
column_value={column_value}
sub_group_by={sub_group_by} sub_group_by={sub_group_by}
group_by={group_by} group_by={group_by}
header_type={`group_by`} header_type={`group_by`}

View File

@ -1,14 +1,12 @@
// mobx import { FC } from "react";
import { observer } from "mobx-react-lite"; import { observer } from "mobx-react-lite";
// components // components
import { HeaderGroupByCard } from "./group-by-card"; import { HeaderGroupByCard } from "./group-by-card";
import { HeaderSubGroupByCard } from "./sub-group-by-card"; import { HeaderSubGroupByCard } from "./sub-group-by-card";
// store
import { useMobxStore } from "lib/mobx/store-provider";
import { RootStore } from "store/root";
export interface ILabelHeader { export interface ILabelHeader {
column_id: string; column_id: string;
column_value: any;
sub_group_by: string | null; sub_group_by: string | null;
group_by: string | null; group_by: string | null;
header_type: "group_by" | "sub_group_by"; header_type: "group_by" | "sub_group_by";
@ -21,11 +19,19 @@ const Icon = ({ color }: any) => (
<div className="w-[12px] h-[12px] rounded-full" style={{ backgroundColor: color ? color : "#666" }} /> <div className="w-[12px] h-[12px] rounded-full" style={{ backgroundColor: color ? color : "#666" }} />
); );
export const LabelHeader: React.FC<ILabelHeader> = observer( export const LabelHeader: FC<ILabelHeader> = observer((props) => {
({ column_id, sub_group_by, group_by, header_type, issues_count, kanBanToggle, handleKanBanToggle }) => { const {
const { project: projectStore }: RootStore = useMobxStore(); column_id,
column_value,
sub_group_by,
group_by,
header_type,
issues_count,
kanBanToggle,
handleKanBanToggle,
} = props;
const label = (column_id && projectStore?.getProjectLabelById(column_id)) ?? null; const label = column_value ?? null;
return ( return (
<> <>
@ -53,5 +59,4 @@ export const LabelHeader: React.FC<ILabelHeader> = observer(
))} ))}
</> </>
); );
} });
);

View File

@ -1,13 +1,13 @@
import { FC } from "react";
import { observer } from "mobx-react-lite"; import { observer } from "mobx-react-lite";
import { AlertCircle, SignalHigh, SignalMedium, SignalLow, Ban } from "lucide-react"; import { AlertCircle, SignalHigh, SignalMedium, SignalLow, Ban } from "lucide-react";
// components // components
import { HeaderGroupByCard } from "./group-by-card"; import { HeaderGroupByCard } from "./group-by-card";
import { HeaderSubGroupByCard } from "./sub-group-by-card"; import { HeaderSubGroupByCard } from "./sub-group-by-card";
// constants
import { issuePriorityByKey } from "constants/issue";
export interface IPriorityHeader { export interface IPriorityHeader {
column_id: string; column_id: string;
column_value: any;
sub_group_by: string | null; sub_group_by: string | null;
group_by: string | null; group_by: string | null;
header_type: "group_by" | "sub_group_by"; header_type: "group_by" | "sub_group_by";
@ -42,10 +42,19 @@ const Icon = ({ priority }: any) => (
</div> </div>
); );
export const PriorityHeader: React.FC<IPriorityHeader> = observer((props) => { export const PriorityHeader: FC<IPriorityHeader> = observer((props) => {
const { column_id, sub_group_by, group_by, header_type, issues_count, kanBanToggle, handleKanBanToggle } = props; const {
column_id,
column_value,
sub_group_by,
group_by,
header_type,
issues_count,
kanBanToggle,
handleKanBanToggle,
} = props;
const priority = column_id && issuePriorityByKey(column_id); const priority = column_value || null;
return ( return (
<> <>

View File

@ -0,0 +1,62 @@
import { FC } from "react";
import { observer } from "mobx-react-lite";
// components
import { HeaderGroupByCard } from "./group-by-card";
import { HeaderSubGroupByCard } from "./sub-group-by-card";
// emoji helper
import { renderEmoji } from "helpers/emoji.helper";
export interface IProjectHeader {
column_id: string;
column_value: any;
sub_group_by: string | null;
group_by: string | null;
header_type: "group_by" | "sub_group_by";
issues_count: number;
kanBanToggle: any;
handleKanBanToggle: any;
}
const Icon = ({ emoji }: any) => <div className="w-6 h-6">{renderEmoji(emoji)}</div>;
export const ProjectHeader: FC<IProjectHeader> = observer((props) => {
const {
column_id,
column_value,
sub_group_by,
group_by,
header_type,
issues_count,
kanBanToggle,
handleKanBanToggle,
} = props;
const project = column_value ?? null;
return (
<>
{project &&
(sub_group_by && header_type === "sub_group_by" ? (
<HeaderSubGroupByCard
column_id={column_id}
icon={<Icon emoji={project?.emoji} />}
title={project?.name || ""}
count={issues_count}
kanBanToggle={kanBanToggle}
handleKanBanToggle={handleKanBanToggle}
/>
) : (
<HeaderGroupByCard
sub_group_by={sub_group_by}
group_by={group_by}
column_id={column_id}
icon={<Icon emoji={project?.emoji} />}
title={project?.name || ""}
count={issues_count}
kanBanToggle={kanBanToggle}
handleKanBanToggle={handleKanBanToggle}
/>
))}
</>
);
});

View File

@ -1,14 +1,13 @@
// mobx import { FC } from "react";
import { observer } from "mobx-react-lite"; import { observer } from "mobx-react-lite";
// components // components
import { HeaderGroupByCard } from "./group-by-card"; import { HeaderGroupByCard } from "./group-by-card";
import { HeaderSubGroupByCard } from "./sub-group-by-card"; import { HeaderSubGroupByCard } from "./sub-group-by-card";
import { StateGroupIcon } from "@plane/ui"; import { StateGroupIcon } from "@plane/ui";
// constants
import { issueStateGroupByKey } from "constants/issue";
export interface IStateGroupHeader { export interface IStateGroupHeader {
column_id: string; column_id: string;
column_value: any;
sub_group_by: string | null; sub_group_by: string | null;
group_by: string | null; group_by: string | null;
header_type: "group_by" | "sub_group_by"; header_type: "group_by" | "sub_group_by";
@ -23,11 +22,19 @@ export const Icon = ({ stateGroup, color }: { stateGroup: any; color?: any }) =>
</div> </div>
); );
export const StateGroupHeader: React.FC<IStateGroupHeader> = observer( export const StateGroupHeader: FC<IStateGroupHeader> = observer((props) => {
({ column_id, sub_group_by, group_by, header_type, issues_count, kanBanToggle, handleKanBanToggle }) => { const {
const stateGroup = column_id && issueStateGroupByKey(column_id); column_id,
column_value,
sub_group_by,
group_by,
header_type,
issues_count,
kanBanToggle,
handleKanBanToggle,
} = props;
console.log("stateGroup", stateGroup); const stateGroup = column_value || null;
return ( return (
<> <>
@ -55,5 +62,4 @@ export const StateGroupHeader: React.FC<IStateGroupHeader> = observer(
))} ))}
</> </>
); );
} });
);

View File

@ -1,15 +1,13 @@
// mobx import { FC } from "react";
import { observer } from "mobx-react-lite"; import { observer } from "mobx-react-lite";
// components // components
import { HeaderGroupByCard } from "./group-by-card"; import { HeaderGroupByCard } from "./group-by-card";
import { HeaderSubGroupByCard } from "./sub-group-by-card"; import { HeaderSubGroupByCard } from "./sub-group-by-card";
import { Icon } from "./state-group"; import { Icon } from "./state-group";
// store
import { useMobxStore } from "lib/mobx/store-provider";
import { RootStore } from "store/root";
export interface IStateHeader { export interface IStateHeader {
column_id: string; column_id: string;
column_value: any;
sub_group_by: string | null; sub_group_by: string | null;
group_by: string | null; group_by: string | null;
header_type: "group_by" | "sub_group_by"; header_type: "group_by" | "sub_group_by";
@ -18,11 +16,19 @@ export interface IStateHeader {
handleKanBanToggle: any; handleKanBanToggle: any;
} }
export const StateHeader: React.FC<IStateHeader> = observer( export const StateHeader: FC<IStateHeader> = observer((props) => {
({ column_id, sub_group_by, group_by, header_type, issues_count, kanBanToggle, handleKanBanToggle }) => { const {
const { project: projectStore }: RootStore = useMobxStore(); column_id,
column_value,
sub_group_by,
group_by,
header_type,
issues_count,
kanBanToggle,
handleKanBanToggle,
} = props;
const state = (column_id && projectStore?.getProjectStateById(column_id)) ?? null; const state = column_value ?? null;
return ( return (
<> <>
@ -50,5 +56,4 @@ export const StateHeader: React.FC<IStateHeader> = observer(
))} ))}
</> </>
); );
} });
);

View File

@ -10,6 +10,7 @@ import { CreatedByHeader } from "./created_by";
export interface IKanBanSubGroupByHeaderRoot { export interface IKanBanSubGroupByHeaderRoot {
column_id: string; column_id: string;
column_value: any;
sub_group_by: string | null; sub_group_by: string | null;
group_by: string | null; group_by: string | null;
issues_count: number; issues_count: number;
@ -17,12 +18,15 @@ export interface IKanBanSubGroupByHeaderRoot {
handleKanBanToggle: any; handleKanBanToggle: any;
} }
export const KanBanSubGroupByHeaderRoot: React.FC<IKanBanSubGroupByHeaderRoot> = observer( export const KanBanSubGroupByHeaderRoot: React.FC<IKanBanSubGroupByHeaderRoot> = observer((props) => {
({ column_id, sub_group_by, group_by, issues_count, kanBanToggle, handleKanBanToggle }) => ( const { column_id, column_value, sub_group_by, group_by, issues_count, kanBanToggle, handleKanBanToggle } = props;
return (
<> <>
{sub_group_by && sub_group_by === "state" && ( {sub_group_by && sub_group_by === "state" && (
<StateHeader <StateHeader
column_id={column_id} column_id={column_id}
column_value={column_value}
sub_group_by={sub_group_by} sub_group_by={sub_group_by}
group_by={group_by} group_by={group_by}
header_type={`sub_group_by`} header_type={`sub_group_by`}
@ -34,6 +38,7 @@ export const KanBanSubGroupByHeaderRoot: React.FC<IKanBanSubGroupByHeaderRoot> =
{sub_group_by && sub_group_by === "state_detail.group" && ( {sub_group_by && sub_group_by === "state_detail.group" && (
<StateGroupHeader <StateGroupHeader
column_id={column_id} column_id={column_id}
column_value={column_value}
sub_group_by={sub_group_by} sub_group_by={sub_group_by}
group_by={group_by} group_by={group_by}
header_type={`sub_group_by`} header_type={`sub_group_by`}
@ -45,6 +50,7 @@ export const KanBanSubGroupByHeaderRoot: React.FC<IKanBanSubGroupByHeaderRoot> =
{sub_group_by && sub_group_by === "priority" && ( {sub_group_by && sub_group_by === "priority" && (
<PriorityHeader <PriorityHeader
column_id={column_id} column_id={column_id}
column_value={column_value}
sub_group_by={sub_group_by} sub_group_by={sub_group_by}
group_by={group_by} group_by={group_by}
header_type={`sub_group_by`} header_type={`sub_group_by`}
@ -56,6 +62,7 @@ export const KanBanSubGroupByHeaderRoot: React.FC<IKanBanSubGroupByHeaderRoot> =
{sub_group_by && sub_group_by === "labels" && ( {sub_group_by && sub_group_by === "labels" && (
<LabelHeader <LabelHeader
column_id={column_id} column_id={column_id}
column_value={column_value}
sub_group_by={sub_group_by} sub_group_by={sub_group_by}
group_by={group_by} group_by={group_by}
header_type={`sub_group_by`} header_type={`sub_group_by`}
@ -67,6 +74,7 @@ export const KanBanSubGroupByHeaderRoot: React.FC<IKanBanSubGroupByHeaderRoot> =
{sub_group_by && sub_group_by === "assignees" && ( {sub_group_by && sub_group_by === "assignees" && (
<AssigneesHeader <AssigneesHeader
column_id={column_id} column_id={column_id}
column_value={column_value}
sub_group_by={sub_group_by} sub_group_by={sub_group_by}
group_by={group_by} group_by={group_by}
header_type={`sub_group_by`} header_type={`sub_group_by`}
@ -78,6 +86,7 @@ export const KanBanSubGroupByHeaderRoot: React.FC<IKanBanSubGroupByHeaderRoot> =
{sub_group_by && sub_group_by === "created_by" && ( {sub_group_by && sub_group_by === "created_by" && (
<CreatedByHeader <CreatedByHeader
column_id={column_id} column_id={column_id}
column_value={column_value}
sub_group_by={sub_group_by} sub_group_by={sub_group_by}
group_by={group_by} group_by={group_by}
header_type={`sub_group_by`} header_type={`sub_group_by`}
@ -87,5 +96,5 @@ export const KanBanSubGroupByHeaderRoot: React.FC<IKanBanSubGroupByHeaderRoot> =
/> />
)} )}
</> </>
) );
); });

View File

@ -46,6 +46,7 @@ const SubGroupSwimlaneHeader: React.FC<ISubGroupSwimlaneHeader> = ({
<div className="flex-shrink-0 flex flex-col w-[340px]"> <div className="flex-shrink-0 flex flex-col w-[340px]">
<KanBanGroupByHeaderRoot <KanBanGroupByHeaderRoot
column_id={getValueFromObject(_list, listKey) as string} column_id={getValueFromObject(_list, listKey) as string}
column_value={_list}
sub_group_by={sub_group_by} sub_group_by={sub_group_by}
group_by={group_by} group_by={group_by}
issues_count={calculateIssueCount(getValueFromObject(_list, listKey) as string)} issues_count={calculateIssueCount(getValueFromObject(_list, listKey) as string)}
@ -111,6 +112,7 @@ const SubGroupSwimlane: React.FC<ISubGroupSwimlane> = observer((props) => {
<div className="flex-shrink-0 sticky left-0 bg-custom-background-90 pr-2"> <div className="flex-shrink-0 sticky left-0 bg-custom-background-90 pr-2">
<KanBanSubGroupByHeaderRoot <KanBanSubGroupByHeaderRoot
column_id={getValueFromObject(_list, listKey) as string} column_id={getValueFromObject(_list, listKey) as string}
column_value={_list}
sub_group_by={sub_group_by} sub_group_by={sub_group_by}
group_by={group_by} group_by={group_by}
issues_count={calculateIssueCount(getValueFromObject(_list, listKey) as string)} issues_count={calculateIssueCount(getValueFromObject(_list, listKey) as string)}