diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2022-03-15 21:08:10 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2022-03-15 21:08:10 +0300 |
commit | 7f08e6916d8259a8ed1549cb54460f0b746d9d8b (patch) | |
tree | 40853e994af97de42bd68076bd0bffa6be5c2814 /app | |
parent | cb7f766437db0c483adf3c128e35c64237a2ef53 (diff) |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'app')
29 files changed, 262 insertions, 134 deletions
diff --git a/app/assets/javascripts/environments/components/new_environment_folder.vue b/app/assets/javascripts/environments/components/new_environment_folder.vue index 30a178db5cc..d5c6d26cfd0 100644 --- a/app/assets/javascripts/environments/components/new_environment_folder.vue +++ b/app/assets/javascripts/environments/components/new_environment_folder.vue @@ -3,6 +3,7 @@ import { GlButton, GlCollapse, GlIcon, GlBadge, GlLink } from '@gitlab/ui'; import { __, s__ } from '~/locale'; import pollIntervalQuery from '../graphql/queries/poll_interval.query.graphql'; import folderQuery from '../graphql/queries/folder.query.graphql'; +import { ENVIRONMENT_COUNT_BY_SCOPE } from '../constants'; import EnvironmentItem from './new_environment_item.vue'; export default { @@ -56,7 +57,8 @@ export default { return this.visible ? this.$options.i18n.collapse : this.$options.i18n.expand; }, count() { - return this.folder?.[`${this.scope}Count`] ?? 0; + const count = ENVIRONMENT_COUNT_BY_SCOPE[this.scope]; + return this.folder?.[count] ?? 0; }, folderClass() { return { 'gl-font-weight-bold': this.visible }; diff --git a/app/assets/javascripts/environments/components/new_environments_app.vue b/app/assets/javascripts/environments/components/new_environments_app.vue index 8e6457ed918..087e9cd2fcd 100644 --- a/app/assets/javascripts/environments/components/new_environments_app.vue +++ b/app/assets/javascripts/environments/components/new_environments_app.vue @@ -9,6 +9,7 @@ import environmentToDeleteQuery from '../graphql/queries/environment_to_delete.q import environmentToRollbackQuery from '../graphql/queries/environment_to_rollback.query.graphql'; import environmentToStopQuery from '../graphql/queries/environment_to_stop.query.graphql'; import environmentToChangeCanaryQuery from '../graphql/queries/environment_to_change_canary.query.graphql'; +import { ENVIRONMENTS_SCOPE } from '../constants'; import EnvironmentFolder from './new_environment_folder.vue'; import EnableReviewAppModal from './enable_review_app_modal.vue'; import StopEnvironmentModal from './stop_environment_modal.vue'; @@ -82,12 +83,14 @@ export default { }, modalId: 'enable-review-app-info', data() { - const { page = '1', scope = 'available' } = queryToObject(window.location.search); + const { page = '1', scope } = queryToObject(window.location.search); return { interval: undefined, isReviewAppModalVisible: false, page: parseInt(page, 10), - scope, + scope: Object.values(ENVIRONMENTS_SCOPE).includes(scope) + ? scope + : ENVIRONMENTS_SCOPE.AVAILABLE, environmentToDelete: {}, environmentToRollback: {}, environmentToStop: {}, @@ -188,6 +191,7 @@ export default { }); }, }, + ENVIRONMENTS_SCOPE, }; </script> <template> @@ -209,7 +213,10 @@ export default { query-param-name="scope" @primary="showReviewAppModal" > - <gl-tab query-param-value="available" @click="setScope('available')"> + <gl-tab + :query-param-value="$options.ENVIRONMENTS_SCOPE.AVAILABLE" + @click="setScope($options.ENVIRONMENTS_SCOPE.AVAILABLE)" + > <template #title> <span>{{ $options.i18n.available }}</span> <gl-badge size="sm" class="gl-tab-counter-badge"> @@ -217,7 +224,10 @@ export default { </gl-badge> </template> </gl-tab> - <gl-tab query-param-value="stopped" @click="setScope('stopped')"> + <gl-tab + :query-param-value="$options.ENVIRONMENTS_SCOPE.STOPPED" + @click="setScope($options.ENVIRONMENTS_SCOPE.STOPPED)" + > <template #title> <span>{{ $options.i18n.stopped }}</span> <gl-badge size="sm" class="gl-tab-counter-badge"> diff --git a/app/assets/javascripts/environments/constants.js b/app/assets/javascripts/environments/constants.js index 6d427bef4e6..942491039d6 100644 --- a/app/assets/javascripts/environments/constants.js +++ b/app/assets/javascripts/environments/constants.js @@ -38,3 +38,13 @@ export const CANARY_STATUS = { }; export const CANARY_UPDATE_MODAL = 'confirm-canary-change'; + +export const ENVIRONMENTS_SCOPE = { + AVAILABLE: 'available', + STOPPED: 'stopped', +}; + +export const ENVIRONMENT_COUNT_BY_SCOPE = { + [ENVIRONMENTS_SCOPE.AVAILABLE]: 'availableCount', + [ENVIRONMENTS_SCOPE.STOPPED]: 'stoppedCount', +}; diff --git a/app/assets/javascripts/members/components/filter_sort/members_filtered_search_bar.vue b/app/assets/javascripts/members/components/filter_sort/members_filtered_search_bar.vue index 633dee75237..ca60f876c6f 100644 --- a/app/assets/javascripts/members/components/filter_sort/members_filtered_search_bar.vue +++ b/app/assets/javascripts/members/components/filter_sort/members_filtered_search_bar.vue @@ -1,5 +1,4 @@ <script> -import { GlFilteredSearchToken } from '@gitlab/ui'; import { mapState } from 'vuex'; import { getParameterByName, @@ -7,46 +6,24 @@ import { queryToObject, redirectTo, } from '~/lib/utils/url_utility'; -import { s__ } from '~/locale'; import { SEARCH_TOKEN_TYPE, SORT_QUERY_PARAM_NAME, ACTIVE_TAB_QUERY_PARAM_NAME, -} from '~/members/constants'; -import { OPERATOR_IS_ONLY } from '~/vue_shared/components/filtered_search_bar/constants'; + AVAILABLE_FILTERED_SEARCH_TOKENS, +} from 'ee_else_ce/members/constants'; import FilteredSearchBar from '~/vue_shared/components/filtered_search_bar/filtered_search_bar_root.vue'; export default { name: 'MembersFilteredSearchBar', components: { FilteredSearchBar }, - availableTokens: [ - { - type: 'two_factor', - icon: 'lock', - title: s__('Members|2FA'), - token: GlFilteredSearchToken, - unique: true, - operators: OPERATOR_IS_ONLY, - options: [ - { value: 'enabled', title: s__('Members|Enabled') }, - { value: 'disabled', title: s__('Members|Disabled') }, - ], - requiredPermissions: 'canManageMembers', - }, - { - type: 'with_inherited_permissions', - icon: 'group', - title: s__('Members|Membership'), - token: GlFilteredSearchToken, - unique: true, - operators: OPERATOR_IS_ONLY, - options: [ - { value: 'exclude', title: s__('Members|Direct') }, - { value: 'only', title: s__('Members|Inherited') }, - ], - }, - ], - inject: ['namespace', 'sourceId', 'canManageMembers'], + availableTokens: AVAILABLE_FILTERED_SEARCH_TOKENS, + inject: { + namespace: {}, + sourceId: {}, + canManageMembers: {}, + canFilterByEnterprise: { default: false }, + }, data() { return { initialFilterValue: [], diff --git a/app/assets/javascripts/members/constants.js b/app/assets/javascripts/members/constants.js index 273f1acebc7..49ce00a1689 100644 --- a/app/assets/javascripts/members/constants.js +++ b/app/assets/javascripts/members/constants.js @@ -1,4 +1,7 @@ -import { __ } from '~/locale'; +import { GlFilteredSearchToken } from '@gitlab/ui'; + +import { __, s__ } from '~/locale'; +import { OPERATOR_IS_ONLY } from '~/vue_shared/components/filtered_search_bar/constants'; export const FIELD_KEY_ACCOUNT = 'account'; export const FIELD_KEY_SOURCE = 'source'; @@ -82,6 +85,38 @@ export const DEFAULT_SORT = { sortDesc: false, }; +export const FILTERED_SEARCH_TOKEN_TWO_FACTOR = { + type: 'two_factor', + icon: 'lock', + title: s__('Members|2FA'), + token: GlFilteredSearchToken, + unique: true, + operators: OPERATOR_IS_ONLY, + options: [ + { value: 'enabled', title: s__('Members|Enabled') }, + { value: 'disabled', title: s__('Members|Disabled') }, + ], + requiredPermissions: 'canManageMembers', +}; + +export const FILTERED_SEARCH_TOKEN_WITH_INHERITED_PERMISSIONS = { + type: 'with_inherited_permissions', + icon: 'group', + title: s__('Members|Membership'), + token: GlFilteredSearchToken, + unique: true, + operators: OPERATOR_IS_ONLY, + options: [ + { value: 'exclude', title: s__('Members|Direct') }, + { value: 'only', title: s__('Members|Inherited') }, + ], +}; + +export const AVAILABLE_FILTERED_SEARCH_TOKENS = [ + FILTERED_SEARCH_TOKEN_TWO_FACTOR, + FILTERED_SEARCH_TOKEN_WITH_INHERITED_PERMISSIONS, +]; + export const AVATAR_SIZE = 48; export const MEMBER_TYPES = { diff --git a/app/assets/javascripts/members/index.js b/app/assets/javascripts/members/index.js index 510e89240f4..0df876cabd7 100644 --- a/app/assets/javascripts/members/index.js +++ b/app/assets/javascripts/members/index.js @@ -18,6 +18,7 @@ export const initMembersApp = (el, options) => { sourceId, canManageMembers, canExportMembers, + canFilterByEnterprise, exportCsvPath, ...vuexStoreAttributes } = parseDataAttributes(el); @@ -60,6 +61,7 @@ export const initMembersApp = (el, options) => { currentUserId: gon.current_user_id || null, sourceId, canManageMembers, + canFilterByEnterprise, canExportMembers, exportCsvPath, }, diff --git a/app/assets/javascripts/pages/groups/group_members/index.js b/app/assets/javascripts/pages/groups/group_members/index.js index 36f37dab40d..be12ca6b015 100644 --- a/app/assets/javascripts/pages/groups/group_members/index.js +++ b/app/assets/javascripts/pages/groups/group_members/index.js @@ -21,7 +21,7 @@ initMembersApp(document.querySelector('.js-group-members-list-app'), { requestFormatter: groupMemberRequestFormatter, filteredSearchBar: { show: true, - tokens: ['two_factor', 'with_inherited_permissions'], + tokens: ['two_factor', 'with_inherited_permissions', 'enterprise'], searchParam: 'search', placeholder: s__('Members|Filter members'), recentSearchesStorageKey: 'group_members', diff --git a/app/assets/javascripts/pages/projects/learn_gitlab/components/learn_gitlab_section_link.vue b/app/assets/javascripts/pages/projects/learn_gitlab/components/learn_gitlab_section_link.vue index d0ec02bbd0c..573f996a254 100644 --- a/app/assets/javascripts/pages/projects/learn_gitlab/components/learn_gitlab_section_link.vue +++ b/app/assets/javascripts/pages/projects/learn_gitlab/components/learn_gitlab_section_link.vue @@ -32,7 +32,7 @@ export default { ); }, openInNewTab() { - return ACTION_LABELS[this.action]?.openInNewTab === true; + return ACTION_LABELS[this.action]?.openInNewTab === true || this.value.openInNewTab === true; }, }, methods: { @@ -65,8 +65,6 @@ export default { data-testid="uncompleted-learn-gitlab-link" data-track-action="click_link" :data-track-label="$options.i18n.ACTION_LABELS[action].title" - data-track-property="Growth::Conversion::Experiment::LearnGitLab" - data-track-experiment="change_continuous_onboarding_link_urls" > {{ $options.i18n.ACTION_LABELS[action].title }} </gl-link> diff --git a/app/assets/javascripts/pages/projects/learn_gitlab/constants/index.js b/app/assets/javascripts/pages/projects/learn_gitlab/constants/index.js index 880cf699e5e..1887c48dd1b 100644 --- a/app/assets/javascripts/pages/projects/learn_gitlab/constants/index.js +++ b/app/assets/javascripts/pages/projects/learn_gitlab/constants/index.js @@ -62,7 +62,6 @@ export const ACTION_LABELS = { description: s__('LearnGitLab|Scan your code to uncover vulnerabilities before deploying.'), section: 'deploy', position: 1, - openInNewTab: true, }, issueCreated: { title: s__('LearnGitLab|Create an issue'), diff --git a/app/assets/stylesheets/framework/mixins.scss b/app/assets/stylesheets/framework/mixins.scss index 1e51bf3d974..1caf02937d5 100644 --- a/app/assets/stylesheets/framework/mixins.scss +++ b/app/assets/stylesheets/framework/mixins.scss @@ -439,6 +439,12 @@ .na { color: inherit; } + + // Rouge `Comment` token (quoted text in email body) + .c { + color: $gl-grayish-blue; + font-style: italic; + } } } } diff --git a/app/assets/stylesheets/notify.scss b/app/assets/stylesheets/notify.scss index ca8c358d97f..2d501781119 100644 --- a/app/assets/stylesheets/notify.scss +++ b/app/assets/stylesheets/notify.scss @@ -1,24 +1,4 @@ -@import 'framework/mixins'; -@import 'framework/variables'; - -img { - max-width: 100%; - height: auto; -} - -p.details { - font-style: italic; - color: $gray-500; -} - -.footer > p { - font-size: small; - color: $gray-500; -} - -pre.commit-message { - white-space: pre-wrap; -} +@import 'notify_base'; .gl-label-scoped { border: 2px solid currentColor; @@ -52,6 +32,4 @@ pre.commit-message { border: 1px solid $gray-100; border-radius: $border-radius-small; } - - @include email-code-block; } diff --git a/app/assets/stylesheets/notify_base.scss b/app/assets/stylesheets/notify_base.scss new file mode 100644 index 00000000000..8c6f9a27077 --- /dev/null +++ b/app/assets/stylesheets/notify_base.scss @@ -0,0 +1,25 @@ +@import 'framework/mixins'; +@import 'framework/variables'; + +img { + max-width: 100%; + height: auto; +} + +p.details { + font-style: italic; + color: $gray-500; +} + +.footer > p { + font-size: small; + color: $gray-500; +} + +pre.commit-message { + white-space: pre-wrap; +} + +.content { + @include email-code-block; +} diff --git a/app/assets/stylesheets/notify_enhanced.scss b/app/assets/stylesheets/notify_enhanced.scss new file mode 100644 index 00000000000..5df5a8592bf --- /dev/null +++ b/app/assets/stylesheets/notify_enhanced.scss @@ -0,0 +1,68 @@ +// Import a subset of the GitLab UI framework: +// keep parts that affect elements that can appear in emails; +// omit Bootstrap Reboot since it adds unnecessary styles to every element. +@import 'notify_base'; +@import 'bootstrap/scss/functions'; +@import 'bootstrap/scss/variables'; +@import 'bootstrap/scss/mixins'; +@import 'bootstrap/scss/code'; +@import '@gitlab/ui/src/scss/variables'; +@import '@gitlab/ui/src/scss/utility-mixins/index'; +@import '@gitlab/ui/src/scss/components'; +@import 'bootstrap_migration'; +@import 'framework/common'; +@import 'framework/gfm'; +@import 'framework/kbd'; +@import 'framework/tables'; +@import 'framework/typography'; +@import 'framework/emojis'; + +body { + font-family: $regular-font; + font-size: inherit; +} + +a { + text-decoration: none; +} + +.content { + .md { + padding: 1rem 0; + } + + hr { + border: 1px solid #e1e1e1; + } + + blockquote { + border-top-width: 0; + border-bottom-width: 0; + border-right-width: 0; + + &:dir(rtl) { + border-left-width: 0; + border-right-width: inherit; + } + } + + table { + border-collapse: collapse; + } + + .diff-table.code, + table.code { + width: auto; + + td { + padding: inherit; + + pre { + background-color: inherit; + margin: 0; + padding: 0; + border: inherit; + } + } + } +} diff --git a/app/controllers/projects/environments_controller.rb b/app/controllers/projects/environments_controller.rb index 84ebdcd9364..eabc048e341 100644 --- a/app/controllers/projects/environments_controller.rb +++ b/app/controllers/projects/environments_controller.rb @@ -29,13 +29,14 @@ class Projects::EnvironmentsController < Projects::ApplicationController feature_category :continuous_delivery def index - @environments = project.environments - .with_state(params[:scope] || :available) @project = ProjectPresenter.new(project, current_user: current_user) respond_to do |format| format.html format.json do + @environments = project.environments + .with_state(params[:scope] || :available) + Gitlab::PollingInterval.set_header(response, interval: 3_000) environments_count_by_state = project.environments.count_by_state @@ -52,14 +53,15 @@ class Projects::EnvironmentsController < Projects::ApplicationController # Returns all environments for a given folder # rubocop: disable CodeReuse/ActiveRecord def folder - folder_environments = project.environments.where(environment_type: params[:id]) - @environments = folder_environments.with_state(params[:scope] || :available) - .order(:name) @folder = params[:id] respond_to do |format| format.html format.json do + folder_environments = project.environments.where(environment_type: params[:id]) + @environments = folder_environments.with_state(params[:scope] || :available) + .order(:name) + render json: { environments: serialize_environments(request, response), available_count: folder_environments.available.count, diff --git a/app/controllers/projects/redirect_controller.rb b/app/controllers/projects/redirect_controller.rb new file mode 100644 index 00000000000..6bcbe87ee42 --- /dev/null +++ b/app/controllers/projects/redirect_controller.rb @@ -0,0 +1,20 @@ +# frozen_string_literal: true + +# Projects::RedirectController is used to resolve the route projects/:id. +# It's helpful for this to be in its own controller so that the +# ProjectsController can assume that :namespace_id exists +class Projects::RedirectController < ::ApplicationController + skip_before_action :authenticate_user! + + feature_category :projects + + def redirect_from_id + project = Project.find(params[:id]) + + if can?(current_user, :read_project, project) + redirect_to project + else + render_404 + end + end +end diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index 7b45bed426b..9f971800ff5 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -17,10 +17,10 @@ class ProjectsController < Projects::ApplicationController around_action :allow_gitaly_ref_name_caching, only: [:index, :show] before_action :disable_query_limiting, only: [:show, :create] - before_action :authenticate_user!, except: [:index, :show, :activity, :refs, :resolve, :unfoldered_environment_names] + before_action :authenticate_user!, except: [:index, :show, :activity, :refs, :unfoldered_environment_names] before_action :redirect_git_extension, only: [:show] - before_action :project, except: [:index, :new, :create, :resolve] - before_action :repository, except: [:index, :new, :create, :resolve] + before_action :project, except: [:index, :new, :create] + before_action :repository, except: [:index, :new, :create] before_action :verify_git_import_enabled, only: [:create] before_action :project_export_enabled, only: [:export, :download_export, :remove_export, :generate_new_export] before_action :present_project, only: [:edit] @@ -48,7 +48,7 @@ class ProjectsController < Projects::ApplicationController feature_category :projects, [ :index, :show, :new, :create, :edit, :update, :transfer, - :destroy, :resolve, :archive, :unarchive, :toggle_star, :activity + :destroy, :archive, :unarchive, :toggle_star, :activity ] feature_category :source_code_management, [:remove_fork, :housekeeping, :refs] @@ -324,16 +324,6 @@ class ProjectsController < Projects::ApplicationController end # rubocop: enable CodeReuse/ActiveRecord - def resolve - @project = Project.find(params[:id]) - - if can?(current_user, :read_project, @project) - redirect_to @project - else - render_404 - end - end - def unfoldered_environment_names respond_to do |format| format.json do diff --git a/app/graphql/resolvers/concerns/group_issuable_resolver.rb b/app/graphql/resolvers/concerns/group_issuable_resolver.rb index 542ff5374ff..92d22409ff2 100644 --- a/app/graphql/resolvers/concerns/group_issuable_resolver.rb +++ b/app/graphql/resolvers/concerns/group_issuable_resolver.rb @@ -3,12 +3,21 @@ module GroupIssuableResolver extend ActiveSupport::Concern - class_methods do - def include_subgroups(name_of_things) - argument :include_subgroups, GraphQL::Types::Boolean, - required: false, - default_value: false, - description: "Include #{name_of_things} belonging to subgroups" - end + included do + argument :include_subgroups, GraphQL::Types::Boolean, + required: false, + default_value: false, + description: "Include #{issuable_collection_name} belonging to subgroups" + + argument :include_archived, GraphQL::Types::Boolean, + required: false, + default_value: false, + description: "Return #{issuable_collection_name} from archived projects" + end + + def resolve(**args) + args[:non_archived] = !args.delete(:include_archived) + + super end end diff --git a/app/graphql/resolvers/group_issues_resolver.rb b/app/graphql/resolvers/group_issues_resolver.rb index 28f9266974f..05c5e803539 100644 --- a/app/graphql/resolvers/group_issues_resolver.rb +++ b/app/graphql/resolvers/group_issues_resolver.rb @@ -3,9 +3,11 @@ module Resolvers class GroupIssuesResolver < BaseIssuesResolver - include GroupIssuableResolver + def self.issuable_collection_name + 'issues' + end - include_subgroups 'issues' + include GroupIssuableResolver def ready?(**args) if args.dig(:not, :release_tag).present? diff --git a/app/graphql/resolvers/group_merge_requests_resolver.rb b/app/graphql/resolvers/group_merge_requests_resolver.rb index 34a4c67bc56..da1b6169c07 100644 --- a/app/graphql/resolvers/group_merge_requests_resolver.rb +++ b/app/graphql/resolvers/group_merge_requests_resolver.rb @@ -2,13 +2,16 @@ module Resolvers class GroupMergeRequestsResolver < MergeRequestsResolver + def self.issuable_collection_name + 'merge requests' + end + include GroupIssuableResolver alias_method :group, :object type Types::MergeRequestType.connection_type, null: true - include_subgroups 'merge requests' accept_assignee accept_author diff --git a/app/helpers/learn_gitlab_helper.rb b/app/helpers/learn_gitlab_helper.rb index 7dfd9ed47e3..60f3b12d736 100644 --- a/app/helpers/learn_gitlab_helper.rb +++ b/app/helpers/learn_gitlab_helper.rb @@ -1,6 +1,10 @@ # frozen_string_literal: true module LearnGitlabHelper + IMAGE_PATH_PLAN = "learn_gitlab/section_plan.svg" + IMAGE_PATH_DEPLOY = "learn_gitlab/section_deploy.svg" + IMAGE_PATH_WORKSPACE = "learn_gitlab/section_workspace.svg" + def learn_gitlab_enabled?(project) return false unless current_user @@ -25,19 +29,7 @@ module LearnGitlabHelper def onboarding_actions_data(project) attributes = onboarding_progress(project).attributes.symbolize_keys - urls_to_use = nil - - experiment( - :change_continuous_onboarding_link_urls, - namespace: project.namespace, - actor: current_user, - sticky_to: project.namespace - ) do |e| - e.control { urls_to_use = action_urls } - e.candidate { urls_to_use = new_action_urls(project) } - end - - urls_to_use.to_h do |action, url| + action_urls(project).to_h do |action, url| [ action, url: url, @@ -50,13 +42,13 @@ module LearnGitlabHelper def onboarding_sections_data { workspace: { - svg: image_path("learn_gitlab/section_workspace.svg") + svg: image_path(IMAGE_PATH_WORKSPACE) }, plan: { - svg: image_path("learn_gitlab/section_plan.svg") + svg: image_path(IMAGE_PATH_PLAN) }, deploy: { - svg: image_path("learn_gitlab/section_deploy.svg") + svg: image_path(IMAGE_PATH_DEPLOY) } } end @@ -65,22 +57,20 @@ module LearnGitlabHelper { name: project.name } end - def action_urls - LearnGitlab::Onboarding::ACTION_ISSUE_IDS.transform_values { |id| project_issue_url(learn_gitlab_project, id) } - .merge(LearnGitlab::Onboarding::ACTION_DOC_URLS) - end - - def new_action_urls(project) - action_urls.merge( + def action_urls(project) + action_issue_urls.merge( issue_created: project_issues_path(project), git_write: project_path(project), - pipeline_created: project_pipelines_path(project), merge_request_created: project_merge_requests_path(project), user_added: project_members_url(project), security_scan_enabled: project_security_configuration_path(project) ) end + def action_issue_urls + LearnGitlab::Onboarding::ACTION_ISSUE_IDS.transform_values { |id| project_issue_url(learn_gitlab_project, id) } + end + def learn_gitlab_project @learn_gitlab_project ||= LearnGitlab::Project.new(current_user).project end diff --git a/app/models/project.rb b/app/models/project.rb index e55395b32e7..3778db48ff2 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -3046,10 +3046,6 @@ class Project < ApplicationRecord Projects::SyncEvent.enqueue_worker end end - - def allow_serialization?(options = nil) - Feature.disabled?(:block_project_serialization, self, default_enabled: :yaml) || super - end end Project.prepend_mod_with('Project') diff --git a/app/views/layouts/notify.html.haml b/app/views/layouts/notify.html.haml index e922b505be8..3b979f69cac 100644 --- a/app/views/layouts/notify.html.haml +++ b/app/views/layouts/notify.html.haml @@ -3,7 +3,10 @@ %meta{ content: "text/html; charset=utf-8", "http-equiv" => "Content-Type" } %title GitLab - = stylesheet_link_tag 'notify' + - if Feature.enabled?(:enhanced_notify_css) + = stylesheet_link_tag 'notify_enhanced' + - else + = stylesheet_link_tag 'notify' = yield :head %body .content diff --git a/app/views/layouts/service_desk.html.haml b/app/views/layouts/service_desk.html.haml index 26d15a74403..a838ba91d26 100644 --- a/app/views/layouts/service_desk.html.haml +++ b/app/views/layouts/service_desk.html.haml @@ -5,7 +5,10 @@ %title GitLab -# haml-lint:enable NoPlainNodes - = stylesheet_link_tag 'notify' + - if Feature.enabled?(:enhanced_notify_css) + = stylesheet_link_tag 'notify_enhanced' + - else + = stylesheet_link_tag 'notify' = yield :head %body .content diff --git a/app/views/notify/_note_email.html.haml b/app/views/notify/_note_email.html.haml index ad0c873bf56..55984472047 100644 --- a/app/views/notify/_note_email.html.haml +++ b/app/views/notify/_note_email.html.haml @@ -25,11 +25,11 @@ = content_for :head do = stylesheet_link_tag 'mailers/highlighted_diff_email' - %table + %table.code = render partial: "projects/diffs/email_line", collection: discussion.truncated_diff_lines(diff_limit: diff_limit), as: :line, locals: { diff_file: discussion.diff_file } -%div{ style: note_style } +.md{ style: note_style } = markdown(note.note, pipeline: :email, author: note.author, current_user: @recipient, issuable_reference_expansion_enabled: true) diff --git a/app/views/notify/issue_due_email.html.haml b/app/views/notify/issue_due_email.html.haml index c9cd9c32b54..e512d7732e2 100644 --- a/app/views/notify/issue_due_email.html.haml +++ b/app/views/notify/issue_due_email.html.haml @@ -8,5 +8,5 @@ This issue is due on: #{@issue.due_date.to_s(:medium)} - if @issue.description - %div - = markdown(@issue.description, pipeline: :email, author: @issue.author, current_user: @recipient, issuable_reference_expansion_enabled: true) + .md + = markdown(@issue.description, pipeline: :email, author: @issue.author, current_user: @recipient, issuable_reference_expansion_enabled: true) diff --git a/app/views/notify/new_issue_email.html.haml b/app/views/notify/new_issue_email.html.haml index 439604a950a..592b3f453af 100644 --- a/app/views/notify/new_issue_email.html.haml +++ b/app/views/notify/new_issue_email.html.haml @@ -7,5 +7,5 @@ = assignees_label(@issue) - if @issue.description - %div - = markdown(@issue.description, pipeline: :email, author: @issue.author, current_user: @recipient, issuable_reference_expansion_enabled: true) + .md + = markdown(@issue.description, pipeline: :email, author: @issue.author, current_user: @recipient, issuable_reference_expansion_enabled: true) diff --git a/app/views/notify/new_merge_request_email.html.haml b/app/views/notify/new_merge_request_email.html.haml index 54fb6573c26..f67ac5f8fb2 100644 --- a/app/views/notify/new_merge_request_email.html.haml +++ b/app/views/notify/new_merge_request_email.html.haml @@ -15,5 +15,5 @@ = render_if_exists 'notify/merge_request_approvers', presenter: @mr_presenter - if @merge_request.description - %div + .md = markdown(@merge_request.description, pipeline: :email, author: @merge_request.author, current_user: @recipient, issuable_reference_expansion_enabled: true) diff --git a/app/views/notify/new_release_email.html.haml b/app/views/notify/new_release_email.html.haml index 1cd3a2340c6..09c0e7a8abd 100644 --- a/app/views/notify/new_release_email.html.haml +++ b/app/views/notify/new_release_email.html.haml @@ -1,7 +1,7 @@ - release_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: @target_url } - description_details = { tag: @release.tag, name: @project.name, release_link_start: release_link_start, release_link_end: '</a>'.html_safe } -%div{ style: "font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif;" } +.md{ style: "font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif;" } %p = _("A new Release %{tag} for %{name} was published. Visit the %{release_link_start}Releases page%{release_link_end} to read more about it.").html_safe % description_details diff --git a/app/views/notify/service_desk_new_note_email.html.haml b/app/views/notify/service_desk_new_note_email.html.haml index 186bdf133e3..0c16cf3315f 100644 --- a/app/views/notify/service_desk_new_note_email.html.haml +++ b/app/views/notify/service_desk_new_note_email.html.haml @@ -1,5 +1,5 @@ - if Gitlab::CurrentSettings.email_author_in_body %div = _("%{author_link} wrote:").html_safe % { author_link: link_to(@note.author_name, user_url(@note.author)) } -%div +.md = markdown(@note.note, pipeline: :email, author: @note.author, issuable_reference_expansion_enabled: true) |