{"version":3,"sources":["webpack:///./lib/utils/ajax_cache.js","webpack:///./gfm_auto_complete.js","webpack:///./sidebar/queries/reviewer_rereview.mutation.graphql","webpack:///./loading_icon_for_legacy_js.js","webpack:///./lib/utils/jquery_at_who.js","webpack:///./sidebar/services/sidebar_service.js","webpack:///./sidebar/sidebar_mediator.js"],"names":["AjaxCache","Cache","constructor","super","this","pendingRequests","override","endpoint","data","internalStorage","retrieve","forceRetrieve","_this","hasData","Promise","resolve","get","pendingRequest","axios","then","catch","e","error","Error","message","textStatus","useMentionsBackendFiltering","_window$gon$features","window","gon","features","mentionAutocompleteBackendFiltering","escape","string","encodedString","decodedString","decodeURIComponent","_escape","replace","showAndHideHelper","$input","alias","on","removeClass","addClass","createMemberSearchString","member","name","username","membersBeforeSave","members","map","title","count","mentionsDisabled","autoCompleteAvatar","avatar_url","charAt","toUpperCase","rectAvatarClass","type","imgAvatar","txtAvatar","avatarIcon","spriteIcon","avatarTag","length","search","icon","availability","highlighter","li","query","escapedQuery","_escapeRegExp","regexp","RegExp","str","$1","$2","$3","defaultAutocompleteConfig","emojis","issues","mergeRequests","epics","iterations","milestones","labels","snippets","vulnerabilities","contacts","GfmAutoComplete","dataSources","cachedData","isLoadingData","previousQuery","undefined","setup","input","enableMap","$","setupLifecycle","each","i","hasClass","off","setupAtWho","bind","dispatchEvent","Event","trigger","clearCache","setupEmoji","setupMembers","setupIssues","setupMilestones","setupMergeRequests","setupLabels","setupSnippets","setupContacts","filter","atwho","at","searchKey","limit","skipSpecialCharacterTest","skipMarkdownCharacterTest","defaultLoadingData","displayTpl","value","cssClasses","isLoading","Loading","template","tpl","aliases","params","warning","description","push","_template","className","join","insertTpl","referencePrefix","match","exec","test","interpolate","suffix","callbacks","getDefaultCallbacks","beforeSave","commands","c","matcher","flag","subtext","setSubmitReviewStates","REVIEW_STATES","reviewed","header","__","approve","requested_changes","Object","keys","reviewState","fetchData","Emoji","templateFunction","insertTemplateFunction","items","$inputor","sorter","setting","highlightFirst","alwaysHighlightFirst","instance","MEMBER_COMMAND","ASSIGN","UNASSIGN","ASSIGN_REVIEWER","UNASSIGN_REVIEWER","REASSIGN","CC","assignees","reviewers","command","tmpl","Members","availabilityStatus","isUserBusy","s__","delay","DEFAULT_DEBOUNCE_AND_THROTTLE_MS","_SidebarMediator$sing","_state$issuable","subtextNodes","split","pop","regexSubtext","find","node","values","includes","SidebarMediator","singleton","store","state","issuable","nodes","defaultMatcher","app","controllers","sort","Issues","id","iid","reference","Milestones","expired","parsedMilestones","m","dueDate","due_date","parsePikadayDate","Date","now","getTime","mA","mB","merges","LABEL_COMMAND","LABEL","LABELS","UNLABEL","RELABEL","Labels","color","set","endsWith","lastCandidate","label","startsWith","fn","default","email","Contacts","firstName","first_name","lastName","last_name","contact","self","isTypeWithBackendFiltering","beforeInsert","withoutAt","substring","regex","_this2","dataSource","atTypeMap","_this$cachedData$at","loadData","loadEmojiData","some","glEmojiTag","destroy","dataToInspect","loadingState","atSymbolsWithBar","atSymbolsWithoutBar","targetSubtext","resultantFlag","accentAChar","decodeURI","accentYChar","typesWithBackendFiltering","emoji","item","escapedFieldValue","fieldValue","slice","nameOrUsernameStartsWith","toLowerCase","nameOrUsernameIncludes","lowercaseQuery","_sortBy","sprintf","milestone","loadingSpinner","loadingIconForLegacyJS","inline","classes","outerHTML","doc","loc","source","definitionRefs","findOperation","definitions","element","forEach","def","refs","Set","collectFragmentReferences","kind","add","selectionSet","selections","selection","variableDefinitions","module","exports","operationName","newDoc","hasOwnProperty","opRefs","allRefs","newRefs","refName","size","prevRefs","has","childRef","op","oneQuery","defaultValue","prop","_GlLoadingIcon$props$","GlLoadingIcon","props","mountEl","document","createElement","vm","Vue","el","render","h","class","$forceUpdate","$el","cloneNode","$destroy","gqClient","createGqClient","fetchPolicy","fetchPolicies","NO_CACHE","SidebarService","endpointMap","moveIssueEndpoint","projectsAutocompleteEndpoint","fullPath","issuableType","update","key","put","getProjectsAutocomplete","searchTerm","moveIssue","moveToProjectId","post","move_to_project_id","requestReview","userId","mutate","mutation","reviewerRereviewMutation","variables","convertToGraphQLId","TYPENAME_USER","projectPath","toString","options","initSingleton","Store","service","Service","assignYourself","addAssignee","currentUser","addSelfReview","addReviewer","field","selected","u","assignee_ids","res","overwrite","reject","selectedReviewers","selectedIds","suggestedSelectedIds","suggested","reviewer_ids","suggested_reviewer_ids","callback","updateReviewer","toast","setMoveToProjectId","projectId","fetch","processFetchedData","createAlert","setAssigneeData","setReviewerData","setTimeTrackingData","fetchAutocompleteProjects","_this3","setAutocompleteProjects","autocompleteProjects","location","pathname","web_url","visitUrl"],"mappings":"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","file":"commons-initGFMInput-pages.admin.abuse_reports.show-pages.admin.topics.edit-pages.admin.topics.new-p-9ee023d7.cd8a08a4.chunk.js","sourcesContent":["import axios from './axios_utils';\nimport Cache from './cache';\n\nclass AjaxCache extends Cache {\n constructor() {\n super();\n this.pendingRequests = {};\n }\n\n override(endpoint, data) {\n this.internalStorage[endpoint] = data;\n }\n\n retrieve(endpoint, forceRetrieve) {\n if (this.hasData(endpoint) && !forceRetrieve) {\n return Promise.resolve(this.get(endpoint));\n }\n\n let pendingRequest = this.pendingRequests[endpoint];\n\n if (!pendingRequest) {\n pendingRequest = axios\n .get(endpoint)\n .then(({ data }) => {\n this.internalStorage[endpoint] = data;\n delete this.pendingRequests[endpoint];\n })\n .catch((e) => {\n const error = new Error(`${endpoint}: ${e.message}`);\n error.textStatus = e.message;\n\n delete this.pendingRequests[endpoint];\n throw error;\n });\n\n this.pendingRequests[endpoint] = pendingRequest;\n }\n\n return pendingRequest.then(() => this.get(endpoint));\n }\n}\n\nexport default new AjaxCache();\n","import $ from 'jquery';\nimport '~/lib/utils/jquery_at_who';\nimport { escape as lodashEscape, sortBy, template, escapeRegExp } from 'lodash';\nimport * as Emoji from '~/emoji';\nimport axios from '~/lib/utils/axios_utils';\nimport { DEFAULT_DEBOUNCE_AND_THROTTLE_MS } from '~/lib/utils/constants';\nimport { loadingIconForLegacyJS } from '~/loading_icon_for_legacy_js';\nimport { s__, __, sprintf } from '~/locale';\nimport { isUserBusy } from '~/set_status_modal/utils';\nimport SidebarMediator from '~/sidebar/sidebar_mediator';\nimport { state } from '~/sidebar/components/reviewers/sidebar_reviewers.vue';\nimport AjaxCache from './lib/utils/ajax_cache';\nimport { spriteIcon } from './lib/utils/common_utils';\nimport { parsePikadayDate } from './lib/utils/datetime_utility';\nimport { unicodeLetters } from './lib/utils/regexp';\n\nconst USERS_ALIAS = 'users';\nconst ISSUES_ALIAS = 'issues';\nconst MILESTONES_ALIAS = 'milestones';\nconst MERGEREQUESTS_ALIAS = 'mergerequests';\nconst LABELS_ALIAS = 'labels';\nconst SNIPPETS_ALIAS = 'snippets';\nconst CONTACTS_ALIAS = 'contacts';\n\nconst CADENCE_REFERENCE_PREFIX = '[cadence:';\nconst ITERATION_REFERENCE_PREFIX = '*iteration:';\n\nexport const AT_WHO_ACTIVE_CLASS = 'at-who-active';\nexport const CONTACT_STATE_ACTIVE = 'active';\nexport const CONTACTS_ADD_COMMAND = '/add_contacts';\nexport const CONTACTS_REMOVE_COMMAND = '/remove_contacts';\n\nconst useMentionsBackendFiltering = window.gon.features?.mentionAutocompleteBackendFiltering;\n\n/**\n * Escapes user input before we pass it to at.js, which\n * renders it as HTML in the autocomplete dropdown.\n *\n * at.js allows you to reference data using `${}` syntax\n * (e.g. ${search}) which it replaces with the actual data\n * before rendering it in the autocomplete dropdown.\n * To prevent user input from executing this `${}` syntax,\n * we also need to escape the $ character.\n *\n * @param string user input\n * @return {string} escaped user input\n */\nexport function escape(string) {\n // To prevent double (or multiple) enconding attack\n // Decode the user input repeatedly prior to escaping the final decoded string.\n let encodedString = string;\n let decodedString = decodeURIComponent(encodedString);\n\n while (decodedString !== encodedString) {\n encodedString = decodeURIComponent(decodedString);\n decodedString = decodeURIComponent(encodedString);\n }\n\n return lodashEscape(decodedString.replace(/\\$/g, '$'));\n}\n\nexport function showAndHideHelper($input, alias = '') {\n $input.on(`hidden${alias ? '-' : ''}${alias}.atwho`, () => {\n $input.removeClass(AT_WHO_ACTIVE_CLASS);\n });\n $input.on(`shown${alias ? '-' : ''}${alias}.atwho`, () => {\n $input.addClass(AT_WHO_ACTIVE_CLASS);\n });\n}\n\n// This should be kept in sync with the backend filtering in\n// `User#gfm_autocomplete_search` and `Namespace#gfm_autocomplete_search`\nfunction createMemberSearchString(member) {\n return `${member.name.replace(/ /g, '')} ${member.username}`;\n}\n\nexport function membersBeforeSave(members) {\n return members.map((member) => {\n const GROUP_TYPE = 'Group';\n\n let title = '';\n if (member.username == null) {\n return member;\n }\n title = member.name;\n if (member.count && !member.mentionsDisabled) {\n title += ` (${member.count})`;\n }\n\n const autoCompleteAvatar = member.avatar_url || member.username.charAt(0).toUpperCase();\n\n const rectAvatarClass = member.type === GROUP_TYPE ? 'rect-avatar' : '';\n const imgAvatar = `\"${member.username}\"`;\n const txtAvatar = `
${autoCompleteAvatar}
`;\n const avatarIcon = member.mentionsDisabled\n ? spriteIcon('notifications-off', 's16 vertical-align-middle gl-ml-2')\n : '';\n\n return {\n username: member.username,\n avatarTag: autoCompleteAvatar.length === 1 ? txtAvatar : imgAvatar,\n title,\n search: createMemberSearchString(member),\n icon: avatarIcon,\n availability: member?.availability,\n };\n });\n}\n\nexport const highlighter = (li, query) => {\n // override default behaviour to escape dot character\n // see https://github.com/ichord/At.js/pull/576\n if (!query) {\n return li;\n }\n const escapedQuery = escapeRegExp(query);\n const regexp = new RegExp(`>\\\\s*([^<]*?)(${escapedQuery})([^<]*)\\\\s*<`, 'ig');\n return li.replace(regexp, (str, $1, $2, $3) => `> ${$1}${$2}${$3} <`);\n};\n\nexport const defaultAutocompleteConfig = {\n emojis: true,\n members: true,\n issues: true,\n mergeRequests: true,\n epics: true,\n iterations: true,\n milestones: true,\n labels: true,\n snippets: true,\n vulnerabilities: true,\n contacts: true,\n};\n\nclass GfmAutoComplete {\n constructor(dataSources = {}) {\n this.dataSources = dataSources;\n this.cachedData = {};\n this.isLoadingData = {};\n this.previousQuery = undefined;\n }\n\n setup(input, enableMap = defaultAutocompleteConfig) {\n // Add GFM auto-completion to all input fields, that accept GFM input.\n this.input = input || $('.js-gfm-input');\n this.enableMap = enableMap;\n this.setupLifecycle();\n }\n\n setupLifecycle() {\n this.input.each((i, input) => {\n const $input = $(input);\n if (!$input.hasClass('js-gfm-input-initialized')) {\n // eslint-disable-next-line @gitlab/no-global-event-off\n $input.off('focus.setupAtWho').on('focus.setupAtWho', this.setupAtWho.bind(this, $input));\n $input.on('change.atwho', () => input.dispatchEvent(new Event('input')));\n // This triggers at.js again\n // Needed for quick actions with suffixes (ex: /label ~)\n $input.on('inserted-commands.atwho', $input.trigger.bind($input, 'keyup'));\n $input.on('clear-commands-cache.atwho', () => this.clearCache());\n $input.addClass('js-gfm-input-initialized');\n }\n });\n }\n\n setupAtWho($input) {\n if (this.enableMap.emojis) this.setupEmoji($input);\n if (this.enableMap.members) this.setupMembers($input);\n if (this.enableMap.issues) this.setupIssues($input);\n if (this.enableMap.milestones) this.setupMilestones($input);\n if (this.enableMap.mergeRequests) this.setupMergeRequests($input);\n if (this.enableMap.labels) this.setupLabels($input);\n if (this.enableMap.snippets) this.setupSnippets($input);\n if (this.enableMap.contacts) this.setupContacts($input);\n\n $input.filter('[data-supports-quick-actions=\"true\"]').atwho({\n at: '/',\n alias: 'commands',\n searchKey: 'search',\n limit: 100,\n skipSpecialCharacterTest: true,\n skipMarkdownCharacterTest: true,\n data: GfmAutoComplete.defaultLoadingData,\n displayTpl(value) {\n const cssClasses = [];\n\n if (GfmAutoComplete.isLoading(value)) return GfmAutoComplete.Loading.template;\n // eslint-disable-next-line no-template-curly-in-string\n let tpl = '
  • \">/${name}';\n if (value.aliases.length > 0) {\n tpl += ' (or /<%- aliases.join(\", /\") %>)';\n }\n if (value.params.length > 0) {\n tpl += ' <%- params.join(\" \") %>';\n }\n if (value.warning && value.icon && value.icon === 'confidential') {\n tpl += `${spriteIcon(\n 'eye-slash',\n 's16 gl-mr-2',\n )}<%- warning %>`;\n } else if (value.warning) {\n tpl += '<%- warning %>';\n } else if (value.description !== '') {\n tpl += '<%- description %>';\n }\n tpl += '
  • ';\n\n if (value.warning) {\n cssClasses.push('has-warning');\n }\n\n return template(tpl)({\n ...value,\n className: cssClasses.join(' '),\n });\n },\n insertTpl(value) {\n // eslint-disable-next-line no-template-curly-in-string\n let tpl = '/${name} ';\n let referencePrefix = null;\n if (value.params.length > 0) {\n const regexp = /^<\\[[a-z]+:/;\n const match = regexp.exec(value.params);\n if (match) {\n [referencePrefix] = match;\n\n // EE-ONLY; iteration quick action should autocomplete iteration reference only\n if (referencePrefix === CADENCE_REFERENCE_PREFIX)\n referencePrefix = ITERATION_REFERENCE_PREFIX;\n\n tpl += '<%- referencePrefix %>';\n } else {\n [[referencePrefix]] = value.params;\n if (/^[@%~]/.test(referencePrefix)) {\n tpl += '<%- referencePrefix %>';\n } else if (/^[*]/.test(referencePrefix)) {\n // EE-ONLY\n referencePrefix = ITERATION_REFERENCE_PREFIX;\n tpl += '<%- referencePrefix %>';\n }\n }\n }\n return template(tpl, { interpolate: /<%=([\\s\\S]+?)%>/g })({ referencePrefix });\n },\n suffix: '',\n callbacks: {\n ...this.getDefaultCallbacks(),\n beforeSave(commands) {\n if (GfmAutoComplete.isLoading(commands)) return commands;\n return $.map(commands, (c) => {\n let search = c.name;\n if (c.aliases.length > 0) {\n search = `${search} ${c.aliases.join(' ')}`;\n }\n return {\n name: c.name,\n aliases: c.aliases,\n params: c.params,\n description: c.description,\n warning: c.warning,\n icon: c.icon,\n search,\n };\n });\n },\n matcher(flag, subtext) {\n const regexp = /(?:^|\\n)\\/([A-Za-z_]*)$/gi;\n const match = regexp.exec(subtext);\n if (match) {\n return match[1];\n }\n return null;\n },\n },\n });\n }\n\n // eslint-disable-next-line class-methods-use-this\n setSubmitReviewStates($input) {\n const REVIEW_STATES = {\n reviewed: {\n header: __('Comment'),\n description: __('Submit general feedback without explicit approval.'),\n },\n approve: {\n header: __('Approve'),\n description: __('Submit feedback and approve these changes.'),\n },\n requested_changes: {\n header: __('Request changes'),\n description: __('Submit feedback that should be addressed before merging.'),\n },\n };\n\n $input.filter('[data-supports-quick-actions=\"true\"]').atwho({\n // Always keep the trailing space otherwise the command won't display correctly\n at: '/submit_review ',\n alias: 'submit_review',\n data: Object.keys(REVIEW_STATES),\n displayTpl({ name }) {\n const reviewState = REVIEW_STATES[name];\n\n return `
  • ${reviewState.header}${reviewState.description}
  • `;\n },\n });\n }\n\n setupEmoji($input) {\n const fetchData = this.fetchData.bind(this);\n\n // Emoji\n $input.atwho({\n at: ':',\n displayTpl: GfmAutoComplete.Emoji.templateFunction,\n insertTpl: GfmAutoComplete.Emoji.insertTemplateFunction,\n skipSpecialCharacterTest: true,\n data: GfmAutoComplete.defaultLoadingData,\n callbacks: {\n ...this.getDefaultCallbacks(),\n matcher(flag, subtext) {\n const regexp = new RegExp(`(?:[^${unicodeLetters}0-9:]|\\n|^):([^ :][^:]*)?$`, 'gi');\n const match = regexp.exec(subtext);\n\n if (match && match.length) {\n // Since we have \"?\" on the group, it's possible it is undefined\n return match[1] || '';\n }\n\n return null;\n },\n filter(query, items) {\n if (GfmAutoComplete.isLoading(items)) {\n fetchData(this.$inputor, this.at);\n return items;\n }\n\n return GfmAutoComplete.Emoji.filter(query);\n },\n sorter(query, items) {\n this.setting.highlightFirst = this.setting.alwaysHighlightFirst || query.length > 0;\n if (GfmAutoComplete.isLoading(items)) {\n this.setting.highlightFirst = false;\n return items;\n }\n\n if (query.length === 0) {\n return items;\n }\n\n return GfmAutoComplete.Emoji.sorter(items);\n },\n },\n });\n showAndHideHelper($input);\n }\n\n setupMembers($input) {\n const instance = this;\n const fetchData = this.fetchData.bind(this);\n const MEMBER_COMMAND = {\n ASSIGN: '/assign',\n UNASSIGN: '/unassign',\n ASSIGN_REVIEWER: '/assign_reviewer',\n UNASSIGN_REVIEWER: '/unassign_reviewer',\n REASSIGN: '/reassign',\n CC: '/cc',\n };\n let assignees = [];\n let reviewers = [];\n let command = '';\n\n // Team Members\n $input.atwho({\n at: '@',\n alias: USERS_ALIAS,\n displayTpl(value) {\n let tmpl = GfmAutoComplete.Loading.template;\n const { avatarTag, username, title, icon, availability } = value;\n if (username != null) {\n tmpl = GfmAutoComplete.Members.templateFunction({\n avatarTag,\n username,\n title,\n icon,\n availabilityStatus:\n availability && isUserBusy(availability)\n ? ` ${s__(\n 'UserProfile|Busy',\n )}`\n : '',\n });\n }\n return tmpl;\n },\n // eslint-disable-next-line no-template-curly-in-string\n insertTpl: '${atwho-at}${username}',\n limit: 10,\n delay: useMentionsBackendFiltering ? DEFAULT_DEBOUNCE_AND_THROTTLE_MS : null,\n searchKey: 'search',\n alwaysHighlightFirst: true,\n skipSpecialCharacterTest: true,\n data: GfmAutoComplete.defaultLoadingData,\n callbacks: {\n ...this.getDefaultCallbacks(),\n beforeSave: membersBeforeSave,\n matcher(flag, subtext) {\n const subtextNodes = subtext.split(/\\n+/g).pop().split(GfmAutoComplete.regexSubtext);\n\n // Check if @ is followed by '/assign', '/reassign', '/unassign' or '/cc' commands.\n command = subtextNodes.find((node) => {\n if (Object.values(MEMBER_COMMAND).includes(node)) {\n return node;\n }\n return null;\n });\n\n // Cache assignees & reviewers list for easier filtering later\n assignees =\n SidebarMediator.singleton?.store?.assignees?.map(createMemberSearchString) || [];\n reviewers = state.issuable?.reviewers?.nodes?.map(createMemberSearchString) || [];\n\n const match = GfmAutoComplete.defaultMatcher(flag, subtext, this.app.controllers);\n return match && match.length ? match[1] : null;\n },\n filter(query, data) {\n if (useMentionsBackendFiltering) {\n if (GfmAutoComplete.isLoading(data) || instance.previousQuery !== query) {\n instance.previousQuery = query;\n\n fetchData(this.$inputor, this.at, query);\n return data;\n }\n } else if (GfmAutoComplete.isLoading(data)) {\n fetchData(this.$inputor, this.at);\n return data;\n }\n\n if (command === MEMBER_COMMAND.ASSIGN) {\n // Only include members which are not assigned to Issuable currently\n return data.filter((member) => !assignees.includes(member.search));\n }\n if (command === MEMBER_COMMAND.UNASSIGN) {\n // Only include members which are assigned to Issuable currently\n return data.filter((member) => assignees.includes(member.search));\n }\n if (command === MEMBER_COMMAND.ASSIGN_REVIEWER) {\n // Only include members which are not assigned as a reviewer to Issuable currently\n return data.filter((member) => !reviewers.includes(member.search));\n }\n if (command === MEMBER_COMMAND.UNASSIGN_REVIEWER) {\n // Only include members which are not assigned as a reviewer to Issuable currently\n return data.filter((member) => reviewers.includes(member.search));\n }\n\n return data;\n },\n sorter(query, items) {\n // Disable auto-selecting the loading icon\n this.setting.highlightFirst = this.setting.alwaysHighlightFirst;\n if (GfmAutoComplete.isLoading(items)) {\n this.setting.highlightFirst = false;\n return items;\n }\n\n if (!query) {\n return items;\n }\n\n return GfmAutoComplete.Members.sort(query, items);\n },\n },\n });\n showAndHideHelper($input, USERS_ALIAS);\n }\n\n setupIssues($input) {\n $input.atwho({\n at: '#',\n alias: ISSUES_ALIAS,\n searchKey: 'search',\n displayTpl(value) {\n let tmpl = GfmAutoComplete.Loading.template;\n if (value.title != null) {\n tmpl = GfmAutoComplete.Issues.templateFunction(value);\n }\n return tmpl;\n },\n data: GfmAutoComplete.defaultLoadingData,\n insertTpl: GfmAutoComplete.Issues.insertTemplateFunction,\n skipSpecialCharacterTest: true,\n callbacks: {\n ...this.getDefaultCallbacks(),\n beforeSave(issues) {\n return $.map(issues, (i) => {\n if (i.title == null) {\n return i;\n }\n return {\n id: i.iid,\n title: i.title,\n reference: i.reference,\n search: `${i.iid} ${i.title}`,\n };\n });\n },\n },\n });\n showAndHideHelper($input, ISSUES_ALIAS);\n }\n\n setupMilestones($input) {\n $input.atwho({\n at: '%',\n alias: MILESTONES_ALIAS,\n searchKey: 'search',\n // eslint-disable-next-line no-template-curly-in-string\n insertTpl: '${atwho-at}${title}',\n displayTpl(value) {\n let tmpl = GfmAutoComplete.Loading.template;\n if (value.title != null) {\n tmpl = GfmAutoComplete.Milestones.templateFunction(value.title, value.expired);\n }\n return tmpl;\n },\n data: GfmAutoComplete.defaultLoadingData,\n callbacks: {\n ...this.getDefaultCallbacks(),\n beforeSave(milestones) {\n const parsedMilestones = $.map(milestones, (m) => {\n if (m.title == null) {\n return m;\n }\n\n const dueDate = m.due_date ? parsePikadayDate(m.due_date) : null;\n const expired = dueDate ? Date.now() > dueDate.getTime() : false;\n\n return {\n id: m.iid,\n title: m.title,\n search: m.title,\n expired,\n dueDate,\n };\n });\n\n // Sort milestones by due date when present.\n if (typeof parsedMilestones[0] === 'object') {\n return parsedMilestones.sort((mA, mB) => {\n // Move all expired milestones to the bottom.\n if (mA.expired) return 1;\n if (mB.expired) return -1;\n\n // Move milestones without due dates just above expired milestones.\n if (!mA.dueDate) return 1;\n if (!mB.dueDate) return -1;\n\n // Sort by due date in ascending order.\n return mA.dueDate - mB.dueDate;\n });\n }\n return parsedMilestones;\n },\n },\n });\n showAndHideHelper($input, MILESTONES_ALIAS);\n }\n\n setupMergeRequests($input) {\n $input.atwho({\n at: '!',\n alias: MERGEREQUESTS_ALIAS,\n searchKey: 'search',\n displayTpl(value) {\n let tmpl = GfmAutoComplete.Loading.template;\n if (value.title != null) {\n tmpl = GfmAutoComplete.Issues.templateFunction(value);\n }\n return tmpl;\n },\n data: GfmAutoComplete.defaultLoadingData,\n insertTpl: GfmAutoComplete.Issues.insertTemplateFunction,\n skipSpecialCharacterTest: true,\n callbacks: {\n ...this.getDefaultCallbacks(),\n beforeSave(merges) {\n return $.map(merges, (m) => {\n if (m.title == null) {\n return m;\n }\n return {\n id: m.iid,\n title: m.title,\n reference: m.reference,\n search: `${m.iid} ${m.title}`,\n };\n });\n },\n },\n });\n showAndHideHelper($input, MERGEREQUESTS_ALIAS);\n }\n\n setupLabels($input) {\n const instance = this;\n const fetchData = this.fetchData.bind(this);\n const LABEL_COMMAND = {\n LABEL: '/label',\n LABELS: '/labels',\n UNLABEL: '/unlabel',\n RELABEL: '/relabel',\n };\n let command = '';\n\n $input.atwho({\n at: '~',\n alias: LABELS_ALIAS,\n searchKey: 'search',\n data: GfmAutoComplete.defaultLoadingData,\n displayTpl(value) {\n let tmpl = GfmAutoComplete.Labels.templateFunction(value.color, value.title);\n if (GfmAutoComplete.isLoading(value)) {\n tmpl = GfmAutoComplete.Loading.template;\n }\n return tmpl;\n },\n // eslint-disable-next-line no-template-curly-in-string\n insertTpl: '${atwho-at}${title}',\n limit: 20,\n callbacks: {\n ...this.getDefaultCallbacks(),\n beforeSave(merges) {\n if (GfmAutoComplete.isLoading(merges)) return merges;\n return $.map(merges, (m) => ({\n title: m.title,\n color: m.color,\n search: m.title,\n set: m.set,\n }));\n },\n matcher(flag, subtext) {\n const subtextNodes = subtext.split(/\\n+/g).pop().split(GfmAutoComplete.regexSubtext);\n\n // Check if ~ is followed by '/label', '/labels', '/relabel' or '/unlabel' commands.\n command = subtextNodes.find((node) => {\n if (Object.values(LABEL_COMMAND).includes(node)) {\n return node;\n }\n return null;\n });\n\n // If any label matches the inserted text after the last `~`, suggest those labels,\n // even if any spaces or funky characters were typed.\n // This allows matching labels like \"Accepting merge requests\".\n const labels = instance.cachedData[flag];\n if (labels) {\n if (!subtext.includes(flag)) {\n // Do not match if there is no `~` before the cursor\n return null;\n }\n if (subtext.endsWith('~~')) {\n // Do not match if there are two consecutive `~` characters (strikethrough) before the cursor\n return null;\n }\n const lastCandidate = subtext.split(flag).pop();\n if (labels.find((label) => label.title.startsWith(lastCandidate))) {\n return lastCandidate;\n }\n }\n\n const match = GfmAutoComplete.defaultMatcher(flag, subtext, this.app.controllers);\n return match && match.length ? match[1] : null;\n },\n filter(query, data, searchKey) {\n if (GfmAutoComplete.isLoading(data)) {\n fetchData(this.$inputor, this.at);\n return data;\n }\n\n if (data === GfmAutoComplete.defaultLoadingData) {\n return $.fn.atwho.default.callbacks.filter(query, data, searchKey);\n }\n\n // The `LABEL_COMMAND.RELABEL` is intentionally skipped\n // because we want to return all the labels (unfiltered) for that command.\n if (command === LABEL_COMMAND.LABEL || command === LABEL_COMMAND.LABELS) {\n // Return labels with set: undefined.\n return data.filter((label) => !label.set);\n }\n if (command === LABEL_COMMAND.UNLABEL) {\n // Return labels with set: true.\n return data.filter((label) => label.set);\n }\n\n return data;\n },\n },\n });\n showAndHideHelper($input, LABELS_ALIAS);\n }\n\n setupSnippets($input) {\n $input.atwho({\n at: '$',\n alias: SNIPPETS_ALIAS,\n searchKey: 'search',\n displayTpl(value) {\n let tmpl = GfmAutoComplete.Loading.template;\n if (value.title != null) {\n tmpl = GfmAutoComplete.Issues.templateFunction(value);\n }\n return tmpl;\n },\n data: GfmAutoComplete.defaultLoadingData,\n // eslint-disable-next-line no-template-curly-in-string\n insertTpl: '${atwho-at}${id}',\n callbacks: {\n ...this.getDefaultCallbacks(),\n beforeSave(snippets) {\n return $.map(snippets, (m) => {\n if (m.title == null) {\n return m;\n }\n return {\n id: m.id,\n title: m.title,\n search: `${m.id} ${m.title}`,\n };\n });\n },\n },\n });\n showAndHideHelper($input, SNIPPETS_ALIAS);\n }\n\n setupContacts($input) {\n const fetchData = this.fetchData.bind(this);\n let command = '';\n\n $input.atwho({\n at: '[contact:',\n suffix: ']',\n alias: CONTACTS_ALIAS,\n searchKey: 'search',\n displayTpl(value) {\n let tmpl = GfmAutoComplete.Loading.template;\n if (value.email != null) {\n tmpl = GfmAutoComplete.Contacts.templateFunction(value);\n }\n return tmpl;\n },\n data: GfmAutoComplete.defaultLoadingData,\n // eslint-disable-next-line no-template-curly-in-string\n insertTpl: '${atwho-at}${email}',\n callbacks: {\n ...this.getDefaultCallbacks(),\n beforeSave(contacts) {\n return $.map(contacts, (m) => {\n if (m.email == null) {\n return m;\n }\n return {\n id: m.id,\n email: m.email,\n firstName: m.first_name,\n lastName: m.last_name,\n search: `${m.email}`,\n state: m.state,\n set: m.set,\n };\n });\n },\n matcher(flag, subtext) {\n const subtextNodes = subtext.split(/\\n+/g).pop().split(GfmAutoComplete.regexSubtext);\n\n command = subtextNodes.find((node) => {\n if (node === CONTACTS_ADD_COMMAND || node === CONTACTS_REMOVE_COMMAND) {\n return node;\n }\n return null;\n });\n\n const match = GfmAutoComplete.defaultMatcher(flag, subtext, this.app.controllers);\n return match?.length ? match[1] : null;\n },\n filter(query, data, searchKey) {\n if (GfmAutoComplete.isLoading(data)) {\n fetchData(this.$inputor, this.at);\n return data;\n }\n\n if (data === GfmAutoComplete.defaultLoadingData) {\n return $.fn.atwho.default.callbacks.filter(query, data, searchKey);\n }\n\n if (command === CONTACTS_ADD_COMMAND) {\n // Return contacts that are active and not already on the issue\n return data.filter((contact) => contact.state === CONTACT_STATE_ACTIVE && !contact.set);\n }\n if (command === CONTACTS_REMOVE_COMMAND) {\n // Return contacts already on the issue\n return data.filter((contact) => contact.set);\n }\n\n return data;\n },\n },\n });\n showAndHideHelper($input, CONTACTS_ALIAS);\n }\n\n getDefaultCallbacks() {\n const self = this;\n\n return {\n sorter(query, items, searchKey) {\n this.setting.highlightFirst = this.setting.alwaysHighlightFirst || query.length > 0;\n if (GfmAutoComplete.isLoading(items)) {\n this.setting.highlightFirst = false;\n return items;\n }\n return $.fn.atwho.default.callbacks.sorter(query, items, searchKey);\n },\n filter(query, data, searchKey) {\n if (GfmAutoComplete.isTypeWithBackendFiltering(this.at)) {\n if (GfmAutoComplete.isLoading(data) || self.previousQuery !== query) {\n self.previousQuery = query;\n self.fetchData(this.$inputor, this.at, query);\n return data;\n }\n }\n\n if (GfmAutoComplete.isLoading(data)) {\n self.fetchData(this.$inputor, this.at);\n return data;\n }\n\n return $.fn.atwho.default.callbacks.filter(query, data, searchKey);\n },\n beforeInsert(value) {\n let withoutAt = value.substring(1);\n const at = value.charAt();\n\n if (value && !this.setting.skipSpecialCharacterTest) {\n const regex = at === '~' ? /\\W|^\\d+$/ : /\\W/;\n if (withoutAt && regex.test(withoutAt)) {\n withoutAt = `\"${withoutAt}\"`;\n }\n }\n\n // We can ignore this for quick actions because they are processed\n // before Markdown.\n if (!this.setting.skipMarkdownCharacterTest) {\n withoutAt = withoutAt\n .replace(/(~~|`|\\*)/g, '\\\\$1')\n .replace(/(\\b)(_+)/g, '$1\\\\$2') // only escape underscores at the start\n .replace(/(_+)(\\b)/g, '\\\\$1$2'); // or end of words\n }\n\n return `${at}${withoutAt}`;\n },\n matcher(flag, subtext) {\n const match = GfmAutoComplete.defaultMatcher(flag, subtext, this.app.controllers);\n\n if (match) {\n return match[1];\n }\n return null;\n },\n highlighter,\n };\n }\n\n fetchData($input, at, search) {\n if (this.isLoadingData[at]) return;\n\n this.isLoadingData[at] = true;\n const dataSource = this.dataSources[GfmAutoComplete.atTypeMap[at]];\n\n if (GfmAutoComplete.isTypeWithBackendFiltering(at)) {\n if (this.cachedData[at]?.[search]) {\n this.loadData($input, at, this.cachedData[at][search], { search });\n } else {\n axios\n .get(dataSource, { params: { search } })\n .then(({ data }) => {\n this.loadData($input, at, data, { search });\n })\n .catch(() => {\n this.isLoadingData[at] = false;\n });\n }\n } else if (this.cachedData[at]) {\n this.loadData($input, at, this.cachedData[at]);\n } else if (GfmAutoComplete.atTypeMap[at] === 'emojis') {\n this.loadEmojiData($input, at).catch(() => {});\n } else if (dataSource) {\n AjaxCache.retrieve(dataSource, true)\n .then((data) => {\n if (data.some((c) => c.name === 'submit_review')) {\n this.setSubmitReviewStates($input);\n }\n this.loadData($input, at, data);\n })\n .catch(() => {\n this.isLoadingData[at] = false;\n });\n } else {\n this.isLoadingData[at] = false;\n }\n }\n\n loadData($input, at, data, { search } = {}) {\n this.isLoadingData[at] = false;\n\n if (search !== undefined) {\n if (this.cachedData[at] === undefined) {\n this.cachedData[at] = {};\n }\n\n this.cachedData[at][search] = data;\n } else {\n this.cachedData[at] = data;\n }\n\n $input.atwho('load', at, data);\n // This trigger at.js again\n // otherwise we would be stuck with loading until the user types\n return $input.trigger('keyup');\n }\n\n async loadEmojiData($input, at) {\n await Emoji.initEmojiMap();\n\n this.loadData($input, at, ['loaded']);\n\n GfmAutoComplete.glEmojiTag = Emoji.glEmojiTag;\n }\n\n clearCache() {\n this.cachedData = {};\n }\n\n destroy() {\n this.input.each((i, input) => {\n const $input = $(input);\n $input.atwho('destroy');\n });\n }\n\n static isLoading(data) {\n let dataToInspect = data;\n if (data && data.length > 0) {\n [dataToInspect] = data;\n }\n\n const loadingState = GfmAutoComplete.defaultLoadingData[0];\n return dataToInspect && (dataToInspect === loadingState || dataToInspect.name === loadingState);\n }\n\n static defaultMatcher(flag, subtext, controllers) {\n // The below is taken from At.js source\n // Tweaked to commands to start without a space only if char before is a non-word character\n // https://github.com/ichord/At.js\n const atSymbolsWithBar = Object.keys(controllers)\n .join('|')\n .replace(/[$]/, '\\\\$&')\n .replace(/([[\\]:])/g, '\\\\$1')\n .replace(/([*])/g, '\\\\$1');\n\n const atSymbolsWithoutBar = Object.keys(controllers).join('');\n const targetSubtext = subtext.split(GfmAutoComplete.regexSubtext).pop();\n const resultantFlag = flag.replace(/[-[\\]/{}()*+?.\\\\^$|]/g, '\\\\$&');\n\n const accentAChar = decodeURI('%C3%80');\n const accentYChar = decodeURI('%C3%BF');\n\n // Holy regex, batman!\n const regexp = new RegExp(\n `^(?:\\\\B|[^a-zA-Z0-9_\\`${atSymbolsWithoutBar}]|\\\\s)${resultantFlag}(?!${atSymbolsWithBar})((?:[A-Za-z${accentAChar}-${accentYChar}0-9_'.+-:]|[^\\\\x00-\\\\x7a])*)$`,\n 'gi',\n );\n\n return regexp.exec(targetSubtext);\n }\n}\n\nGfmAutoComplete.regexSubtext = /\\s+/g;\n\nGfmAutoComplete.defaultLoadingData = ['loading'];\n\nGfmAutoComplete.atTypeMap = {\n ':': 'emojis',\n '@': 'members',\n '#': 'issues',\n '!': 'mergeRequests',\n '&': 'epics',\n '*iteration:': 'iterations',\n '~': 'labels',\n '%': 'milestones',\n '/': 'commands',\n '[vulnerability:': 'vulnerabilities',\n $: 'snippets',\n '[contact:': 'contacts',\n};\n\nGfmAutoComplete.typesWithBackendFiltering = ['vulnerabilities'];\n\nif (useMentionsBackendFiltering) {\n GfmAutoComplete.typesWithBackendFiltering.push('members');\n}\n\nGfmAutoComplete.isTypeWithBackendFiltering = (type) =>\n GfmAutoComplete.typesWithBackendFiltering.includes(GfmAutoComplete.atTypeMap[type]);\n\n// Emoji\nGfmAutoComplete.glEmojiTag = null;\nGfmAutoComplete.Emoji = {\n insertTemplateFunction(value) {\n return `:${value.emoji.name}:`;\n },\n templateFunction(item) {\n if (GfmAutoComplete.isLoading(item)) {\n return GfmAutoComplete.Loading.template;\n }\n\n const escapedFieldValue = escape(item.fieldValue);\n if (!GfmAutoComplete.glEmojiTag) {\n return `
  • ${escapedFieldValue}
  • `;\n }\n\n return `
  • ${GfmAutoComplete.glEmojiTag(item.emoji.name)} ${escapedFieldValue}
  • `;\n },\n filter(query) {\n if (query.length === 0) {\n return Emoji.getAllEmoji()\n .map((emoji) => ({\n emoji,\n fieldValue: emoji.name,\n }))\n .slice(0, 20);\n }\n\n return Emoji.searchEmoji(query);\n },\n sorter(items) {\n return items.sort(Emoji.sortEmoji);\n },\n};\n// Team Members\nGfmAutoComplete.Members = {\n templateFunction({ avatarTag, username, title, icon, availabilityStatus }) {\n return `
  • ${avatarTag} ${username} ${escape(\n title,\n )}${availabilityStatus} ${icon}
  • `;\n },\n nameOrUsernameStartsWith(member, query) {\n // `member.search` is a name:username string like `MargeSimpson msimpson`\n return member.search.split(' ').some((name) => name.toLowerCase().startsWith(query));\n },\n nameOrUsernameIncludes(member, query) {\n // `member.search` is a name:username string like `MargeSimpson msimpson`\n return member.search.toLowerCase().includes(query);\n },\n // This should be kept in sync with the backend sorting in\n // `User#gfm_autocomplete_search` and `Namespace#gfm_autocomplete_search`\n sort(query, members) {\n const lowercaseQuery = query.toLowerCase();\n const { nameOrUsernameStartsWith, nameOrUsernameIncludes } = GfmAutoComplete.Members;\n\n return sortBy(\n members.filter((member) => nameOrUsernameIncludes(member, lowercaseQuery)),\n (member) => (nameOrUsernameStartsWith(member, lowercaseQuery) ? -1 : 0),\n );\n },\n};\nGfmAutoComplete.Labels = {\n templateFunction(color, title) {\n return `
  • ${escape(title)}
  • `;\n },\n};\n// Issues, MergeRequests and Snippets\nGfmAutoComplete.Issues = {\n insertTemplateFunction(value) {\n // eslint-disable-next-line no-template-curly-in-string\n return value.reference || '${atwho-at}${id}';\n },\n templateFunction({ id, title, reference }) {\n return `
  • ${escape(reference || id)} ${escape(title)}
  • `;\n },\n};\n// Milestones\nGfmAutoComplete.Milestones = {\n templateFunction(title, expired) {\n if (expired) {\n return `
  • ${sprintf(__('%{milestone} (expired)'), {\n milestone: escape(title),\n })}
  • `;\n }\n return `
  • ${escape(title)}
  • `;\n },\n};\nGfmAutoComplete.Contacts = {\n templateFunction({ email, firstName, lastName }) {\n return `
  • ${escape(firstName)} ${escape(lastName)} ${escape(email)}
  • `;\n },\n};\n\nconst loadingSpinner = loadingIconForLegacyJS({\n inline: true,\n classes: ['gl-mr-2'],\n}).outerHTML;\n\nGfmAutoComplete.Loading = {\n template: `
  • ${loadingSpinner}Loading...
  • `,\n};\n\nexport default GfmAutoComplete;\n","\n var doc = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"mutation\",\"name\":{\"kind\":\"Name\",\"value\":\"mergeRequestRequestRereview\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"projectPath\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"ID\"}}},\"directives\":[]},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"iid\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"String\"}}},\"directives\":[]},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"userId\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"UserID\"}}},\"directives\":[]}],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"mergeRequestReviewerRereview\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"},\"value\":{\"kind\":\"ObjectValue\",\"fields\":[{\"kind\":\"ObjectField\",\"name\":{\"kind\":\"Name\",\"value\":\"projectPath\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"projectPath\"}}},{\"kind\":\"ObjectField\",\"name\":{\"kind\":\"Name\",\"value\":\"iid\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"iid\"}}},{\"kind\":\"ObjectField\",\"name\":{\"kind\":\"Name\",\"value\":\"userId\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"userId\"}}}]}}],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"errors\"},\"arguments\":[],\"directives\":[]}]}}]}}],\"loc\":{\"start\":0,\"end\":207}};\n doc.loc.source = {\"body\":\"mutation mergeRequestRequestRereview($projectPath: ID!, $iid: String!, $userId: UserID!) {\\n mergeRequestReviewerRereview(input: { projectPath: $projectPath, iid: $iid, userId: $userId }) {\\n errors\\n }\\n}\\n\",\"name\":\"GraphQL request\",\"locationOffset\":{\"line\":1,\"column\":1}};\n \n\n var names = {};\n function unique(defs) {\n return defs.filter(\n function(def) {\n if (def.kind !== 'FragmentDefinition') return true;\n var name = def.name.value\n if (names[name]) {\n return false;\n } else {\n names[name] = true;\n return true;\n }\n }\n )\n }\n \n\n // Collect any fragment/type references from a node, adding them to the refs Set\n function collectFragmentReferences(node, refs) {\n if (node.kind === \"FragmentSpread\") {\n refs.add(node.name.value);\n } else if (node.kind === \"VariableDefinition\") {\n var type = node.type;\n if (type.kind === \"NamedType\") {\n refs.add(type.name.value);\n }\n }\n\n if (node.selectionSet) {\n node.selectionSet.selections.forEach(function(selection) {\n collectFragmentReferences(selection, refs);\n });\n }\n\n if (node.variableDefinitions) {\n node.variableDefinitions.forEach(function(def) {\n collectFragmentReferences(def, refs);\n });\n }\n\n if (node.definitions) {\n node.definitions.forEach(function(def) {\n collectFragmentReferences(def, refs);\n });\n }\n }\n\n var definitionRefs = {};\n (function extractReferences() {\n doc.definitions.forEach(function(def) {\n if (def.name) {\n var refs = new Set();\n collectFragmentReferences(def, refs);\n definitionRefs[def.name.value] = refs;\n }\n });\n })();\n\n function findOperation(doc, name) {\n for (var i = 0; i < doc.definitions.length; i++) {\n var element = doc.definitions[i];\n if (element.name && element.name.value == name) {\n return element;\n }\n }\n }\n\n function oneQuery(doc, operationName) {\n // Copy the DocumentNode, but clear out the definitions\n var newDoc = {\n kind: doc.kind,\n definitions: [findOperation(doc, operationName)]\n };\n if (doc.hasOwnProperty(\"loc\")) {\n newDoc.loc = doc.loc;\n }\n\n // Now, for the operation we're running, find any fragments referenced by\n // it or the fragments it references\n var opRefs = definitionRefs[operationName] || new Set();\n var allRefs = new Set();\n var newRefs = new Set();\n\n // IE 11 doesn't support \"new Set(iterable)\", so we add the members of opRefs to newRefs one by one\n opRefs.forEach(function(refName) {\n newRefs.add(refName);\n });\n\n while (newRefs.size > 0) {\n var prevRefs = newRefs;\n newRefs = new Set();\n\n prevRefs.forEach(function(refName) {\n if (!allRefs.has(refName)) {\n allRefs.add(refName);\n var childRefs = definitionRefs[refName] || new Set();\n childRefs.forEach(function(childRef) {\n newRefs.add(childRef);\n });\n }\n });\n }\n\n allRefs.forEach(function(refName) {\n var op = findOperation(doc, refName);\n if (op) {\n newDoc.definitions.push(op);\n }\n });\n\n return newDoc;\n }\n \n module.exports = doc;\n \n module.exports[\"mergeRequestRequestRereview\"] = oneQuery(doc, \"mergeRequestRequestRereview\");\n \n","import Vue from 'vue';\nimport { GlLoadingIcon } from '@gitlab/ui';\nimport { __ } from '~/locale';\n\nconst defaultValue = (prop) => GlLoadingIcon.props[prop]?.default;\n\n/**\n * Returns a loading icon/spinner element.\n *\n * This should *only* be used in existing legacy areas of code where Vue is not\n * in use, as part of the migration strategy defined in\n * https://gitlab.com/groups/gitlab-org/-/epics/7626.\n *\n * @param {object} props - The props to configure the spinner.\n * @param {boolean} props.inline - Display the spinner inline; otherwise, as a block.\n * @param {string} props.color - The color of the spinner ('dark' or 'light')\n * @param {string} props.size - The size of the spinner ('sm', 'md', 'lg', 'xl')\n * @param {string[]} props.classes - Additional classes to apply to the element.\n * @param {string} props.label - The ARIA label to apply to the spinner.\n * @returns {HTMLElement}\n */\nexport const loadingIconForLegacyJS = ({\n inline = defaultValue('inline'),\n color = defaultValue('color'),\n size = defaultValue('size'),\n classes = [],\n label = __('Loading'),\n} = {}) => {\n const mountEl = document.createElement('div');\n\n const vm = new Vue({\n el: mountEl,\n render(h) {\n return h(GlLoadingIcon, {\n class: classes,\n props: {\n inline,\n color,\n size,\n label,\n },\n });\n },\n });\n\n // Ensure it's rendered\n vm.$forceUpdate();\n\n const el = vm.$el.cloneNode(true);\n vm.$destroy();\n\n return el;\n};\n","import 'jquery';\nimport 'jquery.caret'; // required by at.js\nimport '@gitlab/at.js';\n","import { TYPENAME_USER } from '~/graphql_shared/constants';\nimport { convertToGraphQLId } from '~/graphql_shared/utils';\nimport createGqClient, { fetchPolicies } from '~/lib/graphql';\nimport axios from '~/lib/utils/axios_utils';\nimport reviewerRereviewMutation from '../queries/reviewer_rereview.mutation.graphql';\n\nexport const gqClient = createGqClient(\n {},\n {\n fetchPolicy: fetchPolicies.NO_CACHE,\n },\n);\n\nexport default class SidebarService {\n constructor(endpointMap) {\n if (!SidebarService.singleton) {\n this.endpoint = endpointMap.endpoint;\n this.moveIssueEndpoint = endpointMap.moveIssueEndpoint;\n this.projectsAutocompleteEndpoint = endpointMap.projectsAutocompleteEndpoint;\n this.fullPath = endpointMap.fullPath;\n this.iid = endpointMap.iid;\n this.issuableType = endpointMap.issuableType;\n\n SidebarService.singleton = this;\n }\n\n // eslint-disable-next-line no-constructor-return\n return SidebarService.singleton;\n }\n\n get() {\n return axios.get(this.endpoint);\n }\n\n update(key, data) {\n return axios.put(this.endpoint, { [key]: data });\n }\n\n getProjectsAutocomplete(searchTerm) {\n return axios.get(this.projectsAutocompleteEndpoint, {\n params: {\n search: searchTerm,\n },\n });\n }\n\n moveIssue(moveToProjectId) {\n return axios.post(this.moveIssueEndpoint, {\n move_to_project_id: moveToProjectId,\n });\n }\n\n requestReview(userId) {\n return gqClient.mutate({\n mutation: reviewerRereviewMutation,\n variables: {\n userId: convertToGraphQLId(TYPENAME_USER, `${userId}`),\n projectPath: this.fullPath,\n iid: this.iid.toString(),\n },\n });\n }\n}\n","import { createAlert } from '~/alert';\nimport { __ } from '~/locale';\nimport toast from '~/vue_shared/plugins/global_toast';\nimport { visitUrl } from '~/lib/utils/url_utility';\nimport Service from './services/sidebar_service';\nimport Store from './stores/sidebar_store';\n\nexport default class SidebarMediator {\n constructor(options) {\n if (!SidebarMediator.singleton) {\n this.initSingleton(options);\n }\n\n // eslint-disable-next-line no-constructor-return\n return SidebarMediator.singleton;\n }\n\n initSingleton(options) {\n this.store = new Store(options);\n this.service = new Service({\n endpoint: options.endpoint,\n moveIssueEndpoint: options.moveIssueEndpoint,\n projectsAutocompleteEndpoint: options.projectsAutocompleteEndpoint,\n fullPath: options.fullPath,\n iid: options.iid,\n issuableType: options.issuableType,\n });\n SidebarMediator.singleton = this;\n }\n\n assignYourself() {\n this.store.addAssignee(this.store.currentUser);\n }\n addSelfReview() {\n this.store.addReviewer(this.store.currentUser);\n }\n\n async saveAssignees(field) {\n const selected = this.store.assignees.map((u) => u.id);\n\n // If there are no ids, that means we have to unassign (which is id = 0)\n // And it only accepts an array, hence [0]\n const assignees = selected.length === 0 ? [0] : selected;\n const data = { assignee_ids: assignees };\n\n try {\n const res = await this.service.update(field, data);\n\n this.store.overwrite('assignees', res.data.assignees);\n\n if (res.data.reviewers) {\n this.store.overwrite('reviewers', res.data.reviewers);\n }\n\n return Promise.resolve(res);\n } catch (e) {\n return Promise.reject(e);\n }\n }\n\n async saveReviewers(field) {\n const selectedReviewers = this.store.reviewers;\n const selectedIds = selectedReviewers.map((u) => u.id);\n const suggestedSelectedIds = selectedReviewers.filter((u) => u.suggested).map((u) => u.id);\n\n // If there are no ids, that means we have to unassign (which is id = 0)\n // And it only accepts an array, hence [0]\n const reviewers = selectedIds.length === 0 ? [0] : selectedIds;\n const data = { reviewer_ids: reviewers, suggested_reviewer_ids: suggestedSelectedIds };\n\n try {\n const res = await this.service.update(field, data);\n\n this.store.overwrite('reviewers', res.data.reviewers);\n this.store.overwrite('assignees', res.data.assignees);\n\n return Promise.resolve(res);\n } catch (e) {\n return Promise.reject();\n }\n }\n\n requestReview({ userId, callback }) {\n return this.service\n .requestReview(userId)\n .then(() => {\n this.store.updateReviewer(userId, 'reviewed');\n toast(__('Requested review'));\n callback(userId, true);\n })\n .catch(() => callback(userId, false));\n }\n\n setMoveToProjectId(projectId) {\n this.store.setMoveToProjectId(projectId);\n }\n\n fetch() {\n return this.service\n .get()\n .then(({ data }) => {\n this.processFetchedData(data);\n })\n .catch(() =>\n createAlert({\n message: __('Error occurred when fetching sidebar data'),\n }),\n );\n }\n\n processFetchedData(data) {\n this.store.setAssigneeData(data);\n this.store.setReviewerData(data);\n this.store.setTimeTrackingData(data);\n }\n\n fetchAutocompleteProjects(searchTerm) {\n return this.service.getProjectsAutocomplete(searchTerm).then(({ data }) => {\n this.store.setAutocompleteProjects(data);\n return this.store.autocompleteProjects;\n });\n }\n\n moveIssue() {\n return this.service.moveIssue(this.store.moveToProjectId).then(({ data }) => {\n if (window.location.pathname !== data.web_url) {\n visitUrl(data.web_url);\n }\n });\n }\n}\n"],"sourceRoot":""}