Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2023-09-21 15:07:54 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2023-09-21 15:07:54 +0300
commitda5028d723994eae4e66b0893ebf73e0a602955e (patch)
treefa21e80c039566630c584692da906921da718b20 /app
parent7e29b8f3fcc32a6adcf735a5a9069de5d9d814d6 (diff)
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'app')
-rw-r--r--app/assets/javascripts/import_entities/import_groups/components/import_table.vue1
-rw-r--r--app/assets/javascripts/pages/import/bulk_imports/history/components/bulk_imports_history_app.vue7
-rw-r--r--app/assets/javascripts/releases/stores/modules/edit_new/actions.js143
-rw-r--r--app/assets/javascripts/releases/stores/modules/edit_new/getters.js4
-rw-r--r--app/assets/javascripts/releases/stores/modules/edit_new/mutation_types.js1
-rw-r--r--app/assets/javascripts/releases/stores/modules/edit_new/mutations.js3
-rw-r--r--app/finders/vs_code/settings_finder.rb21
-rw-r--r--app/models/namespaces/traversal/linear_scopes.rb7
-rw-r--r--app/models/user.rb1
-rw-r--r--app/models/vs_code/vs_code_setting.rb13
-rw-r--r--app/services/packages/npm/create_package_service.rb2
-rw-r--r--app/services/vs_code/settings/create_or_update_service.rb36
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