fix: rewrite the label manager to no longer use useRef
useRef was causing a `readonly` error when trying to overwrite `ref.current`. Rewrote components to use an Apollo query instead. fixes #121
This commit is contained in:
parent
d1b867db35
commit
76e398488f
@ -7,12 +7,13 @@ import { Popup, usePopup } from 'shared/components/PopupMenu';
|
|||||||
import produce from 'immer';
|
import produce from 'immer';
|
||||||
import { mixin } from 'shared/utils/styles';
|
import { mixin } from 'shared/utils/styles';
|
||||||
import Member from 'shared/components/Member';
|
import Member from 'shared/components/Member';
|
||||||
|
import { useLabelsQuery } from 'shared/generated/graphql';
|
||||||
|
|
||||||
const FilterMember = styled(Member)`
|
const FilterMember = styled(Member)`
|
||||||
margin: 2px 0;
|
margin: 2px 0;
|
||||||
&:hover {
|
&:hover {
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
background: ${props => props.theme.colors.primary};
|
background: ${(props) => props.theme.colors.primary};
|
||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
|
|
||||||
@ -28,7 +29,7 @@ export const Label = styled.li`
|
|||||||
`;
|
`;
|
||||||
|
|
||||||
export const CardLabel = styled.span<{ active: boolean; color: string }>`
|
export const CardLabel = styled.span<{ active: boolean; color: string }>`
|
||||||
${props =>
|
${(props) =>
|
||||||
props.active &&
|
props.active &&
|
||||||
css`
|
css`
|
||||||
margin-left: 4px;
|
margin-left: 4px;
|
||||||
@ -43,7 +44,7 @@ export const CardLabel = styled.span<{ active: boolean; color: string }>`
|
|||||||
padding: 6px 12px;
|
padding: 6px 12px;
|
||||||
position: relative;
|
position: relative;
|
||||||
transition: padding 85ms, margin 85ms, box-shadow 85ms;
|
transition: padding 85ms, margin 85ms, box-shadow 85ms;
|
||||||
background-color: ${props => props.color};
|
background-color: ${(props) => props.color};
|
||||||
color: #fff;
|
color: #fff;
|
||||||
display: block;
|
display: block;
|
||||||
max-width: 100%;
|
max-width: 100%;
|
||||||
@ -71,7 +72,7 @@ export const ActionItem = styled.li`
|
|||||||
align-items: center;
|
align-items: center;
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
&:hover {
|
&:hover {
|
||||||
background: ${props => props.theme.colors.primary};
|
background: ${(props) => props.theme.colors.primary};
|
||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
|
|
||||||
@ -80,7 +81,7 @@ export const ActionTitle = styled.span`
|
|||||||
`;
|
`;
|
||||||
|
|
||||||
const ActionItemSeparator = styled.li`
|
const ActionItemSeparator = styled.li`
|
||||||
color: ${props => mixin.rgba(props.theme.colors.text.primary, 0.4)};
|
color: ${(props) => mixin.rgba(props.theme.colors.text.primary, 0.4)};
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
padding-left: 4px;
|
padding-left: 4px;
|
||||||
padding-right: 4px;
|
padding-right: 4px;
|
||||||
@ -110,15 +111,16 @@ const ActionItemLine = styled.div`
|
|||||||
type FilterMetaProps = {
|
type FilterMetaProps = {
|
||||||
filters: TaskMetaFilters;
|
filters: TaskMetaFilters;
|
||||||
userID: string;
|
userID: string;
|
||||||
labels: React.RefObject<Array<ProjectLabel>>;
|
projectID: string;
|
||||||
members: React.RefObject<Array<TaskUser>>;
|
members: React.RefObject<Array<TaskUser>>;
|
||||||
onChangeTaskMetaFilter: (filters: TaskMetaFilters) => void;
|
onChangeTaskMetaFilter: (filters: TaskMetaFilters) => void;
|
||||||
};
|
};
|
||||||
|
|
||||||
const FilterMeta: React.FC<FilterMetaProps> = ({ filters, onChangeTaskMetaFilter, userID, labels, members }) => {
|
const FilterMeta: React.FC<FilterMetaProps> = ({ filters, onChangeTaskMetaFilter, userID, projectID, members }) => {
|
||||||
const [currentFilters, setFilters] = useState(filters);
|
const [currentFilters, setFilters] = useState(filters);
|
||||||
const [nameFilter, setNameFilter] = useState(filters.taskName ? filters.taskName.name : '');
|
const [nameFilter, setNameFilter] = useState(filters.taskName ? filters.taskName.name : '');
|
||||||
const [currentLabel, setCurrentLabel] = useState('');
|
const [currentLabel, setCurrentLabel] = useState('');
|
||||||
|
const { data } = useLabelsQuery({ variables: { projectID } });
|
||||||
|
|
||||||
const handleSetFilters = (f: TaskMetaFilters) => {
|
const handleSetFilters = (f: TaskMetaFilters) => {
|
||||||
setFilters(f);
|
setFilters(f);
|
||||||
@ -127,7 +129,7 @@ const FilterMeta: React.FC<FilterMetaProps> = ({ filters, onChangeTaskMetaFilter
|
|||||||
|
|
||||||
const handleNameChange = (nFilter: string) => {
|
const handleNameChange = (nFilter: string) => {
|
||||||
handleSetFilters(
|
handleSetFilters(
|
||||||
produce(currentFilters, draftFilters => {
|
produce(currentFilters, (draftFilters) => {
|
||||||
draftFilters.taskName = nFilter !== '' ? { name: nFilter } : null;
|
draftFilters.taskName = nFilter !== '' ? { name: nFilter } : null;
|
||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
@ -138,7 +140,7 @@ const FilterMeta: React.FC<FilterMetaProps> = ({ filters, onChangeTaskMetaFilter
|
|||||||
|
|
||||||
const handleSetDueDate = (filterType: DueDateFilterType, label: string) => {
|
const handleSetDueDate = (filterType: DueDateFilterType, label: string) => {
|
||||||
handleSetFilters(
|
handleSetFilters(
|
||||||
produce(currentFilters, draftFilters => {
|
produce(currentFilters, (draftFilters) => {
|
||||||
if (draftFilters.dueDate && draftFilters.dueDate.type === filterType) {
|
if (draftFilters.dueDate && draftFilters.dueDate.type === filterType) {
|
||||||
draftFilters.dueDate = null;
|
draftFilters.dueDate = null;
|
||||||
} else {
|
} else {
|
||||||
@ -157,7 +159,7 @@ const FilterMeta: React.FC<FilterMetaProps> = ({ filters, onChangeTaskMetaFilter
|
|||||||
<ActionsList>
|
<ActionsList>
|
||||||
<TaskNameInput
|
<TaskNameInput
|
||||||
width="100%"
|
width="100%"
|
||||||
onChange={e => handleNameChange(e.currentTarget.value)}
|
onChange={(e) => handleNameChange(e.currentTarget.value)}
|
||||||
value={nameFilter}
|
value={nameFilter}
|
||||||
autoFocus
|
autoFocus
|
||||||
variant="alternate"
|
variant="alternate"
|
||||||
@ -167,14 +169,14 @@ const FilterMeta: React.FC<FilterMetaProps> = ({ filters, onChangeTaskMetaFilter
|
|||||||
<ActionItem
|
<ActionItem
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
handleSetFilters(
|
handleSetFilters(
|
||||||
produce(currentFilters, draftFilters => {
|
produce(currentFilters, (draftFilters) => {
|
||||||
if (members.current) {
|
if (members.current) {
|
||||||
const member = members.current.find(m => m.id === userID);
|
const member = members.current.find((m) => m.id === userID);
|
||||||
const draftMember = draftFilters.members.find(m => m.id === userID);
|
const draftMember = draftFilters.members.find((m) => m.id === userID);
|
||||||
if (member && !draftMember) {
|
if (member && !draftMember) {
|
||||||
draftFilters.members.push({ id: userID, username: member.username ? member.username : '' });
|
draftFilters.members.push({ id: userID, username: member.username ? member.username : '' });
|
||||||
} else {
|
} else {
|
||||||
draftFilters.members = draftFilters.members.filter(m => m.id !== userID);
|
draftFilters.members = draftFilters.members.filter((m) => m.id !== userID);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
@ -185,7 +187,7 @@ const FilterMeta: React.FC<FilterMetaProps> = ({ filters, onChangeTaskMetaFilter
|
|||||||
<User width={12} height={12} />
|
<User width={12} height={12} />
|
||||||
</ItemIcon>
|
</ItemIcon>
|
||||||
<ActionTitle>Just my tasks</ActionTitle>
|
<ActionTitle>Just my tasks</ActionTitle>
|
||||||
{currentFilters.members.find(m => m.id === userID) && <ActiveIcon width={12} height={12} />}
|
{currentFilters.members.find((m) => m.id === userID) && <ActiveIcon width={12} height={12} />}
|
||||||
</ActionItem>
|
</ActionItem>
|
||||||
<ActionItem onClick={() => handleSetDueDate(DueDateFilterType.THIS_WEEK, 'Due this week')}>
|
<ActionItem onClick={() => handleSetDueDate(DueDateFilterType.THIS_WEEK, 'Due this week')}>
|
||||||
<ItemIcon>
|
<ItemIcon>
|
||||||
@ -228,10 +230,10 @@ const FilterMeta: React.FC<FilterMetaProps> = ({ filters, onChangeTaskMetaFilter
|
|||||||
</Popup>
|
</Popup>
|
||||||
<Popup tab={1} title="By Labels">
|
<Popup tab={1} title="By Labels">
|
||||||
<Labels>
|
<Labels>
|
||||||
{labels.current &&
|
{data &&
|
||||||
labels.current
|
data.findProject.labels
|
||||||
// .filter(label => '' === '' || (label.name && label.name.toLowerCase().startsWith(''.toLowerCase())))
|
// .filter(label => '' === '' || (label.name && label.name.toLowerCase().startsWith(''.toLowerCase())))
|
||||||
.map(label => (
|
.map((label) => (
|
||||||
<Label key={label.id}>
|
<Label key={label.id}>
|
||||||
<CardLabel
|
<CardLabel
|
||||||
key={label.id}
|
key={label.id}
|
||||||
@ -242,9 +244,9 @@ const FilterMeta: React.FC<FilterMetaProps> = ({ filters, onChangeTaskMetaFilter
|
|||||||
}}
|
}}
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
handleSetFilters(
|
handleSetFilters(
|
||||||
produce(currentFilters, draftFilters => {
|
produce(currentFilters, (draftFilters) => {
|
||||||
if (draftFilters.labels.find(l => l.id === label.id)) {
|
if (draftFilters.labels.find((l) => l.id === label.id)) {
|
||||||
draftFilters.labels = draftFilters.labels.filter(l => l.id !== label.id);
|
draftFilters.labels = draftFilters.labels.filter((l) => l.id !== label.id);
|
||||||
} else {
|
} else {
|
||||||
draftFilters.labels.push({
|
draftFilters.labels.push({
|
||||||
id: label.id,
|
id: label.id,
|
||||||
@ -265,16 +267,16 @@ const FilterMeta: React.FC<FilterMetaProps> = ({ filters, onChangeTaskMetaFilter
|
|||||||
<Popup tab={2} title="By Member">
|
<Popup tab={2} title="By Member">
|
||||||
<ActionsList>
|
<ActionsList>
|
||||||
{members.current &&
|
{members.current &&
|
||||||
members.current.map(member => (
|
members.current.map((member) => (
|
||||||
<FilterMember
|
<FilterMember
|
||||||
key={member.id}
|
key={member.id}
|
||||||
member={member}
|
member={member}
|
||||||
showName
|
showName
|
||||||
onCardMemberClick={() => {
|
onCardMemberClick={() => {
|
||||||
handleSetFilters(
|
handleSetFilters(
|
||||||
produce(currentFilters, draftFilters => {
|
produce(currentFilters, (draftFilters) => {
|
||||||
if (draftFilters.members.find(m => m.id === member.id)) {
|
if (draftFilters.members.find((m) => m.id === member.id)) {
|
||||||
draftFilters.members = draftFilters.members.filter(m => m.id !== member.id);
|
draftFilters.members = draftFilters.members.filter((m) => m.id !== member.id);
|
||||||
} else {
|
} else {
|
||||||
draftFilters.members.push({ id: member.id, username: member.username ?? '' });
|
draftFilters.members.push({ id: member.id, username: member.username ?? '' });
|
||||||
}
|
}
|
||||||
|
@ -136,16 +136,16 @@ const ProjectActionWrapper = styled.div<{ disabled?: boolean }>`
|
|||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
font-size: 15px;
|
font-size: 15px;
|
||||||
color: ${props => props.theme.colors.text.primary};
|
color: ${(props) => props.theme.colors.text.primary};
|
||||||
|
|
||||||
&:not(:last-of-type) {
|
&:not(:last-of-type) {
|
||||||
margin-right: 16px;
|
margin-right: 16px;
|
||||||
}
|
}
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
color: ${props => props.theme.colors.text.secondary};
|
color: ${(props) => props.theme.colors.text.secondary};
|
||||||
}
|
}
|
||||||
${props =>
|
${(props) =>
|
||||||
props.disabled &&
|
props.disabled &&
|
||||||
css`
|
css`
|
||||||
opacity: 0.5;
|
opacity: 0.5;
|
||||||
@ -280,8 +280,8 @@ const ProjectBoard: React.FC<ProjectBoardProps> = ({ projectID, onCardLabelClick
|
|||||||
updateApolloCache<FindProjectQuery>(
|
updateApolloCache<FindProjectQuery>(
|
||||||
client,
|
client,
|
||||||
FindProjectDocument,
|
FindProjectDocument,
|
||||||
cache =>
|
(cache) =>
|
||||||
produce(cache, draftCache => {
|
produce(cache, (draftCache) => {
|
||||||
draftCache.findProject.taskGroups = draftCache.findProject.taskGroups.filter(
|
draftCache.findProject.taskGroups = draftCache.findProject.taskGroups.filter(
|
||||||
(taskGroup: TaskGroup) => taskGroup.id !== deletedTaskGroupData.data?.deleteTaskGroup.taskGroup.id,
|
(taskGroup: TaskGroup) => taskGroup.id !== deletedTaskGroupData.data?.deleteTaskGroup.taskGroup.id,
|
||||||
);
|
);
|
||||||
@ -296,10 +296,10 @@ const ProjectBoard: React.FC<ProjectBoardProps> = ({ projectID, onCardLabelClick
|
|||||||
updateApolloCache<FindProjectQuery>(
|
updateApolloCache<FindProjectQuery>(
|
||||||
client,
|
client,
|
||||||
FindProjectDocument,
|
FindProjectDocument,
|
||||||
cache =>
|
(cache) =>
|
||||||
produce(cache, draftCache => {
|
produce(cache, (draftCache) => {
|
||||||
const { taskGroups } = cache.findProject;
|
const { taskGroups } = cache.findProject;
|
||||||
const idx = taskGroups.findIndex(taskGroup => taskGroup.id === newTaskData.data?.createTask.taskGroup.id);
|
const idx = taskGroups.findIndex((taskGroup) => taskGroup.id === newTaskData.data?.createTask.taskGroup.id);
|
||||||
if (idx !== -1) {
|
if (idx !== -1) {
|
||||||
if (newTaskData.data) {
|
if (newTaskData.data) {
|
||||||
draftCache.findProject.taskGroups[idx].tasks.push({ ...newTaskData.data.createTask });
|
draftCache.findProject.taskGroups[idx].tasks.push({ ...newTaskData.data.createTask });
|
||||||
@ -316,8 +316,8 @@ const ProjectBoard: React.FC<ProjectBoardProps> = ({ projectID, onCardLabelClick
|
|||||||
updateApolloCache<FindProjectQuery>(
|
updateApolloCache<FindProjectQuery>(
|
||||||
client,
|
client,
|
||||||
FindProjectDocument,
|
FindProjectDocument,
|
||||||
cache =>
|
(cache) =>
|
||||||
produce(cache, draftCache => {
|
produce(cache, (draftCache) => {
|
||||||
if (newTaskGroupData.data) {
|
if (newTaskGroupData.data) {
|
||||||
draftCache.findProject.taskGroups.push({ ...newTaskGroupData.data.createTaskGroup, tasks: [] });
|
draftCache.findProject.taskGroups.push({ ...newTaskGroupData.data.createTaskGroup, tasks: [] });
|
||||||
}
|
}
|
||||||
@ -336,10 +336,10 @@ const ProjectBoard: React.FC<ProjectBoardProps> = ({ projectID, onCardLabelClick
|
|||||||
updateApolloCache<FindProjectQuery>(
|
updateApolloCache<FindProjectQuery>(
|
||||||
client,
|
client,
|
||||||
FindProjectDocument,
|
FindProjectDocument,
|
||||||
cache =>
|
(cache) =>
|
||||||
produce(cache, draftCache => {
|
produce(cache, (draftCache) => {
|
||||||
const idx = cache.findProject.taskGroups.findIndex(
|
const idx = cache.findProject.taskGroups.findIndex(
|
||||||
t => t.id === resp.data?.deleteTaskGroupTasks.taskGroupID,
|
(t) => t.id === resp.data?.deleteTaskGroupTasks.taskGroupID,
|
||||||
);
|
);
|
||||||
if (idx !== -1) {
|
if (idx !== -1) {
|
||||||
draftCache.findProject.taskGroups[idx].tasks = [];
|
draftCache.findProject.taskGroups[idx].tasks = [];
|
||||||
@ -353,8 +353,8 @@ const ProjectBoard: React.FC<ProjectBoardProps> = ({ projectID, onCardLabelClick
|
|||||||
updateApolloCache<FindProjectQuery>(
|
updateApolloCache<FindProjectQuery>(
|
||||||
client,
|
client,
|
||||||
FindProjectDocument,
|
FindProjectDocument,
|
||||||
cache =>
|
(cache) =>
|
||||||
produce(cache, draftCache => {
|
produce(cache, (draftCache) => {
|
||||||
if (resp.data) {
|
if (resp.data) {
|
||||||
draftCache.findProject.taskGroups.push(resp.data.duplicateTaskGroup.taskGroup);
|
draftCache.findProject.taskGroups.push(resp.data.duplicateTaskGroup.taskGroup);
|
||||||
}
|
}
|
||||||
@ -371,8 +371,8 @@ const ProjectBoard: React.FC<ProjectBoardProps> = ({ projectID, onCardLabelClick
|
|||||||
updateApolloCache<FindProjectQuery>(
|
updateApolloCache<FindProjectQuery>(
|
||||||
client,
|
client,
|
||||||
FindProjectDocument,
|
FindProjectDocument,
|
||||||
cache =>
|
(cache) =>
|
||||||
produce(cache, draftCache => {
|
produce(cache, (draftCache) => {
|
||||||
if (newTask.data) {
|
if (newTask.data) {
|
||||||
const { previousTaskGroupID, task } = newTask.data.updateTaskLocation;
|
const { previousTaskGroupID, task } = newTask.data.updateTaskLocation;
|
||||||
if (previousTaskGroupID !== task.taskGroup.id) {
|
if (previousTaskGroupID !== task.taskGroup.id) {
|
||||||
@ -380,7 +380,9 @@ const ProjectBoard: React.FC<ProjectBoardProps> = ({ projectID, onCardLabelClick
|
|||||||
const oldTaskGroupIdx = taskGroups.findIndex((t: TaskGroup) => t.id === previousTaskGroupID);
|
const oldTaskGroupIdx = taskGroups.findIndex((t: TaskGroup) => t.id === previousTaskGroupID);
|
||||||
const newTaskGroupIdx = taskGroups.findIndex((t: TaskGroup) => t.id === task.taskGroup.id);
|
const newTaskGroupIdx = taskGroups.findIndex((t: TaskGroup) => t.id === task.taskGroup.id);
|
||||||
if (oldTaskGroupIdx !== -1 && newTaskGroupIdx !== -1) {
|
if (oldTaskGroupIdx !== -1 && newTaskGroupIdx !== -1) {
|
||||||
const previousTask = cache.findProject.taskGroups[oldTaskGroupIdx].tasks.find(t => t.id === task.id);
|
const previousTask = cache.findProject.taskGroups[oldTaskGroupIdx].tasks.find(
|
||||||
|
(t) => t.id === task.id,
|
||||||
|
);
|
||||||
draftCache.findProject.taskGroups[oldTaskGroupIdx].tasks = taskGroups[oldTaskGroupIdx].tasks.filter(
|
draftCache.findProject.taskGroups[oldTaskGroupIdx].tasks = taskGroups[oldTaskGroupIdx].tasks.filter(
|
||||||
(t: Task) => t.id !== task.id,
|
(t: Task) => t.id !== task.id,
|
||||||
);
|
);
|
||||||
@ -401,14 +403,14 @@ const ProjectBoard: React.FC<ProjectBoardProps> = ({ projectID, onCardLabelClick
|
|||||||
const { user } = useCurrentUser();
|
const { user } = useCurrentUser();
|
||||||
const [deleteTask] = useDeleteTaskMutation();
|
const [deleteTask] = useDeleteTaskMutation();
|
||||||
const [toggleTaskLabel] = useToggleTaskLabelMutation({
|
const [toggleTaskLabel] = useToggleTaskLabelMutation({
|
||||||
onCompleted: newTaskLabel => {
|
onCompleted: (newTaskLabel) => {
|
||||||
taskLabelsRef.current = newTaskLabel.toggleTaskLabel.task.labels;
|
taskLabelsRef.current = newTaskLabel.toggleTaskLabel.task.labels;
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
const onCreateTask = (taskGroupID: string, name: string) => {
|
const onCreateTask = (taskGroupID: string, name: string) => {
|
||||||
if (data) {
|
if (data) {
|
||||||
const taskGroup = data.findProject.taskGroups.find(t => t.id === taskGroupID);
|
const taskGroup = data.findProject.taskGroups.find((t) => t.id === taskGroupID);
|
||||||
if (taskGroup) {
|
if (taskGroup) {
|
||||||
let position = 65535;
|
let position = 65535;
|
||||||
if (taskGroup.tasks.length !== 0) {
|
if (taskGroup.tasks.length !== 0) {
|
||||||
@ -472,12 +474,13 @@ const ProjectBoard: React.FC<ProjectBoardProps> = ({ projectID, onCardLabelClick
|
|||||||
}
|
}
|
||||||
return 'All Tasks';
|
return 'All Tasks';
|
||||||
};
|
};
|
||||||
|
|
||||||
if (data) {
|
if (data) {
|
||||||
labelsRef.current = data.findProject.labels;
|
labelsRef.current = data.findProject.labels;
|
||||||
membersRef.current = data.findProject.members;
|
membersRef.current = data.findProject.members;
|
||||||
const onQuickEditorOpen = ($target: React.RefObject<HTMLElement>, taskID: string, taskGroupID: string) => {
|
const onQuickEditorOpen = ($target: React.RefObject<HTMLElement>, taskID: string, taskGroupID: string) => {
|
||||||
const taskGroup = data.findProject.taskGroups.find(t => t.id === taskGroupID);
|
const taskGroup = data.findProject.taskGroups.find((t) => t.id === taskGroupID);
|
||||||
const currentTask = taskGroup ? taskGroup.tasks.find(t => t.id === taskID) : null;
|
const currentTask = taskGroup ? taskGroup.tasks.find((t) => t.id === taskID) : null;
|
||||||
if (currentTask) {
|
if (currentTask) {
|
||||||
setQuickCardEditor({
|
setQuickCardEditor({
|
||||||
target: $target,
|
target: $target,
|
||||||
@ -489,9 +492,9 @@ const ProjectBoard: React.FC<ProjectBoardProps> = ({ projectID, onCardLabelClick
|
|||||||
};
|
};
|
||||||
let currentQuickTask = null;
|
let currentQuickTask = null;
|
||||||
if (quickCardEditor.taskID && quickCardEditor.taskGroupID) {
|
if (quickCardEditor.taskID && quickCardEditor.taskGroupID) {
|
||||||
const targetGroup = data.findProject.taskGroups.find(t => t.id === quickCardEditor.taskGroupID);
|
const targetGroup = data.findProject.taskGroups.find((t) => t.id === quickCardEditor.taskGroupID);
|
||||||
if (targetGroup) {
|
if (targetGroup) {
|
||||||
currentQuickTask = targetGroup.tasks.find(t => t.id === quickCardEditor.taskID);
|
currentQuickTask = targetGroup.tasks.find((t) => t.id === quickCardEditor.taskID);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return (
|
return (
|
||||||
@ -499,13 +502,13 @@ const ProjectBoard: React.FC<ProjectBoardProps> = ({ projectID, onCardLabelClick
|
|||||||
<ProjectBar>
|
<ProjectBar>
|
||||||
<ProjectActions>
|
<ProjectActions>
|
||||||
<ProjectAction
|
<ProjectAction
|
||||||
onClick={target => {
|
onClick={(target) => {
|
||||||
showPopup(
|
showPopup(
|
||||||
target,
|
target,
|
||||||
<Popup tab={0} title={null}>
|
<Popup tab={0} title={null}>
|
||||||
<FilterStatus
|
<FilterStatus
|
||||||
filter={taskStatusFilter}
|
filter={taskStatusFilter}
|
||||||
onChangeTaskStatusFilter={filter => {
|
onChangeTaskStatusFilter={(filter) => {
|
||||||
setTaskStatusFilter(filter);
|
setTaskStatusFilter(filter);
|
||||||
hidePopup();
|
hidePopup();
|
||||||
}}
|
}}
|
||||||
@ -519,13 +522,13 @@ const ProjectBoard: React.FC<ProjectBoardProps> = ({ projectID, onCardLabelClick
|
|||||||
<ProjectActionText>{getTaskStatusFilterLabel(taskStatusFilter)}</ProjectActionText>
|
<ProjectActionText>{getTaskStatusFilterLabel(taskStatusFilter)}</ProjectActionText>
|
||||||
</ProjectAction>
|
</ProjectAction>
|
||||||
<ProjectAction
|
<ProjectAction
|
||||||
onClick={target => {
|
onClick={(target) => {
|
||||||
showPopup(
|
showPopup(
|
||||||
target,
|
target,
|
||||||
<Popup tab={0} title={null}>
|
<Popup tab={0} title={null}>
|
||||||
<SortPopup
|
<SortPopup
|
||||||
sorting={taskSorting}
|
sorting={taskSorting}
|
||||||
onChangeTaskSorting={sorting => {
|
onChangeTaskSorting={(sorting) => {
|
||||||
setTaskSorting(sorting);
|
setTaskSorting(sorting);
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
@ -538,16 +541,16 @@ const ProjectBoard: React.FC<ProjectBoardProps> = ({ projectID, onCardLabelClick
|
|||||||
<ProjectActionText>{renderTaskSortingLabel(taskSorting)}</ProjectActionText>
|
<ProjectActionText>{renderTaskSortingLabel(taskSorting)}</ProjectActionText>
|
||||||
</ProjectAction>
|
</ProjectAction>
|
||||||
<ProjectAction
|
<ProjectAction
|
||||||
onClick={target => {
|
onClick={(target) => {
|
||||||
showPopup(
|
showPopup(
|
||||||
target,
|
target,
|
||||||
<FilterMeta
|
<FilterMeta
|
||||||
filters={taskMetaFilters}
|
filters={taskMetaFilters}
|
||||||
onChangeTaskMetaFilter={filter => {
|
onChangeTaskMetaFilter={(filter) => {
|
||||||
setTaskMetaFilters(filter);
|
setTaskMetaFilters(filter);
|
||||||
}}
|
}}
|
||||||
userID={user ?? ''}
|
userID={user ?? ''}
|
||||||
labels={labelsRef}
|
projectID={projectID}
|
||||||
members={membersRef}
|
members={membersRef}
|
||||||
/>,
|
/>,
|
||||||
{ width: 200 },
|
{ width: 200 },
|
||||||
@ -559,11 +562,11 @@ const ProjectBoard: React.FC<ProjectBoardProps> = ({ projectID, onCardLabelClick
|
|||||||
</ProjectAction>
|
</ProjectAction>
|
||||||
{renderMetaFilters(taskMetaFilters, (meta, id) => {
|
{renderMetaFilters(taskMetaFilters, (meta, id) => {
|
||||||
setTaskMetaFilters(
|
setTaskMetaFilters(
|
||||||
produce(taskMetaFilters, draftFilters => {
|
produce(taskMetaFilters, (draftFilters) => {
|
||||||
if (meta === TaskMeta.MEMBER) {
|
if (meta === TaskMeta.MEMBER) {
|
||||||
draftFilters.members = draftFilters.members.filter(m => m.id !== id);
|
draftFilters.members = draftFilters.members.filter((m) => m.id !== id);
|
||||||
} else if (meta === TaskMeta.LABEL) {
|
} else if (meta === TaskMeta.LABEL) {
|
||||||
draftFilters.labels = draftFilters.labels.filter(m => m.id !== id);
|
draftFilters.labels = draftFilters.labels.filter((m) => m.id !== id);
|
||||||
} else if (meta === TaskMeta.TITLE) {
|
} else if (meta === TaskMeta.TITLE) {
|
||||||
draftFilters.taskName = null;
|
draftFilters.taskName = null;
|
||||||
} else if (meta === TaskMeta.DUE_DATE) {
|
} else if (meta === TaskMeta.DUE_DATE) {
|
||||||
@ -576,15 +579,10 @@ const ProjectBoard: React.FC<ProjectBoardProps> = ({ projectID, onCardLabelClick
|
|||||||
{user && (
|
{user && (
|
||||||
<ProjectActions>
|
<ProjectActions>
|
||||||
<ProjectAction
|
<ProjectAction
|
||||||
onClick={$labelsRef => {
|
onClick={($labelsRef) => {
|
||||||
showPopup(
|
showPopup(
|
||||||
$labelsRef,
|
$labelsRef,
|
||||||
<LabelManagerEditor
|
<LabelManagerEditor taskLabels={null} labelColors={data.labelColors} projectID={projectID ?? ''} />,
|
||||||
taskLabels={null}
|
|
||||||
labelColors={data.labelColors}
|
|
||||||
labels={labelsRef}
|
|
||||||
projectID={projectID ?? ''}
|
|
||||||
/>,
|
|
||||||
);
|
);
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
@ -604,7 +602,7 @@ const ProjectBoard: React.FC<ProjectBoardProps> = ({ projectID, onCardLabelClick
|
|||||||
</ProjectBar>
|
</ProjectBar>
|
||||||
<SimpleLists
|
<SimpleLists
|
||||||
isPublic={user === null}
|
isPublic={user === null}
|
||||||
onTaskClick={task => {
|
onTaskClick={(task) => {
|
||||||
history.push(`${match.url}/c/${task.id}`);
|
history.push(`${match.url}/c/${task.id}`);
|
||||||
}}
|
}}
|
||||||
onCardLabelClick={onCardLabelClick ?? NOOP}
|
onCardLabelClick={onCardLabelClick ?? NOOP}
|
||||||
@ -637,7 +635,7 @@ const ProjectBoard: React.FC<ProjectBoardProps> = ({ projectID, onCardLabelClick
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
}}
|
}}
|
||||||
onTaskGroupDrop={droppedTaskGroup => {
|
onTaskGroupDrop={(droppedTaskGroup) => {
|
||||||
updateTaskGroupLocation({
|
updateTaskGroupLocation({
|
||||||
variables: { taskGroupID: droppedTaskGroup.id, position: droppedTaskGroup.position },
|
variables: { taskGroupID: droppedTaskGroup.id, position: droppedTaskGroup.position },
|
||||||
optimisticResponse: {
|
optimisticResponse: {
|
||||||
@ -657,7 +655,7 @@ const ProjectBoard: React.FC<ProjectBoardProps> = ({ projectID, onCardLabelClick
|
|||||||
onCreateTask={onCreateTask}
|
onCreateTask={onCreateTask}
|
||||||
onCreateTaskGroup={onCreateList}
|
onCreateTaskGroup={onCreateList}
|
||||||
onCardMemberClick={($targetRef, _taskID, memberID) => {
|
onCardMemberClick={($targetRef, _taskID, memberID) => {
|
||||||
const member = data.findProject.members.find(m => m.id === memberID);
|
const member = data.findProject.members.find((m) => m.id === memberID);
|
||||||
if (member) {
|
if (member) {
|
||||||
showPopup(
|
showPopup(
|
||||||
$targetRef,
|
$targetRef,
|
||||||
@ -684,8 +682,8 @@ const ProjectBoard: React.FC<ProjectBoardProps> = ({ projectID, onCardLabelClick
|
|||||||
deleteTaskGroupTasks({ variables: { taskGroupID } });
|
deleteTaskGroupTasks({ variables: { taskGroupID } });
|
||||||
hidePopup();
|
hidePopup();
|
||||||
}}
|
}}
|
||||||
onSortTaskGroup={taskSort => {
|
onSortTaskGroup={(taskSort) => {
|
||||||
const taskGroup = data.findProject.taskGroups.find(t => t.id === taskGroupID);
|
const taskGroup = data.findProject.taskGroups.find((t) => t.id === taskGroupID);
|
||||||
if (taskGroup) {
|
if (taskGroup) {
|
||||||
const tasks: Array<{ taskID: string; position: number }> = taskGroup.tasks
|
const tasks: Array<{ taskID: string; position: number }> = taskGroup.tasks
|
||||||
.sort((a, b) => sortTasks(a, b, taskSort))
|
.sort((a, b) => sortTasks(a, b, taskSort))
|
||||||
@ -697,8 +695,8 @@ const ProjectBoard: React.FC<ProjectBoardProps> = ({ projectID, onCardLabelClick
|
|||||||
hidePopup();
|
hidePopup();
|
||||||
}
|
}
|
||||||
}}
|
}}
|
||||||
onDuplicateTaskGroup={newName => {
|
onDuplicateTaskGroup={(newName) => {
|
||||||
const idx = data.findProject.taskGroups.findIndex(t => t.id === taskGroupID);
|
const idx = data.findProject.taskGroups.findIndex((t) => t.id === taskGroupID);
|
||||||
if (idx !== -1) {
|
if (idx !== -1) {
|
||||||
const taskGroups = data.findProject.taskGroups.sort((a, b) => a.position - b.position);
|
const taskGroups = data.findProject.taskGroups.sort((a, b) => a.position - b.position);
|
||||||
const prevPos = taskGroups[idx].position;
|
const prevPos = taskGroups[idx].position;
|
||||||
@ -711,7 +709,7 @@ const ProjectBoard: React.FC<ProjectBoardProps> = ({ projectID, onCardLabelClick
|
|||||||
hidePopup();
|
hidePopup();
|
||||||
}
|
}
|
||||||
}}
|
}}
|
||||||
onArchiveTaskGroup={tgID => {
|
onArchiveTaskGroup={(tgID) => {
|
||||||
deleteTaskGroup({ variables: { taskGroupID: tgID } });
|
deleteTaskGroup({ variables: { taskGroupID: tgID } });
|
||||||
hidePopup();
|
hidePopup();
|
||||||
}}
|
}}
|
||||||
@ -745,7 +743,7 @@ const ProjectBoard: React.FC<ProjectBoardProps> = ({ projectID, onCardLabelClick
|
|||||||
);
|
);
|
||||||
}}
|
}}
|
||||||
onCardMemberClick={($targetRef, _taskID, memberID) => {
|
onCardMemberClick={($targetRef, _taskID, memberID) => {
|
||||||
const member = data.findProject.members.find(m => m.id === memberID);
|
const member = data.findProject.members.find((m) => m.id === memberID);
|
||||||
if (member) {
|
if (member) {
|
||||||
showPopup(
|
showPopup(
|
||||||
$targetRef,
|
$targetRef,
|
||||||
@ -764,12 +762,11 @@ const ProjectBoard: React.FC<ProjectBoardProps> = ({ projectID, onCardLabelClick
|
|||||||
showPopup(
|
showPopup(
|
||||||
$targetRef,
|
$targetRef,
|
||||||
<LabelManagerEditor
|
<LabelManagerEditor
|
||||||
onLabelToggle={labelID => {
|
onLabelToggle={(labelID) => {
|
||||||
toggleTaskLabel({ variables: { taskID: task.id, projectLabelID: labelID } });
|
toggleTaskLabel({ variables: { taskID: task.id, projectLabelID: labelID } });
|
||||||
}}
|
}}
|
||||||
taskID={task.id}
|
taskID={task.id}
|
||||||
labelColors={data.labelColors}
|
labelColors={data.labelColors}
|
||||||
labels={labelsRef}
|
|
||||||
taskLabels={taskLabelsRef}
|
taskLabels={taskLabelsRef}
|
||||||
projectID={projectID ?? ''}
|
projectID={projectID ?? ''}
|
||||||
/>,
|
/>,
|
||||||
@ -778,15 +775,15 @@ const ProjectBoard: React.FC<ProjectBoardProps> = ({ projectID, onCardLabelClick
|
|||||||
onArchiveCard={(_listId: string, cardId: string) => {
|
onArchiveCard={(_listId: string, cardId: string) => {
|
||||||
return deleteTask({
|
return deleteTask({
|
||||||
variables: { taskID: cardId },
|
variables: { taskID: cardId },
|
||||||
update: client => {
|
update: (client) => {
|
||||||
updateApolloCache<FindProjectQuery>(
|
updateApolloCache<FindProjectQuery>(
|
||||||
client,
|
client,
|
||||||
FindProjectDocument,
|
FindProjectDocument,
|
||||||
cache =>
|
(cache) =>
|
||||||
produce(cache, draftCache => {
|
produce(cache, (draftCache) => {
|
||||||
draftCache.findProject.taskGroups = cache.findProject.taskGroups.map(taskGroup => ({
|
draftCache.findProject.taskGroups = cache.findProject.taskGroups.map((taskGroup) => ({
|
||||||
...taskGroup,
|
...taskGroup,
|
||||||
tasks: taskGroup.tasks.filter(t => t.id !== cardId),
|
tasks: taskGroup.tasks.filter((t) => t.id !== cardId),
|
||||||
}));
|
}));
|
||||||
}),
|
}),
|
||||||
{ projectID },
|
{ projectID },
|
||||||
@ -800,7 +797,7 @@ const ProjectBoard: React.FC<ProjectBoardProps> = ({ projectID, onCardLabelClick
|
|||||||
<Popup title="Change Due Date" tab={0} onClose={() => hidePopup()}>
|
<Popup title="Change Due Date" tab={0} onClose={() => hidePopup()}>
|
||||||
<DueDateManager
|
<DueDateManager
|
||||||
task={task}
|
task={task}
|
||||||
onRemoveDueDate={t => {
|
onRemoveDueDate={(t) => {
|
||||||
updateTaskDueDate({ variables: { taskID: t.id, dueDate: null, hasTime: false } });
|
updateTaskDueDate({ variables: { taskID: t.id, dueDate: null, hasTime: false } });
|
||||||
// hidePopup();
|
// hidePopup();
|
||||||
}}
|
}}
|
||||||
@ -813,7 +810,7 @@ const ProjectBoard: React.FC<ProjectBoardProps> = ({ projectID, onCardLabelClick
|
|||||||
</Popup>,
|
</Popup>,
|
||||||
);
|
);
|
||||||
}}
|
}}
|
||||||
onToggleComplete={task => {
|
onToggleComplete={(task) => {
|
||||||
setTaskComplete({ variables: { taskID: task.id, complete: !task.complete } });
|
setTaskComplete({ variables: { taskID: task.id, complete: !task.complete } });
|
||||||
}}
|
}}
|
||||||
target={quickCardEditor.target}
|
target={quickCardEditor.target}
|
||||||
|
@ -9,13 +9,13 @@ import {
|
|||||||
useCreateProjectLabelMutation,
|
useCreateProjectLabelMutation,
|
||||||
FindProjectQuery,
|
FindProjectQuery,
|
||||||
useToggleTaskLabelMutation,
|
useToggleTaskLabelMutation,
|
||||||
|
useLabelsQuery,
|
||||||
} from 'shared/generated/graphql';
|
} from 'shared/generated/graphql';
|
||||||
import LabelManager from 'shared/components/PopupMenu/LabelManager';
|
import LabelManager from 'shared/components/PopupMenu/LabelManager';
|
||||||
import LabelEditor from 'shared/components/PopupMenu/LabelEditor';
|
import LabelEditor from 'shared/components/PopupMenu/LabelEditor';
|
||||||
|
|
||||||
type LabelManagerEditorProps = {
|
type LabelManagerEditorProps = {
|
||||||
taskID?: string;
|
taskID?: string;
|
||||||
labels: React.RefObject<Array<ProjectLabel>>;
|
|
||||||
taskLabels: null | React.RefObject<Array<TaskLabel>>;
|
taskLabels: null | React.RefObject<Array<TaskLabel>>;
|
||||||
projectID: string;
|
projectID: string;
|
||||||
labelColors: Array<LabelColor>;
|
labelColors: Array<LabelColor>;
|
||||||
@ -24,7 +24,6 @@ type LabelManagerEditorProps = {
|
|||||||
|
|
||||||
const LabelManagerEditor: React.FC<LabelManagerEditorProps> = ({
|
const LabelManagerEditor: React.FC<LabelManagerEditorProps> = ({
|
||||||
taskID,
|
taskID,
|
||||||
labels: labelsRef,
|
|
||||||
projectID,
|
projectID,
|
||||||
labelColors,
|
labelColors,
|
||||||
onLabelToggle,
|
onLabelToggle,
|
||||||
@ -34,7 +33,7 @@ const LabelManagerEditor: React.FC<LabelManagerEditorProps> = ({
|
|||||||
const { setTab, hidePopup } = usePopup();
|
const { setTab, hidePopup } = usePopup();
|
||||||
const [toggleTaskLabel] = useToggleTaskLabelMutation();
|
const [toggleTaskLabel] = useToggleTaskLabelMutation();
|
||||||
const [createProjectLabel] = useCreateProjectLabelMutation({
|
const [createProjectLabel] = useCreateProjectLabelMutation({
|
||||||
onCompleted: data => {
|
onCompleted: (data) => {
|
||||||
if (taskID) {
|
if (taskID) {
|
||||||
toggleTaskLabel({ variables: { taskID, projectLabelID: data.createProjectLabel.id } });
|
toggleTaskLabel({ variables: { taskID, projectLabelID: data.createProjectLabel.id } });
|
||||||
}
|
}
|
||||||
@ -43,8 +42,8 @@ const LabelManagerEditor: React.FC<LabelManagerEditorProps> = ({
|
|||||||
updateApolloCache<FindProjectQuery>(
|
updateApolloCache<FindProjectQuery>(
|
||||||
client,
|
client,
|
||||||
FindProjectDocument,
|
FindProjectDocument,
|
||||||
cache =>
|
(cache) =>
|
||||||
produce(cache, draftCache => {
|
produce(cache, (draftCache) => {
|
||||||
if (newLabelData.data) {
|
if (newLabelData.data) {
|
||||||
draftCache.findProject.labels.push({ ...newLabelData.data.createProjectLabel });
|
draftCache.findProject.labels.push({ ...newLabelData.data.createProjectLabel });
|
||||||
}
|
}
|
||||||
@ -61,38 +60,39 @@ const LabelManagerEditor: React.FC<LabelManagerEditorProps> = ({
|
|||||||
updateApolloCache<FindProjectQuery>(
|
updateApolloCache<FindProjectQuery>(
|
||||||
client,
|
client,
|
||||||
FindProjectDocument,
|
FindProjectDocument,
|
||||||
cache =>
|
(cache) =>
|
||||||
produce(cache, draftCache => {
|
produce(cache, (draftCache) => {
|
||||||
draftCache.findProject.labels = cache.findProject.labels.filter(
|
draftCache.findProject.labels = cache.findProject.labels.filter(
|
||||||
label => label.id !== newLabelData.data?.deleteProjectLabel.id,
|
(label) => label.id !== newLabelData.data?.deleteProjectLabel.id,
|
||||||
);
|
);
|
||||||
}),
|
}),
|
||||||
{ projectID },
|
{ projectID },
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
const labels = labelsRef.current ? labelsRef.current : [];
|
const { data } = useLabelsQuery({ variables: { projectID } });
|
||||||
|
const labels = data ? data.findProject.labels : [];
|
||||||
const taskLabels = taskLabelsRef && taskLabelsRef.current ? taskLabelsRef.current : [];
|
const taskLabels = taskLabelsRef && taskLabelsRef.current ? taskLabelsRef.current : [];
|
||||||
const [currentTaskLabels, setCurrentTaskLabels] = useState(taskLabels);
|
const [currentTaskLabels, setCurrentTaskLabels] = useState(taskLabels);
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<Popup title="Labels" tab={0} onClose={() => hidePopup()}>
|
<Popup title="Labels" tab={0} onClose={() => hidePopup()}>
|
||||||
<LabelManager
|
<LabelManager
|
||||||
labels={labels}
|
labels={data ? data.findProject.labels : []}
|
||||||
taskLabels={currentTaskLabels}
|
taskLabels={currentTaskLabels}
|
||||||
onLabelCreate={() => {
|
onLabelCreate={() => {
|
||||||
setTab(2);
|
setTab(2);
|
||||||
}}
|
}}
|
||||||
onLabelEdit={labelId => {
|
onLabelEdit={(labelId) => {
|
||||||
setCurrentLabel(labelId);
|
setCurrentLabel(labelId);
|
||||||
setTab(1);
|
setTab(1);
|
||||||
}}
|
}}
|
||||||
onLabelToggle={labelId => {
|
onLabelToggle={(labelId) => {
|
||||||
if (onLabelToggle) {
|
if (onLabelToggle) {
|
||||||
if (currentTaskLabels.find(t => t.projectLabel.id === labelId)) {
|
if (currentTaskLabels.find((t) => t.projectLabel.id === labelId)) {
|
||||||
setCurrentTaskLabels(currentTaskLabels.filter(t => t.projectLabel.id !== labelId));
|
setCurrentTaskLabels(currentTaskLabels.filter((t) => t.projectLabel.id !== labelId));
|
||||||
} else {
|
} else if (data) {
|
||||||
const newProjectLabel = labels.find(l => l.id === labelId);
|
const newProjectLabel = data.findProject.labels.find((l) => l.id === labelId);
|
||||||
if (newProjectLabel) {
|
if (newProjectLabel) {
|
||||||
setCurrentTaskLabels([
|
setCurrentTaskLabels([
|
||||||
...currentTaskLabels,
|
...currentTaskLabels,
|
||||||
@ -112,14 +112,14 @@ const LabelManagerEditor: React.FC<LabelManagerEditorProps> = ({
|
|||||||
<Popup onClose={() => hidePopup()} title="Edit label" tab={1}>
|
<Popup onClose={() => hidePopup()} title="Edit label" tab={1}>
|
||||||
<LabelEditor
|
<LabelEditor
|
||||||
labelColors={labelColors}
|
labelColors={labelColors}
|
||||||
label={labels.find(label => label.id === currentLabel) ?? null}
|
label={labels.find((label) => label.id === currentLabel) ?? null}
|
||||||
onLabelEdit={(projectLabelID, name, color) => {
|
onLabelEdit={(projectLabelID, name, color) => {
|
||||||
if (projectLabelID) {
|
if (projectLabelID) {
|
||||||
updateProjectLabel({ variables: { projectLabelID, labelColorID: color.id, name: name ?? '' } });
|
updateProjectLabel({ variables: { projectLabelID, labelColorID: color.id, name: name ?? '' } });
|
||||||
}
|
}
|
||||||
setTab(0);
|
setTab(0);
|
||||||
}}
|
}}
|
||||||
onLabelDelete={labelID => {
|
onLabelDelete={(labelID) => {
|
||||||
deleteProjectLabel({ variables: { projectLabelID: labelID } });
|
deleteProjectLabel({ variables: { projectLabelID: labelID } });
|
||||||
setTab(0);
|
setTab(0);
|
||||||
}}
|
}}
|
||||||
|
@ -269,7 +269,6 @@ const Project = () => {
|
|||||||
}}
|
}}
|
||||||
taskID={task.id}
|
taskID={task.id}
|
||||||
labelColors={data.labelColors}
|
labelColors={data.labelColors}
|
||||||
labels={labelsRef}
|
|
||||||
taskLabels={taskLabelsRef}
|
taskLabels={taskLabelsRef}
|
||||||
projectID={projectID}
|
projectID={projectID}
|
||||||
/>,
|
/>,
|
||||||
|
File diff suppressed because it is too large
Load Diff
26
frontend/src/shared/graphql/labels.ts
Normal file
26
frontend/src/shared/graphql/labels.ts
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
import gql from 'graphql-tag';
|
||||||
|
import TASK_FRAGMENT from './fragments/task';
|
||||||
|
|
||||||
|
const FIND_PROJECT_QUERY = gql`
|
||||||
|
query labels($projectID: UUID!) {
|
||||||
|
findProject(input: { projectID: $projectID }) {
|
||||||
|
labels {
|
||||||
|
id
|
||||||
|
createdDate
|
||||||
|
name
|
||||||
|
labelColor {
|
||||||
|
id
|
||||||
|
name
|
||||||
|
colorHex
|
||||||
|
position
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
labelColors {
|
||||||
|
id
|
||||||
|
position
|
||||||
|
colorHex
|
||||||
|
name
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`;
|
Loading…
Reference in New Issue
Block a user