diff options
Diffstat (limited to 'app')
42 files changed, 389 insertions, 457 deletions
diff --git a/app/assets/javascripts/design_management/components/design_notes/design_note.vue b/app/assets/javascripts/design_management/components/design_notes/design_note.vue index 54ffd986588..b247f17fd97 100644 --- a/app/assets/javascripts/design_management/components/design_notes/design_note.vue +++ b/app/assets/javascripts/design_management/components/design_notes/design_note.vue @@ -13,6 +13,7 @@ import SafeHtml from '~/vue_shared/directives/safe_html'; import { getIdFromGraphQLId, convertToGraphQLId } from '~/graphql_shared/utils'; import { TYPENAME_USER } from '~/graphql_shared/constants'; import { __ } from '~/locale'; +import { setUrlFragment } from '~/lib/utils/url_utility'; import TimelineEntryItem from '~/vue_shared/components/notes/timeline_entry_item.vue'; import TimeAgoTooltip from '~/vue_shared/components/time_ago_tooltip.vue'; import EmojiPicker from '~/emoji/components/picker.vue'; @@ -29,6 +30,7 @@ export default { editCommentLabel: __('Edit comment'), moreActionsLabel: __('More actions'), deleteCommentText: __('Delete comment'), + copyCommentLink: __('Copy link'), }, components: { DesignNoteAwardsList, @@ -133,6 +135,18 @@ export default { }, }, { + text: this.$options.i18n.copyCommentLink, + action: () => { + this.$toast.show(__('Link copied to clipboard.')); + }, + extraAttrs: { + 'data-clipboard-text': setUrlFragment( + window.location.href, + `note_${this.noteAnchorId}`, + ), + }, + }, + { text: this.$options.i18n.deleteCommentText, action: () => { this.$emit('delete-note', this.note); diff --git a/app/assets/javascripts/issues/show/components/header_actions.vue b/app/assets/javascripts/issues/show/components/header_actions.vue index 1c1b15e2026..c50b8009284 100644 --- a/app/assets/javascripts/issues/show/components/header_actions.vue +++ b/app/assets/javascripts/issues/show/components/header_actions.vue @@ -1,9 +1,9 @@ <script> import { GlButton, - GlDropdown, + GlDisclosureDropdown, GlDropdownDivider, - GlDropdownItem, + GlDisclosureDropdownItem, GlLink, GlModal, GlModalDirective, @@ -59,9 +59,9 @@ export default { components: { DeleteIssueModal, GlButton, - GlDropdown, + GlDisclosureDropdown, GlDropdownDivider, - GlDropdownItem, + GlDisclosureDropdownItem, GlLink, GlModal, AbuseCategorySelector, @@ -184,6 +184,18 @@ export default { showMovedSidebarOptions() { return this.isMrSidebarMoved && this.isUserSignedIn; }, + newIssueItem() { + return { + text: this.newIssueTypeText, + href: this.newIssuePath, + }; + }, + submitSpamItem() { + return { + text: __('Submit as spam'), + href: this.submitAsSpamPath, + }; + }, }, created() { eventHub.$on('toggle.issuable.state', this.toggleIssueState); @@ -197,6 +209,7 @@ export default { toggleIssueState() { if (!this.isClosed && this.getBlockedByIssues?.length) { this.$refs.blockedByIssuesModal.show(); + this.closeActionsDropdown(); return; } @@ -204,6 +217,7 @@ export default { }, toggleReportAbuseDrawer(isOpen) { this.isReportAbuseDrawerOpen = isOpen; + this.closeActionsDropdown(); }, invokeUpdateIssueMutation() { this.toggleStateButtonLoading(true); @@ -237,6 +251,7 @@ export default { .catch(() => createAlert({ message: __('Error occurred while updating the issue status') })) .finally(() => { this.toggleStateButtonLoading(false); + this.closeActionsDropdown(); }); }, promoteToEpic() { @@ -267,16 +282,24 @@ export default { .catch(() => createAlert({ message: this.$options.i18n.promoteErrorMessage })) .finally(() => { this.toggleStateButtonLoading(false); + this.closeActionsDropdown(); }); }, edit() { issuesEventHub.$emit('open.form'); + this.closeActionsDropdown(); }, copyReference() { toast(__('Reference copied')); + this.closeActionsDropdown(); }, copyEmailAddress() { toast(__('Email address copied')); + this.closeActionsDropdown(); + }, + closeActionsDropdown() { + this.$refs.issuableActionsDropdownMobile?.close(); + this.$refs.issuableActionsDropdownDesktop?.close(); }, }, TYPE_ISSUE, @@ -285,87 +308,90 @@ export default { <template> <div class="detail-page-header-actions gl-display-flex gl-align-self-start gl-sm-gap-3"> - <gl-dropdown - v-if="hasMobileDropdown" - class="gl-sm-display-none! w-100" - block - :text="dropdownText" - data-testid="mobile-dropdown" - :loading="isToggleStateButtonLoading" - > - <template v-if="showMovedSidebarOptions"> - <sidebar-subscriptions-widget - :iid="String(iid)" - :full-path="fullPath" - :issuable-type="$options.TYPE_ISSUE" - data-testid="notification-toggle" - /> + <div class="gl-sm-display-none! w-100"> + <gl-disclosure-dropdown + v-if="hasMobileDropdown" + ref="issuableActionsDropdownMobile" + toggle-class="gl-w-full" + block + :toggle-text="dropdownText" + :auto-close="false" + data-testid="mobile-dropdown" + :loading="isToggleStateButtonLoading" + placement="right" + > + <template v-if="showMovedSidebarOptions"> + <sidebar-subscriptions-widget + :iid="String(iid)" + :full-path="fullPath" + :issuable-type="$options.TYPE_ISSUE" + data-testid="notification-toggle" + /> - <gl-dropdown-divider /> - </template> + <gl-dropdown-divider /> + </template> - <template v-if="showLockIssueOption"> - <issuable-lock-form :is-editable="false" data-testid="lock-issue-toggle" /> - </template> + <template v-if="showLockIssueOption"> + <issuable-lock-form :is-editable="false" data-testid="lock-issue-toggle" /> + </template> - <gl-dropdown-item v-if="canUpdateIssue" @click="edit"> - {{ $options.i18n.edit }} - </gl-dropdown-item> - <gl-dropdown-item - v-if="showToggleIssueStateButton" - :data-testid="`mobile_${qaSelector}`" - @click="toggleIssueState" - > - {{ buttonText }} - </gl-dropdown-item> - <gl-dropdown-item v-if="canCreateIssue" :href="newIssuePath"> - {{ newIssueTypeText }} - </gl-dropdown-item> - <gl-dropdown-item v-if="canPromoteToEpic" @click="promoteToEpic"> - {{ __('Promote to epic') }} - </gl-dropdown-item> - <template v-if="isMrSidebarMoved"> - <gl-dropdown-item - :data-clipboard-text="issuableReference" - button-class="js-copy-reference" - data-testid="copy-reference" - @click="copyReference" - >{{ $options.i18n.copyReferenceText }}</gl-dropdown-item - > - <gl-dropdown-item - v-if="issuableEmailAddress && showMovedSidebarOptions" - :data-clipboard-text="issuableEmailAddress" - data-testid="copy-email" - @click="copyEmailAddress" - >{{ copyMailAddressText }}</gl-dropdown-item + <gl-disclosure-dropdown-item v-if="canUpdateIssue" @action="edit"> + <template #list-item>{{ $options.i18n.edit }}</template> + </gl-disclosure-dropdown-item> + <gl-disclosure-dropdown-item + v-if="showToggleIssueStateButton" + :data-testid="`mobile_${qaSelector}`" + @action="toggleIssueState" > - </template> - <gl-dropdown-item - v-if="canReportSpam" - :href="submitAsSpamPath" - data-method="post" - rel="nofollow" - > - {{ __('Submit as spam') }} - </gl-dropdown-item> - <template v-if="canDestroyIssue"> - <gl-dropdown-divider /> - <gl-dropdown-item - v-gl-modal="$options.deleteModalId" - variant="danger" - @click="track('click_dropdown')" + <template #list-item>{{ buttonText }}</template> + </gl-disclosure-dropdown-item> + <gl-disclosure-dropdown-item v-if="canCreateIssue" :item="newIssueItem" /> + <gl-disclosure-dropdown-item v-if="canPromoteToEpic" @action="promoteToEpic"> + <template #list-item>{{ __('Promote to epic') }}</template> + </gl-disclosure-dropdown-item> + <template v-if="isMrSidebarMoved"> + <gl-disclosure-dropdown-item + :data-clipboard-text="issuableReference" + button-class="js-copy-reference" + data-testid="copy-reference" + @action="copyReference" + ><template #list-item>{{ + $options.i18n.copyReferenceText + }}</template></gl-disclosure-dropdown-item + > + <gl-disclosure-dropdown-item + v-if="issuableEmailAddress && showMovedSidebarOptions" + :data-clipboard-text="issuableEmailAddress" + data-testid="copy-email" + @action="copyEmailAddress" + >{{ copyMailAddressText }}</gl-disclosure-dropdown-item + > + </template> + <gl-disclosure-dropdown-item + v-if="canReportSpam" + :item="submitSpamItem" + data-method="post" + rel="nofollow" + /> + <template v-if="canDestroyIssue"> + <gl-dropdown-divider /> + <gl-disclosure-dropdown-item + v-gl-modal="$options.deleteModalId" + variant="danger" + @action="track('click_dropdown')" + > + <template #list-item>{{ deleteButtonText }}</template> + </gl-disclosure-dropdown-item> + </template> + <gl-disclosure-dropdown-item + v-if="!isIssueAuthor && isUserSignedIn" + data-testid="report-abuse-item" + @action="toggleReportAbuseDrawer(true)" > - {{ deleteButtonText }} - </gl-dropdown-item> - </template> - <gl-dropdown-item - v-if="!isIssueAuthor && isUserSignedIn" - data-testid="report-abuse-item" - @click="toggleReportAbuseDrawer(true)" - > - {{ $options.i18n.reportAbuse }} - </gl-dropdown-item> - </gl-dropdown> + <template #list-item>{{ $options.i18n.reportAbuse }}</template> + </gl-disclosure-dropdown-item> + </gl-disclosure-dropdown> + </div> <gl-button v-if="canUpdateIssue" @@ -379,20 +405,22 @@ export default { {{ $options.i18n.edit }} </gl-button> - <gl-dropdown + <gl-disclosure-dropdown v-if="hasDesktopDropdown" id="new-actions-header-dropdown" + ref="issuableActionsDropdownDesktop" v-gl-tooltip.hover class="gl-display-none gl-sm-display-inline-flex!" icon="ellipsis_v" category="tertiary" - :text="dropdownText" - :text-sr-only="true" + placement="left" + :toggle-text="dropdownText" + text-sr-only :title="dropdownText" :aria-label="dropdownText" + :auto-close="false" data-testid="desktop-dropdown" no-caret - right > <template v-if="showMovedSidebarOptions && !glFeatures.notificationsTodosButtons"> <sidebar-subscriptions-widget @@ -401,73 +429,70 @@ export default { :issuable-type="$options.TYPE_ISSUE" data-testid="notification-toggle" /> - <gl-dropdown-divider /> </template> - <gl-dropdown-item + <gl-disclosure-dropdown-item v-if="showToggleIssueStateButton" data-testid="toggle-issue-state-button" - @click="toggleIssueState" + @action="toggleIssueState" > - {{ buttonText }} - </gl-dropdown-item> - <gl-dropdown-item v-if="canCreateIssue && isUserSignedIn" :href="newIssuePath"> - {{ newIssueTypeText }} - </gl-dropdown-item> - <gl-dropdown-item + <template #list-item>{{ buttonText }}</template> + </gl-disclosure-dropdown-item> + <gl-disclosure-dropdown-item v-if="canCreateIssue && isUserSignedIn" :item="newIssueItem" /> + <gl-disclosure-dropdown-item v-if="canPromoteToEpic" :disabled="isToggleStateButtonLoading" data-testid="promote-button" - @click="promoteToEpic" + @action="promoteToEpic" > - {{ __('Promote to epic') }} - </gl-dropdown-item> + <template #list-item>{{ __('Promote to epic') }}</template> + </gl-disclosure-dropdown-item> <template v-if="showLockIssueOption"> <issuable-lock-form :is-editable="false" data-testid="lock-issue-toggle" /> </template> <template v-if="isMrSidebarMoved"> - <gl-dropdown-item + <gl-disclosure-dropdown-item :data-clipboard-text="issuableReference" button-class="js-copy-reference" data-testid="copy-reference" - @click="copyReference" - >{{ $options.i18n.copyReferenceText }}</gl-dropdown-item + @action="copyReference" + ><template #list-item>{{ + $options.i18n.copyReferenceText + }}</template></gl-disclosure-dropdown-item > - <gl-dropdown-item + <gl-disclosure-dropdown-item v-if="issuableEmailAddress && showMovedSidebarOptions" :data-clipboard-text="issuableEmailAddress" data-testid="copy-email" - @click="copyEmailAddress" - >{{ copyMailAddressText }}</gl-dropdown-item + @action="copyEmailAddress" + ><template #list-item>{{ copyMailAddressText }}</template></gl-disclosure-dropdown-item > </template> - <gl-dropdown-divider v-if="canDestroyIssue || canReportSpam || !isIssueAuthor" /> - <gl-dropdown-item + <gl-dropdown-divider v-if="showToggleIssueStateButton || canDestroyIssue || canReportSpam" /> + <gl-disclosure-dropdown-item v-if="canReportSpam" - :href="submitAsSpamPath" + :item="submitSpamItem" data-method="post" rel="nofollow" - > - {{ __('Submit as spam') }} - </gl-dropdown-item> - <gl-dropdown-item + /> + <gl-disclosure-dropdown-item v-if="!isIssueAuthor && isUserSignedIn" data-testid="report-abuse-item" - @click="toggleReportAbuseDrawer(true)" + @action="toggleReportAbuseDrawer(true)" > - {{ $options.i18n.reportAbuse }} - </gl-dropdown-item> + <template #list-item>{{ $options.i18n.reportAbuse }}</template> + </gl-disclosure-dropdown-item> <template v-if="canDestroyIssue"> - <gl-dropdown-item + <gl-disclosure-dropdown-item v-gl-modal="$options.deleteModalId" variant="danger" data-testid="delete-issue-button" - @click="track('click_dropdown')" + @action="track('click_dropdown')" > - {{ deleteButtonText }} - </gl-dropdown-item> + <template #list-item>{{ deleteButtonText }}</template> + </gl-disclosure-dropdown-item> </template> - </gl-dropdown> + </gl-disclosure-dropdown> <gl-modal ref="blockedByIssuesModal" diff --git a/app/assets/javascripts/projects/settings/repository/branch_rules/app.vue b/app/assets/javascripts/projects/settings/repository/branch_rules/app.vue index 7753b850744..7d9ad83a1c6 100644 --- a/app/assets/javascripts/projects/settings/repository/branch_rules/app.vue +++ b/app/assets/javascripts/projects/settings/repository/branch_rules/app.vue @@ -76,7 +76,7 @@ export default { v-gl-modal="$options.modalId" size="small" class="gl-ml-3" - data-qa-selector="add_branch_rule_button" + data-testid="add-branch-rule-button" >{{ $options.i18n.addBranchRule }}</gl-button > </template> diff --git a/app/assets/javascripts/projects/settings/repository/branch_rules/components/branch_rule.vue b/app/assets/javascripts/projects/settings/repository/branch_rules/components/branch_rule.vue index f45a5b12db6..0a5fa288828 100644 --- a/app/assets/javascripts/projects/settings/repository/branch_rules/components/branch_rule.vue +++ b/app/assets/javascripts/projects/settings/repository/branch_rules/components/branch_rule.vue @@ -156,7 +156,7 @@ export default { <li> <div class="gl-display-flex gl-justify-content-space-between" - data-qa-selector="branch_content" + data-testid="branch-content" :data-qa-branch-name="name" > <div> @@ -178,7 +178,7 @@ export default { class="gl-align-self-start" category="tertiary" size="small" - data-qa-selector="details_button" + data-testid="details-button" :href="detailsPath" > {{ $options.i18n.detailsButtonLabel }}</gl-button diff --git a/app/assets/javascripts/sidebar/components/lock/issuable_lock_form.vue b/app/assets/javascripts/sidebar/components/lock/issuable_lock_form.vue index 165499696de..16235275a54 100644 --- a/app/assets/javascripts/sidebar/components/lock/issuable_lock_form.vue +++ b/app/assets/javascripts/sidebar/components/lock/issuable_lock_form.vue @@ -170,9 +170,14 @@ export default { </script> <template> - <li v-if="isMovedMrSidebar && isIssuable" class="gl-dropdown-item"> - <button type="button" class="dropdown-item" data-testid="issuable-lock" @click="toggleLocked"> - <span class="gl-dropdown-item-text-wrapper"> + <li v-if="isMovedMrSidebar && isIssuable" class="gl-new-dropdown-item"> + <button + type="button" + class="gl-new-dropdown-item-content" + data-testid="issuable-lock" + @click="toggleLocked" + > + <span class="gl-new-dropdown-item-text-wrapper"> <template v-if="isLoading"> <gl-loading-icon inline size="sm" /> {{ lockToggleInProgressText }} </template> diff --git a/app/assets/javascripts/sidebar/components/move/issuable_move_dropdown.vue b/app/assets/javascripts/sidebar/components/move/issuable_move_dropdown.vue index 34a4da946d6..ea8e0c4b950 100644 --- a/app/assets/javascripts/sidebar/components/move/issuable_move_dropdown.vue +++ b/app/assets/javascripts/sidebar/components/move/issuable_move_dropdown.vue @@ -1,26 +1,20 @@ <script> import { GlIcon, - GlLoadingIcon, - GlDropdown, - GlDropdownForm, - GlDropdownItem, - GlSearchBoxByType, GlButton, + GlCollapsibleListbox, GlTooltipDirective as GlTooltip, } from '@gitlab/ui'; - +import { debounce } from 'lodash'; +import { __ } from '~/locale'; +import { DEFAULT_DEBOUNCE_AND_THROTTLE_MS } from '~/lib/utils/constants'; import axios from '~/lib/utils/axios_utils'; export default { components: { GlIcon, - GlLoadingIcon, - GlDropdown, - GlDropdownForm, - GlDropdownItem, - GlSearchBoxByType, GlButton, + GlCollapsibleListbox, }, directives: { GlTooltip, @@ -51,82 +45,58 @@ export default { }, data() { return { - projectsListLoading: false, - projectsListLoadFailed: false, - searchKey: '', projects: [], - selectedProject: null, - projectItemClick: false, + projectsList: [], + selectedProjects: [], + noResultsText: '', + isSearching: false, }; }, - computed: { - hasNoSearchResults() { - return Boolean( - !this.projectsListLoading && - !this.projectsListLoadFailed && - this.searchKey && - !this.projects.length, - ); - }, - failedToLoadResults() { - return !this.projectsListLoading && this.projectsListLoadFailed; - }, - }, - watch: { - searchKey(value = '') { - this.fetchProjects(value); - }, + mounted() { + this.fetchProjects = debounce(this.fetchProjects, DEFAULT_DEBOUNCE_AND_THROTTLE_MS); }, methods: { - fetchProjects(search = '') { - this.projectsListLoading = true; - this.projectsListLoadFailed = false; - return axios - .get(this.projectsFetchPath, { + triggerSearch() { + this.$refs.dropdown.search(); + }, + async fetchProjects(search = '') { + this.isSearching = true; + + try { + const { data } = await axios.get(this.projectsFetchPath, { params: { search, }, - }) - .then(({ data }) => { - this.projects = data; - this.$refs.searchInput.focusInput(); - }) - .catch(() => { - this.projectsListLoadFailed = true; - }) - .finally(() => { - this.projectsListLoading = false; }); - }, - isSelectedProject(project) { - if (this.selectedProject) { - return this.selectedProject.id === project.id; - } - return false; - }, - /** - * This handler is to prevent dropdown - * from closing when an item is selected - * and emit an event only when dropdown closes. - */ - handleDropdownHide(e) { - if (this.projectItemClick) { - e.preventDefault(); - this.projectItemClick = false; - } else { - this.$emit('dropdown-close'); + this.projects = data; + this.projectsList = data.map((item) => ({ + value: item.id, + text: item.name_with_namespace, + })); + + if (!this.projectsList.length) { + this.noResultsText = __('No matching results'); + } + } catch (e) { + this.noResultsText = __('Failed to load projects'); + } finally { + this.isSearching = false; } }, - handleDropdownCloseClick() { - this.$refs.dropdown.hide(); - }, - handleProjectSelect(project) { - this.selectedProject = project.id === this.selectedProject?.id ? null : project; - this.projectItemClick = true; + handleProjectSelect(items) { + // hack: simulate a single select to prevent the dropdown from closing + // todo: switch back to single select when https://gitlab.com/gitlab-org/gitlab-ui/-/issues/2363 is fixed + this.selectedProjects = [items[items.length - 1]]; }, handleMoveClick() { - this.$refs.dropdown.hide(); - this.$emit('move-issuable', this.selectedProject); + this.$refs.dropdown.close(); + this.$emit( + 'move-issuable', + this.projects.find((item) => item.id === this.selectedProjects[0]), + ); + }, + handleDropdownHide() { + this.$emit('dropdown-close'); }, }, }; @@ -143,79 +113,45 @@ export default { > <gl-icon name="arrow-right" /> </div> - <gl-dropdown + <gl-collapsible-listbox ref="dropdown" + v-model="selectedProjects" + :items="projectsList" :block="true" - :disabled="moveInProgress || disabled" - class="hide-collapsed" - toggle-class="js-sidebar-dropdown-toggle" - @shown="fetchProjects" - @hide="handleDropdownHide" + :multiple="true" + :searchable="true" + :searching="isSearching" + :search-placeholder="__('Search project')" + :no-results-text="noResultsText" + :header-text="dropdownButtonTitle" + @hidden="handleDropdownHide" + @shown="triggerSearch" + @search="fetchProjects" + @select="handleProjectSelect" > - <template #button-content - ><gl-loading-icon v-if="moveInProgress" size="sm" class="gl-mr-3" />{{ - dropdownButtonTitle - }}</template - > - <gl-dropdown-form class="gl-pt-0"> - <div - data-testid="header" - class="gl-display-flex gl-pb-3 gl-border-1 gl-border-b-solid gl-border-gray-100" - > - <span class="gl-flex-grow-1 gl-text-center gl-font-weight-bold gl-py-1">{{ - dropdownHeaderTitle - }}</span> - <gl-button - variant="link" - icon="close" - class="gl-mr-2 gl-w-auto! gl-p-2!" - :aria-label="__('Close')" - @click.prevent="handleDropdownCloseClick" - /> - </div> - <gl-search-box-by-type - ref="searchInput" - v-model.trim="searchKey" - :placeholder="__('Search project')" - :debounce="300" - /> - <div data-testid="content" class="dropdown-content"> - <gl-loading-icon v-if="projectsListLoading" size="lg" class="gl-p-5" /> - <ul v-else> - <gl-dropdown-item - v-for="project in projects" - :key="project.id" - is-check-item - :is-checked="isSelectedProject(project)" - @click.stop.prevent="handleProjectSelect(project)" - >{{ project.name_with_namespace }}</gl-dropdown-item - > - </ul> - <div v-if="hasNoSearchResults" class="gl-text-center gl-p-3"> - {{ __('No matching results') }} - </div> - <div - v-if="failedToLoadResults" - data-testid="failed-load-results" - class="gl-text-center gl-p-3" - > - {{ __('Failed to load projects') }} - </div> - </div> - <div - data-testid="footer" - class="gl-pt-3 gl-px-3 gl-border-1 gl-border-t-solid gl-border-gray-100" + <template #toggle> + <gl-button + :loading="moveInProgress" + size="medium" + class="gl-w-full js-sidebar-dropdown-toggle hide-collapsed" + data-testid="dropdown-button" + :disabled="moveInProgress || disabled" + >{{ dropdownButtonTitle }}</gl-button > + </template> + <template #footer> + <div data-testid="footer" class="gl-p-3"> <gl-button category="primary" variant="confirm" - :disabled="!Boolean(selectedProject)" - class="gl-w-full issuable-move-button" + :disabled="!Boolean(selectedProjects.length)" + class="gl-w-full" + data-testid="dropdown-move-button" @click="handleMoveClick" >{{ __('Move') }}</gl-button > </div> - </gl-dropdown-form> - </gl-dropdown> + </template> + </gl-collapsible-listbox> </div> </template> diff --git a/app/assets/javascripts/work_items/components/work_item_milestone.vue b/app/assets/javascripts/work_items/components/work_item_milestone.vue index fe09105e173..9c6fa158169 100644 --- a/app/assets/javascripts/work_items/components/work_item_milestone.vue +++ b/app/assets/javascripts/work_items/components/work_item_milestone.vue @@ -1,13 +1,5 @@ <script> -import { - GlFormGroup, - GlDropdown, - GlDropdownItem, - GlDropdownDivider, - GlSkeletonLoader, - GlSearchBoxByType, - GlDropdownText, -} from '@gitlab/ui'; +import { GlCollapsibleListbox, GlFormGroup, GlSkeletonLoader } from '@gitlab/ui'; import { debounce } from 'lodash'; import * as Sentry from '~/sentry/sentry_browser_wrapper'; import Tracking from '~/tracking'; @@ -22,7 +14,8 @@ import { TRACKING_CATEGORY_SHOW, } from '../constants'; -const noMilestoneId = 'no-milestone-id'; +export const noMilestoneId = 'no-milestone-id'; +const noMilestoneItem = { text: s__('WorkItem|No milestone'), value: noMilestoneId }; export default { i18n: { @@ -37,13 +30,9 @@ export default { EXPIRED_TEXT: __('(expired)'), }, components: { + GlCollapsibleListbox, GlFormGroup, - GlDropdown, - GlDropdownItem, - GlDropdownDivider, GlSkeletonLoader, - GlSearchBoxByType, - GlDropdownText, }, mixins: [Tracking.mixin()], props: { @@ -74,11 +63,23 @@ export default { data() { return { localMilestone: this.workItemMilestone, + localMilestoneId: this.workItemMilestone?.id, searchTerm: '', shouldFetch: false, updateInProgress: false, - isFocused: false, milestones: [], + dropdownGroups: [ + { + text: this.$options.i18n.NO_MILESTONE, + textSrOnly: true, + options: [noMilestoneItem], + }, + { + text: __('Milestones'), + textSrOnly: true, + options: [], + }, + ], }; }, computed: { @@ -103,23 +104,29 @@ export default { isLoadingMilestones() { return this.$apollo.queries.milestones.loading; }, - isNoMilestone() { - return this.localMilestone?.id === noMilestoneId || !this.localMilestone?.id; + milestonesList() { + return ( + this.milestones.map(({ id, title, expired }) => { + return { + value: id, + text: title, + expired, + }; + }) ?? [] + ); }, - dropdownClasses() { - return { - 'gl-text-gray-500!': this.canUpdate && this.isNoMilestone, - 'is-not-focused': !this.isFocused, - 'gl-min-w-20': true, - }; + toggleClasses() { + const toggleClasses = ['gl-max-w-full']; + + if (this.localMilestoneId === noMilestoneId) { + toggleClasses.push('gl-text-gray-500!'); + } + return toggleClasses; }, }, watch: { - workItemMilestone: { - handler(newVal) { - this.localMilestone = newVal; - }, - deep: true, + milestones() { + this.dropdownGroups[1].options = this.milestonesList; }, }, created() { @@ -152,15 +159,11 @@ export default { this.localMilestone = milestone; }, onDropdownShown() { - this.$refs.search.focusInput(); this.shouldFetch = true; - this.isFocused = true; }, onDropdownHide() { - this.isFocused = false; this.searchTerm = ''; this.shouldFetch = false; - this.updateMilestone(); }, setSearchKey(value) { this.searchTerm = value; @@ -169,6 +172,9 @@ export default { return this.localMilestone?.id === milestone?.id; }, updateMilestone() { + this.localMilestone = + this.milestones.find(({ id }) => id === this.localMilestoneId) ?? noMilestoneItem; + if (this.workItemMilestone?.id === this.localMilestone?.id) { return; } @@ -182,8 +188,7 @@ export default { input: { id: this.workItemId, milestoneWidget: { - milestoneId: - this.localMilestone?.id === 'no-milestone-id' ? null : this.localMilestone?.id, + milestoneId: this.localMilestoneId === noMilestoneId ? null : this.localMilestoneId, }, }, }, @@ -222,49 +227,45 @@ export default { > {{ dropdownText }} </span> - <gl-dropdown + + <gl-collapsible-listbox v-else id="milestone-value" - class="gl-pl-0 gl-max-w-full work-item-field-value" - :toggle-class="dropdownClasses" - :text="dropdownText" + v-model="localMilestoneId" + :items="dropdownGroups" + category="tertiary" + data-testid="work-item-milestone-dropdown" + class="gl-max-w-full" + :toggle-text="dropdownText" :loading="updateInProgress" + :toggle-class="toggleClasses" + searchable + @select="updateMilestone" @shown="onDropdownShown" - @hide="onDropdownHide" + @hidden="onDropdownHide" + @search="debouncedSearchKeyUpdate" > - <template #header> - <gl-search-box-by-type ref="search" :value="searchTerm" @input="debouncedSearchKeyUpdate" /> + <template #list-item="{ item }"> + {{ item.text }} + <span v-if="item.expired">{{ $options.i18n.EXPIRED_TEXT }}</span> </template> - <gl-dropdown-item - data-testid="no-milestone" - is-check-item - :is-checked="isNoMilestone" - @click="handleMilestoneClick({ id: 'no-milestone-id' })" - > - {{ $options.i18n.NO_MILESTONE }} - </gl-dropdown-item> - <gl-dropdown-divider /> - <gl-dropdown-text v-if="isLoadingMilestones"> - <gl-skeleton-loader :height="90"> + <template #footer> + <gl-skeleton-loader v-if="isLoadingMilestones" :height="90"> <rect width="380" height="10" x="10" y="15" rx="4" /> <rect width="280" height="10" x="10" y="30" rx="4" /> <rect width="380" height="10" x="10" y="50" rx="4" /> <rect width="280" height="10" x="10" y="65" rx="4" /> </gl-skeleton-loader> - </gl-dropdown-text> - <template v-else-if="milestones.length"> - <gl-dropdown-item - v-for="milestone in milestones" - :key="milestone.id" - is-check-item - :is-checked="isMilestoneChecked(milestone)" - @click="handleMilestoneClick(milestone)" + + <div + v-else-if="!milestones.length" + aria-live="assertive" + class="gl-pl-7 gl-pr-5 gl-py-3 gl-font-base gl-text-gray-600" + data-testid="no-results-text" > - {{ milestone.title }} - <template v-if="milestone.expired">{{ $options.i18n.EXPIRED_TEXT }}</template> - </gl-dropdown-item> + {{ $options.i18n.NO_MATCHING_RESULTS }} + </div> </template> - <gl-dropdown-text v-else>{{ $options.i18n.NO_MATCHING_RESULTS }}</gl-dropdown-text> - </gl-dropdown> + </gl-collapsible-listbox> </gl-form-group> </template> diff --git a/app/assets/javascripts/work_items/components/work_item_parent.vue b/app/assets/javascripts/work_items/components/work_item_parent.vue index 23660f24783..74f0ec42905 100644 --- a/app/assets/javascripts/work_items/components/work_item_parent.vue +++ b/app/assets/javascripts/work_items/components/work_item_parent.vue @@ -61,7 +61,6 @@ export default { searchStarted: false, availableWorkItems: [], localSelectedItem: this.parent?.id, - isNotFocused: true, oldParent: this.parent, }; }, @@ -82,14 +81,6 @@ export default { workItems() { return this.availableWorkItems.map(({ id, title }) => ({ text: title, value: id })); }, - listboxCategory() { - return this.searchStarted ? 'secondary' : 'tertiary'; - }, - listboxClasses() { - return { - 'is-not-focused': this.isNotFocused && !this.searchStarted, - }; - }, parentType() { return SUPPORTED_PARENT_TYPE_MAP[this.workItemType]; }, @@ -184,19 +175,10 @@ export default { }, onListboxShown() { this.searchStarted = true; - this.isNotFocused = false; }, onListboxHide() { this.searchStarted = false; this.search = ''; - this.isNotFocused = true; - }, - setListboxFocused() { - // This is to match the caret behaviour of parent listbox - // to the other dropdown fields of work items - if (document.activeElement.parentElement.id !== 'work-item-parent-listbox-value') { - this.isNotFocused = true; - } }, }, }; @@ -219,30 +201,20 @@ export default { > {{ listboxText }} </span> - <div - v-else - :class="{ 'gl-max-w-max-content': !workItemsMvc2Enabled }" - @mouseover="isNotFocused = false" - @mouseleave="setListboxFocused" - @focusout="isNotFocused = true" - @focusin="isNotFocused = false" - > + <div v-else :class="{ 'gl-max-w-max-content': !workItemsMvc2Enabled }"> <gl-collapsible-listbox id="work-item-parent-listbox-value" class="gl-max-w-max-content" data-testid="work-item-parent-listbox" - block searchable - :no-caret="isNotFocused && !searchStarted" is-check-centered - :category="listboxCategory" + category="tertiary" :searching="isLoading" :header-text="$options.i18n.assignParentLabel" :no-results-text="$options.i18n.noMatchingResults" :loading="updateInProgress" :items="workItems" :toggle-text="listboxText" - :toggle-class="listboxClasses" :selected="localSelectedItem" :reset-button-label="$options.i18n.unAssign" @reset="unAssignParent" diff --git a/app/assets/stylesheets/page_bundles/issuable.scss b/app/assets/stylesheets/page_bundles/issuable.scss index 07614c5271a..d52cd45e575 100644 --- a/app/assets/stylesheets/page_bundles/issuable.scss +++ b/app/assets/stylesheets/page_bundles/issuable.scss @@ -114,29 +114,6 @@ } } -/* - * Following overrides are done to prevent - * legacy dropdown styles from influencing - * GitLab UI components used within GlDropdown - */ -.issuable-move-dropdown { - .b-dropdown-form { - @include gl-p-0; - } - - .gl-search-box-by-type button.gl-clear-icon-button:hover { - @include gl-bg-transparent; - - &:focus { - @include gl-focus($inset: true); - } - } - - .issuable-move-button:not(.disabled):hover { - @include gl-text-white; - } -} - .suggestion-footer { font-size: 12px; line-height: 15px; diff --git a/app/assets/stylesheets/page_bundles/work_items.scss b/app/assets/stylesheets/page_bundles/work_items.scss index f41a1f540e3..154803c7d88 100644 --- a/app/assets/stylesheets/page_bundles/work_items.scss +++ b/app/assets/stylesheets/page_bundles/work_items.scss @@ -67,6 +67,7 @@ $work-item-sticky-header-height: 52px; } } +//TODO: remove all the styles related to `gl-dropdown` when all `.work-item-dropdown`s are migrated .work-item-dropdown { // duplicate classname because we are fighting with gl-button styles .gl-dropdown-toggle.gl-dropdown-toggle { @@ -95,24 +96,25 @@ $work-item-sticky-header-height: 52px; // need to override the listbox styles to match with dropdown // till the dropdown are converted to listbox - .gl-new-dropdown-toggle { + .gl-new-dropdown-toggle.gl-new-dropdown-toggle { &:hover, &:focus { - background: none !important; box-shadow: $work-item-field-inset-shadow; background-color: $input-bg; - } - .is-not-focused { - &.gl-new-dropdown-button-text { - margin: 0 0.25rem; + .gl-dark & { + // $input-bg is overridden in dark mode but that does not + // work in page bundles currently, manually override here + background-color: var(--gray-50, $input-bg); } } - } - .gl-new-dropdown-toggle.is-not-focused { - .gl-new-dropdown-button-text { - margin: 0 0.25rem; + &:not(:hover, :focus) { + box-shadow: none; + + .gl-new-dropdown-chevron { + visibility: hidden; + } } } diff --git a/app/helpers/clusters_helper.rb b/app/helpers/clusters_helper.rb index 1989d6ab3d5..319cec6f140 100644 --- a/app/helpers/clusters_helper.rb +++ b/app/helpers/clusters_helper.rb @@ -38,7 +38,7 @@ module ClustersHelper environment_scope: cluster.environment_scope, base_domain: cluster.base_domain, auto_devops_help_path: help_page_path('topics/autodevops/index'), - external_endpoint_help_path: help_page_path('user/project/clusters/gitlab_managed_clusters.md', anchor: 'base-domain') + external_endpoint_help_path: help_page_path('user/project/clusters/gitlab_managed_clusters', anchor: 'base-domain') } end diff --git a/app/helpers/environments_helper.rb b/app/helpers/environments_helper.rb index 6d48dac5c6d..28bdd3e69b6 100644 --- a/app/helpers/environments_helper.rb +++ b/app/helpers/environments_helper.rb @@ -76,8 +76,8 @@ module EnvironmentsHelper def static_metrics_data { - 'documentation_path' => help_page_path('administration/monitoring/prometheus/index.md'), - 'add_dashboard_documentation_path' => help_page_path('operations/metrics/dashboards/index.md', anchor: 'add-a-new-dashboard-to-your-project'), + 'documentation_path' => help_page_path('administration/monitoring/prometheus/index'), + 'add_dashboard_documentation_path' => help_page_path('operations/metrics/dashboards/index', anchor: 'add-a-new-dashboard-to-your-project'), 'empty_getting_started_svg_path' => image_path('illustrations/monitoring/getting_started.svg'), 'empty_loading_svg_path' => image_path('illustrations/monitoring/loading.svg'), 'empty_no_data_svg_path' => image_path('illustrations/monitoring/no_data.svg'), diff --git a/app/helpers/ide_helper.rb b/app/helpers/ide_helper.rb index 2582d6fcc34..f2d393f1f77 100644 --- a/app/helpers/ide_helper.rb +++ b/app/helpers/ide_helper.rb @@ -5,7 +5,7 @@ module IdeHelper def ide_data(project:, fork_info:, params:) base_data = { 'use-new-web-ide' => use_new_web_ide?.to_s, - 'new-web-ide-help-page-path' => help_page_path('user/project/web_ide/index.md', anchor: 'vscode-reimplementation'), + 'new-web-ide-help-page-path' => help_page_path('user/project/web_ide/index', anchor: 'vscode-reimplementation'), 'sign-in-path' => new_session_path(current_user), 'user-preferences-path' => profile_preferences_path }.merge(use_new_web_ide? ? new_ide_data(project: project) : legacy_ide_data(project: project)) @@ -71,16 +71,16 @@ module IdeHelper 'switch-editor-svg-path': image_path('illustrations/rocket-launch-md.svg'), 'promotion-svg-path': image_path('illustrations/web-ide_promotion.svg'), 'ci-help-page-path' => help_page_path('ci/quick_start/index'), - 'web-ide-help-page-path' => help_page_path('user/project/web_ide/index.md'), + 'web-ide-help-page-path' => help_page_path('user/project/web_ide/index'), 'render-whitespace-in-code': current_user.render_whitespace_in_code.to_s, 'default-branch' => project && project.default_branch, 'project' => convert_to_project_entity_json(project), 'enable-environments-guidance' => enable_environments_guidance?(project).to_s, 'preview-markdown-path' => project && preview_markdown_path(project), 'web-terminal-svg-path' => image_path('illustrations/web-ide_promotion.svg'), - 'web-terminal-help-path' => help_page_path('user/project/web_ide/index.md', anchor: 'interactive-web-terminals-for-the-web-ide'), - 'web-terminal-config-help-path' => help_page_path('user/project/web_ide/index.md', anchor: 'web-ide-configuration-file'), - 'web-terminal-runners-help-path' => help_page_path('user/project/web_ide/index.md', anchor: 'runner-configuration') + 'web-terminal-help-path' => help_page_path('user/project/web_ide/index', anchor: 'interactive-web-terminals-for-the-web-ide'), + 'web-terminal-config-help-path' => help_page_path('user/project/web_ide/index', anchor: 'web-ide-configuration-file'), + 'web-terminal-runners-help-path' => help_page_path('user/project/web_ide/index', anchor: 'runner-configuration') } end diff --git a/app/helpers/merge_requests_helper.rb b/app/helpers/merge_requests_helper.rb index 7eaa0d41297..4cb6260c03e 100644 --- a/app/helpers/merge_requests_helper.rb +++ b/app/helpers/merge_requests_helper.rb @@ -187,7 +187,7 @@ module MergeRequestsHelper endpoint_batch: diffs_batch_project_json_merge_request_path(project, merge_request, 'json', params), endpoint_coverage: @coverage_path, endpoint_diff_for_path: diff_for_path_namespace_project_merge_request_path(format: 'json', id: merge_request.iid, namespace_id: project.namespace.to_param, project_id: project.path), - help_page_path: help_page_path('user/project/merge_requests/reviews/suggestions.md'), + help_page_path: help_page_path('user/project/merge_requests/reviews/suggestions'), current_user_data: @current_user_data, update_current_user_path: @update_current_user_path, project_path: project_path(merge_request.project), @@ -219,7 +219,7 @@ module MergeRequestsHelper source_project_full_path: merge_request.source_project&.full_path, source_project_default_url: merge_request.source_project && default_url_to_repo(merge_request.source_project), target_branch: merge_request.target_branch, - reviewing_docs_path: help_page_path('user/project/merge_requests/reviews/index.md', anchor: "checkout-merge-requests-locally-through-the-head-ref") + reviewing_docs_path: help_page_path('user/project/merge_requests/reviews/index', anchor: "checkout-merge-requests-locally-through-the-head-ref") } end diff --git a/app/helpers/operations_helper.rb b/app/helpers/operations_helper.rb index 8528f5f04f7..d8b3cc3b36e 100644 --- a/app/helpers/operations_helper.rb +++ b/app/helpers/operations_helper.rb @@ -21,7 +21,7 @@ module OperationsHelper 'prometheus_authorization_key' => @project.alerting_setting&.token, 'prometheus_api_url' => prometheus_integration.api_url, 'prometheus_url' => notify_project_prometheus_alerts_url(@project, format: :json), - 'alerts_setup_url' => help_page_path('operations/incident_management/integrations.md', anchor: 'configuration'), + 'alerts_setup_url' => help_page_path('operations/incident_management/integrations', anchor: 'configuration'), 'alerts_usage_url' => project_alert_management_index_path(@project), 'disabled' => disabled.to_s, 'project_path' => @project.full_path, diff --git a/app/helpers/preferences_helper.rb b/app/helpers/preferences_helper.rb index 656d35e927d..d5bbd3a081d 100644 --- a/app/helpers/preferences_helper.rb +++ b/app/helpers/preferences_helper.rb @@ -122,8 +122,8 @@ module PreferencesHelper def integration_views [].tap do |views| - views << { name: 'gitpod', message: gitpod_enable_description, message_url: gitpod_url_placeholder, help_link: help_page_path('integration/gitpod.md') } if Gitlab::CurrentSettings.gitpod_enabled - views << { name: 'sourcegraph', message: sourcegraph_url_message, message_url: Gitlab::CurrentSettings.sourcegraph_url, help_link: help_page_path('user/profile/preferences.md', anchor: 'sourcegraph') } if Gitlab::Sourcegraph.feature_available? && Gitlab::CurrentSettings.sourcegraph_enabled + views << { name: 'gitpod', message: gitpod_enable_description, message_url: gitpod_url_placeholder, help_link: help_page_path('integration/gitpod') } if Gitlab::CurrentSettings.gitpod_enabled + views << { name: 'sourcegraph', message: sourcegraph_url_message, message_url: Gitlab::CurrentSettings.sourcegraph_url, help_link: help_page_path('user/profile/preferences', anchor: 'sourcegraph') } if Gitlab::Sourcegraph.feature_available? && Gitlab::CurrentSettings.sourcegraph_enabled end end diff --git a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb index 7dc0f63924f..c3b9a0a421b 100644 --- a/app/helpers/projects_helper.rb +++ b/app/helpers/projects_helper.rb @@ -187,7 +187,7 @@ module ProjectsHelper end def link_to_autodeploy_doc - link_to _('About auto deploy'), help_page_path('topics/autodevops/stages.md', anchor: 'auto-deploy'), target: '_blank', rel: 'noopener' + link_to _('About auto deploy'), help_page_path('topics/autodevops/stages', anchor: 'auto-deploy'), target: '_blank', rel: 'noopener' end def autodeploy_flash_notice(branch_name) diff --git a/app/presenters/clusters/cluster_presenter.rb b/app/presenters/clusters/cluster_presenter.rb index ec1dc96c2e3..5765d08dfb3 100644 --- a/app/presenters/clusters/cluster_presenter.rb +++ b/app/presenters/clusters/cluster_presenter.rb @@ -61,7 +61,7 @@ module Clusters 'clusters-path': clusterable.index_path, 'dashboard-endpoint': clusterable.metrics_dashboard_path(cluster), 'documentation-path': help_page_path('user/infrastructure/clusters/manage/clusters_health'), - 'add-dashboard-documentation-path': help_page_path('operations/metrics/dashboards/index.md', anchor: 'add-a-new-dashboard-to-your-project'), + 'add-dashboard-documentation-path': help_page_path('operations/metrics/dashboards/index', anchor: 'add-a-new-dashboard-to-your-project'), 'empty-getting-started-svg-path': image_path('illustrations/monitoring/getting_started.svg'), 'empty-loading-svg-path': image_path('illustrations/monitoring/loading.svg'), 'empty-no-data-svg-path': image_path('illustrations/monitoring/no_data.svg'), diff --git a/app/serializers/issue_entity.rb b/app/serializers/issue_entity.rb index 657af578c7f..9a55e761bf0 100644 --- a/app/serializers/issue_entity.rb +++ b/app/serializers/issue_entity.rb @@ -73,11 +73,11 @@ class IssueEntity < IssuableEntity end expose :confidential_issues_docs_path, if: -> (issue) { issue.confidential? } do |issue| - help_page_path('user/project/issues/confidential_issues.md') + help_page_path('user/project/issues/confidential_issues') end expose :locked_discussion_docs_path, if: -> (issue) { issue.discussion_locked? } do |issue| - help_page_path('user/discussions/index.md', anchor: 'prevent-comments-by-locking-an-issue') + help_page_path('user/discussions/index', anchor: 'prevent-comments-by-locking-an-issue') end expose :is_project_archived do |issue| @@ -85,7 +85,7 @@ class IssueEntity < IssuableEntity end expose :archived_project_docs_path, if: -> (issue) { issue.project.archived? } do |issue| - help_page_path('user/project/settings/index.md', anchor: 'archive-a-project') + help_page_path('user/project/settings/index', anchor: 'archive-a-project') end expose :issue_email_participants do |issue| diff --git a/app/serializers/merge_request_noteable_entity.rb b/app/serializers/merge_request_noteable_entity.rb index 44f51f43998..04b801e29ad 100644 --- a/app/serializers/merge_request_noteable_entity.rb +++ b/app/serializers/merge_request_noteable_entity.rb @@ -52,7 +52,7 @@ class MergeRequestNoteableEntity < IssuableEntity end expose :locked_discussion_docs_path, if: -> (merge_request) { merge_request.discussion_locked? } do |merge_request| - help_page_path('user/discussions/index.md', anchor: 'prevent-comments-by-locking-an-issue') + help_page_path('user/discussions/index', anchor: 'prevent-comments-by-locking-an-issue') end expose :is_project_archived do |merge_request| @@ -62,7 +62,7 @@ class MergeRequestNoteableEntity < IssuableEntity expose :project_id expose :archived_project_docs_path, if: -> (merge_request) { merge_request.project.archived? } do |merge_request| - help_page_path('user/project/settings/index.md', anchor: 'archive-a-project') + help_page_path('user/project/settings/index', anchor: 'archive-a-project') end private diff --git a/app/serializers/merge_request_widget_entity.rb b/app/serializers/merge_request_widget_entity.rb index cf984207ad1..95072ae815e 100644 --- a/app/serializers/merge_request_widget_entity.rb +++ b/app/serializers/merge_request_widget_entity.rb @@ -48,15 +48,15 @@ class MergeRequestWidgetEntity < Grape::Entity end expose :conflicts_docs_path do |merge_request| - help_page_path('user/project/merge_requests/conflicts.md') + help_page_path('user/project/merge_requests/conflicts') end expose :reviewing_and_managing_merge_requests_docs_path do |merge_request| - help_page_path('user/project/merge_requests/reviews/index.md', anchor: "checkout-merge-requests-locally-through-the-head-ref") + help_page_path('user/project/merge_requests/reviews/index', anchor: "checkout-merge-requests-locally-through-the-head-ref") end expose :merge_request_pipelines_docs_path do |merge_request| - help_page_path('ci/pipelines/merge_request_pipelines.md') + help_page_path('ci/pipelines/merge_request_pipelines') end expose :ci_environments_status_path do |merge_request| @@ -129,7 +129,7 @@ class MergeRequestWidgetEntity < Grape::Entity end expose :security_reports_docs_path do |merge_request| - help_page_path('user/application_security/index.md', anchor: 'view-security-scan-information-in-merge-requests') + help_page_path('user/application_security/index', anchor: 'view-security-scan-information-in-merge-requests') end expose :enabled_reports do |merge_request| diff --git a/app/services/projects/update_service.rb b/app/services/projects/update_service.rb index e5e39247dbf..2d81bbdaa3b 100644 --- a/app/services/projects/update_service.rb +++ b/app/services/projects/update_service.rb @@ -92,7 +92,7 @@ module Projects end def ambiguous_head_documentation_link - url = Rails.application.routes.url_helpers.help_page_path('user/project/repository/branches/index.md', anchor: 'error-ambiguous-head-branch-exists') + url = Rails.application.routes.url_helpers.help_page_path('user/project/repository/branches/index', anchor: 'error-ambiguous-head-branch-exists') format('<a href="%{url}" target="_blank" rel="noopener noreferrer">', url: url) end diff --git a/app/views/admin/application_settings/_email.html.haml b/app/views/admin/application_settings/_email.html.haml index 2d45391a839..a9bc8ab9d32 100644 --- a/app/views/admin/application_settings/_email.html.haml +++ b/app/views/admin/application_settings/_email.html.haml @@ -10,7 +10,7 @@ = f.label :commit_email_hostname, _('Custom hostname (for private commit emails)'), class: 'label-bold' = f.text_field :commit_email_hostname, class: 'form-control gl-form-input' .form-text.text-muted - - commit_email_hostname_docs_link = link_to _('Learn more'), help_page_path('administration/settings/email.md', anchor: 'custom-hostname-for-private-commit-emails'), target: '_blank', rel: 'noopener noreferrer' + - commit_email_hostname_docs_link = link_to _('Learn more'), help_page_path('administration/settings/email', anchor: 'custom-hostname-for-private-commit-emails'), target: '_blank', rel: 'noopener noreferrer' = _("Hostname used in private commit emails. %{learn_more}").html_safe % { learn_more: commit_email_hostname_docs_link } = render_if_exists 'admin/application_settings/email_additional_text_setting', form: f diff --git a/app/views/admin/application_settings/_error_tracking.html.haml b/app/views/admin/application_settings/_error_tracking.html.haml index 6754dd99bbc..ab4ed9917a0 100644 --- a/app/views/admin/application_settings/_error_tracking.html.haml +++ b/app/views/admin/application_settings/_error_tracking.html.haml @@ -7,8 +7,8 @@ = render Pajamas::ButtonComponent.new(button_options: { class: 'js-settings-toggle' }) do = expanded ? _('Collapse') : _('Expand') %p.gl-text-secondary - = _('Allows projects to track errors using an Opstrace integration.').html_safe % { link: help_page_path('operations/error_tracking.md') } - = link_to _('Learn more.'), help_page_path('operations/error_tracking.md'), target: '_blank', rel: 'noopener noreferrer' + = _('Allows projects to track errors using an Opstrace integration.').html_safe % { link: help_page_path('operations/error_tracking') } + = link_to _('Learn more.'), help_page_path('operations/error_tracking'), target: '_blank', rel: 'noopener noreferrer' .settings-content diff --git a/app/views/admin/application_settings/_floc.html.haml b/app/views/admin/application_settings/_floc.html.haml index e1576e84e66..27df417d225 100644 --- a/app/views/admin/application_settings/_floc.html.haml +++ b/app/views/admin/application_settings/_floc.html.haml @@ -7,7 +7,7 @@ = render Pajamas::ButtonComponent.new(button_options: { class: 'js-settings-toggle' }) do = expanded ? _('Collapse') : _('Expand') %p.gl-text-secondary - - floc_link_url = help_page_path('administration/settings/floc.md') + - floc_link_url = help_page_path('administration/settings/floc') - floc_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: floc_link_url } = html_escape(s_('FloC|Configure whether you want to participate in FLoC. %{floc_link_start}What is FLoC?%{floc_link_end}')) % { floc_link_start: floc_link_start, floc_link_end: '</a>'.html_safe } diff --git a/app/views/admin/application_settings/_gitlab_shell_operation_limits.html.haml b/app/views/admin/application_settings/_gitlab_shell_operation_limits.html.haml index 64549b97bd1..8529accff8e 100644 --- a/app/views/admin/application_settings/_gitlab_shell_operation_limits.html.haml +++ b/app/views/admin/application_settings/_gitlab_shell_operation_limits.html.haml @@ -6,7 +6,7 @@ = expanded_by_default? ? _('Collapse') : _('Expand') %p.gl-text-secondary = s_('ShellOperations|Limit the number of Git operations a user can perform per minute, per repository.') - = link_to _('Learn more.'), help_page_path('administration/settings/rate_limits_on_git_ssh_operations.md'), target: '_blank', rel: 'noopener noreferrer' + = link_to _('Learn more.'), help_page_path('administration/settings/rate_limits_on_git_ssh_operations'), target: '_blank', rel: 'noopener noreferrer' .settings-content = gitlab_ui_form_for @application_setting, url: network_admin_application_settings_path(anchor: 'js-gitlab-shell-operation-limits-settings'), html: { class: 'fieldset-form' } do |f| = form_errors(@application_setting) diff --git a/app/views/admin/application_settings/_localization.html.haml b/app/views/admin/application_settings/_localization.html.haml index 25038e6f221..e1eb0ba84eb 100644 --- a/app/views/admin/application_settings/_localization.html.haml +++ b/app/views/admin/application_settings/_localization.html.haml @@ -7,7 +7,7 @@ = f.select :first_day_of_week, first_day_of_week_choices, {}, class: 'form-control' .form-text.text-muted = _('Default first day of the week in calendars and date pickers.') - = link_to _('Learn more.'), help_page_path('administration/settings/localization.md', anchor: 'change-the-default-first-day-of-the-week'), target: '_blank', rel: 'noopener noreferrer' + = link_to _('Learn more.'), help_page_path('administration/settings/localization', anchor: 'change-the-default-first-day-of-the-week'), target: '_blank', rel: 'noopener noreferrer' .form-group = f.label :time_tracking, _('Time tracking'), class: 'label-bold' diff --git a/app/views/admin/application_settings/_projects_api_limits.html.haml b/app/views/admin/application_settings/_projects_api_limits.html.haml index dde8ab07958..d84df972c6d 100644 --- a/app/views/admin/application_settings/_projects_api_limits.html.haml +++ b/app/views/admin/application_settings/_projects_api_limits.html.haml @@ -6,7 +6,7 @@ = expanded_by_default? ? _('Collapse') : _('Expand') %p.gl-text-secondary = _('Set the per-IP address rate limit applicable to unauthenticated requests for getting a list of projects via the API.') - = link_to _('Learn more.'), help_page_path('administration/settings/rate_limit_on_projects_api.md'), target: '_blank', rel: 'noopener noreferrer' + = link_to _('Learn more.'), help_page_path('administration/settings/rate_limit_on_projects_api'), target: '_blank', rel: 'noopener noreferrer' .settings-content = gitlab_ui_form_for @application_setting, url: network_admin_application_settings_path(anchor: 'js-projects-api-limits-settings'), html: { class: 'fieldset-form' } do |f| = form_errors(@application_setting) diff --git a/app/views/admin/application_settings/_runner_registrars_form.html.haml b/app/views/admin/application_settings/_runner_registrars_form.html.haml index b112c273aad..36bab2f6650 100644 --- a/app/views/admin/application_settings/_runner_registrars_form.html.haml +++ b/app/views/admin/application_settings/_runner_registrars_form.html.haml @@ -7,7 +7,7 @@ = s_('Runners|Runner version management') %span.form-text.gl-mb-3.gl-mt-0 - help_text = s_('Runners|Official runner version data is periodically fetched from GitLab.com to determine whether the runners need upgrades.') - - learn_more_link = link_to _('Learn more.'), help_page_path('ci/runners/runners_scope.md', anchor: 'determine-which-runners-need-to-be-upgraded'), target: '_blank', rel: 'noopener noreferrer' + - learn_more_link = link_to _('Learn more.'), help_page_path('ci/runners/runners_scope', anchor: 'determine-which-runners-need-to-be-upgraded'), target: '_blank', rel: 'noopener noreferrer' = f.gitlab_ui_checkbox_component :update_runner_versions_enabled, s_('Runners|Fetch GitLab Runner release version data from GitLab.com'), help_text: '%{help_text} %{learn_more_link}'.html_safe % { help_text: help_text, learn_more_link: learn_more_link } diff --git a/app/views/admin/application_settings/general.html.haml b/app/views/admin/application_settings/general.html.haml index dad0bf08bb0..d84fbe94f65 100644 --- a/app/views/admin/application_settings/general.html.haml +++ b/app/views/admin/application_settings/general.html.haml @@ -66,7 +66,7 @@ = expanded_by_default? ? _('Collapse') : _('Expand') %p.gl-text-secondary = _('Set sign-in restrictions for all users.') - = link_to _('Learn more.'), help_page_path('administration/settings/sign_in_restrictions.md'), target: '_blank', rel: 'noopener noreferrer' + = link_to _('Learn more.'), help_page_path('administration/settings/sign_in_restrictions'), target: '_blank', rel: 'noopener noreferrer' .settings-content = render 'signin' @@ -78,7 +78,7 @@ = expanded_by_default? ? _('Collapse') : _('Expand') %p.gl-text-secondary = _('Add a Terms of Service agreement and Privacy Policy for users of this GitLab instance.') - = link_to _('Learn more.'), help_page_path('administration/settings/terms.md'), target: '_blank', rel: 'noopener noreferrer' + = link_to _('Learn more.'), help_page_path('administration/settings/terms'), target: '_blank', rel: 'noopener noreferrer' .settings-content = render 'terms' @@ -95,7 +95,7 @@ = expanded_by_default? ? _('Collapse') : _('Expand') %p.gl-text-secondary = _('Set the maximum session time for a web terminal.') - = link_to _('How do I use a web terminal?'), help_page_path('ci/environments/index.md', anchor: 'web-terminals-deprecated'), target: '_blank', rel: 'noopener noreferrer' + = link_to _('How do I use a web terminal?'), help_page_path('ci/environments/index', anchor: 'web-terminals-deprecated'), target: '_blank', rel: 'noopener noreferrer' .settings-content = render 'terminal' diff --git a/app/views/admin/application_settings/network.html.haml b/app/views/admin/application_settings/network.html.haml index fb22df9d066..ae5f7a5cec3 100644 --- a/app/views/admin/application_settings/network.html.haml +++ b/app/views/admin/application_settings/network.html.haml @@ -22,7 +22,7 @@ = expanded_by_default? ? _('Collapse') : _('Expand') %p.gl-text-secondary = _('Set limits for web and API requests.') - = link_to _('Learn more.'), help_page_path('administration/settings/user_and_ip_rate_limits.md'), target: '_blank', rel: 'noopener noreferrer' + = link_to _('Learn more.'), help_page_path('administration/settings/user_and_ip_rate_limits'), target: '_blank', rel: 'noopener noreferrer' .settings-content = render 'ip_limits' @@ -34,7 +34,7 @@ = expanded_by_default? ? _('Collapse') : _('Expand') %p.gl-text-secondary = _('Set rate limits for package registry API requests that supersede the general user and IP rate limits.') - = link_to _('Learn more.'), help_page_path('administration/settings/package_registry_rate_limits.md'), target: '_blank', rel: 'noopener noreferrer' + = link_to _('Learn more.'), help_page_path('administration/settings/package_registry_rate_limits'), target: '_blank', rel: 'noopener noreferrer' .settings-content = render partial: 'network_rate_limits', locals: { anchor: 'js-packages-limits-settings', setting_fragment: 'packages_api' } @@ -68,7 +68,7 @@ = expanded_by_default? ? _('Collapse') : _('Expand') %p.gl-text-secondary = _('Configure specific limits for deprecated API requests that supersede the general user and IP rate limits.') - = link_to _('Which API requests are affected?'), help_page_path('administration/settings/deprecated_api_rate_limits.md'), target: '_blank', rel: 'noopener noreferrer' + = link_to _('Which API requests are affected?'), help_page_path('administration/settings/deprecated_api_rate_limits'), target: '_blank', rel: 'noopener noreferrer' .settings-content = render partial: 'network_rate_limits', locals: { anchor: 'js-deprecated-limits-settings', setting_fragment: 'deprecated_api' } @@ -80,7 +80,7 @@ = expanded_by_default? ? _('Collapse') : _('Expand') %p.gl-text-secondary = _('Configure specific limits for Git LFS requests that supersede the general user and IP rate limits.') - = link_to _('Learn more.'), help_page_path('administration/settings/git_lfs_rate_limits.md'), target: '_blank', rel: 'noopener noreferrer' + = link_to _('Learn more.'), help_page_path('administration/settings/git_lfs_rate_limits'), target: '_blank', rel: 'noopener noreferrer' .settings-content = render 'git_lfs_limits' @@ -96,7 +96,7 @@ = expanded_by_default? ? _('Collapse') : _('Expand') %p.gl-text-secondary = s_('OutboundRequests|Allow requests to the local network from hooks and integrations.') - = link_to _('Learn more.'), help_page_path('security/webhooks.md'), target: '_blank', rel: 'noopener noreferrer' + = link_to _('Learn more.'), help_page_path('security/webhooks'), target: '_blank', rel: 'noopener noreferrer' .settings-content = render 'outbound' @@ -108,7 +108,7 @@ = expanded_by_default? ? _('Collapse') : _('Expand') %p.gl-text-secondary = _('Rate limit access to specified paths.') - = link_to _('Learn more.'), help_page_path('administration/settings/protected_paths.md'), target: '_blank', rel: 'noopener noreferrer' + = link_to _('Learn more.'), help_page_path('administration/settings/protected_paths'), target: '_blank', rel: 'noopener noreferrer' .settings-content = render 'protected_paths' @@ -121,7 +121,7 @@ = expanded_by_default? ? _('Collapse') : _('Expand') %p.gl-text-secondary = _('Limit the number of issues and epics per minute a user can create through web and API requests.') - = link_to _('Learn more.'), help_page_path('administration/settings/rate_limit_on_issues_creation.md'), target: '_blank', rel: 'noopener noreferrer' + = link_to _('Learn more.'), help_page_path('administration/settings/rate_limit_on_issues_creation'), target: '_blank', rel: 'noopener noreferrer' .settings-content = render 'issue_limits' @@ -133,7 +133,7 @@ = expanded_by_default? ? _('Collapse') : _('Expand') %p.gl-text-secondary = _('Set the per-user rate limit for notes created by web or API requests.') - = link_to _('Learn more.'), help_page_path('administration/settings/rate_limit_on_notes_creation.md'), target: '_blank', rel: 'noopener noreferrer' + = link_to _('Learn more.'), help_page_path('administration/settings/rate_limit_on_notes_creation'), target: '_blank', rel: 'noopener noreferrer' .settings-content = render 'note_limits' @@ -145,7 +145,7 @@ = expanded_by_default? ? _('Collapse') : _('Expand') %p.gl-text-secondary = _('Set the per-user rate limit for getting a user by ID via the API.') - = link_to _('Learn more.'), help_page_path('administration/settings/rate_limit_on_users_api.md'), target: '_blank', rel: 'noopener noreferrer' + = link_to _('Learn more.'), help_page_path('administration/settings/rate_limit_on_users_api'), target: '_blank', rel: 'noopener noreferrer' .settings-content = render 'users_api_limits' @@ -159,7 +159,7 @@ = expanded_by_default? ? _('Collapse') : _('Expand') %p.gl-text-secondary = _('Set per-user rate limits for imports and exports of projects and groups.') - = link_to _('Learn more.'), help_page_path('administration/settings/import_export_rate_limits.md'), target: '_blank', rel: 'noopener noreferrer' + = link_to _('Learn more.'), help_page_path('administration/settings/import_export_rate_limits'), target: '_blank', rel: 'noopener noreferrer' .settings-content = render 'import_export_limits' @@ -171,7 +171,7 @@ = expanded_by_default? ? _('Collapse') : _('Expand') %p.gl-text-secondary = _('Limit the number of pipeline creation requests per minute. This limit includes pipelines created through the UI, the API, and by background processing.') - = link_to _('Learn more.'), help_page_path('administration/settings/rate_limit_on_pipelines_creation.md'), target: '_blank', rel: 'noopener noreferrer' + = link_to _('Learn more.'), help_page_path('administration/settings/rate_limit_on_pipelines_creation'), target: '_blank', rel: 'noopener noreferrer' .settings-content = render 'pipeline_limits' diff --git a/app/views/admin/application_settings/preferences.html.haml b/app/views/admin/application_settings/preferences.html.haml index 4590b6f4586..3543e1d918a 100644 --- a/app/views/admin/application_settings/preferences.html.haml +++ b/app/views/admin/application_settings/preferences.html.haml @@ -33,7 +33,7 @@ = expanded_by_default? ? _('Collapse') : _('Expand') %p.gl-text-secondary = _('Additional text for the sign-in and Help page.') - = link_to _('Learn more.'), help_page_path('administration/settings/help_page.md'), target: '_blank', rel: 'noopener noreferrer' + = link_to _('Learn more.'), help_page_path('administration/settings/help_page'), target: '_blank', rel: 'noopener noreferrer' .settings-content = render 'help_page' @@ -56,7 +56,7 @@ = expanded_by_default? ? _('Collapse') : _('Expand') %p.gl-text-secondary = _('Adjust how frequently the GitLab UI polls for updates.') - = link_to _('Learn more.'), help_page_path('administration/polling.md'), target: '_blank', rel: 'noopener noreferrer' + = link_to _('Learn more.'), help_page_path('administration/polling'), target: '_blank', rel: 'noopener noreferrer' .settings-content = render 'realtime' @@ -69,7 +69,7 @@ %p.gl-text-secondary = _('Configure Gitaly timeouts.') %span - = link_to _('Learn more.'), help_page_path('administration/settings/gitaly_timeouts.md'), target: '_blank', rel: 'noopener noreferrer' + = link_to _('Learn more.'), help_page_path('administration/settings/gitaly_timeouts'), target: '_blank', rel: 'noopener noreferrer' .settings-content = render 'gitaly' @@ -93,7 +93,7 @@ %p.gl-text-secondary = _('Limit the size of Sidekiq jobs stored in Redis.') %span - = link_to _('Learn more.'), help_page_path('administration/settings/sidekiq_job_limits.md'), target: '_blank', rel: 'noopener noreferrer' + = link_to _('Learn more.'), help_page_path('administration/settings/sidekiq_job_limits'), target: '_blank', rel: 'noopener noreferrer' .settings-content = render 'sidekiq_job_limits' @@ -106,6 +106,6 @@ = expanded_by_default? ? _('Collapse') : _('Expand') %p.gl-text-secondary = s_('TerraformLimits|Limits for Terraform features') - = link_to s_('TerraformLimits|Learn more about Terraform limits.'), help_page_path('administration/settings/terraform_limits.md'), target: '_blank', rel: 'noopener noreferrer' + = link_to s_('TerraformLimits|Learn more about Terraform limits.'), help_page_path('administration/settings/terraform_limits'), target: '_blank', rel: 'noopener noreferrer' .settings-content = render 'terraform_limits' diff --git a/app/views/admin/application_settings/reporting.html.haml b/app/views/admin/application_settings/reporting.html.haml index 91fabb505c2..49279c4584b 100644 --- a/app/views/admin/application_settings/reporting.html.haml +++ b/app/views/admin/application_settings/reporting.html.haml @@ -25,7 +25,7 @@ = expanded_by_default? ? _('Collapse') : _('Expand') %p.gl-text-secondary = _('Receive notification of abuse reports by email.') - = link_to _('Learn more.'), help_page_path('administration/review_abuse_reports.md'), target: '_blank', rel: 'noopener noreferrer' + = link_to _('Learn more.'), help_page_path('administration/review_abuse_reports'), target: '_blank', rel: 'noopener noreferrer' .settings-content = render 'abuse' diff --git a/app/views/admin/application_settings/repository.html.haml b/app/views/admin/application_settings/repository.html.haml index a46275ff9d5..0b31da36804 100644 --- a/app/views/admin/application_settings/repository.html.haml +++ b/app/views/admin/application_settings/repository.html.haml @@ -22,7 +22,7 @@ = expanded_by_default? ? 'Collapse' : 'Expand' %p.gl-text-secondary = _('Configure repository mirroring.') - = link_to _('Learn more.'), help_page_path('user/project/repository/mirror/index.md'), target: '_blank', rel: 'noopener noreferrer' + = link_to _('Learn more.'), help_page_path('user/project/repository/mirror/index'), target: '_blank', rel: 'noopener noreferrer' .settings-content = render partial: 'repository_mirrors_form' @@ -34,7 +34,7 @@ = expanded_by_default? ? _('Collapse') : _('Expand') %p.gl-text-secondary = _('Configure repository storage.') - = link_to _('Learn more.'), help_page_path('administration/repository_storage_paths.md'), target: '_blank', rel: 'noopener noreferrer' + = link_to _('Learn more.'), help_page_path('administration/repository_storage_paths'), target: '_blank', rel: 'noopener noreferrer' .settings-content = render 'repository_storage' @@ -45,9 +45,9 @@ = render Pajamas::ButtonComponent.new(button_options: { class: 'js-settings-toggle' }) do = expanded_by_default? ? _('Collapse') : _('Expand') %p.gl-text-secondary - - repository_checks_link_url = help_page_path('administration/repository_checks.md') + - repository_checks_link_url = help_page_path('administration/repository_checks') - repository_checks_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: repository_checks_link_url } - - housekeeping_link_url = help_page_path('administration/housekeeping.md') + - housekeeping_link_url = help_page_path('administration/housekeeping') - housekeeping_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: housekeeping_link_url } = html_escape(s_('Configure %{repository_checks_link_start}repository checks%{link_end} and %{housekeeping_link_start}housekeeping%{link_end} on repositories.')) % { repository_checks_link_start: repository_checks_link_start, housekeeping_link_start: housekeeping_link_start, link_end: '</a>'.html_safe } .settings-content @@ -61,6 +61,6 @@ = expanded_by_default? ? _('Collapse') : _('Expand') %p.gl-text-secondary = _('Serve repository static objects (for example, archives and blobs) from external storage.') - = link_to _('Learn more.'), help_page_path('administration/static_objects_external_storage.md'), target: '_blank', rel: 'noopener noreferrer' + = link_to _('Learn more.'), help_page_path('administration/static_objects_external_storage'), target: '_blank', rel: 'noopener noreferrer' .settings-content = render 'repository_static_objects' diff --git a/app/views/admin/dev_ops_report/_score.html.haml b/app/views/admin/dev_ops_report/_score.html.haml index a504563ad91..59cb30e8447 100644 --- a/app/views/admin/dev_ops_report/_score.html.haml +++ b/app/views/admin/dev_ops_report/_score.html.haml @@ -1,6 +1,6 @@ - service_ping_enabled = Gitlab::CurrentSettings.usage_ping_enabled - if !service_ping_enabled - #js-devops-service-ping-disabled{ data: { is_admin: current_user&.admin.to_s, empty_state_svg_path: image_path('illustrations/convdev/convdev_no_index.svg'), enable_service_ping_path: metrics_and_profiling_admin_application_settings_path(anchor: 'js-usage-settings'), docs_link: help_page_path('development/internal_analytics/service_ping/index.md') } } + #js-devops-service-ping-disabled{ data: { is_admin: current_user&.admin.to_s, empty_state_svg_path: image_path('illustrations/convdev/convdev_no_index.svg'), enable_service_ping_path: metrics_and_profiling_admin_application_settings_path(anchor: 'js-usage-settings'), docs_link: help_page_path('development/internal_analytics/service_ping/index') } } - else #js-devops-score{ data: { devops_score_metrics: devops_score_metrics(@metric).to_json, no_data_image_path: image_path('dev_ops_report_no_data.svg'), devops_score_intro_image_path: image_path('dev_ops_report_overview.svg') } } diff --git a/app/views/groups/_import_group_from_another_instance_panel.html.haml b/app/views/groups/_import_group_from_another_instance_panel.html.haml index 38dc850553b..6c5a27e68c4 100644 --- a/app/views/groups/_import_group_from_another_instance_panel.html.haml +++ b/app/views/groups/_import_group_from_another_instance_panel.html.haml @@ -24,7 +24,7 @@ = render Pajamas::AlertComponent.new(dismissible: false, variant: :warning) do |c| - c.with_body do - - docs_link = link_to('', help_page_path('user/group/import/index.md', anchor: 'migrated-group-items'), target: '_blank', rel: 'noopener noreferrer') + - docs_link = link_to('', help_page_path('user/group/import/index', anchor: 'migrated-group-items'), target: '_blank', rel: 'noopener noreferrer') = safe_format(s_('GroupsNew|Not all group items are migrated. %{docs_link_start}What items are migrated%{docs_link_end}?'), tag_pair(docs_link, :docs_link_start, :docs_link_end)) %p.gl-mt-3 diff --git a/app/views/profiles/gpg_keys/index.html.haml b/app/views/profiles/gpg_keys/index.html.haml index 982199d3d6f..031869cc60e 100644 --- a/app/views/profiles/gpg_keys/index.html.haml +++ b/app/views/profiles/gpg_keys/index.html.haml @@ -28,7 +28,7 @@ %h4.gl-mt-0 = _('Add a GPG key') %p - - help_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: help_page_path('user/project/repository/signed_commits/gpg.md') } + - help_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: help_page_path('user/project/repository/signed_commits/gpg') } = _('Add a GPG key for secure access to GitLab. %{help_link_start}Learn more%{help_link_end}.').html_safe % {help_link_start: help_link_start, help_link_end: '</a>'.html_safe } = render 'form' diff --git a/app/views/profiles/keys/_key.html.haml b/app/views/profiles/keys/_key.html.haml index 7ba42274f88..f80cd8cddc5 100644 --- a/app/views/profiles/keys/_key.html.haml +++ b/app/views/profiles/keys/_key.html.haml @@ -25,7 +25,7 @@ -# TODO: Remove this conditional when https://gitlab.com/gitlab-org/gitlab/-/issues/324764 is resolved. - if Feature.enabled?(:disable_ssh_key_used_tracking) = _('Unavailable') - = link_to sprite_icon('question-o'), help_page_path('user/ssh.md', anchor: 'view-your-accounts-ssh-keys') + = link_to sprite_icon('question-o'), help_page_path('user/ssh', anchor: 'view-your-accounts-ssh-keys') - else = key.last_used_at ? time_ago_with_tooltip(key.last_used_at) : _('Never') diff --git a/app/views/profiles/keys/index.html.haml b/app/views/profiles/keys/index.html.haml index 0cd41788a53..8477d87a587 100644 --- a/app/views/profiles/keys/index.html.haml +++ b/app/views/profiles/keys/index.html.haml @@ -30,7 +30,7 @@ %h4.gl-mt-0 = _('Add an SSH key') %p - - help_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: help_page_path('user/ssh.md') } + - help_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: help_page_path('user/ssh') } = _('Add an SSH key for secure access to GitLab. %{help_link_start}Learn more%{help_link_end}.').html_safe % {help_link_start: help_link_start, help_link_end: '</a>'.html_safe } = render 'form' diff --git a/app/views/profiles/personal_access_tokens/index.html.haml b/app/views/profiles/personal_access_tokens/index.html.haml index c12f6907afb..0457561b283 100644 --- a/app/views/profiles/personal_access_tokens/index.html.haml +++ b/app/views/profiles/personal_access_tokens/index.html.haml @@ -35,7 +35,7 @@ path: profile_personal_access_tokens_path, token: @personal_access_token, scopes: @scopes, - help_path: help_page_path('user/profile/personal_access_tokens.md', anchor: 'personal-access-token-scopes') + help_path: help_page_path('user/profile/personal_access_tokens', anchor: 'personal-access-token-scopes') #js-access-token-table-app{ data: { access_token_type: type, access_token_type_plural: type_plural, initial_active_access_tokens: @active_access_tokens.to_json } } diff --git a/app/views/projects/blob/_pipeline_tour_success.html.haml b/app/views/projects/blob/_pipeline_tour_success.html.haml index f645d23aa1c..be2654c9b86 100644 --- a/app/views/projects/blob/_pipeline_tour_success.html.haml +++ b/app/views/projects/blob/_pipeline_tour_success.html.haml @@ -1,6 +1,6 @@ .js-success-pipeline-modal{ data: { 'commit-cookie': suggest_pipeline_commit_cookie_name, 'go-to-pipelines-path': project_pipelines_path(@project), 'project-merge-requests-path': project_merge_requests_path(@project), - 'example-link': help_page_path('ci/examples/index.md'), + 'example-link': help_page_path('ci/examples/index'), 'code-quality-link': help_page_path('ci/testing/code_quality'), 'human-access': @project.team.human_max_access(current_user&.id) } } diff --git a/app/views/projects/commit/_signature_badge.html.haml b/app/views/projects/commit/_signature_badge.html.haml index 6aefc2eaa8b..d4a775728e3 100644 --- a/app/views/projects/commit/_signature_badge.html.haml +++ b/app/views/projects/commit/_signature_badge.html.haml @@ -17,17 +17,17 @@ - if signature.x509? = render partial: "projects/commit/x509/certificate_details", locals: { signature: signature } - = link_to(_('Learn more about X.509 signed commits'), help_page_path('user/project/repository/signed_commits/x509.md'), class: 'gl-link gl-display-block') + = link_to(_('Learn more about X.509 signed commits'), help_page_path('user/project/repository/signed_commits/x509'), class: 'gl-link gl-display-block') - elsif signature.ssh? = _('SSH key fingerprint:') %span.gl-font-monospace= signature.key_fingerprint_sha256 || _('Unknown') - = link_to(_('Learn about signing commits with SSH keys.'), help_page_path('user/project/repository/signed_commits/ssh.md'), class: 'gl-link gl-display-block gl-mt-3') + = link_to(_('Learn about signing commits with SSH keys.'), help_page_path('user/project/repository/signed_commits/ssh'), class: 'gl-link gl-display-block gl-mt-3') - else = _('GPG Key ID:') %span.gl-font-monospace= signature.gpg_key_primary_keyid - = link_to(_('Learn about signing commits'), help_page_path('user/project/repository/signed_commits/index.md'), class: 'gl-link gl-display-block gl-mt-3') + = link_to(_('Learn about signing commits'), help_page_path('user/project/repository/signed_commits/index'), class: 'gl-link gl-display-block gl-mt-3') %a.signature-badge.gl-display-inline-block.gl-ml-4{ role: 'button', tabindex: 0, data: { toggle: 'popover', html: 'true', placement: 'top', title: title, content: content } } = gl_badge_tag label, variant: variant |