diff --git a/awx/ui/static/js/app.js b/awx/ui/static/js/app.js index d5e5fabf09..33d171e8e0 100644 --- a/awx/ui/static/js/app.js +++ b/awx/ui/static/js/app.js @@ -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(); diff --git a/awx/ui/static/js/controllers/License.js b/awx/ui/static/js/controllers/License.js new file mode 100644 index 0000000000..b870026854 --- /dev/null +++ b/awx/ui/static/js/controllers/License.js @@ -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("
  • Update License
  • "); + $('#license-modal-dialog .tab-content').append("
    "); + $('#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']; diff --git a/awx/ui/static/js/forms/LicenseForm.js b/awx/ui/static/js/forms/LicenseForm.js index 923873444e..5859dbe189 100644 --- a/awx/ui/static/js/forms/LicenseForm.js +++ b/awx/ui/static/js/forms/LicenseForm.js @@ -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', diff --git a/awx/ui/static/js/helpers/AboutAnsible.js b/awx/ui/static/js/helpers/AboutAnsible.js index 999e4063f8..d548bbdacd 100644 --- a/awx/ui/static/js/helpers/AboutAnsible.js +++ b/awx/ui/static/js/helpers/AboutAnsible.js @@ -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'); }; diff --git a/awx/ui/static/js/helpers/License.js b/awx/ui/static/js/helpers/License.js index ad0c36e127..92335a1791 100644 --- a/awx/ui/static/js/helpers/License.js +++ b/awx/ui/static/js/helpers/License.js @@ -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("
  • Update License
  • "); - $('#license-modal-dialog .tab-content').append("
    "); - $('#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 = '

    To purchase a license or extend an existing license ' + - 'visit the Ansible online store, ' + - 'or visit support.ansible.com for assistance.

    '; - 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 = '

    There is a problem with the /etc/tower/license file on your Tower server. Check to make sure Tower can access ' + - 'the file.

    ' + 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 = '

    Thank you for trying Ansible Tower. You can use this edition to manage up to 10 hosts free.

    ' + - purchase_msg; - Alert(hdr, msg, status); - } - if (license.date_expired !== undefined && license.date_expired === true) { - // expired - status = 'alert-info'; - hdr = 'License Expired'; - msg = '

    Your Ansible Tower License has expired and is no longer compliant. You can continue, but you will be ' + - 'unable to add any additional hosts.

    ' + purchase_msg; - Alert(hdr, msg, status); - } else if (license.date_warning !== undefined && license.date_warning === true) { - status = 'alert-info'; - hdr = 'License Warning'; - msg = '

    Your Ansible Tower license is about to expire!

    ' + purchase_msg; - Alert(hdr, msg, status); - } - if (license.free_instances !== undefined && parseInt(license.free_instances) <= 0) { - status = 'alert-info'; - hdr = 'License Warning'; - msg = '

    Your Ansible Tower license has reached capacity for the number of managed ' + - 'hosts allowed. You will not be able to add any additional hosts.

    ' + purchase_msg; - Alert(hdr, msg, status, null, true); - } - } - }; - } - ]); - */ diff --git a/awx/ui/static/js/shared/features/features.controller.js b/awx/ui/static/js/shared/features/features.controller.js index 78ff9ec270..6f1a62ae54 100644 --- a/awx/ui/static/js/shared/features/features.controller.js +++ b/awx/ui/static/js/shared/features/features.controller.js @@ -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; + } }; }]; diff --git a/awx/ui/static/less/ansible-ui.less b/awx/ui/static/less/ansible-ui.less index f9fa88aba5..b9147c85b4 100644 --- a/awx/ui/static/less/ansible-ui.less +++ b/awx/ui/static/less/ansible-ui.less @@ -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; diff --git a/awx/ui/static/partials/cowsay-about.html b/awx/ui/static/partials/cowsay-about.html index e4e3fc8a1f..8ec3906381 100644 --- a/awx/ui/static/partials/cowsay-about.html +++ b/awx/ui/static/partials/cowsay-about.html @@ -5,8 +5,8 @@
      ________________
    -/  Tower Version \
    -\/
    +/  Tower  \
    +\   license /
      ----------------
             \   ^__^
              \  (oo)\_______
    @@ -23,4 +23,4 @@
                 

    Visit Ansible.com for more information.

    - \ No newline at end of file + diff --git a/awx/ui/static/partials/license.html b/awx/ui/static/partials/license.html new file mode 100644 index 0000000000..4e616a112a --- /dev/null +++ b/awx/ui/static/partials/license.html @@ -0,0 +1,4 @@ +
    +
    +
    +
    diff --git a/awx/ui/templates/ui/index.html b/awx/ui/templates/ui/index.html index 35d1dd7543..1e65dc521a 100644 --- a/awx/ui/templates/ui/index.html +++ b/awx/ui/templates/ui/index.html @@ -238,7 +238,7 @@ - +