diff options
Diffstat (limited to 'app')
-rw-r--r-- | app/assets/javascripts/environments/components/environment_item.vue | 40 | ||||
-rw-r--r-- | app/assets/javascripts/pages/groups/new/index.js | 3 | ||||
-rw-r--r-- | app/assets/javascripts/pages/groups/new/toggle_invite_members.js | 14 | ||||
-rw-r--r-- | app/controllers/groups_controller.rb | 15 | ||||
-rw-r--r-- | app/helpers/groups_helper.rb | 12 | ||||
-rw-r--r-- | app/models/group.rb | 2 | ||||
-rw-r--r-- | app/models/namespace_setting.rb | 5 | ||||
-rw-r--r-- | app/views/groups/_new_group_fields.html.haml | 5 | ||||
-rw-r--r-- | app/views/groups/_personalize.html.haml | 27 | ||||
-rw-r--r-- | app/views/groups/settings/_permissions.html.haml | 6 |
10 files changed, 105 insertions, 24 deletions
diff --git a/app/assets/javascripts/environments/components/environment_item.vue b/app/assets/javascripts/environments/components/environment_item.vue index 897f6ce393e..5fbd83a39a9 100644 --- a/app/assets/javascripts/environments/components/environment_item.vue +++ b/app/assets/javascripts/environments/components/environment_item.vue @@ -1,6 +1,5 @@ <script> -/* eslint-disable @gitlab/vue-require-i18n-strings */ -import { GlTooltipDirective, GlIcon, GlLink } from '@gitlab/ui'; +import { GlTooltipDirective, GlIcon, GlLink, GlSprintf } from '@gitlab/ui'; import { isEmpty } from 'lodash'; import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils'; import { __, s__, sprintf } from '~/locale'; @@ -32,6 +31,7 @@ export default { ExternalUrlComponent, GlIcon, GlLink, + GlSprintf, MonitoringButtonComponent, PinComponent, DeleteComponent, @@ -647,14 +647,17 @@ export default { </span> <span v-if="!isFolder && deploymentHasUser" class="text-break-word"> - by - <user-avatar-link - :link-href="deploymentUser.web_url" - :img-src="deploymentUser.avatar_url" - :img-alt="userImageAltDescription" - :tooltip-text="deploymentUser.username" - class="js-deploy-user-container float-none" - /> + <gl-sprintf :message="s__('Environments|by %{avatar}')"> + <template #avatar> + <user-avatar-link + :link-href="deploymentUser.web_url" + :img-src="deploymentUser.avatar_url" + :img-alt="userImageAltDescription" + :tooltip-text="deploymentUser.username" + class="js-deploy-user-container float-none" + /> + </template> + </gl-sprintf> </span> <div v-if="showNoDeployments" class="commit-title table-mobile-content"> @@ -743,13 +746,16 @@ export default { </div> <div class="gl-display-flex"> <span v-if="upcomingDeployment.user" class="text-break-word"> - by - <user-avatar-link - :link-href="upcomingDeployment.user.web_url" - :img-src="upcomingDeployment.user.avatar_url" - :img-alt="upcomingDeploymentUserImageAltDescription" - :tooltip-text="upcomingDeployment.user.username" - /> + <gl-sprintf :message="s__('Environments|by %{avatar}')"> + <template #avatar> + <user-avatar-link + :link-href="upcomingDeployment.user.web_url" + :img-src="upcomingDeployment.user.avatar_url" + :img-alt="upcomingDeploymentUserImageAltDescription" + :tooltip-text="upcomingDeployment.user.username" + /> + </template> + </gl-sprintf> </span> </div> </div> diff --git a/app/assets/javascripts/pages/groups/new/index.js b/app/assets/javascripts/pages/groups/new/index.js index 7557edb1b49..7b0418e1ad5 100644 --- a/app/assets/javascripts/pages/groups/new/index.js +++ b/app/assets/javascripts/pages/groups/new/index.js @@ -5,6 +5,7 @@ import Group from '~/group'; import { parseBoolean } from '~/lib/utils/common_utils'; import NewGroupCreationApp from './components/app.vue'; import GroupPathValidator from './group_path_validator'; +import initToggleInviteMembers from './toggle_invite_members'; new GroupPathValidator(); // eslint-disable-line no-new @@ -31,3 +32,5 @@ function initNewGroupCreation(el) { const el = document.querySelector('.js-new-group-creation'); initNewGroupCreation(el); + +initToggleInviteMembers(); diff --git a/app/assets/javascripts/pages/groups/new/toggle_invite_members.js b/app/assets/javascripts/pages/groups/new/toggle_invite_members.js new file mode 100644 index 00000000000..ffb4964cf7d --- /dev/null +++ b/app/assets/javascripts/pages/groups/new/toggle_invite_members.js @@ -0,0 +1,14 @@ +import { parseBoolean } from '~/lib/utils/common_utils'; + +export default function initToggleInviteMembers() { + const inviteMembersSection = document.querySelector('.js-invite-members-section'); + const setupForCompanyRadios = document.querySelectorAll('input[name="group[setup_for_company]"]'); + + if (inviteMembersSection && setupForCompanyRadios.length) { + setupForCompanyRadios.forEach((el) => { + el.addEventListener('change', (event) => { + inviteMembersSection.classList.toggle('hidden', !parseBoolean(event.target.value)); + }); + }); + } +} diff --git a/app/controllers/groups_controller.rb b/app/controllers/groups_controller.rb index 2796760fbe1..8a3c72ae4f8 100644 --- a/app/controllers/groups_controller.rb +++ b/app/controllers/groups_controller.rb @@ -64,6 +64,7 @@ class GroupsController < Groups::ApplicationController def new @group = Group.new(params.permit(:parent_id)) + @group.build_namespace_settings end def create @@ -269,7 +270,9 @@ class GroupsController < Groups::ApplicationController :default_branch_name, :allow_mfa_for_subgroups, :resource_access_token_creation_allowed, - :prevent_sharing_groups_outside_hierarchy + :prevent_sharing_groups_outside_hierarchy, + :setup_for_company, + :jobs_to_be_done ] end @@ -342,7 +345,15 @@ class GroupsController < Groups::ApplicationController render action: 'new' end - def successful_creation_hooks; end + def successful_creation_hooks + update_user_role_and_setup_for_company + end + + def update_user_role_and_setup_for_company + user_params = params.fetch(:user, {}).permit(:role) + user_params[:setup_for_company] = @group.setup_for_company if !@group.setup_for_company.nil? && current_user.setup_for_company.nil? + Users::UpdateService.new(current_user, user_params.merge(user: current_user)).execute if user_params.present? + end def groups if @group.supports_events? diff --git a/app/helpers/groups_helper.rb b/app/helpers/groups_helper.rb index 0fdb8b07260..0d9f57e199b 100644 --- a/app/helpers/groups_helper.rb +++ b/app/helpers/groups_helper.rb @@ -219,6 +219,18 @@ module GroupsHelper def group_url_error_message s_('GroupSettings|Please choose a group URL with no special characters or spaces.') end + + # Maps `jobs_to_be_done` values to option texts + def localized_jobs_to_be_done_choices + { + basics: _('I want to learn the basics of Git'), + move_repository: _('I want to move my repository to GitLab from somewhere else'), + code_storage: _('I want to store my code'), + exploring: _('I want to explore GitLab to see if it’s worth switching to'), + ci: _('I want to use GitLab CI with my existing repository'), + other: _('A different reason') + }.with_indifferent_access.freeze + end end GroupsHelper.prepend_mod_with('GroupsHelper') diff --git a/app/models/group.rb b/app/models/group.rb index ce19857dad6..4ded7174619 100644 --- a/app/models/group.rb +++ b/app/models/group.rb @@ -81,7 +81,7 @@ class Group < Namespace # debian_distributions and associated component_files must be destroyed by ruby code in order to properly remove carrierwave uploads has_many :debian_distributions, class_name: 'Packages::Debian::GroupDistribution', dependent: :destroy # rubocop:disable Cop/ActiveRecordDependent - delegate :prevent_sharing_groups_outside_hierarchy, :new_user_signups_cap, to: :namespace_settings + delegate :prevent_sharing_groups_outside_hierarchy, :new_user_signups_cap, :setup_for_company, :jobs_to_be_done, to: :namespace_settings accepts_nested_attributes_for :variables, allow_destroy: true diff --git a/app/models/namespace_setting.rb b/app/models/namespace_setting.rb index 4a39bfebda0..08228b56f25 100644 --- a/app/models/namespace_setting.rb +++ b/app/models/namespace_setting.rb @@ -16,9 +16,12 @@ class NamespaceSetting < ApplicationRecord before_validation :normalize_default_branch_name + enum jobs_to_be_done: { basics: 0, move_repository: 1, code_storage: 2, exploring: 3, ci: 4, other: 5 }, _suffix: true + NAMESPACE_SETTINGS_PARAMS = [:default_branch_name, :delayed_project_removal, :lock_delayed_project_removal, :resource_access_token_creation_allowed, - :prevent_sharing_groups_outside_hierarchy, :new_user_signups_cap].freeze + :prevent_sharing_groups_outside_hierarchy, :new_user_signups_cap, + :setup_for_company, :jobs_to_be_done].freeze self.primary_key = :namespace_id diff --git a/app/views/groups/_new_group_fields.html.haml b/app/views/groups/_new_group_fields.html.haml index 49c8c2700ce..8ee7c91a938 100644 --- a/app/views/groups/_new_group_fields.html.haml +++ b/app/views/groups/_new_group_fields.html.haml @@ -13,7 +13,10 @@ - if Gitlab.config.mattermost.enabled .row = render 'create_chat_team', f: f -.row + += render 'personalize', f: f + +.row.js-invite-members-section .col-sm-4 = render_if_exists 'shared/groups/invite_members' diff --git a/app/views/groups/_personalize.html.haml b/app/views/groups/_personalize.html.haml new file mode 100644 index 00000000000..5ecb0017cd8 --- /dev/null +++ b/app/views/groups/_personalize.html.haml @@ -0,0 +1,27 @@ +.row + .form-group.col-sm-12.gl-mb-0 + %label.label-bold + = _('Now, personalize your GitLab experience') + %p + = _("We'll use this to help surface the right features and information to you.") + +.row + .form-group.col-sm-4 + = label :user, :role, _('Role') + = select :user, :role, ::User.roles.keys.map { |role| [role.titleize, role] }, { selected: @current_user.role }, class: 'form-control' + +.row + .form-group.col-sm-4 + = f.label :setup_for_company, _('Who will be using this group?') + .gl-display-flex.gl-flex-direction-column.gl-lg-flex-direction-row + .gl-flex-grow-1.gl-display-flex.gl-align-items-center + = f.radio_button :setup_for_company, true, checked: true + = f.label :setup_for_company, _('My company or team'), class: 'gl-font-weight-normal gl-mb-0 gl-ml-2', value: 'true' + .gl-flex-grow-1.gl-display-flex.gl-align-items-center + = f.radio_button :setup_for_company, false + = f.label :setup_for_company, _('Just me'), class: 'gl-font-weight-normal gl-mb-0 gl-ml-2', value: 'false' + +.row + .form-group.col-sm-4 + = f.label :jobs_to_be_done, _("What will you use this group for?") + = f.select :jobs_to_be_done, ::NamespaceSetting.jobs_to_be_dones.keys.map { |job_to_be_done| [localized_jobs_to_be_done_choices[job_to_be_done], job_to_be_done] }, { include_blank: true }, class: 'form-control' diff --git a/app/views/groups/settings/_permissions.html.haml b/app/views/groups/settings/_permissions.html.haml index 683e70248b6..ee84da96ec2 100644 --- a/app/views/groups/settings/_permissions.html.haml +++ b/app/views/groups/settings/_permissions.html.haml @@ -4,8 +4,9 @@ %fieldset %h5= _('Permissions') - .form-group - = render 'shared/allow_request_access', form: f + - unless ::Feature.enabled?(:saas_user_caps) + .form-group + = render 'shared/allow_request_access', form: f - if @group.root? .form-group.gl-mb-3 @@ -43,5 +44,6 @@ = render_if_exists 'groups/settings/prevent_forking', f: f, group: @group = render 'groups/settings/two_factor_auth', f: f, group: @group = render_if_exists 'groups/personal_access_token_expiration_policy', f: f, group: @group + = render_if_exists 'groups/settings/membership', f: f = render_if_exists 'groups/member_lock_setting', f: f, group: @group = f.submit _('Save changes'), class: 'btn gl-button btn-confirm gl-mt-3 js-dirty-submit', data: { qa_selector: 'save_permissions_changes_button' } |