diff --git a/app/assets/javascripts/work_items/graphql/resolvers.js b/app/assets/javascripts/work_items/graphql/resolvers.js index b1a3c85a63147e686b27b977577328906552a7bb..fb74e8d9f4c1c1a795d86964d7965fdbd8a354c8 100644 --- a/app/assets/javascripts/work_items/graphql/resolvers.js +++ b/app/assets/javascripts/work_items/graphql/resolvers.js @@ -1,3 +1,4 @@ +import { set } from 'lodash'; import { produce } from 'immer'; import { findWidget } from '~/issues/list/utils'; import { pikadayToString } from '~/lib/utils/datetime_utility'; @@ -13,6 +14,35 @@ import { } from '../constants'; import workItemByIidQuery from './work_item_by_iid.query.graphql'; +const updateWidget = (draftData, widgetType, newData, nodePath) => { + if (!newData) return; + + const widget = findWidget(widgetType, draftData.workspace.workItem); + set(widget, nodePath, newData); +}; + +const updateRolledUpDatesWidget = (draftData, rolledUpDates) => { + if (!rolledUpDates) return; + + const dueDateFixed = rolledUpDates.dueDateFixed + ? pikadayToString(rolledUpDates.dueDateFixed) + : null; + const startDateFixed = rolledUpDates.startDateFixed + ? pikadayToString(rolledUpDates.startDateFixed) + : null; + + const widget = findWidget(WIDGET_TYPE_ROLLEDUP_DATES, draftData.workspace.workItem); + Object.assign(widget, { + dueDate: dueDateFixed, + dueDateFixed, + dueDateIsFixed: rolledUpDates.dueDateIsFixed, + startDate: startDateFixed, + startDateFixed, + startDateIsFixed: rolledUpDates.startDateIsFixed, + __typename: 'WorkItemWidgetRolledupDates', + }); +}; + export const updateNewWorkItemCache = (input, cache) => { const { healthStatus, @@ -28,7 +58,6 @@ export const updateNewWorkItemCache = (input, cache) => { } = input; const query = workItemByIidQuery; - const variables = { fullPath: newWorkItemFullPath(fullPath, workItemType), iid: NEW_WORK_ITEM_IID, @@ -36,101 +65,42 @@ export const updateNewWorkItemCache = (input, cache) => { cache.updateQuery({ query, variables }, (sourceData) => produce(sourceData, (draftData) => { - if (healthStatus) { - const healthStatusWidget = findWidget( - WIDGET_TYPE_HEALTH_STATUS, - draftData?.workspace?.workItem, - ); - - healthStatusWidget.healthStatus = healthStatus; - - const healthStatusWidgetIndex = draftData.workspace.workItem.widgets.findIndex( - (widget) => widget.type === WIDGET_TYPE_HEALTH_STATUS, - ); - draftData.workspace.workItem.widgets[healthStatusWidgetIndex] = healthStatusWidget; - } - - if (assignees) { - const assigneesWidget = findWidget(WIDGET_TYPE_ASSIGNEES, draftData?.workspace?.workItem); - assigneesWidget.assignees.nodes = assignees; - - const assigneesWidgetIndex = draftData.workspace.workItem.widgets.findIndex( - (widget) => widget.type === WIDGET_TYPE_ASSIGNEES, - ); - draftData.workspace.workItem.widgets[assigneesWidgetIndex] = assigneesWidget; - } - - if (labels) { - const labelsWidget = findWidget(WIDGET_TYPE_LABELS, draftData?.workspace?.workItem); - - labelsWidget.labels.nodes = labels; - - const labelsWidgetIndex = draftData.workspace.workItem.widgets.findIndex( - (widget) => widget.type === WIDGET_TYPE_LABELS, - ); - - draftData.workspace.workItem.widgets[labelsWidgetIndex] = labelsWidget; - } - - if (rolledUpDates) { - let rolledUpDatesWidget = findWidget( - WIDGET_TYPE_ROLLEDUP_DATES, - draftData?.workspace?.workItem, - ); - - const dueDate = rolledUpDates.dueDateFixed || null; - const dueDateFixed = dueDate ? pikadayToString(rolledUpDates.dueDateFixed) : null; - const startDate = rolledUpDates.startDateFixed || null; - const startDateFixed = startDate ? pikadayToString(rolledUpDates.startDateFixed) : null; - - rolledUpDatesWidget = { - type: 'ROLLEDUP_DATES', - dueDate: dueDateFixed, - dueDateFixed, - dueDateIsFixed: rolledUpDates.dueDateIsFixed, - startDate: startDateFixed, - startDateFixed, - startDateIsFixed: rolledUpDates.startDateIsFixed, - __typename: 'WorkItemWidgetRolledupDates', - }; - - const rolledUpDatesWidgetIndex = draftData.workspace.workItem.widgets.findIndex( - (widget) => widget.type === WIDGET_TYPE_ROLLEDUP_DATES, - ); - - draftData.workspace.workItem.widgets[rolledUpDatesWidgetIndex] = rolledUpDatesWidget; - } - - if (color) { - const colorWidget = findWidget(WIDGET_TYPE_COLOR, draftData?.workspace?.workItem); - colorWidget.color = color; - - const colorWidgetIndex = draftData.workspace.workItem.widgets.findIndex( - (widget) => widget.type === WIDGET_TYPE_COLOR, - ); - draftData.workspace.workItem.widgets[colorWidgetIndex] = colorWidget; - } - - if (title) { - draftData.workspace.workItem.title = title; - } - - if (description) { - const descriptionWidget = findWidget( - WIDGET_TYPE_DESCRIPTION, - draftData?.workspace?.workItem, - ); - descriptionWidget.description = description; - - const descriptionWidgetIndex = draftData.workspace.workItem.widgets.findIndex( - (widget) => widget.type === WIDGET_TYPE_DESCRIPTION, - ); - draftData.workspace.workItem.widgets[descriptionWidgetIndex] = descriptionWidget; - } - - if (confidential !== undefined) { - draftData.workspace.workItem.confidential = confidential; - } + const widgetUpdates = [ + { + widgetType: WIDGET_TYPE_HEALTH_STATUS, + newData: healthStatus, + nodePath: 'healthStatus', + }, + { + widgetType: WIDGET_TYPE_ASSIGNEES, + newData: assignees, + nodePath: 'assignees.nodes', + }, + { + widgetType: WIDGET_TYPE_LABELS, + newData: labels, + nodePath: 'labels.nodes', + }, + { + widgetType: WIDGET_TYPE_COLOR, + newData: color, + nodePath: 'color', + }, + { + widgetType: WIDGET_TYPE_DESCRIPTION, + newData: description, + nodePath: 'description', + }, + ]; + + widgetUpdates.forEach(({ widgetType, newData, nodePath }) => { + updateWidget(draftData, widgetType, newData, nodePath); + }); + + updateRolledUpDatesWidget(draftData, rolledUpDates); + + if (title) draftData.workspace.workItem.title = title; + if (confidential !== undefined) draftData.workspace.workItem.confidential = confidential; }), ); };