diff --git a/front/core/components/button-menu/index.spec.js b/front/core/components/button-menu/index.spec.js index 1e8c048ff6..87f6770015 100644 --- a/front/core/components/button-menu/index.spec.js +++ b/front/core/components/button-menu/index.spec.js @@ -14,7 +14,7 @@ describe('Component vnButtonMenu', () => { $element.remove(); }); - describe('onClick(event)', () => { + describe('onButtonClick(event)', () => { it(`should emit the open event`, () => { spyOn(controller, 'emit'); @@ -23,7 +23,7 @@ describe('Component vnButtonMenu', () => { bubbles: true, cancelable: true }); - controller.onClick(event); + controller.onButtonClick(event); expect(controller.emit).toHaveBeenCalledWith('open'); }); diff --git a/front/core/components/searchbar/__snapshots__/searchbar.spec.js.snap b/front/core/components/searchbar/__snapshots__/searchbar.spec.js.snap deleted file mode 100644 index 698e1ba889..0000000000 --- a/front/core/components/searchbar/__snapshots__/searchbar.spec.js.snap +++ /dev/null @@ -1,17 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Component vnSearchbar doSearch() should define searchString, call onSearch and the model applyFilter method 1`] = `"function search() { [native code] } 0:i 1:d 2:: 3:( ) 4:1 5:2 6:3 7:4 8:5 9:6"`; - -exports[`Component vnSearchbar onPanelSubmit() should hide the popover, and set the filter as it wasn't defined 1`] = `Object {}`; - -exports[`Component vnSearchbar onPanelSubmit() should hide the popover, compact the filter 1`] = ` -Object { - "id": 999, -} -`; - -exports[`Component vnSearchbar onSubmit() should define the controller's filter 1`] = ` -Object { - "search": "id: 999", -} -`; diff --git a/front/core/components/searchbar/searchbar.js b/front/core/components/searchbar/searchbar.js index 9797d50573..98f52ee36a 100644 --- a/front/core/components/searchbar/searchbar.js +++ b/front/core/components/searchbar/searchbar.js @@ -32,28 +32,46 @@ export default class Controller extends Component { this.deregisterCallback(); } + get filter() { + return this._filter; + } + + set filter(value) { + this._filter = value; + this.toBar(value); + } + get shownFilter() { return this.filter != null ? this.filter : this.suggestedFilter; } + get searchString() { + return this._searchString; + } + + set searchString(value) { + this._searchString = value; + if (value == null) this.params = []; + } + onStateChange() { + let filter = null; + if (this.$state.is(this.searchState)) { - if (this.$state.params.q) { + if (this.$params.q) { try { - this.filter = JSON.parse(this.$state.params.q); + filter = JSON.parse(this.$params.q); } catch (e) { console.error(e); } - } else - this.filter = null; + } focus(this.element.querySelector('vn-textfield input')); - } else - this.filter = null; + } - this.toBar(this.filter); + this.filter = filter; } openPanel(event) { @@ -94,16 +112,9 @@ export default class Controller extends Component { this.doSearch(this.fromBar()); } - get searchString() { - return this._searchString; - } - - set searchString(value) { - this._searchString = value; - if (value == null) this.params = []; - } - doSearch(filter) { + this.filter = filter; + let opts = this.$state.is(this.searchState) ? {location: 'replace'} : null; this.$state.go(this.searchState, diff --git a/front/core/components/searchbar/searchbar.spec.js b/front/core/components/searchbar/searchbar.spec.js index 4cd7ec74a6..f923f12b54 100644 --- a/front/core/components/searchbar/searchbar.spec.js +++ b/front/core/components/searchbar/searchbar.spec.js @@ -4,164 +4,149 @@ describe('Component vnSearchbar', () => { let controller; let $element; let $state; + let $params; let $scope; + let filter = {id: 1, search: 'needle'}; beforeEach(ngModule('vnCore')); - beforeEach(angular.mock.inject(($componentController, _$state_, $rootScope) => { + beforeEach(angular.mock.inject(($componentController, $rootScope, _$state_) => { $scope = $rootScope.$new(); $state = _$state_; - $element = angular.element(``); + $params = $state.params; + + $params.q = JSON.stringify(filter); + + $element = angular.element(`
`); controller = $componentController('vnSearchbar', {$element, $scope}); controller.panel = 'vn-client-search-panel'; })); describe('$postLink()', () => { - it(`should not call onStateChange() if filter is defined`, () => { - spyOn(controller, 'onStateChange'); - controller.filter = {}; - + it(`should fetch the filter from the state if it's in the filter state`, () => { controller.$postLink(); - expect(controller.onStateChange).not.toHaveBeenCalledWith(); + expect(controller.filter).toEqual(filter); + expect(controller.searchString).toBe('needle'); + expect(controller.params.length).toBe(1); }); - it(`should call onStateChange() if filter is null`, () => { - spyOn(controller, 'onStateChange'); - controller.filter = null; - + it(`should not fetch the filter from the state if not in the filter state`, () => { + controller.searchState = 'other.state'; controller.$postLink(); - expect(controller.onStateChange).toHaveBeenCalledWith(); - }); - }); - - describe('onStateChange()', () => { - it(`should set a formated _filter in the controller`, () => { - spyOn(controller, 'doSearch'); - Object.assign($state.params, {q: '{"id": 999}'}); - - controller.onStateChange(); - - expect(controller._filter).toEqual({id: 999}); - expect(controller.doSearch).toHaveBeenCalledWith(); - }); - }); - - describe('shownFilter() getter', () => { - it(`should return the _filter if not NULL`, () => { - controller.filter = '{"id": 999}'; - - let shownFilter = controller.shownFilter; - - expect(shownFilter).toEqual(controller._filter); - expect(shownFilter).not.toEqual(controller.suggestedFilter); - }); - - it(`should return the suggested filter if filter is NULL`, () => { - controller.suggestedFilter = '{"id": 888}'; - - let shownFilter = controller.shownFilter; - - expect(shownFilter).not.toEqual(controller._filter); - expect(shownFilter).toEqual(controller.suggestedFilter); + expect(controller.filter).toBeNull(); + expect(controller.searchString).toBeNull(); + expect(controller.params.length).toBe(0); }); }); describe('filter() setter', () => { - it(`should call $state.go() to replace the current state location instead of creating a new one`, () => { - controller._filter = {}; - spyOn($state, 'go'); - controller.filter = {expected: 'filter'}; + it(`should update the bar params and search`, () => { + let withoutHours = new Date(2000, 1, 1); + let withHours = new Date(withoutHours.getTime()); + withHours.setHours(12, 30, 15, 10); - expect(controller._filter).toEqual(controller.filter); - expect($state.go).toHaveBeenCalledWith('.', Object({q: '{"expected":"filter"}'}), Object({location: 'replace'})); + controller.filter = { + search: 'needle', + withHours: withHours.toJSON(), + withoutHours: withoutHours.toJSON(), + boolean: true, + negated: false, + myObjectProp: {myProp: 1} + }; + + let chips = {}; + for (let param of controller.params || []) + chips[param.key] = param.chip; + + expect(controller.searchString).toBe('needle'); + expect(chips.withHours).toBe('withHours: 2000-02-01 12:30'); + expect(chips.withoutHours).toBe('withoutHours: 2000-02-01'); + expect(chips.boolean).toBe('boolean'); + expect(chips.negated).toBe('not negated'); + expect(chips.myObjectProp).toBe('myObjectProp'); + }); + }); + + describe('shownFilter() getter', () => { + it(`should return the _filter if not null`, () => { + controller.filter = filter; + controller.suggestedFilter = {sugestedParam: 'suggestedValue'}; + + expect(controller.shownFilter).toEqual(filter); + }); + + it(`should return the suggested filter if filter is null`, () => { + controller.filter = null; + controller.suggestedFilter = {sugestedParam: 'suggestedValue'}; + + expect(controller.shownFilter).toEqual(controller.suggestedFilter); + }); + }); + + describe('searchString() setter', () => { + it(`should clear the whole filter when it's null`, () => { + controller.filter = filter; + controller.searchString = null; + + expect(controller.searchString).toBeNull(); + expect(controller.params.length).toBe(0); }); }); describe('onPanelSubmit()', () => { - it(`should hide the popover, and set the filter as it wasn't defined`, () => { + it(`should compact and define the filter`, () => { controller.$.popover = {hide: jasmine.createSpy('hide')}; - const filter = undefined; + const filter = { + id: 1, + thisKeyShouldBePurged: null, + alsoThis: [], + andThis: {emptyProp: undefined, nullProp: null}, + dontForgetThis: [null, undefined], + myObject: {keepThis: true, butNotThis: null}, + myArray: [null, undefined, true] + }; controller.onPanelSubmit(filter); - expect(controller.filter).toMatchSnapshot(); - }); - - it(`should hide the popover, compact the filter`, () => { - controller.$.popover = {hide: jasmine.createSpy('hide')}; - const filter = {id: 999, thisKeyShouldBePurged: null}; - - controller.onPanelSubmit(filter); - - expect(controller.filter).toMatchSnapshot(); + expect(controller.filter).toEqual({ + id: 1, + myObject: {keepThis: true}, + myArray: [true] + }); }); }); describe('onSubmit()', () => { - it(`should define the controller's filter`, () => { - controller.searchString = 'id: 999'; + it(`should define the filter`, () => { + controller.filter = filter; + controller.searchString = 'mySearch'; controller.onSubmit(); - expect(controller.filter).toMatchSnapshot(); + expect(controller.filter).toEqual({id: 1, search: 'mySearch'}); + }); + }); + + describe('removeParam()', () => { + it(`should remove the parameter from the filter`, () => { + controller.filter = filter; + controller.removeParam(0); + + expect(controller.filter).toEqual({search: 'needle'}); }); }); describe('doSearch()', () => { - it(`should define searchString, call onSearch and the model applyFilter method`, () => { - controller._filter = 'id: 123456'; - controller.autoload = true; - controller.onSearch = jasmine.createSpy('onSearch'); - controller.model = {applyFilter: jasmine.createSpy('applyFilter')}; - controller.paramBuilder = jasmine.createSpy('paramBuilder').and.returnValue({'param': `${controller._filter}`}); + it(`should go to the search state and pass the filter as query param`, () => { + spyOn($state, 'go'); + controller.searchState = 'search.state'; + controller.doSearch(filter); + let queryParams = {q: JSON.stringify(filter)}; - controller.doSearch(); - - expect(controller.searchString).toMatchSnapshot(); - expect(controller.onSearch).toHaveBeenCalledWith({'$params': `${controller._filter}`}); - expect(controller.model.applyFilter).toHaveBeenCalledWith(jasmine.any(Object), jasmine.any(Object)); - }); - - it(`should define searchString, call onSearch and the model clear method`, () => { - controller._filter = null; - controller.autoload = false; - controller.onSearch = jasmine.createSpy('onSearch'); - controller.model = {clear: jasmine.createSpy('clear')}; - controller.paramBuilder = jasmine.createSpy('paramBuilder').and.returnValue({'param': `${controller._filter}`}); - - - controller.doSearch(); - - expect(controller.searchString).toEqual(''); - expect(controller.onSearch).toHaveBeenCalledWith({'$params': null}); - expect(controller.model.clear).toHaveBeenCalledWith(); - }); - }); - - describe('getObjectFromString()', () => { - it(`should return a formated object based on the string received for basic search`, () => { - let result = controller.getObjectFromString('Bruce Wayne'); - - expect(result).toEqual({search: 'Bruce Wayne'}); - }); - - it(`should return a formated object based on the string received for advanced search`, () => { - let result = controller.getObjectFromString('id:101 name:(Bruce Wayne)'); - - expect(result).toEqual({id: '101', name: 'Bruce Wayne'}); - }); - - it(`should format the object grouping any unmatched part of the instring of the string to the search property`, () => { - let string = 'I am the search id:101 name:(Bruce Wayne) concatenated value'; - let result = controller.getObjectFromString(string); - - expect(result).toEqual({ - id: '101', - name: 'Bruce Wayne', - search: 'I am the search concatenated value' - }); + expect($state.go).toHaveBeenCalledWith('search.state', queryParams, null); + expect(controller.filter).toEqual(filter); }); }); }); diff --git a/modules/client/front/index/index.js b/modules/client/front/index/index.js index 842d8c724f..56ab594ff8 100644 --- a/modules/client/front/index/index.js +++ b/modules/client/front/index/index.js @@ -47,10 +47,8 @@ export default class Controller { event.preventDefault(); event.stopPropagation(); - let state = `ticket.index`; - let params = {q: `{"clientFk": ${client.id}}`}; - - this.$state.go(state, params); + this.$state.go(`ticket.index`, + {q: JSON.stringify({clientFk: client.id})}); } } Controller.$inject = ['$scope', '$state']; diff --git a/modules/client/front/index/index.spec.js b/modules/client/front/index/index.spec.js index e89f43cb3c..da149838da 100644 --- a/modules/client/front/index/index.spec.js +++ b/modules/client/front/index/index.spec.js @@ -1,27 +1,25 @@ import './index'; describe('Client index', () => { - let $scope; + let $state; let controller; beforeEach(ngModule('client')); - beforeEach(angular.mock.inject(($componentController, $rootScope, $state) => { - $scope = $rootScope.$new(); - controller = $componentController('vnClientIndex', {$scope, $state}); + beforeEach(angular.mock.inject(($componentController, _$state_) => { + $state = _$state_; + controller = $componentController('vnClientIndex'); })); describe('filterTickets()', () => { it('should navigate to the ticket index using params as filter', () => { const client = {id: 101}; - const event = {preventDefault: () => {}}; - spyOn(event, 'preventDefault'); - spyOn(controller.$state, 'go'); + const event = new MouseEvent('click', {cancelable: true}); + spyOn($state, 'go'); controller.filterTickets(client, event); - expect(event.preventDefault).toHaveBeenCalledWith(); - expect(controller.$state.go).toHaveBeenCalledWith('ticket.index', jasmine.any(Object)); + expect($state.go).toHaveBeenCalledWith('ticket.index', jasmine.any(Object)); }); }); });