Changed filter function in xosTable to allow filtering on boolean values represented by 0,1 values
diff --git a/views/ngXosLib/karma.conf.js b/views/ngXosLib/karma.conf.js
index 9d880a0..d9bbaa2 100644
--- a/views/ngXosLib/karma.conf.js
+++ b/views/ngXosLib/karma.conf.js
@@ -94,7 +94,7 @@
// available browser launchers: https://npmjs.org/browse/keyword/karma-launcher
browsers: [
'PhantomJS',
- // 'Chrome'
+ //'Chrome'
],
diff --git a/views/ngXosLib/xosHelpers/spec/services/helpers/comparator.test.js b/views/ngXosLib/xosHelpers/spec/services/helpers/comparator.test.js
new file mode 100644
index 0000000..66e26d3
--- /dev/null
+++ b/views/ngXosLib/xosHelpers/spec/services/helpers/comparator.test.js
@@ -0,0 +1,60 @@
+(function () {
+ 'use strict';
+
+ describe('The xos.helper module', function(){
+ describe('The Comparator service', () => {
+
+ let service;
+
+ // load the application module
+ beforeEach(module('xos.helpers'));
+
+ // inject the cartService
+ beforeEach(inject(function (_Comparator_) {
+ // The injector unwraps the underscores (_) from around the parameter names when matching
+ service = _Comparator_;
+ }));
+
+ describe('given a string', () => {
+ it('should return true if expected is substring of actual', () => {
+ const res = service('test', 'te');
+ expect(res).toBeTruthy();
+ });
+
+ it('should return false if expected is not substring of actual', () => {
+ const res = service('test', 'ab');
+ expect(res).toBeFalsy();
+ });
+ });
+
+ describe('given a boolean', () => {
+ it('should return true if values match', () => {
+ expect(service(false, false)).toBeTruthy();
+ expect(service(true, true)).toBeTruthy();
+ expect(service(0, false)).toBeTruthy();
+ expect(service(1, true)).toBeTruthy();
+ });
+
+ it('should return false if values doesn\'t match', () => {
+ expect(service(false, true)).toBeFalsy();
+ expect(service(true, false)).toBeFalsy();
+ expect(service(1, false)).toBeFalsy();
+ expect(service(0, true)).toBeFalsy();
+ });
+ });
+
+ describe('given a number', () => {
+ // NOTE if numbers should we compare with === ??
+ it('should return true if expected is substring of actual', () => {
+ expect(service(12, 1)).toBeTruthy();
+ });
+
+ it('should return false if expected is not substring of actual', () => {
+ expect(service(12, 3)).toBeFalsy();
+ });
+ });
+
+ });
+ });
+
+})();
\ No newline at end of file
diff --git a/views/ngXosLib/xosHelpers/spec/ui/table.test.js b/views/ngXosLib/xosHelpers/spec/ui/table.test.js
index 1535c6e..2ec8006 100644
--- a/views/ngXosLib/xosHelpers/spec/ui/table.test.js
+++ b/views/ngXosLib/xosHelpers/spec/ui/table.test.js
@@ -124,15 +124,22 @@
label: 'Label 1',
prop: 'label-1',
type: 'boolean'
+ },
+ {
+ label: 'Label 2',
+ prop: 'label-2',
+ type: 'boolean'
}
]
};
scope.data = [
{
- 'label-1': true
+ 'label-1': true,
+ 'label-2': 1
},
{
- 'label-1': false
+ 'label-1': false,
+ 'label-2': 0
}
];
compileElement();
@@ -156,6 +163,30 @@
expect(td1).toContainElement('select');
expect(td1).not.toContainElement('input');
});
+
+ it('should correctly filter results', () => {
+ isolatedScope.query = {
+ 'label-1': false
+ };
+ scope.$digest();
+ expect(isolatedScope.query['label-1']).toBeFalsy();
+ var tr = $(element).find('tbody:last-child > tr');
+ var icon = $(tr[0]).find('td i');
+ expect(tr.length).toEqual(1);
+ expect(icon).toHaveClass('glyphicon-remove');
+ });
+
+ it('should correctly filter results if the field is in the form of 0|1', () => {
+ isolatedScope.query = {
+ 'label-2': false
+ };
+ scope.$digest();
+ expect(isolatedScope.query['label-1']).toBeFalsy();
+ var tr = $(element).find('tbody:last-child > tr');
+ var icon = $(tr[0]).find('td i');
+ expect(tr.length).toEqual(1);
+ expect(icon).toHaveClass('glyphicon-remove');
+ });
});
});
diff --git a/views/ngXosLib/xosHelpers/src/services/helpers/ui/comparator.service.js b/views/ngXosLib/xosHelpers/src/services/helpers/ui/comparator.service.js
new file mode 100644
index 0000000..d6978a4
--- /dev/null
+++ b/views/ngXosLib/xosHelpers/src/services/helpers/ui/comparator.service.js
@@ -0,0 +1,51 @@
+(function() {
+ 'use strict';
+
+ /**
+ * @ngdoc service
+ * @name xos.uiComponents.Comparato
+ * @description This factory define a function that replace the native angular.filter comparator. It is done to allow the comparation between (0|1) values with booleans.
+ **/
+
+ angular
+ .module('xos.uiComponents')
+ .factory('Comparator', comparator);
+
+ function comparator() {
+
+ return function(actual, expected){
+ if (angular.isUndefined(actual)) {
+ // No substring matching against `undefined`
+ return false;
+ }
+ if ((actual === null) || (expected === null)) {
+ // No substring matching against `null`; only match against `null`
+ return actual === expected;
+ }
+ if (angular.isObject(expected) || (angular.isObject(actual))){
+ return angular.equals(expected, actual);
+ }
+
+ if(_.isBoolean(actual) || _.isBoolean(expected)){
+ if(actual === 0 || actual === 1){
+ actual = !!actual;
+ }
+ return angular.equals(expected, actual);
+ }
+
+ if(!angular.isString(actual) || !angular.isString(expected)){
+ if(angular.isDefined(actual.toString) && angular.isDefined(expected.toString)){
+ actual = actual.toString();
+ expected = expected.toString();
+ }
+ else {
+ return actual === expected;
+ }
+ }
+
+ actual = actual.toLowerCase() + '';
+ expected = expected.toLowerCase() + '';
+ return actual.indexOf(expected) !== -1;
+ };
+ }
+})();
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 7911b7a..371f46c 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
@@ -387,7 +387,7 @@
</tr>
</tbody>
<tbody>
- <tr ng-repeat="item in vm.data | filter:vm.query | orderBy:vm.orderBy:vm.reverse | pagination:vm.currentPage * vm.config.pagination.pageSize | limitTo: (vm.config.pagination.pageSize || vm.data.length) track by $index">
+ <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>
<span ng-if="!col.type">{{item[col.prop]}}</span>
<span ng-if="col.type === 'boolean'">
@@ -448,7 +448,9 @@
`,
bindToController: true,
controllerAs: 'vm',
- controller: function(_, $scope){
+ controller: function(_, $scope, Comparator){
+
+ this.comparator = Comparator;
this.loader = true;