From b3312220a8ff4c1f1d6dabda9f605215768687b7 Mon Sep 17 00:00:00 2001 From: JeremyWuuuuu Date: Thu, 9 Sep 2021 10:34:53 +0800 Subject: [PATCH 1/4] Feature ZenTao integration: Extract Issue Detail Part Extract duplicate code for Issue Detail component --- .../external_issue/issues_show/api.js | 37 +++ .../components/external_issues_show_root.vue | 219 ++++++++++++++++++ .../issues_show/components/note.vue | 100 ++++++++ .../components/sidebar/assignee.vue | 86 +++++++ .../sidebar/external_issues_sidebar_root.vue | 170 ++++++++++++++ .../components/sidebar/issue_due_date.vue | 76 ++++++ .../components/sidebar/issue_field.vue | 141 +++++++++++ .../sidebar/issue_field_dropdown.vue | 66 ++++++ .../external_issue/issues_show/constants.js | 13 ++ .../external_issues_show_bundle.js | 43 ++++ 10 files changed, 951 insertions(+) create mode 100644 app/assets/javascripts/integrations/external_issue/issues_show/api.js create mode 100644 app/assets/javascripts/integrations/external_issue/issues_show/components/external_issues_show_root.vue create mode 100644 app/assets/javascripts/integrations/external_issue/issues_show/components/note.vue create mode 100644 app/assets/javascripts/integrations/external_issue/issues_show/components/sidebar/assignee.vue create mode 100644 app/assets/javascripts/integrations/external_issue/issues_show/components/sidebar/external_issues_sidebar_root.vue create mode 100644 app/assets/javascripts/integrations/external_issue/issues_show/components/sidebar/issue_due_date.vue create mode 100644 app/assets/javascripts/integrations/external_issue/issues_show/components/sidebar/issue_field.vue create mode 100644 app/assets/javascripts/integrations/external_issue/issues_show/components/sidebar/issue_field_dropdown.vue create mode 100644 app/assets/javascripts/integrations/external_issue/issues_show/constants.js create mode 100644 app/assets/javascripts/integrations/external_issue/issues_show/external_issues_show_bundle.js diff --git a/app/assets/javascripts/integrations/external_issue/issues_show/api.js b/app/assets/javascripts/integrations/external_issue/issues_show/api.js new file mode 100644 index 00000000000000..95fe28c90e2306 --- /dev/null +++ b/app/assets/javascripts/integrations/external_issue/issues_show/api.js @@ -0,0 +1,37 @@ +import axios from '~/lib/utils/axios_utils'; + +export const fetchIssue = async (issuePath) => { + return axios.get(issuePath).then(({ data }) => { + return data; + }); +}; + +export const fetchIssueStatuses = () => { + // We are using mock data here which should come from the backend + return new Promise((resolve) => { + setTimeout(() => { + // eslint-disable-next-line @gitlab/require-i18n-strings + resolve([{ title: 'In Progress' }, { title: 'Done' }]); + }, 1000); + }); +}; + +export const updateIssue = (issue, { labels = [], status = undefined }) => { + // We are using mock call here which should become a backend call + return new Promise((resolve) => { + setTimeout(() => { + const addedLabels = labels.filter((label) => label.set); + const removedLabelsIds = labels.filter((label) => !label.set).map((label) => label.id); + + const finalLabels = [...issue.labels, ...addedLabels].filter( + (label) => !removedLabelsIds.includes(label.id), + ); + + resolve({ + ...issue, + ...(status ? { status } : {}), + labels: finalLabels, + }); + }, 1000); + }); +}; diff --git a/app/assets/javascripts/integrations/external_issue/issues_show/components/external_issues_show_root.vue b/app/assets/javascripts/integrations/external_issue/issues_show/components/external_issues_show_root.vue new file mode 100644 index 00000000000000..77d736fcc2fb24 --- /dev/null +++ b/app/assets/javascripts/integrations/external_issue/issues_show/components/external_issues_show_root.vue @@ -0,0 +1,219 @@ + + + diff --git a/app/assets/javascripts/integrations/external_issue/issues_show/components/note.vue b/app/assets/javascripts/integrations/external_issue/issues_show/components/note.vue new file mode 100644 index 00000000000000..ff7fbd75ad4b05 --- /dev/null +++ b/app/assets/javascripts/integrations/external_issue/issues_show/components/note.vue @@ -0,0 +1,100 @@ + + + diff --git a/app/assets/javascripts/integrations/external_issue/issues_show/components/sidebar/assignee.vue b/app/assets/javascripts/integrations/external_issue/issues_show/components/sidebar/assignee.vue new file mode 100644 index 00000000000000..81048183987d10 --- /dev/null +++ b/app/assets/javascripts/integrations/external_issue/issues_show/components/sidebar/assignee.vue @@ -0,0 +1,86 @@ + + + diff --git a/app/assets/javascripts/integrations/external_issue/issues_show/components/sidebar/external_issues_sidebar_root.vue b/app/assets/javascripts/integrations/external_issue/issues_show/components/sidebar/external_issues_sidebar_root.vue new file mode 100644 index 00000000000000..f255bc7468a82f --- /dev/null +++ b/app/assets/javascripts/integrations/external_issue/issues_show/components/sidebar/external_issues_sidebar_root.vue @@ -0,0 +1,170 @@ + + + diff --git a/app/assets/javascripts/integrations/external_issue/issues_show/components/sidebar/issue_due_date.vue b/app/assets/javascripts/integrations/external_issue/issues_show/components/sidebar/issue_due_date.vue new file mode 100644 index 00000000000000..66360feda1abfc --- /dev/null +++ b/app/assets/javascripts/integrations/external_issue/issues_show/components/sidebar/issue_due_date.vue @@ -0,0 +1,76 @@ + + + diff --git a/app/assets/javascripts/integrations/external_issue/issues_show/components/sidebar/issue_field.vue b/app/assets/javascripts/integrations/external_issue/issues_show/components/sidebar/issue_field.vue new file mode 100644 index 00000000000000..2e24d77632f9a4 --- /dev/null +++ b/app/assets/javascripts/integrations/external_issue/issues_show/components/sidebar/issue_field.vue @@ -0,0 +1,141 @@ + + + diff --git a/app/assets/javascripts/integrations/external_issue/issues_show/components/sidebar/issue_field_dropdown.vue b/app/assets/javascripts/integrations/external_issue/issues_show/components/sidebar/issue_field_dropdown.vue new file mode 100644 index 00000000000000..37df42c80e5a52 --- /dev/null +++ b/app/assets/javascripts/integrations/external_issue/issues_show/components/sidebar/issue_field_dropdown.vue @@ -0,0 +1,66 @@ + + + diff --git a/app/assets/javascripts/integrations/external_issue/issues_show/constants.js b/app/assets/javascripts/integrations/external_issue/issues_show/constants.js new file mode 100644 index 00000000000000..29bb2dedfd2554 --- /dev/null +++ b/app/assets/javascripts/integrations/external_issue/issues_show/constants.js @@ -0,0 +1,13 @@ +import { __ } from '~/locale'; + +export const issueStates = { + OPENED: 'opened', + CLOSED: 'closed', +}; + +export const issueStateLabels = { + [issueStates.OPENED]: __('Open'), + [issueStates.CLOSED]: __('Closed'), +}; + +export const labelsFilterParam = 'labels'; diff --git a/app/assets/javascripts/integrations/external_issue/issues_show/external_issues_show_bundle.js b/app/assets/javascripts/integrations/external_issue/issues_show/external_issues_show_bundle.js new file mode 100644 index 00000000000000..d00307ebeb052c --- /dev/null +++ b/app/assets/javascripts/integrations/external_issue/issues_show/external_issues_show_bundle.js @@ -0,0 +1,43 @@ +import Vue from 'vue'; + +import ExternalIssueShowRoot from './components/external_issues_show_root.vue'; + +/** + * + * @param @required {Object} provides + * @type provides: { + * failFetchingIssueText: string + * failFetchingIssueStatusText: string + * failUpdatingIssueLabelsText: string + * failUpdatingIssueStatusText: string + * featureFlagCanEditLabelKey: string + * featureFlagCanEditStatusKey: string + * seeMoreDetailText: string + * statusDropdownEmptyText: string + * titleText: string + * userTypeText: string + * userTypeTooltipText: string + * } + */ + +export default function ExternalIssueShowFactory(provides) { + return function initZentaoIssueShow({ mountPointSelector }) { + const mountPointEl = document.querySelector(mountPointSelector); + + if (!mountPointEl) { + return null; + } + + const { issuesShowPath, issuesListPath } = mountPointEl.dataset; + + return new Vue({ + el: mountPointEl, + provide: { + issuesShowPath, + issuesListPath, + ...provides, + }, + render: (createElement) => createElement(ExternalIssueShowRoot), + }); + }; +} -- GitLab From 25008f18f5331301e01edab38b1fc056781c2aef Mon Sep 17 00:00:00 2001 From: JeremyWuuuuu Date: Thu, 16 Sep 2021 11:14:17 +0800 Subject: [PATCH 2/4] Extract common sub components from Jira Integration Jira with External Issue Update test cases against the change Rebase upstream --- .../external_issue/issues_show/api.js | 37 --- .../components/external_issues_show_root.vue | 219 ------------------ .../issues_show/components/note.vue | 100 -------- .../components/sidebar/assignee.vue | 86 ------- .../sidebar/external_issues_sidebar_root.vue | 170 -------------- .../external_issues_show_bundle.js | 43 ---- .../issues_show/components/note.vue | 10 + .../components/sidebar/assignee.vue | 0 .../components/sidebar/issue_due_date.vue | 0 .../components/sidebar/issue_field.vue | 0 .../sidebar/issue_field_dropdown.vue | 0 .../external_issue/issues_show/constants.js | 0 .../components/jira_issues_show_root.vue | 2 +- .../components/sidebar/issue_due_date.vue | 76 ------ .../components/sidebar/issue_field.vue | 141 ----------- .../sidebar/issue_field_dropdown.vue | 66 ------ .../sidebar/jira_issues_sidebar_root.vue | 6 +- .../__snapshots__/note_spec.js.snap | 0 .../issues_show/components/note_spec.js | 14 +- .../__snapshots__/assignee_spec.js.snap | 4 +- .../components/sidebar/assignee_spec.js | 8 +- .../components/sidebar/issue_due_date_spec.js | 2 +- .../sidebar/issue_field_dropdown_spec.js | 10 +- .../components/sidebar/issue_field_spec.js | 2 +- .../external_issue/issues_show/mock_data.js | 45 ++++ .../sidebar/jira_issues_sidebar_root_spec.js | 6 +- 26 files changed, 82 insertions(+), 965 deletions(-) delete mode 100644 app/assets/javascripts/integrations/external_issue/issues_show/api.js delete mode 100644 app/assets/javascripts/integrations/external_issue/issues_show/components/external_issues_show_root.vue delete mode 100644 app/assets/javascripts/integrations/external_issue/issues_show/components/note.vue delete mode 100644 app/assets/javascripts/integrations/external_issue/issues_show/components/sidebar/assignee.vue delete mode 100644 app/assets/javascripts/integrations/external_issue/issues_show/components/sidebar/external_issues_sidebar_root.vue delete mode 100644 app/assets/javascripts/integrations/external_issue/issues_show/external_issues_show_bundle.js rename ee/app/assets/javascripts/integrations/{jira => external_issue}/issues_show/components/note.vue (93%) rename ee/app/assets/javascripts/integrations/{jira => external_issue}/issues_show/components/sidebar/assignee.vue (100%) rename {app => ee/app}/assets/javascripts/integrations/external_issue/issues_show/components/sidebar/issue_due_date.vue (100%) rename {app => ee/app}/assets/javascripts/integrations/external_issue/issues_show/components/sidebar/issue_field.vue (100%) rename {app => ee/app}/assets/javascripts/integrations/external_issue/issues_show/components/sidebar/issue_field_dropdown.vue (100%) rename {app => ee/app}/assets/javascripts/integrations/external_issue/issues_show/constants.js (100%) delete mode 100644 ee/app/assets/javascripts/integrations/jira/issues_show/components/sidebar/issue_due_date.vue delete mode 100644 ee/app/assets/javascripts/integrations/jira/issues_show/components/sidebar/issue_field.vue delete mode 100644 ee/app/assets/javascripts/integrations/jira/issues_show/components/sidebar/issue_field_dropdown.vue rename ee/spec/frontend/integrations/{jira => external_issue}/issues_show/components/__snapshots__/note_spec.js.snap (100%) rename ee/spec/frontend/integrations/{jira => external_issue}/issues_show/components/note_spec.js (78%) rename ee/spec/frontend/integrations/{jira => external_issue}/issues_show/components/sidebar/__snapshots__/assignee_spec.js.snap (86%) rename ee/spec/frontend/integrations/{jira => external_issue}/issues_show/components/sidebar/assignee_spec.js (92%) rename ee/spec/frontend/integrations/{jira => external_issue}/issues_show/components/sidebar/issue_due_date_spec.js (93%) rename ee/spec/frontend/integrations/{jira => external_issue}/issues_show/components/sidebar/issue_field_dropdown_spec.js (77%) rename ee/spec/frontend/integrations/{jira => external_issue}/issues_show/components/sidebar/issue_field_spec.js (96%) create mode 100644 ee/spec/frontend/integrations/external_issue/issues_show/mock_data.js diff --git a/app/assets/javascripts/integrations/external_issue/issues_show/api.js b/app/assets/javascripts/integrations/external_issue/issues_show/api.js deleted file mode 100644 index 95fe28c90e2306..00000000000000 --- a/app/assets/javascripts/integrations/external_issue/issues_show/api.js +++ /dev/null @@ -1,37 +0,0 @@ -import axios from '~/lib/utils/axios_utils'; - -export const fetchIssue = async (issuePath) => { - return axios.get(issuePath).then(({ data }) => { - return data; - }); -}; - -export const fetchIssueStatuses = () => { - // We are using mock data here which should come from the backend - return new Promise((resolve) => { - setTimeout(() => { - // eslint-disable-next-line @gitlab/require-i18n-strings - resolve([{ title: 'In Progress' }, { title: 'Done' }]); - }, 1000); - }); -}; - -export const updateIssue = (issue, { labels = [], status = undefined }) => { - // We are using mock call here which should become a backend call - return new Promise((resolve) => { - setTimeout(() => { - const addedLabels = labels.filter((label) => label.set); - const removedLabelsIds = labels.filter((label) => !label.set).map((label) => label.id); - - const finalLabels = [...issue.labels, ...addedLabels].filter( - (label) => !removedLabelsIds.includes(label.id), - ); - - resolve({ - ...issue, - ...(status ? { status } : {}), - labels: finalLabels, - }); - }, 1000); - }); -}; diff --git a/app/assets/javascripts/integrations/external_issue/issues_show/components/external_issues_show_root.vue b/app/assets/javascripts/integrations/external_issue/issues_show/components/external_issues_show_root.vue deleted file mode 100644 index 77d736fcc2fb24..00000000000000 --- a/app/assets/javascripts/integrations/external_issue/issues_show/components/external_issues_show_root.vue +++ /dev/null @@ -1,219 +0,0 @@ - - - diff --git a/app/assets/javascripts/integrations/external_issue/issues_show/components/note.vue b/app/assets/javascripts/integrations/external_issue/issues_show/components/note.vue deleted file mode 100644 index ff7fbd75ad4b05..00000000000000 --- a/app/assets/javascripts/integrations/external_issue/issues_show/components/note.vue +++ /dev/null @@ -1,100 +0,0 @@ - - - diff --git a/app/assets/javascripts/integrations/external_issue/issues_show/components/sidebar/assignee.vue b/app/assets/javascripts/integrations/external_issue/issues_show/components/sidebar/assignee.vue deleted file mode 100644 index 81048183987d10..00000000000000 --- a/app/assets/javascripts/integrations/external_issue/issues_show/components/sidebar/assignee.vue +++ /dev/null @@ -1,86 +0,0 @@ - - - diff --git a/app/assets/javascripts/integrations/external_issue/issues_show/components/sidebar/external_issues_sidebar_root.vue b/app/assets/javascripts/integrations/external_issue/issues_show/components/sidebar/external_issues_sidebar_root.vue deleted file mode 100644 index f255bc7468a82f..00000000000000 --- a/app/assets/javascripts/integrations/external_issue/issues_show/components/sidebar/external_issues_sidebar_root.vue +++ /dev/null @@ -1,170 +0,0 @@ - - - diff --git a/app/assets/javascripts/integrations/external_issue/issues_show/external_issues_show_bundle.js b/app/assets/javascripts/integrations/external_issue/issues_show/external_issues_show_bundle.js deleted file mode 100644 index d00307ebeb052c..00000000000000 --- a/app/assets/javascripts/integrations/external_issue/issues_show/external_issues_show_bundle.js +++ /dev/null @@ -1,43 +0,0 @@ -import Vue from 'vue'; - -import ExternalIssueShowRoot from './components/external_issues_show_root.vue'; - -/** - * - * @param @required {Object} provides - * @type provides: { - * failFetchingIssueText: string - * failFetchingIssueStatusText: string - * failUpdatingIssueLabelsText: string - * failUpdatingIssueStatusText: string - * featureFlagCanEditLabelKey: string - * featureFlagCanEditStatusKey: string - * seeMoreDetailText: string - * statusDropdownEmptyText: string - * titleText: string - * userTypeText: string - * userTypeTooltipText: string - * } - */ - -export default function ExternalIssueShowFactory(provides) { - return function initZentaoIssueShow({ mountPointSelector }) { - const mountPointEl = document.querySelector(mountPointSelector); - - if (!mountPointEl) { - return null; - } - - const { issuesShowPath, issuesListPath } = mountPointEl.dataset; - - return new Vue({ - el: mountPointEl, - provide: { - issuesShowPath, - issuesListPath, - ...provides, - }, - render: (createElement) => createElement(ExternalIssueShowRoot), - }); - }; -} diff --git a/ee/app/assets/javascripts/integrations/jira/issues_show/components/note.vue b/ee/app/assets/javascripts/integrations/external_issue/issues_show/components/note.vue similarity index 93% rename from ee/app/assets/javascripts/integrations/jira/issues_show/components/note.vue rename to ee/app/assets/javascripts/integrations/external_issue/issues_show/components/note.vue index ff7fbd75ad4b05..80f70418a10283 100644 --- a/ee/app/assets/javascripts/integrations/jira/issues_show/components/note.vue +++ b/ee/app/assets/javascripts/integrations/external_issue/issues_show/components/note.vue @@ -42,6 +42,16 @@ export default { required: false, default: undefined, }, + badgeTooltipText: { + type: String, + required: false, + default: '', + }, + badgeText: { + type: String, + required: false, + default: '', + }, }, computed: { noteAnchor() { diff --git a/ee/app/assets/javascripts/integrations/jira/issues_show/components/sidebar/assignee.vue b/ee/app/assets/javascripts/integrations/external_issue/issues_show/components/sidebar/assignee.vue similarity index 100% rename from ee/app/assets/javascripts/integrations/jira/issues_show/components/sidebar/assignee.vue rename to ee/app/assets/javascripts/integrations/external_issue/issues_show/components/sidebar/assignee.vue diff --git a/app/assets/javascripts/integrations/external_issue/issues_show/components/sidebar/issue_due_date.vue b/ee/app/assets/javascripts/integrations/external_issue/issues_show/components/sidebar/issue_due_date.vue similarity index 100% rename from app/assets/javascripts/integrations/external_issue/issues_show/components/sidebar/issue_due_date.vue rename to ee/app/assets/javascripts/integrations/external_issue/issues_show/components/sidebar/issue_due_date.vue diff --git a/app/assets/javascripts/integrations/external_issue/issues_show/components/sidebar/issue_field.vue b/ee/app/assets/javascripts/integrations/external_issue/issues_show/components/sidebar/issue_field.vue similarity index 100% rename from app/assets/javascripts/integrations/external_issue/issues_show/components/sidebar/issue_field.vue rename to ee/app/assets/javascripts/integrations/external_issue/issues_show/components/sidebar/issue_field.vue diff --git a/app/assets/javascripts/integrations/external_issue/issues_show/components/sidebar/issue_field_dropdown.vue b/ee/app/assets/javascripts/integrations/external_issue/issues_show/components/sidebar/issue_field_dropdown.vue similarity index 100% rename from app/assets/javascripts/integrations/external_issue/issues_show/components/sidebar/issue_field_dropdown.vue rename to ee/app/assets/javascripts/integrations/external_issue/issues_show/components/sidebar/issue_field_dropdown.vue diff --git a/app/assets/javascripts/integrations/external_issue/issues_show/constants.js b/ee/app/assets/javascripts/integrations/external_issue/issues_show/constants.js similarity index 100% rename from app/assets/javascripts/integrations/external_issue/issues_show/constants.js rename to ee/app/assets/javascripts/integrations/external_issue/issues_show/constants.js diff --git a/ee/app/assets/javascripts/integrations/jira/issues_show/components/jira_issues_show_root.vue b/ee/app/assets/javascripts/integrations/jira/issues_show/components/jira_issues_show_root.vue index 760ef5e8b8ff86..228048cbbfe9b6 100644 --- a/ee/app/assets/javascripts/integrations/jira/issues_show/components/jira_issues_show_root.vue +++ b/ee/app/assets/javascripts/integrations/jira/issues_show/components/jira_issues_show_root.vue @@ -7,6 +7,7 @@ import { GlBadge, GlTooltipDirective as GlTooltip, } from '@gitlab/ui'; +import Note from 'ee/integrations/external_issue/issues_show/components/note.vue'; import { fetchIssue, fetchIssueStatuses, updateIssue } from 'ee/integrations/jira/issues_show/api'; import JiraIssueSidebar from 'ee/integrations/jira/issues_show/components/sidebar/jira_issues_sidebar_root.vue'; @@ -15,7 +16,6 @@ import createFlash from '~/flash'; import IssuableShow from '~/issuable_show/components/issuable_show_root.vue'; import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils'; import { s__ } from '~/locale'; -import Note from './note.vue'; export default { name: 'JiraIssuesShow', diff --git a/ee/app/assets/javascripts/integrations/jira/issues_show/components/sidebar/issue_due_date.vue b/ee/app/assets/javascripts/integrations/jira/issues_show/components/sidebar/issue_due_date.vue deleted file mode 100644 index 66360feda1abfc..00000000000000 --- a/ee/app/assets/javascripts/integrations/jira/issues_show/components/sidebar/issue_due_date.vue +++ /dev/null @@ -1,76 +0,0 @@ - - - diff --git a/ee/app/assets/javascripts/integrations/jira/issues_show/components/sidebar/issue_field.vue b/ee/app/assets/javascripts/integrations/jira/issues_show/components/sidebar/issue_field.vue deleted file mode 100644 index 2e24d77632f9a4..00000000000000 --- a/ee/app/assets/javascripts/integrations/jira/issues_show/components/sidebar/issue_field.vue +++ /dev/null @@ -1,141 +0,0 @@ - - - diff --git a/ee/app/assets/javascripts/integrations/jira/issues_show/components/sidebar/issue_field_dropdown.vue b/ee/app/assets/javascripts/integrations/jira/issues_show/components/sidebar/issue_field_dropdown.vue deleted file mode 100644 index 37df42c80e5a52..00000000000000 --- a/ee/app/assets/javascripts/integrations/jira/issues_show/components/sidebar/issue_field_dropdown.vue +++ /dev/null @@ -1,66 +0,0 @@ - - - diff --git a/ee/app/assets/javascripts/integrations/jira/issues_show/components/sidebar/jira_issues_sidebar_root.vue b/ee/app/assets/javascripts/integrations/jira/issues_show/components/sidebar/jira_issues_sidebar_root.vue index d99938d1b58434..c6062d4b46a784 100644 --- a/ee/app/assets/javascripts/integrations/jira/issues_show/components/sidebar/jira_issues_sidebar_root.vue +++ b/ee/app/assets/javascripts/integrations/jira/issues_show/components/sidebar/jira_issues_sidebar_root.vue @@ -1,12 +1,12 @@