tableDynamicSpec.js 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537
  1. describe('ng-table-dynamic', function() {
  2. var data = [
  3. { id: 1, name: "Moroni", age: 50, money: -10 },
  4. { id: 2, name: "Tiancum", age: 43, money: 120 },
  5. { id: 3, name: "Jacob", age: 27, money: 5.5 },
  6. { id: 4, name: "Nephi", age: 29, money: -54 },
  7. { id: 5, name: "Enos", age: 34, money: 110 },
  8. { id: 6, name: "Tiancum", age: 43, money: 1000 },
  9. { id: 7, name: "Jacob", age: 27, money: -201 },
  10. { id: 8, name: "Nephi", age: 29, money: 100 },
  11. { id: 9, name: "Enos", age: 34, money: -52.5 },
  12. { id: 10, name: "Tiancum", age: 43, money: 52.1 },
  13. { id: 11, name: "Jacob", age: 27, money: 110 },
  14. { id: 12, name: "Nephi", age: 29, money: -55 },
  15. { id: 13, name: "Enos", age: 34, money: 551 },
  16. { id: 14, name: "Tiancum", age: 43, money: -1410 },
  17. { id: 15, name: "Jacob", age: 27, money: 410 },
  18. { id: 16, name: "Nephi", age: 29, money: 100 },
  19. { id: 17, name: "Enos", age: 34, money: -100 }
  20. ];
  21. beforeEach(module('ngTable'));
  22. var scope;
  23. beforeEach(inject(function($rootScope) {
  24. scope = $rootScope.$new(true);
  25. }));
  26. describe('basics', function(){
  27. var elm;
  28. beforeEach(inject(function($compile, $q, NgTableParams) {
  29. elm = angular.element(
  30. '<div>' +
  31. '<table ng-table-dynamic="tableParams with cols" show-filter="true">' +
  32. '<tr ng-repeat="user in $data">' +
  33. '<td ng-repeat="col in $columns">{{user[col.field]}}</td>' +
  34. '</tr>' +
  35. '</table>' +
  36. '</div>');
  37. function getCustomClass(parmasScope){
  38. if (parmasScope.$column.title().indexOf('Money') !== -1){
  39. return 'moneyHeaderClass';
  40. } else{
  41. return 'customClass';
  42. }
  43. }
  44. function money(/*$column*/) {
  45. var def = $q.defer();
  46. def.resolve([{
  47. 'id': 10,
  48. 'title': '10'
  49. }]);
  50. return def;
  51. }
  52. scope.tableParams = new NgTableParams({}, {});
  53. scope.cols = [
  54. {
  55. 'class': getCustomClass,
  56. field: 'name',
  57. filter: { name: 'text' },
  58. headerTitle: 'Sort by Name',
  59. sortable: 'name',
  60. show: true,
  61. title: 'Name of person'
  62. },
  63. {
  64. 'class': getCustomClass,
  65. field: 'age',
  66. headerTitle: 'Sort by Age',
  67. sortable: 'age',
  68. show: true,
  69. title: 'Age'
  70. },
  71. {
  72. 'class': getCustomClass,
  73. field: 'money',
  74. filter: { action: 'select' },
  75. headerTitle: 'Sort by Money',
  76. filterData: money,
  77. show: true,
  78. title: 'Money'
  79. }
  80. ];
  81. $compile(elm)(scope);
  82. scope.$digest();
  83. }));
  84. it('should create table header', function() {
  85. var thead = elm.find('thead');
  86. expect(thead.length).toBe(1);
  87. var rows = thead.find('tr');
  88. expect(rows.length).toBe(2);
  89. var titles = angular.element(rows[0]).find('th');
  90. expect(titles.length).toBe(3);
  91. expect(angular.element(titles[0]).text().trim()).toBe('Name of person');
  92. expect(angular.element(titles[1]).text().trim()).toBe('Age');
  93. expect(angular.element(titles[2]).text().trim()).toBe('Money');
  94. expect(angular.element(rows[1]).hasClass('ng-table-filters')).toBeTruthy();
  95. var filters = angular.element(rows[1]).find('th');
  96. expect(filters.length).toBe(3);
  97. expect(angular.element(filters[0]).hasClass('filter')).toBeTruthy();
  98. expect(angular.element(filters[1]).hasClass('filter')).toBeTruthy();
  99. expect(angular.element(filters[2]).hasClass('filter')).toBeTruthy();
  100. });
  101. it('should create table header classes', inject(function($compile, $rootScope) {
  102. var thead = elm.find('thead');
  103. var rows = thead.find('tr');
  104. var titles = angular.element(rows[0]).find('th');
  105. expect(angular.element(titles[0]).hasClass('header')).toBeTruthy();
  106. expect(angular.element(titles[1]).hasClass('header')).toBeTruthy();
  107. expect(angular.element(titles[2]).hasClass('header')).toBeTruthy();
  108. expect(angular.element(titles[0]).hasClass('sortable')).toBeTruthy();
  109. expect(angular.element(titles[1]).hasClass('sortable')).toBeTruthy();
  110. expect(angular.element(titles[2]).hasClass('sortable')).toBeFalsy();
  111. expect(angular.element(titles[0]).hasClass('customClass')).toBeTruthy();
  112. expect(angular.element(titles[1]).hasClass('customClass')).toBeTruthy();
  113. expect(angular.element(titles[2]).hasClass('moneyHeaderClass')).toBeTruthy();
  114. }));
  115. it('should create table header titles', function() {
  116. var thead = elm.find('thead');
  117. var rows = thead.find('tr');
  118. var titles = angular.element(rows[0]).find('th');
  119. expect(angular.element(titles[0]).attr('title').trim()).toBe('Sort by Name');
  120. expect(angular.element(titles[1]).attr('title').trim()).toBe('Sort by Age');
  121. expect(angular.element(titles[2]).attr('title').trim()).toBe('Sort by Money');
  122. });
  123. it('should show data-title-text', inject(function(NgTableParams) {
  124. var tbody = elm.find('tbody');
  125. scope.tableParams = new NgTableParams({
  126. page: 1, // show first page
  127. count: 10 // count per page
  128. }, {
  129. total: data.length,
  130. data: data
  131. });
  132. scope.$digest();
  133. var filterRow = angular.element(elm.find('thead').find('tr')[1]);
  134. var filterCells = filterRow.find('th');
  135. expect(angular.element(filterCells[0]).attr('data-title-text').trim()).toBe('Name of person');
  136. expect(angular.element(filterCells[1]).attr('data-title-text').trim()).toBe('Age');
  137. expect(angular.element(filterCells[2]).attr('data-title-text').trim()).toBe('Money');
  138. var dataRows = elm.find('tbody').find('tr');
  139. var dataCells = angular.element(dataRows[0]).find('td');
  140. expect(angular.element(dataCells[0]).attr('data-title-text').trim()).toBe('Name of person');
  141. expect(angular.element(dataCells[1]).attr('data-title-text').trim()).toBe('Age');
  142. expect(angular.element(dataCells[2]).attr('data-title-text').trim()).toBe('Money');
  143. }));
  144. it('should show/hide columns', inject(function(NgTableParams) {
  145. var tbody = elm.find('tbody');
  146. scope.tableParams = new NgTableParams({
  147. page: 1, // show first page
  148. count: 10 // count per page
  149. }, {
  150. total: data.length,
  151. data: data
  152. });
  153. scope.$digest();
  154. var headerRow = angular.element(elm.find('thead').find('tr')[0]);
  155. expect(headerRow.find('th').length).toBe(3);
  156. var filterRow = angular.element(elm.find('thead').find('tr')[1]);
  157. expect(filterRow.find('th').length).toBe(3);
  158. var dataRow = angular.element(elm.find('tbody').find('tr')[0]);
  159. expect(dataRow.find('td').length).toBe(3);
  160. scope.cols[0].show = false;
  161. scope.$digest();
  162. expect(headerRow.find('th').length).toBe(2);
  163. expect(filterRow.find('th').length).toBe(2);
  164. expect(dataRow.find('td').length).toBe(2);
  165. expect(angular.element(headerRow.find('th')[0]).text().trim()).toBe('Age');
  166. expect(angular.element(headerRow.find('th')[1]).text().trim()).toBe('Money');
  167. expect(angular.element(filterRow.find('th')[0]).find('input').length).toBe(0);
  168. expect(angular.element(filterRow.find('th')[1]).find('select').length).toBe(1);
  169. }));
  170. });
  171. describe('add column', function(){
  172. var elm;
  173. beforeEach(inject(function($compile, $q, NgTableParams) {
  174. elm = angular.element(
  175. '<div>' +
  176. '<table ng-table-dynamic="tableParams with cols" show-filter="true">' +
  177. '<tr ng-repeat="user in $data">' +
  178. '<td ng-repeat="col in $columns">{{user[col.field]}}</td>' +
  179. '</tr>' +
  180. '</table>' +
  181. '</div>');
  182. function getCustomClass(parmasScope){
  183. if (parmasScope.$column.title().indexOf('Money') !== -1){
  184. return 'moneyHeaderClass';
  185. } else{
  186. return 'customClass';
  187. }
  188. }
  189. function money(/*$column*/) {
  190. var def = $q.defer();
  191. def.resolve([{
  192. 'id': 10,
  193. 'title': '10'
  194. }]);
  195. return def;
  196. }
  197. scope.tableParams = new NgTableParams({}, {});
  198. scope.cols = [
  199. {
  200. 'class': getCustomClass,
  201. field: 'name',
  202. filter: { name: 'text' },
  203. headerTitle: 'Sort by Name',
  204. sortable: 'name',
  205. show: true,
  206. title: 'Name of person'
  207. },
  208. {
  209. 'class': getCustomClass,
  210. field: 'age',
  211. headerTitle: 'Sort by Age',
  212. sortable: 'age',
  213. show: true,
  214. title: 'Age'
  215. }
  216. ];
  217. $compile(elm)(scope);
  218. scope.$digest();
  219. }));
  220. it('should create table header', function() {
  221. var newCol = {
  222. 'class': 'moneyadd',
  223. field: 'money',
  224. filter: { action: 'select' },
  225. headerTitle: 'Sort by Money',
  226. show: true,
  227. title: 'Money'
  228. };
  229. scope.cols.push(newCol);
  230. scope.$digest();
  231. var thead = elm.find('thead');
  232. expect(thead.length).toBe(1);
  233. var rows = thead.find('tr');
  234. expect(rows.length).toBe(2);
  235. var titles = angular.element(rows[0]).find('th');
  236. expect(titles.length).toBe(3);
  237. expect(angular.element(titles[0]).text().trim()).toBe('Name of person');
  238. expect(angular.element(titles[1]).text().trim()).toBe('Age');
  239. expect(angular.element(titles[2]).text().trim()).toBe('Money');
  240. expect(angular.element(rows[1]).hasClass('ng-table-filters')).toBeTruthy();
  241. var filters = angular.element(rows[1]).find('th');
  242. expect(filters.length).toBe(3);
  243. expect(angular.element(filters[0]).hasClass('filter')).toBeTruthy();
  244. expect(angular.element(filters[1]).hasClass('filter')).toBeTruthy();
  245. expect(angular.element(filters[2]).hasClass('filter')).toBeTruthy();
  246. });
  247. });
  248. describe('title-alt', function() {
  249. var elm;
  250. beforeEach(inject(function($compile, NgTableParams) {
  251. elm = angular.element(
  252. '<table ng-table-dynamic="tableParams with cols">' +
  253. '<tr ng-repeat="user in $data">' +
  254. '<td ng-repeat="col in $columns">{{user[col.field]}}</td>' +
  255. '</tr>' +
  256. '</table>');
  257. scope.cols = [
  258. { field: 'name', title: 'Name of person', titleAlt: 'Name' },
  259. { field: 'age', title: 'Age', titleAlt: 'Age' },
  260. { field: 'money', title: 'Money', titleAlt: '£' }
  261. ];
  262. scope.tableParams = new NgTableParams({
  263. page: 1, // show first page
  264. count: 10 // count per page
  265. }, {
  266. total: data.length,
  267. data: data
  268. });
  269. $compile(elm)(scope);
  270. scope.$digest();
  271. }));
  272. it('should show as data-title-text', inject(function($compile) {
  273. var filterRow = angular.element(elm.find('thead').find('tr')[1]);
  274. var filterCells = filterRow.find('th');
  275. expect(angular.element(filterCells[0]).attr('data-title-text').trim()).toBe('Name');
  276. expect(angular.element(filterCells[1]).attr('data-title-text').trim()).toBe('Age');
  277. expect(angular.element(filterCells[2]).attr('data-title-text').trim()).toBe('£');
  278. var dataRows = elm.find('tbody').find('tr');
  279. var dataCells = angular.element(dataRows[0]).find('td');
  280. expect(angular.element(dataCells[0]).attr('data-title-text').trim()).toBe('Name');
  281. expect(angular.element(dataCells[1]).attr('data-title-text').trim()).toBe('Age');
  282. expect(angular.element(dataCells[2]).attr('data-title-text').trim()).toBe('£');
  283. }));
  284. });
  285. describe('filters', function(){
  286. var elm;
  287. beforeEach(inject(function($compile, NgTableParams) {
  288. elm = angular.element(
  289. '<table ng-table-dynamic="tableParams with cols" show-filter="true">' +
  290. '<tr ng-repeat="user in $data">' +
  291. '<td ng-repeat="col in $columns">{{user[col.field]}}</td>' +
  292. '</tr>' +
  293. '</table>');
  294. }));
  295. describe('filter specified as alias', function(){
  296. beforeEach(inject(function($compile, NgTableParams) {
  297. scope.cols = [
  298. { field: 'name', filter: {username: 'text'} }
  299. ];
  300. scope.tableParams = new NgTableParams({}, {});
  301. $compile(elm)(scope);
  302. scope.$digest();
  303. }));
  304. it('should render named filter template', function() {
  305. var inputs = elm.find('thead').find('tr').eq(1).find('th').find('input');
  306. expect(inputs.length).toBe(1);
  307. expect(inputs.eq(0).attr('type')).toBe('text');
  308. expect(inputs.eq(0).attr('ng-model')).not.toBeUndefined();
  309. expect(inputs.eq(0).attr('name')).toBe('username');
  310. });
  311. it('should databind ngTableParams.filter to filter input', function () {
  312. scope.tableParams.filter()['username'] = 'my name is...';
  313. scope.$digest();
  314. var input = elm.find('thead').find('tr').eq(1).find('th').find('input');
  315. expect(input.val()).toBe('my name is...');
  316. });
  317. });
  318. describe('multiple filter inputs', function(){
  319. beforeEach(inject(function($compile, NgTableParams) {
  320. scope.cols = [
  321. { field: 'name', filter: {name: 'text', age: 'text'} }
  322. ];
  323. scope.tableParams = new NgTableParams({}, {});
  324. $compile(elm)(scope);
  325. scope.$digest();
  326. }));
  327. it('should render filter template for each key/value pair ordered by key', function() {
  328. var inputs = elm.find('thead').find('tr').eq(1).find('th').find('input');
  329. expect(inputs.length).toBe(2);
  330. expect(inputs.eq(0).attr('type')).toBe('text');
  331. expect(inputs.eq(0).attr('ng-model')).not.toBeUndefined();
  332. expect(inputs.eq(1).attr('type')).toBe('text');
  333. expect(inputs.eq(1).attr('ng-model')).not.toBeUndefined();
  334. });
  335. it('should databind ngTableParams.filter to filter inputs', function () {
  336. scope.tableParams.filter()['name'] = 'my name is...';
  337. scope.tableParams.filter()['age'] = '10';
  338. scope.$digest();
  339. var inputs = elm.find('thead').find('tr').eq(1).find('th').find('input');
  340. expect(inputs.eq(0).val()).toBe('my name is...');
  341. expect(inputs.eq(1).val()).toBe('10');
  342. });
  343. });
  344. describe('dynamic filter', function(){
  345. var ageFilter;
  346. beforeEach(inject(function($compile, NgTableParams) {
  347. ageFilter = { age: 'text'};
  348. function getFilter(paramsScope){
  349. if (paramsScope.$column.title() === 'Name of user') {
  350. return {username: 'text'};
  351. } else if (paramsScope.$column.title() === 'Age') {
  352. return ageFilter;
  353. }
  354. }
  355. scope.cols = [
  356. { field: 'name', title: 'Name of user', filter: getFilter },
  357. { field: 'age', title: 'Age', filter: getFilter }
  358. ];
  359. scope.tableParams = new NgTableParams({}, {});
  360. $compile(elm)(scope);
  361. scope.$digest();
  362. }));
  363. it('should render named filter template', function() {
  364. var usernameInput = elm.find('thead').find('tr').eq(1).find('th').eq(0).find('input');
  365. expect(usernameInput.attr('type')).toBe('text');
  366. expect(usernameInput.attr('name')).toBe('username');
  367. var ageInput = elm.find('thead').find('tr').eq(1).find('th').eq(1).find('input');
  368. expect(ageInput.attr('type')).toBe('text');
  369. expect(ageInput.attr('name')).toBe('age');
  370. });
  371. it('should databind ngTableParams.filter to filter input', function () {
  372. scope.tableParams.filter()['username'] = 'my name is...';
  373. scope.tableParams.filter()['age'] = '10';
  374. scope.$digest();
  375. var usernameInput = elm.find('thead').find('tr').eq(1).find('th').eq(0).find('input');
  376. expect(usernameInput.val()).toBe('my name is...');
  377. var ageInput = elm.find('thead').find('tr').eq(1).find('th').eq(1).find('input');
  378. expect(ageInput.val()).toBe('10');
  379. });
  380. it('should render new template as filter changes', inject(function($compile) {
  381. var scriptTemplate = angular.element(
  382. '<script type="text/ng-template" id="ng-table/filters/number.html"><input type="number" name="{{name}}"/></script>');
  383. $compile(scriptTemplate)(scope);
  384. ageFilter.age = 'number';
  385. scope.$digest();
  386. var ageInput = elm.find('thead').find('tr').eq(1).find('th').eq(1).find('input');
  387. expect(ageInput.attr('type')).toBe('number');
  388. expect(ageInput.attr('name')).toBe('age');
  389. }));
  390. });
  391. });
  392. describe('reorder columns', function() {
  393. var elm;
  394. var getTitles = function () {
  395. var thead = elm.find('thead');
  396. var rows = thead.find('tr');
  397. var titles = angular.element(rows[0]).find('th');
  398. return angular.element(titles).text().trim().split(/\s+/g)
  399. };
  400. beforeEach(inject(function ($compile, $q, NgTableParams) {
  401. elm = angular.element(
  402. '<div>' +
  403. '<table ng-table-dynamic="tableParams with cols" show-filter="true">' +
  404. '<tr ng-repeat="user in $data">' +
  405. "<td ng-repeat=\"col in $columns\">{{user[col.field]}}</td>" +
  406. '</tr>' +
  407. '</table>' +
  408. '</div>');
  409. scope.tableParams = new NgTableParams({}, {});
  410. scope.cols = [
  411. {
  412. field: 'name',
  413. title: 'Name'
  414. },
  415. {
  416. field: 'age',
  417. title: 'Age'
  418. },
  419. {
  420. field: 'money',
  421. title: 'Money'
  422. }
  423. ];
  424. $compile(elm)(scope);
  425. scope.$digest();
  426. }));
  427. it('"in place" switch of columns within array should reorder html table columns', function () {
  428. expect(getTitles()).toEqual([ 'Name', 'Age', 'Money' ]);
  429. var colToSwap = scope.cols[2];
  430. scope.cols[2] = scope.cols[1];
  431. scope.cols[1] = colToSwap;
  432. scope.$digest();
  433. expect(getTitles()).toEqual([ 'Name', 'Money', 'Age' ]);
  434. });
  435. it('"in place" reverse of column array should reorder html table columns', function () {
  436. expect(getTitles()).toEqual([ 'Name', 'Age', 'Money' ]);
  437. scope.cols.reverse();
  438. scope.$digest();
  439. expect(getTitles()).toEqual([ 'Money', 'Age', 'Name' ]);
  440. });
  441. it('html table columns should reflect order of columns in replacement array', function () {
  442. expect(getTitles()).toEqual([ 'Name', 'Age', 'Money' ]);
  443. var newArray = scope.cols.map(angular.identity);
  444. newArray.reverse();
  445. scope.cols = newArray;
  446. scope.$digest();
  447. expect(getTitles()).toEqual([ 'Money', 'Age', 'Name' ]);
  448. });
  449. });
  450. });