2021-08-09 11:09:13 -04:00
|
|
|
import produce from 'immer';
|
2019-11-06 16:06:44 -05:00
|
|
|
import Vue from 'vue';
|
2020-05-13 05:08:37 -04:00
|
|
|
import VueApollo from 'vue-apollo';
|
2021-08-09 11:09:13 -04:00
|
|
|
import getIssuesQuery from 'ee_else_ce/issues_list/queries/get_issues.query.graphql';
|
2021-11-19 13:12:50 -05:00
|
|
|
import IssuesListApp from 'ee_else_ce/issues_list/components/issues_list_app.vue';
|
2020-05-13 05:08:37 -04:00
|
|
|
import createDefaultClient from '~/lib/graphql';
|
2021-03-15 05:09:11 -04:00
|
|
|
import { convertObjectPropsToCamelCase, parseBoolean } from '~/lib/utils/common_utils';
|
2019-11-06 16:06:44 -05:00
|
|
|
import IssuablesListApp from './components/issuables_list_app.vue';
|
2021-02-23 10:10:47 -05:00
|
|
|
import JiraIssuesImportStatusRoot from './components/jira_issues_import_status_app.vue';
|
2019-11-06 16:06:44 -05:00
|
|
|
|
2021-05-03 14:10:17 -04:00
|
|
|
export function mountJiraIssuesListApp() {
|
2021-02-23 10:10:47 -05:00
|
|
|
const el = document.querySelector('.js-jira-issues-import-status');
|
2020-05-13 05:08:37 -04:00
|
|
|
|
|
|
|
if (!el) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2021-07-21 17:10:10 -04:00
|
|
|
const { issuesPath, projectPath } = el.dataset;
|
|
|
|
const canEdit = parseBoolean(el.dataset.canEdit);
|
|
|
|
const isJiraConfigured = parseBoolean(el.dataset.isJiraConfigured);
|
|
|
|
|
|
|
|
if (!isJiraConfigured || !canEdit) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2020-05-13 05:08:37 -04:00
|
|
|
Vue.use(VueApollo);
|
2021-11-01 08:11:46 -04:00
|
|
|
const defaultClient = createDefaultClient();
|
2020-05-13 05:08:37 -04:00
|
|
|
const apolloProvider = new VueApollo({
|
|
|
|
defaultClient,
|
|
|
|
});
|
|
|
|
|
|
|
|
return new Vue({
|
|
|
|
el,
|
|
|
|
apolloProvider,
|
|
|
|
render(createComponent) {
|
2021-02-23 10:10:47 -05:00
|
|
|
return createComponent(JiraIssuesImportStatusRoot, {
|
2020-05-13 05:08:37 -04:00
|
|
|
props: {
|
2021-07-21 17:10:10 -04:00
|
|
|
canEdit,
|
|
|
|
isJiraConfigured,
|
|
|
|
issuesPath,
|
|
|
|
projectPath,
|
2020-05-13 05:08:37 -04:00
|
|
|
},
|
|
|
|
});
|
|
|
|
},
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2021-05-03 14:10:17 -04:00
|
|
|
export function mountIssuablesListApp() {
|
2021-03-10 07:09:14 -05:00
|
|
|
if (!gon.features?.vueIssuablesList) {
|
2019-11-06 16:06:44 -05:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2020-12-23 19:10:25 -05:00
|
|
|
document.querySelectorAll('.js-issuables-list').forEach((el) => {
|
2020-11-13 01:09:02 -05:00
|
|
|
const { canBulkEdit, emptyStateMeta = {}, scopedLabelsAvailable, ...data } = el.dataset;
|
2019-11-06 16:06:44 -05:00
|
|
|
|
|
|
|
return new Vue({
|
|
|
|
el,
|
2020-11-13 01:09:02 -05:00
|
|
|
provide: {
|
|
|
|
scopedLabelsAvailable: parseBoolean(scopedLabelsAvailable),
|
|
|
|
},
|
2019-11-06 16:06:44 -05:00
|
|
|
render(createElement) {
|
2020-05-13 05:08:37 -04:00
|
|
|
return createElement(IssuablesListApp, {
|
|
|
|
props: {
|
|
|
|
...data,
|
2020-08-19 08:10:17 -04:00
|
|
|
emptyStateMeta:
|
|
|
|
Object.keys(emptyStateMeta).length !== 0
|
|
|
|
? convertObjectPropsToCamelCase(JSON.parse(emptyStateMeta))
|
|
|
|
: {},
|
2020-05-13 05:08:37 -04:00
|
|
|
canBulkEdit: Boolean(canBulkEdit),
|
|
|
|
},
|
|
|
|
});
|
2019-11-06 16:06:44 -05:00
|
|
|
},
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
2020-05-13 05:08:37 -04:00
|
|
|
|
2021-05-03 14:10:17 -04:00
|
|
|
export function mountIssuesListApp() {
|
2021-03-15 05:09:11 -04:00
|
|
|
const el = document.querySelector('.js-issues-list');
|
|
|
|
|
|
|
|
if (!el) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2021-06-16 14:10:35 -04:00
|
|
|
Vue.use(VueApollo);
|
|
|
|
|
2021-08-09 11:09:13 -04:00
|
|
|
const resolvers = {
|
|
|
|
Mutation: {
|
2021-09-15 08:11:13 -04:00
|
|
|
reorderIssues: (_, { oldIndex, newIndex, namespace, serializedVariables }, { cache }) => {
|
2021-08-09 11:09:13 -04:00
|
|
|
const variables = JSON.parse(serializedVariables);
|
|
|
|
const sourceData = cache.readQuery({ query: getIssuesQuery, variables });
|
|
|
|
|
|
|
|
const data = produce(sourceData, (draftData) => {
|
2021-09-15 08:11:13 -04:00
|
|
|
const issues = draftData[namespace].issues.nodes.slice();
|
2021-08-09 11:09:13 -04:00
|
|
|
const issueToMove = issues[oldIndex];
|
|
|
|
issues.splice(oldIndex, 1);
|
|
|
|
issues.splice(newIndex, 0, issueToMove);
|
|
|
|
|
2021-09-15 08:11:13 -04:00
|
|
|
draftData[namespace].issues.nodes = issues;
|
2021-08-09 11:09:13 -04:00
|
|
|
});
|
|
|
|
|
|
|
|
cache.writeQuery({ query: getIssuesQuery, variables, data });
|
|
|
|
},
|
|
|
|
},
|
|
|
|
};
|
|
|
|
|
2021-11-01 08:11:46 -04:00
|
|
|
const defaultClient = createDefaultClient(resolvers);
|
2021-06-16 14:10:35 -04:00
|
|
|
const apolloProvider = new VueApollo({
|
|
|
|
defaultClient,
|
|
|
|
});
|
|
|
|
|
2021-03-15 05:09:11 -04:00
|
|
|
const {
|
2021-04-27 08:10:12 -04:00
|
|
|
autocompleteAwardEmojisPath,
|
2021-04-01 14:13:56 -04:00
|
|
|
calendarPath,
|
|
|
|
canBulkUpdate,
|
|
|
|
canEdit,
|
2021-04-09 14:09:24 -04:00
|
|
|
canImportIssues,
|
2021-04-01 14:13:56 -04:00
|
|
|
email,
|
2021-04-28 14:10:12 -04:00
|
|
|
emailsHelpPagePath,
|
2021-04-09 14:09:24 -04:00
|
|
|
emptyStateSvgPath,
|
2021-04-01 14:13:56 -04:00
|
|
|
exportCsvPath,
|
2021-09-01 08:10:15 -04:00
|
|
|
fullPath,
|
2021-10-12 05:09:35 -04:00
|
|
|
groupPath,
|
2021-09-01 08:10:15 -04:00
|
|
|
hasAnyIssues,
|
2021-09-29 05:11:43 -04:00
|
|
|
hasAnyProjects,
|
2021-03-15 05:09:11 -04:00
|
|
|
hasBlockedIssuesFeature,
|
|
|
|
hasIssuableHealthStatusFeature,
|
|
|
|
hasIssueWeightsFeature,
|
2021-06-29 08:08:48 -04:00
|
|
|
hasIterationsFeature,
|
2021-05-17 17:10:42 -04:00
|
|
|
hasMultipleIssueAssigneesFeature,
|
2021-04-01 14:13:56 -04:00
|
|
|
importCsvIssuesPath,
|
2021-04-28 14:10:12 -04:00
|
|
|
initialEmail,
|
2021-12-16 13:14:09 -05:00
|
|
|
isAnonymousSearchDisabled,
|
2021-11-18 13:14:27 -05:00
|
|
|
isIssueRepositioningDisabled,
|
2021-09-15 08:11:13 -04:00
|
|
|
isProject,
|
2021-04-09 14:09:24 -04:00
|
|
|
isSignedIn,
|
|
|
|
jiraIntegrationPath,
|
2021-04-28 14:10:12 -04:00
|
|
|
markdownHelpPath,
|
2021-04-01 14:13:56 -04:00
|
|
|
maxAttachmentSize,
|
|
|
|
newIssuePath,
|
|
|
|
projectImportJiraPath,
|
2021-04-28 14:10:12 -04:00
|
|
|
quickActionsHelpPath,
|
2021-10-27 08:09:41 -04:00
|
|
|
releasesPath,
|
2021-04-28 14:10:12 -04:00
|
|
|
resetPath,
|
2021-04-01 14:13:56 -04:00
|
|
|
rssPath,
|
|
|
|
showNewIssueLink,
|
2021-04-09 14:09:24 -04:00
|
|
|
signInPath,
|
2021-03-15 05:09:11 -04:00
|
|
|
} = el.dataset;
|
|
|
|
|
|
|
|
return new Vue({
|
|
|
|
el,
|
2021-06-16 14:10:35 -04:00
|
|
|
apolloProvider,
|
2021-03-15 05:09:11 -04:00
|
|
|
provide: {
|
2021-04-27 08:10:12 -04:00
|
|
|
autocompleteAwardEmojisPath,
|
2021-04-01 14:13:56 -04:00
|
|
|
calendarPath,
|
|
|
|
canBulkUpdate: parseBoolean(canBulkUpdate),
|
2021-04-09 14:09:24 -04:00
|
|
|
emptyStateSvgPath,
|
2021-09-01 08:10:15 -04:00
|
|
|
fullPath,
|
2021-10-12 05:09:35 -04:00
|
|
|
groupPath,
|
2021-09-01 08:10:15 -04:00
|
|
|
hasAnyIssues: parseBoolean(hasAnyIssues),
|
2021-09-29 05:11:43 -04:00
|
|
|
hasAnyProjects: parseBoolean(hasAnyProjects),
|
2021-03-15 05:09:11 -04:00
|
|
|
hasBlockedIssuesFeature: parseBoolean(hasBlockedIssuesFeature),
|
|
|
|
hasIssuableHealthStatusFeature: parseBoolean(hasIssuableHealthStatusFeature),
|
|
|
|
hasIssueWeightsFeature: parseBoolean(hasIssueWeightsFeature),
|
2021-06-29 08:08:48 -04:00
|
|
|
hasIterationsFeature: parseBoolean(hasIterationsFeature),
|
2021-05-17 17:10:42 -04:00
|
|
|
hasMultipleIssueAssigneesFeature: parseBoolean(hasMultipleIssueAssigneesFeature),
|
2021-12-16 13:14:09 -05:00
|
|
|
isAnonymousSearchDisabled: parseBoolean(isAnonymousSearchDisabled),
|
2021-11-18 13:14:27 -05:00
|
|
|
isIssueRepositioningDisabled: parseBoolean(isIssueRepositioningDisabled),
|
2021-09-15 08:11:13 -04:00
|
|
|
isProject: parseBoolean(isProject),
|
2021-04-09 14:09:24 -04:00
|
|
|
isSignedIn: parseBoolean(isSignedIn),
|
|
|
|
jiraIntegrationPath,
|
2021-04-01 14:13:56 -04:00
|
|
|
newIssuePath,
|
2021-10-27 08:09:41 -04:00
|
|
|
releasesPath,
|
2021-04-01 14:13:56 -04:00
|
|
|
rssPath,
|
|
|
|
showNewIssueLink: parseBoolean(showNewIssueLink),
|
2021-04-09 14:09:24 -04:00
|
|
|
signInPath,
|
2021-04-01 14:13:56 -04:00
|
|
|
// For CsvImportExportButtons component
|
|
|
|
canEdit: parseBoolean(canEdit),
|
|
|
|
email,
|
|
|
|
exportCsvPath,
|
|
|
|
importCsvIssuesPath,
|
|
|
|
maxAttachmentSize,
|
|
|
|
projectImportJiraPath,
|
2021-09-01 08:10:15 -04:00
|
|
|
showExportButton: parseBoolean(hasAnyIssues),
|
2021-04-09 14:09:24 -04:00
|
|
|
showImportButton: parseBoolean(canImportIssues),
|
2021-09-01 08:10:15 -04:00
|
|
|
showLabel: !parseBoolean(hasAnyIssues),
|
2021-04-28 14:10:12 -04:00
|
|
|
// For IssuableByEmail component
|
|
|
|
emailsHelpPagePath,
|
|
|
|
initialEmail,
|
|
|
|
markdownHelpPath,
|
|
|
|
quickActionsHelpPath,
|
|
|
|
resetPath,
|
2021-03-15 05:09:11 -04:00
|
|
|
},
|
|
|
|
render: (createComponent) => createComponent(IssuesListApp),
|
|
|
|
});
|
|
|
|
}
|