Skip to content

Commit

Permalink
Merge pull request ManageIQ#4189 from AparnaKarve/restful
Browse files Browse the repository at this point in the history
Cloud Provider Editor with Azure Provider, RESTful routes and Angular conversion
  • Loading branch information
matthewd committed Sep 9, 2015
2 parents 4623371 + cda8791 commit 10af9d2
Show file tree
Hide file tree
Showing 40 changed files with 1,655 additions and 185 deletions.
2 changes: 2 additions & 0 deletions app/assets/javascripts/application.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,15 @@
//= require services/miq_db_backup_service
//= require directives/scheduler/updateDropdownForFilter
//= require directives/scheduler/updateDropdownForTimer
//= require directives/autofocus
//= require directives/miqrequired
//= require directives/checkchange
//= require directives/verifypasswd
//= require directives/selectpickerForSelectTag
//= require directives/repository/valid_unc_path
//= require services/miq_service
//= require services/timer_option_service
//= require controllers/ems_common/ems_common_form_controller.js
//= require controllers/host/host_form_controller
//= require controllers/provider_foreman/provider_foreman_form_controller
//= require controllers/repository/repository_form_controller
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,200 @@
ManageIQ.angularApplication.controller('emsCommonFormController', ['$http', '$scope', '$attrs', 'emsCommonFormId', 'miqService', function($http, $scope, $attrs, emsCommonFormId, miqService) {
var init = function() {
$scope.emsCommonModel = {
name: '',
emstype: '',
openstack_infra_providers_exist: false,
provider_id: '',
zone: '',
hostname: '',
api_port: '',
provider_region: '',
default_userid: '',
default_password: '',
default_verify: '',
amqp_userid: '',
amqp_password: '',
amqp_verify: '',
metrics_userid: '',
metrics_password: '',
metrics_verify: '',
ssh_keypair_userid: '',
ssh_keypair_password: '',
ssh_keypair_verify: '',
host_default_vnc_port_start: '',
host_default_vnc_port_end: '',
emstype_vm: false,
ems_common: true,
azure_tenant_id: ''
};
$scope.formId = emsCommonFormId;
$scope.afterGet = false;
$scope.saveable = miqService.saveable;
$scope.restAjaxButton = miqService.restAjaxButton;
$scope.validateClicked = miqService.validateClicked;
$scope.modelCopy = angular.copy( $scope.emsCommonModel );
$scope.formFieldsUrl = $attrs.formFieldsUrl;
$scope.createUrl = $attrs.createUrl;
$scope.updateUrl = $attrs.updateUrl;
$scope.model = 'emsCommonModel';

ManageIQ.angularApplication.$scope = $scope;

if (emsCommonFormId == 'new') {
$scope.newRecord = true;

miqService.sparkleOn();
$http.get($scope.formFieldsUrl + emsCommonFormId).success(function(data) {
$scope.emsCommonModel.zone = data.zone;
$scope.emsCommonModel.emstype_vm = data.emstype_vm;
$scope.emsCommonModel.openstack_infra_providers_exist = data.openstack_infra_providers_exist;
$scope.emsCommonModel.api_port = 5000;
miqService.sparkleOff();
});
$scope.afterGet = true;
$scope.modelCopy = angular.copy( $scope.emsCommonModel );
}
else {
$scope.newRecord = false;
miqService.sparkleOn();

$http.get($scope.formFieldsUrl + emsCommonFormId).success(function(data) {
$scope.emsCommonModel.name = data.name;
$scope.emsCommonModel.emstype = data.emstype;
$scope.emsCommonModel.zone = data.zone;
$scope.emsCommonModel.hostname = data.hostname;

$scope.emsCommonModel.openstack_infra_providers_exist = data.openstack_infra_providers_exist;
$scope.emsCommonModel.provider_id = data.provider_id.toString();

$scope.emsCommonModel.api_port = data.api_port;
$scope.emsCommonModel.provider_region = data.provider_region;

$scope.emsCommonModel.default_userid = data.default_userid;
$scope.emsCommonModel.default_password = data.default_password;
$scope.emsCommonModel.default_verify = data.default_verify;

$scope.emsCommonModel.amqp_userid = data.amqp_userid;
$scope.emsCommonModel.amqp_password = data.amqp_password;
$scope.emsCommonModel.amqp_verify = data.amqp_verify;

$scope.emsCommonModel.azure_tenant_id = data.azure_tenant_id;

$scope.afterGet = true;
$scope.modelCopy = angular.copy( $scope.emsCommonModel );

miqService.sparkleOff();
});
}
$scope.currentTab = "default"

$scope.$watch("emsCommonModel.name", function() {
$scope.form = $scope.angularForm;
$scope.model = "emsCommonModel";
});
};

$scope.changeAuthTab = function(id) {
$scope.currentTab = id;
}

$scope.canValidateBasicInfo = function () {
if ($scope.isBasicInfoValid())
return true;
else
return false;
}

$scope.isBasicInfoValid = function() {
if(($scope.currentTab == "default" && $scope.emsCommonModel.emstype != "azure") &&
($scope.emsCommonModel.emstype == "ec2" || ($scope.emsCommonModel.emstype == "openstack" && $scope.emsCommonModel.hostname)) &&
($scope.emsCommonModel.default_userid != '' && $scope.angularForm.default_userid.$valid &&
$scope.emsCommonModel.default_password != '' && $scope.angularForm.default_password.$valid &&
$scope.emsCommonModel.default_verify != '' && $scope.angularForm.default_verify.$valid)) {
return true;
} else if(($scope.currentTab == "amqp") &&
($scope.emsCommonModel.hostname) &&
($scope.emsCommonModel.amqp_userid != '' && $scope.angularForm.amqp_userid.$valid &&
$scope.emsCommonModel.amqp_password != '' && $scope.angularForm.amqp_password.$valid &&
$scope.emsCommonModel.amqp_verify != '' && $scope.angularForm.amqp_verify.$valid)) {
return true;
} else if(($scope.currentTab == "default" && $scope.emsCommonModel.emstype == "azure") &&
($scope.emsCommonModel.azure_tenant_id != '' && $scope.angularForm.azure_tenant_id.$valid) &&
($scope.emsCommonModel.default_userid != '' && $scope.angularForm.default_userid.$valid &&
$scope.emsCommonModel.default_password != '' && $scope.angularForm.default_password.$valid &&
$scope.emsCommonModel.default_verify != '' && $scope.angularForm.default_verify.$valid)) {
return true;
}
else
return false;
};

var emsCommonEditButtonClicked = function(buttonName, serializeFields, $event) {
miqService.sparkleOn();
var url = $scope.updateUrl + '?button=' + buttonName;
miqService.restAjaxButton(url, $event.target);
};

var emsCommonAddButtonClicked = function(buttonName, serializeFields, $event) {
miqService.sparkleOn();
var url = $scope.createUrl + '?button=' + buttonName;
miqService.restAjaxButton(url, $event.target);
};

$scope.cancelClicked = function($event) {
angular.element('#button_name').val('cancel');
if($scope.newRecord)
emsCommonAddButtonClicked('cancel', false, $event);
else
emsCommonEditButtonClicked('cancel', false, $event);

$scope.angularForm.$setPristine(true);
};

$scope.resetClicked = function() {
$scope.emsCommonModel = angular.copy( $scope.modelCopy );
$scope.angularForm.$setPristine(true);
miqService.miqFlash("warn", "All changes have been reset");
};

$scope.saveClicked = function($event, formSubmit) {
if(formSubmit) {
angular.element('#button_name').val('save');
emsCommonEditButtonClicked('save', true, $event);
$scope.angularForm.$setPristine(true);
}
else {
$event.preventDefault();
}
};

$scope.validateBClicked = function($event, credType, url, formSubmit) {
angular.element('#button_name').val('validate');
angular.element('#cred_type').val(credType);
if(formSubmit) {
miqService.sparkleOn();
miqService.restAjaxButton(url, $event.target);
}
else {
$event.preventDefault();
}
};

$scope.addClicked = function($event, formSubmit) {
if(formSubmit) {
angular.element('#button_name').val('add');
emsCommonAddButtonClicked('add', true, $event);
$scope.angularForm.$setPristine(true);
}
else {
$event.preventDefault();
}
};

$scope.$watch('$viewContentLoaded', function() {
$scope.afterGet = true;
});

init();
}]);

14 changes: 14 additions & 0 deletions app/assets/javascripts/directives/autofocus.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
ManageIQ.angularApplication.directive('autoFocus', ['$timeout', function($timeout) {
return {
require: 'ngModel',
link: function (scope, elem, attr, ctrl) {
scope['form_focus_' + ctrl.$name] = elem[0];

scope.$watch(scope['afterGet'], function() {
$timeout(function(){
angular.element(scope['form_focus_' + ctrl.$name]).focus();
}, 0);
});
}
}
}]);
20 changes: 10 additions & 10 deletions app/assets/javascripts/directives/checkchange.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,29 +20,29 @@ ManageIQ.angularApplication.directive('checkchange', ['miqService', function(miq
miqService.miqFlashClear();

if (value == scope.modelCopy[ctrl.$name]) {
scope.angularForm[scope['formchange_' + ctrl.$name]].$setPristine(true);
scope.angularForm[scope['formchange_' + ctrl.$name]].$setPristine();
}
if(scope.angularForm[scope['formchange_' + ctrl.$name]].$pristine) {
checkForOverallFormPristinity(scope, ctrl);
}
scope.angularForm[scope['formchange_' + ctrl.$name]].$setTouched(true);
scope.angularForm[scope['formchange_' + ctrl.$name]].$setTouched();
return value;
});

if(scope.angularForm.$pristine)
scope.angularForm.$setPristine(true);
scope.angularForm.$setPristine();
}
}
}]);

var viewModelComparison = function(scope, ctrl) {
if (ctrl.$viewValue == scope.modelCopy[ctrl.$name]) {
scope.angularForm[scope['formchange_' + ctrl.$name]].$setPristine(true);
scope.angularForm[scope['formchange_' + ctrl.$name]].$setUntouched(true);
scope.angularForm[scope['formchange_' + ctrl.$name]].$setPristine();
scope.angularForm[scope['formchange_' + ctrl.$name]].$setUntouched();
scope.angularForm.$pristine = true;
}
else {
scope.angularForm[scope['formchange_' + ctrl.$name]].$setPristine(false);
scope.angularForm[scope['formchange_' + ctrl.$name]].$setDirty();
scope.angularForm.$pristine = false;
}
};
Expand All @@ -52,11 +52,11 @@ var viewModelDateComparison = function(scope, ctrl) {
var copyDate = moment(scope.modelCopy[ctrl.$name]);

if (modelDate.diff(copyDate, 'days') == 0) {
scope.angularForm[scope['formchange_' + ctrl.$name]].$setPristine(true);
scope.angularForm[scope['formchange_' + ctrl.$name]].$setUntouched(true);
scope.angularForm[scope['formchange_' + ctrl.$name]].$setPristine();
scope.angularForm[scope['formchange_' + ctrl.$name]].$setUntouched();
scope.angularForm.$pristine = true;
} else {
scope.angularForm[scope['formchange_' + ctrl.$name]].$setPristine(false);
scope.angularForm[scope['formchange_' + ctrl.$name]].$setDirty();
scope.angularForm.$pristine = false;
}
};
Expand All @@ -75,5 +75,5 @@ var checkForOverallFormPristinity = function(scope, ctrl) {
scope.angularForm.$pristine = _.isEqual(modelCopyObject, modelObject);

if (scope.angularForm.$pristine)
scope.angularForm.$setPristine(true);
scope.angularForm.$setPristine();
};
26 changes: 26 additions & 0 deletions app/assets/javascripts/miq_application.js
Original file line number Diff line number Diff line change
Expand Up @@ -734,6 +734,29 @@ function miqChartMenuClick(itemId) {
}
}

function miqRESTAjaxButton(url, button, data) {
var form = $(button).parents('form:first')[0];
if (form) {
$(form).submit(function(e) {
e.preventDefault();
return false;
});
if(data != undefined) {
formData = data;
}
else {
formData = $(form).serialize();
}
miqJqueryRequest(form.action, {
beforeSend: true,
complete: true,
data: formData
});
} else {
miqAjaxButton(url, true);
}
}

// Handle an ajax form button press (i.e. Submit) by starting the spinning Q,
// then waiting for .7 seconds for observers to finish
function miqAjaxButton(url, serialize_fields) {
Expand Down Expand Up @@ -1028,6 +1051,9 @@ function miq_tabs_init(id, url) {
if ($(id + ' > ul.nav-tabs > li:not(.hidden)').length == 1) {
$(id + ' > ul.nav-tabs').hide();
}
else if ($(id + ' > ul.nav-tabs > li:not(.hidden)').length > 1) {
$(id + ' > ul.nav-tabs').show();
}
}

function miq_tabs_disable_inactive(id) {
Expand Down
16 changes: 16 additions & 0 deletions app/assets/javascripts/miq_dhtmlxgrid.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,16 @@
// ES6 endsWith polyfill
if (!String.prototype.endsWith) {
String.prototype.endsWith = function(searchString, position) {
var subjectString = this.toString();
if (position === undefined || position > subjectString.length) {
position = subjectString.length;
}
position -= searchString.length;
var lastIndex = subjectString.indexOf(searchString, position);
return lastIndex !== -1 && lastIndex === position;
};
}

// Functions used by MIQ for the dhtmlxtree control

// Function to pass ajax request to server, to remember tree states
Expand All @@ -13,6 +26,9 @@ function miqRowClick(row_id, cell_idx) {
if (typeof row_url_ajax != "undefined" && row_url_ajax) {
miqJqueryRequest(row_url + row_id, {beforeSend: true, complete: true});
} else {
if (!row_url.endsWith("/")) {
row_url = row_url + "/";
}
DoNav(row_url + row_id);
}
}
Expand Down
8 changes: 8 additions & 0 deletions app/assets/javascripts/services/miq_service.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,14 @@ ManageIQ.angularApplication.service('miqService', function() {
miqAjaxButton(url, serializeFields);
};

this.restAjaxButton = function(url, button, data) {
miqRESTAjaxButton(url, button, data);
};

this.jqueryRequest = function(url, options) {
miqJqueryRequest(url, options);
};

this.sparkleOn = function() {
miqSparkleOn();
};
Expand Down
4 changes: 4 additions & 0 deletions app/controllers/application_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2641,4 +2641,8 @@ def flip_sort_direction(direction)
def skip_breadcrumb?
false
end

def restful?
false
end
end
Loading

0 comments on commit 10af9d2

Please sign in to comment.