365 lines
11 KiB
JavaScript
365 lines
11 KiB
JavaScript
import getIssuesCountQuery from 'ee_else_ce/issues_list/queries/get_issues_count.query.graphql';
|
|
import createFlash from '~/flash';
|
|
import { __, s__ } from '~/locale';
|
|
import {
|
|
FILTER_ANY,
|
|
FILTER_CURRENT,
|
|
FILTER_NONE,
|
|
FILTER_STARTED,
|
|
FILTER_UPCOMING,
|
|
OPERATOR_IS,
|
|
OPERATOR_IS_NOT,
|
|
} from '~/vue_shared/components/filtered_search_bar/constants';
|
|
|
|
// Maps sort order as it appears in the URL query to API `order_by` and `sort` params.
|
|
const PRIORITY = 'priority';
|
|
const ASC = 'asc';
|
|
const DESC = 'desc';
|
|
const CREATED_AT = 'created_at';
|
|
const UPDATED_AT = 'updated_at';
|
|
const DUE_DATE = 'due_date';
|
|
const MILESTONE_DUE = 'milestone_due';
|
|
const POPULARITY = 'popularity';
|
|
const WEIGHT = 'weight';
|
|
const LABEL_PRIORITY = 'label_priority';
|
|
export const RELATIVE_POSITION = 'relative_position';
|
|
export const LOADING_LIST_ITEMS_LENGTH = 8;
|
|
export const PAGE_SIZE = 20;
|
|
export const PAGE_SIZE_MANUAL = 100;
|
|
|
|
export const sortOrderMap = {
|
|
priority: { order_by: PRIORITY, sort: ASC }, // asc and desc are flipped for some reason
|
|
created_date: { order_by: CREATED_AT, sort: DESC },
|
|
created_asc: { order_by: CREATED_AT, sort: ASC },
|
|
updated_desc: { order_by: UPDATED_AT, sort: DESC },
|
|
updated_asc: { order_by: UPDATED_AT, sort: ASC },
|
|
milestone_due_desc: { order_by: MILESTONE_DUE, sort: DESC },
|
|
milestone: { order_by: MILESTONE_DUE, sort: ASC },
|
|
due_date_desc: { order_by: DUE_DATE, sort: DESC },
|
|
due_date: { order_by: DUE_DATE, sort: ASC },
|
|
popularity: { order_by: POPULARITY, sort: DESC },
|
|
popularity_asc: { order_by: POPULARITY, sort: ASC },
|
|
label_priority: { order_by: LABEL_PRIORITY, sort: ASC }, // asc and desc are flipped
|
|
relative_position: { order_by: RELATIVE_POSITION, sort: ASC },
|
|
weight_desc: { order_by: WEIGHT, sort: DESC },
|
|
weight: { order_by: WEIGHT, sort: ASC },
|
|
};
|
|
|
|
export const availableSortOptionsJira = [
|
|
{
|
|
id: 1,
|
|
title: __('Created date'),
|
|
sortDirection: {
|
|
descending: 'created_desc',
|
|
ascending: 'created_asc',
|
|
},
|
|
},
|
|
{
|
|
id: 2,
|
|
title: __('Last updated'),
|
|
sortDirection: {
|
|
descending: 'updated_desc',
|
|
ascending: 'updated_asc',
|
|
},
|
|
},
|
|
];
|
|
|
|
export const i18n = {
|
|
calendarLabel: __('Subscribe to calendar'),
|
|
closed: __('CLOSED'),
|
|
closedMoved: __('CLOSED (MOVED)'),
|
|
confidentialNo: __('No'),
|
|
confidentialYes: __('Yes'),
|
|
downvotes: __('Downvotes'),
|
|
editIssues: __('Edit issues'),
|
|
errorFetchingCounts: __('An error occurred while getting issue counts'),
|
|
errorFetchingIssues: __('An error occurred while loading issues'),
|
|
jiraIntegrationMessage: s__(
|
|
'JiraService|%{jiraDocsLinkStart}Enable the Jira integration%{jiraDocsLinkEnd} to view your Jira issues in GitLab.',
|
|
),
|
|
jiraIntegrationSecondaryMessage: s__('JiraService|This feature requires a Premium plan.'),
|
|
jiraIntegrationTitle: s__('JiraService|Using Jira for issue tracking?'),
|
|
newIssueLabel: __('New issue'),
|
|
noClosedIssuesTitle: __('There are no closed issues'),
|
|
noOpenIssuesDescription: __('To keep this project going, create a new issue'),
|
|
noOpenIssuesTitle: __('There are no open issues'),
|
|
noIssuesSignedInDescription: __(
|
|
'Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable.',
|
|
),
|
|
noIssuesSignedInTitle: __(
|
|
'The Issue Tracker is the place to add things that need to be improved or solved in a project',
|
|
),
|
|
noIssuesSignedOutButtonText: __('Register / Sign In'),
|
|
noIssuesSignedOutDescription: __(
|
|
'The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project.',
|
|
),
|
|
noIssuesSignedOutTitle: __('There are no issues to show'),
|
|
noSearchResultsDescription: __('To widen your search, change or remove filters above'),
|
|
noSearchResultsTitle: __('Sorry, your filter produced no results'),
|
|
relatedMergeRequests: __('Related merge requests'),
|
|
reorderError: __('An error occurred while reordering issues.'),
|
|
rssLabel: __('Subscribe to RSS feed'),
|
|
searchPlaceholder: __('Search or filter results...'),
|
|
upvotes: __('Upvotes'),
|
|
};
|
|
|
|
export const JIRA_IMPORT_SUCCESS_ALERT_HIDE_MAP_KEY = 'jira-import-success-alert-hide-map';
|
|
|
|
export const PARAM_DUE_DATE = 'due_date';
|
|
export const PARAM_SORT = 'sort';
|
|
export const PARAM_STATE = 'state';
|
|
|
|
export const defaultPageSizeParams = {
|
|
firstPageSize: PAGE_SIZE,
|
|
};
|
|
|
|
export const largePageSizeParams = {
|
|
firstPageSize: PAGE_SIZE_MANUAL,
|
|
};
|
|
|
|
export const DUE_DATE_NONE = '0';
|
|
export const DUE_DATE_ANY = '';
|
|
export const DUE_DATE_OVERDUE = 'overdue';
|
|
export const DUE_DATE_WEEK = 'week';
|
|
export const DUE_DATE_MONTH = 'month';
|
|
export const DUE_DATE_NEXT_MONTH_AND_PREVIOUS_TWO_WEEKS = 'next_month_and_previous_two_weeks';
|
|
export const DUE_DATE_VALUES = [
|
|
DUE_DATE_NONE,
|
|
DUE_DATE_ANY,
|
|
DUE_DATE_OVERDUE,
|
|
DUE_DATE_WEEK,
|
|
DUE_DATE_MONTH,
|
|
DUE_DATE_NEXT_MONTH_AND_PREVIOUS_TWO_WEEKS,
|
|
];
|
|
|
|
export const BLOCKING_ISSUES_DESC = 'BLOCKING_ISSUES_DESC';
|
|
export const CREATED_ASC = 'CREATED_ASC';
|
|
export const CREATED_DESC = 'CREATED_DESC';
|
|
export const DUE_DATE_ASC = 'DUE_DATE_ASC';
|
|
export const DUE_DATE_DESC = 'DUE_DATE_DESC';
|
|
export const LABEL_PRIORITY_ASC = 'LABEL_PRIORITY_ASC';
|
|
export const LABEL_PRIORITY_DESC = 'LABEL_PRIORITY_DESC';
|
|
export const MILESTONE_DUE_ASC = 'MILESTONE_DUE_ASC';
|
|
export const MILESTONE_DUE_DESC = 'MILESTONE_DUE_DESC';
|
|
export const POPULARITY_ASC = 'POPULARITY_ASC';
|
|
export const POPULARITY_DESC = 'POPULARITY_DESC';
|
|
export const PRIORITY_ASC = 'PRIORITY_ASC';
|
|
export const PRIORITY_DESC = 'PRIORITY_DESC';
|
|
export const RELATIVE_POSITION_ASC = 'RELATIVE_POSITION_ASC';
|
|
export const UPDATED_ASC = 'UPDATED_ASC';
|
|
export const UPDATED_DESC = 'UPDATED_DESC';
|
|
export const WEIGHT_ASC = 'WEIGHT_ASC';
|
|
export const WEIGHT_DESC = 'WEIGHT_DESC';
|
|
|
|
const PRIORITY_ASC_SORT = 'priority_asc';
|
|
const CREATED_DATE_SORT = 'created_date';
|
|
const CREATED_ASC_SORT = 'created_asc';
|
|
const UPDATED_DESC_SORT = 'updated_desc';
|
|
const UPDATED_ASC_SORT = 'updated_asc';
|
|
const MILESTONE_SORT = 'milestone';
|
|
const MILESTONE_DUE_DESC_SORT = 'milestone_due_desc';
|
|
const DUE_DATE_DESC_SORT = 'due_date_desc';
|
|
const LABEL_PRIORITY_ASC_SORT = 'label_priority_asc';
|
|
const POPULARITY_ASC_SORT = 'popularity_asc';
|
|
const WEIGHT_DESC_SORT = 'weight_desc';
|
|
const BLOCKING_ISSUES_DESC_SORT = 'blocking_issues_desc';
|
|
|
|
export const urlSortParams = {
|
|
[PRIORITY_ASC]: PRIORITY_ASC_SORT,
|
|
[PRIORITY_DESC]: PRIORITY,
|
|
[CREATED_ASC]: CREATED_ASC_SORT,
|
|
[CREATED_DESC]: CREATED_DATE_SORT,
|
|
[UPDATED_ASC]: UPDATED_ASC_SORT,
|
|
[UPDATED_DESC]: UPDATED_DESC_SORT,
|
|
[MILESTONE_DUE_ASC]: MILESTONE_SORT,
|
|
[MILESTONE_DUE_DESC]: MILESTONE_DUE_DESC_SORT,
|
|
[DUE_DATE_ASC]: DUE_DATE,
|
|
[DUE_DATE_DESC]: DUE_DATE_DESC_SORT,
|
|
[POPULARITY_ASC]: POPULARITY_ASC_SORT,
|
|
[POPULARITY_DESC]: POPULARITY,
|
|
[LABEL_PRIORITY_ASC]: LABEL_PRIORITY_ASC_SORT,
|
|
[LABEL_PRIORITY_DESC]: LABEL_PRIORITY,
|
|
[RELATIVE_POSITION_ASC]: RELATIVE_POSITION,
|
|
[WEIGHT_ASC]: WEIGHT,
|
|
[WEIGHT_DESC]: WEIGHT_DESC_SORT,
|
|
[BLOCKING_ISSUES_DESC]: BLOCKING_ISSUES_DESC_SORT,
|
|
};
|
|
|
|
export const MAX_LIST_SIZE = 10;
|
|
|
|
export const API_PARAM = 'apiParam';
|
|
export const URL_PARAM = 'urlParam';
|
|
export const NORMAL_FILTER = 'normalFilter';
|
|
export const SPECIAL_FILTER = 'specialFilter';
|
|
export const ALTERNATIVE_FILTER = 'alternativeFilter';
|
|
export const SPECIAL_FILTER_VALUES = [
|
|
FILTER_NONE,
|
|
FILTER_ANY,
|
|
FILTER_CURRENT,
|
|
FILTER_UPCOMING,
|
|
FILTER_STARTED,
|
|
];
|
|
|
|
export const TOKEN_TYPE_AUTHOR = 'author_username';
|
|
export const TOKEN_TYPE_ASSIGNEE = 'assignee_username';
|
|
export const TOKEN_TYPE_MILESTONE = 'milestone';
|
|
export const TOKEN_TYPE_LABEL = 'labels';
|
|
export const TOKEN_TYPE_TYPE = 'type';
|
|
export const TOKEN_TYPE_MY_REACTION = 'my_reaction_emoji';
|
|
export const TOKEN_TYPE_CONFIDENTIAL = 'confidential';
|
|
export const TOKEN_TYPE_ITERATION = 'iteration';
|
|
export const TOKEN_TYPE_EPIC = 'epic_id';
|
|
export const TOKEN_TYPE_WEIGHT = 'weight';
|
|
|
|
export const filters = {
|
|
[TOKEN_TYPE_AUTHOR]: {
|
|
[API_PARAM]: {
|
|
[NORMAL_FILTER]: 'authorUsername',
|
|
},
|
|
[URL_PARAM]: {
|
|
[OPERATOR_IS]: {
|
|
[NORMAL_FILTER]: 'author_username',
|
|
},
|
|
[OPERATOR_IS_NOT]: {
|
|
[NORMAL_FILTER]: 'not[author_username]',
|
|
},
|
|
},
|
|
},
|
|
[TOKEN_TYPE_ASSIGNEE]: {
|
|
[API_PARAM]: {
|
|
[NORMAL_FILTER]: 'assigneeUsernames',
|
|
[SPECIAL_FILTER]: 'assigneeId',
|
|
},
|
|
[URL_PARAM]: {
|
|
[OPERATOR_IS]: {
|
|
[NORMAL_FILTER]: 'assignee_username[]',
|
|
[SPECIAL_FILTER]: 'assignee_id',
|
|
[ALTERNATIVE_FILTER]: 'assignee_username',
|
|
},
|
|
[OPERATOR_IS_NOT]: {
|
|
[NORMAL_FILTER]: 'not[assignee_username][]',
|
|
},
|
|
},
|
|
},
|
|
[TOKEN_TYPE_MILESTONE]: {
|
|
[API_PARAM]: {
|
|
[NORMAL_FILTER]: 'milestoneTitle',
|
|
[SPECIAL_FILTER]: 'milestoneWildcardId',
|
|
},
|
|
[URL_PARAM]: {
|
|
[OPERATOR_IS]: {
|
|
[NORMAL_FILTER]: 'milestone_title',
|
|
[SPECIAL_FILTER]: 'milestone_title',
|
|
},
|
|
[OPERATOR_IS_NOT]: {
|
|
[NORMAL_FILTER]: 'not[milestone_title]',
|
|
},
|
|
},
|
|
},
|
|
[TOKEN_TYPE_LABEL]: {
|
|
[API_PARAM]: {
|
|
[NORMAL_FILTER]: 'labelName',
|
|
[SPECIAL_FILTER]: 'labelName',
|
|
},
|
|
[URL_PARAM]: {
|
|
[OPERATOR_IS]: {
|
|
[NORMAL_FILTER]: 'label_name[]',
|
|
[SPECIAL_FILTER]: 'label_name[]',
|
|
},
|
|
[OPERATOR_IS_NOT]: {
|
|
[NORMAL_FILTER]: 'not[label_name][]',
|
|
},
|
|
},
|
|
},
|
|
[TOKEN_TYPE_TYPE]: {
|
|
[API_PARAM]: {
|
|
[NORMAL_FILTER]: 'types',
|
|
[SPECIAL_FILTER]: 'types',
|
|
},
|
|
[URL_PARAM]: {
|
|
[OPERATOR_IS]: {
|
|
[NORMAL_FILTER]: 'type[]',
|
|
[SPECIAL_FILTER]: 'type[]',
|
|
},
|
|
},
|
|
},
|
|
[TOKEN_TYPE_MY_REACTION]: {
|
|
[API_PARAM]: {
|
|
[NORMAL_FILTER]: 'myReactionEmoji',
|
|
[SPECIAL_FILTER]: 'myReactionEmoji',
|
|
},
|
|
[URL_PARAM]: {
|
|
[OPERATOR_IS]: {
|
|
[NORMAL_FILTER]: 'my_reaction_emoji',
|
|
[SPECIAL_FILTER]: 'my_reaction_emoji',
|
|
},
|
|
},
|
|
},
|
|
[TOKEN_TYPE_CONFIDENTIAL]: {
|
|
[API_PARAM]: {
|
|
[NORMAL_FILTER]: 'confidential',
|
|
},
|
|
[URL_PARAM]: {
|
|
[OPERATOR_IS]: {
|
|
[NORMAL_FILTER]: 'confidential',
|
|
},
|
|
},
|
|
},
|
|
[TOKEN_TYPE_ITERATION]: {
|
|
[API_PARAM]: {
|
|
[NORMAL_FILTER]: 'iterationId',
|
|
[SPECIAL_FILTER]: 'iterationWildcardId',
|
|
},
|
|
[URL_PARAM]: {
|
|
[OPERATOR_IS]: {
|
|
[NORMAL_FILTER]: 'iteration_id',
|
|
[SPECIAL_FILTER]: 'iteration_id',
|
|
},
|
|
[OPERATOR_IS_NOT]: {
|
|
[NORMAL_FILTER]: 'not[iteration_id]',
|
|
},
|
|
},
|
|
},
|
|
[TOKEN_TYPE_EPIC]: {
|
|
[API_PARAM]: {
|
|
[NORMAL_FILTER]: 'epicId',
|
|
[SPECIAL_FILTER]: 'epicId',
|
|
},
|
|
[URL_PARAM]: {
|
|
[OPERATOR_IS]: {
|
|
[NORMAL_FILTER]: 'epic_id',
|
|
[SPECIAL_FILTER]: 'epic_id',
|
|
},
|
|
[OPERATOR_IS_NOT]: {
|
|
[NORMAL_FILTER]: 'not[epic_id]',
|
|
},
|
|
},
|
|
},
|
|
[TOKEN_TYPE_WEIGHT]: {
|
|
[API_PARAM]: {
|
|
[NORMAL_FILTER]: 'weight',
|
|
[SPECIAL_FILTER]: 'weight',
|
|
},
|
|
[URL_PARAM]: {
|
|
[OPERATOR_IS]: {
|
|
[NORMAL_FILTER]: 'weight',
|
|
[SPECIAL_FILTER]: 'weight',
|
|
},
|
|
[OPERATOR_IS_NOT]: {
|
|
[NORMAL_FILTER]: 'not[weight]',
|
|
},
|
|
},
|
|
},
|
|
};
|
|
|
|
export const issuesCountSmartQueryBase = {
|
|
query: getIssuesCountQuery,
|
|
context: {
|
|
isSingleRequest: true,
|
|
},
|
|
update: ({ project }) => project?.issues.count,
|
|
error(error) {
|
|
createFlash({ message: i18n.errorFetchingCounts, captureError: true, error });
|
|
},
|
|
debounce: 200,
|
|
};
|