##// END OF EJS Templates
diffs: added scroll down/scroll up helper. Fixes #5643
diffs: added scroll down/scroll up helper. Fixes #5643

File last commit:

r4595:82d4afd7 stable
r4595:82d4afd7 stable
Show More
pullrequests.js
1173 lines | 36.1 KiB | application/javascript | JavascriptLexer
code: update copyrights to 2020
r4306 // # Copyright (C) 2010-2020 RhodeCode GmbH
project: added all source files and assets
r1 // #
// # This program is free software: you can redistribute it and/or modify
// # it under the terms of the GNU Affero General Public License, version 3
// # (only), as published by the Free Software Foundation.
// #
// # This program is distributed in the hope that it will be useful,
// # but WITHOUT ANY WARRANTY; without even the implied warranty of
// # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// # GNU General Public License for more details.
// #
// # You should have received a copy of the GNU Affero General Public License
// # along with this program. If not, see <http://www.gnu.org/licenses/>.
// #
// # This program is dual-licensed. If you wish to learn more about the
// # RhodeCode Enterprise Edition, including its added features, Support services,
// # and proprietary license terms, please see https://rhodecode.com/licenses/
pull-request: extended default reviewers functionality....
r1769
var prButtonLockChecks = {
'compare': false,
'reviewers': false
};
project: added all source files and assets
r1 /**
pull-request: extended default reviewers functionality....
r1769 * lock button until all checks and loads are made. E.g reviewer calculation
* should prevent from submitting a PR
* @param lockEnabled
* @param msg
* @param scope
project: added all source files and assets
r1 */
pull-request: extended default reviewers functionality....
r1769 var prButtonLock = function(lockEnabled, msg, scope) {
scope = scope || 'all';
if (scope == 'all'){
prButtonLockChecks['compare'] = !lockEnabled;
prButtonLockChecks['reviewers'] = !lockEnabled;
} else if (scope == 'compare') {
prButtonLockChecks['compare'] = !lockEnabled;
} else if (scope == 'reviewers'){
prButtonLockChecks['reviewers'] = !lockEnabled;
}
var checksMeet = prButtonLockChecks.compare && prButtonLockChecks.reviewers;
if (lockEnabled) {
pull-requests: lock submit on pull request to prevent double submission on fast click.
r2806 $('#pr_submit').attr('disabled', 'disabled');
pull-request: extended default reviewers functionality....
r1769 }
else if (checksMeet) {
pull-requests: lock submit on pull request to prevent double submission on fast click.
r2806 $('#pr_submit').removeAttr('disabled');
pull-request: extended default reviewers functionality....
r1769 }
project: added all source files and assets
r1
pull-request: extended default reviewers functionality....
r1769 if (msg) {
$('#pr_open_message').html(msg);
}
};
project: added all source files and assets
r1
pull-request: extended default reviewers functionality....
r1769
/**
Generate Title and Description for a PullRequest.
In case of 1 commits, the title and description is that one commit
in case of multiple commits, we iterate on them with max N number of commits,
and build description in a form
- commitN
- commitN+1
...
Title is then constructed from branch names, or other references,
replacing '-' and '_' into spaces
* @param sourceRef
* @param elements
* @param limit
* @returns {*[]}
*/
pull-requests: make auto generated title for pull requests show also source Ref type .eg. branch feature1, instead of just name of the branch.
r4433 var getTitleAndDescription = function(sourceRefType, sourceRef, elements, limit) {
pull-request: extended default reviewers functionality....
r1769 var title = '';
var desc = '';
$.each($(elements).get().reverse().slice(0, limit), function(idx, value) {
pull-requests: fix way how pull-request calculates common ancestors....
r4346 var rawMessage = value['message'];
pull-request: extended default reviewers functionality....
r1769 desc += '- ' + rawMessage.split('\n')[0].replace(/\n+$/, "") + '\n';
});
// only 1 commit, use commit message as title
if (elements.length === 1) {
pull-requests: fix way how pull-request calculates common ancestors....
r4346 var rawMessage = elements[0]['message'];
dan
pull-requests: fixed title/description generation for single commits which are numbers....
r4163 title = rawMessage.split('\n')[0];
pull-request: extended default reviewers functionality....
r1769 }
else {
// use reference name
pull-requests: make auto generated title for pull requests show also source Ref type .eg. branch feature1, instead of just name of the branch.
r4433 var normalizedRef = sourceRef.replace(/-/g, ' ').replace(/_/g, ' ').capitalizeFirstLetter()
var refType = sourceRefType;
title = 'Changes from {0}: {1}'.format(refType, normalizedRef);
pull-request: extended default reviewers functionality....
r1769 }
return [title, desc]
project: added all source files and assets
r1 };
pull-request: extended default reviewers functionality....
r1769
reviewers: added observers as another way to define reviewers....
r4500 window.ReviewersController = function () {
pull-request: extended default reviewers functionality....
r1769 var self = this;
reviewers: added observers as another way to define reviewers....
r4500 this.$loadingIndicator = $('.calculate-reviewers');
pull-request: extended default reviewers functionality....
r1769 this.$reviewRulesContainer = $('#review_rules');
this.$rulesList = this.$reviewRulesContainer.find('.pr-reviewer-rules');
pull-requests: overhaul of the UX by adding new sidebar...
r4482 this.$userRule = $('.pr-user-rule-container');
pull-request: extended default reviewers functionality....
r1769 this.$reviewMembers = $('#review_members');
reviewers: added observers as another way to define reviewers....
r4500 this.$observerMembers = $('#observer_members');
pull-request: extended default reviewers functionality....
r1769 this.currentRequest = null;
pull-requests: fix way how pull-request calculates common ancestors....
r4346 this.diffData = null;
pull-requests: overhaul of the UX by adding new sidebar...
r4482 this.enabledRules = [];
reviewers: added observers as another way to define reviewers....
r4500 // sync with db.py entries
this.ROLE_REVIEWER = 'reviewer';
this.ROLE_OBSERVER = 'observer'
pull-requests: overhaul of the UX by adding new sidebar...
r4482
pull-requests: fix way how pull-request calculates common ancestors....
r4346 //dummy handler, we might register our own later
reviewers: added observers as another way to define reviewers....
r4500 this.diffDataHandler = function (data) {};
pull-request: extended default reviewers functionality....
r1769
reviewers: added observers as another way to define reviewers....
r4500 this.defaultForbidUsers = function () {
pull-request: extended default reviewers functionality....
r1769 return [
pull-requests: fix way how pull-request calculates common ancestors....
r4346 {
'username': 'default',
'user_id': templateContext.default_user.user_id
}
pull-request: extended default reviewers functionality....
r1769 ];
};
reviewers: added observers as another way to define reviewers....
r4500 // init default forbidden users
this.forbidUsers = this.defaultForbidUsers();
pull-requests: fix way how pull-request calculates common ancestors....
r4346 this.hideReviewRules = function () {
pull-request: extended default reviewers functionality....
r1769 self.$reviewRulesContainer.hide();
pull-requests: overhaul of the UX by adding new sidebar...
r4482 $(self.$userRule.selector).hide();
pull-request: extended default reviewers functionality....
r1769 };
pull-requests: fix way how pull-request calculates common ancestors....
r4346 this.showReviewRules = function () {
pull-request: extended default reviewers functionality....
r1769 self.$reviewRulesContainer.show();
pull-requests: overhaul of the UX by adding new sidebar...
r4482 $(self.$userRule.selector).show();
pull-request: extended default reviewers functionality....
r1769 };
pull-requests: fix way how pull-request calculates common ancestors....
r4346 this.addRule = function (ruleText) {
pull-request: extended default reviewers functionality....
r1769 self.showReviewRules();
pull-requests: overhaul of the UX by adding new sidebar...
r4482 self.enabledRules.push(ruleText);
pull-request: extended default reviewers functionality....
r1769 return '<div>- {0}</div>'.format(ruleText)
};
reviewers: added observers as another way to define reviewers....
r4500 this.increaseCounter = function(role) {
if (role === self.ROLE_REVIEWER) {
var $elem = $('#reviewers-cnt')
var cnt = parseInt($elem.data('count') || 0)
cnt +=1
$elem.html(cnt);
$elem.data('count', cnt);
}
else if (role === self.ROLE_OBSERVER) {
var $elem = $('#observers-cnt');
var cnt = parseInt($elem.data('count') || 0)
cnt +=1
$elem.html(cnt);
$elem.data('count', cnt);
}
}
this.resetCounter = function () {
var $elem = $('#reviewers-cnt');
$elem.data('count', 0);
$elem.html(0);
var $elem = $('#observers-cnt');
$elem.data('count', 0);
$elem.html(0);
}
pull-requests: fix way how pull-request calculates common ancestors....
r4346 this.loadReviewRules = function (data) {
self.diffData = data;
pull-request: extended default reviewers functionality....
r1769 // reset forbidden Users
reviewers: added observers as another way to define reviewers....
r4500 this.forbidUsers = self.defaultForbidUsers();
pull-request: extended default reviewers functionality....
r1769
// reset state of review rules
self.$rulesList.html('');
if (!data || data.rules === undefined || $.isEmptyObject(data.rules)) {
// default rule, case for older repo that don't have any rules stored
self.$rulesList.append(
reviewers: changes for new author/commit author logic....
r4559 self.addRule(_gettext('All reviewers must vote.'))
pull-request: extended default reviewers functionality....
r1769 );
reviewers: added observers as another way to define reviewers....
r4500 return self.forbidUsers
pull-request: extended default reviewers functionality....
r1769 }
reviewers: changes for new author/commit author logic....
r4559 if (data.rules.forbid_adding_reviewers) {
$('#add_reviewer_input').remove();
pull-request: extended default reviewers functionality....
r1769 }
default-reviewers: introduce new voting rule logic that allows...
r2484
reviewers: changes for new author/commit author logic....
r4559 if (data.rules_data !== undefined && data.rules_data.forbidden_users !== undefined) {
$.each(data.rules_data.forbidden_users, function(idx, val){
self.forbidUsers.push(val)
})
pull-request: extended default reviewers functionality....
r1769 }
pull-requests: overhaul of the UX by adding new sidebar...
r4482
reviewers: changes for new author/commit author logic....
r4559 if (data.rules_humanized !== undefined && data.rules_humanized.length > 0) {
$.each(data.rules_humanized, function(idx, val) {
self.$rulesList.append(
self.addRule(val)
)
})
} else {
// we don't have any rules set, so we inform users about it
pull-request: extended default reviewers functionality....
r1769 self.$rulesList.append(
reviewers: changes for new author/commit author logic....
r4559 self.addRule(_gettext('No additional review rules set.'))
pull-request: extended default reviewers functionality....
r1769 )
}
pull-requests: overhaul of the UX by adding new sidebar...
r4482
reviewers: added observers as another way to define reviewers....
r4500 return self.forbidUsers
pull-request: extended default reviewers functionality....
r1769 };
reviewers: added observers as another way to define reviewers....
r4500 this.emptyTables = function () {
self.emptyReviewersTable();
self.emptyObserversTable();
// Also reset counters.
self.resetCounter();
}
this.emptyReviewersTable = function (withText) {
self.$reviewMembers.empty();
if (withText !== undefined) {
self.$reviewMembers.html(withText)
}
};
this.emptyObserversTable = function (withText) {
self.$observerMembers.empty();
if (withText !== undefined) {
self.$observerMembers.html(withText)
}
}
pull-requests: fix way how pull-request calculates common ancestors....
r4346 this.loadDefaultReviewers = function (sourceRepo, sourceRef, targetRepo, targetRef) {
pull-request: extended default reviewers functionality....
r1769
if (self.currentRequest) {
pull-requests: fix way how pull-request calculates common ancestors....
r4346 // make sure we cleanup old running requests before triggering this again
pull-request: extended default reviewers functionality....
r1769 self.currentRequest.abort();
dan
reviewers: add repo review rule models and expose default...
r821 }
pull-request: extended default reviewers functionality....
r1769
reviewers: added observers as another way to define reviewers....
r4500 self.$loadingIndicator.show();
// reset reviewer/observe members
self.emptyTables();
pull-request: extended default reviewers functionality....
r1769
prButtonLock(true, null, 'reviewers');
$('#user').hide(); // hide user autocomplete before load
reviewers: added observers as another way to define reviewers....
r4500 $('#observer').hide(); //hide observer autocomplete before load
pull-request: extended default reviewers functionality....
r1769
pull-requests: fix way how pull-request calculates common ancestors....
r4346 // lock PR button, so we cannot send PR before it's calculated
prButtonLock(true, _gettext('Loading diff ...'), 'compare');
pull-requests: fixed cases with default expected refs are closed or unavailable....
r2555 if (sourceRef.length !== 3 || targetRef.length !== 3) {
// don't load defaults in case we're missing some refs...
reviewers: added observers as another way to define reviewers....
r4500 self.$loadingIndicator.hide();
pull-requests: fixed cases with default expected refs are closed or unavailable....
r2555 return
}
pull-request: extended default reviewers functionality....
r1769 var url = pyroutes.url('repo_default_reviewers_data',
pull-requests: fix way how pull-request calculates common ancestors....
r4346 {
'repo_name': templateContext.repo_name,
'source_repo': sourceRepo,
pull-requests: limit the ammount of data saved in default reviewers data for better memory usage...
r4509 'source_ref_type': sourceRef[0],
'source_ref_name': sourceRef[1],
pull-requests: fix way how pull-request calculates common ancestors....
r4346 'source_ref': sourceRef[2],
'target_repo': targetRepo,
pull-requests: limit the ammount of data saved in default reviewers data for better memory usage...
r4509 'target_ref': targetRef[2],
pull-requests: fixed source/target in PR creation
r4584 'target_ref_type': targetRef[0],
'target_ref_name': targetRef[1]
pull-requests: fix way how pull-request calculates common ancestors....
r4346 });
pull-request: extended default reviewers functionality....
r1769
pull-requests: fix way how pull-request calculates common ancestors....
r4346 self.currentRequest = $.ajax({
url: url,
headers: {'X-PARTIAL-XHR': true},
type: 'GET',
success: function (data) {
pull-request: extended default reviewers functionality....
r1769 self.currentRequest = null;
// review rules
self.loadReviewRules(data);
default-reviewers: handle no common ancestor case.
r4520 var diffHandled = self.handleDiffData(data["diff_info"]);
if (diffHandled === false) {
return
}
pull-request: extended default reviewers functionality....
r1769
for (var i = 0; i < data.reviewers.length; i++) {
pull-requests: fix way how pull-request calculates common ancestors....
r4346 var reviewer = data.reviewers[i];
reviewers: added observers as another way to define reviewers....
r4500 // load reviewer rules from the repo data
self.addMember(reviewer, reviewer.reasons, reviewer.mandatory, reviewer.role);
pull-request: extended default reviewers functionality....
r1769 }
reviewers: added observers as another way to define reviewers....
r4500
self.$loadingIndicator.hide();
pull-request: extended default reviewers functionality....
r1769 prButtonLock(false, null, 'reviewers');
reviewers: added observers as another way to define reviewers....
r4500
$('#user').show(); // show user autocomplete before load
$('#observer').show(); // show observer autocomplete before load
pull-requests: fix way how pull-request calculates common ancestors....
r4346
var commitElements = data["diff_info"]['commits'];
commits/pr pages various fixes....
r4485
pull-requests: fix way how pull-request calculates common ancestors....
r4346 if (commitElements.length === 0) {
commits/pr pages various fixes....
r4485 var noCommitsMsg = '<span class="alert-text-warning">{0}</span>'.format(
_gettext('There are no commits to merge.'));
prButtonLock(true, noCommitsMsg, 'all');
pull-requests: fix way how pull-request calculates common ancestors....
r4346
} else {
// un-lock PR button, so we cannot send PR before it's calculated
prButtonLock(false, null, 'compare');
}
},
error: function (jqXHR, textStatus, errorThrown) {
reviewers: added observers as another way to define reviewers....
r4500 var prefix = "Loading diff and reviewers/observers failed\n"
pull-requests: fix way how pull-request calculates common ancestors....
r4346 var message = formatErrorMessage(jqXHR, textStatus, errorThrown, prefix);
ajaxErrorSwal(message);
}
});
pull-request: extended default reviewers functionality....
r1769 };
// check those, refactor
reviewers: added observers as another way to define reviewers....
r4500 this.removeMember = function (reviewer_id, mark_delete) {
pull-request: extended default reviewers functionality....
r1769 var reviewer = $('#reviewer_{0}'.format(reviewer_id));
pull-requests: fix way how pull-request calculates common ancestors....
r4346 if (typeof (mark_delete) === undefined) {
pull-request: extended default reviewers functionality....
r1769 mark_delete = false;
}
pull-requests: fix way how pull-request calculates common ancestors....
r4346 if (mark_delete === true) {
if (reviewer) {
pull-request: extended default reviewers functionality....
r1769 // now delete the input
$('#reviewer_{0} input'.format(reviewer_id)).remove();
reviewers: added observers as another way to define reviewers....
r4500 $('#reviewer_{0}_rules input'.format(reviewer_id)).remove();
pull-request: extended default reviewers functionality....
r1769 // mark as to-delete
var obj = $('#reviewer_{0}_name'.format(reviewer_id));
obj.addClass('to-delete');
pull-requests: fix way how pull-request calculates common ancestors....
r4346 obj.css({"text-decoration": "line-through", "opacity": 0.5});
pull-request: extended default reviewers functionality....
r1769 }
pull-requests: fix way how pull-request calculates common ancestors....
r4346 } else {
pull-request: extended default reviewers functionality....
r1769 $('#reviewer_{0}'.format(reviewer_id)).remove();
}
};
pull-requests: fix way how pull-request calculates common ancestors....
r4346
reviewers: added observers as another way to define reviewers....
r4500 this.addMember = function (reviewer_obj, reasons, mandatory, role) {
pull-request: extended default reviewers functionality....
r1769
default-reviewers: introduce new voting rule logic that allows...
r2484 var id = reviewer_obj.user_id;
var username = reviewer_obj.username;
reviewers: added observers as another way to define reviewers....
r4500 reasons = reasons || [];
mandatory = mandatory || false;
role = role || self.ROLE_REVIEWER
dan
reviewers: store reviewer reasons to database, fixes #4238
r873
reviewers: added observers as another way to define reviewers....
r4500 // register current set IDS to check if we don't have this ID already in
// and prevent duplicates
default-reviewers: introduce new voting rule logic that allows...
r2484 var currentIds = [];
commits/pr pages various fixes....
r4485
reviewers: added observers as another way to define reviewers....
r4500 $.each($('.reviewer_entry'), function (index, value) {
commits/pr pages various fixes....
r4485 currentIds.push($(value).data('reviewerUserId'))
})
pull-request: extended default reviewers functionality....
r1769
pull-requests: fix way how pull-request calculates common ancestors....
r4346 var userAllowedReview = function (userId) {
pull-request: extended default reviewers functionality....
r1769 var allowed = true;
reviewers: added observers as another way to define reviewers....
r4500 $.each(self.forbidUsers, function (index, member_data) {
pull-request: extended default reviewers functionality....
r1769 if (parseInt(userId) === member_data['user_id']) {
allowed = false;
return false // breaks the loop
}
});
return allowed
};
var userAllowed = userAllowedReview(id);
reviewers: added observers as another way to define reviewers....
r4500
pull-requests: fix way how pull-request calculates common ancestors....
r4346 if (!userAllowed) {
alert(_gettext('User `{0}` not allowed to be a reviewer').format(username));
default-reviewers: introduce new voting rule logic that allows...
r2484 } else {
// only add if it's not there
commits/pr pages various fixes....
r4485 var alreadyReviewer = currentIds.indexOf(id) != -1;
pull-request: extended default reviewers functionality....
r1769
default-reviewers: introduce new voting rule logic that allows...
r2484 if (alreadyReviewer) {
reviewers: added observers as another way to define reviewers....
r4500 alert(_gettext('User `{0}` already in reviewers/observers').format(username));
default-reviewers: introduce new voting rule logic that allows...
r2484 } else {
reviewers: added observers as another way to define reviewers....
r4500
commits/pr pages various fixes....
r4485 var reviewerEntry = renderTemplate('reviewMemberEntry', {
pull-requests: fix way how pull-request calculates common ancestors....
r4346 'member': reviewer_obj,
'mandatory': mandatory,
reviewers: added observers as another way to define reviewers....
r4500 'role': role,
pull-requests: overhaul of the UX by adding new sidebar...
r4482 'reasons': reasons,
pull-requests: fix way how pull-request calculates common ancestors....
r4346 'allowed_to_update': true,
'review_status': 'not_reviewed',
'review_status_label': _gettext('Not Reviewed'),
pull-requests: overhaul of the UX by adding new sidebar...
r4482 'user_group': reviewer_obj.user_group,
'create': true,
commits/pr pages various fixes....
r4485 'rule_show': true,
diffs: added scroll down/scroll up helper. Fixes #5643
r4595 'rhodecode_user': templateContext.rhodecode_user
commits/pr pages various fixes....
r4485 })
reviewers: added observers as another way to define reviewers....
r4500
if (role === self.ROLE_REVIEWER) {
$(self.$reviewMembers.selector).append(reviewerEntry);
self.increaseCounter(self.ROLE_REVIEWER);
$('#reviewer-empty-msg').remove()
}
else if (role === self.ROLE_OBSERVER) {
$(self.$observerMembers.selector).append(reviewerEntry);
self.increaseCounter(self.ROLE_OBSERVER);
$('#observer-empty-msg').remove();
}
hovercacrds: added new tooltips and hovercards to expose certain information for objects shown in UI
r4026 tooltipActivate();
default-reviewers: introduce new voting rule logic that allows...
r2484 }
pull-request: extended default reviewers functionality....
r1769 }
};
reviewers: added observers as another way to define reviewers....
r4500 this.updateReviewers = function (repo_name, pull_request_id, role) {
if (role === 'reviewer') {
var postData = $('#reviewers input').serialize();
_updatePullRequest(repo_name, pull_request_id, postData);
} else if (role === 'observer') {
var postData = $('#observers input').serialize();
_updatePullRequest(repo_name, pull_request_id, postData);
}
pull-request: extended default reviewers functionality....
r1769 };
project: added all source files and assets
r1
pull-requests: fix way how pull-request calculates common ancestors....
r4346 this.handleDiffData = function (data) {
default-reviewers: handle no common ancestor case.
r4520 return self.diffDataHandler(data)
pull-requests: fix way how pull-request calculates common ancestors....
r4346 }
project: added all source files and assets
r1 };
pull-request: extended default reviewers functionality....
r1769
project: added all source files and assets
r1 var _updatePullRequest = function(repo_name, pull_request_id, postData) {
var url = pyroutes.url(
'pullrequest_update',
{"repo_name": repo_name, "pull_request_id": pull_request_id});
dan
reviewers: store reviewer reasons to database, fixes #4238
r873 if (typeof postData === 'string' ) {
postData += '&csrf_token=' + CSRF_TOKEN;
} else {
postData.csrf_token = CSRF_TOKEN;
}
pull-requests: moved force refresh to update commits button....
r4101
project: added all source files and assets
r1 var success = function(o) {
pull-requests: moved force refresh to update commits button....
r4101 var redirectUrl = o['redirect_url'];
if (redirectUrl !== undefined && redirectUrl !== null && redirectUrl !== '') {
window.location = redirectUrl;
} else {
window.location.reload();
}
project: added all source files and assets
r1 };
pull-requests: moved force refresh to update commits button....
r4101
project: added all source files and assets
r1 ajaxPOST(url, postData, success);
};
/**
* PULL REQUEST update commits
*/
pull-requests: moved force refresh to update commits button....
r4101 var updateCommits = function(repo_name, pull_request_id, force) {
project: added all source files and assets
r1 var postData = {
pull-requests: moved force refresh to update commits button....
r4101 'update_commits': true
};
if (force !== undefined && force === true) {
postData['force_refresh'] = true
}
project: added all source files and assets
r1 _updatePullRequest(repo_name, pull_request_id, postData);
};
/**
* PULL REQUEST edit info
*/
pull-requests: make the renderer stored and saved for each pull requests....
r2903 var editPullRequest = function(repo_name, pull_request_id, title, description, renderer) {
project: added all source files and assets
r1 var url = pyroutes.url(
'pullrequest_update',
{"repo_name": repo_name, "pull_request_id": pull_request_id});
var postData = {
'title': title,
'description': description,
pull-requests: make the renderer stored and saved for each pull requests....
r2903 'description_renderer': renderer,
project: added all source files and assets
r1 'edit_pull_request': true,
'csrf_token': CSRF_TOKEN
};
var success = function(o) {
window.location.reload();
};
ajaxPOST(url, postData, success);
};
/**
reviewers: added observers as another way to define reviewers....
r4500 * autocomplete handler for reviewers/observers
project: added all source files and assets
r1 */
reviewers: added observers as another way to define reviewers....
r4500 var autoCompleteHandler = function (inputId, controller, role) {
return function (element, data) {
default-reviewers: introduce new voting rule logic that allows...
r2484 var mandatory = false;
reviewers: added observers as another way to define reviewers....
r4500 var reasons = [_gettext('added manually by "{0}"').format(
templateContext.rhodecode_user.username)];
pull-request-reviewers: added option to add reviewers by picking an user group for pull requests....
r1678
default-reviewers: introduce new voting rule logic that allows...
r2484 // add whole user groups
pull-request-reviewers: added option to add reviewers by picking an user group for pull requests....
r1678 if (data.value_type == 'user_group') {
reasons.push(_gettext('member of "{0}"').format(data.value_display));
reviewers: added observers as another way to define reviewers....
r4500 $.each(data.members, function (index, member_data) {
default-reviewers: introduce new voting rule logic that allows...
r2484 var reviewer = member_data;
reviewer['user_id'] = member_data['id'];
reviewer['gravatar_link'] = member_data['icon_link'];
reviewer['user_link'] = member_data['profile_link'];
reviewer['rules'] = [];
reviewers: added observers as another way to define reviewers....
r4500 controller.addMember(reviewer, reasons, mandatory, role);
pull-request-reviewers: added option to add reviewers by picking an user group for pull requests....
r1678 })
default-reviewers: introduce new voting rule logic that allows...
r2484 }
// add single user
else {
var reviewer = data;
reviewer['user_id'] = data['id'];
reviewer['gravatar_link'] = data['icon_link'];
reviewer['user_link'] = data['profile_link'];
reviewer['rules'] = [];
reviewers: added observers as another way to define reviewers....
r4500 controller.addMember(reviewer, reasons, mandatory, role);
pull-request-reviewers: added option to add reviewers by picking an user group for pull requests....
r1678 }
reviewers: added observers as another way to define reviewers....
r4500 $(inputId).val('');
project: added all source files and assets
r1 }
reviewers: added observers as another way to define reviewers....
r4500 }
/**
* Reviewer autocomplete
*/
var ReviewerAutoComplete = function (inputId, controller) {
var self = this;
self.controller = controller;
self.inputId = inputId;
var handler = autoCompleteHandler(inputId, controller, controller.ROLE_REVIEWER);
$(inputId).autocomplete({
serviceUrl: pyroutes.url('user_autocomplete_data'),
minChars: 2,
maxHeight: 400,
deferRequestBy: 300, //miliseconds
showNoSuggestionNotice: true,
tabDisabled: true,
autoSelectFirst: true,
params: {
user_id: templateContext.rhodecode_user.user_id,
user_groups: true,
user_groups_expand: true,
skip_default_user: true
},
formatResult: autocompleteFormatResult,
lookupFilter: autocompleteFilterResult,
onSelect: handler
});
project: added all source files and assets
r1 };
pr-versioning: move version controller to dedicated PR file
r1371
reviewers: added observers as another way to define reviewers....
r4500 /**
* Observers autocomplete
*/
var ObserverAutoComplete = function(inputId, controller) {
var self = this;
self.controller = controller;
self.inputId = inputId;
var handler = autoCompleteHandler(inputId, controller, controller.ROLE_OBSERVER);
$(inputId).autocomplete({
serviceUrl: pyroutes.url('user_autocomplete_data'),
minChars: 2,
maxHeight: 400,
deferRequestBy: 300, //miliseconds
showNoSuggestionNotice: true,
tabDisabled: true,
autoSelectFirst: true,
params: {
user_id: templateContext.rhodecode_user.user_id,
user_groups: true,
user_groups_expand: true,
skip_default_user: true
},
formatResult: autocompleteFormatResult,
lookupFilter: autocompleteFilterResult,
onSelect: handler
});
}
pr-versioning: move version controller to dedicated PR file
r1371
commits/pr pages various fixes....
r4485 window.VersionController = function () {
pr-versioning: move version controller to dedicated PR file
r1371 var self = this;
this.$verSource = $('input[name=ver_source]');
this.$verTarget = $('input[name=ver_target]');
this.$showVersionDiff = $('#show-version-diff');
this.adjustRadioSelectors = function (curNode) {
var getVal = function (item) {
reviewers: added observers as another way to define reviewers....
r4500 if (item === 'latest') {
pr-versioning: move version controller to dedicated PR file
r1371 return Number.MAX_SAFE_INTEGER
}
else {
return parseInt(item)
}
};
var curVal = getVal($(curNode).val());
var cleared = false;
$.each(self.$verSource, function (index, value) {
var elVal = getVal($(value).val());
if (elVal > curVal) {
if ($(value).is(':checked')) {
cleared = true;
}
$(value).attr('disabled', 'disabled');
$(value).removeAttr('checked');
$(value).css({'opacity': 0.1});
}
else {
$(value).css({'opacity': 1});
$(value).removeAttr('disabled');
}
});
if (cleared) {
// if we unchecked an active, set the next one to same loc.
$(this.$verSource).filter('[value={0}]'.format(
curVal)).attr('checked', 'checked');
}
self.setLockAction(false,
$(curNode).data('verPos'),
$(this.$verSource).filter(':checked').data('verPos')
);
};
this.attachVersionListener = function () {
self.$verTarget.change(function (e) {
self.adjustRadioSelectors(this)
});
self.$verSource.change(function (e) {
self.adjustRadioSelectors(self.$verTarget.filter(':checked'))
});
};
this.init = function () {
var curNode = self.$verTarget.filter(':checked');
self.adjustRadioSelectors(curNode);
self.setLockAction(true);
self.attachVersionListener();
};
this.setLockAction = function (state, selectedVersion, otherVersion) {
var $showVersionDiff = this.$showVersionDiff;
if (state) {
$showVersionDiff.attr('disabled', 'disabled');
$showVersionDiff.addClass('disabled');
$showVersionDiff.html($showVersionDiff.data('labelTextLocked'));
}
else {
$showVersionDiff.removeAttr('disabled');
$showVersionDiff.removeClass('disabled');
if (selectedVersion == otherVersion) {
$showVersionDiff.html($showVersionDiff.data('labelTextShow'));
} else {
$showVersionDiff.html($showVersionDiff.data('labelTextDiff'));
}
}
};
this.showVersionDiff = function () {
var target = self.$verTarget.filter(':checked');
var source = self.$verSource.filter(':checked');
if (target.val() && source.val()) {
var params = {
'pull_request_id': templateContext.pull_request_data.pull_request_id,
'repo_name': templateContext.repo_name,
'version': target.val(),
'from_version': source.val()
};
window.location = pyroutes.url('pullrequest_show', params)
}
return false;
};
this.toggleVersionView = function (elem) {
if (this.$showVersionDiff.is(':visible')) {
$('.version-pr').hide();
this.$showVersionDiff.hide();
$(elem).html($(elem).data('toggleOn'))
} else {
$('.version-pr').show();
this.$showVersionDiff.show();
$(elem).html($(elem).data('toggleOff'))
}
return false
pull-requests: simplified the UI for pr view....
r4136 };
pull-requests: moved force refresh to update commits button....
r4101 };
commits/pr pages various fixes....
r4485 window.UpdatePrController = function () {
pull-requests: moved force refresh to update commits button....
r4101 var self = this;
this.$updateCommits = $('#update_commits');
this.$updateCommitsSwitcher = $('#update_commits_switcher');
this.lockUpdateButton = function (label) {
self.$updateCommits.attr('disabled', 'disabled');
self.$updateCommitsSwitcher.attr('disabled', 'disabled');
self.$updateCommits.addClass('disabled');
self.$updateCommitsSwitcher.addClass('disabled');
self.$updateCommits.removeClass('btn-primary');
self.$updateCommitsSwitcher.removeClass('btn-primary');
self.$updateCommits.text(_gettext(label));
};
this.isUpdateLocked = function () {
return self.$updateCommits.attr('disabled') !== undefined;
};
this.updateCommits = function (curNode) {
if (self.isUpdateLocked()) {
return
}
self.lockUpdateButton(_gettext('Updating...'));
updateCommits(
templateContext.repo_name,
templateContext.pull_request_data.pull_request_id);
};
this.forceUpdateCommits = function () {
if (self.isUpdateLocked()) {
return
}
self.lockUpdateButton(_gettext('Force updating...'));
var force = true;
updateCommits(
templateContext.repo_name,
templateContext.pull_request_data.pull_request_id, force);
};
commits/pr pages various fixes....
r4485 };
reviewers: added observers as another way to define reviewers....
r4500
commits/pr pages various fixes....
r4485 /**
* Reviewer display panel
*/
window.ReviewersPanel = {
editButton: null,
closeButton: null,
addButton: null,
removeButtons: null,
reviewRules: null,
setReviewers: null,
sidebar: few fixes for panel rendering of reviewers/observers for both commits and PRS.
r4503 controller: null,
commits/pr pages various fixes....
r4485
setSelectors: function () {
var self = this;
self.editButton = $('#open_edit_reviewers');
self.closeButton =$('#close_edit_reviewers');
self.addButton = $('#add_reviewer');
self.removeButtons = $('.reviewer_member_remove,.reviewer_member_mandatory_remove');
},
sidebar: few fixes for panel rendering of reviewers/observers for both commits and PRS.
r4503 init: function (controller, reviewRules, setReviewers) {
commits/pr pages various fixes....
r4485 var self = this;
self.setSelectors();
sidebar: few fixes for panel rendering of reviewers/observers for both commits and PRS.
r4503 self.controller = controller;
self.reviewRules = reviewRules;
self.setReviewers = setReviewers;
commits/pr pages various fixes....
r4485
sidebar: few fixes for panel rendering of reviewers/observers for both commits and PRS.
r4503 self.editButton.on('click', function (e) {
commits/pr pages various fixes....
r4485 self.edit();
});
sidebar: few fixes for panel rendering of reviewers/observers for both commits and PRS.
r4503 self.closeButton.on('click', function (e) {
commits/pr pages various fixes....
r4485 self.close();
self.renderReviewers();
});
self.renderReviewers();
},
renderReviewers: function () {
sidebar: few fixes for panel rendering of reviewers/observers for both commits and PRS.
r4503 var self = this;
if (self.setReviewers.reviewers === undefined) {
reviewers: added observers as another way to define reviewers....
r4500 return
}
sidebar: few fixes for panel rendering of reviewers/observers for both commits and PRS.
r4503 if (self.setReviewers.reviewers.length === 0) {
self.controller.emptyReviewersTable('<tr id="reviewer-empty-msg"><td colspan="6">No reviewers</td></tr>');
reviewers: added observers as another way to define reviewers....
r4500 return
}
commits/pr pages various fixes....
r4485
sidebar: few fixes for panel rendering of reviewers/observers for both commits and PRS.
r4503 self.controller.emptyReviewersTable();
reviewers: added observers as another way to define reviewers....
r4500
sidebar: few fixes for panel rendering of reviewers/observers for both commits and PRS.
r4503 $.each(self.setReviewers.reviewers, function (key, val) {
commits/pr pages various fixes....
r4485
reviewers: added observers as another way to define reviewers....
r4500 var member = val;
sidebar: few fixes for panel rendering of reviewers/observers for both commits and PRS.
r4503 if (member.role === self.controller.ROLE_REVIEWER) {
reviewers: added observers as another way to define reviewers....
r4500 var entry = renderTemplate('reviewMemberEntry', {
'member': member,
'mandatory': member.mandatory,
'role': member.role,
'reasons': member.reasons,
'allowed_to_update': member.allowed_to_update,
'review_status': member.review_status,
'review_status_label': member.review_status_label,
'user_group': member.user_group,
diffs: added scroll down/scroll up helper. Fixes #5643
r4595 'create': false,
'rhodecode_user': templateContext.rhodecode_user
reviewers: added observers as another way to define reviewers....
r4500 });
commits/pr pages various fixes....
r4485
sidebar: few fixes for panel rendering of reviewers/observers for both commits and PRS.
r4503 $(self.controller.$reviewMembers.selector).append(entry)
reviewers: added observers as another way to define reviewers....
r4500 }
commits/pr pages various fixes....
r4485 });
reviewers: added observers as another way to define reviewers....
r4500
commits/pr pages various fixes....
r4485 tooltipActivate();
},
edit: function (event) {
sidebar: few fixes for panel rendering of reviewers/observers for both commits and PRS.
r4503 var self = this;
self.editButton.hide();
self.closeButton.show();
self.addButton.show();
$(self.removeButtons.selector).css('visibility', 'visible');
commits/pr pages various fixes....
r4485 // review rules
sidebar: few fixes for panel rendering of reviewers/observers for both commits and PRS.
r4503 self.controller.loadReviewRules(this.reviewRules);
commits/pr pages various fixes....
r4485 },
close: function (event) {
sidebar: few fixes for panel rendering of reviewers/observers for both commits and PRS.
r4503 var self = this;
commits/pr pages various fixes....
r4485 this.editButton.show();
this.closeButton.hide();
this.addButton.hide();
$(this.removeButtons.selector).css('visibility', 'hidden');
// hide review rules
sidebar: few fixes for panel rendering of reviewers/observers for both commits and PRS.
r4503 self.controller.hideReviewRules();
commits/pr pages various fixes....
r4485 }
};
reviewers: added observers as another way to define reviewers....
r4500 /**
* Reviewer display panel
*/
window.ObserversPanel = {
editButton: null,
closeButton: null,
addButton: null,
removeButtons: null,
reviewRules: null,
setReviewers: null,
sidebar: few fixes for panel rendering of reviewers/observers for both commits and PRS.
r4503 controller: null,
reviewers: added observers as another way to define reviewers....
r4500
setSelectors: function () {
var self = this;
self.editButton = $('#open_edit_observers');
self.closeButton =$('#close_edit_observers');
self.addButton = $('#add_observer');
self.removeButtons = $('.observer_member_remove,.observer_member_mandatory_remove');
},
sidebar: few fixes for panel rendering of reviewers/observers for both commits and PRS.
r4503 init: function (controller, reviewRules, setReviewers) {
reviewers: added observers as another way to define reviewers....
r4500 var self = this;
self.setSelectors();
sidebar: few fixes for panel rendering of reviewers/observers for both commits and PRS.
r4503 self.controller = controller;
self.reviewRules = reviewRules;
self.setReviewers = setReviewers;
reviewers: added observers as another way to define reviewers....
r4500
sidebar: few fixes for panel rendering of reviewers/observers for both commits and PRS.
r4503 self.editButton.on('click', function (e) {
reviewers: added observers as another way to define reviewers....
r4500 self.edit();
});
sidebar: few fixes for panel rendering of reviewers/observers for both commits and PRS.
r4503 self.closeButton.on('click', function (e) {
reviewers: added observers as another way to define reviewers....
r4500 self.close();
self.renderObservers();
});
self.renderObservers();
},
renderObservers: function () {
sidebar: few fixes for panel rendering of reviewers/observers for both commits and PRS.
r4503 var self = this;
if (self.setReviewers.observers === undefined) {
reviewers: added observers as another way to define reviewers....
r4500 return
}
sidebar: few fixes for panel rendering of reviewers/observers for both commits and PRS.
r4503 if (self.setReviewers.observers.length === 0) {
self.controller.emptyObserversTable('<tr id="observer-empty-msg"><td colspan="6">No observers</td></tr>');
reviewers: added observers as another way to define reviewers....
r4500 return
}
sidebar: few fixes for panel rendering of reviewers/observers for both commits and PRS.
r4503 self.controller.emptyObserversTable();
reviewers: added observers as another way to define reviewers....
r4500
sidebar: few fixes for panel rendering of reviewers/observers for both commits and PRS.
r4503 $.each(self.setReviewers.observers, function (key, val) {
reviewers: added observers as another way to define reviewers....
r4500 var member = val;
sidebar: few fixes for panel rendering of reviewers/observers for both commits and PRS.
r4503 if (member.role === self.controller.ROLE_OBSERVER) {
reviewers: added observers as another way to define reviewers....
r4500 var entry = renderTemplate('reviewMemberEntry', {
'member': member,
'mandatory': member.mandatory,
'role': member.role,
'reasons': member.reasons,
'allowed_to_update': member.allowed_to_update,
'review_status': member.review_status,
'review_status_label': member.review_status_label,
'user_group': member.user_group,
diffs: added scroll down/scroll up helper. Fixes #5643
r4595 'create': false,
'rhodecode_user': templateContext.rhodecode_user
reviewers: added observers as another way to define reviewers....
r4500 });
sidebar: few fixes for panel rendering of reviewers/observers for both commits and PRS.
r4503 $(self.controller.$observerMembers.selector).append(entry)
reviewers: added observers as another way to define reviewers....
r4500 }
});
tooltipActivate();
},
edit: function (event) {
this.editButton.hide();
this.closeButton.show();
this.addButton.show();
$(this.removeButtons.selector).css('visibility', 'visible');
},
close: function (event) {
this.editButton.show();
this.closeButton.hide();
this.addButton.hide();
$(this.removeButtons.selector).css('visibility', 'hidden');
}
};
window.PRDetails = {
editButton: null,
closeButton: null,
deleteButton: null,
viewFields: null,
editFields: null,
setSelectors: function () {
var self = this;
self.editButton = $('#open_edit_pullrequest')
self.closeButton = $('#close_edit_pullrequest')
self.deleteButton = $('#delete_pullrequest')
self.viewFields = $('#pr-desc, #pr-title')
self.editFields = $('#pr-desc-edit, #pr-title-edit, .pr-save')
},
init: function () {
var self = this;
self.setSelectors();
self.editButton.on('click', function (e) {
self.edit();
});
self.closeButton.on('click', function (e) {
self.view();
});
},
edit: function (event) {
var cmInstance = $('#pr-description-input').get(0).MarkupForm.cm;
this.viewFields.hide();
this.editButton.hide();
this.deleteButton.hide();
this.closeButton.show();
this.editFields.show();
cmInstance.refresh();
},
view: function (event) {
this.editButton.show();
this.deleteButton.show();
this.editFields.hide();
this.closeButton.hide();
this.viewFields.show();
}
};
commits/pr pages various fixes....
r4485
/**
* OnLine presence using channelstream
*/
window.ReviewerPresenceController = function (channel) {
var self = this;
this.channel = channel;
this.users = {};
this.storeUsers = function (users) {
self.users = {}
$.each(users, function (index, value) {
var userId = value.state.id;
self.users[userId] = value.state;
})
}
this.render = function () {
$.each($('.reviewer_entry'), function (index, value) {
var userData = $(value).data();
if (self.users[userData.reviewerUserId] !== undefined) {
$(value).find('.presence-state').show();
} else {
$(value).find('.presence-state').hide();
}
})
};
this.handlePresence = function (data) {
if (data.type == 'presence' && data.channel === self.channel) {
this.storeUsers(data.users);
drafts: draft finize boilerplate
r4549 this.render();
commits/pr pages various fixes....
r4485 }
};
this.handleChannelUpdate = function (data) {
if (data.channel === this.channel) {
this.storeUsers(data.state.users);
drafts: draft finize boilerplate
r4549 this.render();
commits/pr pages various fixes....
r4485 }
};
/* subscribe to the current presence */
$.Topic('/connection_controller/presence').subscribe(this.handlePresence.bind(this));
/* subscribe to updates e.g connect/disconnect */
$.Topic('/connection_controller/channel_update').subscribe(this.handleChannelUpdate.bind(this));
};
drafts: sidebar functionality
r4562 window.refreshCommentsSuccess = function(targetNode, counterNode, extraCallback) {
var $targetElem = targetNode;
var $counterElem = counterNode;
return function (data) {
var newCount = $(data).data('counter');
if (newCount !== undefined) {
var callback = function () {
$counterElem.animate({'opacity': 1.00}, 200)
$counterElem.html(newCount);
};
$counterElem.animate({'opacity': 0.15}, 200, callback);
}
$targetElem.css('opacity', 1);
$targetElem.html(data);
tooltipActivate();
if (extraCallback !== undefined) {
extraCallback(data)
}
}
}
commits/pr pages various fixes....
r4485 window.refreshComments = function (version) {
version = version || templateContext.pull_request_data.pull_request_version || '';
// Pull request case
if (templateContext.pull_request_data.pull_request_id !== null) {
var params = {
'pull_request_id': templateContext.pull_request_data.pull_request_id,
'repo_name': templateContext.repo_name,
'version': version,
};
var loadUrl = pyroutes.url('pullrequest_comments', params);
} // commit case
else {
return
}
var currentIDs = []
$.each($('.comment'), function (idx, element) {
currentIDs.push($(element).data('commentId'));
});
reviewers: added observers as another way to define reviewers....
r4500 var data = {"comments": currentIDs};
commits/pr pages various fixes....
r4485
var $targetElem = $('.comments-content-table');
$targetElem.css('opacity', 0.3);
drafts: sidebar functionality
r4562 var $counterElem = $('#comments-count');
var success = refreshCommentsSuccess($targetElem, $counterElem);
reviewers: added observers as another way to define reviewers....
r4500 ajaxPOST(loadUrl, data, success, null, {})
commits/pr pages various fixes....
r4485 }
window.refreshTODOs = function (version) {
version = version || templateContext.pull_request_data.pull_request_version || '';
// Pull request case
if (templateContext.pull_request_data.pull_request_id !== null) {
var params = {
'pull_request_id': templateContext.pull_request_data.pull_request_id,
'repo_name': templateContext.repo_name,
'version': version,
};
sidebar: fixed refresh of TODOs url.
r4539 var loadUrl = pyroutes.url('pullrequest_todos', params);
commits/pr pages various fixes....
r4485 } // commit case
else {
return
}
var currentIDs = []
$.each($('.comment'), function (idx, element) {
currentIDs.push($(element).data('commentId'));
});
reviewers: added observers as another way to define reviewers....
r4500 var data = {"comments": currentIDs};
commits/pr pages various fixes....
r4485 var $targetElem = $('.todos-content-table');
$targetElem.css('opacity', 0.3);
drafts: sidebar functionality
r4562 var $counterElem = $('#todos-count');
var success = refreshCommentsSuccess($targetElem, $counterElem);
reviewers: added observers as another way to define reviewers....
r4500
ajaxPOST(loadUrl, data, success, null, {})
commits/pr pages various fixes....
r4485 }
drafts: sidebar functionality
r4562 window.refreshDraftComments = function () {
// Pull request case
if (templateContext.pull_request_data.pull_request_id !== null) {
var params = {
'pull_request_id': templateContext.pull_request_data.pull_request_id,
'repo_name': templateContext.repo_name,
};
var loadUrl = pyroutes.url('pullrequest_drafts', params);
} // commit case
else {
return
}
var data = {};
var $targetElem = $('.drafts-content-table');
$targetElem.css('opacity', 0.3);
var $counterElem = $('#drafts-count');
var extraCallback = function(data) {
if ($(data).data('counter') == 0){
$('#draftsTable').hide();
} else {
$('#draftsTable').show();
}
// uncheck on load the select all checkbox
$('[name=select_all_drafts]').prop('checked', 0);
}
var success = refreshCommentsSuccess($targetElem, $counterElem, extraCallback);
ajaxPOST(loadUrl, data, success, null, {})
};
commits/pr pages various fixes....
r4485 window.refreshAllComments = function (version) {
version = version || templateContext.pull_request_data.pull_request_version || '';
refreshComments(version);
refreshTODOs(version);
};
reviewers: added observers as another way to define reviewers....
r4500
window.sidebarComment = function (commentId) {
var jsonData = $('#commentHovercard{0}'.format(commentId)).data('commentJsonB64');
if (!jsonData) {
return 'Failed to load comment {0}'.format(commentId)
}
var funcData = JSON.parse(atob(jsonData));
return renderTemplate('sideBarCommentHovercard', funcData)
};