Commit a24b1218 authored by GitLab Bot's avatar GitLab Bot

Automatic merge of gitlab-org/gitlab master

parents e374e39e 8b207939
a5a5d83630f13c3eb3e1650a24423fc5e9bc47d2 3cbd24e3e2fd09eb526d04f8a419f6d103c440dc
...@@ -115,7 +115,7 @@ gem 'carrierwave', '~> 1.3' ...@@ -115,7 +115,7 @@ gem 'carrierwave', '~> 1.3'
gem 'mini_magick', '~> 4.10.1' gem 'mini_magick', '~> 4.10.1'
# for backups # for backups
gem 'fog-aws', '~> 3.6' gem 'fog-aws', '~> 3.7'
# Locked until fog-google resolves https://github.com/fog/fog-google/issues/421. # Locked until fog-google resolves https://github.com/fog/fog-google/issues/421.
# Also see config/initializers/fog_core_patch.rb. # Also see config/initializers/fog_core_patch.rb.
gem 'fog-core', '= 2.1.0' gem 'fog-core', '= 2.1.0'
......
...@@ -363,7 +363,7 @@ GEM ...@@ -363,7 +363,7 @@ GEM
fog-json fog-json
ipaddress (~> 0.8) ipaddress (~> 0.8)
xml-simple (~> 1.1) xml-simple (~> 1.1)
fog-aws (3.6.7) fog-aws (3.7.0)
fog-core (~> 2.1) fog-core (~> 2.1)
fog-json (~> 1.1) fog-json (~> 1.1)
fog-xml (~> 0.1) fog-xml (~> 0.1)
...@@ -1335,7 +1335,7 @@ DEPENDENCIES ...@@ -1335,7 +1335,7 @@ DEPENDENCIES
flipper-active_support_cache_store (~> 0.17.1) flipper-active_support_cache_store (~> 0.17.1)
flowdock (~> 0.7) flowdock (~> 0.7)
fog-aliyun (~> 0.3) fog-aliyun (~> 0.3)
fog-aws (~> 3.6) fog-aws (~> 3.7)
fog-core (= 2.1.0) fog-core (= 2.1.0)
fog-google (~> 1.11) fog-google (~> 1.11)
fog-local (~> 0.6) fog-local (~> 0.6)
......
...@@ -27,7 +27,7 @@ export default class ImageFile { ...@@ -27,7 +27,7 @@ export default class ImageFile {
initViewModes() { initViewModes() {
const viewMode = viewModes[0]; const viewMode = viewModes[0];
$('.view-modes', this.file).removeClass('hide'); $('.view-modes', this.file).removeClass('gl-display-none');
$('.view-modes-menu', this.file).on('click', 'li', event => { $('.view-modes-menu', this.file).on('click', 'li', event => {
if (!$(event.currentTarget).hasClass('active')) { if (!$(event.currentTarget).hasClass('active')) {
return this.activateViewMode(event.currentTarget.className); return this.activateViewMode(event.currentTarget.className);
...@@ -42,12 +42,10 @@ export default class ImageFile { ...@@ -42,12 +42,10 @@ export default class ImageFile {
.filter(`.${viewMode}`) .filter(`.${viewMode}`)
.addClass('active'); .addClass('active');
// eslint-disable-next-line no-jquery/no-fade $(`.view:visible:not(.${viewMode})`, this.file).addClass('gl-display-none');
return $(`.view:visible:not(.${viewMode})`, this.file).fadeOut(200, () => { $(`.view.${viewMode}`, this.file).removeClass('gl-display-none');
// eslint-disable-next-line no-jquery/no-fade
$(`.view.${viewMode}`, this.file).fadeIn(200); return this.initView(viewMode);
return this.initView(viewMode);
});
} }
initView(viewMode) { initView(viewMode) {
...@@ -120,7 +118,7 @@ export default class ImageFile { ...@@ -120,7 +118,7 @@ export default class ImageFile {
return this.requestImageInfo($('img', wrap), (width, height) => { return this.requestImageInfo($('img', wrap), (width, height) => {
$('.image-info .meta-width', wrap).text(`${width}px`); $('.image-info .meta-width', wrap).text(`${width}px`);
$('.image-info .meta-height', wrap).text(`${height}px`); $('.image-info .meta-height', wrap).text(`${height}px`);
return $('.image-info', wrap).removeClass('hide'); return $('.image-info', wrap).removeClass('gl-display-none');
}); });
}); });
}, },
......
...@@ -119,20 +119,18 @@ class DueDateSelect { ...@@ -119,20 +119,18 @@ class DueDateSelect {
} }
updateIssueBoardIssue() { updateIssueBoardIssue() {
// eslint-disable-next-line no-jquery/no-fade this.$loading.removeClass('gl-display-none');
this.$loading.fadeIn();
this.$dropdown.trigger('loading.gl.dropdown'); this.$dropdown.trigger('loading.gl.dropdown');
this.$selectbox.hide(); this.$selectbox.hide();
this.$value.css('display', ''); this.$value.css('display', '');
const fadeOutLoader = () => { const hideLoader = () => {
// eslint-disable-next-line no-jquery/no-fade this.$loading.addClass('gl-display-none');
this.$loading.fadeOut();
}; };
boardsStore.detail.issue boardsStore.detail.issue
.update(this.$dropdown.attr('data-issue-update')) .update(this.$dropdown.attr('data-issue-update'))
.then(fadeOutLoader) .then(hideLoader)
.catch(fadeOutLoader); .catch(hideLoader);
} }
submitSelectedDate(isDropdown) { submitSelectedDate(isDropdown) {
...@@ -140,8 +138,7 @@ class DueDateSelect { ...@@ -140,8 +138,7 @@ class DueDateSelect {
const hasDueDate = this.displayedDate !== __('None'); const hasDueDate = this.displayedDate !== __('None');
const displayedDateStyle = hasDueDate ? 'bold' : 'no-value'; const displayedDateStyle = hasDueDate ? 'bold' : 'no-value';
// eslint-disable-next-line no-jquery/no-fade this.$loading.removeClass('gl-display-none');
this.$loading.removeClass('hidden').fadeIn();
if (isDropdown) { if (isDropdown) {
this.$dropdown.trigger('loading.gl.dropdown'); this.$dropdown.trigger('loading.gl.dropdown');
...@@ -164,8 +161,7 @@ class DueDateSelect { ...@@ -164,8 +161,7 @@ class DueDateSelect {
} }
this.$sidebarCollapsedValue.attr('data-original-title', tooltipText); this.$sidebarCollapsedValue.attr('data-original-title', tooltipText);
// eslint-disable-next-line no-jquery/no-fade return this.$loading.addClass('gl-display-none');
return this.$loading.fadeOut();
}); });
} }
} }
...@@ -211,7 +207,8 @@ export default class DueDateSelectors { ...@@ -211,7 +207,8 @@ export default class DueDateSelectors {
initIssuableSelect() { initIssuableSelect() {
const $loading = $('.js-issuable-update .due_date') const $loading = $('.js-issuable-update .due_date')
.find('.block-loading') .find('.block-loading')
.hide(); .removeClass('hidden')
.addClass('gl-display-none');
$('.js-due-date-select').each((i, dropdown) => { $('.js-due-date-select').each((i, dropdown) => {
const $dropdown = $(dropdown); const $dropdown = $(dropdown);
......
...@@ -64,8 +64,7 @@ export default class FilterableList { ...@@ -64,8 +64,7 @@ export default class FilterableList {
return false; return false;
} }
// eslint-disable-next-line no-jquery/no-fade $(this.listHolderElement).addClass('gl-opacity-5');
$(this.listHolderElement).fadeTo(250, 0.5);
this.isBusy = true; this.isBusy = true;
...@@ -99,7 +98,6 @@ export default class FilterableList { ...@@ -99,7 +98,6 @@ export default class FilterableList {
onFilterComplete() { onFilterComplete() {
this.isBusy = false; this.isBusy = false;
// eslint-disable-next-line no-jquery/no-fade $(this.listHolderElement).removeClass('gl-opacity-5');
$(this.listHolderElement).fadeTo(250, 1);
} }
} }
...@@ -45,8 +45,7 @@ export default class LabelsSelect { ...@@ -45,8 +45,7 @@ export default class LabelsSelect {
const $sidebarCollapsedValue = $block.find('.sidebar-collapsed-icon span'); const $sidebarCollapsedValue = $block.find('.sidebar-collapsed-icon span');
const $value = $block.find('.value'); const $value = $block.find('.value');
const $dropdownMenu = $dropdown.parent().find('.dropdown-menu'); const $dropdownMenu = $dropdown.parent().find('.dropdown-menu');
// eslint-disable-next-line no-jquery/no-fade const $loading = $block.find('.block-loading').addClass('gl-display-none');
const $loading = $block.find('.block-loading').fadeOut();
const fieldName = $dropdown.data('fieldName'); const fieldName = $dropdown.data('fieldName');
let initialSelected = $selectbox let initialSelected = $selectbox
.find(`input[name="${$dropdown.data('fieldName')}"]`) .find(`input[name="${$dropdown.data('fieldName')}"]`)
...@@ -83,15 +82,13 @@ export default class LabelsSelect { ...@@ -83,15 +82,13 @@ export default class LabelsSelect {
if (!selected.length) { if (!selected.length) {
data[abilityName].label_ids = ['']; data[abilityName].label_ids = [''];
} }
// eslint-disable-next-line no-jquery/no-fade $loading.removeClass('gl-display-none');
$loading.removeClass('hidden').fadeIn();
$dropdown.trigger('loading.gl.dropdown'); $dropdown.trigger('loading.gl.dropdown');
axios axios
.put(issueUpdateURL, data) .put(issueUpdateURL, data)
.then(({ data }) => { .then(({ data }) => {
let template; let template;
// eslint-disable-next-line no-jquery/no-fade $loading.addClass('gl-display-none');
$loading.fadeOut();
$dropdown.trigger('loaded.gl.dropdown'); $dropdown.trigger('loaded.gl.dropdown');
$selectbox.hide(); $selectbox.hide();
data.issueUpdateURL = issueUpdateURL; data.issueUpdateURL = issueUpdateURL;
...@@ -340,9 +337,8 @@ export default class LabelsSelect { ...@@ -340,9 +337,8 @@ export default class LabelsSelect {
const { $el, e, isMarking } = clickEvent; const { $el, e, isMarking } = clickEvent;
const label = clickEvent.selectedObj; const label = clickEvent.selectedObj;
const fadeOutLoader = () => { const hideLoader = () => {
// eslint-disable-next-line no-jquery/no-fade $loading.addClass('gl-display-none');
$loading.fadeOut();
}; };
const page = $('body').attr('data-page'); const page = $('body').attr('data-page');
...@@ -403,8 +399,7 @@ export default class LabelsSelect { ...@@ -403,8 +399,7 @@ export default class LabelsSelect {
boardsStore.detail.issue.labels = labels; boardsStore.detail.issue.labels = labels;
} }
// eslint-disable-next-line no-jquery/no-fade $loading.removeClass('gl-display-none');
$loading.fadeIn();
const oldLabels = boardsStore.detail.issue.labels; const oldLabels = boardsStore.detail.issue.labels;
boardsStore.detail.issue boardsStore.detail.issue
...@@ -420,8 +415,8 @@ export default class LabelsSelect { ...@@ -420,8 +415,8 @@ export default class LabelsSelect {
.removeClass('is-active'); .removeClass('is-active');
} }
}) })
.then(fadeOutLoader) .then(hideLoader)
.catch(fadeOutLoader); .catch(hideLoader);
} else if (handleClick) { } else if (handleClick) {
e.preventDefault(); e.preventDefault();
handleClick(label); handleClick(label);
......
...@@ -136,10 +136,9 @@ function deferredInitialisation() { ...@@ -136,10 +136,9 @@ function deferredInitialisation() {
$('.remove-row').on('ajax:success', function removeRowAjaxSuccessCallback() { $('.remove-row').on('ajax:success', function removeRowAjaxSuccessCallback() {
tooltips.dispose(this); tooltips.dispose(this);
// eslint-disable-next-line no-jquery/no-fade
$(this) $(this)
.closest('li') .closest('li')
.fadeOut(); .addClass('gl-display-none!');
}); });
$('.js-remove-tr').on('ajax:before', function removeTRAjaxBeforeCallback() { $('.js-remove-tr').on('ajax:before', function removeTRAjaxBeforeCallback() {
...@@ -147,10 +146,9 @@ function deferredInitialisation() { ...@@ -147,10 +146,9 @@ function deferredInitialisation() {
}); });
$('.js-remove-tr').on('ajax:success', function removeTRAjaxSuccessCallback() { $('.js-remove-tr').on('ajax:success', function removeTRAjaxSuccessCallback() {
// eslint-disable-next-line no-jquery/no-fade
$(this) $(this)
.closest('tr') .closest('tr')
.fadeOut(); .addClass('gl-display-none!');
}); });
const glTooltipDelay = localStorage.getItem('gl-tooltip-delay'); const glTooltipDelay = localStorage.getItem('gl-tooltip-delay');
......
...@@ -53,8 +53,7 @@ export default class MilestoneSelect { ...@@ -53,8 +53,7 @@ export default class MilestoneSelect {
const $block = $selectBox.closest('.block'); const $block = $selectBox.closest('.block');
const $sidebarCollapsedValue = $block.find('.sidebar-collapsed-icon'); const $sidebarCollapsedValue = $block.find('.sidebar-collapsed-icon');
const $value = $block.find('.value'); const $value = $block.find('.value');
// eslint-disable-next-line no-jquery/no-fade const $loading = $block.find('.block-loading').addClass('gl-display-none');
const $loading = $block.find('.block-loading').fadeOut();
selectedMilestoneDefault = showAny ? '' : null; selectedMilestoneDefault = showAny ? '' : null;
selectedMilestoneDefault = selectedMilestoneDefault =
showNo && defaultNo ? __('No milestone') : selectedMilestoneDefault; showNo && defaultNo ? __('No milestone') : selectedMilestoneDefault;
...@@ -255,34 +254,29 @@ export default class MilestoneSelect { ...@@ -255,34 +254,29 @@ export default class MilestoneSelect {
} }
$dropdown.trigger('loading.gl.dropdown'); $dropdown.trigger('loading.gl.dropdown');
// eslint-disable-next-line no-jquery/no-fade $loading.removeClass('gl-display-none');
$loading.removeClass('hidden').fadeIn();
boardsStore.detail.issue boardsStore.detail.issue
.update($dropdown.attr('data-issue-update')) .update($dropdown.attr('data-issue-update'))
.then(() => { .then(() => {
$dropdown.trigger('loaded.gl.dropdown'); $dropdown.trigger('loaded.gl.dropdown');
// eslint-disable-next-line no-jquery/no-fade $loading.addClass('gl-display-none');
$loading.fadeOut();
}) })
.catch(() => { .catch(() => {
// eslint-disable-next-line no-jquery/no-fade $loading.addClass('gl-display-none');
$loading.fadeOut();
}); });
} else { } else {
selected = $selectBox.find('input[type="hidden"]').val(); selected = $selectBox.find('input[type="hidden"]').val();
data = {}; data = {};
data[abilityName] = {}; data[abilityName] = {};
data[abilityName].milestone_id = selected != null ? selected : null; data[abilityName].milestone_id = selected != null ? selected : null;
// eslint-disable-next-line no-jquery/no-fade $loading.removeClass('gl-display-none');
$loading.removeClass('hidden').fadeIn();
$dropdown.trigger('loading.gl.dropdown'); $dropdown.trigger('loading.gl.dropdown');
return axios return axios
.put(issueUpdateURL, data) .put(issueUpdateURL, data)
.then(({ data }) => { .then(({ data }) => {
$dropdown.trigger('loaded.gl.dropdown'); $dropdown.trigger('loaded.gl.dropdown');
// eslint-disable-next-line no-jquery/no-fade $loading.addClass('gl-display-none');
$loading.fadeOut();
$selectBox.hide(); $selectBox.hide();
$value.css('display', ''); $value.css('display', '');
if (data.milestone != null) { if (data.milestone != null) {
...@@ -313,8 +307,7 @@ export default class MilestoneSelect { ...@@ -313,8 +307,7 @@ export default class MilestoneSelect {
.text(__('None')); .text(__('None'));
}) })
.catch(() => { .catch(() => {
// eslint-disable-next-line no-jquery/no-fade $loading.addClass('gl-display-none');
$loading.fadeOut();
}); });
} }
}, },
......
...@@ -63,8 +63,7 @@ function UsersSelect(currentUser, els, options = {}) { ...@@ -63,8 +63,7 @@ function UsersSelect(currentUser, els, options = {}) {
const abilityName = $dropdown.data('abilityName'); const abilityName = $dropdown.data('abilityName');
let $value = $block.find('.value'); let $value = $block.find('.value');
const $collapsedSidebar = $block.find('.sidebar-collapsed-user'); const $collapsedSidebar = $block.find('.sidebar-collapsed-user');
// eslint-disable-next-line no-jquery/no-fade const $loading = $block.find('.block-loading').addClass('gl-display-none');
const $loading = $block.find('.block-loading').fadeOut();
const selectedIdDefault = defaultNullUser && showNullUser ? 0 : null; const selectedIdDefault = defaultNullUser && showNullUser ? 0 : null;
let selectedId = $dropdown.data('selected'); let selectedId = $dropdown.data('selected');
let assignTo; let assignTo;
...@@ -205,16 +204,14 @@ function UsersSelect(currentUser, els, options = {}) { ...@@ -205,16 +204,14 @@ function UsersSelect(currentUser, els, options = {}) {
const data = {}; const data = {};
data[abilityName] = {}; data[abilityName] = {};
data[abilityName].assignee_id = selected != null ? selected : null; data[abilityName].assignee_id = selected != null ? selected : null;
// eslint-disable-next-line no-jquery/no-fade $loading.removeClass('gl-display-none');
$loading.removeClass('hidden').fadeIn();
$dropdown.trigger('loading.gl.dropdown'); $dropdown.trigger('loading.gl.dropdown');
return axios.put(issueURL, data).then(({ data }) => { return axios.put(issueURL, data).then(({ data }) => {
let user = {}; let user = {};
let tooltipTitle = user.name; let tooltipTitle = user.name;
$dropdown.trigger('loaded.gl.dropdown'); $dropdown.trigger('loaded.gl.dropdown');
// eslint-disable-next-line no-jquery/no-fade $loading.addClass('gl-display-none');
$loading.fadeOut();
if (data.assignee) { if (data.assignee) {
user = { user = {
name: data.assignee.name, name: data.assignee.name,
......
# frozen_string_literal: true # frozen_string_literal: true
class SystemHooksService class SystemHooksService
BUILDER_DRIVEN_EVENT_DATA_AVAILABLE_FOR_CLASSES = [GroupMember].freeze
def execute_hooks_for(model, event) def execute_hooks_for(model, event)
data = build_event_data(model, event) data = build_event_data(model, event)
...@@ -20,6 +22,9 @@ class SystemHooksService ...@@ -20,6 +22,9 @@ class SystemHooksService
private private
def build_event_data(model, event) def build_event_data(model, event)
# return entire event data from its builder class, if available.
return builder_driven_event_data(model, event) if builder_driven_event_data_available?(model)
data = { data = {
event_name: build_event_name(model, event), event_name: build_event_name(model, event),
created_at: model.created_at&.xmlschema, created_at: model.created_at&.xmlschema,
...@@ -62,8 +67,6 @@ class SystemHooksService ...@@ -62,8 +67,6 @@ class SystemHooksService
old_full_path: model.full_path_before_last_save old_full_path: model.full_path_before_last_save
) )
end end
when GroupMember
data.merge!(group_member_data(model))
end end
data data
...@@ -75,10 +78,6 @@ class SystemHooksService ...@@ -75,10 +78,6 @@ class SystemHooksService
return "user_add_to_team" if event == :create return "user_add_to_team" if event == :create
return "user_remove_from_team" if event == :destroy return "user_remove_from_team" if event == :destroy
return "user_update_for_team" if event == :update return "user_update_for_team" if event == :update
when GroupMember
return 'user_add_to_group' if event == :create
return 'user_remove_from_group' if event == :destroy
return 'user_update_for_group' if event == :update
else else
"#{model.class.name.downcase}_#{event}" "#{model.class.name.downcase}_#{event}"
end end
...@@ -128,19 +127,6 @@ class SystemHooksService ...@@ -128,19 +127,6 @@ class SystemHooksService
} }
end end
def group_member_data(model)
{
group_name: model.group.name,
group_path: model.group.path,
group_id: model.group.id,
user_username: model.user.username,
user_name: model.user.name,
user_email: model.user.email,
user_id: model.user.id,
group_access: model.human_access
}
end
def user_data(model) def user_data(model)
{ {
name: model.name, name: model.name,
...@@ -149,6 +135,17 @@ class SystemHooksService ...@@ -149,6 +135,17 @@ class SystemHooksService
username: model.username username: model.username
} }
end end
def builder_driven_event_data_available?(model)
model.class.in?(BUILDER_DRIVEN_EVENT_DATA_AVAILABLE_FOR_CLASSES)
end
def builder_driven_event_data(model, event)
case model
when GroupMember
Gitlab::HookData::GroupMemberBuilder.new(model).build(event)
end
end
end end
SystemHooksService.prepend_if_ee('EE::SystemHooksService') SystemHooksService.prepend_if_ee('EE::SystemHooksService')
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
.wrap .wrap
.frame.deleted .frame.deleted
= image_tag(old_blob_raw_url, alt: diff_file.old_path, lazy: false) = image_tag(old_blob_raw_url, alt: diff_file.old_path, lazy: false)
%p.image-info.hide %p.image-info.gl-display-none
%span.meta-filesize= number_to_human_size(old_blob.size) %span.meta-filesize= number_to_human_size(old_blob.size)
| |
%strong W: %strong W:
...@@ -24,7 +24,7 @@ ...@@ -24,7 +24,7 @@
%span.meta-height %span.meta-height
.wrap .wrap
= render partial: "projects/diffs/image_diff_frame", locals: { class_name: "added js-image-frame #{class_name}", position: position, note_type: DiffNote.name, image_path: blob_raw_url, alt: diff_file.new_path } = render partial: "projects/diffs/image_diff_frame", locals: { class_name: "added js-image-frame #{class_name}", position: position, note_type: DiffNote.name, image_path: blob_raw_url, alt: diff_file.new_path }
%p.image-info.hide %p.image-info.gl-display-none
%span.meta-filesize= number_to_human_size(blob.size) %span.meta-filesize= number_to_human_size(blob.size)
| |
%strong W: %strong W:
...@@ -33,7 +33,7 @@ ...@@ -33,7 +33,7 @@
%strong H: %strong H:
%span.meta-height %span.meta-height
.swipe.view.hide .swipe.view.gl-display-none
.swipe-frame .swipe-frame
.frame.deleted.old-diff .frame.deleted.old-diff
= image_tag(old_blob_raw_url, alt: diff_file.old_path, lazy: false) = image_tag(old_blob_raw_url, alt: diff_file.old_path, lazy: false)
...@@ -43,7 +43,7 @@ ...@@ -43,7 +43,7 @@
%span.top-handle %span.top-handle
%span.bottom-handle %span.bottom-handle
.onion-skin.view.hide .onion-skin.view.gl-display-none
.onion-skin-frame .onion-skin-frame
.frame.deleted .frame.deleted
= image_tag(old_blob_raw_url, alt: diff_file.old_path, lazy: false) = image_tag(old_blob_raw_url, alt: diff_file.old_path, lazy: false)
...@@ -54,7 +54,7 @@ ...@@ -54,7 +54,7 @@
.dragger{ :style => "left: 0px;" } .dragger{ :style => "left: 0px;" }
.opaque .opaque
.view-modes.hide .view-modes.gl-display-none
%ul.view-modes-menu %ul.view-modes-menu
%li.two-up{ data: { mode: 'two-up' } } 2-up %li.two-up{ data: { mode: 'two-up' } } 2-up
%li.swipe{ data: { mode: 'swipe' } } Swipe %li.swipe{ data: { mode: 'swipe' } } Swipe
......
---
title: Upgrade fog-aws to v3.7.0
merge_request: 48921
author:
type: changed
...@@ -175,7 +175,7 @@ production: ...@@ -175,7 +175,7 @@ production:
| `password` | The password of the bind user. | no | `'your_great_password'` | | `password` | The password of the bind user. | no | `'your_great_password'` |
| `encryption` | Encryption method. The `method` key is deprecated in favor of `encryption`. | yes | `'start_tls'` or `'simple_tls'` or `'plain'` | | `encryption` | Encryption method. The `method` key is deprecated in favor of `encryption`. | yes | `'start_tls'` or `'simple_tls'` or `'plain'` |
| `verify_certificates` | Enables SSL certificate verification if encryption method is `start_tls` or `simple_tls`. Defaults to true. | no | boolean | | `verify_certificates` | Enables SSL certificate verification if encryption method is `start_tls` or `simple_tls`. Defaults to true. | no | boolean |
| `timeout` | Set a timeout, in seconds, for LDAP queries. This helps avoid blocking a request if the LDAP server becomes unresponsive. A value of 0 means there is no timeout. | no | `10` or `30` | | `timeout` | Set a timeout, in seconds, for LDAP queries. This helps avoid blocking a request if the LDAP server becomes unresponsive. A value of `0` means there is no timeout. (default: `10`) | no | `10` or `30` |
| `active_directory` | This setting specifies if LDAP server is Active Directory LDAP server. For non-AD servers it skips the AD specific queries. If your LDAP server is not AD, set this to false. | no | boolean | | `active_directory` | This setting specifies if LDAP server is Active Directory LDAP server. For non-AD servers it skips the AD specific queries. If your LDAP server is not AD, set this to false. | no | boolean |
| `allow_username_or_email_login` | If enabled, GitLab ignores everything after the first `@` in the LDAP username submitted by the user on sign-in. If you are using `uid: 'userPrincipalName'` on ActiveDirectory you need to disable this setting, because the userPrincipalName contains an `@`. | no | boolean | | `allow_username_or_email_login` | If enabled, GitLab ignores everything after the first `@` in the LDAP username submitted by the user on sign-in. If you are using `uid: 'userPrincipalName'` on ActiveDirectory you need to disable this setting, because the userPrincipalName contains an `@`. | no | boolean |
| `block_auto_created_users` | To maintain tight control over the number of billable users on your GitLab installation, enable this setting to keep new users blocked until they have been cleared by an administrator (default: false). | no | boolean | | `block_auto_created_users` | To maintain tight control over the number of billable users on your GitLab installation, enable this setting to keep new users blocked until they have been cleared by an administrator (default: false). | no | boolean |
......
...@@ -135,6 +135,7 @@ from: ...@@ -135,6 +135,7 @@ from:
- [Wikis development guide](wikis.md) - [Wikis development guide](wikis.md)
- [Newlines style guide](newlines_styleguide.md) - [Newlines style guide](newlines_styleguide.md)
- [Image scaling guide](image_scaling.md) - [Image scaling guide](image_scaling.md)
- [Export to CSV](export_csv.md)
## Performance guides ## Performance guides
......
...@@ -395,7 +395,9 @@ Implemented using Redis methods [PFADD](https://redis.io/commands/pfadd) and [PF ...@@ -395,7 +395,9 @@ Implemented using Redis methods [PFADD](https://redis.io/commands/pfadd) and [PF
API requests are protected by checking for a valid CSRF token. API requests are protected by checking for a valid CSRF token.
In order to be able to increment the values the related feature `usage_data<event_name>` should be enabled. In order to increment the values, the related feature `usage_data_<event_name>` should be
set to `default_enabled: true`. For more information, see
[Feature flags in development of GitLab](../feature_flags/index.md).
```plaintext ```plaintext
POST /usage_data/increment_unique_users POST /usage_data/increment_unique_users
...@@ -418,7 +420,10 @@ Implemented using Redis methods [PFADD](https://redis.io/commands/pfadd) and [PF ...@@ -418,7 +420,10 @@ Implemented using Redis methods [PFADD](https://redis.io/commands/pfadd) and [PF
Example usage for an existing event already defined in [known events](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage_data_counters/known_events/): Example usage for an existing event already defined in [known events](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage_data_counters/known_events/):
Note that `usage_data_api` and `usage_data_#{event_name}` should be enabled in order to be able to track events Usage Data API is behind `usage_data_api` feature flag which, as of GitLab 13.7, is
now set to `default_enabled: true`.
Each event tracked using Usage Data API is behind a feature flag `usage_data_#{event_name}` which should be `default_enabled: true`
```javascript ```javascript
import api from '~/api'; import api from '~/api';
......
This diff is collapsed.
...@@ -11,8 +11,7 @@ function WeightSelect(els, options = {}) { ...@@ -11,8 +11,7 @@ function WeightSelect(els, options = {}) {
const $selectbox = $dropdown.closest('.selectbox'); const $selectbox = $dropdown.closest('.selectbox');
const $block = $selectbox.closest('.block'); const $block = $selectbox.closest('.block');
const $value = $block.find('.value'); const $value = $block.find('.value');
// eslint-disable-next-line no-jquery/no-fade $block.find('.block-loading').addClass('gl-display-none');
$block.find('.block-loading').fadeOut();
const fieldName = options.fieldName || $dropdown.data('fieldName'); const fieldName = options.fieldName || $dropdown.data('fieldName');
const inputField = $dropdown.closest('.selectbox').find(`input[name='${fieldName}']`); const inputField = $dropdown.closest('.selectbox').find(`input[name='${fieldName}']`);
......
...@@ -6,13 +6,6 @@ module EE ...@@ -6,13 +6,6 @@ module EE
private private
override :group_member_data
def group_member_data(model)
super.tap do |data|
data[:group_plan] = model.group.gitlab_subscription&.plan_name
end
end
override :user_data override :user_data
def user_data(model) def user_data(model)
super.tap do |data| super.tap do |data|
......
# frozen_string_literal: true
module EE
module Gitlab
module HookData
module GroupMemberBuilder
extend ::Gitlab::Utils::Override
private
override :group_member_data
def group_member_data
super.tap do |data|
data[:group_plan] = group_member.group.gitlab_subscription&.plan_name
end
end
end
end
end
end
# frozen_string_literal: true
require 'spec_helper'
RSpec.describe Gitlab::HookData::GroupMemberBuilder do
let(:group_member) { create(:group_member, :developer, group: group) }
describe '#build' do
let(:event) { :create }
let(:data) { described_class.new(group_member).build(event) }
context 'data' do
context 'group_plan attribute' do
let(:group) { create(:group_with_plan, plan: :gold_plan) }
it 'returns correct group_plan' do
expect(data).to include(:group_plan)
expect(data[:group_plan]).to eq('gold')
end
end
end
end
end
...@@ -21,6 +21,13 @@ module Gitlab ...@@ -21,6 +21,13 @@ module Gitlab
private private
def timestamps_data
{
created_at: object.created_at&.xmlschema,
updated_at: object.updated_at&.xmlschema
}
end
def absolute_image_urls(markdown_text) def absolute_image_urls(markdown_text)
return markdown_text unless markdown_text.present? return markdown_text unless markdown_text.present?
......
# frozen_string_literal: true
module Gitlab
module HookData
class GroupMemberBuilder < BaseBuilder
alias_method :group_member, :object
# Sample data
# {
# :event_name=>"user_add_to_group",
# :group_name=>"GitLab group",
# :group_path=>"gitlab",
# :group_id=>1,
# :user_username=>"robert",
# :user_name=>"Robert Mills",
# :user_email=>"robert@example.com",
# :user_id=>14,
# :group_access=>"Guest",
# :created_at=>"2020-11-04T10:12:10Z",
# :updated_at=>"2020-11-04T10:12:10Z",
# }
def build(event)
[
timestamps_data,
group_member_data,
event_data(event)
].reduce(:merge)
end
private
def group_member_data
{
group_name: group_member.group.name,
group_path: group_member.group.path,
group_id: group_member.group.id,
user_username: group_member.user.username,
user_name: group_member.user.name,
user_email: group_member.user.email,
user_id: group_member.user.id,
group_access: group_member.human_access
}
end
def event_data(event)
event_name = case event
when :create
'user_add_to_group'
when :destroy
'user_remove_from_group'
when :update
'user_update_for_group'
end
{ event_name: event_name }
end
end
end
end
Gitlab::HookData::GroupMemberBuilder.prepend_if_ee('EE::Gitlab::HookData::GroupMemberBuilder')
# frozen_string_literal: true
require 'spec_helper'
RSpec.describe Gitlab::HookData::GroupMemberBuilder do
let_it_be(:group) { create(:group) }
let_it_be(:group_member) { create(:group_member, :developer, group: group) }
describe '#build' do
let(:data) { described_class.new(group_member).build(event) }
let(:event_name) { data[:event_name] }
let(:attributes) do
[
:event_name, :created_at, :updated_at, :group_name, :group_path,
:group_id, :user_id, :user_username, :user_name, :user_email, :group_access
]
end
context 'data' do
shared_examples_for 'includes the required attributes' do
it 'includes the required attributes' do
expect(data).to include(*attributes)
expect(data[:group_name]).to eq(group.name)
expect(data[:group_path]).to eq(group.path)
expect(data[:group_id]).to eq(group.id)
expect(data[:user_username]).to eq(group_member.user.username)
expect(data[:user_name]).to eq(group_member.user.name)
expect(data[:user_email]).to eq(group_member.user.email)
expect(data[:user_id]).to eq(group_member.user.id)
expect(data[:group_access]).to eq('Developer')
expect(data[:created_at]).to eq(group_member.created_at&.xmlschema)
expect(data[:updated_at]).to eq(group_member.updated_at&.xmlschema)
end
end
context 'on create' do
let(:event) { :create }
it { expect(event_name).to eq('user_add_to_group') }
it_behaves_like 'includes the required attributes'
end
context 'on update' do
let(:event) { :update }
it { expect(event_name).to eq('user_update_for_group') }
it_behaves_like 'includes the required attributes'
end
context 'on destroy' do
let(:event) { :destroy }
it { expect(event_name).to eq('user_remove_from_group') }
it_behaves_like 'includes the required attributes'
end
end
end
end
...@@ -159,9 +159,6 @@ RSpec.describe SystemHooksService do ...@@ -159,9 +159,6 @@ RSpec.describe SystemHooksService do
it { expect(event_name(group, :create)).to eq 'group_create' } it { expect(event_name(group, :create)).to eq 'group_create' }
it { expect(event_name(group, :destroy)).to eq 'group_destroy' } it { expect(event_name(group, :destroy)).to eq 'group_destroy' }
it { expect(event_name(group, :rename)).to eq 'group_rename' } it { expect(event_name(group, :rename)).to eq 'group_rename' }
it { expect(event_name(group_member, :create)).to eq 'user_add_to_group' }
it { expect(event_name(group_member, :destroy)).to eq 'user_remove_from_group' }
it { expect(event_name(group_member, :update)).to eq 'user_update_for_group' }
end end
def event_data(*args) def event_data(*args)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment