Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
G
gitlab-ce
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
1
Merge Requests
1
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
gitlab-ce
Commits
c93df1a5
Commit
c93df1a5
authored
Mar 06, 2017
by
Phil Hughes
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Fixed proteteced branch files
parent
26bb62e5
Changes
3
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
613 additions
and
53 deletions
+613
-53
app/assets/javascripts/protected_branches/protected_branch_access_dropdown.js
...ts/protected_branches/protected_branch_access_dropdown.js
+428
-11
app/assets/javascripts/protected_branches/protected_branch_create.js
...javascripts/protected_branches/protected_branch_create.js
+85
-18
app/assets/javascripts/protected_branches/protected_branch_edit.js
...s/javascripts/protected_branches/protected_branch_edit.js
+100
-24
No files found.
app/assets/javascripts/protected_branches/protected_branch_access_dropdown.js
View file @
c93df1a5
This diff is collapsed.
Click to expand it.
app/assets/javascripts/protected_branches/protected_branch_create.js
View file @
c93df1a5
/* eslint-disable no-new, arrow-parens, no-param-reassign, comma-dangle, max-len */
/* eslint-disable no-new, arrow-parens, no-param-reassign, comma-dangle,
guard-for-in, no-restricted-syntax,
max-len */
/* global ProtectedBranchDropdown */
/* global Flash */
(
global
=>
{
global
.
gl
=
global
.
gl
||
{};
const
ACCESS_LEVELS
=
{
MERGE
:
'
merge_access_levels
'
,
PUSH
:
'
push_access_levels
'
,
};
const
LEVEL_TYPES
=
{
ROLE
:
'
role
'
,
USER
:
'
user
'
,
GROUP
:
'
group
'
};
gl
.
ProtectedBranchCreate
=
class
{
constructor
()
{
this
.
$wrap
=
this
.
$form
=
$
(
'
#new_protected_branch
'
);
this
.
buildDropdowns
();
this
.
$branchInput
=
this
.
$wrap
.
find
(
'
input[name="protected_branch[name]"]
'
);
this
.
bindEvents
();
}
bindEvents
()
{
this
.
$form
.
on
(
'
submit
'
,
this
.
onFormSubmit
.
bind
(
this
));
}
buildDropdowns
()
{
...
...
@@ -18,38 +36,87 @@
this
.
onSelectCallback
=
this
.
onSelect
.
bind
(
this
);
// Allowed to Merge dropdown
new
gl
.
ProtectedBranchAccessDropdown
({
this
[
`
${
ACCESS_LEVELS
.
MERGE
}
_dropdown`
]
=
new
gl
.
ProtectedBranchAccessDropdown
({
$dropdown
:
$allowedToMergeDropdown
,
data
:
gon
.
merge_access_levels
,
onSelect
:
this
.
onSelectCallback
accessLevelsData
:
gon
.
merge_access_levels
,
onSelect
:
this
.
onSelectCallback
,
accessLevel
:
ACCESS_LEVELS
.
MERGE
});
// Allowed to Push dropdown
new
gl
.
ProtectedBranchAccessDropdown
({
this
[
`
${
ACCESS_LEVELS
.
PUSH
}
_dropdown`
]
=
new
gl
.
ProtectedBranchAccessDropdown
({
$dropdown
:
$allowedToPushDropdown
,
data
:
gon
.
push_access_levels
,
onSelect
:
this
.
onSelectCallback
accessLevelsData
:
gon
.
push_access_levels
,
onSelect
:
this
.
onSelectCallback
,
accessLevel
:
ACCESS_LEVELS
.
PUSH
});
// Select default
$allowedToPushDropdown
.
data
(
'
glDropdown
'
).
selectRowAtIndex
(
0
);
$allowedToMergeDropdown
.
data
(
'
glDropdown
'
).
selectRowAtIndex
(
0
);
// Protected branch dropdown
new
ProtectedBranchDropdown
({
new
window
.
ProtectedBranchDropdown
({
$dropdown
:
this
.
$wrap
.
find
(
'
.js-protected-branch-select
'
),
onSelect
:
this
.
onSelectCallback
});
}
//
This will run after clicked callback
//
Enable submit button after selecting an option
onSelect
()
{
// Enable submit button
const
$branchInput
=
this
.
$wrap
.
find
(
'
input[name="protected_branch[name]"]
'
);
const
$allowedToMergeInput
=
this
.
$wrap
.
find
(
'
input[name="protected_branch[merge_access_levels_attributes][0][access_level]"]
'
);
const
$allowedToPushInput
=
this
.
$wrap
.
find
(
'
input[name="protected_branch[push_access_levels_attributes][0][access_level]"]
'
);
const
$allowedToMerge
=
this
[
`
${
ACCESS_LEVELS
.
MERGE
}
_dropdown`
].
getSelectedItems
();
const
$allowedToPush
=
this
[
`
${
ACCESS_LEVELS
.
PUSH
}
_dropdown`
].
getSelectedItems
();
const
toggle
=
!
(
this
.
$wrap
.
find
(
'
input[name="protected_branch[name]"]
'
).
val
()
&&
$allowedToMerge
.
length
&&
$allowedToPush
.
length
);
this
.
$form
.
find
(
'
input[type="submit"]
'
).
attr
(
'
disabled
'
,
toggle
);
}
getFormData
()
{
const
formData
=
{
authenticity_token
:
this
.
$form
.
find
(
'
input[name="authenticity_token"]
'
).
val
(),
protected_branch
:
{
name
:
this
.
$wrap
.
find
(
'
input[name="protected_branch[name]"]
'
).
val
(),
}
};
for
(
const
ACCESS_LEVEL
in
ACCESS_LEVELS
)
{
const
selectedItems
=
this
[
`
${
ACCESS_LEVELS
[
ACCESS_LEVEL
]}
_dropdown`
].
getSelectedItems
();
const
levelAttributes
=
[];
for
(
let
i
=
0
;
i
<
selectedItems
.
length
;
i
+=
1
)
{
const
current
=
selectedItems
[
i
];
if
(
current
.
type
===
LEVEL_TYPES
.
USER
)
{
levelAttributes
.
push
({
user_id
:
selectedItems
[
i
].
user_id
});
}
else
if
(
current
.
type
===
LEVEL_TYPES
.
ROLE
)
{
levelAttributes
.
push
({
access_level
:
selectedItems
[
i
].
access_level
});
}
else
if
(
current
.
type
===
LEVEL_TYPES
.
GROUP
)
{
levelAttributes
.
push
({
group_id
:
selectedItems
[
i
].
group_id
});
}
}
this
.
$form
.
find
(
'
input[type="submit"]
'
).
attr
(
'
disabled
'
,
!
(
$branchInput
.
val
()
&&
$allowedToMergeInput
.
length
&&
$allowedToPushInput
.
length
));
formData
.
protected_branch
[
`
${
ACCESS_LEVELS
[
ACCESS_LEVEL
]}
_attributes`
]
=
levelAttributes
;
}
return
formData
;
}
onFormSubmit
(
e
)
{
e
.
preventDefault
();
$
.
ajax
({
url
:
this
.
$form
.
attr
(
'
action
'
),
method
:
this
.
$form
.
attr
(
'
method
'
),
data
:
this
.
getFormData
()
})
.
success
(()
=>
{
location
.
reload
();
})
.
fail
(()
=>
{
new
Flash
(
'
Failed to protect the branch
'
);
});
}
};
})(
window
);
app/assets/javascripts/protected_branches/protected_branch_edit.js
View file @
c93df1a5
/* eslint-disable no-new, arrow-parens, no-param-reassign, comma-dangle, max-len */
/* eslint-disable no-new, arrow-parens, no-param-reassign, comma-dangle,
dot-notation, no-unused-vars, no-restricted-syntax, guard-for-in,
max-len */
/* global Flash */
(
global
=>
{
global
.
gl
=
global
.
gl
||
{};
const
ACCESS_LEVELS
=
{
MERGE
:
'
merge_access_levels
'
,
PUSH
:
'
push_access_levels
'
,
};
const
LEVEL_TYPES
=
{
ROLE
:
'
role
'
,
USER
:
'
user
'
,
GROUP
:
'
group
'
};
gl
.
ProtectedBranchEdit
=
class
{
constructor
(
options
)
{
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
.
$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
();
}
buildDropdowns
()
{
// Allowed to merge dropdown
new
gl
.
ProtectedBranchAccessDropdown
({
this
[
'
merge_access_levels_dropdown
'
]
=
new
gl
.
ProtectedBranchAccessDropdown
({
accessLevel
:
ACCESS_LEVELS
.
MERGE
,
accessLevelsData
:
gon
.
merge_access_levels
,
$dropdown
:
this
.
$allowedToMergeDropdown
,
data
:
gon
.
merge_access_levels
,
on
Select
:
this
.
onSelect
.
bind
(
this
)
onSelect
:
this
.
onSelectOption
.
bind
(
this
)
,
on
Hide
:
this
.
onDropdownHide
.
bind
(
this
)
});
// Allowed to push dropdown
new
gl
.
ProtectedBranchAccessDropdown
({
this
[
'
push_access_levels_dropdown
'
]
=
new
gl
.
ProtectedBranchAccessDropdown
({
accessLevel
:
ACCESS_LEVELS
.
PUSH
,
accessLevelsData
:
gon
.
push_access_levels
,
$dropdown
:
this
.
$allowedToPushDropdown
,
data
:
gon
.
push_access_levels
,
on
Select
:
this
.
onSelect
.
bind
(
this
)
onSelect
:
this
.
onSelectOption
.
bind
(
this
)
,
on
Hide
:
this
.
onDropdownHide
.
bind
(
this
)
});
}
onSelect
()
{
const
$allowedToMergeInput
=
this
.
$wrap
.
find
(
`input[name="
${
this
.
$allowedToMergeDropdown
.
data
(
'
fieldName
'
)}
"]`
);
const
$allowedToPushInput
=
this
.
$wrap
.
find
(
`input[name="
${
this
.
$allowedToPushDropdown
.
data
(
'
fieldName
'
)}
"]`
);
onSelectOption
(
item
,
$el
,
dropdownInstance
)
{
this
.
hasChanges
=
true
;
}
onDropdownHide
()
{
if
(
!
this
.
hasChanges
)
return
;
this
.
hasChanges
=
true
;
this
.
updatePermissions
();
}
updatePermissions
()
{
const
formData
=
{};
// Do not update if one dropdown has not selected any option
if
(
!
(
$allowedToMergeInput
.
length
&&
$allowedToPushInput
.
length
))
return
;
for
(
const
ACCESS_LEVEL
in
ACCESS_LEVELS
)
{
const
accessLevelName
=
ACCESS_LEVELS
[
ACCESS_LEVEL
]
;
this
.
$allowedToMergeDropdown
.
disable
(
);
this
.
$allowedToPushDropdown
.
disable
();
formData
[
`
${
accessLevelName
}
_attributes`
]
=
this
[
`
${
accessLevelName
}
_dropdown`
].
getInputData
(
accessLevelName
);
}
$
.
ajax
({
return
$
.
ajax
({
type
:
'
POST
'
,
url
:
this
.
$wrap
.
data
(
'
url
'
),
dataType
:
'
json
'
,
data
:
{
_method
:
'
PATCH
'
,
protected_branch
:
{
merge_access_levels_attributes
:
[{
id
:
this
.
$allowedToMergeDropdown
.
data
(
'
access-level-id
'
),
access_level
:
$allowedToMergeInput
.
val
()
}],
push_access_levels_attributes
:
[{
id
:
this
.
$allowedToPushDropdown
.
data
(
'
access-level-id
'
),
access_level
:
$allowedToPushInput
.
val
()
}]
protected_branch
:
formData
},
success
:
(
response
)
=>
{
this
.
hasChanges
=
false
;
for
(
const
ACCESS_LEVEL
in
ACCESS_LEVELS
)
{
const
accessLevelName
=
ACCESS_LEVELS
[
ACCESS_LEVEL
];
// The data coming from server will be the new persisted *state* for each dropdown
this
.
setSelectedItemsToDropdown
(
response
[
accessLevelName
],
`
${
accessLevelName
}
_dropdown`
);
}
},
error
()
{
...
...
@@ -65,5 +97,49 @@
this
.
$allowedToPushDropdown
.
enable
();
});
}
setSelectedItemsToDropdown
(
items
=
[],
dropdownName
)
{
const
itemsToAdd
=
[];
for
(
let
i
=
0
;
i
<
items
.
length
;
i
+=
1
)
{
let
itemToAdd
;
const
currentItem
=
items
[
i
];
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
=
_
.
findWhere
(
selectedItems
,
{
user_id
:
currentItem
.
user_id
});
itemToAdd
=
{
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
)
{
itemToAdd
=
{
id
:
currentItem
.
id
,
group_id
:
currentItem
.
group_id
,
type
:
LEVEL_TYPES
.
GROUP
,
persisted
:
true
};
}
else
{
itemToAdd
=
{
id
:
currentItem
.
id
,
access_level
:
currentItem
.
access_level
,
type
:
LEVEL_TYPES
.
ROLE
,
persisted
:
true
};
}
itemsToAdd
.
push
(
itemToAdd
);
}
this
[
dropdownName
].
setSelectedItems
(
itemsToAdd
);
}
};
})(
window
);
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment