diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2023-04-19 18:08:48 +0000 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2023-04-19 18:08:48 +0000 |
commit | bb915e6375fe65053937c6bf8a7d0771dc9e4713 (patch) | |
tree | 1836cb9ec3d39d283707997f86f2edfc77c4e121 /app | |
parent | b6d63c915a91aeb7a4437349c53e68be8c50cf4e (diff) | |
download | gitlab-ce-bb915e6375fe65053937c6bf8a7d0771dc9e4713.tar.gz |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'app')
17 files changed, 61 insertions, 38 deletions
diff --git a/app/assets/javascripts/projects/settings_service_desk/components/service_desk_root.vue b/app/assets/javascripts/projects/settings_service_desk/components/service_desk_root.vue index b79b3fa4573..79ece99e6ec 100644 --- a/app/assets/javascripts/projects/settings_service_desk/components/service_desk_root.vue +++ b/app/assets/javascripts/projects/settings_service_desk/components/service_desk_root.vue @@ -8,7 +8,7 @@ import ServiceDeskSetting from './service_desk_setting.vue'; export default { customEmailHelpPath: helpPagePath('/user/project/service_desk.html', { - anchor: 'using-a-custom-email-address', + anchor: 'use-a-custom-email-address', }), components: { GlAlert, diff --git a/app/assets/javascripts/projects/settings_service_desk/components/service_desk_setting.vue b/app/assets/javascripts/projects/settings_service_desk/components/service_desk_setting.vue index 85550e262e6..8af2e787740 100644 --- a/app/assets/javascripts/projects/settings_service_desk/components/service_desk_setting.vue +++ b/app/assets/javascripts/projects/settings_service_desk/components/service_desk_setting.vue @@ -102,12 +102,12 @@ export default { }, emailSuffixHelpUrl() { return helpPagePath('user/project/service_desk.html', { - anchor: 'configuring-a-custom-email-address-suffix', + anchor: 'configure-a-custom-email-address-suffix', }); }, customEmailAddressHelpUrl() { return helpPagePath('user/project/service_desk.html', { - anchor: 'using-a-custom-email-address', + anchor: 'use-a-custom-email-address', }); }, }, diff --git a/app/assets/javascripts/search/sidebar/components/app.vue b/app/assets/javascripts/search/sidebar/components/app.vue index 81a57e96b3c..317145d4cd1 100644 --- a/app/assets/javascripts/search/sidebar/components/app.vue +++ b/app/assets/javascripts/search/sidebar/components/app.vue @@ -25,6 +25,9 @@ export default { showBlobFilter() { return this.currentScope === SCOPE_BLOB; }, + showOldNavigation() { + return Boolean(this.currentScope); + }, }, }; </script> diff --git a/app/assets/javascripts/search/sidebar/components/checkbox_filter.vue b/app/assets/javascripts/search/sidebar/components/checkbox_filter.vue index 08a943d58f8..feff3f77dd2 100644 --- a/app/assets/javascripts/search/sidebar/components/checkbox_filter.vue +++ b/app/assets/javascripts/search/sidebar/components/checkbox_filter.vue @@ -27,7 +27,7 @@ export default { }, }, computed: { - ...mapState(['query']), + ...mapState(['query', 'useNewNavigation']), ...mapGetters(['queryLanguageFilters']), dataFilters() { return Object.values(this.filtersData?.filters || []); @@ -69,7 +69,7 @@ export default { <template> <div class="gl-mx-5"> - <h5 class="gl-mt-0">{{ filtersData.header }}</h5> + <h5 class="gl-mt-0" :class="{ 'gl-font-sm': useNewNavigation }">{{ filtersData.header }}</h5> <gl-form-checkbox-group v-model="selectedFilter"> <gl-form-checkbox v-for="f in dataFilters" diff --git a/app/assets/javascripts/search/sidebar/components/confidentiality_filter.vue b/app/assets/javascripts/search/sidebar/components/confidentiality_filter.vue index e7aa3d61409..56e44d454a1 100644 --- a/app/assets/javascripts/search/sidebar/components/confidentiality_filter.vue +++ b/app/assets/javascripts/search/sidebar/components/confidentiality_filter.vue @@ -1,5 +1,7 @@ <script> +import { mapState } from 'vuex'; import { confidentialFilterData } from '../constants/confidential_filter_data'; +import { HR_DEFAULT_CLASSES } from '../constants'; import RadioFilter from './radio_filter.vue'; export default { @@ -7,13 +9,17 @@ export default { components: { RadioFilter, }, + computed: { + ...mapState(['useNewNavigation']), + }, confidentialFilterData, + HR_DEFAULT_CLASSES, }; </script> <template> <div> <radio-filter class="gl-px-5" :filter-data="$options.confidentialFilterData" /> - <hr class="gl-my-5 gl-mx-5 gl-border-gray-100" /> + <hr v-if="!useNewNavigation" :class="$options.HR_DEFAULT_CLASSES" /> </div> </template> diff --git a/app/assets/javascripts/search/sidebar/components/language_filter/index.vue b/app/assets/javascripts/search/sidebar/components/language_filter/index.vue index 4e3be9cdabc..40b50f657f0 100644 --- a/app/assets/javascripts/search/sidebar/components/language_filter/index.vue +++ b/app/assets/javascripts/search/sidebar/components/language_filter/index.vue @@ -38,7 +38,7 @@ export default { reset: s__('GlobalSearch|Reset filters'), }, computed: { - ...mapState(['aggregations', 'sidebarDirty']), + ...mapState(['aggregations', 'sidebarDirty', 'useNewNavigation']), ...mapGetters([ 'languageAggregationBuckets', 'currentUrlQueryHasLanguageFilters', @@ -117,7 +117,7 @@ export default { class="gl-pt-5 gl-md-pt-0 language-filter-checkbox" @submit.prevent="submitQuery" > - <hr :class="dividerClasses" /> + <hr v-if="!useNewNavigation" :class="dividerClasses" /> <div v-if="!aggregations.error" class="gl-overflow-x-hidden gl-overflow-y-auto" @@ -147,7 +147,7 @@ export default { </gl-button> </div> <div v-if="!aggregations.error"> - <hr :class="$options.HR_DEFAULT_CLASSES" /> + <hr v-if="!useNewNavigation" :class="$options.HR_DEFAULT_CLASSES" /> <div class="gl-display-flex gl-align-items-center gl-justify-content-space-between gl-mt-4 gl-mx-5" > diff --git a/app/assets/javascripts/search/sidebar/components/radio_filter.vue b/app/assets/javascripts/search/sidebar/components/radio_filter.vue index 0733dc72d2e..477ba37dab7 100644 --- a/app/assets/javascripts/search/sidebar/components/radio_filter.vue +++ b/app/assets/javascripts/search/sidebar/components/radio_filter.vue @@ -16,7 +16,7 @@ export default { }, }, computed: { - ...mapState(['query']), + ...mapState(['query', 'useNewNavigation']), ...mapGetters(['currentScope']), ANY() { return this.filterData.filters.ANY; @@ -56,7 +56,7 @@ export default { <template> <div> - <h5 class="gl-mt-0">{{ filterData.header }}</h5> + <h5 class="gl-mt-0" :class="{ 'gl-font-sm': useNewNavigation }">{{ filterData.header }}</h5> <gl-form-radio-group v-model="selectedFilter"> <gl-form-radio v-for="f in filtersArray" :key="f.value" :value="f.value"> {{ radioLabel(f) }} diff --git a/app/assets/javascripts/search/sidebar/components/results_filters.vue b/app/assets/javascripts/search/sidebar/components/results_filters.vue index 7d995f26684..24804baef44 100644 --- a/app/assets/javascripts/search/sidebar/components/results_filters.vue +++ b/app/assets/javascripts/search/sidebar/components/results_filters.vue @@ -1,6 +1,7 @@ <script> import { GlButton, GlLink } from '@gitlab/ui'; import { mapActions, mapState, mapGetters } from 'vuex'; +import { HR_DEFAULT_CLASSES } from '../constants/index'; import { confidentialFilterData } from '../constants/confidential_filter_data'; import { stateFilterData } from '../constants/state_filter_data'; import ConfidentialityFilter from './confidentiality_filter.vue'; @@ -15,7 +16,7 @@ export default { ConfidentialityFilter, }, computed: { - ...mapState(['urlQuery', 'sidebarDirty']), + ...mapState(['urlQuery', 'sidebarDirty', 'useNewNavigation']), ...mapGetters(['currentScope']), showReset() { return this.urlQuery.state || this.urlQuery.confidential; @@ -26,6 +27,9 @@ export default { showStatusFilter() { return Object.values(stateFilterData.scopes).includes(this.currentScope); }, + hrClasses() { + return [...HR_DEFAULT_CLASSES, 'gl-display-none', 'gl-md-display-block']; + }, }, methods: { ...mapActions(['applyQuery', 'resetQuery']), @@ -35,7 +39,7 @@ export default { <template> <form class="gl-pt-5 gl-md-pt-0" @submit.prevent="applyQuery"> - <hr class="gl-my-5 gl-mx-5 gl-border-gray-100 gl-display-none gl-md-display-block" /> + <hr v-if="!useNewNavigation" :class="hrClasses" /> <status-filter v-if="showStatusFilter" /> <confidentiality-filter v-if="showConfidentialityFilter" /> <div class="gl-display-flex gl-align-items-center gl-mt-4 gl-px-5"> diff --git a/app/assets/javascripts/search/sidebar/components/status_filter.vue b/app/assets/javascripts/search/sidebar/components/status_filter.vue index c3deabfcc26..44d6b537b7b 100644 --- a/app/assets/javascripts/search/sidebar/components/status_filter.vue +++ b/app/assets/javascripts/search/sidebar/components/status_filter.vue @@ -1,5 +1,7 @@ <script> +import { mapState } from 'vuex'; import { stateFilterData } from '../constants/state_filter_data'; +import { HR_DEFAULT_CLASSES } from '../constants'; import RadioFilter from './radio_filter.vue'; export default { @@ -7,13 +9,17 @@ export default { components: { RadioFilter, }, + computed: { + ...mapState(['useNewNavigation']), + }, stateFilterData, + HR_DEFAULT_CLASSES, }; </script> <template> <div> <radio-filter class="gl-px-5" :filter-data="$options.stateFilterData" /> - <hr class="gl-my-5 gl-mx-5 gl-border-gray-100" /> + <hr v-if="!useNewNavigation" :class="$options.HR_DEFAULT_CLASSES" /> </div> </template> diff --git a/app/assets/stylesheets/framework/flash.scss b/app/assets/stylesheets/framework/flash.scss index b63365e8159..6b4f1478978 100644 --- a/app/assets/stylesheets/framework/flash.scss +++ b/app/assets/stylesheets/framework/flash.scss @@ -9,7 +9,7 @@ $notification-box-shadow-color: rgba(0, 0, 0, 0.25); &.sticky { position: sticky; - top: $flash-container-top; + top: $calc-application-header-height; z-index: 251; .flash-alert, @@ -114,17 +114,3 @@ $notification-box-shadow-color: rgba(0, 0, 0, 0.25); left: -50%; } } - -.with-system-header .flash-container.sticky { - top: $flash-container-top + $system-header-height; -} - -.with-performance-bar { - .flash-container.sticky { - top: $flash-container-top + $performance-bar-height; - } - - &.with-system-header .flash-container.sticky { - top: $flash-container-top + $performance-bar-height + $system-header-height; - } -} diff --git a/app/assets/stylesheets/framework/variables.scss b/app/assets/stylesheets/framework/variables.scss index 32abd5d94a2..dba9cafbd71 100644 --- a/app/assets/stylesheets/framework/variables.scss +++ b/app/assets/stylesheets/framework/variables.scss @@ -482,7 +482,6 @@ $system-header-height: 16px; $system-footer-height: $system-header-height; $mr-review-bar-height: calc(2rem + 13px); $flash-height: 52px; -$flash-container-top: 48px; $context-header-height: 60px; $top-bar-height: 48px; $home-panel-title-row-height: 64px; diff --git a/app/assets/stylesheets/startup/startup-signin.scss b/app/assets/stylesheets/startup/startup-signin.scss index fcdcab5caeb..cd768c3bbc0 100644 --- a/app/assets/stylesheets/startup/startup-signin.scss +++ b/app/assets/stylesheets/startup/startup-signin.scss @@ -672,6 +672,7 @@ body.navless { :root { --performance-bar-height: 0px; --system-header-height: 0px; + --top-bar-height: 0px; --system-footer-height: 0px; --mr-review-bar-height: 0px; } @@ -702,7 +703,11 @@ hr { } .flash-container.sticky { position: sticky; - top: 48px; + top: calc( + var(--header-height, 48px) + + calc(var(--system-header-height) + var(--performance-bar-height)) + + var(--top-bar-height) + ); z-index: 251; } .flash-container.flash-container-page { diff --git a/app/graphql/resolvers/ci/runner_projects_resolver.rb b/app/graphql/resolvers/ci/runner_projects_resolver.rb index 13a493c42a5..625efc615c8 100644 --- a/app/graphql/resolvers/ci/runner_projects_resolver.rb +++ b/app/graphql/resolvers/ci/runner_projects_resolver.rb @@ -34,25 +34,30 @@ module Resolvers .where(runner_id: runner_ids) .pluck(:runner_id, :project_id) - project_ids = plucked_runner_and_project_ids.collect { |_runner_id, project_id| project_id }.uniq + unique_project_ids = plucked_runner_and_project_ids.collect { |_runner_id, project_id| project_id }.uniq projects = ProjectsFinder .new(current_user: current_user, params: project_finder_params(args), - project_ids_relation: project_ids) + project_ids_relation: unique_project_ids) .execute projects = apply_lookahead(projects) Preloaders::ProjectPolicyPreloader.new(projects, current_user).execute + sorted_project_ids = projects.map(&:id) projects_by_id = projects.index_by(&:id) # In plucked_runner_and_project_ids, first() represents the runner ID, and second() the project ID, # so let's group the project IDs by runner ID - runner_project_ids_by_runner_id = + project_ids_by_runner_id = plucked_runner_and_project_ids .group_by(&:first) - .transform_values { |values| values.map(&:second).filter_map { |project_id| projects_by_id[project_id] } } + .transform_values { |runner_id_and_project_id| runner_id_and_project_id.map(&:second) } + # Reorder the project IDs according to the order in sorted_project_ids + sorted_project_ids_by_runner_id = + project_ids_by_runner_id.transform_values { |project_ids| sorted_project_ids.intersection(project_ids) } runner_ids.each do |runner_id| - runner_projects = runner_project_ids_by_runner_id[runner_id] || [] + runner_project_ids = sorted_project_ids_by_runner_id[runner_id] || [] + runner_projects = runner_project_ids.map { |id| projects_by_id[id] } loader.call(runner_id, runner_projects) end diff --git a/app/graphql/resolvers/concerns/resolves_merge_requests.rb b/app/graphql/resolvers/concerns/resolves_merge_requests.rb index c68e120ee24..b9326015ac0 100644 --- a/app/graphql/resolvers/concerns/resolves_merge_requests.rb +++ b/app/graphql/resolvers/concerns/resolves_merge_requests.rb @@ -40,6 +40,7 @@ module ResolvesMergeRequests def preloads { assignees: [:assignees], + award_emoji: { award_emoji: [:awardable] }, reviewers: [:reviewers], participants: MergeRequest.participant_includes, author: [:author], diff --git a/app/graphql/types/merge_request_type.rb b/app/graphql/types/merge_request_type.rb index 94470290082..d73eaed8a0a 100644 --- a/app/graphql/types/merge_request_type.rb +++ b/app/graphql/types/merge_request_type.rb @@ -219,6 +219,10 @@ module Types field :timelogs, Types::TimelogType.connection_type, null: false, description: 'Timelogs on the merge request.' + field :award_emoji, Types::AwardEmojis::AwardEmojiType.connection_type, + null: true, + description: 'List of award emojis associated with the merge request.' + markdown_field :title_html, null: true markdown_field :description_html, null: true diff --git a/app/views/search/_results_list.html.haml b/app/views/search/_results_list.html.haml index c36acaf9ea8..fcbf0ba4452 100644 --- a/app/views/search/_results_list.html.haml +++ b/app/views/search/_results_list.html.haml @@ -5,7 +5,9 @@ - elsif @search_objects.blank? = render partial: "search/results/empty" - else - .gl-md-pl-5 + - statusBarClass = !show_super_sidebar? ? 'gl-md-pl-5' : '' + + .section{ class: statusBarClass } - if @scope == 'commits' %ul.content-list.commit-list = render partial: "search/results/commit", collection: @search_objects diff --git a/app/views/search/_results_status.html.haml b/app/views/search/_results_status.html.haml index 4ab68caaf22..6fc07d35296 100644 --- a/app/views/search/_results_status.html.haml +++ b/app/views/search/_results_status.html.haml @@ -1,5 +1,7 @@ - return unless @search_service_presenter.show_results_status? -.gl-md-pl-5 +- statusBarClass = !show_super_sidebar? ? 'gl-md-pl-5' : '' + +.section{ class: statusBarClass } .search-results-status .gl-display-flex.gl-flex-direction-column .gl-p-5.gl-display-flex |