diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2023-09-21 15:07:54 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2023-09-21 15:07:54 +0300 |
commit | da5028d723994eae4e66b0893ebf73e0a602955e (patch) | |
tree | fa21e80c039566630c584692da906921da718b20 /app | |
parent | 7e29b8f3fcc32a6adcf735a5a9069de5d9d814d6 (diff) |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'app')
12 files changed, 196 insertions, 43 deletions
diff --git a/app/assets/javascripts/import_entities/import_groups/components/import_table.vue b/app/assets/javascripts/import_entities/import_groups/components/import_table.vue index cd07e9fbdd9..7857231ff47 100644 --- a/app/assets/javascripts/import_entities/import_groups/components/import_table.vue +++ b/app/assets/javascripts/import_entities/import_groups/components/import_table.vue @@ -427,6 +427,7 @@ export default { }, setPageSize(size) { + this.page = 1; this.perPage = size; }, diff --git a/app/assets/javascripts/pages/import/bulk_imports/history/components/bulk_imports_history_app.vue b/app/assets/javascripts/pages/import/bulk_imports/history/components/bulk_imports_history_app.vue index 1d0eaae4c57..7f376cde680 100644 --- a/app/assets/javascripts/pages/import/bulk_imports/history/components/bulk_imports_history_app.vue +++ b/app/assets/javascripts/pages/import/bulk_imports/history/components/bulk_imports_history_app.vue @@ -187,6 +187,11 @@ export default { return ''; } }, + + setPageSize(size) { + this.paginationConfig.perPage = size; + this.paginationConfig.page = 1; + }, }, gitlabLogo: window.gon.gitlab_logo, @@ -253,7 +258,7 @@ export default { :page-info="pageInfo" class="gl-m-0 gl-mt-3" @set-page="paginationConfig.page = $event" - @set-page-size="paginationConfig.perPage = $event" + @set-page-size="setPageSize" /> </template> <local-storage-sync diff --git a/app/assets/javascripts/releases/stores/modules/edit_new/actions.js b/app/assets/javascripts/releases/stores/modules/edit_new/actions.js index 2e3cf3bf9b8..8bdfb057adc 100644 --- a/app/assets/javascripts/releases/stores/modules/edit_new/actions.js +++ b/app/assets/javascripts/releases/stores/modules/edit_new/actions.js @@ -1,6 +1,8 @@ +import { omit } from 'lodash'; import { getTag } from '~/rest_api'; import { createAlert } from '~/alert'; import { redirectTo } from '~/lib/utils/url_utility'; // eslint-disable-line import/no-deprecated +import AccessorUtilities from '~/lib/utils/accessor'; import { s__ } from '~/locale'; import createReleaseMutation from '~/releases/graphql/mutations/create_release.mutation.graphql'; import deleteReleaseMutation from '~/releases/graphql/mutations/delete_release.mutation.graphql'; @@ -15,16 +17,26 @@ import * as types from './mutation_types'; class GraphQLError extends Error {} -export const initializeRelease = ({ commit, dispatch, state }) => { +const updateDraft = (action) => (store, ...args) => { + action(store, ...args); + + if (!store.state.isExistingRelease) { + store.dispatch('saveDraftRelease'); + store.dispatch('saveDraftCreateFrom'); + } +}; + +export const initializeRelease = ({ dispatch, state }) => { if (state.isExistingRelease) { // When editing an existing release, // fetch the release object from the API return dispatch('fetchRelease'); } - // When creating a new release, initialize the - // store with an empty release object - commit(types.INITIALIZE_EMPTY_RELEASE); + // When creating a new release, try to load the + // store with a draft release object, otherwise + // initialize an empty one + dispatch('loadDraftRelease'); return Promise.resolve(); }; @@ -51,50 +63,58 @@ export const fetchRelease = async ({ commit, state }) => { } }; -export const updateReleaseTagName = ({ commit }, tagName) => - commit(types.UPDATE_RELEASE_TAG_NAME, tagName); +export const updateReleaseTagName = updateDraft(({ commit }, tagName) => + commit(types.UPDATE_RELEASE_TAG_NAME, tagName), +); -export const updateReleaseTagMessage = ({ commit }, tagMessage) => - commit(types.UPDATE_RELEASE_TAG_MESSAGE, tagMessage); +export const updateReleaseTagMessage = updateDraft(({ commit }, tagMessage) => + commit(types.UPDATE_RELEASE_TAG_MESSAGE, tagMessage), +); -export const updateCreateFrom = ({ commit }, createFrom) => - commit(types.UPDATE_CREATE_FROM, createFrom); +export const updateCreateFrom = updateDraft(({ commit }, createFrom) => + commit(types.UPDATE_CREATE_FROM, createFrom), +); export const updateShowCreateFrom = ({ commit }, showCreateFrom) => commit(types.UPDATE_SHOW_CREATE_FROM, showCreateFrom); -export const updateReleaseTitle = ({ commit }, title) => commit(types.UPDATE_RELEASE_TITLE, title); +export const updateReleaseTitle = updateDraft(({ commit }, title) => + commit(types.UPDATE_RELEASE_TITLE, title), +); -export const updateReleaseNotes = ({ commit }, notes) => commit(types.UPDATE_RELEASE_NOTES, notes); +export const updateReleaseNotes = updateDraft(({ commit }, notes) => + commit(types.UPDATE_RELEASE_NOTES, notes), +); -export const updateReleaseMilestones = ({ commit }, milestones) => - commit(types.UPDATE_RELEASE_MILESTONES, milestones); +export const updateReleaseMilestones = updateDraft(({ commit }, milestones) => + commit(types.UPDATE_RELEASE_MILESTONES, milestones), +); -export const updateReleaseGroupMilestones = ({ commit }, groupMilestones) => - commit(types.UPDATE_RELEASE_GROUP_MILESTONES, groupMilestones); +export const updateReleaseGroupMilestones = updateDraft(({ commit }, groupMilestones) => + commit(types.UPDATE_RELEASE_GROUP_MILESTONES, groupMilestones), +); -export const addEmptyAssetLink = ({ commit }) => { - commit(types.ADD_EMPTY_ASSET_LINK); -}; +export const addEmptyAssetLink = updateDraft(({ commit }) => commit(types.ADD_EMPTY_ASSET_LINK)); -export const updateAssetLinkUrl = ({ commit }, { linkIdToUpdate, newUrl }) => { - commit(types.UPDATE_ASSET_LINK_URL, { linkIdToUpdate, newUrl }); -}; +export const updateAssetLinkUrl = updateDraft(({ commit }, { linkIdToUpdate, newUrl }) => + commit(types.UPDATE_ASSET_LINK_URL, { linkIdToUpdate, newUrl }), +); -export const updateAssetLinkName = ({ commit }, { linkIdToUpdate, newName }) => { - commit(types.UPDATE_ASSET_LINK_NAME, { linkIdToUpdate, newName }); -}; +export const updateAssetLinkName = updateDraft(({ commit }, { linkIdToUpdate, newName }) => + commit(types.UPDATE_ASSET_LINK_NAME, { linkIdToUpdate, newName }), +); -export const updateAssetLinkType = ({ commit }, { linkIdToUpdate, newType }) => { - commit(types.UPDATE_ASSET_LINK_TYPE, { linkIdToUpdate, newType }); -}; +export const updateAssetLinkType = updateDraft(({ commit }, { linkIdToUpdate, newType }) => + commit(types.UPDATE_ASSET_LINK_TYPE, { linkIdToUpdate, newType }), +); -export const removeAssetLink = ({ commit }, linkIdToRemove) => { - commit(types.REMOVE_ASSET_LINK, linkIdToRemove); -}; +export const removeAssetLink = updateDraft(({ commit }, linkIdToRemove) => + commit(types.REMOVE_ASSET_LINK, linkIdToRemove), +); -export const receiveSaveReleaseSuccess = ({ commit }, urlToRedirectTo) => { +export const receiveSaveReleaseSuccess = ({ commit, dispatch }, urlToRedirectTo) => { commit(types.RECEIVE_SAVE_RELEASE_SUCCESS); + dispatch('clearDraftRelease'); redirectTo(urlToRedirectTo); // eslint-disable-line import/no-deprecated }; @@ -245,9 +265,9 @@ export const updateIncludeTagNotes = ({ commit }, includeTagNotes) => { commit(types.UPDATE_INCLUDE_TAG_NOTES, includeTagNotes); }; -export const updateReleasedAt = ({ commit }, releasedAt) => { - commit(types.UPDATE_RELEASED_AT, releasedAt); -}; +export const updateReleasedAt = updateDraft(({ commit }, releasedAt) => + commit(types.UPDATE_RELEASED_AT, releasedAt), +); export const deleteRelease = ({ commit, getters, dispatch, state }) => { commit(types.REQUEST_SAVE_RELEASE); @@ -274,3 +294,56 @@ export const setCreating = ({ commit }) => commit(types.SET_CREATING); export const setExistingTag = ({ commit }) => commit(types.SET_EXISTING_TAG); export const setNewTag = ({ commit }) => commit(types.SET_NEW_TAG); + +export const saveDraftRelease = ({ getters, state }) => { + try { + window.localStorage.setItem( + getters.localStorageKey, + JSON.stringify(getters.releasedAtChanged ? state.release : omit(state.release, 'releasedAt')), + ); + } catch { + return Promise.resolve(); + } + return Promise.resolve(); +}; + +export const saveDraftCreateFrom = ({ getters, state }) => { + try { + window.localStorage.setItem( + getters.localStorageCreateFromKey, + JSON.stringify(state.createFrom), + ); + } catch { + return Promise.resolve(); + } + return Promise.resolve(); +}; + +export const clearDraftRelease = ({ getters }) => { + if (AccessorUtilities.canUseLocalStorage()) { + window.localStorage.removeItem(getters.localStorageKey); + window.localStorage.removeItem(getters.localStorageCreateFromKey); + } +}; + +export const loadDraftRelease = ({ commit, getters, state }) => { + try { + const release = window.localStorage.getItem(getters.localStorageKey); + const createFrom = window.localStorage.getItem(getters.localStorageCreateFromKey); + + if (release) { + const parsedRelease = JSON.parse(release); + commit(types.INITIALIZE_RELEASE, { + ...parsedRelease, + releasedAt: parsedRelease.releasedAt + ? new Date(parsedRelease.releasedAt) + : state.originalReleasedAt, + }); + commit(types.UPDATE_CREATE_FROM, JSON.parse(createFrom)); + } else { + commit(types.INITIALIZE_EMPTY_RELEASE); + } + } catch { + commit(types.INITIALIZE_EMPTY_RELEASE); + } +}; diff --git a/app/assets/javascripts/releases/stores/modules/edit_new/getters.js b/app/assets/javascripts/releases/stores/modules/edit_new/getters.js index edf6c81c9e9..0b37c2b81d1 100644 --- a/app/assets/javascripts/releases/stores/modules/edit_new/getters.js +++ b/app/assets/javascripts/releases/stores/modules/edit_new/getters.js @@ -190,3 +190,7 @@ export const isCreating = ({ step }) => step === CREATE; export const isExistingTag = ({ tagStep }) => tagStep === EXISTING_TAG; export const isNewTag = ({ tagStep }) => tagStep === NEW_TAG; + +export const localStorageKey = ({ projectPath }) => `${projectPath}/release/new`; +export const localStorageCreateFromKey = ({ projectPath }) => + `${projectPath}/release/new/createFrom`; diff --git a/app/assets/javascripts/releases/stores/modules/edit_new/mutation_types.js b/app/assets/javascripts/releases/stores/modules/edit_new/mutation_types.js index fc450970cde..8a0eeaa4338 100644 --- a/app/assets/javascripts/releases/stores/modules/edit_new/mutation_types.js +++ b/app/assets/javascripts/releases/stores/modules/edit_new/mutation_types.js @@ -1,4 +1,5 @@ export const INITIALIZE_EMPTY_RELEASE = 'INITIALIZE_EMPTY_RELEASE'; +export const INITIALIZE_RELEASE = 'INITIALIZE_RELEASE'; export const REQUEST_RELEASE = 'REQUEST_RELEASE'; export const RECEIVE_RELEASE_SUCCESS = 'RECEIVE_RELEASE_SUCCESS'; diff --git a/app/assets/javascripts/releases/stores/modules/edit_new/mutations.js b/app/assets/javascripts/releases/stores/modules/edit_new/mutations.js index 7ff18245a80..3a68cdbb89a 100644 --- a/app/assets/javascripts/releases/stores/modules/edit_new/mutations.js +++ b/app/assets/javascripts/releases/stores/modules/edit_new/mutations.js @@ -22,6 +22,9 @@ export default { }, }; }, + [types.INITIALIZE_RELEASE](state, release) { + state.release = release; + }, [types.REQUEST_RELEASE](state) { state.isFetchingRelease = true; diff --git a/app/finders/vs_code/settings_finder.rb b/app/finders/vs_code/settings_finder.rb new file mode 100644 index 00000000000..dc32351cca6 --- /dev/null +++ b/app/finders/vs_code/settings_finder.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +module VsCode + class SettingsFinder + def initialize(current_user, setting_types) + @current_user = current_user + @setting_types = setting_types + end + + def execute + relation = User.find(current_user.id).vscode_settings + return relation unless setting_types.present? + + relation.by_setting_type(setting_types) + end + + private + + attr_accessor :current_user, :setting_types + end +end diff --git a/app/models/namespaces/traversal/linear_scopes.rb b/app/models/namespaces/traversal/linear_scopes.rb index 6e79e3ac9a1..d152ca412f8 100644 --- a/app/models/namespaces/traversal/linear_scopes.rb +++ b/app/models/namespaces/traversal/linear_scopes.rb @@ -49,7 +49,7 @@ module Namespaces end def self_and_hierarchy - return super unless use_traversal_ids_for_self_and_hierarchy_scopes? + return super unless use_traversal_ids? unscoped.from_union([all.self_and_ancestors, all.self_and_descendants(include_self: false)]) end @@ -78,11 +78,6 @@ module Namespaces Feature.enabled?(:use_traversal_ids) end - def use_traversal_ids_for_self_and_hierarchy_scopes? - Feature.enabled?(:use_traversal_ids_for_self_and_hierarchy_scopes) && - use_traversal_ids? - end - def self_and_ancestors_from_inner_join(include_self: true, upto: nil, hierarchy_order: nil) base_cte = all.reselect('namespaces.traversal_ids').as_cte(:base_ancestors_cte) diff --git a/app/models/user.rb b/app/models/user.rb index c4e867ab571..9634907867a 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -306,6 +306,7 @@ class User < MainClusterwide::ApplicationRecord has_many :awarded_user_achievements, class_name: 'Achievements::UserAchievement', foreign_key: 'awarded_by_user_id', inverse_of: :awarded_by_user has_many :revoked_user_achievements, class_name: 'Achievements::UserAchievement', foreign_key: 'revoked_by_user_id', inverse_of: :revoked_by_user has_many :achievements, through: :user_achievements, class_name: 'Achievements::Achievement', inverse_of: :users + has_many :vscode_settings, class_name: 'VsCode::VsCodeSetting', inverse_of: :user # # Validations diff --git a/app/models/vs_code/vs_code_setting.rb b/app/models/vs_code/vs_code_setting.rb new file mode 100644 index 00000000000..fef3973574a --- /dev/null +++ b/app/models/vs_code/vs_code_setting.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +module VsCode + class VsCodeSetting < ApplicationRecord + belongs_to :user, inverse_of: :vscode_settings + + validates :setting_type, presence: true + validates :content, presence: true + + scope :by_setting_type, ->(setting_type) { where(setting_type: setting_type) } + scope :by_user, ->(user) { where(user: user) } + end +end diff --git a/app/services/packages/npm/create_package_service.rb b/app/services/packages/npm/create_package_service.rb index f6f2dbb8415..d599cecc8da 100644 --- a/app/services/packages/npm/create_package_service.rb +++ b/app/services/packages/npm/create_package_service.rb @@ -5,7 +5,7 @@ module Packages include Gitlab::Utils::StrongMemoize include ExclusiveLeaseGuard - PACKAGE_JSON_NOT_ALLOWED_FIELDS = %w[readme readmeFilename licenseText].freeze + PACKAGE_JSON_NOT_ALLOWED_FIELDS = %w[readme readmeFilename licenseText contributors exports].freeze DEFAULT_LEASE_TIMEOUT = 1.hour.to_i def execute diff --git a/app/services/vs_code/settings/create_or_update_service.rb b/app/services/vs_code/settings/create_or_update_service.rb new file mode 100644 index 00000000000..081b9a66f47 --- /dev/null +++ b/app/services/vs_code/settings/create_or_update_service.rb @@ -0,0 +1,36 @@ +# frozen_string_literal: true + +module VsCode + module Settings + class CreateOrUpdateService + def initialize(current_user:, params: {}) + @current_user = current_user + @params = params + end + + def execute + setting = VsCode::VsCodeSetting.by_user(current_user).by_setting_type(params[:setting_type]).first + + if setting.nil? + merged_params = params.merge(user: current_user) + setting = VsCode::VsCodeSetting.new(merged_params) + else + setting.content = params[:content] + end + + if setting.save + ServiceResponse.success(payload: setting) + else + ServiceResponse.error( + message: setting.errors.full_messages.to_sentence, + payload: { setting: setting } + ) + end + end + + private + + attr_reader :current_user, :params + end + end +end |