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
diff options
context:
space:
mode:
Diffstat (limited to 'app/assets/javascripts/protected_branches/protected_branch_edit.js')
-rw-r--r--app/assets/javascripts/protected_branches/protected_branch_edit.js171
1 files changed, 129 insertions, 42 deletions
diff --git a/app/assets/javascripts/protected_branches/protected_branch_edit.js b/app/assets/javascripts/protected_branches/protected_branch_edit.js
index 08d8c9919dd..1f079123081 100644
--- a/app/assets/javascripts/protected_branches/protected_branch_edit.js
+++ b/app/assets/javascripts/protected_branches/protected_branch_edit.js
@@ -1,78 +1,165 @@
-import flash from '../flash';
-import axios from '../lib/utils/axios_utils';
-import ProtectedBranchAccessDropdown from './protected_branch_access_dropdown';
+import { find } from 'lodash';
+import AccessDropdown from '~/projects/settings/access_dropdown';
+import axios from '~/lib/utils/axios_utils';
+import { ACCESS_LEVELS, LEVEL_TYPES } from './constants';
+import { deprecatedCreateFlash as flash } from '../flash';
import { __ } from '~/locale';
export default class ProtectedBranchEdit {
constructor(options) {
+ this.hasLicense = options.hasLicense;
+
+ this.$wraps = {};
+ this.hasChanges = false;
this.$wrap = options.$wrap;
this.$allowedToMergeDropdown = this.$wrap.find('.js-allowed-to-merge');
this.$allowedToPushDropdown = this.$wrap.find('.js-allowed-to-push');
- this.onSelectCallback = this.onSelect.bind(this);
+ this.$codeOwnerToggle = this.$wrap.find('.js-code-owner-toggle');
+
+ this.$wraps[ACCESS_LEVELS.MERGE] = this.$allowedToMergeDropdown.closest(
+ `.${ACCESS_LEVELS.MERGE}-container`,
+ );
+ this.$wraps[ACCESS_LEVELS.PUSH] = this.$allowedToPushDropdown.closest(
+ `.${ACCESS_LEVELS.PUSH}-container`,
+ );
this.buildDropdowns();
+ this.bindEvents();
+ }
+
+ bindEvents() {
+ if (this.hasLicense) {
+ this.$codeOwnerToggle.on('click', this.onCodeOwnerToggleClick.bind(this));
+ }
+ }
+
+ onCodeOwnerToggleClick() {
+ this.$codeOwnerToggle.toggleClass('is-checked');
+ this.$codeOwnerToggle.prop('disabled', true);
+
+ const formData = {
+ code_owner_approval_required: this.$codeOwnerToggle.hasClass('is-checked'),
+ };
+
+ this.updateCodeOwnerApproval(formData);
+ }
+
+ updateCodeOwnerApproval(formData) {
+ axios
+ .patch(this.$wrap.data('url'), {
+ protected_branch: formData,
+ })
+ .then(() => {
+ this.$codeOwnerToggle.prop('disabled', false);
+ })
+ .catch(() => {
+ flash(__('Failed to update branch!'));
+ });
}
buildDropdowns() {
// Allowed to merge dropdown
- this.protectedBranchAccessDropdown = new ProtectedBranchAccessDropdown({
+ this[`${ACCESS_LEVELS.MERGE}_dropdown`] = new AccessDropdown({
+ accessLevel: ACCESS_LEVELS.MERGE,
+ accessLevelsData: gon.merge_access_levels,
$dropdown: this.$allowedToMergeDropdown,
- data: gon.merge_access_levels,
- onSelect: this.onSelectCallback,
+ onSelect: this.onSelectOption.bind(this),
+ onHide: this.onDropdownHide.bind(this),
+ hasLicense: this.hasLicense,
});
// Allowed to push dropdown
- this.protectedBranchAccessDropdown = new ProtectedBranchAccessDropdown({
+ this[`${ACCESS_LEVELS.PUSH}_dropdown`] = new AccessDropdown({
+ accessLevel: ACCESS_LEVELS.PUSH,
+ accessLevelsData: gon.push_access_levels,
$dropdown: this.$allowedToPushDropdown,
- data: gon.push_access_levels,
- onSelect: this.onSelectCallback,
+ onSelect: this.onSelectOption.bind(this),
+ onHide: this.onDropdownHide.bind(this),
+ hasLicense: this.hasLicense,
});
}
- onSelect() {
- const $allowedToMergeInput = this.$wrap.find(
- `input[name="${this.$allowedToMergeDropdown.data('fieldName')}"]`,
- );
- const $allowedToPushInput = this.$wrap.find(
- `input[name="${this.$allowedToPushDropdown.data('fieldName')}"]`,
- );
+ onSelectOption() {
+ this.hasChanges = true;
+ }
- // Do not update if one dropdown has not selected any option
- if (!($allowedToMergeInput.length && $allowedToPushInput.length)) return;
+ onDropdownHide() {
+ if (!this.hasChanges) {
+ return;
+ }
- this.$allowedToMergeDropdown.disable();
- this.$allowedToPushDropdown.disable();
+ this.hasChanges = true;
+ this.updatePermissions();
+ }
+
+ updatePermissions() {
+ const formData = Object.keys(ACCESS_LEVELS).reduce((acc, level) => {
+ const accessLevelName = ACCESS_LEVELS[level];
+ const inputData = this[`${accessLevelName}_dropdown`].getInputData(accessLevelName);
+ acc[`${accessLevelName}_attributes`] = inputData;
+
+ return acc;
+ }, {});
axios
.patch(this.$wrap.data('url'), {
- protected_branch: {
- merge_access_levels_attributes: [
- {
- id: this.$allowedToMergeDropdown.data('accessLevelId'),
- access_level: $allowedToMergeInput.val(),
- },
- ],
- push_access_levels_attributes: [
- {
- id: this.$allowedToPushDropdown.data('accessLevelId'),
- access_level: $allowedToPushInput.val(),
- },
- ],
- },
+ protected_branch: formData,
})
- .then(() => {
+ .then(({ data }) => {
+ this.hasChanges = false;
+
+ Object.keys(ACCESS_LEVELS).forEach(level => {
+ const accessLevelName = ACCESS_LEVELS[level];
+
+ // The data coming from server will be the new persisted *state* for each dropdown
+ this.setSelectedItemsToDropdown(data[accessLevelName], `${accessLevelName}_dropdown`);
+ });
this.$allowedToMergeDropdown.enable();
this.$allowedToPushDropdown.enable();
})
.catch(() => {
this.$allowedToMergeDropdown.enable();
this.$allowedToPushDropdown.enable();
-
- flash(
- __('Failed to update branch!'),
- 'alert',
- document.querySelector('.js-protected-branches-list'),
- );
+ flash(__('Failed to update branch!'));
});
}
+
+ setSelectedItemsToDropdown(items = [], dropdownName) {
+ const itemsToAdd = items.map(currentItem => {
+ if (currentItem.user_id) {
+ // Do this only for users for now
+ // get the current data for selected items
+ const selectedItems = this[dropdownName].getSelectedItems();
+ const currentSelectedItem = find(selectedItems, {
+ user_id: currentItem.user_id,
+ });
+
+ return {
+ id: currentItem.id,
+ user_id: currentItem.user_id,
+ type: LEVEL_TYPES.USER,
+ persisted: true,
+ name: currentSelectedItem.name,
+ username: currentSelectedItem.username,
+ avatar_url: currentSelectedItem.avatar_url,
+ };
+ } else if (currentItem.group_id) {
+ return {
+ id: currentItem.id,
+ group_id: currentItem.group_id,
+ type: LEVEL_TYPES.GROUP,
+ persisted: true,
+ };
+ }
+
+ return {
+ id: currentItem.id,
+ access_level: currentItem.access_level,
+ type: LEVEL_TYPES.ROLE,
+ persisted: true,
+ };
+ });
+
+ this[dropdownName].setSelectedItems(itemsToAdd);
+ }
}