From a6b21afb09a4b91e47db93b2443205bd4eef84e6 Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Wed, 12 Jul 2023 21:08:10 +0000 Subject: [PATCH] Add latest changes from gitlab-org/gitlab@master --- .rubocop_todo/performance/regexp_match.yml | 13 -- app/assets/javascripts/api/groups_api.js | 4 +- .../frequent_items/store/mutations.js | 2 +- .../components/group_select.vue | 71 ++++-- .../components/invite_groups_modal.vue | 12 + .../issues/show/components/form.vue | 13 -- .../pages/projects/issues/new/index.js | 2 +- .../pipeline_failed_jobs_widget.vue | 7 +- .../pipelines_list/pipelines_artifacts.vue | 51 ++-- .../work_items/components/item_state.vue | 4 +- .../components/notes/system_note.vue | 2 +- .../components/work_item_assignees.vue | 5 +- .../work_item_attributes_wrapper.vue | 4 +- .../work_item_description_rendered.vue | 2 +- .../components/work_item_detail.vue | 218 +++++++++++++----- .../components/work_item_due_date.vue | 6 +- .../components/work_item_labels.vue | 5 +- .../components/work_item_milestone.vue | 6 +- .../stylesheets/page_bundles/work_items.scss | 54 +++++ app/views/projects/jobs/_table.html.haml | 2 +- .../pipeline_schedules/_form.html.haml | 2 +- ...umns.yml => fix_new_blobs_memoization.yml} | 8 +- danger/roulette/Dangerfile | 2 +- doc/administration/license.md | 83 +++++++ doc/administration/load_balancer.md | 2 +- doc/administration/monitoring/health_check.md | 146 ++++++++++++ doc/administration/raketasks/maintenance.md | 2 +- .../reporting/git_abuse_rate_limit.md | 49 ++++ .../settings/rate_limit_on_projects_api.md | 37 +++ .../settings/rate_limit_on_users_api.md | 34 +++ .../rate_limits_on_git_ssh_operations.md | 33 +++ .../settings/rate_limits_on_raw_endpoints.md | 29 +++ doc/administration/settings/scim_setup.md | 43 ++++ doc/index.md | 2 +- doc/install/next_steps.md | 2 +- .../advanced_search/elasticsearch.md | 2 +- doc/subscriptions/bronze_starter.md | 2 +- doc/subscriptions/self_managed/index.md | 6 +- doc/update/index.md | 7 + doc/update/package/convert_to_ee.md | 4 +- doc/user/admin_area/license.md | 86 +------ .../admin_area/monitoring/health_check.md | 149 +----------- .../reporting/git_abuse_rate_limit.md | 52 +---- .../settings/rate_limit_on_projects_api.md | 40 +--- .../settings/rate_limit_on_users_api.md | 37 +-- .../rate_limits_on_git_ssh_operations.md | 36 +-- .../settings/rate_limits_on_raw_endpoints.md | 32 +-- doc/user/admin_area/settings/scim_setup.md | 46 +--- .../group/saml_sso/troubleshooting_scim.md | 2 +- .../terraform_module_registry/index.md | 2 +- ...ration.rb => create_table_migration.rb.tt} | 0 .../{migration.rb => migration.rb.tt} | 0 .../{migration.rb => migration.rb.tt} | 0 lib/gitlab/git/repository.rb | 16 +- .../in_operator_optimization/query_builder.rb | 6 +- .../strategies/record_loader_strategy.rb | 2 +- lib/gitlab/pagination/keyset/order.rb | 6 +- locale/gitlab.pot | 18 +- package.json | 2 +- rubocop/cop/project_path_helper.rb | 2 +- rubocop/cop/qa/selector_usage.rb | 2 +- spec/frontend/frequent_items/mock_data.js | 2 +- .../components/group_select_spec.js | 66 +++++- .../components/invite_groups_modal_spec.js | 13 +- .../pipelines/pipelines_artifacts_spec.js | 23 +- .../components/work_item_detail_spec.js | 68 +++++- .../cluster/mixins/puma_cluster_spec.rb | 2 +- spec/lib/gitlab/git/repository_spec.rb | 49 +++- .../query_builder_spec.rb | 8 - .../strategies/record_loader_strategy_spec.rb | 10 - .../gitlab/pagination/keyset/order_spec.rb | 10 - .../emails/in_product_marketing_spec.rb | 2 +- spec/spec_helper.rb | 2 +- spec/support/capybara.rb | 3 +- spec/support/helpers/test_env.rb | 2 +- .../integrations_shared_context.rb | 2 +- .../discussion_comments_shared_example.rb | 6 +- spec/tooling/danger/project_helper_spec.rb | 7 +- spec/tooling/quality/test_level_spec.rb | 2 +- tooling/danger/analytics_instrumentation.rb | 2 +- tooling/danger/database_dictionary.rb | 2 +- tooling/danger/project_helper.rb | 3 +- .../specs/feature_category_suggestion.rb | 2 +- yarn.lock | 8 +- 84 files changed, 1126 insertions(+), 682 deletions(-) rename config/feature_flags/development/{key_set_optimizer_ignored_columns.yml => fix_new_blobs_memoization.yml} (66%) create mode 100644 doc/administration/license.md create mode 100644 doc/administration/monitoring/health_check.md create mode 100644 doc/administration/reporting/git_abuse_rate_limit.md create mode 100644 doc/administration/settings/rate_limit_on_projects_api.md create mode 100644 doc/administration/settings/rate_limit_on_users_api.md create mode 100644 doc/administration/settings/rate_limits_on_git_ssh_operations.md create mode 100644 doc/administration/settings/rate_limits_on_raw_endpoints.md create mode 100644 doc/administration/settings/scim_setup.md rename generator_templates/active_record/migration/{create_table_migration.rb => create_table_migration.rb.tt} (100%) rename generator_templates/active_record/migration/{migration.rb => migration.rb.tt} (100%) rename generator_templates/post_deployment_migration/post_deployment_migration/{migration.rb => migration.rb.tt} (100%) diff --git a/.rubocop_todo/performance/regexp_match.yml b/.rubocop_todo/performance/regexp_match.yml index c1a8036f8d1..888552f876c 100644 --- a/.rubocop_todo/performance/regexp_match.yml +++ b/.rubocop_todo/performance/regexp_match.yml @@ -72,8 +72,6 @@ Performance/RegexpMatch: - 'qa/qa/service/cluster_provider/k3d.rb' - 'qa/qa/specs/spec_helper.rb' - 'qa/qa/tools/ci/ff_changes.rb' - - 'rubocop/cop/project_path_helper.rb' - - 'rubocop/cop/qa/selector_usage.rb' - 'scripts/changed-feature-flags' - 'scripts/failed_tests.rb' - 'scripts/lib/glfm/parse_examples.rb' @@ -83,14 +81,3 @@ Performance/RegexpMatch: - 'scripts/qa/testcases-check' - 'scripts/trigger-build.rb' - 'sidekiq_cluster/cli.rb' - - 'spec/lib/gitlab/cluster/mixins/puma_cluster_spec.rb' - - 'spec/mailers/emails/in_product_marketing_spec.rb' - - 'spec/spec_helper.rb' - - 'spec/support/capybara.rb' - - 'spec/support/helpers/test_env.rb' - - 'spec/support/shared_contexts/features/integrations/integrations_shared_context.rb' - - 'spec/support/shared_examples/features/discussion_comments_shared_example.rb' - - 'spec/tooling/quality/test_level_spec.rb' - - 'tooling/danger/analytics_instrumentation.rb' - - 'tooling/danger/database_dictionary.rb' - - 'tooling/danger/specs/feature_category_suggestion.rb' diff --git a/app/assets/javascripts/api/groups_api.js b/app/assets/javascripts/api/groups_api.js index 1b216e6f721..f9edebb9141 100644 --- a/app/assets/javascripts/api/groups_api.js +++ b/app/assets/javascripts/api/groups_api.js @@ -18,10 +18,10 @@ const axiosGet = (url, query, options, callback) => { ...options, }, }) - .then(({ data }) => { + .then(({ data, headers }) => { callback(data); - return data; + return { data, headers }; }); }; diff --git a/app/assets/javascripts/frequent_items/store/mutations.js b/app/assets/javascripts/frequent_items/store/mutations.js index 65f54e6ed05..9882bef444a 100644 --- a/app/assets/javascripts/frequent_items/store/mutations.js +++ b/app/assets/javascripts/frequent_items/store/mutations.js @@ -53,7 +53,7 @@ export default { }); }, [types.RECEIVE_SEARCHED_ITEMS_SUCCESS](state, results) { - const rawItems = results.data ? results.data : results; // Api.groups returns array, Api.projects returns object + const rawItems = results.data; Object.assign(state, { items: rawItems.map((rawItem) => ({ id: rawItem.id, diff --git a/app/assets/javascripts/invite_members/components/group_select.vue b/app/assets/javascripts/invite_members/components/group_select.vue index a9f6ad15b23..1369deae3f9 100644 --- a/app/assets/javascripts/invite_members/components/group_select.vue +++ b/app/assets/javascripts/invite_members/components/group_select.vue @@ -3,6 +3,7 @@ import { GlAvatarLabeled, GlCollapsibleListbox } from '@gitlab/ui'; import { debounce } from 'lodash'; import { s__ } from '~/locale'; import { getGroups, getDescendentGroups } from '~/rest_api'; +import { normalizeHeaders, parseIntPagination } from '~/lib/utils/common_utils'; import { SEARCH_DELAY, GROUP_FILTERS } from '../constants'; export default { @@ -39,6 +40,8 @@ export default { isFetching: false, groups: [], searchTerm: '', + pagination: {}, + infiniteScrollLoading: false, }; }, computed: { @@ -48,24 +51,29 @@ export default { isFetchResultEmpty() { return this.groups.length === 0; }, + infiniteScroll() { + return Boolean(this.pagination.nextPage); + }, }, mounted() { this.retrieveGroups(); }, methods: { - retrieveGroups: debounce(function debouncedRetrieveGroups() { + retrieveGroups: debounce(async function debouncedRetrieveGroups() { this.isFetching = true; - return this.fetchGroups() - .then((response) => { - this.groups = this.processGroups(response); - this.isFetching = false; - }) - .catch(() => { - this.isFetching = false; - }); + + try { + const response = await this.fetchGroups(); + this.pagination = this.processPagination(response); + this.groups = this.processGroups(response); + } catch { + this.onApiError(); + } finally { + this.isFetching = false; + } }, SEARCH_DELAY), - processGroups(response) { - const rawGroups = response.map((group) => ({ + processGroups({ data }) { + const rawGroups = data.map((group) => ({ // `value` is needed for `GlCollapsibleListbox` value: group.id, id: group.id, @@ -76,6 +84,9 @@ export default { return this.filterOutInvalidGroups(rawGroups); }, + processPagination({ headers }) { + return parseIntPagination(normalizeHeaders(headers)); + }, filterOutInvalidGroups(groups) { return groups.filter((group) => this.invalidGroups.indexOf(group.id) === -1); }, @@ -86,23 +97,43 @@ export default { this.searchTerm = searchTerm; this.retrieveGroups(); }, - fetchGroups() { + fetchGroups(options = {}) { + const combinedOptions = { + ...this.$options.defaultFetchOptions, + ...options, + }; + switch (this.groupsFilter) { case GROUP_FILTERS.DESCENDANT_GROUPS: - return getDescendentGroups( - this.parentGroupId, - this.searchTerm, - this.$options.defaultFetchOptions, - ); + return getDescendentGroups(this.parentGroupId, this.searchTerm, combinedOptions); default: - return getGroups(this.searchTerm, this.$options.defaultFetchOptions); + return getGroups(this.searchTerm, combinedOptions); } }, + async onBottomReached() { + this.infiniteScrollLoading = true; + + try { + const response = await this.fetchGroups({ page: this.pagination.page + 1 }); + this.pagination = this.processPagination(response); + this.groups.push(...this.processGroups(response)); + } catch { + this.onApiError(); + } finally { + this.infiniteScrollLoading = false; + } + }, + onApiError() { + this.$emit('error', this.$options.i18n.errorMessage); + }, }, i18n: { dropdownText: s__('GroupSelect|Select a group'), searchPlaceholder: s__('GroupSelect|Search groups'), emptySearchResult: s__('GroupSelect|No matching results'), + errorMessage: s__( + 'GroupSelect|An error occurred fetching the groups. Please refresh the page to try again.', + ), }, defaultFetchOptions: { exclude_internal: true, @@ -125,6 +156,10 @@ export default { is-check-centered :searching="isFetching" :no-results-text="$options.i18n.emptySearchResult" + :infinite-scroll="infiniteScroll" + :infinite-scroll-loading="infiniteScrollLoading" + :total-items="pagination.total" + @bottom-reached="onBottomReached" @select="onSelect" @search="onSearch" > diff --git a/app/assets/javascripts/invite_members/components/invite_groups_modal.vue b/app/assets/javascripts/invite_members/components/invite_groups_modal.vue index 51355baef99..91dbd86418c 100644 --- a/app/assets/javascripts/invite_members/components/invite_groups_modal.vue +++ b/app/assets/javascripts/invite_members/components/invite_groups_modal.vue @@ -1,4 +1,6 @@ @@ -219,14 +214,6 @@ export default { :project-namespace="projectNamespace" /> - - {{ failedJobsCountText }} - - + + diff --git a/app/assets/javascripts/pipelines/components/pipelines_list/pipelines_artifacts.vue b/app/assets/javascripts/pipelines/components/pipelines_list/pipelines_artifacts.vue index 7d0cea67099..4452db64b0a 100644 --- a/app/assets/javascripts/pipelines/components/pipelines_list/pipelines_artifacts.vue +++ b/app/assets/javascripts/pipelines/components/pipelines_list/pipelines_artifacts.vue @@ -1,10 +1,5 @@ diff --git a/app/assets/javascripts/work_items/components/item_state.vue b/app/assets/javascripts/work_items/components/item_state.vue index 8bb8b6101d4..9053d8972de 100644 --- a/app/assets/javascripts/work_items/components/item_state.vue +++ b/app/assets/javascripts/work_items/components/item_state.vue @@ -54,7 +54,7 @@ export default { :label-for="$options.labelId" label-cols="3" label-cols-lg="2" - label-class="gl-pb-0! gl-overflow-wrap-break" + label-class="gl-pb-0! gl-overflow-wrap-break work-item-field-label" class="gl-align-items-center" > diff --git a/app/assets/javascripts/work_items/components/notes/system_note.vue b/app/assets/javascripts/work_items/components/notes/system_note.vue index 1fa217f456e..7903adea9bd 100644 --- a/app/assets/javascripts/work_items/components/notes/system_note.vue +++ b/app/assets/javascripts/work_items/components/notes/system_note.vue @@ -114,7 +114,7 @@ export default { :note-id="noteId" :is-system-note="true" > - +