From a4068557f4e8f0622798ccf824ac314e2008a57b Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Wed, 27 Jul 2022 12:10:44 +0000 Subject: [PATCH] Add latest changes from gitlab-org/gitlab@master --- .../groups/components/group_name_and_path.vue | 215 ++++++-- .../javascripts/groups/create_edit_form.js | 10 +- ...re_user_can_create_subgroups.query.graphql | 11 + .../pages/groups/new/components/app.vue | 73 ++- .../create_group_description_details.vue | 56 +- .../javascripts/pages/groups/new/index.js | 11 +- .../components/extensions/telemetry.js | 30 ++ .../extensions/accessibility/index.js | 1 - .../components/user_popover/user_popover.vue | 12 + .../new_namespace/new_namespace_page.vue | 2 +- .../pajamas/button_component.html.haml | 9 +- app/components/pajamas/button_component.rb | 8 +- app/graphql/mutations/ci/pipeline/cancel.rb | 1 - app/helpers/groups_helper.rb | 15 +- app/helpers/nav/new_dropdown_helper.rb | 2 +- app/mailers/emails/admin_notification.rb | 20 +- app/views/admin/groups/_form.html.haml | 2 +- app/views/groups/_home_panel.html.haml | 5 +- app/views/groups/_new_group_fields.html.haml | 45 +- app/views/groups/new.html.haml | 3 +- .../_google_tag_manager_head.html.haml | 19 + .../notify/user_auto_banned_email.html.haml | 9 - .../notify/user_auto_banned_email.text.erb | 7 - app/views/shared/_group_form.html.haml | 6 - .../_group_name_and_path_fields.html.haml | 3 +- app/views/shared/milestones/_header.html.haml | 4 +- app/views/users/show.html.haml | 10 +- ...le_existing_runner_versions_cron_worker.rb | 16 +- config/gitlab.yml.example | 2 +- config/initializers/1_settings.rb | 2 +- .../dast/browser_based.md | 53 +- doc/user/project/insights/index.md | 174 +++--- locale/gitlab.pot | 24 +- package.json | 4 +- qa/qa/page/group/new.rb | 6 +- qa/qa/page/project/settings/integrations.rb | 7 +- qa/qa/resource/group.rb | 4 +- .../pajamas/button_component_spec.rb | 54 +- spec/features/groups/show_spec.rb | 2 +- spec/features/groups_spec.rb | 54 +- .../projects/pipelines/pipeline_spec.rb | 2 +- spec/features/users/show_spec.rb | 10 +- .../components/group_name_and_path_spec.js | 75 ++- .../pages/groups/new/components/app_spec.js | 39 ++ .../create_group_description_details_spec.js | 57 ++ .../user_popover/user_popover_spec.js | 17 + spec/helpers/groups_helper_spec.rb | 43 +- spec/helpers/nav/new_dropdown_helper_spec.rb | 2 +- .../mailers/emails/admin_notification_spec.rb | 64 --- .../mutations/ci/pipeline_cancel_spec.rb | 2 +- spec/requests/api/issue_links_spec.rb | 25 +- .../layouts/header/_new_dropdown.haml_spec.rb | 5 +- ...isting_runner_versions_cron_worker_spec.rb | 44 ++ tests.yml | 4 + yarn.lock | 502 +++--------------- 55 files changed, 1055 insertions(+), 827 deletions(-) create mode 100644 app/assets/javascripts/groups/queries/search_groups_where_user_can_create_subgroups.query.graphql delete mode 100644 app/views/notify/user_auto_banned_email.html.haml delete mode 100644 app/views/notify/user_auto_banned_email.text.erb delete mode 100644 app/views/shared/_group_form.html.haml create mode 100644 spec/frontend/pages/groups/new/components/app_spec.js create mode 100644 spec/frontend/pages/groups/new/components/create_group_description_details_spec.js create mode 100644 spec/workers/ci/runners/reconcile_existing_runner_versions_cron_worker_spec.rb diff --git a/app/assets/javascripts/groups/components/group_name_and_path.vue b/app/assets/javascripts/groups/components/group_name_and_path.vue index 983535d3e9c..9a1ea2f1812 100644 --- a/app/assets/javascripts/groups/components/group_name_and_path.vue +++ b/app/assets/javascripts/groups/components/group_name_and_path.vue @@ -6,6 +6,13 @@ import { GlInputGroupText, GlLink, GlAlert, + GlButton, + GlButtonGroup, + GlDropdown, + GlDropdownItem, + GlDropdownText, + GlTruncate, + GlSearchBoxByType, } from '@gitlab/ui'; import { debounce } from 'lodash'; @@ -15,6 +22,11 @@ import { createAlert } from '~/flash'; import { slugify } from '~/lib/utils/text_utility'; import axios from '~/lib/utils/axios_utils'; import { helpPagePath } from '~/helpers/help_page_helper'; +import { getIdFromGraphQLId } from '~/graphql_shared/utils'; +import { MINIMUM_SEARCH_LENGTH } from '~/graphql_shared/constants'; +import { DEBOUNCE_DELAY } from '~/vue_shared/components/filtered_search_bar/constants'; + +import searchGroupsWhereUserCanCreateSubgroups from '../queries/search_groups_where_user_can_create_subgroups.query.graphql'; const DEBOUNCE_DURATION = 1000; @@ -22,7 +34,6 @@ export default { i18n: { inputs: { name: { - label: s__('Groups|Group name'), placeholder: __('My awesome group'), description: s__( 'Groups|Must start with letter, digit, emoji, or underscore. Can also contain periods, dashes, spaces, and parentheses.', @@ -30,7 +41,6 @@ export default { invalidFeedback: s__('Groups|Enter a descriptive name for your group.'), }, path: { - label: s__('Groups|Group URL'), placeholder: __('my-awesome-group'), invalidFeedbackInvalidPattern: s__( 'GroupSettings|Choose a group path that does not start with a dash or end with a period. It can also contain alphanumeric characters and underscores.', @@ -40,9 +50,6 @@ export default { ), validFeedback: s__('Groups|Group path is available.'), }, - groupId: { - label: s__('Groups|Group ID'), - }, }, apiLoadingMessage: s__('Groups|Checking group URL availability...'), apiErrorMessage: __( @@ -51,7 +58,7 @@ export default { changingUrlWarningMessage: s__('Groups|Changing group URL can have unintended side effects.'), learnMore: s__('Groups|Learn more'), }, - nameInputSize: { md: 'lg' }, + inputSize: { md: 'lg' }, changingGroupPathHelpPagePath: helpPagePath('user/group/index', { anchor: 'change-a-groups-path', }), @@ -63,8 +70,35 @@ export default { GlInputGroupText, GlLink, GlAlert, + GlButton, + GlButtonGroup, + GlDropdown, + GlDropdownItem, + GlDropdownText, + GlTruncate, + GlSearchBoxByType, }, - inject: ['fields', 'basePath', 'mattermostEnabled'], + apollo: { + currentUserGroups: { + query: searchGroupsWhereUserCanCreateSubgroups, + variables() { + return { + search: this.search, + }; + }, + update(data) { + return data.currentUser?.groups?.nodes || []; + }, + skip() { + const hasNotEnoughSearchCharacters = + this.search.length > 0 && this.search.length < MINIMUM_SEARCH_LENGTH; + + return this.shouldSkipQuery || hasNotEnoughSearchCharacters; + }, + debounce: DEBOUNCE_DELAY, + }, + }, + inject: ['fields', 'basePath', 'newSubgroup', 'mattermostEnabled'], data() { return { name: this.fields.name.value, @@ -76,9 +110,27 @@ export default { pathFeedbackState: null, pathInvalidFeedback: null, activeApiRequestAbortController: null, + search: '', + currentUserGroups: {}, + shouldSkipQuery: true, + selectedGroup: { + id: this.fields.parentId.value, + fullPath: this.fields.parentFullPath.value, + }, }; }, computed: { + inputLabels() { + return { + name: this.newSubgroup ? s__('Groups|Subgroup name') : s__('Groups|Group name'), + path: this.newSubgroup ? s__('Groups|Subgroup slug') : s__('Groups|Group URL'), + subgroupPath: s__('Groups|Subgroup URL'), + groupId: s__('Groups|Group ID'), + }; + }, + pathInputSize() { + return this.newSubgroup ? {} : this.$options.inputSize; + }, computedPath() { return this.apiSuggestedPath || this.path; }, @@ -129,9 +181,11 @@ export default { try { const { data: { exists, suggests }, - } = await getGroupPathAvailability(this.path, this.fields.parentId?.value, { - signal: this.activeApiRequestAbortController.signal, - }); + } = await getGroupPathAvailability( + this.path, + this.selectedGroup.id || this.fields.parentId.value, + { signal: this.activeApiRequestAbortController.signal }, + ); this.apiLoading = false; @@ -198,6 +252,21 @@ export default { this.pathInvalidFeedback = this.$options.i18n.inputs.path.invalidFeedbackInvalidPattern; this.pathFeedbackState = false; }, + handleDropdownShown() { + if (this.shouldSkipQuery) { + this.shouldSkipQuery = false; + } + + this.$refs.search.focusInput(); + }, + handleDropdownItemClick({ id, fullPath }) { + this.selectedGroup = { + id: getIdFromGraphQLId(id), + fullPath, + }; + + this.debouncedValidatePath(); + }, }, }; @@ -208,10 +277,10 @@ export default { :id="fields.parentId.id" type="hidden" :name="fields.parentId.name" - :value="fields.parentId.value" + :value="selectedGroup.id" /> - - - - - - + +
+ +
+ + + {{ basePath }} + + + + + + + + + + + +
+ / +
+
+
+ + + + + + + +
+