GUI -- onos-sortable-header will get the controller to use the restService to up…
…date the table data. Query parameters were created based on colId and sort direction. Change-Id: I27bc6ebab9f8f1ba332b4480171b8afc3a4fd3c4
Showing
5 changed files
with
83 additions
and
58 deletions
| ... | @@ -21,8 +21,12 @@ | ... | @@ -21,8 +21,12 @@ |
| 21 | 'use strict'; | 21 | 'use strict'; |
| 22 | 22 | ||
| 23 | var $log, $window, fs, is, | 23 | var $log, $window, fs, is, |
| 24 | + div, | ||
| 25 | + currCol = {}, | ||
| 26 | + prevCol = {}, | ||
| 24 | bottomMargin = 200; | 27 | bottomMargin = 200; |
| 25 | 28 | ||
| 29 | + | ||
| 26 | // Render a plain d3 table by giving it the div, a config file, and data | 30 | // Render a plain d3 table by giving it the div, a config file, and data |
| 27 | 31 | ||
| 28 | function renderTable(div, config, data) { | 32 | function renderTable(div, config, data) { |
| ... | @@ -106,6 +110,50 @@ | ... | @@ -106,6 +110,50 @@ |
| 106 | setTableHeight(th, tb); | 110 | setTableHeight(th, tb); |
| 107 | } | 111 | } |
| 108 | 112 | ||
| 113 | + function updateSortingIcons(thElem, api) { | ||
| 114 | + currCol.colId = thElem.attr('colId'); | ||
| 115 | + | ||
| 116 | + if (currCol.colId === prevCol.colId) { | ||
| 117 | + (currCol.icon === 'tableColSortDesc') ? | ||
| 118 | + currCol.icon = 'tableColSortAsc' : | ||
| 119 | + currCol.icon = 'tableColSortDesc'; | ||
| 120 | + prevCol.icon = currCol.icon; | ||
| 121 | + } else { | ||
| 122 | + currCol.icon = 'tableColSortAsc'; | ||
| 123 | + prevCol.icon = 'tableColSortNone'; | ||
| 124 | + } | ||
| 125 | + | ||
| 126 | + div = thElem.select('div'); | ||
| 127 | + div.remove(); | ||
| 128 | + div = thElem.append('div'); | ||
| 129 | + | ||
| 130 | + if (currCol.icon === 'tableColSortAsc') { | ||
| 131 | + api.sortAsc(div); | ||
| 132 | + } else { | ||
| 133 | + api.sortDesc(div); | ||
| 134 | + } | ||
| 135 | + | ||
| 136 | + if (prevCol.colId !== undefined && | ||
| 137 | + prevCol.icon === 'tableColSortNone') { | ||
| 138 | + api.sortNone(prevCol.elem.select('div')); | ||
| 139 | + } | ||
| 140 | + | ||
| 141 | + prevCol.colId = currCol.colId; | ||
| 142 | + prevCol.elem = thElem; | ||
| 143 | + } | ||
| 144 | + | ||
| 145 | + function generateQueryParams() { | ||
| 146 | + var queryString = '?sortCol=' + currCol.colId + '&sortDir='; | ||
| 147 | + | ||
| 148 | + if(currCol.icon === 'tableColSortAsc') { | ||
| 149 | + queryString = queryString + 'asc'; | ||
| 150 | + } else { | ||
| 151 | + queryString = queryString + 'desc'; | ||
| 152 | + } | ||
| 153 | + | ||
| 154 | + return queryString; | ||
| 155 | + } | ||
| 156 | + | ||
| 109 | angular.module('onosWidget') | 157 | angular.module('onosWidget') |
| 110 | .factory('TableService', [function () { | 158 | .factory('TableService', [function () { |
| 111 | return { | 159 | return { |
| ... | @@ -158,66 +206,31 @@ | ... | @@ -158,66 +206,31 @@ |
| 158 | 206 | ||
| 159 | .directive('onosSortableHeader', ['$log', 'IconService', | 207 | .directive('onosSortableHeader', ['$log', 'IconService', |
| 160 | function (_$log_, _is_) { | 208 | function (_$log_, _is_) { |
| 161 | - return function (scope, element, attrs) { | 209 | + return { |
| 210 | + scope: { | ||
| 211 | + ctrlCallback: '&sortCallback' | ||
| 212 | + }, | ||
| 213 | + link: function (scope, element, attrs) { | ||
| 162 | $log = _$log_; | 214 | $log = _$log_; |
| 163 | is = _is_; | 215 | is = _is_; |
| 164 | var table = d3.select(element[0]), | 216 | var table = d3.select(element[0]), |
| 165 | - currCol = {}, | ||
| 166 | - prevCol = {}, | ||
| 167 | sortIconAPI = is.createSortIcon(); | 217 | sortIconAPI = is.createSortIcon(); |
| 168 | 218 | ||
| 169 | - // when a header is clicked, change its icon tag and get sorting | 219 | + // when a header is clicked, change its icon tag |
| 170 | - // order to send to the server. | 220 | + // and get sorting order to send to the server. |
| 171 | table.selectAll('th').on('click', function () { | 221 | table.selectAll('th').on('click', function () { |
| 172 | - var thElem = d3.select(this), | 222 | + var thElem = d3.select(this); |
| 173 | - div; | ||
| 174 | - | ||
| 175 | - currCol.colId = thElem.attr('colId'); | ||
| 176 | - | ||
| 177 | - if (currCol.colId === prevCol.colId) { | ||
| 178 | - (currCol.icon === 'tableColSortDesc') ? | ||
| 179 | - currCol.icon = 'tableColSortAsc' : | ||
| 180 | - currCol.icon = 'tableColSortDesc'; | ||
| 181 | - prevCol.icon = currCol.icon; | ||
| 182 | - } else { | ||
| 183 | - currCol.icon = 'tableColSortAsc'; | ||
| 184 | - prevCol.icon = 'tableColSortNone'; | ||
| 185 | - } | ||
| 186 | - | ||
| 187 | - $log.debug('currCol clicked: ' + currCol.colId + | ||
| 188 | - ', with sorting icon: ' + currCol.icon); | ||
| 189 | - $log.debug('prevCol clicked: ' + prevCol.colId + | ||
| 190 | - ', with its current sorting icon as ' + prevCol.icon); | ||
| 191 | - | ||
| 192 | - div = thElem.select('div'); | ||
| 193 | - div.remove(); | ||
| 194 | - | ||
| 195 | - div = thElem.append('div'); | ||
| 196 | 223 | ||
| 197 | - if (currCol.icon === 'tableColSortAsc') { | 224 | + if (thElem.attr('sortable') === '') { |
| 198 | - sortIconAPI.sortAsc(div); | 225 | + updateSortingIcons(thElem, sortIconAPI); |
| 199 | - } else { | 226 | + // call the ctrl's rest callback function |
| 200 | - sortIconAPI.sortDesc(div); | 227 | + scope.ctrlCallback({ |
| 201 | - } | 228 | + urlSuffix: generateQueryParams() |
| 202 | - | 229 | + }); |
| 203 | - if (prevCol.colId !== undefined && | ||
| 204 | - prevCol.icon === 'tableColSortNone') { | ||
| 205 | - sortIconAPI.sortNone(prevCol.elem.select('div')); | ||
| 206 | } | 230 | } |
| 207 | - | ||
| 208 | - prevCol.colId = currCol.colId; | ||
| 209 | - prevCol.elem = thElem; | ||
| 210 | - | ||
| 211 | }); | 231 | }); |
| 212 | - | ||
| 213 | - // TODO: send the prev and currCol info to the server to use in sorting table | ||
| 214 | - | ||
| 215 | - // TODO: figure out timing of events: | ||
| 216 | - // updating the icon | ||
| 217 | - // sending the column sorting info to the server | ||
| 218 | - // refreshing the table so that the new rows will be sorted | ||
| 219 | - | ||
| 220 | } | 232 | } |
| 233 | + }; | ||
| 221 | }]); | 234 | }]); |
| 222 | 235 | ||
| 223 | }()); | 236 | }()); | ... | ... |
| ... | @@ -5,7 +5,7 @@ | ... | @@ -5,7 +5,7 @@ |
| 5 | onos-fixed-header | 5 | onos-fixed-header |
| 6 | ng-style="setTableHW()" | 6 | ng-style="setTableHW()" |
| 7 | onos-sortable-header | 7 | onos-sortable-header |
| 8 | - sort-callback="ctrl.sortCallback()"> | 8 | + sort-callback="sortCallback(urlSuffix)"> |
| 9 | <thead> | 9 | <thead> |
| 10 | <tr> | 10 | <tr> |
| 11 | <th colId="available"></th> | 11 | <th colId="available"></th> | ... | ... |
| ... | @@ -22,8 +22,8 @@ | ... | @@ -22,8 +22,8 @@ |
| 22 | 'use strict'; | 22 | 'use strict'; |
| 23 | 23 | ||
| 24 | angular.module('ovDevice', []) | 24 | angular.module('ovDevice', []) |
| 25 | - .controller('OvDeviceCtrl', ['$log', '$location', 'RestService', | 25 | + .controller('OvDeviceCtrl', ['$log', '$scope', '$location', 'RestService', |
| 26 | - function ($log, $location, rs) { | 26 | + function ($log, $scope, $location, rs) { |
| 27 | var self = this; | 27 | var self = this; |
| 28 | self.deviceData = []; | 28 | self.deviceData = []; |
| 29 | 29 | ||
| ... | @@ -31,9 +31,17 @@ | ... | @@ -31,9 +31,17 @@ |
| 31 | var testCase = $location.search().test; | 31 | var testCase = $location.search().test; |
| 32 | var url = testCase ? 'test/' + testCase : 'device'; | 32 | var url = testCase ? 'test/' + testCase : 'device'; |
| 33 | 33 | ||
| 34 | + $scope.sortCallback = function (urlSuffix) { | ||
| 35 | + if (!urlSuffix) { | ||
| 36 | + urlSuffix = ''; | ||
| 37 | + } | ||
| 38 | + url = 'device' + urlSuffix; | ||
| 34 | rs.get(url, function (data) { | 39 | rs.get(url, function (data) { |
| 35 | self.deviceData = data.devices; | 40 | self.deviceData = data.devices; |
| 36 | }); | 41 | }); |
| 42 | + }; | ||
| 43 | + | ||
| 44 | + $scope.sortCallback(); | ||
| 37 | 45 | ||
| 38 | $log.log('OvDeviceCtrl has been created'); | 46 | $log.log('OvDeviceCtrl has been created'); |
| 39 | }]); | 47 | }]); | ... | ... |
| ... | @@ -64,7 +64,7 @@ describe('factory: fw/layer/flash.js', function () { | ... | @@ -64,7 +64,7 @@ describe('factory: fw/layer/flash.js', function () { |
| 64 | text = item.select('text'); | 64 | text = item.select('text'); |
| 65 | expect(text.size()).toEqual(1); | 65 | expect(text.size()).toEqual(1); |
| 66 | expect(text.text()).toEqual('foo'); | 66 | expect(text.text()).toEqual('foo'); |
| 67 | - }, 500); | 67 | + }, 2000); |
| 68 | }); | 68 | }); |
| 69 | 69 | ||
| 70 | // TODO: testing these time-sensitive behaviors is hard... | 70 | // TODO: testing these time-sensitive behaviors is hard... | ... | ... |
| ... | @@ -21,7 +21,7 @@ describe('Controller: OvDeviceCtrl', function () { | ... | @@ -21,7 +21,7 @@ describe('Controller: OvDeviceCtrl', function () { |
| 21 | // instantiate the Device module | 21 | // instantiate the Device module |
| 22 | beforeEach(module('ovDevice', 'onosRemote')); | 22 | beforeEach(module('ovDevice', 'onosRemote')); |
| 23 | 23 | ||
| 24 | - var $log, $controller, ctrl, $mockHttp; | 24 | + var $log, $scope, $controller, ctrl, $mockHttp; |
| 25 | 25 | ||
| 26 | var fakeData = { | 26 | var fakeData = { |
| 27 | "devices": [{ | 27 | "devices": [{ |
| ... | @@ -40,17 +40,21 @@ describe('Controller: OvDeviceCtrl', function () { | ... | @@ -40,17 +40,21 @@ describe('Controller: OvDeviceCtrl', function () { |
| 40 | }] | 40 | }] |
| 41 | }; | 41 | }; |
| 42 | 42 | ||
| 43 | - beforeEach(inject(function(_$log_, _$controller_, $httpBackend) { | 43 | + beforeEach(inject(function(_$log_, $rootScope, _$controller_, $httpBackend) { |
| 44 | $log = _$log_; | 44 | $log = _$log_; |
| 45 | + $scope = $rootScope.$new(); | ||
| 45 | $controller = _$controller_; | 46 | $controller = _$controller_; |
| 46 | $mockHttp = $httpBackend; | 47 | $mockHttp = $httpBackend; |
| 47 | 48 | ||
| 48 | $mockHttp.whenGET(/\/device$/).respond(fakeData); | 49 | $mockHttp.whenGET(/\/device$/).respond(fakeData); |
| 49 | })); | 50 | })); |
| 50 | 51 | ||
| 51 | - it('should be an empty array', function () { | 52 | + it('should be an empty array and then have device data', function () { |
| 52 | - ctrl = $controller('OvDeviceCtrl'); | 53 | + ctrl = $controller('OvDeviceCtrl', { |
| 54 | + $scope: $scope | ||
| 55 | + }); | ||
| 53 | expect(ctrl.deviceData).toEqual([]); | 56 | expect(ctrl.deviceData).toEqual([]); |
| 57 | + $scope.sortCallback(); | ||
| 54 | $mockHttp.flush(); | 58 | $mockHttp.flush(); |
| 55 | expect(ctrl.deviceData).toEqual(fakeData.devices); | 59 | expect(ctrl.deviceData).toEqual(fakeData.devices); |
| 56 | }); | 60 | }); | ... | ... |
-
Please register or login to post a comment