diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2022-07-27 21:12:02 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2022-07-27 21:12:02 +0300 |
commit | 3b060a68f3ca685d0676c2a70e3471dc7ee19d6e (patch) | |
tree | 5a3f06014de88fd4564e4f5eb7e6a2ecb1d9e7ce /app | |
parent | 2977cf67ec27f8ab014bfee852d0ae7b56585242 (diff) |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'app')
25 files changed, 163 insertions, 78 deletions
diff --git a/app/assets/javascripts/access_tokens/components/expires_at_field.vue b/app/assets/javascripts/access_tokens/components/expires_at_field.vue index 147de529eea..5516fd0daf6 100644 --- a/app/assets/javascripts/access_tokens/components/expires_at_field.vue +++ b/app/assets/javascripts/access_tokens/components/expires_at_field.vue @@ -1,7 +1,8 @@ <script> -import { GlDatepicker, GlFormInput, GlFormGroup } from '@gitlab/ui'; +import { GlDatepicker, GlFormGroup } from '@gitlab/ui'; import { __ } from '~/locale'; +import { getDateInFuture } from '~/lib/utils/datetime_utility'; export default { name: 'ExpiresAtField', @@ -10,7 +11,6 @@ export default { }, components: { GlDatepicker, - GlFormInput, GlFormGroup, MaxExpirationDateMessage: () => import('ee_component/access_tokens/components/max_expiration_date_message.vue'), @@ -32,20 +32,28 @@ export default { default: () => null, }, }, + computed: { + in30Days() { + const today = new Date(); + return getDateInFuture(today, 30); + }, + }, }; </script> <template> <gl-form-group :label="$options.i18n.label" :label-for="inputAttrs.id"> - <gl-datepicker :target="null" :min-date="minDate" :max-date="maxDate"> - <gl-form-input - v-bind="inputAttrs" - class="datepicker gl-datepicker-input" - autocomplete="off" - inputmode="none" - data-qa-selector="expiry_date_field" - /> - </gl-datepicker> + <gl-datepicker + :target="null" + :min-date="minDate" + :max-date="maxDate" + :default-date="in30Days" + show-clear-button + :input-name="inputAttrs.name" + :input-id="inputAttrs.id" + :placeholder="inputAttrs.placeholder" + data-qa-selector="expiry_date_field" + /> <template #description> <max-expiration-date-message :max-date="maxDate" /> </template> diff --git a/app/assets/javascripts/lib/utils/url_utility.js b/app/assets/javascripts/lib/utils/url_utility.js index ff60fd2aecb..597fa49120b 100644 --- a/app/assets/javascripts/lib/utils/url_utility.js +++ b/app/assets/javascripts/lib/utils/url_utility.js @@ -397,6 +397,7 @@ export function relativePathToAbsolute(path, basePath) { const absolute = isAbsolute(basePath); const base = absolute ? basePath : `file:///${basePath}`; const url = new URL(path, base); + url.pathname = url.pathname.replace(/\/\/+/g, '/'); return absolute ? url.href : decodeURIComponent(url.pathname); } diff --git a/app/assets/javascripts/packages_and_registries/package_registry/pages/details.vue b/app/assets/javascripts/packages_and_registries/package_registry/pages/details.vue index 29438fba86b..bae6a510993 100644 --- a/app/assets/javascripts/packages_and_registries/package_registry/pages/details.vue +++ b/app/assets/javascripts/packages_and_registries/package_registry/pages/details.vue @@ -208,8 +208,12 @@ export default { }, handleFileDelete(file) { this.track(REQUEST_DELETE_PACKAGE_FILE_TRACKING_ACTION); - this.fileToDelete = { ...file }; - this.$refs.deleteFileModal.show(); + if (this.packageFiles.length === 1) { + this.$refs.deleteModal.show(); + } else { + this.fileToDelete = { ...file }; + this.$refs.deleteFileModal.show(); + } }, confirmFileDelete() { this.track(DELETE_PACKAGE_FILE_TRACKING_ACTION); diff --git a/app/assets/javascripts/runner/components/runner_detail.vue b/app/assets/javascripts/runner/components/runner_detail.vue index db67acef3db..584f77b7648 100644 --- a/app/assets/javascripts/runner/components/runner_detail.vue +++ b/app/assets/javascripts/runner/components/runner_detail.vue @@ -38,11 +38,10 @@ export default { </script> <template> - <div class="gl-display-flex gl-pb-4"> - <dt class="gl-mr-2">{{ label }}</dt> - <dd class="gl-mb-0"> - <!-- eslint-disable-next-line @gitlab/vue-prefer-dollar-scopedslots --> - <template v-if="value || $slots.value"> + <div class="gl-display-contents"> + <dt class="gl-mb-5 gl-mr-6 gl-max-w-26">{{ label }}</dt> + <dd class="gl-mb-5"> + <template v-if="value || $scopedSlots.value"> <slot name="value">{{ value }}</slot> </template> <span v-else class="gl-text-gray-500">{{ emptyValue }}</span> diff --git a/app/assets/javascripts/runner/components/runner_details.vue b/app/assets/javascripts/runner/components/runner_details.vue index 60469d26dd5..d5222f39b81 100644 --- a/app/assets/javascripts/runner/components/runner_details.vue +++ b/app/assets/javascripts/runner/components/runner_details.vue @@ -51,6 +51,9 @@ export default { } return null; }, + tagList() { + return this.runner.tagList || []; + }, isGroupRunner() { return this.runner?.runnerType === GROUP_TYPE; }, @@ -66,14 +69,17 @@ export default { <div> <runner-upgrade-status-alert class="gl-my-4" :runner="runner" /> <div class="gl-pt-4"> - <dl class="gl-mb-0" data-testid="runner-details-list"> + <dl + class="gl-mb-0 gl-display-grid runner-details-grid-template" + data-testid="runner-details-list" + > <runner-detail :label="s__('Runners|Description')" :value="runner.description" /> <runner-detail :label="s__('Runners|Last contact')" :empty-value="s__('Runners|Never contacted')" > - <template #value> - <time-ago v-if="runner.contactedAt" :time="runner.contactedAt" /> + <template v-if="runner.contactedAt" #value> + <time-ago :time="runner.contactedAt" /> </template> </runner-detail> <runner-detail :label="s__('Runners|Version')"> @@ -87,8 +93,8 @@ export default { <runner-detail :label="s__('Runners|Architecture')" :value="runner.architectureName" /> <runner-detail :label="s__('Runners|Platform')" :value="runner.platformName" /> <runner-detail :label="s__('Runners|Configuration')"> - <template #value> - <gl-intersperse v-if="configTextProtected || configTextUntagged"> + <template v-if="configTextProtected || configTextUntagged" #value> + <gl-intersperse> <span v-if="configTextProtected">{{ configTextProtected }}</span> <span v-if="configTextUntagged">{{ configTextUntagged }}</span> </gl-intersperse> @@ -96,13 +102,8 @@ export default { </runner-detail> <runner-detail :label="s__('Runners|Maximum job timeout')" :value="maximumTimeout" /> <runner-detail :label="s__('Runners|Tags')"> - <template #value> - <runner-tags - v-if="runner.tagList && runner.tagList.length" - class="gl-vertical-align-middle" - :tag-list="runner.tagList" - size="sm" - /> + <template v-if="tagList.length" #value> + <runner-tags class="gl-vertical-align-middle" :tag-list="tagList" size="sm" /> </template> </runner-detail> diff --git a/app/assets/javascripts/sidebar/components/assignees/sidebar_assignees_widget.vue b/app/assets/javascripts/sidebar/components/assignees/sidebar_assignees_widget.vue index 14f6c9d3a15..5c432ca0e03 100644 --- a/app/assets/javascripts/sidebar/components/assignees/sidebar_assignees_widget.vue +++ b/app/assets/javascripts/sidebar/components/assignees/sidebar_assignees_widget.vue @@ -149,6 +149,9 @@ export default { signedIn() { return this.currentUser.username !== undefined; }, + issuableAuthor() { + return this.issuable?.author; + }, }, watch: { iid(_, oldIid) { @@ -266,6 +269,7 @@ export default { :current-user="currentUser" :issuable-type="issuableType" :is-editing="edit" + :issuable-author="issuableAuthor" class="gl-w-full dropdown-menu-user gl-mt-n3" @toggle="collapseWidget" @error="showError" diff --git a/app/assets/javascripts/sidebar/components/assignees/sidebar_participant.vue b/app/assets/javascripts/sidebar/components/assignees/sidebar_participant.vue index e9c68008143..0ed40f56bea 100644 --- a/app/assets/javascripts/sidebar/components/assignees/sidebar_participant.vue +++ b/app/assets/javascripts/sidebar/components/assignees/sidebar_participant.vue @@ -1,5 +1,5 @@ <script> -import { GlAvatarLabeled, GlAvatarLink, GlIcon } from '@gitlab/ui'; +import { GlAvatarLabeled, GlIcon } from '@gitlab/ui'; import { IssuableType } from '~/issues/constants'; import { s__, sprintf } from '~/locale'; @@ -11,7 +11,6 @@ const AVAILABILITY_STATUS = { export default { components: { GlAvatarLabeled, - GlAvatarLink, GlIcon, }, props: { @@ -47,23 +46,21 @@ export default { </script> <template> - <gl-avatar-link> - <gl-avatar-labeled - :size="32" - :label="userLabel" - :sub-label="`@${user.username}`" - :src="user.avatarUrl || user.avatar || user.avatar_url" - class="gl-align-items-center gl-relative" - > - <template #meta> - <gl-icon - v-if="hasCannotMergeIcon" - name="warning-solid" - aria-hidden="true" - class="merge-icon" - :size="12" - /> - </template> - </gl-avatar-labeled> - </gl-avatar-link> + <gl-avatar-labeled + :size="32" + :label="userLabel" + :sub-label="`@${user.username}`" + :src="user.avatarUrl || user.avatar || user.avatar_url" + class="gl-align-items-center gl-relative sidebar-participant" + > + <template #meta> + <gl-icon + v-if="hasCannotMergeIcon" + name="warning-solid" + aria-hidden="true" + class="merge-icon gl-left-6 gl-bottom-0" + :size="12" + /> + </template> + </gl-avatar-labeled> </template> diff --git a/app/assets/javascripts/vue_shared/components/sidebar/queries/get_issue_assignees.query.graphql b/app/assets/javascripts/vue_shared/components/sidebar/queries/get_issue_assignees.query.graphql index be270e440ed..10e6daa1f50 100644 --- a/app/assets/javascripts/vue_shared/components/sidebar/queries/get_issue_assignees.query.graphql +++ b/app/assets/javascripts/vue_shared/components/sidebar/queries/get_issue_assignees.query.graphql @@ -8,6 +8,10 @@ query issueAssignees($fullPath: ID!, $iid: String!) { issuable: issue(iid: $iid) { __typename id + author { + ...User + ...UserAvailability + } assignees { nodes { ...User diff --git a/app/assets/javascripts/vue_shared/components/sidebar/queries/get_mr_assignees.query.graphql b/app/assets/javascripts/vue_shared/components/sidebar/queries/get_mr_assignees.query.graphql index 7127940bb05..f70cd723f2e 100644 --- a/app/assets/javascripts/vue_shared/components/sidebar/queries/get_mr_assignees.query.graphql +++ b/app/assets/javascripts/vue_shared/components/sidebar/queries/get_mr_assignees.query.graphql @@ -6,6 +6,13 @@ query getMrAssignees($fullPath: ID!, $iid: String!) { id issuable: mergeRequest(iid: $iid) { id + author { + ...User + ...UserAvailability + mergeRequestInteraction { + canMerge + } + } assignees { nodes { ...User diff --git a/app/assets/javascripts/vue_shared/components/user_select/user_select.vue b/app/assets/javascripts/vue_shared/components/user_select/user_select.vue index 91f20863089..43a590c2367 100644 --- a/app/assets/javascripts/vue_shared/components/user_select/user_select.vue +++ b/app/assets/javascripts/vue_shared/components/user_select/user_select.vue @@ -77,6 +77,11 @@ export default { required: false, default: null, }, + issuableAuthor: { + type: Object, + required: false, + default: null, + }, }, data() { return { @@ -178,7 +183,7 @@ export default { [], ); - return this.moveCurrentUserToStart(mergedSearchResults); + return this.moveCurrentUserAndAuthorToStart(mergedSearchResults); }, isSearchEmpty() { return this.search === ''; @@ -196,14 +201,21 @@ export default { showCurrentUser() { return this.currentUser.username && !this.isCurrentUserInList && this.isSearchEmpty; }, + showAuthor() { + return ( + this.issuableAuthor && + !this.users.some((user) => user.id === this.issuableAuthor.id) && + this.isSearchEmpty + ); + }, selectedFiltered() { if (this.shouldShowParticipants) { - return this.moveCurrentUserToStart(this.value); + return this.moveCurrentUserAndAuthorToStart(this.value); } const foundUsernames = this.users.map(({ username }) => username); const filtered = this.value.filter(({ username }) => foundUsernames.includes(username)); - return this.moveCurrentUserToStart(filtered); + return this.moveCurrentUserAndAuthorToStart(filtered); }, selectedUserNames() { return this.value.map(({ username }) => username); @@ -254,20 +266,22 @@ export default { showDivider(list) { return list.length > 0 && this.isSearchEmpty; }, - moveCurrentUserToStart(users) { - if (!users) { - return []; + moveCurrentUserAndAuthorToStart(users = []) { + let sortedUsers = [...users]; + + const author = sortedUsers.find((user) => user.id === this.issuableAuthor?.id); + if (author) { + sortedUsers = [author, ...sortedUsers.filter((user) => user.id !== author.id)]; } - const usersCopy = [...users]; - const currentUser = usersCopy.find((user) => user.username === this.currentUser.username); + + const currentUser = sortedUsers.find((user) => user.username === this.currentUser.username); if (currentUser) { currentUser.canMerge = this.currentUser.canMerge; - const index = usersCopy.indexOf(currentUser); - usersCopy.splice(0, 0, usersCopy.splice(index, 1)[0]); + sortedUsers = [currentUser, ...sortedUsers.filter((user) => user.id !== currentUser.id)]; } - return usersCopy; + return sortedUsers; }, setSearchKey(value) { this.search = value.trim(); @@ -298,7 +312,7 @@ export default { <gl-loading-icon v-if="isLoading" data-testid="loading-participants" - size="lg" + size="md" class="gl-absolute gl-left-0 gl-top-0 gl-right-0" /> <template v-else> @@ -312,8 +326,8 @@ export default { > <span :class="selectedIsEmpty ? 'gl-pl-0' : 'gl-pl-6'" class="gl-font-weight-bold">{{ $options.i18n.unassigned - }}</span></gl-dropdown-item - > + }}</span> + </gl-dropdown-item> </template> <gl-dropdown-divider v-if="showDivider(selectedFiltered)" /> <gl-dropdown-item @@ -342,7 +356,17 @@ export default { /> </gl-dropdown-item> </template> - <gl-dropdown-divider v-if="showDivider(unselectedFiltered)" /> + <gl-dropdown-item + v-if="showAuthor" + data-testid="issuable-author" + @click.native.capture.stop="selectAssignee(issuableAuthor)" + > + <sidebar-participant + :user="issuableAuthor" + :issuable-type="issuableType" + class="gl-pl-6!" + /> + </gl-dropdown-item> <gl-dropdown-item v-for="unselectedUser in unselectedFiltered" :key="unselectedUser.id" diff --git a/app/assets/stylesheets/framework/dropdowns.scss b/app/assets/stylesheets/framework/dropdowns.scss index 43e14a63f9d..62662ec8b74 100644 --- a/app/assets/stylesheets/framework/dropdowns.scss +++ b/app/assets/stylesheets/framework/dropdowns.scss @@ -477,6 +477,12 @@ height: 2 * $gl-padding; margin: 0 10px 0 0; } + + .sidebar-participant { + .merge-icon { + top: calc(50% + 5px); + } + } } .dropdown-menu-user-full-name { diff --git a/app/assets/stylesheets/page_bundles/runner_details.scss b/app/assets/stylesheets/page_bundles/runner_details.scss new file mode 100644 index 00000000000..6e5580a18e4 --- /dev/null +++ b/app/assets/stylesheets/page_bundles/runner_details.scss @@ -0,0 +1,3 @@ +.runner-details-grid-template { + grid-template-columns: auto 1fr; +} diff --git a/app/finders/ci/runners_finder.rb b/app/finders/ci/runners_finder.rb index 4f9244d9825..774947a35b7 100644 --- a/app/finders/ci/runners_finder.rb +++ b/app/finders/ci/runners_finder.rb @@ -69,10 +69,15 @@ module Ci end def filter_by_upgrade_status! - return unless @params.key?(:upgrade_status) - return unless Ci::RunnerVersion.statuses.key?(@params[:upgrade_status]) + upgrade_status = @params[:upgrade_status] - @runners = @runners.with_upgrade_status(@params[:upgrade_status]) + return unless upgrade_status + + unless Ci::RunnerVersion.statuses.key?(upgrade_status) + raise ArgumentError, "Invalid upgrade status value '#{upgrade_status}'" + end + + @runners = @runners.with_upgrade_status(upgrade_status) end def filter_by_runner_type! diff --git a/app/models/ci/runner_version.rb b/app/models/ci/runner_version.rb index 6b2d0060c9b..bbde98ee591 100644 --- a/app/models/ci/runner_version.rb +++ b/app/models/ci/runner_version.rb @@ -8,7 +8,6 @@ module Ci enum_with_nil status: { not_processed: nil, invalid_version: -1, - unknown: 0, not_available: 1, available: 2, recommended: 3 @@ -16,7 +15,6 @@ module Ci STATUS_DESCRIPTIONS = { invalid_version: 'Runner version is not valid.', - unknown: 'Upgrade status is unknown.', not_available: 'Upgrade is not available for the runner.', available: 'Upgrade is available for the runner.', recommended: 'Upgrade is available and recommended for the runner.' @@ -27,7 +25,7 @@ module Ci # This scope returns all versions that might need recalculating. For instance, once a version is considered # :recommended, it normally doesn't change status even if the instance is upgraded - scope :potentially_outdated, -> { where(status: [nil, :not_available, :available, :unknown]) } + scope :potentially_outdated, -> { where(status: [nil, :not_available, :available]) } validates :version, length: { maximum: 2048 } end diff --git a/app/models/integrations/external_wiki.rb b/app/models/integrations/external_wiki.rb index bc2ea193a84..75fe6b6f164 100644 --- a/app/models/integrations/external_wiki.rb +++ b/app/models/integrations/external_wiki.rb @@ -5,6 +5,7 @@ module Integrations validates :external_wiki_url, presence: true, public_url: true, if: :activated? field :external_wiki_url, + section: SECTION_TYPE_CONNECTION, title: -> { s_('ExternalWikiService|External wiki URL') }, placeholder: -> { s_('ExternalWikiService|https://example.com/xxx/wiki/...') }, help: -> { s_('ExternalWikiService|Enter the URL to the external wiki.') }, @@ -28,6 +29,16 @@ module Integrations s_('Link an external wiki from the project\'s sidebar. %{docs_link}').html_safe % { docs_link: docs_link.html_safe } end + def sections + [ + { + type: SECTION_TYPE_CONNECTION, + title: s_('Integrations|Connection details'), + description: help + } + ] + end + def execute(_data) response = Gitlab::HTTP.get(properties['external_wiki_url'], verify: true) response.body if response.code == 200 diff --git a/app/models/member.rb b/app/models/member.rb index dcca63b5691..0e0f0988dbd 100644 --- a/app/models/member.rb +++ b/app/models/member.rb @@ -28,6 +28,7 @@ class Member < ApplicationRecord belongs_to :user belongs_to :source, polymorphic: true # rubocop:disable Cop/PolymorphicAssociations belongs_to :member_namespace, inverse_of: :namespace_members, foreign_key: 'member_namespace_id', class_name: 'Namespace' + belongs_to :member_role has_one :member_task delegate :name, :username, :email, :last_activity_on, to: :user, prefix: true diff --git a/app/models/members/member_role.rb b/app/models/members/member_role.rb new file mode 100644 index 00000000000..2e8532fa739 --- /dev/null +++ b/app/models/members/member_role.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +class MemberRole < ApplicationRecord # rubocop:disable Gitlab/NamespacedClass + has_many :members + belongs_to :namespace + + validates :namespace_id, presence: true + validates :base_access_level, presence: true +end diff --git a/app/models/namespace.rb b/app/models/namespace.rb index f23a859b119..fc09eb2da16 100644 --- a/app/models/namespace.rb +++ b/app/models/namespace.rb @@ -49,6 +49,7 @@ class Namespace < ApplicationRecord has_one :namespace_statistics has_one :namespace_route, foreign_key: :namespace_id, autosave: false, inverse_of: :namespace, class_name: 'Route' has_many :namespace_members, foreign_key: :member_namespace_id, inverse_of: :member_namespace, class_name: 'Member' + has_many :member_roles has_many :runner_namespaces, inverse_of: :namespace, class_name: 'Ci::RunnerNamespace' has_many :runners, through: :runner_namespaces, source: :runner, class_name: 'Ci::Runner' diff --git a/app/services/incident_management/timeline_events/update_service.rb b/app/services/incident_management/timeline_events/update_service.rb index 8217c8125c2..5c5de4717bc 100644 --- a/app/services/incident_management/timeline_events/update_service.rb +++ b/app/services/incident_management/timeline_events/update_service.rb @@ -34,7 +34,7 @@ module IncidentManagement attr_reader :timeline_event, :incident, :user, :note, :occurred_at def update_params - { updated_by_user: user, note: note.presence, occurred_at: occurred_at.presence }.compact + { updated_by_user: user, note: note, occurred_at: occurred_at }.compact end def add_system_note(timeline_event) diff --git a/app/views/admin/dashboard/index.html.haml b/app/views/admin/dashboard/index.html.haml index 88fbbb28201..271f89a6b08 100644 --- a/app/views/admin/dashboard/index.html.haml +++ b/app/views/admin/dashboard/index.html.haml @@ -58,7 +58,7 @@ = link_to(s_('AdminArea|New user'), new_admin_user_path, class: "btn gl-button btn-default") = c.footer do .d-flex.align-items-center - = link_to(s_('AdminArea|View latest users'), admin_users_path) + = link_to(s_('AdminArea|View latest users'), admin_users_path({ sort: 'created_desc' })) = sprite_icon('chevron-right', size: 12, css_class: 'gl-text-gray-700 gl-ml-2') .col-md-4.gl-mb-6 = render Pajamas::CardComponent.new(**component_params) do |c| diff --git a/app/views/admin/runners/show.html.haml b/app/views/admin/runners/show.html.haml index 22351397b9a..a9dbcf4a6a5 100644 --- a/app/views/admin/runners/show.html.haml +++ b/app/views/admin/runners/show.html.haml @@ -1,4 +1,5 @@ - add_page_specific_style 'page_bundles/ci_status' +- add_page_specific_style 'page_bundles/runner_details' - title = "##{@runner.id} (#{@runner.short_sha})" - breadcrumb_title title diff --git a/app/views/groups/runners/show.html.haml b/app/views/groups/runners/show.html.haml index 65e797a2e82..c7e0bf8943c 100644 --- a/app/views/groups/runners/show.html.haml +++ b/app/views/groups/runners/show.html.haml @@ -1,3 +1,5 @@ +- add_page_specific_style 'page_bundles/runner_details' + - add_to_breadcrumbs _('Runners'), group_runners_path(@group) - if Feature.enabled?(:group_runner_view_ui, @group) diff --git a/app/views/groups/settings/access_tokens/index.html.haml b/app/views/groups/settings/access_tokens/index.html.haml index 16ea96f0b08..ac6c5d1842c 100644 --- a/app/views/groups/settings/access_tokens/index.html.haml +++ b/app/views/groups/settings/access_tokens/index.html.haml @@ -37,7 +37,7 @@ token: @resource_access_token, scopes: @scopes, access_levels: GroupMember.access_level_roles, - default_access_level: Gitlab::Access::MAINTAINER, + default_access_level: Gitlab::Access::GUEST, prefix: :resource_access_token, help_path: help_page_path('user/group/settings/group_access_tokens', anchor: 'scopes-for-a-group-access-token') diff --git a/app/views/projects/pages/_use.html.haml b/app/views/projects/pages/_use.html.haml index f865fac0e88..0ab99c83fd0 100644 --- a/app/views/projects/pages/_use.html.haml +++ b/app/views/projects/pages/_use.html.haml @@ -5,7 +5,6 @@ .card-body %p.gl-mb-0 - docs_link_start = "<a href='#{help_page_path('user/project/pages/index')}' target='_blank' rel='noopener noreferrer' data-track-action='click_link' data-track-label='pages_docs_link'>".html_safe - - samples_link_start = "<a href='https://gitlab.com/pages' target='_blank' rel='noopener noreferrer' data-track-action='click_link' data-track-label='pages_samples_link>" - .html_safe + - samples_link_start = "<a href='https://gitlab.com/pages' target='_blank' rel='noopener noreferrer' data-track-action='click_link' data-track-label='pages_samples_link'>".html_safe - link_end = '</a>'.html_safe = s_('GitLabPages|Your Pages site is not configured yet. See the %{docs_link_start}GitLab Pages documentation%{link_end} to learn how to upload your static site and have GitLab serve it. You can also take some inspiration from the %{samples_link_start}sample Pages projects%{link_end}.').html_safe % { docs_link_start: docs_link_start, samples_link_start: samples_link_start, link_end: link_end } diff --git a/app/views/projects/settings/access_tokens/index.html.haml b/app/views/projects/settings/access_tokens/index.html.haml index 359e34d8918..7ecc8004334 100644 --- a/app/views/projects/settings/access_tokens/index.html.haml +++ b/app/views/projects/settings/access_tokens/index.html.haml @@ -37,7 +37,7 @@ token: @resource_access_token, scopes: @scopes, access_levels: ProjectMember.permissible_access_level_roles(current_user, @project), - default_access_level: Gitlab::Access::MAINTAINER, + default_access_level: Gitlab::Access::GUEST, prefix: :resource_access_token, help_path: help_page_path('user/project/settings/project_access_tokens', anchor: 'scopes-for-a-project-access-token') |