diff options
Diffstat (limited to 'app')
141 files changed, 523 insertions, 201 deletions
diff --git a/app/assets/javascripts/pages/search/show/index.js b/app/assets/javascripts/pages/search/show/index.js index 8dcc5aee00e..721219874cf 100644 --- a/app/assets/javascripts/pages/search/show/index.js +++ b/app/assets/javascripts/pages/search/show/index.js @@ -1,10 +1,7 @@ import Search from './search'; -import initStateFilter from '~/search/state_filter'; -import initConfidentialFilter from '~/search/confidential_filter'; +import initSearchApp from '~/search'; document.addEventListener('DOMContentLoaded', () => { - initStateFilter(); - initConfidentialFilter(); - + initSearchApp(); return new Search(); }); diff --git a/app/assets/javascripts/registry/explorer/components/details_page/tags_list_row.vue b/app/assets/javascripts/registry/explorer/components/details_page/tags_list_row.vue index aae3bf8161d..0f6297ca406 100644 --- a/app/assets/javascripts/registry/explorer/components/details_page/tags_list_row.vue +++ b/app/assets/javascripts/registry/explorer/components/details_page/tags_list_row.vue @@ -123,7 +123,7 @@ export default { v-if="tag.location" :title="tag.location" :text="tag.location" - css-class="btn-default btn-transparent btn-clipboard" + category="tertiary" /> <gl-icon diff --git a/app/assets/javascripts/repository/components/preview/index.vue b/app/assets/javascripts/repository/components/preview/index.vue index eca53f73a7f..4e2c8332f37 100644 --- a/app/assets/javascripts/repository/components/preview/index.vue +++ b/app/assets/javascripts/repository/components/preview/index.vue @@ -2,7 +2,7 @@ /* eslint-disable vue/no-v-html */ import $ from 'jquery'; import '~/behaviors/markdown/render_gfm'; -import { GlLink, GlLoadingIcon } from '@gitlab/ui'; +import { GlIcon, GlLink, GlLoadingIcon } from '@gitlab/ui'; import { handleLocationHash } from '~/lib/utils/common_utils'; import readmeQuery from '../../queries/readme.query.graphql'; @@ -19,6 +19,7 @@ export default { }, }, components: { + GlIcon, GlLink, GlLoadingIcon, }, @@ -51,7 +52,7 @@ export default { <article class="file-holder limited-width-container readme-holder"> <div class="js-file-title file-title-flex-parent"> <div class="file-header-content"> - <i aria-hidden="true" class="fa fa-file-text-o fa-fw"></i> + <gl-icon name="doc-text" aria-hidden="true" /> <gl-link :href="blob.webPath"> <strong>{{ blob.name }}</strong> </gl-link> diff --git a/app/assets/javascripts/search/confidential_filter/constants.js b/app/assets/javascripts/search/confidential_filter/constants.js deleted file mode 100644 index 4665ce6a5d1..00000000000 --- a/app/assets/javascripts/search/confidential_filter/constants.js +++ /dev/null @@ -1,28 +0,0 @@ -import { __ } from '~/locale'; - -export const FILTER_HEADER = __('Confidentiality'); - -export const FILTER_STATES = { - ANY: { - label: __('Any'), - value: null, - }, - CONFIDENTIAL: { - label: __('Confidential'), - value: 'yes', - }, - NOT_CONFIDENTIAL: { - label: __('Not confidential'), - value: 'no', - }, -}; - -export const SCOPES = { - ISSUES: 'issues', -}; - -export const FILTER_STATES_BY_SCOPE = { - [SCOPES.ISSUES]: [FILTER_STATES.ANY, FILTER_STATES.CONFIDENTIAL, FILTER_STATES.NOT_CONFIDENTIAL], -}; - -export const FILTER_PARAM = 'confidential'; diff --git a/app/assets/javascripts/search/confidential_filter/index.js b/app/assets/javascripts/search/confidential_filter/index.js deleted file mode 100644 index bec772be0dd..00000000000 --- a/app/assets/javascripts/search/confidential_filter/index.js +++ /dev/null @@ -1,39 +0,0 @@ -import Vue from 'vue'; -import Translate from '~/vue_shared/translate'; -import DropdownFilter from '../components/dropdown_filter.vue'; -import { - FILTER_HEADER, - FILTER_PARAM, - FILTER_STATES_BY_SCOPE, - FILTER_STATES, - SCOPES, -} from './constants'; - -Vue.use(Translate); - -export default () => { - const el = document.getElementById('js-search-filter-by-confidential'); - - if (!el) return false; - - return new Vue({ - el, - data() { - return { ...el.dataset }; - }, - - render(createElement) { - return createElement(DropdownFilter, { - props: { - initialFilter: this.filter, - filtersArray: FILTER_STATES_BY_SCOPE[this.scope], - filters: FILTER_STATES, - header: FILTER_HEADER, - param: FILTER_PARAM, - scope: this.scope, - supportedScopes: Object.values(SCOPES), - }, - }); - }, - }); -}; diff --git a/app/assets/javascripts/search/components/dropdown_filter.vue b/app/assets/javascripts/search/dropdown_filter/components/dropdown_filter.vue index cd9237026f2..b6e2dd46358 100644 --- a/app/assets/javascripts/search/components/dropdown_filter.vue +++ b/app/assets/javascripts/search/dropdown_filter/components/dropdown_filter.vue @@ -1,4 +1,5 @@ <script> +import { mapState } from 'vuex'; import { GlDropdown, GlDropdownItem, GlDropdownDivider } from '@gitlab/ui'; import { setUrlParams, visitUrl } from '~/lib/utils/url_utility'; import { sprintf, s__ } from '~/locale'; @@ -11,50 +12,27 @@ export default { GlDropdownDivider, }, props: { - initialFilter: { - type: String, - required: false, - default: null, - }, - filters: { + filterData: { type: Object, required: true, }, - filtersArray: { - type: Array, - required: true, - }, - header: { - type: String, - required: true, + }, + computed: { + ...mapState(['query']), + scope() { + return this.query.scope; }, - param: { - type: String, - required: true, + supportedScopes() { + return Object.values(this.filterData.scopes); }, - scope: { - type: String, - required: true, + initialFilter() { + return this.query[this.filterData.filterParam]; }, - supportedScopes: { - type: Array, - required: true, - }, - }, - computed: { filter() { - return this.initialFilter || this.filters.ANY.value; + return this.initialFilter || this.filterData.filters.ANY.value; }, - selectedFilterText() { - const f = this.filtersArray.find(({ value }) => value === this.selectedFilter); - if (!f || f === this.filters.ANY) { - return sprintf(s__('Any %{header}'), { header: this.header }); - } - - return f.label; - }, - showDropdown() { - return this.supportedScopes.includes(this.scope); + filtersArray() { + return this.filterData.filterByScope[this.scope]; }, selectedFilter: { get() { @@ -62,18 +40,29 @@ export default { return this.filter; } - return this.filters.ANY.value; + return this.filterData.filters.ANY.value; }, set(filter) { - visitUrl(setUrlParams({ [this.param]: filter })); + visitUrl(setUrlParams({ [this.filterData.filterParam]: filter })); }, }, + selectedFilterText() { + const f = this.filtersArray.find(({ value }) => value === this.selectedFilter); + if (!f || f === this.filterData.filters.ANY) { + return sprintf(s__('Any %{header}'), { header: this.filterData.header }); + } + + return f.label; + }, + showDropdown() { + return this.supportedScopes.includes(this.scope); + }, }, methods: { dropDownItemClass(filter) { return { 'gl-border-b-solid gl-border-b-gray-100 gl-border-b-1 gl-pb-2! gl-mb-2': - filter === this.filters.ANY, + filter === this.filterData.filters.ANY, }; }, isFilterSelected(filter) { @@ -94,7 +83,7 @@ export default { menu-class="gl-w-full! gl-pl-0" > <header class="gl-text-center gl-font-weight-bold gl-font-lg"> - {{ header }} + {{ filterData.header }} </header> <gl-dropdown-divider /> <gl-dropdown-item diff --git a/app/assets/javascripts/search/dropdown_filter/constants/confidential_filter_data.js b/app/assets/javascripts/search/dropdown_filter/constants/confidential_filter_data.js new file mode 100644 index 00000000000..b29daca89cb --- /dev/null +++ b/app/assets/javascripts/search/dropdown_filter/constants/confidential_filter_data.js @@ -0,0 +1,36 @@ +import { __ } from '~/locale'; + +const header = __('Confidentiality'); + +const filters = { + ANY: { + label: __('Any'), + value: null, + }, + CONFIDENTIAL: { + label: __('Confidential'), + value: 'yes', + }, + NOT_CONFIDENTIAL: { + label: __('Not confidential'), + value: 'no', + }, +}; + +const scopes = { + ISSUES: 'issues', +}; + +const filterByScope = { + [scopes.ISSUES]: [filters.ANY, filters.CONFIDENTIAL, filters.NOT_CONFIDENTIAL], +}; + +const filterParam = 'confidential'; + +export default { + header, + filters, + scopes, + filterByScope, + filterParam, +}; diff --git a/app/assets/javascripts/search/dropdown_filter/constants/state_filter_data.js b/app/assets/javascripts/search/dropdown_filter/constants/state_filter_data.js new file mode 100644 index 00000000000..0b93aa0be29 --- /dev/null +++ b/app/assets/javascripts/search/dropdown_filter/constants/state_filter_data.js @@ -0,0 +1,42 @@ +import { __ } from '~/locale'; + +const header = __('Status'); + +const filters = { + ANY: { + label: __('Any'), + value: 'all', + }, + OPEN: { + label: __('Open'), + value: 'opened', + }, + CLOSED: { + label: __('Closed'), + value: 'closed', + }, + MERGED: { + label: __('Merged'), + value: 'merged', + }, +}; + +const scopes = { + ISSUES: 'issues', + MERGE_REQUESTS: 'merge_requests', +}; + +const filterByScope = { + [scopes.ISSUES]: [filters.ANY, filters.OPEN, filters.CLOSED], + [scopes.MERGE_REQUESTS]: [filters.ANY, filters.OPEN, filters.MERGED, filters.CLOSED], +}; + +const filterParam = 'state'; + +export default { + header, + filters, + scopes, + filterByScope, + filterParam, +}; diff --git a/app/assets/javascripts/search/dropdown_filter/index.js b/app/assets/javascripts/search/dropdown_filter/index.js new file mode 100644 index 00000000000..e5e0745d990 --- /dev/null +++ b/app/assets/javascripts/search/dropdown_filter/index.js @@ -0,0 +1,38 @@ +import Vue from 'vue'; +import Translate from '~/vue_shared/translate'; +import DropdownFilter from './components/dropdown_filter.vue'; +import stateFilterData from './constants/state_filter_data'; +import confidentialFilterData from './constants/confidential_filter_data'; + +Vue.use(Translate); + +const mountDropdownFilter = (store, { id, filterData }) => { + const el = document.getElementById(id); + + if (!el) return false; + + return new Vue({ + el, + store, + render(createElement) { + return createElement(DropdownFilter, { + props: { + filterData, + }, + }); + }, + }); +}; + +const dropdownFilters = [ + { + id: 'js-search-filter-by-state', + filterData: stateFilterData, + }, + { + id: 'js-search-filter-by-confidential', + filterData: confidentialFilterData, + }, +]; + +export default store => [...dropdownFilters].map(filter => mountDropdownFilter(store, filter)); diff --git a/app/assets/javascripts/search/index.js b/app/assets/javascripts/search/index.js new file mode 100644 index 00000000000..780d3ff0d25 --- /dev/null +++ b/app/assets/javascripts/search/index.js @@ -0,0 +1,9 @@ +import { queryToObject } from '~/lib/utils/url_utility'; +import createStore from './store'; +import initDropdownFilters from './dropdown_filter'; + +export default () => { + const store = createStore({ query: queryToObject(window.location.search) }); + + initDropdownFilters(store); +}; diff --git a/app/assets/javascripts/search/state_filter/constants.js b/app/assets/javascripts/search/state_filter/constants.js deleted file mode 100644 index 00ae1bd9750..00000000000 --- a/app/assets/javascripts/search/state_filter/constants.js +++ /dev/null @@ -1,39 +0,0 @@ -import { __ } from '~/locale'; - -export const FILTER_HEADER = __('Status'); - -export const FILTER_STATES = { - ANY: { - label: __('Any'), - value: 'all', - }, - OPEN: { - label: __('Open'), - value: 'opened', - }, - CLOSED: { - label: __('Closed'), - value: 'closed', - }, - MERGED: { - label: __('Merged'), - value: 'merged', - }, -}; - -export const SCOPES = { - ISSUES: 'issues', - MERGE_REQUESTS: 'merge_requests', -}; - -export const FILTER_STATES_BY_SCOPE = { - [SCOPES.ISSUES]: [FILTER_STATES.ANY, FILTER_STATES.OPEN, FILTER_STATES.CLOSED], - [SCOPES.MERGE_REQUESTS]: [ - FILTER_STATES.ANY, - FILTER_STATES.OPEN, - FILTER_STATES.MERGED, - FILTER_STATES.CLOSED, - ], -}; - -export const FILTER_PARAM = 'state'; diff --git a/app/assets/javascripts/search/state_filter/index.js b/app/assets/javascripts/search/state_filter/index.js deleted file mode 100644 index 2c12885c40b..00000000000 --- a/app/assets/javascripts/search/state_filter/index.js +++ /dev/null @@ -1,39 +0,0 @@ -import Vue from 'vue'; -import Translate from '~/vue_shared/translate'; -import DropdownFilter from '../components/dropdown_filter.vue'; -import { - FILTER_HEADER, - FILTER_PARAM, - FILTER_STATES_BY_SCOPE, - FILTER_STATES, - SCOPES, -} from './constants'; - -Vue.use(Translate); - -export default () => { - const el = document.getElementById('js-search-filter-by-state'); - - if (!el) return false; - - return new Vue({ - el, - data() { - return { ...el.dataset }; - }, - - render(createElement) { - return createElement(DropdownFilter, { - props: { - initialFilter: this.filter, - filtersArray: FILTER_STATES_BY_SCOPE[this.scope], - filters: FILTER_STATES, - header: FILTER_HEADER, - param: FILTER_PARAM, - scope: this.scope, - supportedScopes: Object.values(SCOPES), - }, - }); - }, - }); -}; diff --git a/app/assets/javascripts/search/store/index.js b/app/assets/javascripts/search/store/index.js new file mode 100644 index 00000000000..10cfb647a92 --- /dev/null +++ b/app/assets/javascripts/search/store/index.js @@ -0,0 +1,12 @@ +import Vue from 'vue'; +import Vuex from 'vuex'; +import createState from './state'; + +Vue.use(Vuex); + +export const getStoreConfig = ({ query }) => ({ + state: createState({ query }), +}); + +const createStore = config => new Vuex.Store(getStoreConfig(config)); +export default createStore; diff --git a/app/assets/javascripts/search/store/state.js b/app/assets/javascripts/search/store/state.js new file mode 100644 index 00000000000..9115a613767 --- /dev/null +++ b/app/assets/javascripts/search/store/state.js @@ -0,0 +1,4 @@ +const createState = ({ query }) => ({ + query, +}); +export default createState; diff --git a/app/controllers/passwords_controller.rb b/app/controllers/passwords_controller.rb index c27226c3f3f..bc6975f8953 100644 --- a/app/controllers/passwords_controller.rb +++ b/app/controllers/passwords_controller.rb @@ -7,6 +7,8 @@ class PasswordsController < Devise::PasswordsController before_action :check_password_authentication_available, only: [:create] before_action :throttle_reset, only: [:create] + feature_category :authentication_and_authorization + # rubocop: disable CodeReuse/ActiveRecord def edit super diff --git a/app/controllers/profiles/accounts_controller.rb b/app/controllers/profiles/accounts_controller.rb index b19285e98bb..d8419be9f23 100644 --- a/app/controllers/profiles/accounts_controller.rb +++ b/app/controllers/profiles/accounts_controller.rb @@ -3,6 +3,8 @@ class Profiles::AccountsController < Profiles::ApplicationController include AuthHelper + feature_category :users + def show render(locals: show_view_variables) end diff --git a/app/controllers/profiles/active_sessions_controller.rb b/app/controllers/profiles/active_sessions_controller.rb index e4cd5d65e1a..1233c906406 100644 --- a/app/controllers/profiles/active_sessions_controller.rb +++ b/app/controllers/profiles/active_sessions_controller.rb @@ -1,6 +1,8 @@ # frozen_string_literal: true class Profiles::ActiveSessionsController < Profiles::ApplicationController + feature_category :users + def index @sessions = ActiveSession.list(current_user).reject(&:is_impersonated) end diff --git a/app/controllers/profiles/avatars_controller.rb b/app/controllers/profiles/avatars_controller.rb index 3378a09628c..d9e4b9a149d 100644 --- a/app/controllers/profiles/avatars_controller.rb +++ b/app/controllers/profiles/avatars_controller.rb @@ -1,6 +1,8 @@ # frozen_string_literal: true class Profiles::AvatarsController < Profiles::ApplicationController + feature_category :users + def destroy @user = current_user diff --git a/app/controllers/profiles/chat_names_controller.rb b/app/controllers/profiles/chat_names_controller.rb index 80b8279e91e..8cfec247b7a 100644 --- a/app/controllers/profiles/chat_names_controller.rb +++ b/app/controllers/profiles/chat_names_controller.rb @@ -4,6 +4,8 @@ class Profiles::ChatNamesController < Profiles::ApplicationController before_action :chat_name_token, only: [:new] before_action :chat_name_params, only: [:new, :create, :deny] + feature_category :users + def index @chat_names = current_user.chat_names end diff --git a/app/controllers/profiles/emails_controller.rb b/app/controllers/profiles/emails_controller.rb index da553e34ef6..6e5b18cb885 100644 --- a/app/controllers/profiles/emails_controller.rb +++ b/app/controllers/profiles/emails_controller.rb @@ -5,6 +5,8 @@ class Profiles::EmailsController < Profiles::ApplicationController before_action -> { rate_limit!(:profile_add_new_email) }, only: [:create] before_action -> { rate_limit!(:profile_resend_email_confirmation) }, only: [:resend_confirmation_instructions] + feature_category :users + def index @primary_email = current_user.email @emails = current_user.emails.order_id_desc diff --git a/app/controllers/profiles/gpg_keys_controller.rb b/app/controllers/profiles/gpg_keys_controller.rb index 8c34a66c374..7f04927f517 100644 --- a/app/controllers/profiles/gpg_keys_controller.rb +++ b/app/controllers/profiles/gpg_keys_controller.rb @@ -3,6 +3,8 @@ class Profiles::GpgKeysController < Profiles::ApplicationController before_action :set_gpg_key, only: [:destroy, :revoke] + feature_category :users + def index @gpg_keys = current_user.gpg_keys.with_subkeys @gpg_key = GpgKey.new diff --git a/app/controllers/profiles/groups_controller.rb b/app/controllers/profiles/groups_controller.rb index 04b5ee270dc..e76ee0a6cea 100644 --- a/app/controllers/profiles/groups_controller.rb +++ b/app/controllers/profiles/groups_controller.rb @@ -3,6 +3,8 @@ class Profiles::GroupsController < Profiles::ApplicationController include RoutableActions + feature_category :users + def update group = find_routable!(Group, params[:id]) notification_setting = current_user.notification_settings_for(group) diff --git a/app/controllers/profiles/keys_controller.rb b/app/controllers/profiles/keys_controller.rb index 965493955ac..1e6340f285e 100644 --- a/app/controllers/profiles/keys_controller.rb +++ b/app/controllers/profiles/keys_controller.rb @@ -3,6 +3,8 @@ class Profiles::KeysController < Profiles::ApplicationController skip_before_action :authenticate_user!, only: [:get_keys] + feature_category :users + def index @keys = current_user.keys.order_id_desc @key = Key.new diff --git a/app/controllers/profiles/notifications_controller.rb b/app/controllers/profiles/notifications_controller.rb index bc51830c119..a3e7638cdbc 100644 --- a/app/controllers/profiles/notifications_controller.rb +++ b/app/controllers/profiles/notifications_controller.rb @@ -1,6 +1,8 @@ # frozen_string_literal: true class Profiles::NotificationsController < Profiles::ApplicationController + feature_category :users + # rubocop: disable CodeReuse/ActiveRecord def show @user = current_user diff --git a/app/controllers/profiles/passwords_controller.rb b/app/controllers/profiles/passwords_controller.rb index fccbc29f598..85e901eb3eb 100644 --- a/app/controllers/profiles/passwords_controller.rb +++ b/app/controllers/profiles/passwords_controller.rb @@ -9,6 +9,8 @@ class Profiles::PasswordsController < Profiles::ApplicationController layout :determine_layout + feature_category :authentication_and_authorization + def new end diff --git a/app/controllers/profiles/personal_access_tokens_controller.rb b/app/controllers/profiles/personal_access_tokens_controller.rb index 21adc032940..b005347c43a 100644 --- a/app/controllers/profiles/personal_access_tokens_controller.rb +++ b/app/controllers/profiles/personal_access_tokens_controller.rb @@ -1,6 +1,8 @@ # frozen_string_literal: true class Profiles::PersonalAccessTokensController < Profiles::ApplicationController + feature_category :authentication_and_authorization + def index set_index_vars @personal_access_token = finder.build diff --git a/app/controllers/profiles/preferences_controller.rb b/app/controllers/profiles/preferences_controller.rb index ea4d3e861be..4d88491e9a8 100644 --- a/app/controllers/profiles/preferences_controller.rb +++ b/app/controllers/profiles/preferences_controller.rb @@ -3,6 +3,8 @@ class Profiles::PreferencesController < Profiles::ApplicationController before_action :user + feature_category :users + def show end diff --git a/app/controllers/profiles/two_factor_auths_controller.rb b/app/controllers/profiles/two_factor_auths_controller.rb index 5de6d84fdd9..7d82d6a3bcb 100644 --- a/app/controllers/profiles/two_factor_auths_controller.rb +++ b/app/controllers/profiles/two_factor_auths_controller.rb @@ -6,6 +6,8 @@ class Profiles::TwoFactorAuthsController < Profiles::ApplicationController push_frontend_feature_flag(:webauthn) end + feature_category :authentication_and_authorization + def show unless current_user.two_factor_enabled? current_user.otp_secret = User.generate_otp_secret(32) diff --git a/app/controllers/profiles/u2f_registrations_controller.rb b/app/controllers/profiles/u2f_registrations_controller.rb index 84ce4a56e64..32ca303e722 100644 --- a/app/controllers/profiles/u2f_registrations_controller.rb +++ b/app/controllers/profiles/u2f_registrations_controller.rb @@ -1,6 +1,8 @@ # frozen_string_literal: true class Profiles::U2fRegistrationsController < Profiles::ApplicationController + feature_category :authentication_and_authorization + def destroy u2f_registration = current_user.u2f_registrations.find(params[:id]) u2f_registration.destroy diff --git a/app/controllers/profiles/webauthn_registrations_controller.rb b/app/controllers/profiles/webauthn_registrations_controller.rb index 81b1dd6f710..a4a6d84f1ae 100644 --- a/app/controllers/profiles/webauthn_registrations_controller.rb +++ b/app/controllers/profiles/webauthn_registrations_controller.rb @@ -1,6 +1,8 @@ # frozen_string_literal: true class Profiles::WebauthnRegistrationsController < Profiles::ApplicationController + feature_category :authentication_and_authorization + def destroy webauthn_registration = current_user.webauthn_registrations.find(params[:id]) webauthn_registration.destroy diff --git a/app/controllers/profiles_controller.rb b/app/controllers/profiles_controller.rb index 248d5755d92..0687c057d47 100644 --- a/app/controllers/profiles_controller.rb +++ b/app/controllers/profiles_controller.rb @@ -10,6 +10,8 @@ class ProfilesController < Profiles::ApplicationController push_frontend_feature_flag(:webauthn) end + feature_category :users + def show end diff --git a/app/controllers/projects/alert_management_controller.rb b/app/controllers/projects/alert_management_controller.rb index 054dc8e6a35..8ecf8fadefd 100644 --- a/app/controllers/projects/alert_management_controller.rb +++ b/app/controllers/projects/alert_management_controller.rb @@ -3,6 +3,8 @@ class Projects::AlertManagementController < Projects::ApplicationController before_action :authorize_read_alert_management_alert! + feature_category :alert_management + def index end diff --git a/app/controllers/projects/alerting/notifications_controller.rb b/app/controllers/projects/alerting/notifications_controller.rb index fef8235628d..2241ded2db8 100644 --- a/app/controllers/projects/alerting/notifications_controller.rb +++ b/app/controllers/projects/alerting/notifications_controller.rb @@ -10,6 +10,8 @@ module Projects prepend_before_action :repository, :project_without_auth + feature_category :alert_management + def create token = extract_alert_manager_token(request) result = notify_service.execute(token) diff --git a/app/controllers/projects/artifacts_controller.rb b/app/controllers/projects/artifacts_controller.rb index 652687932fd..f6a92b07295 100644 --- a/app/controllers/projects/artifacts_controller.rb +++ b/app/controllers/projects/artifacts_controller.rb @@ -15,6 +15,8 @@ class Projects::ArtifactsController < Projects::ApplicationController MAX_PER_PAGE = 20 + feature_category :continuous_integration + def index # Loading artifacts is very expensive in projects with a lot of artifacts. # This feature flag prevents a DOS attack vector. diff --git a/app/controllers/projects/autocomplete_sources_controller.rb b/app/controllers/projects/autocomplete_sources_controller.rb index 26f2fb39972..001967b8bb4 100644 --- a/app/controllers/projects/autocomplete_sources_controller.rb +++ b/app/controllers/projects/autocomplete_sources_controller.rb @@ -3,6 +3,11 @@ class Projects::AutocompleteSourcesController < Projects::ApplicationController before_action :authorize_read_milestone!, only: :milestones + feature_category :issue_tracking, [:issues, :labels, :milestones, :commands] + feature_category :code_review, [:merge_requests] + feature_category :users, [:members] + feature_category :snippets, [:snippets] + def members render json: ::Projects::ParticipantsService.new(@project, current_user).execute(target) end diff --git a/app/controllers/projects/avatars_controller.rb b/app/controllers/projects/avatars_controller.rb index 6e6bf09a32a..f228206032d 100644 --- a/app/controllers/projects/avatars_controller.rb +++ b/app/controllers/projects/avatars_controller.rb @@ -5,6 +5,8 @@ class Projects::AvatarsController < Projects::ApplicationController before_action :authorize_admin_project!, only: [:destroy] + feature_category :projects + def show @blob = @repository.blob_at_branch(@repository.root_ref, @project.avatar_in_git) diff --git a/app/controllers/projects/badges_controller.rb b/app/controllers/projects/badges_controller.rb index eb47fec2b7e..855965ca6e1 100644 --- a/app/controllers/projects/badges_controller.rb +++ b/app/controllers/projects/badges_controller.rb @@ -6,6 +6,8 @@ class Projects::BadgesController < Projects::ApplicationController before_action :no_cache_headers, only: [:pipeline, :coverage] before_action :authorize_read_build!, only: [:pipeline, :coverage] + feature_category :continuous_integration + def pipeline pipeline_status = Gitlab::Badge::Pipeline::Status .new(project, params[:ref], opts: { diff --git a/app/controllers/projects/blame_controller.rb b/app/controllers/projects/blame_controller.rb index 374b4921dbc..d5de0d38152 100644 --- a/app/controllers/projects/blame_controller.rb +++ b/app/controllers/projects/blame_controller.rb @@ -9,6 +9,8 @@ class Projects::BlameController < Projects::ApplicationController before_action :assign_ref_vars before_action :authorize_download_code! + feature_category :source_code_management + def show @blob = @repository.blob_at(@commit.id, @path) diff --git a/app/controllers/projects/blob_controller.rb b/app/controllers/projects/blob_controller.rb index f0ac86d1581..c6251d27b05 100644 --- a/app/controllers/projects/blob_controller.rb +++ b/app/controllers/projects/blob_controller.rb @@ -39,6 +39,8 @@ class Projects::BlobController < Projects::ApplicationController track_redis_hll_event :create, :update, name: 'g_edit_by_sfe', feature: :track_editor_edit_actions, feature_default_enabled: true + feature_category :source_code_management + def new commit unless @repository.empty? end diff --git a/app/controllers/projects/boards_controller.rb b/app/controllers/projects/boards_controller.rb index 5ed35094476..193352ffa70 100644 --- a/app/controllers/projects/boards_controller.rb +++ b/app/controllers/projects/boards_controller.rb @@ -12,6 +12,8 @@ class Projects::BoardsController < Projects::ApplicationController push_frontend_feature_flag(:boards_with_swimlanes, project, default_enabled: false) end + feature_category :boards + private def assign_endpoint_vars diff --git a/app/controllers/projects/branches_controller.rb b/app/controllers/projects/branches_controller.rb index 7cfb4a508da..9124728ee25 100644 --- a/app/controllers/projects/branches_controller.rb +++ b/app/controllers/projects/branches_controller.rb @@ -13,6 +13,8 @@ class Projects::BranchesController < Projects::ApplicationController before_action :redirect_for_legacy_index_sort_or_search, only: [:index] before_action :limit_diverging_commit_counts!, only: [:diverging_commit_counts] + feature_category :source_code_management + def index respond_to do |format| format.html do diff --git a/app/controllers/projects/build_artifacts_controller.rb b/app/controllers/projects/build_artifacts_controller.rb index 99f4524eec5..148080a71f4 100644 --- a/app/controllers/projects/build_artifacts_controller.rb +++ b/app/controllers/projects/build_artifacts_controller.rb @@ -8,6 +8,8 @@ class Projects::BuildArtifactsController < Projects::ApplicationController before_action :extract_ref_name_and_path before_action :validate_artifacts!, except: [:download] + feature_category :continuous_integration + def download redirect_to download_project_job_artifacts_path(project, job, params: request.query_parameters) end diff --git a/app/controllers/projects/builds_controller.rb b/app/controllers/projects/builds_controller.rb index 6b3d70cb720..c5f6ed1c105 100644 --- a/app/controllers/projects/builds_controller.rb +++ b/app/controllers/projects/builds_controller.rb @@ -3,6 +3,8 @@ class Projects::BuildsController < Projects::ApplicationController before_action :authorize_read_build! + feature_category :continuous_integration + def index redirect_to project_jobs_path(project) end diff --git a/app/controllers/projects/ci/daily_build_group_report_results_controller.rb b/app/controllers/projects/ci/daily_build_group_report_results_controller.rb index 3d3b62fa797..d05ab1b4977 100644 --- a/app/controllers/projects/ci/daily_build_group_report_results_controller.rb +++ b/app/controllers/projects/ci/daily_build_group_report_results_controller.rb @@ -9,6 +9,8 @@ class Projects::Ci::DailyBuildGroupReportResultsController < Projects::Applicati before_action :authorize_read_build_report_results! before_action :validate_param_type! + feature_category :continuous_integration + def index respond_to do |format| format.csv { send_data(render_csv(report_results), type: 'text/csv; charset=utf-8') } diff --git a/app/controllers/projects/ci/lints_controller.rb b/app/controllers/projects/ci/lints_controller.rb index 813a0a9ddd5..7e900fc6051 100644 --- a/app/controllers/projects/ci/lints_controller.rb +++ b/app/controllers/projects/ci/lints_controller.rb @@ -6,6 +6,8 @@ class Projects::Ci::LintsController < Projects::ApplicationController push_frontend_feature_flag(:ci_lint_vue, project) end + feature_category :pipeline_authoring + def show end diff --git a/app/controllers/projects/commit_controller.rb b/app/controllers/projects/commit_controller.rb index b0c6f3cc6a1..2e48f2f0e45 100644 --- a/app/controllers/projects/commit_controller.rb +++ b/app/controllers/projects/commit_controller.rb @@ -21,6 +21,8 @@ class Projects::CommitController < Projects::ApplicationController BRANCH_SEARCH_LIMIT = 1000 + feature_category :source_code_management + def show apply_diff_view_cookie! diff --git a/app/controllers/projects/commits_controller.rb b/app/controllers/projects/commits_controller.rb index b161e44660e..d267ab732f9 100644 --- a/app/controllers/projects/commits_controller.rb +++ b/app/controllers/projects/commits_controller.rb @@ -15,6 +15,8 @@ class Projects::CommitsController < Projects::ApplicationController before_action :validate_ref!, except: :commits_root before_action :set_commits, except: :commits_root + feature_category :source_code_management + def commits_root redirect_to project_commits_path(@project, @project.default_branch) end diff --git a/app/controllers/projects/compare_controller.rb b/app/controllers/projects/compare_controller.rb index 943277afe95..6be0b465402 100644 --- a/app/controllers/projects/compare_controller.rb +++ b/app/controllers/projects/compare_controller.rb @@ -19,6 +19,8 @@ class Projects::CompareController < Projects::ApplicationController # Validation before_action :validate_refs! + feature_category :source_code_management + def index end diff --git a/app/controllers/projects/confluences_controller.rb b/app/controllers/projects/confluences_controller.rb index d563b34a362..fccbdf0bf91 100644 --- a/app/controllers/projects/confluences_controller.rb +++ b/app/controllers/projects/confluences_controller.rb @@ -3,6 +3,8 @@ class Projects::ConfluencesController < Projects::ApplicationController before_action :ensure_confluence + feature_category :integrations + def show end diff --git a/app/controllers/projects/cycle_analytics/events_controller.rb b/app/controllers/projects/cycle_analytics/events_controller.rb index c69bf029c73..3a5dd23047c 100644 --- a/app/controllers/projects/cycle_analytics/events_controller.rb +++ b/app/controllers/projects/cycle_analytics/events_controller.rb @@ -11,6 +11,8 @@ module Projects before_action :authorize_read_issue!, only: [:issue, :production] before_action :authorize_read_merge_request!, only: [:code, :review] + feature_category :planning_analytics + def issue render_events(cycle_analytics[:issue].events) end diff --git a/app/controllers/projects/cycle_analytics_controller.rb b/app/controllers/projects/cycle_analytics_controller.rb index ef97bc795f9..1ddc9d567e0 100644 --- a/app/controllers/projects/cycle_analytics_controller.rb +++ b/app/controllers/projects/cycle_analytics_controller.rb @@ -12,6 +12,8 @@ class Projects::CycleAnalyticsController < Projects::ApplicationController track_unique_visits :show, target_id: 'p_analytics_valuestream' + feature_category :planning_analytics + def show @cycle_analytics = ::CycleAnalytics::ProjectLevel.new(@project, options: options(cycle_analytics_project_params)) diff --git a/app/controllers/projects/deploy_keys_controller.rb b/app/controllers/projects/deploy_keys_controller.rb index 4f4adaea56e..ce25f86d692 100644 --- a/app/controllers/projects/deploy_keys_controller.rb +++ b/app/controllers/projects/deploy_keys_controller.rb @@ -10,6 +10,8 @@ class Projects::DeployKeysController < Projects::ApplicationController layout 'project_settings' + feature_category :continuous_delivery + def index respond_to do |format| format.html { redirect_to_repository } diff --git a/app/controllers/projects/deploy_tokens_controller.rb b/app/controllers/projects/deploy_tokens_controller.rb index 830b1f4fe4a..3c890bbafdf 100644 --- a/app/controllers/projects/deploy_tokens_controller.rb +++ b/app/controllers/projects/deploy_tokens_controller.rb @@ -3,6 +3,8 @@ class Projects::DeployTokensController < Projects::ApplicationController before_action :authorize_admin_project! + feature_category :continuous_delivery + def revoke @token = @project.deploy_tokens.find(params[:id]) @token.revoke! diff --git a/app/controllers/projects/deployments_controller.rb b/app/controllers/projects/deployments_controller.rb index 1344cf775e4..231684427fb 100644 --- a/app/controllers/projects/deployments_controller.rb +++ b/app/controllers/projects/deployments_controller.rb @@ -3,6 +3,8 @@ class Projects::DeploymentsController < Projects::ApplicationController before_action :authorize_read_deployment! + feature_category :continuous_delivery + # rubocop: disable CodeReuse/ActiveRecord def index deployments = environment.deployments.reorder(created_at: :desc) diff --git a/app/controllers/projects/design_management/designs_controller.rb b/app/controllers/projects/design_management/designs_controller.rb index fec09fa9515..550d8578396 100644 --- a/app/controllers/projects/design_management/designs_controller.rb +++ b/app/controllers/projects/design_management/designs_controller.rb @@ -3,6 +3,8 @@ class Projects::DesignManagement::DesignsController < Projects::ApplicationController before_action :authorize_read_design! + feature_category :design_management + private def authorize_read_design! diff --git a/app/controllers/projects/discussions_controller.rb b/app/controllers/projects/discussions_controller.rb index 06231607f73..b9ab1076999 100644 --- a/app/controllers/projects/discussions_controller.rb +++ b/app/controllers/projects/discussions_controller.rb @@ -9,6 +9,8 @@ class Projects::DiscussionsController < Projects::ApplicationController before_action :discussion, only: [:resolve, :unresolve] before_action :authorize_resolve_discussion!, only: [:resolve, :unresolve] + feature_category :issue_tracking + def resolve Discussions::ResolveService.new(project, current_user, one_or_more_discussions: discussion).execute diff --git a/app/controllers/projects/environments/prometheus_api_controller.rb b/app/controllers/projects/environments/prometheus_api_controller.rb index f0bb5360f84..97810d7d439 100644 --- a/app/controllers/projects/environments/prometheus_api_controller.rb +++ b/app/controllers/projects/environments/prometheus_api_controller.rb @@ -5,6 +5,8 @@ class Projects::Environments::PrometheusApiController < Projects::ApplicationCon before_action :proxyable + feature_category :metrics + private def proxyable diff --git a/app/controllers/projects/environments/sample_metrics_controller.rb b/app/controllers/projects/environments/sample_metrics_controller.rb index 9176c7cbd56..3df20810cb3 100644 --- a/app/controllers/projects/environments/sample_metrics_controller.rb +++ b/app/controllers/projects/environments/sample_metrics_controller.rb @@ -1,6 +1,8 @@ # frozen_string_literal: true class Projects::Environments::SampleMetricsController < Projects::ApplicationController + feature_category :metrics + def query result = Metrics::SampleMetricsService.new(params[:identifier], range_start: params[:start], range_end: params[:end]).query diff --git a/app/controllers/projects/environments_controller.rb b/app/controllers/projects/environments_controller.rb index 71195fdb892..c37abf82fe9 100644 --- a/app/controllers/projects/environments_controller.rb +++ b/app/controllers/projects/environments_controller.rb @@ -25,6 +25,8 @@ class Projects::EnvironmentsController < Projects::ApplicationController before_action :expire_etag_cache, only: [:index], unless: -> { request.format.json? } after_action :expire_etag_cache, only: [:cancel_auto_stop] + feature_category :continuous_delivery + def index @environments = project.environments .with_state(params[:scope] || :available) diff --git a/app/controllers/projects/error_tracking/base_controller.rb b/app/controllers/projects/error_tracking/base_controller.rb index 6efc6d00702..ffbe487d8a1 100644 --- a/app/controllers/projects/error_tracking/base_controller.rb +++ b/app/controllers/projects/error_tracking/base_controller.rb @@ -3,6 +3,8 @@ class Projects::ErrorTracking::BaseController < Projects::ApplicationController POLLING_INTERVAL = 1_000 + feature_category :error_tracking + def set_polling_interval Gitlab::PollingInterval.set_header(response, interval: POLLING_INTERVAL) end diff --git a/app/controllers/projects/error_tracking/projects_controller.rb b/app/controllers/projects/error_tracking/projects_controller.rb index 75a2c976d8b..d59cbc25d25 100644 --- a/app/controllers/projects/error_tracking/projects_controller.rb +++ b/app/controllers/projects/error_tracking/projects_controller.rb @@ -7,6 +7,8 @@ module Projects before_action :authorize_read_sentry_issue! + feature_category :error_tracking + def index service = ::ErrorTracking::ListProjectsService.new( project, diff --git a/app/controllers/projects/feature_flags_clients_controller.rb b/app/controllers/projects/feature_flags_clients_controller.rb index 02c9d9ab8fb..9a1f8932a27 100644 --- a/app/controllers/projects/feature_flags_clients_controller.rb +++ b/app/controllers/projects/feature_flags_clients_controller.rb @@ -4,6 +4,8 @@ class Projects::FeatureFlagsClientsController < Projects::ApplicationController before_action :authorize_admin_feature_flags_client! before_action :feature_flags_client + feature_category :feature_flags + def reset_token feature_flags_client.reset_token! diff --git a/app/controllers/projects/feature_flags_controller.rb b/app/controllers/projects/feature_flags_controller.rb index 4452b61508b..e9d450a6ce3 100644 --- a/app/controllers/projects/feature_flags_controller.rb +++ b/app/controllers/projects/feature_flags_controller.rb @@ -19,6 +19,8 @@ class Projects::FeatureFlagsController < Projects::ApplicationController push_frontend_feature_flag(:feature_flags_legacy_read_only_override, project) end + feature_category :feature_flags + def index @feature_flags = FeatureFlagsFinder .new(project, current_user, scope: params[:scope]) diff --git a/app/controllers/projects/feature_flags_user_lists_controller.rb b/app/controllers/projects/feature_flags_user_lists_controller.rb index 5427a892bff..7be3254e966 100644 --- a/app/controllers/projects/feature_flags_user_lists_controller.rb +++ b/app/controllers/projects/feature_flags_user_lists_controller.rb @@ -4,6 +4,8 @@ class Projects::FeatureFlagsUserListsController < Projects::ApplicationControlle before_action :authorize_admin_feature_flags_user_lists! before_action :user_list, only: [:edit, :show] + feature_category :feature_flags + def new end diff --git a/app/controllers/projects/find_file_controller.rb b/app/controllers/projects/find_file_controller.rb index c026e9ff332..89e72d98a33 100644 --- a/app/controllers/projects/find_file_controller.rb +++ b/app/controllers/projects/find_file_controller.rb @@ -10,6 +10,8 @@ class Projects::FindFileController < Projects::ApplicationController before_action :assign_ref_vars before_action :authorize_download_code! + feature_category :source_code_management + def show return render_404 unless @repository.commit(@ref) diff --git a/app/controllers/projects/forks_controller.rb b/app/controllers/projects/forks_controller.rb index c6b6b825bb7..1c2930f6e9b 100644 --- a/app/controllers/projects/forks_controller.rb +++ b/app/controllers/projects/forks_controller.rb @@ -14,6 +14,8 @@ class Projects::ForksController < Projects::ApplicationController before_action :authorize_fork_project!, only: [:new, :create] before_action :authorize_fork_namespace!, only: [:create] + feature_category :source_code_management + def index @total_forks_count = project.forks.size @public_forks_count = project.forks.public_only.size diff --git a/app/controllers/projects/grafana_api_controller.rb b/app/controllers/projects/grafana_api_controller.rb index c9870f1be2b..9c5d6c8ebc3 100644 --- a/app/controllers/projects/grafana_api_controller.rb +++ b/app/controllers/projects/grafana_api_controller.rb @@ -4,6 +4,8 @@ class Projects::GrafanaApiController < Projects::ApplicationController include RenderServiceResults include MetricsDashboard + feature_category :metrics + def proxy result = ::Grafana::ProxyService.new( project, diff --git a/app/controllers/projects/graphs_controller.rb b/app/controllers/projects/graphs_controller.rb index 91c07c37d2a..2b030793c58 100644 --- a/app/controllers/projects/graphs_controller.rb +++ b/app/controllers/projects/graphs_controller.rb @@ -11,6 +11,8 @@ class Projects::GraphsController < Projects::ApplicationController track_unique_visits :charts, target_id: 'p_analytics_repo' + feature_category :source_code_management + def show respond_to do |format| format.html diff --git a/app/controllers/projects/group_links_controller.rb b/app/controllers/projects/group_links_controller.rb index f8ea6f834a3..c6c90ffaba2 100644 --- a/app/controllers/projects/group_links_controller.rb +++ b/app/controllers/projects/group_links_controller.rb @@ -5,6 +5,8 @@ class Projects::GroupLinksController < Projects::ApplicationController before_action :authorize_admin_project! before_action :authorize_admin_project_member!, only: [:update] + feature_category :subgroups + def create group = Group.find(params[:link_group_id]) if params[:link_group_id].present? diff --git a/app/controllers/projects/hook_logs_controller.rb b/app/controllers/projects/hook_logs_controller.rb index ed7e7b68acb..99ebe3335c0 100644 --- a/app/controllers/projects/hook_logs_controller.rb +++ b/app/controllers/projects/hook_logs_controller.rb @@ -12,6 +12,8 @@ class Projects::HookLogsController < Projects::ApplicationController layout 'project_settings' + feature_category :integrations + def show end diff --git a/app/controllers/projects/hooks_controller.rb b/app/controllers/projects/hooks_controller.rb index 47f2e4323f2..8dabf3e640b 100644 --- a/app/controllers/projects/hooks_controller.rb +++ b/app/controllers/projects/hooks_controller.rb @@ -12,6 +12,8 @@ class Projects::HooksController < Projects::ApplicationController layout "project_settings" + feature_category :integrations + def index @hooks = @project.hooks @hook = ProjectHook.new diff --git a/app/controllers/projects/import/jira_controller.rb b/app/controllers/projects/import/jira_controller.rb index 976ac7df976..8418a607659 100644 --- a/app/controllers/projects/import/jira_controller.rb +++ b/app/controllers/projects/import/jira_controller.rb @@ -7,6 +7,8 @@ module Projects before_action :authorize_read_project! before_action :validate_jira_import_settings! + feature_category :integrations + def show end diff --git a/app/controllers/projects/imports_controller.rb b/app/controllers/projects/imports_controller.rb index 9bed12fd151..6cdd1c0bc8c 100644 --- a/app/controllers/projects/imports_controller.rb +++ b/app/controllers/projects/imports_controller.rb @@ -11,6 +11,8 @@ class Projects::ImportsController < Projects::ApplicationController before_action :redirect_if_progress, except: :show before_action :redirect_if_no_import, only: :show + feature_category :importers + def new end diff --git a/app/controllers/projects/incident_management/pager_duty_incidents_controller.rb b/app/controllers/projects/incident_management/pager_duty_incidents_controller.rb index dac1640dd08..f1264ca4a45 100644 --- a/app/controllers/projects/incident_management/pager_duty_incidents_controller.rb +++ b/app/controllers/projects/incident_management/pager_duty_incidents_controller.rb @@ -10,6 +10,8 @@ module Projects prepend_before_action :project_without_auth + feature_category :incident_management + def create result = webhook_processor.execute(params[:token]) diff --git a/app/controllers/projects/incidents_controller.rb b/app/controllers/projects/incidents_controller.rb index 5fef19362da..3395e75666e 100644 --- a/app/controllers/projects/incidents_controller.rb +++ b/app/controllers/projects/incidents_controller.rb @@ -7,6 +7,8 @@ class Projects::IncidentsController < Projects::ApplicationController before_action :authorize_read_issue! before_action :load_incident, only: [:show] + feature_category :incident_management + def index end diff --git a/app/controllers/projects/issue_links_controller.rb b/app/controllers/projects/issue_links_controller.rb index 2f7489373ed..35f3e00fae7 100644 --- a/app/controllers/projects/issue_links_controller.rb +++ b/app/controllers/projects/issue_links_controller.rb @@ -7,6 +7,8 @@ module Projects before_action :authorize_admin_issue_link!, only: [:create, :destroy] before_action :authorize_issue_link_association!, only: :destroy + feature_category :issue_tracking + private def authorize_admin_issue_link! diff --git a/app/controllers/projects/issues_controller.rb b/app/controllers/projects/issues_controller.rb index 319a5183429..1722dfa55bb 100644 --- a/app/controllers/projects/issues_controller.rb +++ b/app/controllers/projects/issues_controller.rb @@ -65,6 +65,17 @@ class Projects::IssuesController < Projects::ApplicationController alias_method :designs, :show + feature_category :issue_tracking, [ + :index, :calendar, :show, :new, :create, :edit, :update, + :destroy, :move, :reorder, :designs, :toggle_subscription, + :discussions, :bulk_update, :realtime_changes, + :toggle_award_emoji, :mark_as_spam, :related_branches, + :can_create_branch, :create_merge_request + ] + + feature_category :service_desk, [:service_desk] + feature_category :importers, [:import_csv, :export_csv] + def index @issues = @issuables diff --git a/app/controllers/projects/jobs_controller.rb b/app/controllers/projects/jobs_controller.rb index a8ac20cf96b..2a7dbbb43d7 100644 --- a/app/controllers/projects/jobs_controller.rb +++ b/app/controllers/projects/jobs_controller.rb @@ -16,6 +16,8 @@ class Projects::JobsController < Projects::ApplicationController layout 'project' + feature_category :continuous_integration + def index # We need all builds for tabs counters @all_builds = Ci::JobsFinder.new(current_user: current_user, project: @project).execute diff --git a/app/controllers/projects/labels_controller.rb b/app/controllers/projects/labels_controller.rb index ca2fad35451..ba8e6b90971 100644 --- a/app/controllers/projects/labels_controller.rb +++ b/app/controllers/projects/labels_controller.rb @@ -15,6 +15,8 @@ class Projects::LabelsController < Projects::ApplicationController respond_to :js, :html + feature_category :issue_tracking + def index @prioritized_labels = @available_labels.prioritized(@project) @labels = @available_labels.unprioritized(@project).page(params[:page]) diff --git a/app/controllers/projects/logs_controller.rb b/app/controllers/projects/logs_controller.rb index b9027b3a2cb..b9aa9bfc947 100644 --- a/app/controllers/projects/logs_controller.rb +++ b/app/controllers/projects/logs_controller.rb @@ -7,6 +7,8 @@ module Projects before_action :authorize_read_pod_logs! before_action :ensure_deployments, only: %i(k8s elasticsearch) + feature_category :logging + def index if environment || cluster render :index diff --git a/app/controllers/projects/mattermosts_controller.rb b/app/controllers/projects/mattermosts_controller.rb index cfaeddf711a..63a36732d87 100644 --- a/app/controllers/projects/mattermosts_controller.rb +++ b/app/controllers/projects/mattermosts_controller.rb @@ -10,6 +10,8 @@ class Projects::MattermostsController < Projects::ApplicationController before_action :service before_action :teams, only: [:new] + feature_category :integrations + def new end diff --git a/app/controllers/projects/merge_requests/application_controller.rb b/app/controllers/projects/merge_requests/application_controller.rb index 7b4024ed79c..9cac9f37eb7 100644 --- a/app/controllers/projects/merge_requests/application_controller.rb +++ b/app/controllers/projects/merge_requests/application_controller.rb @@ -5,6 +5,8 @@ class Projects::MergeRequests::ApplicationController < Projects::ApplicationCont before_action :merge_request before_action :authorize_read_merge_request! + feature_category :code_review + private def merge_request diff --git a/app/controllers/projects/metrics/dashboards/builder_controller.rb b/app/controllers/projects/metrics/dashboards/builder_controller.rb index 2ab574d7d10..96ca6d89111 100644 --- a/app/controllers/projects/metrics/dashboards/builder_controller.rb +++ b/app/controllers/projects/metrics/dashboards/builder_controller.rb @@ -6,6 +6,8 @@ module Projects class BuilderController < Projects::ApplicationController before_action :authorize_metrics_dashboard! + feature_category :metrics + def panel_preview respond_to do |format| format.json do diff --git a/app/controllers/projects/metrics_dashboard_controller.rb b/app/controllers/projects/metrics_dashboard_controller.rb index bc0a701b9fd..3f10749602e 100644 --- a/app/controllers/projects/metrics_dashboard_controller.rb +++ b/app/controllers/projects/metrics_dashboard_controller.rb @@ -14,6 +14,8 @@ module Projects push_frontend_feature_flag(:disable_metric_dashboard_refresh_rate) end + feature_category :metrics + def show if environment render 'projects/environments/metrics' diff --git a/app/controllers/projects/milestones_controller.rb b/app/controllers/projects/milestones_controller.rb index 8049a17068b..e6c4af00b29 100644 --- a/app/controllers/projects/milestones_controller.rb +++ b/app/controllers/projects/milestones_controller.rb @@ -21,6 +21,8 @@ class Projects::MilestonesController < Projects::ApplicationController respond_to :html + feature_category :issue_tracking + def index @sort = params[:sort] || 'due_date_asc' @milestones = milestones.sort_by_attribute(@sort) diff --git a/app/controllers/projects/mirrors_controller.rb b/app/controllers/projects/mirrors_controller.rb index 518e6a92afa..01abb72fc86 100644 --- a/app/controllers/projects/mirrors_controller.rb +++ b/app/controllers/projects/mirrors_controller.rb @@ -10,6 +10,8 @@ class Projects::MirrorsController < Projects::ApplicationController layout "project_settings" + feature_category :source_code_management + def show redirect_to_repository_settings(project, anchor: 'js-push-remote-settings') end diff --git a/app/controllers/projects/network_controller.rb b/app/controllers/projects/network_controller.rb index 47788438da9..89b679fc033 100644 --- a/app/controllers/projects/network_controller.rb +++ b/app/controllers/projects/network_controller.rb @@ -11,6 +11,8 @@ class Projects::NetworkController < Projects::ApplicationController before_action :assign_options before_action :assign_commit + feature_category :source_code_management + def show @url = project_network_path(@project, @ref, @options.merge(format: :json)) @commit_url = project_commit_path(@project, 'ae45ca32').gsub("ae45ca32", "%s") diff --git a/app/controllers/projects/notes_controller.rb b/app/controllers/projects/notes_controller.rb index c0b8c9e550d..e50e293a103 100644 --- a/app/controllers/projects/notes_controller.rb +++ b/app/controllers/projects/notes_controller.rb @@ -11,6 +11,8 @@ class Projects::NotesController < Projects::ApplicationController before_action :authorize_create_note!, only: [:create] before_action :authorize_resolve_note!, only: [:resolve, :unresolve] + feature_category :issue_tracking + def delete_attachment note.remove_attachment! note.update_attribute(:attachment, nil) diff --git a/app/controllers/projects/packages/package_files_controller.rb b/app/controllers/projects/packages/package_files_controller.rb index dd6d875cd1e..32aadb4fcf4 100644 --- a/app/controllers/projects/packages/package_files_controller.rb +++ b/app/controllers/projects/packages/package_files_controller.rb @@ -6,6 +6,8 @@ module Projects include PackagesAccess include SendFileUpload + feature_category :package_registry + def download package_file = project.package_files.find(params[:id]) diff --git a/app/controllers/projects/packages/packages_controller.rb b/app/controllers/projects/packages/packages_controller.rb index 302847eeaf5..15dc11f5df8 100644 --- a/app/controllers/projects/packages/packages_controller.rb +++ b/app/controllers/projects/packages/packages_controller.rb @@ -5,6 +5,8 @@ module Projects class PackagesController < Projects::ApplicationController include PackagesAccess + feature_category :package_registry + def show @package = project.packages.find(params[:id]) @package_files = @package.package_files.recent diff --git a/app/controllers/projects/pages_controller.rb b/app/controllers/projects/pages_controller.rb index 9ad6bf4095a..0aac517e3e3 100644 --- a/app/controllers/projects/pages_controller.rb +++ b/app/controllers/projects/pages_controller.rb @@ -8,6 +8,8 @@ class Projects::PagesController < Projects::ApplicationController before_action :authorize_update_pages!, except: [:show, :destroy] before_action :authorize_remove_pages!, only: [:destroy] + feature_category :pages + # rubocop: disable CodeReuse/ActiveRecord def show @domains = @project.pages_domains.order(:domain).present(current_user: current_user) diff --git a/app/controllers/projects/pages_domains_controller.rb b/app/controllers/projects/pages_domains_controller.rb index cccf8fe4358..a6b22a28b17 100644 --- a/app/controllers/projects/pages_domains_controller.rb +++ b/app/controllers/projects/pages_domains_controller.rb @@ -9,6 +9,8 @@ class Projects::PagesDomainsController < Projects::ApplicationController helper_method :domain_presenter + feature_category :pages + def show end diff --git a/app/controllers/projects/performance_monitoring/dashboards_controller.rb b/app/controllers/projects/performance_monitoring/dashboards_controller.rb index ec5a33f5dd6..51a07c1b7a5 100644 --- a/app/controllers/projects/performance_monitoring/dashboards_controller.rb +++ b/app/controllers/projects/performance_monitoring/dashboards_controller.rb @@ -12,6 +12,8 @@ module Projects respond_error(http_status: :bad_request, message: _('Request parameter %{param} is missing.') % { param: exception.param }) end + feature_category :metrics + def create result = ::Metrics::Dashboard::CloneDashboardService.new(project, current_user, dashboard_params).execute diff --git a/app/controllers/projects/pipeline_schedules_controller.rb b/app/controllers/projects/pipeline_schedules_controller.rb index e7e8a900060..5655d3b4c0d 100644 --- a/app/controllers/projects/pipeline_schedules_controller.rb +++ b/app/controllers/projects/pipeline_schedules_controller.rb @@ -10,6 +10,8 @@ class Projects::PipelineSchedulesController < Projects::ApplicationController before_action :authorize_update_pipeline_schedule!, except: [:index, :new, :create, :play] before_action :authorize_admin_pipeline_schedule!, only: [:destroy] + feature_category :continuous_integration + # rubocop: disable CodeReuse/ActiveRecord def index @scope = params[:scope] diff --git a/app/controllers/projects/pipelines/application_controller.rb b/app/controllers/projects/pipelines/application_controller.rb index 92887750813..c147d697888 100644 --- a/app/controllers/projects/pipelines/application_controller.rb +++ b/app/controllers/projects/pipelines/application_controller.rb @@ -10,6 +10,8 @@ module Projects before_action :pipeline before_action :authorize_read_pipeline! + feature_category :continuous_integration + private def pipeline diff --git a/app/controllers/projects/pipelines_controller.rb b/app/controllers/projects/pipelines_controller.rb index 8676c90ca86..954b55a821a 100644 --- a/app/controllers/projects/pipelines_controller.rb +++ b/app/controllers/projects/pipelines_controller.rb @@ -31,6 +31,8 @@ class Projects::PipelinesController < Projects::ApplicationController POLLING_INTERVAL = 10_000 + feature_category :continuous_integration + def index @pipelines = Ci::PipelinesFinder .new(project, current_user, index_params) diff --git a/app/controllers/projects/pipelines_settings_controller.rb b/app/controllers/projects/pipelines_settings_controller.rb index 7f988110977..6e08a889520 100644 --- a/app/controllers/projects/pipelines_settings_controller.rb +++ b/app/controllers/projects/pipelines_settings_controller.rb @@ -3,6 +3,8 @@ class Projects::PipelinesSettingsController < Projects::ApplicationController before_action :authorize_admin_pipeline! + feature_category :continuous_integration + def show redirect_to project_settings_ci_cd_path(@project, params: params.to_unsafe_h) end diff --git a/app/controllers/projects/product_analytics_controller.rb b/app/controllers/projects/product_analytics_controller.rb index c019dc191d6..5db7585d8e0 100644 --- a/app/controllers/projects/product_analytics_controller.rb +++ b/app/controllers/projects/product_analytics_controller.rb @@ -5,6 +5,8 @@ class Projects::ProductAnalyticsController < Projects::ApplicationController before_action :authorize_read_product_analytics! before_action :tracker_variables, only: [:setup, :test] + feature_category :product_analytics + def index @events = product_analytics_events.order_by_time.page(params[:page]) end diff --git a/app/controllers/projects/project_members_controller.rb b/app/controllers/projects/project_members_controller.rb index 3e52248f292..19d12e77217 100644 --- a/app/controllers/projects/project_members_controller.rb +++ b/app/controllers/projects/project_members_controller.rb @@ -8,6 +8,8 @@ class Projects::ProjectMembersController < Projects::ApplicationController # Authorize before_action :authorize_admin_project_member!, except: [:index, :leave, :request_access] + feature_category :authentication_and_authorization + def index @sort = params[:sort].presence || sort_value_name diff --git a/app/controllers/projects/prometheus/alerts_controller.rb b/app/controllers/projects/prometheus/alerts_controller.rb index c6ae65f7832..2892542e63c 100644 --- a/app/controllers/projects/prometheus/alerts_controller.rb +++ b/app/controllers/projects/prometheus/alerts_controller.rb @@ -16,6 +16,8 @@ module Projects before_action :authorize_read_prometheus_alerts!, except: [:notify] before_action :alert, only: [:update, :show, :destroy, :metrics_dashboard] + feature_category :alert_management + def index render json: serialize_as_json(alerts) end diff --git a/app/controllers/projects/prometheus/metrics_controller.rb b/app/controllers/projects/prometheus/metrics_controller.rb index 0340cb5beb0..d70d29a341f 100644 --- a/app/controllers/projects/prometheus/metrics_controller.rb +++ b/app/controllers/projects/prometheus/metrics_controller.rb @@ -6,6 +6,8 @@ module Projects before_action :authorize_admin_project! before_action :require_prometheus_metrics! + feature_category :metrics + def active_common respond_to do |format| format.json do diff --git a/app/controllers/projects/protected_refs_controller.rb b/app/controllers/projects/protected_refs_controller.rb index f1a7ac36138..4cba1a75330 100644 --- a/app/controllers/projects/protected_refs_controller.rb +++ b/app/controllers/projects/protected_refs_controller.rb @@ -10,6 +10,8 @@ class Projects::ProtectedRefsController < Projects::ApplicationController layout "project_settings" + feature_category :source_code_management + def index redirect_to_repository_settings(@project) end diff --git a/app/controllers/projects/raw_controller.rb b/app/controllers/projects/raw_controller.rb index 29f1e4bfd44..a9490c106d4 100644 --- a/app/controllers/projects/raw_controller.rb +++ b/app/controllers/projects/raw_controller.rb @@ -15,6 +15,8 @@ class Projects::RawController < Projects::ApplicationController before_action :no_cache_headers, only: [:show] before_action :redirect_to_external_storage, only: :show, if: :static_objects_external_storage_enabled? + feature_category :source_code_management + def show @blob = @repository.blob_at(@commit.id, @path) diff --git a/app/controllers/projects/refs_controller.rb b/app/controllers/projects/refs_controller.rb index db770d3e438..4d23c853334 100644 --- a/app/controllers/projects/refs_controller.rb +++ b/app/controllers/projects/refs_controller.rb @@ -11,6 +11,8 @@ class Projects::RefsController < Projects::ApplicationController before_action :assign_ref_vars before_action :authorize_download_code! + feature_category :source_code_management + def switch respond_to do |format| format.html do diff --git a/app/controllers/projects/registry/application_controller.rb b/app/controllers/projects/registry/application_controller.rb index 2f891d78c91..e7bf8c8e757 100644 --- a/app/controllers/projects/registry/application_controller.rb +++ b/app/controllers/projects/registry/application_controller.rb @@ -8,6 +8,8 @@ module Projects before_action :verify_registry_enabled! before_action :authorize_read_container_image! + feature_category :container_registry + private def verify_registry_enabled! diff --git a/app/controllers/projects/releases/evidences_controller.rb b/app/controllers/projects/releases/evidences_controller.rb index 34e450d903f..1e2dbf8047c 100644 --- a/app/controllers/projects/releases/evidences_controller.rb +++ b/app/controllers/projects/releases/evidences_controller.rb @@ -7,6 +7,8 @@ module Projects before_action :release before_action :authorize_read_release_evidence! + feature_category :release_evidence + def show respond_to do |format| format.json do diff --git a/app/controllers/projects/releases_controller.rb b/app/controllers/projects/releases_controller.rb index f48afce98fa..b8c6d1d6c9e 100644 --- a/app/controllers/projects/releases_controller.rb +++ b/app/controllers/projects/releases_controller.rb @@ -13,6 +13,8 @@ class Projects::ReleasesController < Projects::ApplicationController before_action :authorize_update_release!, only: %i[edit update] before_action :authorize_create_release!, only: :new + feature_category :release_orchestration + def index respond_to do |format| format.html do diff --git a/app/controllers/projects/repositories_controller.rb b/app/controllers/projects/repositories_controller.rb index 303326bbe23..ba3ab52e3af 100644 --- a/app/controllers/projects/repositories_controller.rb +++ b/app/controllers/projects/repositories_controller.rb @@ -18,6 +18,8 @@ class Projects::RepositoriesController < Projects::ApplicationController before_action :authorize_admin_project!, only: :create before_action :redirect_to_external_storage, only: :archive, if: :static_objects_external_storage_enabled? + feature_category :source_code_management + def create @project.create_repository diff --git a/app/controllers/projects/runner_projects_controller.rb b/app/controllers/projects/runner_projects_controller.rb index cbeb32fd610..d225d5e104c 100644 --- a/app/controllers/projects/runner_projects_controller.rb +++ b/app/controllers/projects/runner_projects_controller.rb @@ -5,6 +5,8 @@ class Projects::RunnerProjectsController < Projects::ApplicationController layout 'project_settings' + feature_category :continuous_integration + def create @runner = Ci::Runner.find(params[:runner_project][:runner_id]) diff --git a/app/controllers/projects/runners_controller.rb b/app/controllers/projects/runners_controller.rb index fb00156d320..544074f9840 100644 --- a/app/controllers/projects/runners_controller.rb +++ b/app/controllers/projects/runners_controller.rb @@ -6,6 +6,8 @@ class Projects::RunnersController < Projects::ApplicationController layout 'project_settings' + feature_category :continuous_integration + def index redirect_to project_settings_ci_cd_path(@project, anchor: 'js-runners-settings') end diff --git a/app/controllers/projects/serverless/functions_controller.rb b/app/controllers/projects/serverless/functions_controller.rb index 0b55414d390..4168880001c 100644 --- a/app/controllers/projects/serverless/functions_controller.rb +++ b/app/controllers/projects/serverless/functions_controller.rb @@ -5,6 +5,8 @@ module Projects class FunctionsController < Projects::ApplicationController before_action :authorize_read_cluster! + feature_category :serverless + def index respond_to do |format| format.json do diff --git a/app/controllers/projects/service_desk_controller.rb b/app/controllers/projects/service_desk_controller.rb index bcd190bbc2c..f7c0a54fb9e 100644 --- a/app/controllers/projects/service_desk_controller.rb +++ b/app/controllers/projects/service_desk_controller.rb @@ -3,6 +3,8 @@ class Projects::ServiceDeskController < Projects::ApplicationController before_action :authorize_admin_project! + feature_category :service_desk + def show json_response end diff --git a/app/controllers/projects/services_controller.rb b/app/controllers/projects/services_controller.rb index 41ce834c658..93ad549bc50 100644 --- a/app/controllers/projects/services_controller.rb +++ b/app/controllers/projects/services_controller.rb @@ -19,6 +19,8 @@ class Projects::ServicesController < Projects::ApplicationController layout "project_settings" + feature_category :integrations + def edit @default_integration = Service.default_integration(service.type, project) end diff --git a/app/controllers/projects/settings/access_tokens_controller.rb b/app/controllers/projects/settings/access_tokens_controller.rb index d6b4c4dd5dc..cbd6716fdf7 100644 --- a/app/controllers/projects/settings/access_tokens_controller.rb +++ b/app/controllers/projects/settings/access_tokens_controller.rb @@ -7,6 +7,8 @@ module Projects before_action :check_feature_availability + feature_category :authentication_and_authorization + def index @project_access_token = PersonalAccessToken.new set_index_vars diff --git a/app/controllers/projects/settings/ci_cd_controller.rb b/app/controllers/projects/settings/ci_cd_controller.rb index b1c9a412cc7..0920a27fcfb 100644 --- a/app/controllers/projects/settings/ci_cd_controller.rb +++ b/app/controllers/projects/settings/ci_cd_controller.rb @@ -14,6 +14,8 @@ module Projects helper_method :highlight_badge + feature_category :continuous_integration + def show if Feature.enabled?(:ci_pipeline_triggers_settings_vue_ui, @project) @triggers_json = ::Ci::TriggerSerializer.new.represent( diff --git a/app/controllers/projects/settings/integrations_controller.rb b/app/controllers/projects/settings/integrations_controller.rb index 96bf7f474d1..fba11ff1497 100644 --- a/app/controllers/projects/settings/integrations_controller.rb +++ b/app/controllers/projects/settings/integrations_controller.rb @@ -6,6 +6,8 @@ module Projects before_action :authorize_admin_project! layout "project_settings" + feature_category :integrations + def show @services = @project.find_or_initialize_services end diff --git a/app/controllers/projects/settings/operations_controller.rb b/app/controllers/projects/settings/operations_controller.rb index 60f61fd7a33..c407b15e29f 100644 --- a/app/controllers/projects/settings/operations_controller.rb +++ b/app/controllers/projects/settings/operations_controller.rb @@ -11,6 +11,8 @@ module Projects helper_method :error_tracking_setting helper_method :tracing_setting + feature_category :incident_management + def update result = ::Projects::Operations::UpdateService.new(project, current_user, update_params).execute diff --git a/app/controllers/projects/settings/repository_controller.rb b/app/controllers/projects/settings/repository_controller.rb index 182968b9a41..0994bebb1d0 100644 --- a/app/controllers/projects/settings/repository_controller.rb +++ b/app/controllers/projects/settings/repository_controller.rb @@ -10,6 +10,9 @@ module Projects push_frontend_feature_flag(:deploy_keys_on_protected_branches, @project) end + feature_category :source_code_management, [:show, :cleanup] + feature_category :continuous_delivery, [:create_deploy_token] + def show render_show end diff --git a/app/controllers/projects/snippets/application_controller.rb b/app/controllers/projects/snippets/application_controller.rb index 3f488b07e96..8ee12bf3795 100644 --- a/app/controllers/projects/snippets/application_controller.rb +++ b/app/controllers/projects/snippets/application_controller.rb @@ -4,6 +4,8 @@ class Projects::Snippets::ApplicationController < Projects::ApplicationControlle include FindSnippet include SnippetAuthorizations + feature_category :snippets + private # This overrides the default snippet create authorization diff --git a/app/controllers/projects/starrers_controller.rb b/app/controllers/projects/starrers_controller.rb index d9654f4f72a..91f49fc4d66 100644 --- a/app/controllers/projects/starrers_controller.rb +++ b/app/controllers/projects/starrers_controller.rb @@ -3,6 +3,8 @@ class Projects::StarrersController < Projects::ApplicationController include SortingHelper + feature_category :projects + def index @starrers = UsersStarProjectsFinder.new(@project, params, current_user: @current_user).execute @sort = params[:sort].presence || sort_value_name diff --git a/app/controllers/projects/static_site_editor_controller.rb b/app/controllers/projects/static_site_editor_controller.rb index f99ffe170b0..036c731f480 100644 --- a/app/controllers/projects/static_site_editor_controller.rb +++ b/app/controllers/projects/static_site_editor_controller.rb @@ -13,6 +13,8 @@ class Projects::StaticSiteEditorController < Projects::ApplicationController push_frontend_feature_flag(:sse_image_uploads) end + feature_category :static_site_editor + def show service_response = ::StaticSiteEditor::ConfigService.new( container: project, diff --git a/app/controllers/projects/tags/releases_controller.rb b/app/controllers/projects/tags/releases_controller.rb index c1f4cbce054..8e5539f546b 100644 --- a/app/controllers/projects/tags/releases_controller.rb +++ b/app/controllers/projects/tags/releases_controller.rb @@ -8,6 +8,8 @@ class Projects::Tags::ReleasesController < Projects::ApplicationController before_action :tag before_action :release + feature_category :release_evidence + def edit end diff --git a/app/controllers/projects/tags_controller.rb b/app/controllers/projects/tags_controller.rb index 71effebf1c0..1d783241196 100644 --- a/app/controllers/projects/tags_controller.rb +++ b/app/controllers/projects/tags_controller.rb @@ -10,6 +10,9 @@ class Projects::TagsController < Projects::ApplicationController before_action :authorize_download_code! before_action :authorize_admin_tag!, only: [:new, :create, :destroy] + feature_category :source_code_management, [:index, :show, :new, :destroy] + feature_category :release_evidence, [:create] + # rubocop: disable CodeReuse/ActiveRecord def index params[:sort] = params[:sort].presence || sort_value_recently_updated diff --git a/app/controllers/projects/templates_controller.rb b/app/controllers/projects/templates_controller.rb index 95739f96d39..7ab23e39cf0 100644 --- a/app/controllers/projects/templates_controller.rb +++ b/app/controllers/projects/templates_controller.rb @@ -5,6 +5,8 @@ class Projects::TemplatesController < Projects::ApplicationController before_action :authorize_can_read_issuable! before_action :get_template_class + feature_category :templates + def show template = @template_type.find(params[:key], project) diff --git a/app/controllers/projects/todos_controller.rb b/app/controllers/projects/todos_controller.rb index 33205b93317..6ba89ab34f8 100644 --- a/app/controllers/projects/todos_controller.rb +++ b/app/controllers/projects/todos_controller.rb @@ -6,6 +6,8 @@ class Projects::TodosController < Projects::ApplicationController before_action :authenticate_user!, only: [:create] + feature_category :issue_tracking + private def issuable diff --git a/app/controllers/projects/tracings_controller.rb b/app/controllers/projects/tracings_controller.rb index 85098b66997..2bc0c590e8d 100644 --- a/app/controllers/projects/tracings_controller.rb +++ b/app/controllers/projects/tracings_controller.rb @@ -12,6 +12,8 @@ module Projects before_action :authorize_update_environment! + feature_category :tracing + def show end diff --git a/app/controllers/projects/tree_controller.rb b/app/controllers/projects/tree_controller.rb index 638e1a05c18..b5cfc3990b2 100644 --- a/app/controllers/projects/tree_controller.rb +++ b/app/controllers/projects/tree_controller.rb @@ -15,6 +15,8 @@ class Projects::TreeController < Projects::ApplicationController before_action :authorize_download_code! before_action :authorize_edit_tree!, only: [:create_dir] + feature_category :source_code_management + def show return render_404 unless @commit diff --git a/app/controllers/projects/triggers_controller.rb b/app/controllers/projects/triggers_controller.rb index 7159d0243a3..eec35fcec8d 100644 --- a/app/controllers/projects/triggers_controller.rb +++ b/app/controllers/projects/triggers_controller.rb @@ -8,6 +8,8 @@ class Projects::TriggersController < Projects::ApplicationController layout 'project_settings' + feature_category :continuous_integration + def index redirect_to project_settings_ci_cd_path(@project, anchor: 'js-pipeline-triggers') end diff --git a/app/controllers/projects/uploads_controller.rb b/app/controllers/projects/uploads_controller.rb index 72251988b5e..c15768e7bbb 100644 --- a/app/controllers/projects/uploads_controller.rb +++ b/app/controllers/projects/uploads_controller.rb @@ -11,6 +11,8 @@ class Projects::UploadsController < Projects::ApplicationController before_action :authorize_upload_file!, only: [:create, :authorize] before_action :verify_workhorse_api!, only: [:authorize] + feature_category :not_owned + private def upload_model_class diff --git a/app/controllers/projects/usage_ping_controller.rb b/app/controllers/projects/usage_ping_controller.rb index 0e2c8f879b1..9b4ddb326c1 100644 --- a/app/controllers/projects/usage_ping_controller.rb +++ b/app/controllers/projects/usage_ping_controller.rb @@ -3,6 +3,8 @@ class Projects::UsagePingController < Projects::ApplicationController before_action :authenticate_user! + feature_category :collection + def web_ide_clientside_preview return render_404 unless Gitlab::CurrentSettings.web_ide_clientside_preview_enabled? diff --git a/app/controllers/projects/variables_controller.rb b/app/controllers/projects/variables_controller.rb index 0fd047f90cf..d8efc1b7b54 100644 --- a/app/controllers/projects/variables_controller.rb +++ b/app/controllers/projects/variables_controller.rb @@ -3,6 +3,8 @@ class Projects::VariablesController < Projects::ApplicationController before_action :authorize_admin_build! + feature_category :continuous_integration + def show respond_to do |format| format.json do diff --git a/app/controllers/projects/web_ide_schemas_controller.rb b/app/controllers/projects/web_ide_schemas_controller.rb index 3d16a6fafd4..84a191815f4 100644 --- a/app/controllers/projects/web_ide_schemas_controller.rb +++ b/app/controllers/projects/web_ide_schemas_controller.rb @@ -3,6 +3,8 @@ class Projects::WebIdeSchemasController < Projects::ApplicationController before_action :authenticate_user! + feature_category :web_ide + def show return respond_422 unless branch_sha diff --git a/app/controllers/projects/web_ide_terminals_controller.rb b/app/controllers/projects/web_ide_terminals_controller.rb index 76bcaa9e80c..1d179765ad9 100644 --- a/app/controllers/projects/web_ide_terminals_controller.rb +++ b/app/controllers/projects/web_ide_terminals_controller.rb @@ -8,6 +8,8 @@ class Projects::WebIdeTerminalsController < Projects::ApplicationController before_action :authorize_read_web_ide_terminal!, except: [:check_config, :create] before_action :authorize_update_web_ide_terminal!, only: [:cancel, :retry] + feature_category :web_ide + def check_config return respond_422 unless branch_sha diff --git a/app/controllers/projects/wikis_controller.rb b/app/controllers/projects/wikis_controller.rb index d0aa733cadb..8f794512486 100644 --- a/app/controllers/projects/wikis_controller.rb +++ b/app/controllers/projects/wikis_controller.rb @@ -5,6 +5,8 @@ class Projects::WikisController < Projects::ApplicationController alias_method :container, :project + feature_category :wiki + def git_access end end diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index 88a4a276750..3bbfc8e20f1 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -47,6 +47,16 @@ class ProjectsController < Projects::ApplicationController layout :determine_layout + feature_category :projects, [ + :index, :show, :new, :create, :edit, :update, :transfer, + :destroy, :resolve, :archive, :unarchive, :toggle_star + ] + + feature_category :source_code_management, [:remove_fork, :housekeeping, :refs] + feature_category :issue_tracking, [:preview_markdown, :new_issuable_address] + feature_category :importers, [:export, :remove_export, :generate_new_export, :download_export] + feature_category :audit_events, [:activity] + def index redirect_to(current_user ? root_path : explore_root_path) end diff --git a/app/graphql/mutations/boards/create.rb b/app/graphql/mutations/boards/create.rb new file mode 100644 index 00000000000..e381205242e --- /dev/null +++ b/app/graphql/mutations/boards/create.rb @@ -0,0 +1,78 @@ +# frozen_string_literal: true + +module Mutations + module Boards + class Create < ::Mutations::BaseMutation + include Mutations::ResolvesGroup + include ResolvesProject + + graphql_name 'CreateBoard' + + field :board, + Types::BoardType, + null: true, + description: 'The board after mutation.' + + argument :project_path, GraphQL::ID_TYPE, + required: false, + description: 'The project full path the board is associated with.' + argument :group_path, GraphQL::ID_TYPE, + required: false, + description: 'The group full path the board is associated with.' + argument :name, + GraphQL::STRING_TYPE, + required: false, + description: 'The board name.' + argument :assignee_id, + GraphQL::STRING_TYPE, + required: false, + description: 'The ID of the user to be assigned to the board.' + argument :milestone_id, + GraphQL::ID_TYPE, + required: false, + description: 'The ID of the milestone to be assigned to the board.' + argument :weight, + GraphQL::BOOLEAN_TYPE, + required: false, + description: 'The weight of the board.' + argument :label_ids, + [GraphQL::ID_TYPE], + required: false, + description: 'The IDs of labels to be added to the board.' + + authorize :admin_board + + def resolve(args) + group_path = args.delete(:group_path) + project_path = args.delete(:project_path) + + board_parent = authorized_find!(group_path: group_path, project_path: project_path) + response = ::Boards::CreateService.new(board_parent, current_user, args).execute + + { + board: response.payload, + errors: response.errors + } + end + + def ready?(**args) + if args.values_at(:project_path, :group_path).compact.blank? + raise Gitlab::Graphql::Errors::ArgumentError, + 'group_path or project_path arguments are required' + end + + super + end + + private + + def find_object(group_path: nil, project_path: nil) + if group_path + resolve_group(full_path: group_path) + else + resolve_project(full_path: project_path) + end + end + end + end +end diff --git a/app/graphql/types/mutation_type.rb b/app/graphql/types/mutation_type.rb index 3a9d5529266..64325333e08 100644 --- a/app/graphql/types/mutation_type.rb +++ b/app/graphql/types/mutation_type.rb @@ -14,6 +14,7 @@ module Types mount_mutation Mutations::AwardEmojis::Add mount_mutation Mutations::AwardEmojis::Remove mount_mutation Mutations::AwardEmojis::Toggle + mount_mutation Mutations::Boards::Create mount_mutation Mutations::Boards::Destroy mount_mutation Mutations::Boards::Issues::IssueMoveList mount_mutation Mutations::Boards::Lists::Create diff --git a/app/models/design_management/design_at_version.rb b/app/models/design_management/design_at_version.rb index 0cf653ce696..211211144f4 100644 --- a/app/models/design_management/design_at_version.rb +++ b/app/models/design_management/design_at_version.rb @@ -21,10 +21,6 @@ module DesignManagement @design, @version = design, version end - def self.instantiate(attrs) - new(**attrs).tap { |obj| obj.validate! } - end - # The ID, needed by GraphQL types and as part of the Lazy-fetch # protocol, includes information about both the design and the version. # diff --git a/app/views/admin/application_settings/_usage.html.haml b/app/views/admin/application_settings/_usage.html.haml index 4e45db1e10a..88c88b96a91 100644 --- a/app/views/admin/application_settings/_usage.html.haml +++ b/app/views/admin/application_settings/_usage.html.haml @@ -33,7 +33,7 @@ %pre.usage-data.js-syntax-highlight.code.highlight.mt-2.d-none{ class: payload_class, data: { endpoint: usage_data_admin_application_settings_path(format: :html) } } - else = _('The usage ping is disabled, and cannot be configured through this form.') - - deactivating_usage_ping_path = help_page_path('development/telemetry/usage_ping', anchor: 'disable-usage-ping') + - deactivating_usage_ping_path = help_page_path('development/product_analytics/usage_ping', anchor: 'disable-usage-ping') - deactivating_usage_ping_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: deactivating_usage_ping_path } = s_('For more information, see the documentation on %{deactivating_usage_ping_link_start}deactivating the usage ping%{deactivating_usage_ping_link_end}.').html_safe % { deactivating_usage_ping_link_start: deactivating_usage_ping_link_start, deactivating_usage_ping_link_end: '</a>'.html_safe } diff --git a/app/views/admin/dev_ops_report/show.html.haml b/app/views/admin/dev_ops_report/show.html.haml index 1892557d0d6..93ed862d733 100644 --- a/app/views/admin/dev_ops_report/show.html.haml +++ b/app/views/admin/dev_ops_report/show.html.haml @@ -7,7 +7,7 @@ .gl-mt-3 - if !usage_ping_enabled - #js-devops-empty-state{ data: { is_admin: current_user&.admin.to_s, empty_state_svg_path: image_path('illustrations/convdev/convdev_no_index.svg'), enable_usage_ping_link: metrics_and_profiling_admin_application_settings_path(anchor: 'js-usage-settings'), docs_link: help_page_path('development/telemetry/usage_ping') } } + #js-devops-empty-state{ data: { is_admin: current_user&.admin.to_s, empty_state_svg_path: image_path('illustrations/convdev/convdev_no_index.svg'), enable_usage_ping_link: metrics_and_profiling_admin_application_settings_path(anchor: 'js-usage-settings'), docs_link: help_page_path('development/product_analytics/usage_ping') } } - elsif @metric.blank? = render 'no_data' - else diff --git a/app/views/search/results/_filters.html.haml b/app/views/search/results/_filters.html.haml index 8c402ddb3d1..632d3dfd58c 100644 --- a/app/views/search/results/_filters.html.haml +++ b/app/views/search/results/_filters.html.haml @@ -1,7 +1,7 @@ .d-lg-flex.align-items-end - #js-search-filter-by-state{ 'v-cloak': true, data: { scope: @scope, filter: params[:state]} } + #js-search-filter-by-state{ 'v-cloak': true } - if Feature.enabled?(:search_filter_by_confidential, @group) - #js-search-filter-by-confidential{ 'v-cloak': true, data: { scope: @scope, filter: params[:confidential] } } + #js-search-filter-by-confidential{ 'v-cloak': true } - if %w(issues merge_requests).include?(@scope) %hr.gl-mt-4.gl-mb-4 |