Add latest changes from gitlab-org/gitlab@master
This commit is contained in:
		
							parent
							
								
									829c7542e8
								
							
						
					
					
						commit
						11c2f3b08c
					
				|  | @ -1 +1 @@ | |||
| c7695bd902060be80b3499ffd2bd9e86d89c4f4f | ||||
| e6c3f8fa60ab4b5af91b5f893876c130d97fe37c | ||||
|  |  | |||
|  | @ -129,7 +129,7 @@ export default { | |||
|       }; | ||||
|     }, | ||||
|     listItemsCount() { | ||||
|       return this.isEpicBoard ? this.list.epicsCount : this.boardList?.issuesCount; | ||||
|       return this.isEpicBoard ? this.list.metadata.epicsCount : this.boardList?.issuesCount; | ||||
|     }, | ||||
|     paginatedIssueText() { | ||||
|       return sprintf(__('Showing %{pageSize} of %{total} %{issuableType}'), { | ||||
|  |  | |||
|  | @ -90,6 +90,9 @@ export default { | |||
|     listType() { | ||||
|       return this.list.listType; | ||||
|     }, | ||||
|     itemsCount() { | ||||
|       return this.isEpicBoard ? this.list.metadata.epicsCount : this.boardList?.issuesCount; | ||||
|     }, | ||||
|     listAssignee() { | ||||
|       return this.list?.assignee?.username || ''; | ||||
|     }, | ||||
|  | @ -452,7 +455,7 @@ export default { | |||
|             <gl-icon class="gl-mr-2" :name="countIcon" :size="14" /> | ||||
|             <item-count | ||||
|               v-if="!isLoading" | ||||
|               :items-size="isEpicBoard ? list.epicsCount : boardList.issuesCount" | ||||
|               :items-size="itemsCount" | ||||
|               :max-issue-count="list.maxIssueCount" | ||||
|             /> | ||||
|           </span> | ||||
|  |  | |||
|  | @ -9,10 +9,9 @@ import * as mutationTypes from './mutation_types'; | |||
| const updateListItemsCount = ({ state, listId, value }) => { | ||||
|   const list = state.boardLists[listId]; | ||||
|   if (state.issuableType === TYPE_EPIC) { | ||||
|     Vue.set(state.boardLists, listId, { ...list, epicsCount: list.epicsCount + value }); | ||||
|   } else { | ||||
|     Vue.set(state.boardLists, listId, { ...list }); | ||||
|     list.metadata.epicsCount += value; | ||||
|   } | ||||
|   Vue.set(state.boardLists, listId, { ...list }); | ||||
| }; | ||||
| 
 | ||||
| export const removeItemFromList = ({ state, listId, itemId, reordering = false }) => { | ||||
|  |  | |||
|  | @ -1,5 +1,5 @@ | |||
| <script> | ||||
| import scheduleSvg from '@gitlab/svgs/dist/illustrations/schedule-md.svg'; | ||||
| import scheduleSvg from '@gitlab/svgs/dist/illustrations/schedule-md.svg?raw'; | ||||
| import { GlEmptyState, GlLink, GlSprintf } from '@gitlab/ui'; | ||||
| import { helpPagePath } from '~/helpers/help_page_helper'; | ||||
| import { s__ } from '~/locale'; | ||||
|  |  | |||
|  | @ -1,4 +1,4 @@ | |||
| import emptySvg from '@gitlab/svgs/dist/illustrations/security-dashboard-empty-state.svg'; | ||||
| import emptySvg from '@gitlab/svgs/dist/illustrations/security-dashboard-empty-state.svg?raw'; | ||||
| import { GlEmptyState } from '@gitlab/ui'; | ||||
| import * as Sentry from '@sentry/browser'; | ||||
| import { __ } from '~/locale'; | ||||
|  |  | |||
|  | @ -8,7 +8,7 @@ | |||
|  * - Button Actions. | ||||
|  * [Mockup](https://gitlab.com/gitlab-org/gitlab-foss/uploads/2f655655c0eadf655d0ae7467b53002a/environments__deploy-graphic.png) | ||||
|  */ | ||||
| import deployBoardSvg from '@gitlab/svgs/dist/illustrations/deploy-boards.svg'; | ||||
| import deployBoardSvg from '@gitlab/svgs/dist/illustrations/deploy-boards.svg?raw'; | ||||
| import { | ||||
|   GlIcon, | ||||
|   GlLoadingIcon, | ||||
|  |  | |||
|  | @ -1,5 +1,5 @@ | |||
| <script> | ||||
| import clusterPopover from '@gitlab/svgs/dist/illustrations/cluster_popover.svg'; | ||||
| import clusterPopover from '@gitlab/svgs/dist/illustrations/cluster_popover.svg?raw'; | ||||
| import { GlPopover, GlSprintf, GlLink, GlButton } from '@gitlab/ui'; | ||||
| import SafeHtml from '~/vue_shared/directives/safe_html'; | ||||
| import { __ } from '~/locale'; | ||||
|  |  | |||
|  | @ -1,5 +1,5 @@ | |||
| <script> | ||||
| import chartEmptyStateIllustration from '@gitlab/svgs/dist/illustrations/chart-empty-state.svg'; | ||||
| import chartEmptyStateIllustration from '@gitlab/svgs/dist/illustrations/chart-empty-state.svg?raw'; | ||||
| import SafeHtml from '~/vue_shared/directives/safe_html'; | ||||
| import { chartHeight } from '../../constants'; | ||||
| 
 | ||||
|  |  | |||
|  | @ -1,6 +1,6 @@ | |||
| <script> | ||||
| import importGroupIllustration from '@gitlab/svgs/dist/illustrations/group-import.svg'; | ||||
| import newGroupIllustration from '@gitlab/svgs/dist/illustrations/group-new.svg'; | ||||
| import importGroupIllustration from '@gitlab/svgs/dist/illustrations/group-import.svg?raw'; | ||||
| import newGroupIllustration from '@gitlab/svgs/dist/illustrations/group-new.svg?raw'; | ||||
| 
 | ||||
| import { s__ } from '~/locale'; | ||||
| import NewNamespacePage from '~/vue_shared/new_namespace/new_namespace_page.vue'; | ||||
|  |  | |||
|  | @ -1,8 +1,8 @@ | |||
| <script> | ||||
| import createFromTemplateIllustration from '@gitlab/svgs/dist/illustrations/project-create-from-template-sm.svg'; | ||||
| import blankProjectIllustration from '@gitlab/svgs/dist/illustrations/project-create-new-sm.svg'; | ||||
| import importProjectIllustration from '@gitlab/svgs/dist/illustrations/project-import-sm.svg'; | ||||
| import ciCdProjectIllustration from '@gitlab/svgs/dist/illustrations/project-run-CICD-pipelines-sm.svg'; | ||||
| import createFromTemplateIllustration from '@gitlab/svgs/dist/illustrations/project-create-from-template-sm.svg?raw'; | ||||
| import blankProjectIllustration from '@gitlab/svgs/dist/illustrations/project-create-new-sm.svg?raw'; | ||||
| import importProjectIllustration from '@gitlab/svgs/dist/illustrations/project-import-sm.svg?raw'; | ||||
| import ciCdProjectIllustration from '@gitlab/svgs/dist/illustrations/project-run-CICD-pipelines-sm.svg?raw'; | ||||
| import SafeHtml from '~/vue_shared/directives/safe_html'; | ||||
| import { s__ } from '~/locale'; | ||||
| import NewNamespacePage from '~/vue_shared/new_namespace/new_namespace_page.vue'; | ||||
|  |  | |||
|  | @ -15,8 +15,8 @@ import { | |||
|   REPORT_TYPE_LICENSE_COMPLIANCE, | ||||
| } from '~/vue_shared/security_reports/constants'; | ||||
| 
 | ||||
| import kontraLogo from 'images/vulnerability/kontra-logo.svg'; | ||||
| import scwLogo from 'images/vulnerability/scw-logo.svg'; | ||||
| import kontraLogo from 'images/vulnerability/kontra-logo.svg?raw'; | ||||
| import scwLogo from 'images/vulnerability/scw-logo.svg?raw'; | ||||
| import configureSastMutation from '../graphql/configure_sast.mutation.graphql'; | ||||
| import configureSastIacMutation from '../graphql/configure_iac.mutation.graphql'; | ||||
| import configureSecretDetectionMutation from '../graphql/configure_secret_detection.mutation.graphql'; | ||||
|  |  | |||
|  | @ -1,5 +1,6 @@ | |||
| <script> | ||||
| import { GlCollapse } from '@gitlab/ui'; | ||||
| import { isCollapsed, toggleSuperSidebarCollapsed } from '../super_sidebar_collapsed_state_manager'; | ||||
| import UserBar from './user_bar.vue'; | ||||
| import SidebarPortalTarget from './sidebar_portal_target.vue'; | ||||
| import ContextSwitcherToggle from './context_switcher_toggle.vue'; | ||||
|  | @ -26,6 +27,7 @@ export default { | |||
|   data() { | ||||
|     return { | ||||
|       contextSwitcherOpened: false, | ||||
|       isCollapased: isCollapsed(), | ||||
|     }; | ||||
|   }, | ||||
|   computed: { | ||||
|  | @ -33,34 +35,45 @@ export default { | |||
|       return this.sidebarData.current_menu_items || []; | ||||
|     }, | ||||
|   }, | ||||
|   methods: { | ||||
|     collapseSidebar() { | ||||
|       toggleSuperSidebarCollapsed(true, false); | ||||
|     }, | ||||
|   }, | ||||
| }; | ||||
| </script> | ||||
| 
 | ||||
| <template> | ||||
|   <aside | ||||
|     id="super-sidebar" | ||||
|     class="super-sidebar gl-display-flex gl-flex-direction-column" | ||||
|     data-testid="super-sidebar" | ||||
|     data-qa-selector="navbar" | ||||
|   > | ||||
|     <user-bar :sidebar-data="sidebarData" /> | ||||
|     <div class="gl-display-flex gl-flex-direction-column gl-flex-grow-1 gl-overflow-hidden"> | ||||
|       <div class="gl-flex-grow-1 gl-overflow-auto"> | ||||
|         <context-switcher-toggle | ||||
|           :context="sidebarData.current_context_header" | ||||
|           :expanded="contextSwitcherOpened" | ||||
|         /> | ||||
|         <gl-collapse id="context-switcher" v-model="contextSwitcherOpened"> | ||||
|           <context-switcher /> | ||||
|         </gl-collapse> | ||||
|         <gl-collapse :visible="!contextSwitcherOpened"> | ||||
|           <sidebar-menu :items="menuItems" /> | ||||
|           <sidebar-portal-target /> | ||||
|         </gl-collapse> | ||||
|   <div> | ||||
|     <div class="super-sidebar-overlay" @click="collapseSidebar"></div> | ||||
|     <aside | ||||
|       id="super-sidebar" | ||||
|       :aria-hidden="String(isCollapased)" | ||||
|       class="super-sidebar" | ||||
|       data-testid="super-sidebar" | ||||
|       data-qa-selector="navbar" | ||||
|       :inert="isCollapased" | ||||
|       tabindex="-1" | ||||
|     > | ||||
|       <user-bar :sidebar-data="sidebarData" /> | ||||
|       <div class="gl-display-flex gl-flex-direction-column gl-flex-grow-1 gl-overflow-hidden"> | ||||
|         <div class="gl-flex-grow-1 gl-overflow-auto"> | ||||
|           <context-switcher-toggle | ||||
|             :context="sidebarData.current_context_header" | ||||
|             :expanded="contextSwitcherOpened" | ||||
|           /> | ||||
|           <gl-collapse id="context-switcher" v-model="contextSwitcherOpened"> | ||||
|             <context-switcher /> | ||||
|           </gl-collapse> | ||||
|           <gl-collapse :visible="!contextSwitcherOpened"> | ||||
|             <sidebar-menu :items="menuItems" /> | ||||
|             <sidebar-portal-target /> | ||||
|           </gl-collapse> | ||||
|         </div> | ||||
|         <div class="gl-p-3"> | ||||
|           <help-center :sidebar-data="sidebarData" /> | ||||
|         </div> | ||||
|       </div> | ||||
|       <div class="gl-p-3"> | ||||
|         <help-center :sidebar-data="sidebarData" /> | ||||
|       </div> | ||||
|     </div> | ||||
|   </aside> | ||||
|     </aside> | ||||
|   </div> | ||||
| </template> | ||||
|  |  | |||
|  | @ -2,7 +2,7 @@ | |||
| import { GlBadge, GlButton, GlTooltipDirective } from '@gitlab/ui'; | ||||
| import { __ } from '~/locale'; | ||||
| import SafeHtml from '~/vue_shared/directives/safe_html'; | ||||
| import logo from '../../../../views/shared/_logo.svg'; | ||||
| import logo from '../../../../views/shared/_logo.svg?raw'; | ||||
| import { toggleSuperSidebarCollapsed } from '../super_sidebar_collapsed_state_manager'; | ||||
| import CreateMenu from './create_menu.vue'; | ||||
| import Counter from './counter.vue'; | ||||
|  | @ -93,7 +93,6 @@ export default { | |||
|         <counter | ||||
|           v-gl-tooltip:super-sidebar.hover.bottom="$options.i18n.mergeRequests" | ||||
|           class="gl-w-full" | ||||
|           tabindex="-1" | ||||
|           icon="merge-request-open" | ||||
|           :count="sidebarData.total_merge_requests_count" | ||||
|           :label="$options.i18n.mergeRequests" | ||||
|  |  | |||
|  | @ -7,9 +7,10 @@ export const SIDEBAR_COLLAPSED_COOKIE = 'super_sidebar_collapsed'; | |||
| export const SIDEBAR_COLLAPSED_COOKIE_EXPIRATION = 365 * 10; | ||||
| 
 | ||||
| export const findPage = () => document.querySelector('.page-with-super-sidebar'); | ||||
| export const findToggle = () => document.querySelector('.js-super-sidebar-toggle'); | ||||
| export const findSidebar = () => document.querySelector('.super-sidebar'); | ||||
| export const findToggles = () => document.querySelectorAll('.js-super-sidebar-toggle'); | ||||
| 
 | ||||
| const isCollapsed = () => findPage().classList.contains(SIDEBAR_COLLAPSED_CLASS); | ||||
| export const isCollapsed = () => findPage().classList.contains(SIDEBAR_COLLAPSED_CLASS); | ||||
| 
 | ||||
| // See documentation: https://design.gitlab.com/patterns/navigation#left-sidebar
 | ||||
| // NOTE: at 1200px nav sidebar should not overlap the content
 | ||||
|  | @ -19,6 +20,12 @@ export const isDesktopBreakpoint = () => bp.windowWidth() >= breakpoints.xl; | |||
| export const getCollapsedCookie = () => getCookie(SIDEBAR_COLLAPSED_COOKIE) === 'true'; | ||||
| 
 | ||||
| export const toggleSuperSidebarCollapsed = (collapsed, saveCookie) => { | ||||
|   const sidebar = findSidebar(); | ||||
|   sidebar.ariaHidden = collapsed; | ||||
|   sidebar.inert = collapsed; | ||||
| 
 | ||||
|   if (!collapsed) sidebar.focus(); | ||||
| 
 | ||||
|   findPage().classList.toggle(SIDEBAR_COLLAPSED_CLASS, collapsed); | ||||
| 
 | ||||
|   if (saveCookie && isDesktopBreakpoint()) { | ||||
|  | @ -34,12 +41,11 @@ export const initSuperSidebarCollapsedState = () => { | |||
| }; | ||||
| 
 | ||||
| export const bindSuperSidebarCollapsedEvents = () => { | ||||
|   if (findToggle()) { | ||||
|     findToggle().addEventListener('click', () => { | ||||
|       const value = !isCollapsed(); | ||||
|       toggleSuperSidebarCollapsed(value, true); | ||||
|   findToggles().forEach((elem) => { | ||||
|     elem.addEventListener('click', () => { | ||||
|       toggleSuperSidebarCollapsed(!isCollapsed(), true); | ||||
|     }); | ||||
|   } | ||||
|   }); | ||||
| 
 | ||||
|   window.addEventListener('resize', debounce(initSuperSidebarCollapsedState, 100)); | ||||
| }; | ||||
|  |  | |||
|  | @ -1,6 +1,6 @@ | |||
| <script> | ||||
| import { GlButton, GlSprintf, GlTooltipDirective } from '@gitlab/ui'; | ||||
| import gitlabLogo from '@gitlab/svgs/dist/illustrations/gitlab_logo.svg'; | ||||
| import gitlabLogo from '@gitlab/svgs/dist/illustrations/gitlab_logo.svg?raw'; | ||||
| import SafeHtml from '~/vue_shared/directives/safe_html'; | ||||
| import { s__, __ } from '~/locale'; | ||||
| import UserCalloutDismisser from '~/vue_shared/components/user_callout_dismisser.vue'; | ||||
|  |  | |||
|  | @ -11,7 +11,7 @@ import { | |||
|   GlTooltipDirective, | ||||
|   GlEmptyState, | ||||
| } from '@gitlab/ui'; | ||||
| import noAccessSvg from '@gitlab/svgs/dist/illustrations/analytics/no-access.svg'; | ||||
| import noAccessSvg from '@gitlab/svgs/dist/illustrations/analytics/no-access.svg?raw'; | ||||
| import * as Sentry from '@sentry/browser'; | ||||
| import { s__ } from '~/locale'; | ||||
| import { parseBoolean } from '~/lib/utils/common_utils'; | ||||
|  |  | |||
|  | @ -24,16 +24,17 @@ | |||
| } | ||||
| 
 | ||||
| .super-sidebar { | ||||
|   @include gl-fixed; | ||||
|   @include gl-top-0; | ||||
|   @include gl-bottom-0; | ||||
|   @include gl-left-0; | ||||
|   @include gl-bg-gray-10; | ||||
|   @include gl-border-r; | ||||
|   @include gl-border-gray-a-08; | ||||
|   display: flex; | ||||
|   flex-direction: column; | ||||
|   position: fixed; | ||||
|   top: 0; | ||||
|   bottom: 0; | ||||
|   left: 0; | ||||
|   background-color: var(--gray-10, $gray-10); | ||||
|   border-right: 1px solid $t-gray-a-08; | ||||
|   transform: translate3d(0, 0, 0); | ||||
|   width: $super-sidebar-width; | ||||
|   z-index: 600; | ||||
|   z-index: $super-sidebar-z-index; | ||||
| 
 | ||||
|   &.super-sidebar-loading { | ||||
|     transform: translate3d(-100%, 0, 0); | ||||
|  | @ -139,12 +140,33 @@ | |||
|   } | ||||
| } | ||||
| 
 | ||||
| .super-sidebar-overlay { | ||||
|   display: none; | ||||
| } | ||||
| 
 | ||||
| .page-with-super-sidebar { | ||||
|   padding-left: 0; | ||||
|   transition: padding-left $gl-transition-duration-medium; | ||||
| 
 | ||||
|   &:not(.page-with-super-sidebar-collapsed) { | ||||
|     .super-sidebar-overlay { | ||||
|       display: block; | ||||
|       position: fixed; | ||||
|       top: 0; | ||||
|       bottom: 0; | ||||
|       left: 0; | ||||
|       right: 0; | ||||
|       background-color: $black-transparent; | ||||
|       z-index: $super-sidebar-z-index - 1; | ||||
| 
 | ||||
|       @include media-breakpoint-up(md) { | ||||
|         display: none; | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   @include media-breakpoint-up(xl) { | ||||
|     padding-left: $contextual-sidebar-width; | ||||
|     padding-left: $super-sidebar-width; | ||||
| 
 | ||||
|     .super-sidebar-toggle { | ||||
|       display: none; | ||||
|  |  | |||
|  | @ -12,6 +12,8 @@ $contextual-sidebar-collapsed-width: 56px; | |||
| $toggle-sidebar-height: 48px; | ||||
| $super-sidebar-width: 256px; | ||||
| $super-sidebar-toggle-position-breakpoint: 1360px; | ||||
| $super-sidebar-z-index: 600; | ||||
| $super-sidebar-overlay-z-index: 599; | ||||
| 
 | ||||
| /** | ||||
|   🚨 Do not use this spacing scale — it is deprecated and being removed. 🚨 | ||||
|  |  | |||
|  | @ -1494,13 +1494,14 @@ kbd { | |||
|   } | ||||
| } | ||||
| .super-sidebar { | ||||
|   display: flex; | ||||
|   flex-direction: column; | ||||
|   position: fixed; | ||||
|   top: 0; | ||||
|   bottom: 0; | ||||
|   left: 0; | ||||
|   background-color: #1f1e24; | ||||
|   border-right: solid 1px #434248; | ||||
|   border-color: rgba(251, 250, 253, 0.08); | ||||
|   background-color: var(--gray-10, #1f1e24); | ||||
|   border-right: 1px solid rgba(251, 250, 253, 0.08); | ||||
|   transform: translate3d(0, 0, 0); | ||||
|   width: 256px; | ||||
|   z-index: 600; | ||||
|  |  | |||
|  | @ -1494,13 +1494,14 @@ kbd { | |||
|   } | ||||
| } | ||||
| .super-sidebar { | ||||
|   display: flex; | ||||
|   flex-direction: column; | ||||
|   position: fixed; | ||||
|   top: 0; | ||||
|   bottom: 0; | ||||
|   left: 0; | ||||
|   background-color: #fbfafd; | ||||
|   border-right: solid 1px #dcdcde; | ||||
|   border-color: rgba(31, 30, 36, 0.08); | ||||
|   background-color: var(--gray-10, #fbfafd); | ||||
|   border-right: 1px solid rgba(31, 30, 36, 0.08); | ||||
|   transform: translate3d(0, 0, 0); | ||||
|   width: 256px; | ||||
|   z-index: 600; | ||||
|  |  | |||
|  | @ -82,9 +82,9 @@ module JiraConnectInstallations | |||
|       Gitlab::IntegrationsLogger.info( | ||||
|         integration: 'JiraConnect', | ||||
|         message: 'Proxy lifecycle event received error response', | ||||
|         event_type: event, | ||||
|         status_code: status_code, | ||||
|         body: body | ||||
|         jira_event_type: event, | ||||
|         jira_status_code: status_code, | ||||
|         jira_body: body | ||||
|       ) | ||||
|     end | ||||
|   end | ||||
|  |  | |||
|  | @ -1,6 +1,7 @@ | |||
| - user_email = "(#{params[:email]})" if Devise.email_regexp.match?(params[:email]) | ||||
| - request_link_start = '<a href="%{new_user_confirmation_path}">'.html_safe % { new_user_confirmation_path: new_user_confirmation_path } | ||||
| - request_link_end = '</a>'.html_safe | ||||
| - registration_link_start = '<a href="%{new_user_registration_path}">'.html_safe % { new_user_registration_path: new_user_registration_path } | ||||
| - link_end = '</a>'.html_safe | ||||
| - content_for :page_specific_javascripts do | ||||
|   = render "layouts/google_tag_manager_head" | ||||
|   = render "layouts/one_trust" | ||||
|  | @ -12,9 +13,11 @@ | |||
|     = _("Almost there...") | ||||
|   %p{ class: 'gl-mb-6 gl-font-lg!' } | ||||
|     = _('Please check your email %{email} to confirm your account') % { email: user_email } | ||||
|     %br | ||||
|     = _('If the email address is incorrect, you can %{registration_link_start}register again with a different email%{registration_link_end}.').html_safe % { registration_link_start: registration_link_start, registration_link_end: link_end } | ||||
|   %hr | ||||
| - if Gitlab::CurrentSettings.after_sign_up_text.present? | ||||
|   .well-confirmation.gl-text-center | ||||
|     = markdown_field(Gitlab::CurrentSettings, :after_sign_up_text) | ||||
| %p.gl-text-center | ||||
|   = _("No confirmation email received? Check your spam folder or %{request_link_start}request new confirmation email%{request_link_end}.").html_safe % { request_link_start: request_link_start, request_link_end: request_link_end } | ||||
|   = _("No confirmation email received? Check your spam folder or %{request_link_start}request new confirmation email%{request_link_end}.").html_safe % { request_link_start: request_link_start, request_link_end: link_end } | ||||
|  |  | |||
|  | @ -30,10 +30,10 @@ | |||
|   - if has_user_defined_certificate | ||||
|     .row | ||||
|       .col-sm-10.offset-sm-2 | ||||
|         .card | ||||
|           .card-header | ||||
|             = _('Certificate') | ||||
|           .d-flex.justify-content-between.align-items-center.p-3 | ||||
|         = render Pajamas::CardComponent.new(body_options: { class: 'gl-display-flex gl-align-items-center gl-justify-content-space-between gl-p-5' }) do |c| | ||||
|           - c.header do | ||||
|             = s_('Certificate') | ||||
|           - c.body do | ||||
|             %span | ||||
|               = domain_presenter.pages_domain.subject || _('missing') | ||||
|             = link_to _('Remove'), | ||||
|  |  | |||
|  | @ -393,6 +393,7 @@ module.exports = { | |||
|             }, | ||||
|           }, | ||||
|           { | ||||
|             resourceQuery: /raw/, | ||||
|             loader: 'raw-loader', | ||||
|           }, | ||||
|         ], | ||||
|  |  | |||
|  | @ -47,6 +47,9 @@ module.exports = (path, options = {}) => { | |||
|     // temporary alias until we replace all `flash` imports for `alert`
 | ||||
|     // https://gitlab.com/gitlab-org/gitlab/-/merge_requests/109449
 | ||||
|     '^~/flash$': '<rootDir>/app/assets/javascripts/alert', | ||||
|     [TEST_FIXTURES_PATTERN]: '<rootDir>/tmp/tests/frontend/fixtures$1', | ||||
|     '^test_fixtures_static(/.*)$': '<rootDir>/spec/frontend/fixtures/static$1', | ||||
|     '\\.(jpg|jpeg|png|svg|css)(\\?\\w+)?$': '<rootDir>/spec/frontend/__mocks__/file_mock.js', | ||||
|     '^~(/.*)\\?(worker|raw)$': '<rootDir>/app/assets/javascripts$1', | ||||
|     '^(.*)\\?(worker|raw)$': '$1', | ||||
|     '^~(/.*)$': '<rootDir>/app/assets/javascripts$1', | ||||
|  | @ -60,10 +63,6 @@ module.exports = (path, options = {}) => { | |||
|     '^any_else_ce(/.*)$': '<rootDir>/app/assets/javascripts$1', | ||||
|     '^helpers(/.*)$': '<rootDir>/spec/frontend/__helpers__$1', | ||||
|     '^vendor(/.*)$': '<rootDir>/vendor/assets/javascripts$1', | ||||
|     [TEST_FIXTURES_PATTERN]: '<rootDir>/tmp/tests/frontend/fixtures$1', | ||||
|     '^test_fixtures_static(/.*)$': '<rootDir>/spec/frontend/fixtures/static$1', | ||||
|     '\\.(jpg|jpeg|png|svg|css)$': '<rootDir>/spec/frontend/__mocks__/file_mock.js', | ||||
|     '\\.svg\\?url$': '<rootDir>/spec/frontend/__mocks__/file_mock.js', | ||||
|     '^public(/.*)$': '<rootDir>/public$1', | ||||
|     'emojis(/.*).json': '<rootDir>/fixtures/emojis$1.json', | ||||
|     '^spec/test_constants$': '<rootDir>/spec/frontend/__helpers__/test_constants', | ||||
|  |  | |||
|  | @ -21424,6 +21424,9 @@ msgstr "" | |||
| msgid "If enabled, only protected branches will be mirrored." | ||||
| msgstr "" | ||||
| 
 | ||||
| msgid "If the email address is incorrect, you can %{registration_link_start}register again with a different email%{registration_link_end}." | ||||
| msgstr "" | ||||
| 
 | ||||
| msgid "If the number of active users exceeds the user limit, you will be charged for the number of %{users_over_license_link} at your next license reconciliation." | ||||
| msgstr "" | ||||
| 
 | ||||
|  | @ -38764,6 +38767,9 @@ msgstr "" | |||
| msgid "SecurityOrchestration|No rules defined - policy will not run." | ||||
| msgstr "" | ||||
| 
 | ||||
| msgid "SecurityOrchestration|Non-existing tags have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing tags from the policy yaml." | ||||
| msgstr "" | ||||
| 
 | ||||
| msgid "SecurityOrchestration|Not enabled" | ||||
| msgstr "" | ||||
| 
 | ||||
|  |  | |||
|  | @ -19,7 +19,7 @@ require_relative 'api/default_options' | |||
| # Push into expected format for failed tests | ||||
| class PipelineTestReportBuilder | ||||
|   DEFAULT_OPTIONS = { | ||||
|     target_project: Host::DEFAULT_OPTIONS[:target_project], | ||||
|     target_project: Host::DEFAULT_OPTIONS[:target_project] || API::DEFAULT_OPTIONS[:project], | ||||
|     current_pipeline_id: API::DEFAULT_OPTIONS[:pipeline_id], | ||||
|     mr_iid: Host::DEFAULT_OPTIONS[:mr_iid], | ||||
|     api_endpoint: API::DEFAULT_OPTIONS[:endpoint], | ||||
|  |  | |||
|  | @ -48,13 +48,13 @@ RSpec.describe "Pages with Let's Encrypt", :https_pages_enabled, feature_categor | |||
|       expect(domain.auto_ssl_enabled).to eq false | ||||
| 
 | ||||
|       expect(find("#pages_domain_auto_ssl_enabled", visible: false).value).to eq 'false' | ||||
|       expect(page).to have_selector '.card-header', text: 'Certificate' | ||||
|       expect(page).to have_selector '.gl-card-header', text: 'Certificate' | ||||
|       expect(page).to have_text domain.subject | ||||
| 
 | ||||
|       find('.js-auto-ssl-toggle-container .js-project-feature-toggle button').click | ||||
| 
 | ||||
|       expect(find("#pages_domain_auto_ssl_enabled", visible: false).value).to eq 'true' | ||||
|       expect(page).not_to have_selector '.card-header', text: 'Certificate' | ||||
|       expect(page).not_to have_selector '.gl-card-header', text: 'Certificate' | ||||
|       expect(page).not_to have_text domain.subject | ||||
| 
 | ||||
|       click_on 'Save Changes' | ||||
|  | @ -108,7 +108,7 @@ RSpec.describe "Pages with Let's Encrypt", :https_pages_enabled, feature_categor | |||
|       it 'user do not see private key' do | ||||
|         visit project_pages_domain_path(project, domain) | ||||
| 
 | ||||
|         expect(page).not_to have_selector '.card-header', text: 'Certificate' | ||||
|         expect(page).not_to have_selector '.gl-card-header', text: 'Certificate' | ||||
|         expect(page).not_to have_text domain.subject | ||||
|       end | ||||
|     end | ||||
|  | @ -131,16 +131,16 @@ RSpec.describe "Pages with Let's Encrypt", :https_pages_enabled, feature_categor | |||
|       it 'user sees certificate subject' do | ||||
|         visit project_pages_domain_path(project, domain) | ||||
| 
 | ||||
|         expect(page).to have_selector '.card-header', text: 'Certificate' | ||||
|         expect(page).to have_selector '.gl-card-header', text: 'Certificate' | ||||
|         expect(page).to have_text domain.subject | ||||
|       end | ||||
| 
 | ||||
|       it 'user can delete the certificate', :js do | ||||
|         visit project_pages_domain_path(project, domain) | ||||
| 
 | ||||
|         expect(page).to have_selector '.card-header', text: 'Certificate' | ||||
|         expect(page).to have_selector '.gl-card-header', text: 'Certificate' | ||||
|         expect(page).to have_text domain.subject | ||||
|         within('.card') { click_on 'Remove' } | ||||
|         within('.gl-card') { click_on 'Remove' } | ||||
|         accept_gl_confirm(button_text: 'Remove certificate') | ||||
|         expect(page).to have_field 'Certificate (PEM)', with: '' | ||||
|         expect(page).to have_field 'Key (PEM)', with: '' | ||||
|  |  | |||
|  | @ -477,6 +477,9 @@ export const mockList = { | |||
|   loading: false, | ||||
|   issuesCount: 1, | ||||
|   maxIssueCount: 0, | ||||
|   metadata: { | ||||
|     epicsCount: 1, | ||||
|   }, | ||||
|   __typename: 'BoardList', | ||||
| }; | ||||
| 
 | ||||
|  |  | |||
|  | @ -3,11 +3,17 @@ import SuperSidebar from '~/super_sidebar/components/super_sidebar.vue'; | |||
| import HelpCenter from '~/super_sidebar/components/help_center.vue'; | ||||
| import UserBar from '~/super_sidebar/components/user_bar.vue'; | ||||
| import SidebarPortalTarget from '~/super_sidebar/components/sidebar_portal_target.vue'; | ||||
| import { isCollapsed } from '~/super_sidebar/super_sidebar_collapsed_state_manager'; | ||||
| import { sidebarData } from '../mock_data'; | ||||
| 
 | ||||
| jest.mock('~/super_sidebar/super_sidebar_collapsed_state_manager', () => ({ | ||||
|   isCollapsed: jest.fn(), | ||||
| })); | ||||
| 
 | ||||
| describe('SuperSidebar component', () => { | ||||
|   let wrapper; | ||||
| 
 | ||||
|   const findSidebar = () => wrapper.find('.super-sidebar'); | ||||
|   const findUserBar = () => wrapper.findComponent(UserBar); | ||||
|   const findHelpCenter = () => wrapper.findComponent(HelpCenter); | ||||
|   const findSidebarPortalTarget = () => wrapper.findComponent(SidebarPortalTarget); | ||||
|  | @ -22,19 +28,32 @@ describe('SuperSidebar component', () => { | |||
|   }; | ||||
| 
 | ||||
|   describe('default', () => { | ||||
|     beforeEach(() => { | ||||
|     it('add aria-hidden and inert attributes when collapsed', () => { | ||||
|       isCollapsed.mockReturnValue(true); | ||||
|       createWrapper(); | ||||
|       expect(findSidebar().attributes('aria-hidden')).toBe('true'); | ||||
|       expect(findSidebar().attributes('inert')).toBe('inert'); | ||||
|     }); | ||||
| 
 | ||||
|     it('does not add aria-hidden and inert attributes when expanded', () => { | ||||
|       isCollapsed.mockReturnValue(false); | ||||
|       createWrapper(); | ||||
|       expect(findSidebar().attributes('aria-hidden')).toBe('false'); | ||||
|       expect(findSidebar().attributes('inert')).toBe(undefined); | ||||
|     }); | ||||
| 
 | ||||
|     it('renders UserBar with sidebarData', () => { | ||||
|       createWrapper(); | ||||
|       expect(findUserBar().props('sidebarData')).toBe(sidebarData); | ||||
|     }); | ||||
| 
 | ||||
|     it('renders HelpCenter with sidebarData', () => { | ||||
|       createWrapper(); | ||||
|       expect(findHelpCenter().props('sidebarData')).toBe(sidebarData); | ||||
|     }); | ||||
| 
 | ||||
|     it('renders SidebarPortalTarget', () => { | ||||
|       createWrapper(); | ||||
|       expect(findSidebarPortalTarget().exists()).toBe(true); | ||||
|     }); | ||||
|   }); | ||||
|  |  | |||
|  | @ -0,0 +1,132 @@ | |||
| import { GlBreakpointInstance as bp, breakpoints } from '@gitlab/ui/dist/utils'; | ||||
| import { getCookie, setCookie } from '~/lib/utils/common_utils'; | ||||
| import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures'; | ||||
| import { | ||||
|   SIDEBAR_COLLAPSED_CLASS, | ||||
|   SIDEBAR_COLLAPSED_COOKIE, | ||||
|   SIDEBAR_COLLAPSED_COOKIE_EXPIRATION, | ||||
|   toggleSuperSidebarCollapsed, | ||||
|   initSuperSidebarCollapsedState, | ||||
|   bindSuperSidebarCollapsedEvents, | ||||
|   findPage, | ||||
|   findSidebar, | ||||
|   findToggles, | ||||
| } from '~/super_sidebar/super_sidebar_collapsed_state_manager'; | ||||
| 
 | ||||
| const { xl, sm } = breakpoints; | ||||
| 
 | ||||
| jest.mock('~/lib/utils/common_utils', () => ({ | ||||
|   getCookie: jest.fn(), | ||||
|   setCookie: jest.fn(), | ||||
| })); | ||||
| 
 | ||||
| const pageHasCollapsedClass = (hasClass) => { | ||||
|   if (hasClass) { | ||||
|     expect(findPage().classList).toContain(SIDEBAR_COLLAPSED_CLASS); | ||||
|   } else { | ||||
|     expect(findPage().classList).not.toContain(SIDEBAR_COLLAPSED_CLASS); | ||||
|   } | ||||
| }; | ||||
| 
 | ||||
| describe('Super Sidebar Collapsed State Manager', () => { | ||||
|   beforeEach(() => { | ||||
|     setHTMLFixture(` | ||||
|       <button class="js-super-sidebar-toggle"></button> | ||||
|       <div class="page-with-super-sidebar"></div> | ||||
|       <aside class="super-sidebar"></aside> | ||||
|     `);
 | ||||
|   }); | ||||
| 
 | ||||
|   afterEach(() => { | ||||
|     resetHTMLFixture(); | ||||
|   }); | ||||
| 
 | ||||
|   describe('toggleSuperSidebarCollapsed', () => { | ||||
|     it.each` | ||||
|       collapsed | saveCookie | windowWidth | hasClass | ||||
|       ${true}   | ${true}    | ${xl}       | ${true} | ||||
|       ${true}   | ${false}   | ${xl}       | ${true} | ||||
|       ${true}   | ${true}    | ${sm}       | ${true} | ||||
|       ${true}   | ${false}   | ${sm}       | ${true} | ||||
|       ${false}  | ${true}    | ${xl}       | ${false} | ||||
|       ${false}  | ${false}   | ${xl}       | ${false} | ||||
|       ${false}  | ${true}    | ${sm}       | ${false} | ||||
|       ${false}  | ${false}   | ${sm}       | ${false} | ||||
|     `(
 | ||||
|       'when collapsed is $collapsed, saveCookie is $saveCookie, and windowWidth is $windowWidth then page class contains `page-with-super-sidebar-collapsed` is $hasClass', | ||||
|       ({ collapsed, saveCookie, windowWidth, hasClass }) => { | ||||
|         jest.spyOn(bp, 'windowWidth').mockReturnValue(windowWidth); | ||||
| 
 | ||||
|         toggleSuperSidebarCollapsed(collapsed, saveCookie); | ||||
| 
 | ||||
|         pageHasCollapsedClass(hasClass); | ||||
|         expect(findSidebar().ariaHidden).toBe(collapsed); | ||||
|         expect(findSidebar().inert).toBe(collapsed); | ||||
| 
 | ||||
|         if (saveCookie && windowWidth >= xl) { | ||||
|           expect(setCookie).toHaveBeenCalledWith(SIDEBAR_COLLAPSED_COOKIE, collapsed, { | ||||
|             expires: SIDEBAR_COLLAPSED_COOKIE_EXPIRATION, | ||||
|           }); | ||||
|         } else { | ||||
|           expect(setCookie).not.toHaveBeenCalled(); | ||||
|         } | ||||
|       }, | ||||
|     ); | ||||
|   }); | ||||
| 
 | ||||
|   describe('initSuperSidebarCollapsedState', () => { | ||||
|     it.each` | ||||
|       windowWidth | cookie       | hasClass | ||||
|       ${xl}       | ${undefined} | ${false} | ||||
|       ${sm}       | ${undefined} | ${true} | ||||
|       ${xl}       | ${'true'}    | ${true} | ||||
|       ${sm}       | ${'true'}    | ${true} | ||||
|     `(
 | ||||
|       'sets page class to `page-with-super-sidebar-collapsed` when windowWidth is $windowWidth and cookie value is $cookie', | ||||
|       ({ windowWidth, cookie, hasClass }) => { | ||||
|         jest.spyOn(bp, 'windowWidth').mockReturnValue(windowWidth); | ||||
|         getCookie.mockReturnValue(cookie); | ||||
| 
 | ||||
|         initSuperSidebarCollapsedState(); | ||||
| 
 | ||||
|         pageHasCollapsedClass(hasClass); | ||||
|         expect(setCookie).not.toHaveBeenCalled(); | ||||
|       }, | ||||
|     ); | ||||
|   }); | ||||
| 
 | ||||
|   describe('bindSuperSidebarCollapsedEvents', () => { | ||||
|     it.each` | ||||
|       windowWidth | cookie       | hasClass | ||||
|       ${xl}       | ${undefined} | ${true} | ||||
|       ${sm}       | ${undefined} | ${true} | ||||
|       ${xl}       | ${'true'}    | ${false} | ||||
|       ${sm}       | ${'true'}    | ${false} | ||||
|     `(
 | ||||
|       'toggle click sets page class to `page-with-super-sidebar-collapsed` when windowWidth is $windowWidth and cookie value is $cookie', | ||||
|       ({ windowWidth, cookie, hasClass }) => { | ||||
|         setHTMLFixture(` | ||||
|           <button class="js-super-sidebar-toggle"></button> | ||||
|           <div class="page-with-super-sidebar ${cookie ? SIDEBAR_COLLAPSED_CLASS : ''}"></div> | ||||
|           <aside class="super-sidebar"></aside> | ||||
|         `);
 | ||||
|         jest.spyOn(bp, 'windowWidth').mockReturnValue(windowWidth); | ||||
|         getCookie.mockReturnValue(cookie); | ||||
| 
 | ||||
|         bindSuperSidebarCollapsedEvents(); | ||||
| 
 | ||||
|         findToggles()[0].click(); | ||||
| 
 | ||||
|         pageHasCollapsedClass(hasClass); | ||||
| 
 | ||||
|         if (windowWidth >= xl) { | ||||
|           expect(setCookie).toHaveBeenCalledWith(SIDEBAR_COLLAPSED_COOKIE, !cookie, { | ||||
|             expires: SIDEBAR_COLLAPSED_COOKIE_EXPIRATION, | ||||
|           }); | ||||
|         } else { | ||||
|           expect(setCookie).not.toHaveBeenCalled(); | ||||
|         } | ||||
|       }, | ||||
|     ); | ||||
|   }); | ||||
| }); | ||||
|  | @ -94,9 +94,9 @@ RSpec.describe JiraConnectInstallations::ProxyLifecycleEventService, feature_cat | |||
|           expect(Gitlab::IntegrationsLogger).to receive(:info).with( | ||||
|             integration: 'JiraConnect', | ||||
|             message: 'Proxy lifecycle event received error response', | ||||
|             event_type: evnet_type, | ||||
|             status_code: 422, | ||||
|             body: 'Error message' | ||||
|             jira_event_type: evnet_type, | ||||
|             jira_status_code: 422, | ||||
|             jira_body: 'Error message' | ||||
|           ) | ||||
| 
 | ||||
|           execute_service | ||||
|  |  | |||
|  | @ -3,9 +3,9 @@ | |||
| require 'spec_helper' | ||||
| 
 | ||||
| RSpec.describe 'devise/confirmations/almost_there' do | ||||
|   describe 'confirmations text' do | ||||
|     subject { render(template: 'devise/confirmations/almost_there') } | ||||
|   subject { render(template: 'devise/confirmations/almost_there') } | ||||
| 
 | ||||
|   describe 'confirmations text' do | ||||
|     before do | ||||
|       allow(view).to receive(:params).and_return(email: email) | ||||
|     end | ||||
|  | @ -34,4 +34,17 @@ RSpec.describe 'devise/confirmations/almost_there' do | |||
|       end | ||||
|     end | ||||
|   end | ||||
| 
 | ||||
|   describe 'register again prompt' do | ||||
|     specify do | ||||
|       subject | ||||
| 
 | ||||
|       expect(rendered).to have_content( | ||||
|         'If the email address is incorrect, you can register again with a different email' | ||||
|       ) | ||||
|       expect(rendered).to have_link( | ||||
|         'register again with a different email', href: new_user_registration_path | ||||
|       ) | ||||
|     end | ||||
|   end | ||||
| end | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue