static/js/codebase-validation.js (638 lines of code) (raw):
$(function () {
$(document).ready(function () {
$('#versioningType').change(function () {
checkVersioningType($(this).val())
});
});
let REGEX = {
CAPACITY: /\w/,
SERVICE_PATH: /^\/.*$/,
SERVICE_NAME: /^$|^[a-z][a-z0-9-]*[a-z0-9]$/,
VCS_LOGIN: /\w/,
VCS_PASSWORD: /\w/,
DESCRIPTION: /^[a-zA-Z0-9]/,
CODEBASE_NAME: /^[a-z][a-z0-9-]*[a-z0-9]$/,
CODEBASE_DEFAULT_BRANCH: /^[a-z0-9][a-z0-9]*[\/-]?[a-z0-9]*[a-z0-9]$/,
REPO_LOGIN: /\w/,
REPO_PASSWORD: /\w/,
REPO_URL: /(?:^git|^ssh|^https?|^git@[-\w.]+):(\/\/)?(.*?)(\.git)(\/?|\#[-\d\w._]+?)$/,
RELATIVE_PATH: /^\/.*$/
};
let DEPLOYMENT_SCRIPT = {
OPENSHIFT_TEMPLATE: "openshift-template",
HELM_CHART: "helm-chart"
};
let INTEGRATION_STRATEGIES = {
CREATE: 'create',
CLONE: 'clone',
IMPORT: 'import'
};
$('.tooltip-icon').add('[data-toggle="tooltip"]').tooltip();
!function () {
let $deployScriptEl = $('.deploymentScript');
if ($('.advanced-settings-block').data('openshift')) {
$deployScriptEl.val(DEPLOYMENT_SCRIPT.OPENSHIFT_TEMPLATE);
return;
}
$deployScriptEl.val(DEPLOYMENT_SCRIPT.HELM_CHART);
}();
!function () {
$('.form-group .js-form-subsection select:not(.jenkinsSlave)').attr('disabled', true);
$('.multi-module').addClass('hide-element');
$('#multiModule').attr("disabled", true);
}();
!function () {
$.each($('.route, .dataBase .card-body').find('input, select'), function () {
if ($(this).is('input')) {
$(this).attr('readonly', true);
} else if ($(this).is('select')) {
$(this).attr('disabled', true);
}
});
}();
!function () {
if ($('.db-block').length !== 0) {
_sendGetRequest(true, `${$('input[id="basepath"]').val()}/api/v1/storage-class`,
function (storageClasses) {
var $select = $('#dbPersistentStorage');
$.each(storageClasses, function () {
$select.append('<option value="' + this.toString() + '">' + this.toString() + '</option>');
});
}, function (resp) {
console.log(resp);
})
}
}();
$('#jiraServerToggle').change(function () {
let $jiraEl = $('.jiraServerBlock'),
$commitMessagePatternBlockEl = $('.commitMessagePatternBlock'),
$ticketNamePatternBlockEl = $('.ticketNamePatternBlock');
if ($(this).is(':checked')) {
$jiraEl.removeClass('hide-element')
.find('select[name="jiraServer"]')
.prop('disabled', false);
$commitMessagePatternBlockEl.removeClass('hide-element')
.find('input[id="commitMessagePattern"]')
.prop('disabled', false);
$ticketNamePatternBlockEl.removeClass('hide-element')
.find('input[id="ticketNamePattern"]')
.prop('disabled', false);
return;
}
$jiraEl.addClass('hide-element')
.find('select[name="jiraServer"]')
.prop('disabled', true);
$commitMessagePatternBlockEl.addClass('hide-element')
.find('input[id="commitMessagePattern"]')
.prop('disabled', true);
$ticketNamePatternBlockEl.addClass('hide-element')
.find('input[id="ticketNamePattern"]')
.prop('disabled', true);
});
function activateCloneBlock() {
$('.other-language').removeClass('button-disable');
$('.main-block').data('import-strategy', false);
$('.app-name').removeClass('hide-element');
$('.gitServerEl').addClass('hide-element');
$('.gitRelativePathEl').addClass('hide-element');
$('.repo-url').add($('.private-repo')).removeClass('hide-element');
if ($('#isRepoPrivate').is(':checked')) {
$('.repoLogin').add($('.repoPassword')).removeClass('hide-element');
}
}
function activateCreateBlock() {
$('.other-language').addClass('button-disable');
$('.main-block').data('import-strategy', false);
$('.app-name').removeClass('hide-element');
$('.gitServerEl').addClass('hide-element');
$('.gitRelativePathEl').addClass('hide-element');
$('.repo-url').add($('.private-repo')).addClass('hide-element');
$('.repoLogin').add($('.repoPassword')).addClass('hide-element');
}
function activateImportBlock() {
$('.other-language').removeClass('button-disable');
$('.main-block').data('import-strategy', true);
$('.gitServerEl').removeClass('hide-element');
$('.gitRelativePathEl').removeClass('hide-element');
$('.repo-url').add($('.private-repo')).addClass('hide-element');
$('.repoLogin').add($('.repoPassword')).addClass('hide-element');
}
function toggleStrategy(strategy) {
if (strategy === INTEGRATION_STRATEGIES.CLONE) {
activateCloneBlock();
} else if (strategy === INTEGRATION_STRATEGIES.CREATE) {
activateCreateBlock();
} else {
activateImportBlock();
}
}
!function () {
let strategy = $('#strategy').val().toLowerCase();
toggleStrategy(strategy);
toggleCiToolView(strategy);
}();
function checkVersioningType(value) {
let $startVersioningFromEl = $('.start-versioning-from');
if (value === 'default') {
$('.form-group.startVersioningFrom').addClass('hide-element');
$('#startVersioningFrom').attr("disabled", true).removeAttr("value", "0.0.0");
resetErrors($startVersioningFromEl);
} else {
$('.form-group.startVersioningFrom').removeClass('hide-element');
$('#startVersioningFrom').attr("disabled", false).attr("value", "0.0.0");
resetErrors($startVersioningFromEl);
}
}
$('#versioningType').change(function () {
checkVersioningType($(this).val())
});
$('#languageSelection').on('change', function (e) {
$('.frameworkError').hide();
if ($(this).find('input:checked').val() === "Java") {
$('#framework-java8').prop('checked', true);
}
$('#framework-other').prop('disabled', !($(this).find('input:checked').val() === "other"));
$('.js-form-subsection, .appLangError').hide();
let langDivEl = $($(e.target).data('target'));
langDivEl.show();
$('.js-form-subsection input[name="framework"]').prop('checked', false);
$('.multi-module').addClass('hide-element');
$('#multiModule').attr("disabled", true);
$('.main-block').data('code-language', $(e.target).data('target').replace('.formSubsection-', ''));
$.each($('.build-tool .js-form-subsection, .jenkinsSlave .js-form-subsection'), function () {
if ($(this).hasClass($(e.target).data('target').substring(1))) {
$(this).show();
$(this).find('select').attr('disabled', false);
$(this).find('select.buildTool').val($(this).find('select.buildTool option:first').val());
} else {
$(this).find('select').attr('disabled', true);
}
});
let codebaseVal = $('.card.main-block').data('codebase-type');
if (codebaseVal === 'application' || codebaseVal === 'library') {
$('.java-build-tools').val('Gradle');
} else {
$('.java-build-tools').val('Maven');
}
$('.test-report-framework').val('allure');
setJenkinsSlave($('.buildTool:enabled'));
});
$('.formSubsection-java .java-frameworks').change(function () {
setJenkinsSlave($('.buildTool:enabled'));
});
$('.formSubsection-dotnet .form__input-wrapper').change(function () {
setJenkinsSlave($('.buildTool:enabled'));
});
$('#isRepoPrivate').change(function () {
let $login = $('.repoLogin'),
$pass = $('.repoPassword');
if ($(this).is(':checked')) {
$login.add($pass).removeClass('hide-element');
} else {
$login.add($pass).addClass('hide-element');
$login.add($pass).find('.invalid-feedback').hide();
$login.add($pass).find('input').removeClass('is-invalid');
}
});
$('#strategy').change(function () {
toggleStrategy(this.value.toLowerCase());
toggleCiToolView(this.value.toLowerCase());
$('div.jenkins-slave').removeClass('hide-element')
.find('select[name="jenkinsSlave"]');
$('div.ci-provision').removeClass('hide-element')
.find('select[name="jobProvisioning"]');
let $jiraEl = $('#jiraServerToggle'),
$jiraDivEl = $('div.jiraServerToggle');
if ($jiraEl.is(':checked')) {
$jiraEl.click();
}
$jiraDivEl.removeClass('hide-element');
$('div.jenkins-slave')
.find('select[name="jenkinsSlave"]')
.attr('disabled', false);
$('div.ci-provision')
.find('select[name="jobProvisioning"]')
.attr('disabled', false);
$jiraEl.attr('disabled', false);
});
function toggleCiToolView(strategy) {
let $ciEl = $('div.ciTools');
if (INTEGRATION_STRATEGIES.IMPORT === strategy.toLowerCase()) {
$ciEl.removeClass('hide-element')
.find('select[name="ciTool"]');
return
}
$ciEl.addClass('hide-element')
.find('select[name="ciTool"]')
.val('Jenkins');
}
$('select.ciTool').change(function () {
toggleJenkinsSlaveView($(this).val());
toggleCiProvisionView($(this).val());
toggleJiraIntegrationView($(this).val());
});
function toggleJenkinsSlaveView(ciTool) {
let $jsEl = $('div.jenkins-slave');
if (ciTool === "GitLab CI") {
$jsEl.addClass('hide-element')
.find('select[name="jenkinsSlave"]')
.attr('disabled', true);
return
}
$jsEl.removeClass('hide-element')
.find('select[name="jenkinsSlave"]')
.attr('disabled', false);
}
function toggleCiProvisionView(ciTool) {
let $pEl = $('div.ci-provision');
if (ciTool === "GitLab CI") {
$pEl.addClass('hide-element')
.find('select[name="jobProvisioning"]')
.attr('disabled', true);
return
}
$pEl.removeClass('hide-element')
.find('select[name="jobProvisioning"]')
.attr('disabled', false);
}
function toggleJiraIntegrationView(ciTool) {
let $jiraEl = $('#jiraServerToggle'),
$jiraDivEl = $('div.jiraServerToggle');
if (ciTool === "GitLab CI") {
if ($jiraEl.is(':checked')) {
$jiraEl.click();
}
$jiraDivEl.addClass('hide-element');
$jiraEl.attr('disabled', true);
return
}
$jiraDivEl.removeClass('hide-element');
$jiraEl.attr('disabled', false);
}
$('#btn-modal-continue').click(function () {
$('form.edp-form').submit();
$('#confirmationPopup').modal('hide');
$(".window-table-body").remove();
});
$("#btn-cross-close, #btn-modal-close").click(function () {
$(".window-table-body").remove();
});
$('#needRoute').change(function () {
let $exposeServiceBlockEl = $('.route-block'),
$inputsEl = $exposeServiceBlockEl.find('input');
if ($(this).is(":checked")) {
$inputsEl.attr('readonly', false);
} else {
$inputsEl.attr('readonly', true);
}
$inputsEl.removeClass('is-invalid').next('.invalid-feedback').hide();
});
$('#needDb').change(function () {
let $dbBlockEl = $('.db-block'),
$inputsEl = $dbBlockEl.find('input'),
$selectsEl = $dbBlockEl.find('select');
if ($(this).is(":checked")) {
$inputsEl.attr('readonly', false);
$selectsEl.attr('disabled', false);
} else {
$inputsEl.attr('readonly', true);
$selectsEl.attr('disabled', true);
}
$('.capacity-error.invalid-feedback').hide();
$inputsEl.removeClass('is-invalid');
});
$('.codebase-info-button').click(function (event) {
validateCodebaseInfo(event);
});
$('.application-submit,.autotest-submit,.library-submit').click(function (event) {
validateMainInfo(event);
validateAdvancedInfo(event);
});
$('.advanced-settings-submit').click(function (event) {
validateMainInfo(event);
validateAdvancedInfo(event);
});
$('.vcs-submit,.create-library,.create-autotest').click(function (event) {
if ($(this).hasClass('create-autotest') || $(this).hasClass('create-library')) {
event.preventDefault();
let canCreateAutotest = validateCodebaseInfo(event) & validateMainInfo(event) & validateVCSInfo(event) & validateAdvancedInfo(event);
if (canCreateAutotest) {
createConfirmTable($(this).hasClass('create-autotest') ? '#createAutotest' : '#createLibrary');
$('#confirmationPopup').modal('show');
}
} else {
validateVCSInfo(event);
}
});
$('.route-submit').click(function (event) {
validateRouteInfo(event);
});
$('.db-submit').click(function (event) {
let canCreateApplication = validateCodebaseInfo(event) &
validateMainInfo(event) & validateVCSInfo(event) &
validateRouteInfo(event) & validateDbInfo(event) & validateAdvancedInfo(event);
if (canCreateApplication) {
createConfirmTable('#createAppForm');
$('#confirmationPopup').modal('show');
}
});
$('.java-build-tools,.js-build-tools,.dotnet-build-tools,.groovy-pipeline-build-tools,.other-build-tools').change(function () {
if (this.value === 'Maven') {
$('#multiModule').attr("disabled", false);
$('.multi-module').removeClass('hide-element');
} else {
$('.multi-module').addClass('hide-element');
$('#multiModule').attr("disabled", true);
}
setJenkinsSlave($(this));
});
$('#startVersioningFrom').focusout(function () {
let branchVersion = $('#startVersioningFrom');
handleBranchVersionValidation(branchVersion);
});
$('#gitRelativePath').focusout(function () {
if (!isFieldValid($(this), REGEX.RELATIVE_PATH)) {
return;
}
$('#appName').val($(this).val().match(/([^\/]*)\/*$/)[1]);
});
function setJenkinsSlave(el) {
let $slave = getSlaveElement(el);
if ($slave.length) {
$slave.prop({selected: true});
return;
}
$('.jenkinsSlave').val($('.jenkinsSlave option:first').val());
}
function getSlaveElement(el) {
let $frameworkVersion = $('input[name="framework"]:checked').val();
if (!!$frameworkVersion) {
return $(`.jenkinsSlave option:contains(${el.find(':selected').data('build-tool') + "-" + $frameworkVersion})`);
}
return $(`.jenkinsSlave option:contains(${el.find(':selected').data('build-tool')})`);
}
function validateCodebaseInfo(event) {
let $codebaseBlockEl = $('.codebase-block');
resetErrors($codebaseBlockEl);
let isValid = isCodebaseInfoValid();
if (!isValid) {
event.stopPropagation();
blockIsNotValid($codebaseBlockEl);
return isValid;
}
blockIsValid($codebaseBlockEl);
return isValid;
}
function validateMainInfo(event) {
let $mainBlockEl = $('.main-block');
resetErrors($mainBlockEl);
let isValid = isMainInfoValid();
if (!isValid) {
event.stopPropagation();
blockIsNotValid($mainBlockEl);
return isValid;
}
blockIsValid($mainBlockEl);
return isValid;
}
function validateAdvancedInfo(event) {
let $advancedBlockEl = $('.advanced-settings-block');
resetErrors($advancedBlockEl);
let isValid = isAdvancedInfoValid();
if (!isValid) {
event.stopPropagation();
blockIsNotValid($advancedBlockEl);
return isValid;
}
blockIsValid($advancedBlockEl);
return isValid;
}
function validateVCSInfo(event) {
let $vcsBlockEl = $('.vcs-block');
resetErrors($vcsBlockEl);
let isValid = $vcsBlockEl.length === 0 ? true : isVCSValid();
if (!isValid) {
event.stopPropagation();
blockIsNotValid($vcsBlockEl);
return isValid;
}
blockIsValid($vcsBlockEl);
return isValid;
}
function validateRouteInfo(event) {
let $exposeServiceBlockEl = $('.route-block');
resetErrors($exposeServiceBlockEl);
let isValid = isExposingServiceInfoValid();
if (!isValid) {
event.stopPropagation();
blockIsNotValid($exposeServiceBlockEl);
return isValid;
}
blockIsValid($exposeServiceBlockEl);
return isValid;
}
function validateDbInfo(event) {
let $dbBlockEl = $('.db-block');
resetErrors($dbBlockEl);
let isValid = isDatabaseValid();
if (!isValid) {
event.stopPropagation();
blockIsNotValid($dbBlockEl);
return isValid;
}
blockIsValid($dbBlockEl);
return isValid;
}
function resetErrors($el) {
$el.find('input.is-invalid').removeClass('is-invalid');
$el.find('.invalid-feedback').hide();
}
function isCodebaseInfoValid() {
let isValid = true;
let $codebaseBlockEl = $('.codebase-block'),
$strategyEl = $codebaseBlockEl.find('#strategy');
if ($strategyEl.length === 0 || $strategyEl.val().toLowerCase() === 'clone') {
let $repoUrl = $('#gitRepoUrl'),
isRepoUrlValid = isFieldValid($repoUrl, REGEX.REPO_URL),
$repoMsg = $repoUrl.next('.invalid-feedback');
if (isRepoUrlValid) {
let $gitRepoMsg = $('.git-repo-error');
let creds = {
url: $repoUrl.val()
};
let isRepoPrivate = $('#isRepoPrivate').is(':checked'),
$repoLogin = $('#repoLogin'),
$repoPassword = $('#repoPassword');
if (isRepoPrivate) {
let isLoginValid = isFieldValid($repoLogin, REGEX.REPO_LOGIN);
if (!isLoginValid) {
$repoLogin.next('.invalid-feedback').show();
$repoLogin.addClass('is-invalid');
isValid = false;
}
let isPasswordValid = isFieldValid($repoPassword, REGEX.REPO_PASSWORD);
if (!isPasswordValid) {
$repoPassword.next('.invalid-feedback').show();
$repoPassword.addClass('is-invalid');
isValid = false;
}
if (isLoginValid && isPasswordValid) {
creds.login = $repoLogin.val();
creds.password = $repoPassword.val();
}
}
_sendPostRequest.bind(this)(false, `${$('input[id="basepath"]').val()}/api/v1/repository/available`, creds, $('input[name="_xsrf"]').val(),
function (isAvailable) {
if (isRepoPrivate) {
if (isAvailable) {
isValid = true;
} else {
$('.git-creds').show();
$repoUrl.addClass('is-invalid');
$repoLogin.addClass('is-invalid');
$repoPassword.addClass('is-invalid');
isValid = false;
}
} else {
if (isAvailable) {
isValid = true;
} else {
$gitRepoMsg.show();
$repoUrl.addClass('is-invalid');
isValid = false;
}
}
}, function () {
console.log('an error has occurred while checking repository accessibility')
});
} else {
isValid = false;
$repoMsg.show();
$repoUrl.addClass('is-invalid');
}
} else if ($strategyEl.val().toLowerCase() === 'import') {
let $gitRelativePath = $('#gitRelativePath'),
isGitRelativePathValid = isFieldValid($gitRelativePath, REGEX.RELATIVE_PATH),
$errMsg = $gitRelativePath.next('.invalid-feedback');
if (!isGitRelativePathValid) {
isValid = false;
$errMsg.show();
$gitRelativePath.addClass('is-invalid');
}
}
return isValid;
}
function isMainInfoValid() {
let $codebaseEl = $('.main-block'),
$codebaseInputEl = $('.codebase-name'),
isCodebaseNameValid = true,
importStrategy = !!$codebaseEl.data('import-strategy');
if (!importStrategy) {
isCodebaseNameValid = isFieldValid($codebaseInputEl, REGEX.CODEBASE_NAME);
if (!isCodebaseNameValid) {
$('.codebase-name-validation.regex-error').show();
$codebaseInputEl.addClass('is-invalid');
}
}
let $defaultBranchInputEl = $('.default-branch-name'),
isDefaultBranchNameValid = isFieldValid($defaultBranchInputEl, REGEX.CODEBASE_DEFAULT_BRANCH);
if (!isDefaultBranchNameValid) {
$('.default-branch-name-validation.regex-error').show();
$defaultBranchInputEl.addClass('is-invalid');
}
let $descriptionInputEl = $('#description'),
$descriptionErrEl = $('.description-validation.regex-error'),
isDescriptionValid = $descriptionInputEl.length === 0 ? true : isFieldValid($descriptionInputEl, REGEX.DESCRIPTION);
if (!isDescriptionValid) {
$descriptionErrEl.show();
$descriptionInputEl.addClass('is-invalid');
}
let isLanguageChosen = $codebaseEl.find('.language input').is(':checked'),
isFrameworkChosen = true;
if (isLanguageChosen) {
let language = $('.main-block').data('code-language');
if (language !== "other") {
let $frameworksEl = $codebaseEl.find(`.form__input-wrapper .formSubsection-${language} input`);
isFrameworkChosen = $frameworksEl.length === 0 ? true : $frameworksEl.is(":checked");
if (!isFrameworkChosen) {
$('.frameworkError').show();
}
}
} else {
$('.appLangError').show();
}
return isCodebaseNameValid && isDefaultBranchNameValid && isDescriptionValid && isLanguageChosen && isFrameworkChosen;
}
function isAdvancedInfoValid() {
let $advancedSettingsEl = $('.advanced-settings-block'),
$versioningInputEl = $('.start-versioning-from'),
isStartVersioningFromValid = true,
jiraIntegration = $('#jiraServerToggle').is(':checked'),
isCommitMessageRegexValid = jiraIntegration ? $('#commitMessagePattern').val().length !== 0 : true,
isTicketNameRegexValid = jiraIntegration ? $('#ticketNamePattern').val().length !== 0 : true;
if ($('#versioningType').val() === "edp") {
isStartVersioningFromValid = isBranchVersionValid($versioningInputEl)
}
if (!isStartVersioningFromValid) {
$('.invalid-feedback.startVersioningFrom').show();
$advancedSettingsEl.addClass('is-invalid');
}
if (!isCommitMessageRegexValid) {
$('.invalid-feedback.commitMessagePattern').show();
$('#commitMessagePattern').addClass('is-invalid');
}
if (!isTicketNameRegexValid) {
$('.invalid-feedback.ticketNamePattern').show();
$('#ticketNamePattern').addClass('is-invalid');
}
return isStartVersioningFromValid && isCommitMessageRegexValid && isTicketNameRegexValid
}
function isVCSValid() {
let $vcsLoginInputEl = $('#vcsLogin'),
isVcsLoginValid = isFieldValid($vcsLoginInputEl, REGEX.VCS_LOGIN);
if (!isVcsLoginValid) {
$('.invalid-feedback.vcs-login-validation').show();
$vcsLoginInputEl.addClass('is-invalid');
}
let $vcsPasswordInputEl = $('#vcsPassword'),
isVcsPasswordValid = isFieldValid($vcsPasswordInputEl, REGEX.VCS_PASSWORD);
if (!isVcsPasswordValid) {
$('.invalid-feedback.vcs-password-validation').show();
$vcsPasswordInputEl.addClass('is-invalid');
}
return isVcsLoginValid && isVcsPasswordValid;
}
function isExposingServiceInfoValid() {
let needRoute = $('#needRoute').is(':checked');
if (needRoute) {
let $serviceNameInputEl = $('#routeSite'),
isServiceNameValid = isCodebaseSiteFieldValid($serviceNameInputEl, REGEX.SERVICE_NAME);
if (!isServiceNameValid) {
$('.route-site.invalid-feedback').show();
$serviceNameInputEl.addClass('is-invalid');
}
let $servicePathInputEl = $('#routePath'),
isServicePathValid = isFieldValid($servicePathInputEl, REGEX.SERVICE_PATH);
if (!isServicePathValid) {
$('.route-path.invalid-feedback').show();
$servicePathInputEl.addClass('is-invalid');
}
return isServiceNameValid && isServicePathValid;
}
return true;
}
function isDatabaseValid() {
let needDb = $('#needDb').is(':checked');
if (needDb) {
let $capacityInputEl = $('#dbCapacity'),
isCapacityValid = isFieldValid($capacityInputEl, REGEX.CAPACITY);
if (!isCapacityValid) {
$('.capacity-error.invalid-feedback').show();
$capacityInputEl.addClass('is-invalid');
}
return isCapacityValid;
}
return true;
}
})
;