mirror of
https://github.com/ansible/awx.git
synced 2026-03-13 23:17:32 -02:30
Merge pull request #244 from jaredevantabor/license-work
demodalizing the license modal
This commit is contained in:
@@ -43,6 +43,7 @@ import browserData from 'tower/browser-data/main';
|
||||
import {JobDetailController} from 'tower/controllers/JobDetail';
|
||||
import {JobStdoutController} from 'tower/controllers/JobStdout';
|
||||
import {JobTemplatesList, JobTemplatesAdd, JobTemplatesEdit} from 'tower/controllers/JobTemplates';
|
||||
import {LicenseController} from 'tower/controllers/License';
|
||||
import {ScheduleEditController} from 'tower/controllers/Schedules';
|
||||
import {ProjectsList, ProjectsAdd, ProjectsEdit} from 'tower/controllers/Projects';
|
||||
import {OrganizationsList, OrganizationsAdd, OrganizationsEdit} from 'tower/controllers/Organizations';
|
||||
@@ -890,6 +891,17 @@ var tower = angular.module('Tower', [
|
||||
}
|
||||
}).
|
||||
|
||||
when('/license', {
|
||||
name: 'license',
|
||||
templateUrl: urlPrefix + 'partials/license.html',
|
||||
controller: LicenseController,
|
||||
resolve: {
|
||||
features: ['FeaturesService', function(FeaturesService) {
|
||||
return FeaturesService.get();
|
||||
}]
|
||||
}
|
||||
}).
|
||||
|
||||
when('/sockets', {
|
||||
name: 'sockets',
|
||||
templateUrl: urlPrefix + 'partials/sockets.html',
|
||||
@@ -916,9 +928,9 @@ var tower = angular.module('Tower', [
|
||||
}])
|
||||
|
||||
.run(['$compile', '$cookieStore', '$rootScope', '$log', 'CheckLicense', '$location', 'Authorization', 'LoadBasePaths', 'Timer', 'ClearScope', 'HideStream', 'Socket',
|
||||
'LoadConfig', 'Store', 'ShowSocketHelp', 'LicenseViewer', 'AboutAnsibleHelp', 'ConfigureTower', 'CreateCustomInventory',
|
||||
'LoadConfig', 'Store', 'ShowSocketHelp', 'AboutAnsibleHelp', 'ConfigureTower', 'CreateCustomInventory',
|
||||
function ($compile, $cookieStore, $rootScope, $log, CheckLicense, $location, Authorization, LoadBasePaths, Timer, ClearScope, HideStream, Socket,
|
||||
LoadConfig, Store, ShowSocketHelp, LicenseViewer, AboutAnsibleHelp, ConfigureTower, CreateCustomInventory) {
|
||||
LoadConfig, Store, ShowSocketHelp, AboutAnsibleHelp, ConfigureTower, CreateCustomInventory) {
|
||||
|
||||
|
||||
var e, html, sock;
|
||||
@@ -1109,7 +1121,7 @@ var tower = angular.module('Tower', [
|
||||
};
|
||||
|
||||
$rootScope.viewLicense = function () {
|
||||
LicenseViewer.showViewer();
|
||||
$location.path('/license');
|
||||
};
|
||||
$rootScope.toggleTab = function(e, tab, tabs) {
|
||||
e.preventDefault();
|
||||
|
||||
191
awx/ui/static/js/controllers/License.js
Normal file
191
awx/ui/static/js/controllers/License.js
Normal file
@@ -0,0 +1,191 @@
|
||||
/************************************
|
||||
* Copyright (c) 2014 AnsibleWorks, Inc.
|
||||
*
|
||||
*
|
||||
* Organizations.js
|
||||
*
|
||||
* Controller functions for Organization model.
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* @ngdoc function
|
||||
* @name controllers.function:Organizations
|
||||
* @description This controller's for the Organizations page
|
||||
*/
|
||||
|
||||
|
||||
export function LicenseController(ClearScope, $location, $rootScope, $compile, $filter, GenerateForm, Rest, Alert,
|
||||
GetBasePath, ProcessErrors, FormatDate, Prompt, Empty, LicenseForm, IsAdmin, CreateDialog, CheckLicense,
|
||||
TextareaResize, $scope) {
|
||||
|
||||
ClearScope();
|
||||
|
||||
$scope.getDefaultHTML = function(license_info) {
|
||||
var fld, html,
|
||||
self = this,
|
||||
generator = GenerateForm;
|
||||
|
||||
self.form = angular.copy(LicenseForm);
|
||||
|
||||
for (fld in self.form.fields) {
|
||||
if (fld !== 'time_remaining' && fld !== 'license_status' && fld !== 'tower_version') {
|
||||
if (Empty(license_info[fld])) {
|
||||
delete self.form.fields[fld];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!IsAdmin()) {
|
||||
delete self.form.fields.license_key;
|
||||
}
|
||||
|
||||
if (license_info.is_aws || Empty(license_info.license_date)) {
|
||||
delete self.form.fields.license_date;
|
||||
delete self.form.fields.time_remaining;
|
||||
}
|
||||
|
||||
html = generator.buildHTML(self.form, { mode: 'edit', showButtons: false, breadCrumbs: false });
|
||||
return html;
|
||||
};
|
||||
|
||||
$scope.loadDefaultScope = function(license_info, version) {
|
||||
var fld, dt, days, license,
|
||||
self = this;
|
||||
|
||||
for (fld in self.form.fields) {
|
||||
if (!Empty(license_info[fld])) {
|
||||
$scope[fld] = license_info[fld];
|
||||
}
|
||||
}
|
||||
|
||||
$scope.tower_version = version;
|
||||
|
||||
if ($scope.license_date) {
|
||||
dt = new Date(parseInt($scope.license_date, 10) * 1000); // expects license_date in seconds
|
||||
$scope.license_date = FormatDate(dt);
|
||||
$scope.time_remaining = parseInt($scope.time_remaining,10) * 1000;
|
||||
if ($scope.time_remaining < 0) {
|
||||
days = 0;
|
||||
} else {
|
||||
days = Math.floor($scope.time_remaining / 86400000);
|
||||
}
|
||||
$scope.time_remaining = (days!==1) ? $filter('number')(days, 0) + ' days' : $filter('number')(days, 0) + ' day'; // '1 day' and '0 days/2 days' or more
|
||||
}
|
||||
|
||||
if (parseInt($scope.free_instances) <= 0) {
|
||||
$scope.free_instances_class = 'field-failure';
|
||||
} else {
|
||||
$scope.free_instances_class = 'field-success';
|
||||
}
|
||||
|
||||
license = license_info;
|
||||
if (license.valid_key === undefined) {
|
||||
$scope.license_status = 'Missing License Key';
|
||||
$scope.status_color = 'license-invalid';
|
||||
} else if (!license.valid_key) {
|
||||
$scope.license_status = 'Invalid License Key';
|
||||
$scope.status_color = 'license-invalid';
|
||||
} else if (license.date_expired !== undefined && license.date_expired) {
|
||||
$scope.license_status = 'License Expired';
|
||||
$scope.status_color = 'license-expired';
|
||||
} else if (license.date_warning !== undefined && license.date_warning) {
|
||||
$scope.license_status = 'License Expiring Soon';
|
||||
$scope.status_color = 'license-warning';
|
||||
} else if (license.free_instances !== undefined && parseInt(license.free_instances) <= 0) {
|
||||
$scope.license_status = 'No Available Managed Hosts';
|
||||
$scope.status_color = 'license-invalid';
|
||||
} else {
|
||||
$scope.license_status = 'Valid License';
|
||||
$scope.status_color = 'license-valid';
|
||||
}
|
||||
};
|
||||
|
||||
$scope.setLicense = function(license_info, version) {
|
||||
this.license = license_info;
|
||||
this.version = version;
|
||||
};
|
||||
|
||||
$scope.getLicense = function(){
|
||||
return this.license;
|
||||
};
|
||||
|
||||
$scope.submitLicenseKey = function() {
|
||||
CheckLicense.postLicense($scope.license_json, $scope);
|
||||
};
|
||||
|
||||
if ($scope.removeLicenseDataReady) {
|
||||
$scope.removeLicenseDataReady();
|
||||
}
|
||||
$scope.removeLicenseDataReady = $scope.$on('LicenseDataReady', function(e, data) {
|
||||
var html, version, eula, h;
|
||||
version = data.version.replace(/-.*$/,'');
|
||||
$scope.setLicense(data.license_info, version);
|
||||
html = $scope.getDefaultHTML(data.license_info);
|
||||
$scope.loadDefaultScope(data.license_info, version);
|
||||
eula = (data.eula) ? data.eula : "" ;
|
||||
|
||||
e = angular.element(document.getElementById('license-modal-dialog'));
|
||||
e.empty().html(html);
|
||||
|
||||
$scope.parseType = 'json';
|
||||
$scope.license_json = JSON.stringify($scope.license, null, ' ');
|
||||
$scope.eula = eula;
|
||||
$scope.eula_agreement = false;
|
||||
|
||||
|
||||
h = CheckLicense.getHTML($scope.getLicense(),true).body;
|
||||
$('#license-modal-dialog #license_tabs').append("<li><a id=\"update_license_link\" ng-click=\"toggleTab($event, 'update_license_link', 'license_tabs')\" href=\"#update_license\" data-toggle=\"tab\">Update License</a></li>");
|
||||
$('#license-modal-dialog .tab-content').append("<div class=\"tab-pane\" id=\"update_license\"></div>");
|
||||
$('#license-modal-dialog #update_license').html(h);
|
||||
|
||||
if ($scope.license_status === 'Invalid License Key' || $scope.license_status === 'Missing License Key') {
|
||||
$('#license_tabs li:eq(1)').hide();
|
||||
$('#license_tabs li:eq(2) a').tab('show');
|
||||
}
|
||||
|
||||
setTimeout(function() {
|
||||
$('#license_license_json').attr('ng-required' , 'true' );
|
||||
$('#license_eula_agreement_chbox').attr('ng-required' , 'true' );
|
||||
$('#license_form_submit_btn').attr('ng-disabled' , "license_form.$invalid" );
|
||||
var e = angular.element(document.getElementById('license-modal-dialog'));
|
||||
$compile(e)($scope);
|
||||
// $('#license-modal-dialog').dialog('open');
|
||||
}, 300);
|
||||
|
||||
if (IsAdmin()) {
|
||||
setTimeout(function() {
|
||||
TextareaResize({
|
||||
scope: $scope,
|
||||
textareaId: 'license_license_json',
|
||||
modalId: 'license-modal-dialog',
|
||||
formId: 'license-notification-body',
|
||||
fld: 'license_json',
|
||||
parse: true,
|
||||
bottom_margin: 90,
|
||||
onChange: function() { $scope.license_json_api_error = ''; }
|
||||
});
|
||||
}, 300);
|
||||
}
|
||||
$('#license-ok-button').focus();
|
||||
$('#update_license_link').on('shown.bs.tab', function() {
|
||||
if (IsAdmin()) {
|
||||
TextareaResize({
|
||||
scope: $scope,
|
||||
textareaId: 'license_license_json',
|
||||
modalId: 'license-modal-dialog',
|
||||
formId: 'license-notification-body',
|
||||
fld: 'license_json',
|
||||
bottom_margin: 90,
|
||||
parse: true,
|
||||
onChange: function() { $scope.license_json_api_error = ''; }
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
CheckLicense.GetLicense('LicenseDataReady', $scope);
|
||||
|
||||
}
|
||||
|
||||
LicenseController.$inject = ['ClearScope', '$location', '$rootScope', '$compile', '$filter', 'GenerateForm', 'Rest', 'Alert',
|
||||
'GetBasePath', 'ProcessErrors', 'FormatDate', 'Prompt', 'Empty', 'LicenseForm', 'IsAdmin', 'CreateDialog',
|
||||
'CheckLicense', 'TextareaResize', '$scope'];
|
||||
@@ -40,6 +40,12 @@ export default
|
||||
readonly: true,
|
||||
tab: 'license'
|
||||
},
|
||||
license_type: {
|
||||
label: 'License Type',
|
||||
type: 'text',
|
||||
readonly: true,
|
||||
tab: 'license'
|
||||
},
|
||||
license_key: {
|
||||
label: 'License Key',
|
||||
type: 'textarea',
|
||||
|
||||
@@ -52,19 +52,22 @@ export default
|
||||
scope.removeBuildAboutDialog();
|
||||
}
|
||||
scope.removeBuildAboutDialog = scope.$on('BuildAboutDialog', function(e, data) {
|
||||
var spaces, i, j,
|
||||
paddedStr = "",
|
||||
version = data.version.replace(/-.*$/,'');
|
||||
var spaces, i,
|
||||
paddedStr = "", l,
|
||||
version = data.version.replace(/-.*$/,''),
|
||||
license_type = data.license_info.license_type;
|
||||
|
||||
spaces = Math.floor((16-version.length)/2);
|
||||
// get the length of the license type and the word license (7) plus the extra spaces (4)
|
||||
l = license_type.length + 11;
|
||||
|
||||
spaces = Math.floor(l-(version.length + 10)); // 8 comes from " Tower "
|
||||
for( i=0; i<=spaces; i++){
|
||||
paddedStr = paddedStr +" ";
|
||||
}
|
||||
paddedStr = paddedStr+version;
|
||||
for( j = paddedStr.length; j<16; j++){
|
||||
paddedStr = paddedStr + " ";
|
||||
}
|
||||
paddedStr = version+paddedStr;
|
||||
$('#about-modal-version').html(paddedStr);
|
||||
$('#about-modal-license-type').html(license_type);
|
||||
|
||||
scope.modalOK = function(){
|
||||
$('#about-modal-dialog').dialog('close');
|
||||
};
|
||||
|
||||
@@ -21,11 +21,16 @@
|
||||
import 'tower/forms';
|
||||
|
||||
export default
|
||||
angular.module('LicenseHelper', ['RestServices', 'Utilities', 'LicenseUpdateFormDefinition', 'FormGenerator', 'ParseHelper', 'ModalDialog', 'VariablesHelper', 'LicenseFormDefinition', 'AccessHelper'])
|
||||
angular.module('LicenseHelper', ['RestServices', 'Utilities', 'LicenseUpdateFormDefinition',
|
||||
'FormGenerator', 'ParseHelper', 'ModalDialog', 'VariablesHelper', 'LicenseFormDefinition',
|
||||
'AccessHelper'])
|
||||
|
||||
|
||||
.factory('CheckLicense', ['$rootScope', '$compile', 'CreateDialog', 'Store', 'LicenseUpdateForm', 'GenerateForm', 'TextareaResize', 'ToJSON', 'GetBasePath', 'Rest', 'ProcessErrors', 'Alert', 'IsAdmin',
|
||||
function($rootScope, $compile, CreateDialog, Store, LicenseUpdateForm, GenerateForm, TextareaResize, ToJSON, GetBasePath, Rest, ProcessErrors, Alert, IsAdmin) {
|
||||
.factory('CheckLicense', ['$rootScope', '$compile', 'CreateDialog', 'Store',
|
||||
'LicenseUpdateForm', 'GenerateForm', 'TextareaResize', 'ToJSON', 'GetBasePath',
|
||||
'Rest', 'ProcessErrors', 'Alert', 'IsAdmin', '$location',
|
||||
function($rootScope, $compile, CreateDialog, Store, LicenseUpdateForm, GenerateForm,
|
||||
TextareaResize, ToJSON, GetBasePath, Rest, ProcessErrors, Alert, IsAdmin, $location) {
|
||||
return {
|
||||
getRemainingDays: function(time_remaining) {
|
||||
// assumes time_remaining will be in seconds
|
||||
@@ -170,6 +175,7 @@ export default
|
||||
// ignore
|
||||
}
|
||||
Alert('License Accepted', 'The Ansible Tower license was updated. To view or update license information in the future choose View License from the Account menu.','alert-info');
|
||||
$location.path('/home');
|
||||
})
|
||||
.error(function (data, status) {
|
||||
scope.license_json_api_error = "A valid license key in JSON format is required";
|
||||
@@ -186,7 +192,7 @@ export default
|
||||
var license = Store('license'),
|
||||
notify = this.shouldNotify(license),
|
||||
self = this,
|
||||
scope, height, html, buttons;
|
||||
scope;
|
||||
|
||||
self.scope = $rootScope.$new();
|
||||
scope = self.scope;
|
||||
@@ -204,118 +210,119 @@ export default
|
||||
return true; // if the license is valid it would exit 'test' here, otherwise it moves on to making the modal for the license
|
||||
}
|
||||
|
||||
html = this.getHTML(license);
|
||||
$('#license-modal-dialog').html(html.body);
|
||||
|
||||
scope.flashMessage = null;
|
||||
scope.parseType = 'json';
|
||||
|
||||
scope.removeLicenseDialogReady = scope.$on('LicenseDialogReady', function() {
|
||||
$('#license_license_json').attr('ng-required' , 'true' );
|
||||
$('#license_eula_agreement_chbox').attr('ng-required' , 'true' );
|
||||
$('#license-submit-button').attr('ng-disabled' , "license_form.$invalid" );
|
||||
var e = angular.element(document.getElementById('license-modal-dialog'));
|
||||
$compile(e)(scope);
|
||||
e = angular.element(document.getElementById('license-submit-button'));
|
||||
$compile(e)(scope);
|
||||
$('#license-modal-dialog').dialog('open');
|
||||
});
|
||||
|
||||
scope.submitLicenseKey = function() {
|
||||
self.postLicense(scope.license_json);
|
||||
};
|
||||
|
||||
if (IsAdmin()) {
|
||||
buttons = [{
|
||||
label: "Cancel",
|
||||
onClick: function() {
|
||||
$('#license-modal-dialog').dialog('close');
|
||||
},
|
||||
"class": "btn btn-default",
|
||||
"id": "license-cancel-button"
|
||||
}, {
|
||||
label: "Submit",
|
||||
onClick: function() {
|
||||
scope.submitLicenseKey();
|
||||
},
|
||||
"class": "btn btn-primary",
|
||||
"id": "license-submit-button"
|
||||
}];
|
||||
} else {
|
||||
buttons = [{
|
||||
label: "OK",
|
||||
onClick: function() {
|
||||
$('#license-modal-dialog').dialog('close');
|
||||
},
|
||||
"class": "btn btn-primary",
|
||||
"id": "license-ok-button"
|
||||
}];
|
||||
}
|
||||
|
||||
height = (IsAdmin()) ? 675 : 350;
|
||||
|
||||
if (scope.removeLicenseReady) {
|
||||
scope.removeLicenseReady();
|
||||
}
|
||||
scope.removeLicenseReady = scope.$on('LicenseReady', function(e, data) {
|
||||
|
||||
scope.license_json = "";
|
||||
scope.eula = data.eula;
|
||||
if (data.license_info && data.license_info.valid_key !== undefined) {
|
||||
scope.license_json = JSON.stringify(data.license_info, null, ' ');
|
||||
}
|
||||
|
||||
CreateDialog({
|
||||
scope: scope,
|
||||
buttons: buttons,
|
||||
width: 675,
|
||||
height: height,
|
||||
minWidth: 400,
|
||||
title: html.title,
|
||||
id: 'license-modal-dialog',
|
||||
clonseOnEscape: false,
|
||||
onClose: function() {
|
||||
if (scope.codeMirror) {
|
||||
scope.codeMirror.destroy();
|
||||
}
|
||||
$('#license-modal-dialog').empty();
|
||||
},
|
||||
onResizeStop: function() {
|
||||
if (IsAdmin()) {
|
||||
TextareaResize({
|
||||
scope: scope,
|
||||
textareaId: 'license_license_json',
|
||||
modalId: 'license-modal-dialog',
|
||||
formId: 'license-notification-body',
|
||||
fld: 'license_json',
|
||||
parse: true,
|
||||
onChange: function() { scope.license_json_api_error = ''; }
|
||||
});
|
||||
}
|
||||
},
|
||||
onOpen: function() {
|
||||
if (IsAdmin()) {
|
||||
setTimeout(function() {
|
||||
TextareaResize({
|
||||
scope: scope,
|
||||
textareaId: 'license_license_json',
|
||||
modalId: 'license-modal-dialog',
|
||||
formId: 'license-notification-body',
|
||||
fld: 'license_json',
|
||||
parse: true,
|
||||
onChange: function() { scope.license_json_api_error = ''; }
|
||||
});
|
||||
$('#cm-license_json-container .CodeMirror textarea').focus();
|
||||
}, 300);
|
||||
} else {
|
||||
$('#license-ok-button').focus();
|
||||
}
|
||||
},
|
||||
callback: 'LicenseDialogReady'
|
||||
});
|
||||
});
|
||||
|
||||
self.GetLicense('LicenseReady');
|
||||
$location.path('/license');
|
||||
// html = this.getHTML(license);
|
||||
// $('#license-modal-dialog').html(html.body);
|
||||
//
|
||||
// scope.flashMessage = null;
|
||||
// scope.parseType = 'json';
|
||||
//
|
||||
// scope.removeLicenseDialogReady = scope.$on('LicenseDialogReady', function() {
|
||||
// $('#license_license_json').attr('ng-required' , 'true' );
|
||||
// $('#license_eula_agreement_chbox').attr('ng-required' , 'true' );
|
||||
// $('#license-submit-button').attr('ng-disabled' , "license_form.$invalid" );
|
||||
// var e = angular.element(document.getElementById('license-modal-dialog'));
|
||||
// $compile(e)(scope);
|
||||
// e = angular.element(document.getElementById('license-submit-button'));
|
||||
// $compile(e)(scope);
|
||||
// $('#license-modal-dialog').dialog('open');
|
||||
// });
|
||||
//
|
||||
// scope.submitLicenseKey = function() {
|
||||
// self.postLicense(scope.license_json);
|
||||
// };
|
||||
//
|
||||
// if (IsAdmin()) {
|
||||
// buttons = [{
|
||||
// label: "Cancel",
|
||||
// onClick: function() {
|
||||
// $('#license-modal-dialog').dialog('close');
|
||||
// },
|
||||
// "class": "btn btn-default",
|
||||
// "id": "license-cancel-button"
|
||||
// }, {
|
||||
// label: "Submit",
|
||||
// onClick: function() {
|
||||
// scope.submitLicenseKey();
|
||||
// },
|
||||
// "class": "btn btn-primary",
|
||||
// "id": "license-submit-button"
|
||||
// }];
|
||||
// } else {
|
||||
// buttons = [{
|
||||
// label: "OK",
|
||||
// onClick: function() {
|
||||
// $('#license-modal-dialog').dialog('close');
|
||||
// },
|
||||
// "class": "btn btn-primary",
|
||||
// "id": "license-ok-button"
|
||||
// }];
|
||||
// }
|
||||
//
|
||||
// height = (IsAdmin()) ? 675 : 350;
|
||||
//
|
||||
// if (scope.removeLicenseReady) {
|
||||
// scope.removeLicenseReady();
|
||||
// }
|
||||
// scope.removeLicenseReady = scope.$on('LicenseReady', function(e, data) {
|
||||
//
|
||||
// scope.license_json = "";
|
||||
// scope.eula = data.eula;
|
||||
// if (data.license_info && data.license_info.valid_key !== undefined) {
|
||||
// scope.license_json = JSON.stringify(data.license_info, null, ' ');
|
||||
// }
|
||||
//
|
||||
// CreateDialog({
|
||||
// scope: scope,
|
||||
// buttons: buttons,
|
||||
// width: 675,
|
||||
// height: height,
|
||||
// minWidth: 400,
|
||||
// title: html.title,
|
||||
// id: 'license-modal-dialog',
|
||||
// clonseOnEscape: false,
|
||||
// onClose: function() {
|
||||
// if (scope.codeMirror) {
|
||||
// scope.codeMirror.destroy();
|
||||
// }
|
||||
// $('#license-modal-dialog').empty();
|
||||
// },
|
||||
// onResizeStop: function() {
|
||||
// if (IsAdmin()) {
|
||||
// TextareaResize({
|
||||
// scope: scope,
|
||||
// textareaId: 'license_license_json',
|
||||
// modalId: 'license-modal-dialog',
|
||||
// formId: 'license-notification-body',
|
||||
// fld: 'license_json',
|
||||
// parse: true,
|
||||
// onChange: function() { scope.license_json_api_error = ''; }
|
||||
// });
|
||||
// }
|
||||
// },
|
||||
// onOpen: function() {
|
||||
// if (IsAdmin()) {
|
||||
// setTimeout(function() {
|
||||
// TextareaResize({
|
||||
// scope: scope,
|
||||
// textareaId: 'license_license_json',
|
||||
// modalId: 'license-modal-dialog',
|
||||
// formId: 'license-notification-body',
|
||||
// fld: 'license_json',
|
||||
// parse: true,
|
||||
// onChange: function() { scope.license_json_api_error = ''; }
|
||||
// });
|
||||
// $('#cm-license_json-container .CodeMirror textarea').focus();
|
||||
// }, 300);
|
||||
// } else {
|
||||
// $('#license-ok-button').focus();
|
||||
// }
|
||||
// },
|
||||
// callback: 'LicenseDialogReady'
|
||||
// });
|
||||
// });
|
||||
//
|
||||
// self.GetLicense('LicenseReady');
|
||||
|
||||
},
|
||||
|
||||
@@ -341,297 +348,4 @@ export default
|
||||
});
|
||||
}
|
||||
};
|
||||
}])
|
||||
|
||||
.factory('LicenseViewer', ['$location', '$rootScope', '$compile', '$filter', 'GenerateForm', 'Rest', 'Alert', 'GetBasePath', 'ProcessErrors', 'FormatDate', 'Prompt', 'Empty', 'LicenseForm', 'IsAdmin', 'CreateDialog', 'CheckLicense', 'TextareaResize',
|
||||
function ($location, $rootScope, $compile, $filter, GenerateForm, Rest, Alert, GetBasePath, ProcessErrors, FormatDate, Prompt, Empty, LicenseForm, IsAdmin, CreateDialog, CheckLicense, TextareaResize) {
|
||||
return {
|
||||
|
||||
createDialog: function(html) {
|
||||
var self = this,
|
||||
scope = this.getScope(),
|
||||
buttons;
|
||||
|
||||
if (scope.removeLicenseDialogReady) {
|
||||
scope.removeLicenseDialogReady();
|
||||
}
|
||||
scope.removeLicenseDialogReady = scope.$on('LicenseDialogReady', function() {
|
||||
var e, h;
|
||||
|
||||
e = angular.element(document.getElementById('license-modal-dialog'));
|
||||
e.empty().html(html);
|
||||
|
||||
if (scope.license_status === 'Invalid License Key' || scope.license_status === 'Missing License Key') {
|
||||
$('#license_tabs li:eq(1)').hide();
|
||||
}
|
||||
|
||||
scope.parseType = 'json';
|
||||
scope.license_json = JSON.stringify(self.license, null, ' ');
|
||||
scope.eula = self.eula;
|
||||
scope.eula_agreement = false;
|
||||
|
||||
|
||||
h = CheckLicense.getHTML(self.getLicense(),true).body;
|
||||
$('#license-modal-dialog #license_tabs').append("<li><a id=\"update_license_link\" ng-click=\"toggleTab($event, 'update_license_link', 'license_tabs')\" href=\"#update_license\" data-toggle=\"tab\">Update License</a></li>");
|
||||
$('#license-modal-dialog .tab-content').append("<div class=\"tab-pane\" id=\"update_license\"></div>");
|
||||
$('#license-modal-dialog #update_license').html(h);
|
||||
|
||||
setTimeout(function() {
|
||||
$('#license_license_json').attr('ng-required' , 'true' );
|
||||
$('#license_eula_agreement_chbox').attr('ng-required' , 'true' );
|
||||
$('#license_form_submit_btn').attr('ng-disabled' , "license_form.$invalid" );
|
||||
var e = angular.element(document.getElementById('license-modal-dialog'));
|
||||
$compile(e)(scope);
|
||||
$('#license-modal-dialog').dialog('open');
|
||||
}, 300);
|
||||
});
|
||||
|
||||
scope.submitLicenseKey = function() {
|
||||
CheckLicense.postLicense(scope.license_json, scope);
|
||||
};
|
||||
|
||||
buttons = [{
|
||||
label: "OK",
|
||||
onClick: function() {
|
||||
$('#license-modal-dialog').dialog('close');
|
||||
},
|
||||
"class": "btn btn-primary",
|
||||
"id": "license-ok-button"
|
||||
}];
|
||||
|
||||
CreateDialog({
|
||||
scope: scope,
|
||||
buttons: buttons,
|
||||
width: 675,
|
||||
height: (IsAdmin()) ? 745 : 600,
|
||||
minWidth: 400,
|
||||
title: 'Ansible Tower License',
|
||||
id: 'license-modal-dialog',
|
||||
clonseOnEscape: false,
|
||||
onClose: function() {
|
||||
if (scope.codeMirror) {
|
||||
scope.codeMirror.destroy();
|
||||
}
|
||||
$('#license-modal-dialog').empty();
|
||||
},
|
||||
onResizeStop: function() {
|
||||
if (IsAdmin()) {
|
||||
TextareaResize({
|
||||
scope: scope,
|
||||
textareaId: 'license_license_json',
|
||||
modalId: 'license-modal-dialog',
|
||||
formId: 'license-notification-body',
|
||||
fld: 'license_json',
|
||||
bottom_margin: 90,
|
||||
parse: true,
|
||||
onChange: function() { scope.license_json_api_error = ''; }
|
||||
});
|
||||
}
|
||||
},
|
||||
onOpen: function() {
|
||||
if (IsAdmin()) {
|
||||
setTimeout(function() {
|
||||
TextareaResize({
|
||||
scope: scope,
|
||||
textareaId: 'license_license_json',
|
||||
modalId: 'license-modal-dialog',
|
||||
formId: 'license-notification-body',
|
||||
fld: 'license_json',
|
||||
parse: true,
|
||||
bottom_margin: 90,
|
||||
onChange: function() { scope.license_json_api_error = ''; }
|
||||
});
|
||||
}, 300);
|
||||
}
|
||||
$('#license-ok-button').focus();
|
||||
$('#update_license_link').on('click', function() {
|
||||
if (IsAdmin()) {
|
||||
TextareaResize({
|
||||
scope: scope,
|
||||
textareaId: 'license_license_json',
|
||||
modalId: 'license-modal-dialog',
|
||||
formId: 'license-notification-body',
|
||||
fld: 'license_json',
|
||||
bottom_margin: 90,
|
||||
parse: true,
|
||||
onChange: function() { scope.license_json_api_error = ''; }
|
||||
});
|
||||
}
|
||||
});
|
||||
},
|
||||
callback: 'LicenseDialogReady'
|
||||
});
|
||||
},
|
||||
|
||||
getDefaultHTML: function(license_info) {
|
||||
var fld, html,
|
||||
self = this,
|
||||
generator = GenerateForm;
|
||||
|
||||
self.form = angular.copy(LicenseForm);
|
||||
|
||||
for (fld in self.form.fields) {
|
||||
if (fld !== 'time_remaining' && fld !== 'license_status' && fld !== 'tower_version') {
|
||||
if (Empty(license_info[fld])) {
|
||||
delete self.form.fields[fld];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!IsAdmin()) {
|
||||
delete self.form.fields.license_key;
|
||||
}
|
||||
|
||||
if (license_info.is_aws || Empty(license_info.license_date)) {
|
||||
delete self.form.fields.license_date;
|
||||
delete self.form.fields.time_remaining;
|
||||
}
|
||||
|
||||
html = generator.buildHTML(self.form, { mode: 'edit', showButtons: false, breadCrumbs: false });
|
||||
return html;
|
||||
},
|
||||
|
||||
loadDefaultScope: function(license_info, version) {
|
||||
var fld, dt, days, license,
|
||||
self = this,
|
||||
scope = this.getScope();
|
||||
|
||||
for (fld in self.form.fields) {
|
||||
if (!Empty(license_info[fld])) {
|
||||
scope[fld] = license_info[fld];
|
||||
}
|
||||
}
|
||||
|
||||
scope.tower_version = version;
|
||||
|
||||
if (scope.license_date) {
|
||||
dt = new Date(parseInt(scope.license_date, 10) * 1000); // expects license_date in seconds
|
||||
scope.license_date = FormatDate(dt);
|
||||
scope.time_remaining = parseInt(scope.time_remaining,10) * 1000;
|
||||
if (scope.time_remaining < 0) {
|
||||
days = 0;
|
||||
} else {
|
||||
days = Math.floor(scope.time_remaining / 86400000);
|
||||
}
|
||||
scope.time_remaining = (days!==1) ? $filter('number')(days, 0) + ' days' : $filter('number')(days, 0) + ' day'; // '1 day' and '0 days/2 days' or more
|
||||
}
|
||||
|
||||
if (parseInt(scope.free_instances) <= 0) {
|
||||
scope.free_instances_class = 'field-failure';
|
||||
} else {
|
||||
scope.free_instances_class = 'field-success';
|
||||
}
|
||||
|
||||
license = license_info;
|
||||
if (license.valid_key === undefined) {
|
||||
scope.license_status = 'Missing License Key';
|
||||
scope.status_color = 'license-invalid';
|
||||
} else if (!license.valid_key) {
|
||||
scope.license_status = 'Invalid License Key';
|
||||
scope.status_color = 'license-invalid';
|
||||
} else if (license.date_expired !== undefined && license.date_expired) {
|
||||
scope.license_status = 'License Expired';
|
||||
scope.status_color = 'license-expired';
|
||||
} else if (license.date_warning !== undefined && license.date_warning) {
|
||||
scope.license_status = 'License Expiring Soon';
|
||||
scope.status_color = 'license-warning';
|
||||
} else if (license.free_instances !== undefined && parseInt(license.free_instances) <= 0) {
|
||||
scope.license_status = 'No Available Managed Hosts';
|
||||
scope.status_color = 'license-invalid';
|
||||
} else {
|
||||
scope.license_status = 'Valid License';
|
||||
scope.status_color = 'license-valid';
|
||||
}
|
||||
},
|
||||
|
||||
getScope: function() {
|
||||
return this.scope;
|
||||
},
|
||||
|
||||
setLicense: function(license_info, version) {
|
||||
this.license = license_info;
|
||||
this.version = version;
|
||||
},
|
||||
|
||||
getLicense: function() {
|
||||
return this.license;
|
||||
},
|
||||
|
||||
showViewer: function() {
|
||||
var self = this,
|
||||
scope = self.scope = $rootScope.$new();
|
||||
|
||||
if (scope.removeLicenseDataReady) {
|
||||
scope.removeLicenseDataReady();
|
||||
}
|
||||
scope.removeLicenseDataReady = scope.$on('LicenseDataReady', function(e, data) {
|
||||
var html, version;
|
||||
version = data.version.replace(/-.*$/,'');
|
||||
self.setLicense(data.license_info, version);
|
||||
html = self.getDefaultHTML(data.license_info);
|
||||
self.loadDefaultScope(data.license_info, version);
|
||||
self.eula = (data.eula) ? data.eula : "" ;
|
||||
self.createDialog(html);
|
||||
});
|
||||
CheckLicense.GetLicense('LicenseDataReady', scope);
|
||||
}
|
||||
};
|
||||
}]);
|
||||
|
||||
/*
|
||||
.factory('CheckLicense', ['$rootScope', 'Store', 'Alert', '$location', 'Authorization',
|
||||
function ($rootScope, Store, Alert, $location, Authorization) {
|
||||
return function () {
|
||||
// Check license status and alert the user, if needed
|
||||
var status = 'success',
|
||||
hdr, msg,
|
||||
license = Store('license'),
|
||||
purchase_msg = '<p>To purchase a license or extend an existing license ' +
|
||||
'<a href="http://www.ansible.com/ansible-pricing" target="_blank"><strong>visit the Ansible online store</strong></a>, ' +
|
||||
'or visit <strong><a href="https://support.ansible.com" target="_blank">support.ansible.com</a></strong> for assistance.</p>';
|
||||
if (license && !Authorization.licenseTested()) {
|
||||
// This is our first time evaluating the license
|
||||
license.tested = true;
|
||||
Store('license',license); //update with tested flag
|
||||
$rootScope.license_tested = true;
|
||||
$rootScope.version = license.version;
|
||||
if (license.valid_key !== undefined && license.valid_key === false) {
|
||||
// The license is invalid. Stop the user from logging in.
|
||||
status = 'alert-danger';
|
||||
hdr = 'License Error';
|
||||
msg = '<p>There is a problem with the /etc/tower/license file on your Tower server. Check to make sure Tower can access ' +
|
||||
'the file.</p>' + purchase_msg;
|
||||
Alert(hdr, msg, status, null, false, true);
|
||||
} else if (license.demo !== undefined && license.demo === true) {
|
||||
// demo
|
||||
status = 'alert-info';
|
||||
hdr = 'Tower Demo';
|
||||
msg = '<p>Thank you for trying Ansible Tower. You can use this edition to manage up to 10 hosts free.</p>' +
|
||||
purchase_msg;
|
||||
Alert(hdr, msg, status);
|
||||
}
|
||||
if (license.date_expired !== undefined && license.date_expired === true) {
|
||||
// expired
|
||||
status = 'alert-info';
|
||||
hdr = 'License Expired';
|
||||
msg = '<p>Your Ansible Tower License has expired and is no longer compliant. You can continue, but you will be ' +
|
||||
'unable to add any additional hosts.</p>' + purchase_msg;
|
||||
Alert(hdr, msg, status);
|
||||
} else if (license.date_warning !== undefined && license.date_warning === true) {
|
||||
status = 'alert-info';
|
||||
hdr = 'License Warning';
|
||||
msg = '<p>Your Ansible Tower license is about to expire!</p>' + purchase_msg;
|
||||
Alert(hdr, msg, status);
|
||||
}
|
||||
if (license.free_instances !== undefined && parseInt(license.free_instances) <= 0) {
|
||||
status = 'alert-info';
|
||||
hdr = 'License Warning';
|
||||
msg = '<p>Your Ansible Tower license has reached capacity for the number of managed ' +
|
||||
'hosts allowed. You will not be able to add any additional hosts.</p>' + purchase_msg;
|
||||
Alert(hdr, msg, status, null, true);
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
]);
|
||||
*/
|
||||
|
||||
@@ -1,6 +1,10 @@
|
||||
export default ['$rootScope', function ($rootScope) {
|
||||
|
||||
this.isFeatureEnabled = function(feature){
|
||||
return $rootScope.features[feature] || false;
|
||||
if(_.isEmpty($rootScope.features)){
|
||||
return false;
|
||||
} else{
|
||||
return $rootScope.features[feature] || false;
|
||||
}
|
||||
};
|
||||
}];
|
||||
|
||||
@@ -378,9 +378,9 @@ textarea.allowresize {
|
||||
color: @grey-txt;
|
||||
}
|
||||
|
||||
#license_eula{
|
||||
white-space: nowrap;
|
||||
}
|
||||
// #license_eula{
|
||||
// white-space: nowrap;
|
||||
// }
|
||||
|
||||
.modal-dialog .ui-accordion .ui-accordion-content {
|
||||
overflow: hidden;
|
||||
|
||||
@@ -5,8 +5,8 @@
|
||||
<div style="width: 340px; margin: 0 auto;">
|
||||
<pre id="cowsay">
|
||||
________________
|
||||
/ Tower Version \
|
||||
\<span id='about-modal-version'></span>/
|
||||
/ Tower <span id='about-modal-version'></span> \
|
||||
\ <span id='about-modal-license-type'></span> license /
|
||||
----------------
|
||||
\ ^__^
|
||||
\ (oo)\_______
|
||||
@@ -23,4 +23,4 @@
|
||||
<br>
|
||||
<p>Visit <a href="http://www.ansible.com" target="_blank">Ansible.com</a> for more information.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
4
awx/ui/static/partials/license.html
Normal file
4
awx/ui/static/partials/license.html
Normal file
@@ -0,0 +1,4 @@
|
||||
<div class="tab-pane" id="license-partial">
|
||||
<div ng-cloak id="htmlTemplate"></div>
|
||||
<div id="license-modal-dialog"></div>
|
||||
</div>
|
||||
@@ -238,7 +238,7 @@
|
||||
|
||||
<div id="login-modal-dialog" style="display: none;"></div>
|
||||
<div id="help-modal-dialog" style="display: none;"></div>
|
||||
<div id="license-modal-dialog" style="display: none;"></div>
|
||||
<!-- <div id="license-modal-dialog" style="display: none;"></div> -->
|
||||
<div id="about-modal-dialog" style="display: none;" ng-include=" '{{ STATIC_URL }}partials/cowsay-about.html ' "></div>
|
||||
<div id="custom-script-dialog" style="display:none;" > </div>
|
||||
<div id='configure-tower-dialog' style="display:none" >
|
||||
|
||||
Reference in New Issue
Block a user