Merge branch 'master' of github.com:open-cloud/xos
diff --git a/.gitignore b/.gitignore
index bf493e8..617f1f9 100644
--- a/.gitignore
+++ b/.gitignore
@@ -23,3 +23,4 @@
.DS_Store
xos/configurations/setup/
migrations/
+xos/configurations/frontend/onboarding-docker-compose/
diff --git a/views/ngXosLib/.eslintrc b/views/ngXosLib/.eslintrc
index 1cd7d33..6a8ce79 100644
--- a/views/ngXosLib/.eslintrc
+++ b/views/ngXosLib/.eslintrc
@@ -12,7 +12,7 @@
"es6": true
},
"plugins": [
- //"angular"
+ "angular"
],
"rules": {
"quotes": [2, "single"],
@@ -28,12 +28,15 @@
"no-trailing-spaces": [1, { skipBlankLines: true }],
"no-unused-vars": [1, {"vars": "all", "args": "after-used"}],
"new-cap": 0,
+ "no-multiple-empty-lines": 2,
- //"angular/ng_module_name": [2, '/^xos\.*[a-z]*$/'],
- //"angular/ng_controller_name": [2, '/^[a-z].*Ctrl$/'],
+ "angular/ng_module_name": [2, '/^xos\.*[a-z]*$/'],
+// "angular/ng_controller_name": [2, '/^[a-z].*Ctrl$/'],
//"angular/ng_service_name": [2, '/^[A-Z].*Service$/'],
- //"angular/ng_directive_name": [2, '/^[a-z]+[[A-Z].*]*$/'],
- //"angular/ng_di": [0, "function or array"]
+ "angular/ng_directive_name": [2, '/^[xos[[A-Z].*]*$/'],
+ "angular/ng_di": [0, "function or array"],
+ "angular/ng_angularelement": 0,
+ "angular/ng_on_watch": 1
},
"globals" :{
"angular": true
diff --git a/views/ngXosLib/xosHelpers/spec/.eslintrc b/views/ngXosLib/xosHelpers/spec/.eslintrc
new file mode 100644
index 0000000..de1e44b
--- /dev/null
+++ b/views/ngXosLib/xosHelpers/spec/.eslintrc
@@ -0,0 +1,7 @@
+{
+ "rules": {
+ "angular/ng_angularelement": 0,
+ "angular/ng_no_digest": 0,
+ "angular/ng_json_functions": 0
+ }
+}
\ No newline at end of file
diff --git a/views/ngXosLib/xosHelpers/spec/log.test.js b/views/ngXosLib/xosHelpers/spec/log.test.js
index f286a8e..21085c6 100644
--- a/views/ngXosLib/xosHelpers/spec/log.test.js
+++ b/views/ngXosLib/xosHelpers/spec/log.test.js
@@ -3,6 +3,7 @@
*
* Created by teone on 4/18/16.
*/
+/* eslint-disable angular/ng_window_service*/
// TODO write tests for log
// NODE Actually the code is working, the tests are not.
@@ -12,9 +13,9 @@
xdescribe('The xos.helper module', function(){
- let log;
+ let log, window;
- var mockLog;
+ let mockLog;
beforeEach(function() {
mockLog = jasmine.createSpyObj('logMock', ['info']);
@@ -28,8 +29,9 @@
});
});
- beforeEach(inject(($log) => {
+ beforeEach(inject(($log, $window) => {
log = $log;
+ window = $window;
// log.reset();
}));
diff --git a/views/ngXosLib/xosHelpers/spec/ui/field.test.js b/views/ngXosLib/xosHelpers/spec/ui/field.test.js
index fad0826..f294daa 100644
--- a/views/ngXosLib/xosHelpers/spec/ui/field.test.js
+++ b/views/ngXosLib/xosHelpers/spec/ui/field.test.js
@@ -14,13 +14,13 @@
if(!scope){
scope = rootScope.$new();
}
- if(!angular.isDefined(element)){
+ if(angular.isUndefined(element)){
element = angular.element('<xos-field name="name" field="field" ng-model="ngModel"></xos-field>');
}
compile(element)(scope);
scope.$digest();
isolatedScope = element.isolateScope().vm;
- }
+ };
describe('The xos.helper module', function(){
@@ -104,9 +104,6 @@
});
});
-
-
-
describe('when a option is selected in dropdown', () => {
beforeEach(() => {
scope = rootScope.$new();
@@ -126,17 +123,18 @@
}
]
};
- scope.ngModel = 'label';
+ scope.ngModel = 0;
compileElement();
});
it('No of select elements', () => {
- expect($(element).find('select').children('option').length).toEqual(3);
+ expect($(element).find('select').children('option').length).toEqual(2);
});
- it('should show a selected value', () => {
- var elem = angular.element($(element).find('select').children('option')[1]);
+ it('should show the selected value', () => {
+ var elem = angular.element($(element).find('select').children('option')[0]);
expect(elem.text()).toEqual('---Site---');
+ expect(elem).toHaveAttr('selected');
});
});
diff --git a/views/ngXosLib/xosHelpers/spec/ui/form.test.js b/views/ngXosLib/xosHelpers/spec/ui/form.test.js
index c1387ff..dc9c957 100644
--- a/views/ngXosLib/xosHelpers/spec/ui/form.test.js
+++ b/views/ngXosLib/xosHelpers/spec/ui/form.test.js
@@ -259,15 +259,25 @@
});
describe('when correctly configured for feedback', () => {
- let cb = jasmine.createSpy('callback');
+ let fb = jasmine.createSpy('feedback').and.callFake(function(statusFlag) {
+ if(statusFlag){
+ scope.config.feedback.show = true;
+ scope.config.feedback.message = 'Form Submitted';
+ scope.config.feedback.type = 'success';
+ }
+ else {
+ scope.config.feedback.show = true;
+ scope.config.feedback.message = 'Error';
+ scope.config.feedback.type = 'danger';
- beforeEach(inject(($rootScope) => {
+ }
+ });
- scope = $rootScope.$new();
+ beforeEach(()=> {
+ scope = rootScope.$new();
+ scope.config =
+ {
- scope.config = {
- exclude: ['excludedField'],
- formName: 'testForm',
feedback: {
show: false,
message: 'Form submitted successfully !!!',
@@ -277,259 +287,33 @@
{
label: 'Save',
icon: 'ok', // refers to bootstraps glyphicon
- cb: cb,
+ cb: () => {},
class: 'success'
}
- ],
- fields: {
- first_name: {
- label: 'Custom Label'
- }
- }
+ ]
};
-
- scope.model = {
- id: 1,
- first_name: 'Jhon',
- last_name: 'Snow',
- age: 25,
- email: 'test@onlab.us',
- birthDate: '2016-04-18T23:44:16.883181Z',
- enabled: true,
- role: 'user', //select
- a_permissions: [
- ],
- object_field: {
- string: 'bar',
- number: 1,
- email: 'teo@onlab.us'
- }
- };
-
+ scope.model={};
compileElement();
- }));
-
- it('should add excluded properties to the list', () => {
- let expected = ['id', 'validators', 'created', 'updated', 'deleted', 'backend_status', 'excludedField'];
- expect(isolatedScope.excludedField).toEqual(expected);
});
- it('should render 10 input field', () => {
- // boolean are in the form model, but are not input
- expect(Object.keys(isolatedScope.formField).length).toEqual(9);
- var field = element[0].getElementsByTagName('input');
- expect(field.length).toEqual(10);
+ it('should not show feedback when loaded', () => {
+ expect($(element).find('xos-alert > div')).toHaveClass('alert alert-success ng-hide');
});
- it('should render 1 boolean field', () => {
- expect($(element).find('.boolean-field > a').length).toEqual(2)
+ it('should show a success feedback', () => {
+ fb(true);
+ scope.$digest();
+ expect(isolatedScope.config.feedback.type).toEqual('success');
+ expect(fb).toHaveBeenCalledWith(true);
+ expect($(element).find('xos-alert > div')).toHaveClass('alert alert-success');
});
- it('when clicking on action should invoke callback', () => {
- var link = $(element).find('[role="button"]');
- //console.log(link);
- link.click();
- // TODO : Check correct parameters
- expect(cb).toHaveBeenCalled();
-
- });
-
- it('should set a custom label', () => {
- let nameField = element[0].getElementsByClassName('form-group')[0];
- let label = angular.element(nameField.getElementsByTagName('label')[0]).text()
- expect(label).toEqual('Custom Label:');
- });
-
- it('should use the correct input type', () => {
- expect($(element).find('[name="age"]')).toHaveAttr('type', 'number');
- expect($(element).find('[name="birthDate"]')).toHaveAttr('type', 'date');
- expect($(element).find('[name="email"]')).toHaveAttr('type', 'email');
- });
-
-
-
- describe('A spy,configured with an alternate config implementation for Feedback', function() {
- var feedbackParams, statusFlag, fetchedBar;
-
- let fb = jasmine.createSpy('feedback').and.callFake(function(statusFlag) {
- //console.log(statusFlag , '------------------------------------------------------');
- if(statusFlag){
- scope.config.feedback.show = true;
- scope.config.feedback.message = 'Form Submitted';
- scope.config.feedback.type = 'success';
- }
- else {
- scope.config.feedback.show = true;
- scope.config.feedback.message = 'Error';
- scope.config.feedback.type = 'danger';
-
- }
- console.log(scope.config.feedback, '################################');
-
-
-
- });
-
- beforeEach(()=> {
- scope = rootScope.$new();
- scope.config =
- {
-
- feedback: {
- show: false,
- message: 'Form submitted successfully !!!',
- type: 'success'
- },
- actions: [
- {
- label: 'Save',
- icon: 'ok', // refers to bootstraps glyphicon
- cb: cb,
- class: 'success'
- }
- ]
- };
- scope.model={};
- compileElement();
- })
-
- it('tracks that the spy was called', function() {
- expect($(element).find('xos-alert > div')).toHaveClass('alert alert-success ng-hide');
- scope.$digest();
- fb(true);
- scope.$digest();
- expect(isolatedScope.config.feedback.type).toEqual('success');
- expect(fb).toHaveBeenCalledWith(true);
- expect($(element).find('xos-alert > div')).toHaveClass('alert alert-success');
- fb(false);
- scope.$digest();
- expect(isolatedScope.config.feedback.type).toEqual('danger');
- expect(fb).toHaveBeenCalledWith(false);
- expect($(element).find('xos-alert > div')).toHaveClass('alert alert-danger');
- });
- });
- xdescribe('the boolean field test', () => {
-
- let setFalse, setTrue;
-
- beforeEach(() => {
- setFalse= $(element).find('.boolean-field > button:first-child');
- setTrue = $(element).find('.boolean-field > button:last-child');
- });
-
- it('should change value to false', () => {
- expect(isolatedScope.ngModel.enabled).toEqual(true);
- setFalse.click();
- expect(isolatedScope.ngModel.enabled).toEqual(false);
- });
-
- it('should change value to true', () => {
- isolatedScope.ngModel.enabled = false;
- scope.$apply();
- expect(isolatedScope.ngModel.enabled).toEqual(false);
- setTrue.click()
- expect(isolatedScope.ngModel.enabled).toEqual(true);
- });
- });
-
- // NOTE not sure why this tests are failing
- xdescribe('the custom validation options', () => {
- beforeEach(() => {
- scope.config.fields.first_name.validators = {
- minlength: 10,
- maxlength: 15,
- required: true
- };
-
- scope.config.fields.age = {
- validators: {
- min: 10,
- max: 20
- }
- };
-
- scope.$digest();
- });
-
- it('should validate required', () => {
- scope.model.first_name = null;
- scope.$digest();
-
- expect(isolatedScope.testForm.first_name.$valid).toBeFalsy();
- expect(isolatedScope.testForm.first_name.$error.required).toBeTruthy();
- });
-
- it('should validate minlength', () => {
- scope.model.first_name = 'short';
- scope.$digest();
-
- expect(isolatedScope.testForm.first_name.$valid).toBeFalsy();
- expect(isolatedScope.testForm.first_name.$error.minlength).toBeTruthy();
- });
-
- it('should validate maxlength', () => {
- scope.model.first_name = 'this is way too long!';
- scope.$digest();
-
- expect(isolatedScope.testForm.first_name.$valid).toBeFalsy();
- expect(isolatedScope.testForm.first_name.$error.maxlength).toBeTruthy();
- });
-
- it('should validate min', () => {
- // not validating min and max for now
- scope.model.age = 8;
- scope.$digest();
-
- expect(isolatedScope.testForm.age.$valid).toBeFalsy();
- expect(isolatedScope.testForm.age.$error.min).toBeTruthy();
- });
- });
-
- describe('when a deep model is passed', () => {
-
- beforeEach(inject(($rootScope) => {
-
- scope = $rootScope.$new();
-
- scope.config = {
- exclude: ['excludedField'],
- formName: 'testForm',
- actions: [
- {
- label: 'Save',
- icon: 'ok', // refers to bootstraps glyphicon
- cb: cb,
- class: 'success'
- }
- ],
- fields: {
- object_field: {
- field_one: {
- label: 'Custom Label'
- }
- }
- }
- };
-
- scope.model = {
- object_field: {
- field_one: 'bar',
- number: 1,
- email: 'teo@onlab.us'
- }
- };
-
- compileElement();
- }));
-
- it('should print nested field', () => {
- expect($(element).find('input').length).toBe(3);
- });
-
- xit('should configure nested fields', () => {
- let custom_label = $(element).find('input[name=field_one]').parent().find('label');
- expect(custom_label.text()).toBe('Custom Label');
- });
+ it('should show an error feedback', function() {
+ fb(false);
+ scope.$digest();
+ expect(isolatedScope.config.feedback.type).toEqual('danger');
+ expect(fb).toHaveBeenCalledWith(false);
+ expect($(element).find('xos-alert > div')).toHaveClass('alert alert-danger');
});
});
diff --git a/views/ngXosLib/xosHelpers/spec/ui/validation.test.js b/views/ngXosLib/xosHelpers/spec/ui/validation.test.js
index f8350ed..1029f2d 100644
--- a/views/ngXosLib/xosHelpers/spec/ui/validation.test.js
+++ b/views/ngXosLib/xosHelpers/spec/ui/validation.test.js
@@ -15,7 +15,7 @@
if(!scope){
scope = rootScope.$new();
}
- if(!angular.isDefined(element)){
+ if(angular.isUndefined(element)){
element = angular.element('<xos-validation field="field" form="form"></xos-validation>');
}
compile(element)(scope);
diff --git a/views/ngXosLib/xosHelpers/src/services/helpers/ui/form.helpers.js b/views/ngXosLib/xosHelpers/src/services/helpers/ui/form.helpers.js
index bc6a503..0a9d3ec 100644
--- a/views/ngXosLib/xosHelpers/src/services/helpers/ui/form.helpers.js
+++ b/views/ngXosLib/xosHelpers/src/services/helpers/ui/form.helpers.js
@@ -60,7 +60,7 @@
}
// if null return string
- if(typeof value === 'string' || value === null){
+ if(angular.isString(value) || value === null){
return 'text';
}
diff --git a/views/ngXosLib/xosHelpers/src/services/helpers/user-prefs.service.js b/views/ngXosLib/xosHelpers/src/services/helpers/user-prefs.service.js
index 27edf7f..7bf8ae1 100644
--- a/views/ngXosLib/xosHelpers/src/services/helpers/user-prefs.service.js
+++ b/views/ngXosLib/xosHelpers/src/services/helpers/user-prefs.service.js
@@ -23,7 +23,7 @@
.service('XosUserPrefs', function($cookies){
- let userPrefs = $cookies.get('xosUserPrefs') ? JSON.parse($cookies.get('xosUserPrefs')) : {};
+ let userPrefs = $cookies.get('xosUserPrefs') ? angular.fromJson($cookies.get('xosUserPrefs')) : {};
/**
* @ngdoc method
@@ -34,7 +34,7 @@
* @returns {object} The user preferences
**/
this.getAll = () => {
- userPrefs = $cookies.get('xosUserPrefs') ? JSON.parse($cookies.get('xosUserPrefs')) : {};
+ userPrefs = $cookies.get('xosUserPrefs') ? angular.fromJson($cookies.get('xosUserPrefs')) : {};
return userPrefs;
};
@@ -47,7 +47,7 @@
* @param {object} prefs The user preferences
**/
this.setAll = (prefs) => {
- $cookies.put('xosUserPrefs', JSON.stringify(prefs));
+ $cookies.put('xosUserPrefs', angular.toJson(prefs));
};
/**
diff --git a/views/ngXosLib/xosHelpers/src/services/log.decorator.js b/views/ngXosLib/xosHelpers/src/services/log.decorator.js
index b8c5297..e6bd621 100644
--- a/views/ngXosLib/xosHelpers/src/services/log.decorator.js
+++ b/views/ngXosLib/xosHelpers/src/services/log.decorator.js
@@ -1,5 +1,7 @@
// TODO write tests for log
+/* eslint-disable angular/ng_window_service*/
+
angular.module('xos.helpers')
.config([ '$provide', function( $provide )
{
@@ -11,7 +13,7 @@
const isLogEnabled = () => {
return window.location.href.indexOf('debug=true') >= 0;
- }
+ };
// Save the original $log.debug()
let logFn = $delegate.log;
let infoFn = $delegate.info;
@@ -34,7 +36,7 @@
args[0] = `[${now.getHours()}:${now.getMinutes()}:${now.getSeconds()}] ${args[0]}`;
// HACK awfull fix for angular mock implementation whithin jasmine test failing issue
- if (typeof $delegate.reset === 'function' && !($delegate.debug.logs instanceof Array)) {
+ if (angular.isFunction($delegate.reset) && !($delegate.debug.logs instanceof Array)) {
// if we are within the mock and did not reset yet, we call it to avoid issue
// console.log('mock log impl fix to avoid logs array not existing...');
$delegate.reset();
diff --git a/views/ngXosLib/xosHelpers/src/services/notification.service.js b/views/ngXosLib/xosHelpers/src/services/notification.service.js
index e190451..9a1598e 100644
--- a/views/ngXosLib/xosHelpers/src/services/notification.service.js
+++ b/views/ngXosLib/xosHelpers/src/services/notification.service.js
@@ -1,3 +1,4 @@
+/* eslint-disable angular/ng_window_service*/
(function() {
'use strict';
diff --git a/views/ngXosLib/xosHelpers/src/ui_components/dumbComponents/form/form.component.js b/views/ngXosLib/xosHelpers/src/ui_components/dumbComponents/form/form.component.js
index ca6d7d8..1706483 100644
--- a/views/ngXosLib/xosHelpers/src/ui_components/dumbComponents/form/form.component.js
+++ b/views/ngXosLib/xosHelpers/src/ui_components/dumbComponents/form/form.component.js
@@ -253,22 +253,16 @@
this.excludedField = this.excludedField.concat(this.config.exclude);
}
-
this.formField = [];
+
$scope.$watch(() => this.config, ()=> {
-
-
-
if(!this.ngModel){
return;
}
let diff = _.difference(Object.keys(this.ngModel), this.excludedField);
let modelField = XosFormHelpers.parseModelField(diff);
this.formField = XosFormHelpers.buildFormStructure(modelField, this.config.fields, this.ngModel);
-
-
- } ,true);
-
+ }, true);
$scope.$watch(() => this.ngModel, (model) => {
// empty from old stuff
diff --git a/views/ngXosLib/xosHelpers/src/ui_components/dumbComponents/table/table.component.js b/views/ngXosLib/xosHelpers/src/ui_components/dumbComponents/table/table.component.js
index 6092f42..94e2ab3 100644
--- a/views/ngXosLib/xosHelpers/src/ui_components/dumbComponents/table/table.component.js
+++ b/views/ngXosLib/xosHelpers/src/ui_components/dumbComponents/table/table.component.js
@@ -388,7 +388,7 @@
</tbody>
<tbody>
<tr ng-repeat="item in vm.data | filter:vm.query:vm.comparator | orderBy:vm.orderBy:vm.reverse | pagination:vm.currentPage * vm.config.pagination.pageSize | limitTo: (vm.config.pagination.pageSize || vm.data.length) track by $index">
- <td ng-repeat="col in vm.columns" link-wrapper>
+ <td ng-repeat="col in vm.columns" xos-link-wrapper>
<span ng-if="!col.type">{{item[col.prop]}}</span>
<span ng-if="col.type === 'boolean'">
<i class="glyphicon"
@@ -534,7 +534,7 @@
}
})
// TODO test
- .directive('linkWrapper', function() {
+ .directive('xosLinkWrapper', function() {
return {
restrict: 'A',
transclude: true,
diff --git a/views/ngXosLib/xosHelpers/src/ui_components/smartComponents/smartTable/smartTable.component.js b/views/ngXosLib/xosHelpers/src/ui_components/smartComponents/smartTable/smartTable.component.js
index 08844f6..622952f 100644
--- a/views/ngXosLib/xosHelpers/src/ui_components/smartComponents/smartTable/smartTable.component.js
+++ b/views/ngXosLib/xosHelpers/src/ui_components/smartComponents/smartTable/smartTable.component.js
@@ -242,7 +242,7 @@
prop: p
};
- if(typeof item[p] !== 'string' && typeof item[p] !== 'undefined'){
+ if(angular.isString(item[p]) && typeof item[p] !== 'undefined'){
fieldConfig.type = typeof item[p];
}
diff --git a/views/ngXosLib/xosHelpers/src/xosHelpers.module.js b/views/ngXosLib/xosHelpers/src/xosHelpers.module.js
index fe246a6..3d534b9 100644
--- a/views/ngXosLib/xosHelpers/src/xosHelpers.module.js
+++ b/views/ngXosLib/xosHelpers/src/xosHelpers.module.js
@@ -1,6 +1,8 @@
(function() {
'use strict';
-
+
+ /* eslint-disable angular/ng_module_name */
+
angular.module('bugSnag', []).factory('$exceptionHandler', function () {
return function (exception, cause) {
if( window.Bugsnag ){
@@ -12,6 +14,8 @@
};
});
+ /* eslint-enable angular/ng_module_name */
+
/**
* @ngdoc overview
* @name xos.helpers