').addClass(this.classes.topBlocker),
122 | scroller: $('div.dt-scroll-body', this.s.dt.table().container()),
123 | };
124 |
125 | if (this.s.dt.settings()[0]._bInitComplete) {
126 | // Fixed Columns Initialisation
127 | this._addStyles();
128 | this._setKeyTableListener();
129 | }
130 | else {
131 | table.one('init.dt.dtfc', () => {
132 | // Fixed Columns Initialisation
133 | this._addStyles();
134 | this._setKeyTableListener();
135 | });
136 | }
137 |
138 | // Lots or reasons to redraw the column styles
139 | table.on(
140 | 'column-sizing.dt.dtfc column-reorder.dt.dtfc draw.dt.dtfc',
141 | () => this._addStyles()
142 | );
143 |
144 | // Column visibility can trigger a number of times quickly, so we debounce it
145 | let debounced = DataTable.util.debounce(() => {
146 | this._addStyles()
147 | }, 50);
148 |
149 | table.on('column-visibility.dt.dtfc', () => {
150 | debounced();
151 | });
152 |
153 | // Add classes to indicate scrolling state for styling
154 | this.dom.scroller.on('scroll.dtfc', () => this._scroll());
155 | this._scroll();
156 |
157 | // Make class available through dt object
158 | table.settings()[0]._fixedColumns = this;
159 |
160 | table.on('destroy', () => this._destroy());
161 |
162 | return this;
163 | }
164 |
165 | /**
166 | * Getter for the `fixedColumns.end` property
167 | *
168 | * @param newVal Optional. If present this will be the new value for the number of end fixed columns
169 | * @returns The number of end fixed columns
170 | */
171 | public end(): number;
172 | /**
173 | * Setter for the `fixedColumns.right` property
174 | *
175 | * @param newVal The new value for the number of right fixed columns
176 | * @returns DataTables API for chaining
177 | */
178 | public end(newVal: number): any;
179 | public end(newVal?: number): any {
180 | // If the value is to change
181 | if (newVal !== undefined) {
182 | if (newVal >= 0 && newVal <= this.s.dt.columns().count()) {
183 | // Set the new values and redraw the columns
184 | this.c.end = newVal;
185 | this._addStyles();
186 | }
187 |
188 | return this;
189 | }
190 |
191 | return this.c.end;
192 | }
193 |
194 | /**
195 | * Left fix - accounting for RTL
196 | *
197 | * @param count Columns to fix, or undefined for getter
198 | */
199 | public left(count?) {
200 | return this.s.rtl
201 | ? this.end(count)
202 | : this.start(count);
203 | }
204 |
205 | /**
206 | * Right fix - accounting for RTL
207 | *
208 | * @param count Columns to fix, or undefined for getter
209 | */
210 | public right(count?) {
211 | return this.s.rtl
212 | ? this.start(count)
213 | : this.end(count);
214 | }
215 |
216 | /**
217 | * Getter for the `fixedColumns.start` property
218 | *
219 | * @param newVal Optional. If present this will be the new value for the number of start fixed columns
220 | * @returns The number of start fixed columns
221 | */
222 | public start(): number;
223 | /**
224 | * Setter for the `fixedColumns.start` property
225 | *
226 | * @param newVal The new value for the number of left fixed columns
227 | * @returns DataTables API for chaining
228 | */
229 | public start(newVal: number): any;
230 | public start(newVal?: number): any {
231 | // If the value is to change
232 | if (newVal !== undefined) {
233 | if (newVal >= 0 && newVal <= this.s.dt.columns().count()) {
234 | // Set the new values and redraw the columns
235 | this.c.start = newVal;
236 | this._addStyles();
237 | }
238 |
239 | return this;
240 | }
241 |
242 | return this.c.start;
243 | }
244 |
245 | /**
246 | * Iterates over the columns, fixing the appropriate ones to the left and right
247 | */
248 | private _addStyles() {
249 | let dt = this.s.dt;
250 | let that = this;
251 | let colCount = this.s.dt.columns(':visible').count();
252 | let headerStruct = dt.table().header.structure(':visible');
253 | let footerStruct = dt.table().footer.structure(':visible');
254 | let widths = dt.columns(':visible').widths().toArray();
255 | let wrapper = $(dt.table().node()).closest('div.dt-scroll');
256 | let scroller = $(dt.table().node()).closest('div.dt-scroll-body')[0];
257 | let rtl = this.s.rtl;
258 | let start = this.c.start;
259 | let end = this.c.end;
260 | let left = rtl ? end : start;
261 | let right = rtl ? start : end;
262 | let barWidth = dt.settings()[0].oBrowser.barWidth; // dt internal
263 |
264 | // Do nothing if no scrolling in the DataTable
265 | if (wrapper.length === 0) {
266 | return this;
267 | }
268 |
269 | // Bar not needed - no vertical scrolling
270 | if (scroller.offsetWidth === scroller.clientWidth) {
271 | barWidth = 0;
272 | }
273 |
274 | // Loop over the visible columns, setting their state
275 | dt.columns().every(function (colIdx) {
276 | let visIdx = dt.column.index('toVisible', colIdx);
277 | let offset;
278 |
279 | // Skip the hidden columns
280 | if (visIdx === null) {
281 | return;
282 | }
283 |
284 | if (visIdx < start) {
285 | // Fix to the start
286 | offset = that._sum(widths, visIdx);
287 |
288 | that._fixColumn(
289 | visIdx,
290 | offset,
291 | 'start',
292 | headerStruct,
293 | footerStruct,
294 | barWidth
295 | );
296 | }
297 | else if (visIdx >= colCount - end) {
298 | // Fix to the end
299 | offset = that._sum(
300 | widths,
301 | colCount - visIdx - 1,
302 | true
303 | );
304 |
305 | that._fixColumn(
306 | visIdx,
307 | offset,
308 | 'end',
309 | headerStruct,
310 | footerStruct,
311 | barWidth
312 | );
313 | }
314 | else {
315 | // Release
316 | that._fixColumn(visIdx, 0, 'none', headerStruct, footerStruct, barWidth);
317 | }
318 | });
319 |
320 | // Apply classes to table to indicate what state we are in
321 | $(dt.table().node())
322 | .toggleClass(that.classes.tableFixedStart, start > 0)
323 | .toggleClass(that.classes.tableFixedEnd, end > 0)
324 | .toggleClass(that.classes.tableFixedLeft, left > 0)
325 | .toggleClass(that.classes.tableFixedRight, right > 0);
326 |
327 | // Blocker elements for when scroll bars are always visible
328 | let headerEl = dt.table().header();
329 | let footerEl = dt.table().footer();
330 | let headerHeight = $(headerEl).outerHeight();
331 | let footerHeight = $(footerEl).outerHeight();
332 |
333 | this.dom.topBlocker
334 | .appendTo(wrapper)
335 | .css('top', 0)
336 | .css(this.s.rtl ? 'left' : 'right', 0)
337 | .css('height', headerHeight)
338 | .css('width', barWidth + 1)
339 | .css('display', barWidth ? 'block' : 'none');
340 |
341 | if (footerEl) {
342 | this.dom.bottomBlocker
343 | .appendTo(wrapper)
344 | .css('bottom', 0)
345 | .css(this.s.rtl ? 'left' : 'right', 0)
346 | .css('height', footerHeight)
347 | .css('width', barWidth + 1)
348 | .css('display', barWidth ? 'block' : 'none');
349 | }
350 | }
351 |
352 | /**
353 | * Clean up
354 | */
355 | private _destroy() {
356 | this.s.dt.off('.dtfc');
357 | this.dom.scroller.off('.dtfc');
358 |
359 | $(this.s.dt.table().node())
360 | .removeClass(
361 | this.classes.tableScrollingEnd + ' ' +
362 | this.classes.tableScrollingLeft + ' ' +
363 | this.classes.tableScrollingStart + ' ' +
364 | this.classes.tableScrollingRight
365 | );
366 |
367 | this.dom.bottomBlocker.remove();
368 | this.dom.topBlocker.remove();
369 | }
370 |
371 | /**
372 | * Fix or unfix a column
373 | *
374 | * @param idx Column visible index to operate on
375 | * @param offset Offset from the start (pixels)
376 | * @param side start, end or none to unfix a column
377 | * @param header DT header structure object
378 | * @param footer DT footer structure object
379 | */
380 | private _fixColumn(
381 | idx: number,
382 | offset: number,
383 | side: 'start' | 'end' | 'none',
384 | header,
385 | footer,
386 | barWidth
387 | ) {
388 | let dt = this.s.dt;
389 | let applyStyles = (jq, part) => {
390 | if (side === 'none') {
391 | jq.css('position', '')
392 | .css('left', '')
393 | .css('right', '')
394 | .removeClass(
395 | this.classes.fixedEnd + ' ' +
396 | this.classes.fixedLeft + ' ' +
397 | this.classes.fixedRight + ' ' +
398 | this.classes.fixedStart
399 | );
400 | }
401 | else {
402 | let positionSide = side === 'start' ? 'left' : 'right';
403 |
404 | if (this.s.rtl) {
405 | positionSide = side === 'start' ? 'right' : 'left';
406 | }
407 |
408 | var off = offset;
409 |
410 | if (side === 'end' && (part === 'header' || part === 'footer')) {
411 | off += barWidth;
412 | }
413 |
414 | jq.css('position', 'sticky')
415 | .css(positionSide, off)
416 | .addClass(
417 | side === 'start'
418 | ? this.classes.fixedStart
419 | : this.classes.fixedEnd
420 | )
421 | .addClass(
422 | positionSide === 'left'
423 | ? this.classes.fixedLeft
424 | : this.classes.fixedRight
425 | );
426 | }
427 | };
428 |
429 | header.forEach((row) => {
430 | if (row[idx]) {
431 | applyStyles($(row[idx].cell), 'header');
432 | }
433 | });
434 |
435 | applyStyles(dt.column(idx + ':visible', { page: 'current' }).nodes().to$(), 'body');
436 |
437 | if (footer) {
438 | footer.forEach((row) => {
439 | if (row[idx]) {
440 | applyStyles($(row[idx].cell), 'footer');
441 | }
442 | });
443 | }
444 | }
445 |
446 | /**
447 | * Update classes on the table to indicate if the table is scrolling or not
448 | */
449 | private _scroll() {
450 | let scroller = this.dom.scroller[0];
451 |
452 | // Not a scrolling table
453 | if (! scroller) {
454 | return;
455 | }
456 |
457 | // Need to update the classes on potentially multiple table tags. There is the
458 | // main one, the scrolling ones and if FixedHeader is active, the holding
459 | // position ones! jQuery will deduplicate for us.
460 | let table = $(this.s.dt.table().node())
461 | .add(this.s.dt.table().header().parentNode)
462 | .add(this.s.dt.table().footer().parentNode)
463 | .add('div.dt-scroll-headInner table', this.s.dt.table().container())
464 | .add('div.dt-scroll-footInner table', this.s.dt.table().container());
465 |
466 | let scrollLeft = scroller.scrollLeft; // 0 when fully scrolled left
467 | let ltr = ! this.s.rtl;
468 | let scrollStart = scrollLeft !== 0;
469 | let scrollEnd = scroller.scrollWidth > (scroller.clientWidth + Math.abs(scrollLeft) + 1); // extra 1 for Chrome
470 |
471 | table.toggleClass(this.classes.tableScrollingStart, scrollStart);
472 | table.toggleClass(this.classes.tableScrollingEnd, scrollEnd);
473 | table.toggleClass(this.classes.tableScrollingLeft, (scrollStart && ltr) || (scrollEnd && ! ltr));
474 | table.toggleClass(this.classes.tableScrollingRight, (scrollEnd && ltr) || (scrollStart && ! ltr));
475 | }
476 |
477 | private _setKeyTableListener() {
478 | this.s.dt.on('key-focus.dt.dtfc', (e, dt, cell) => {
479 | let currScroll;
480 | let cellPos = $(cell.node()).offset();
481 | let scroller = this.dom.scroller[0];
482 | let scroll = $(
483 | $(this.s.dt.table().node()).closest('div.dt-scroll-body')
484 | );
485 |
486 | // If there are fixed columns to the left
487 | if (this.c.start > 0) {
488 | // Get the rightmost left fixed column header, it's position and it's width
489 | let rightMost = $(this.s.dt.column(this.c.start - 1).header());
490 | let rightMostPos = rightMost.offset();
491 | let rightMostWidth = rightMost.outerWidth();
492 |
493 | // If the current highlighted cell is left of the rightmost cell on the screen
494 | if ($(cell.node()).hasClass(this.classes.fixedLeft)) {
495 | // Fixed columns have the scrollbar at the start, always
496 | scroll.scrollLeft(0);
497 | }
498 | else if (cellPos.left < rightMostPos.left + rightMostWidth) {
499 | // Scroll it into view
500 | currScroll = scroll.scrollLeft();
501 | scroll.scrollLeft(
502 | currScroll -
503 | (rightMostPos.left + rightMostWidth - cellPos.left)
504 | );
505 | }
506 | }
507 |
508 | // If there are fixed columns to the right
509 | if (this.c.end > 0) {
510 | // Get the number of columns and the width of the cell as doing right side calc
511 | let numCols = this.s.dt.columns().data().toArray().length;
512 | let cellWidth = $(cell.node()).outerWidth();
513 |
514 | // Get the leftmost right fixed column header and it's position
515 | let leftMost = $(
516 | this.s.dt.column(numCols - this.c.end).header()
517 | );
518 | let leftMostPos = leftMost.offset();
519 |
520 | // If the current highlighted cell is right of the leftmost cell on the screen
521 | if ($(cell.node()).hasClass(this.classes.fixedRight)) {
522 | scroll.scrollLeft(scroller.scrollWidth - scroller.clientWidth);
523 | }
524 | else if (cellPos.left + cellWidth > leftMostPos.left) {
525 | // Scroll it into view
526 | currScroll = scroll.scrollLeft();
527 | scroll.scrollLeft(
528 | currScroll -
529 | (leftMostPos.left - (cellPos.left + cellWidth))
530 | );
531 | }
532 | }
533 | });
534 | }
535 |
536 | /**
537 | * Sum a range of values from an array
538 | *
539 | * @param widths
540 | * @param index
541 | * @returns
542 | */
543 | private _sum(widths: number[], index: number, reverse: boolean = false) {
544 | if (reverse) {
545 | widths = widths.slice().reverse();
546 | }
547 |
548 | return widths.slice(0, index).reduce((accum, val) => accum + val, 0);
549 | }
550 | }
551 |
--------------------------------------------------------------------------------
/examples/initialisation/scrollX.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
16 |
17 |
18 |
19 |
29 |
30 |
31 | Only Horizontal Scrolling
32 |
33 |
38 |
39 |
40 |
41 |
42 |
43 | | First name |
44 | Last name |
45 | Position |
46 | Office |
47 | Age |
48 | Start date |
49 | Salary |
50 | Extn. |
51 | E-mail |
52 |
53 |
54 |
55 |
56 | | First name |
57 | Last name |
58 | Position |
59 | Office |
60 | Age |
61 | Start date |
62 | Salary |
63 | Extn. |
64 | E-mail |
65 |
66 |
67 |
68 |
69 | | Tiger |
70 | Nixon |
71 | System Architect |
72 | Edinburgh |
73 | 61 |
74 | 2011/04/25 |
75 | $320,800 |
76 | 5421 |
77 | t.nixon@datatables.net |
78 |
79 |
80 | | Garrett |
81 | Winters |
82 | Accountant |
83 | Tokyo |
84 | 63 |
85 | 2011/07/25 |
86 | $170,750 |
87 | 8422 |
88 | g.winters@datatables.net |
89 |
90 |
91 | | Ashton |
92 | Cox |
93 | Junior Technical Author |
94 | San Francisco |
95 | 66 |
96 | 2009/01/12 |
97 | $86,000 |
98 | 1562 |
99 | a.cox@datatables.net |
100 |
101 |
102 | | Cedric |
103 | Kelly |
104 | Senior JavaScript Developer |
105 | Edinburgh |
106 | 22 |
107 | 2012/03/29 |
108 | $433,060 |
109 | 6224 |
110 | c.kelly@datatables.net |
111 |
112 |
113 | | Airi |
114 | Satou |
115 | Accountant |
116 | Tokyo |
117 | 33 |
118 | 2008/11/28 |
119 | $162,700 |
120 | 5407 |
121 | a.satou@datatables.net |
122 |
123 |
124 | | Brielle |
125 | Williamson |
126 | Integration Specialist |
127 | New York |
128 | 61 |
129 | 2012/12/02 |
130 | $372,000 |
131 | 4804 |
132 | b.williamson@datatables.net |
133 |
134 |
135 | | Herrod |
136 | Chandler |
137 | Sales Assistant |
138 | San Francisco |
139 | 59 |
140 | 2012/08/06 |
141 | $137,500 |
142 | 9608 |
143 | h.chandler@datatables.net |
144 |
145 |
146 | | Rhona |
147 | Davidson |
148 | Integration Specialist |
149 | Tokyo |
150 | 55 |
151 | 2010/10/14 |
152 | $327,900 |
153 | 6200 |
154 | r.davidson@datatables.net |
155 |
156 |
157 | | Colleen |
158 | Hurst |
159 | JavaScript Developer |
160 | San Francisco |
161 | 39 |
162 | 2009/09/15 |
163 | $205,500 |
164 | 2360 |
165 | c.hurst@datatables.net |
166 |
167 |
168 | | Sonya |
169 | Frost |
170 | Software Engineer |
171 | Edinburgh |
172 | 23 |
173 | 2008/12/13 |
174 | $103,600 |
175 | 1667 |
176 | s.frost@datatables.net |
177 |
178 |
179 | | Jena |
180 | Gaines |
181 | Office Manager |
182 | London |
183 | 30 |
184 | 2008/12/19 |
185 | $90,560 |
186 | 3814 |
187 | j.gaines@datatables.net |
188 |
189 |
190 | | Quinn |
191 | Flynn |
192 | Support Lead |
193 | Edinburgh |
194 | 22 |
195 | 2013/03/03 |
196 | $342,000 |
197 | 9497 |
198 | q.flynn@datatables.net |
199 |
200 |
201 | | Charde |
202 | Marshall |
203 | Regional Director |
204 | San Francisco |
205 | 36 |
206 | 2008/10/16 |
207 | $470,600 |
208 | 6741 |
209 | c.marshall@datatables.net |
210 |
211 |
212 | | Haley |
213 | Kennedy |
214 | Senior Marketing Designer |
215 | London |
216 | 43 |
217 | 2012/12/18 |
218 | $313,500 |
219 | 3597 |
220 | h.kennedy@datatables.net |
221 |
222 |
223 | | Tatyana |
224 | Fitzpatrick |
225 | Regional Director |
226 | London |
227 | 19 |
228 | 2010/03/17 |
229 | $385,750 |
230 | 1965 |
231 | t.fitzpatrick@datatables.net |
232 |
233 |
234 | | Michael |
235 | Silva |
236 | Marketing Designer |
237 | London |
238 | 66 |
239 | 2012/11/27 |
240 | $198,500 |
241 | 1581 |
242 | m.silva@datatables.net |
243 |
244 |
245 | | Paul |
246 | Byrd |
247 | Chief Financial Officer (CFO) |
248 | New York |
249 | 64 |
250 | 2010/06/09 |
251 | $725,000 |
252 | 3059 |
253 | p.byrd@datatables.net |
254 |
255 |
256 | | Gloria |
257 | Little |
258 | Systems Administrator |
259 | New York |
260 | 59 |
261 | 2009/04/10 |
262 | $237,500 |
263 | 1721 |
264 | g.little@datatables.net |
265 |
266 |
267 | | Bradley |
268 | Greer |
269 | Software Engineer |
270 | London |
271 | 41 |
272 | 2012/10/13 |
273 | $132,000 |
274 | 2558 |
275 | b.greer@datatables.net |
276 |
277 |
278 | | Dai |
279 | Rios |
280 | Personnel Lead |
281 | Edinburgh |
282 | 35 |
283 | 2012/09/26 |
284 | $217,500 |
285 | 2290 |
286 | d.rios@datatables.net |
287 |
288 |
289 | | Jenette |
290 | Caldwell |
291 | Development Lead |
292 | New York |
293 | 30 |
294 | 2011/09/03 |
295 | $345,000 |
296 | 1937 |
297 | j.caldwell@datatables.net |
298 |
299 |
300 | | Yuri |
301 | Berry |
302 | Chief Marketing Officer (CMO) |
303 | New York |
304 | 40 |
305 | 2009/06/25 |
306 | $675,000 |
307 | 6154 |
308 | y.berry@datatables.net |
309 |
310 |
311 | | Caesar |
312 | Vance |
313 | Pre-Sales Support |
314 | New York |
315 | 21 |
316 | 2011/12/12 |
317 | $106,450 |
318 | 8330 |
319 | c.vance@datatables.net |
320 |
321 |
322 | | Doris |
323 | Wilder |
324 | Sales Assistant |
325 | Sydney |
326 | 23 |
327 | 2010/09/20 |
328 | $85,600 |
329 | 3023 |
330 | d.wilder@datatables.net |
331 |
332 |
333 | | Angelica |
334 | Ramos |
335 | Chief Executive Officer (CEO) |
336 | London |
337 | 47 |
338 | 2009/10/09 |
339 | $1,200,000 |
340 | 5797 |
341 | a.ramos@datatables.net |
342 |
343 |
344 | | Gavin |
345 | Joyce |
346 | Developer |
347 | Edinburgh |
348 | 42 |
349 | 2010/12/22 |
350 | $92,575 |
351 | 8822 |
352 | g.joyce@datatables.net |
353 |
354 |
355 | | Jennifer |
356 | Chang |
357 | Regional Director |
358 | Singapore |
359 | 28 |
360 | 2010/11/14 |
361 | $357,650 |
362 | 9239 |
363 | j.chang@datatables.net |
364 |
365 |
366 | | Brenden |
367 | Wagner |
368 | Software Engineer |
369 | San Francisco |
370 | 28 |
371 | 2011/06/07 |
372 | $206,850 |
373 | 1314 |
374 | b.wagner@datatables.net |
375 |
376 |
377 | | Fiona |
378 | Green |
379 | Chief Operating Officer (COO) |
380 | San Francisco |
381 | 48 |
382 | 2010/03/11 |
383 | $850,000 |
384 | 2947 |
385 | f.green@datatables.net |
386 |
387 |
388 | | Shou |
389 | Itou |
390 | Regional Marketing |
391 | Tokyo |
392 | 20 |
393 | 2011/08/14 |
394 | $163,000 |
395 | 8899 |
396 | s.itou@datatables.net |
397 |
398 |
399 | | Michelle |
400 | House |
401 | Integration Specialist |
402 | Sydney |
403 | 37 |
404 | 2011/06/02 |
405 | $95,400 |
406 | 2769 |
407 | m.house@datatables.net |
408 |
409 |
410 | | Suki |
411 | Burks |
412 | Developer |
413 | London |
414 | 53 |
415 | 2009/10/22 |
416 | $114,500 |
417 | 6832 |
418 | s.burks@datatables.net |
419 |
420 |
421 | | Prescott |
422 | Bartlett |
423 | Technical Author |
424 | London |
425 | 27 |
426 | 2011/05/07 |
427 | $145,000 |
428 | 3606 |
429 | p.bartlett@datatables.net |
430 |
431 |
432 | | Gavin |
433 | Cortez |
434 | Team Leader |
435 | San Francisco |
436 | 22 |
437 | 2008/10/26 |
438 | $235,500 |
439 | 2860 |
440 | g.cortez@datatables.net |
441 |
442 |
443 | | Martena |
444 | Mccray |
445 | Post-Sales support |
446 | Edinburgh |
447 | 46 |
448 | 2011/03/09 |
449 | $324,050 |
450 | 8240 |
451 | m.mccray@datatables.net |
452 |
453 |
454 | | Unity |
455 | Butler |
456 | Marketing Designer |
457 | San Francisco |
458 | 47 |
459 | 2009/12/09 |
460 | $85,675 |
461 | 5384 |
462 | u.butler@datatables.net |
463 |
464 |
465 | | Howard |
466 | Hatfield |
467 | Office Manager |
468 | San Francisco |
469 | 51 |
470 | 2008/12/16 |
471 | $164,500 |
472 | 7031 |
473 | h.hatfield@datatables.net |
474 |
475 |
476 | | Hope |
477 | Fuentes |
478 | Secretary |
479 | San Francisco |
480 | 41 |
481 | 2010/02/12 |
482 | $109,850 |
483 | 6318 |
484 | h.fuentes@datatables.net |
485 |
486 |
487 | | Vivian |
488 | Harrell |
489 | Financial Controller |
490 | San Francisco |
491 | 62 |
492 | 2009/02/14 |
493 | $452,500 |
494 | 9422 |
495 | v.harrell@datatables.net |
496 |
497 |
498 | | Timothy |
499 | Mooney |
500 | Office Manager |
501 | London |
502 | 37 |
503 | 2008/12/11 |
504 | $136,200 |
505 | 7580 |
506 | t.mooney@datatables.net |
507 |
508 |
509 | | Jackson |
510 | Bradshaw |
511 | Director |
512 | New York |
513 | 65 |
514 | 2008/09/26 |
515 | $645,750 |
516 | 1042 |
517 | j.bradshaw@datatables.net |
518 |
519 |
520 | | Olivia |
521 | Liang |
522 | Support Engineer |
523 | Singapore |
524 | 64 |
525 | 2011/02/03 |
526 | $234,500 |
527 | 2120 |
528 | o.liang@datatables.net |
529 |
530 |
531 | | Bruno |
532 | Nash |
533 | Software Engineer |
534 | London |
535 | 38 |
536 | 2011/05/03 |
537 | $163,500 |
538 | 6222 |
539 | b.nash@datatables.net |
540 |
541 |
542 | | Sakura |
543 | Yamamoto |
544 | Support Engineer |
545 | Tokyo |
546 | 37 |
547 | 2009/08/19 |
548 | $139,575 |
549 | 9383 |
550 | s.yamamoto@datatables.net |
551 |
552 |
553 | | Thor |
554 | Walton |
555 | Developer |
556 | New York |
557 | 61 |
558 | 2013/08/11 |
559 | $98,540 |
560 | 8327 |
561 | t.walton@datatables.net |
562 |
563 |
564 | | Finn |
565 | Camacho |
566 | Support Engineer |
567 | San Francisco |
568 | 47 |
569 | 2009/07/07 |
570 | $87,500 |
571 | 2927 |
572 | f.camacho@datatables.net |
573 |
574 |
575 | | Serge |
576 | Baldwin |
577 | Data Coordinator |
578 | Singapore |
579 | 64 |
580 | 2012/04/09 |
581 | $138,575 |
582 | 8352 |
583 | s.baldwin@datatables.net |
584 |
585 |
586 | | Zenaida |
587 | Frank |
588 | Software Engineer |
589 | New York |
590 | 63 |
591 | 2010/01/04 |
592 | $125,250 |
593 | 7439 |
594 | z.frank@datatables.net |
595 |
596 |
597 | | Zorita |
598 | Serrano |
599 | Software Engineer |
600 | San Francisco |
601 | 56 |
602 | 2012/06/01 |
603 | $115,000 |
604 | 4389 |
605 | z.serrano@datatables.net |
606 |
607 |
608 | | Jennifer |
609 | Acosta |
610 | Junior JavaScript Developer |
611 | Edinburgh |
612 | 43 |
613 | 2013/02/01 |
614 | $75,650 |
615 | 3431 |
616 | j.acosta@datatables.net |
617 |
618 |
619 | | Cara |
620 | Stevens |
621 | Sales Assistant |
622 | New York |
623 | 46 |
624 | 2011/12/06 |
625 | $145,600 |
626 | 3990 |
627 | c.stevens@datatables.net |
628 |
629 |
630 | | Hermione |
631 | Butler |
632 | Regional Director |
633 | London |
634 | 47 |
635 | 2011/03/21 |
636 | $356,250 |
637 | 1016 |
638 | h.butler@datatables.net |
639 |
640 |
641 | | Lael |
642 | Greer |
643 | Systems Administrator |
644 | London |
645 | 21 |
646 | 2009/02/27 |
647 | $103,500 |
648 | 6733 |
649 | l.greer@datatables.net |
650 |
651 |
652 | | Jonas |
653 | Alexander |
654 | Developer |
655 | San Francisco |
656 | 30 |
657 | 2010/07/14 |
658 | $86,500 |
659 | 8196 |
660 | j.alexander@datatables.net |
661 |
662 |
663 | | Shad |
664 | Decker |
665 | Regional Director |
666 | Edinburgh |
667 | 51 |
668 | 2008/11/13 |
669 | $183,000 |
670 | 6373 |
671 | s.decker@datatables.net |
672 |
673 |
674 | | Michael |
675 | Bruce |
676 | JavaScript Developer |
677 | Singapore |
678 | 29 |
679 | 2011/06/27 |
680 | $183,000 |
681 | 5384 |
682 | m.bruce@datatables.net |
683 |
684 |
685 | | Donna |
686 | Snider |
687 | Customer Support |
688 | New York |
689 | 27 |
690 | 2011/01/25 |
691 | $112,000 |
692 | 4226 |
693 | d.snider@datatables.net |
694 |
695 |
696 |
697 |
698 |
699 |
700 |
--------------------------------------------------------------------------------
/examples/integration/fixedHeaderFooter.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
23 |
24 |
25 |
26 |
43 |
44 |
45 | FixedHeader with Footer
46 |
47 |
54 |
55 |
56 |
57 |
58 |
59 | | First name |
60 | Last name |
61 | Position |
62 | Office |
63 | Age |
64 | Start date |
65 | Salary |
66 | Extn. |
67 | E-mail |
68 |
69 |
70 |
71 |
72 | | First name |
73 | Last name |
74 | Position |
75 | Office |
76 | Age |
77 | Start date |
78 | Salary |
79 | Extn. |
80 | E-mail |
81 |
82 |
83 |
84 |
85 | | Tiger |
86 | Nixon |
87 | System Architect |
88 | Edinburgh |
89 | 61 |
90 | 2011/04/25 |
91 | $320,800 |
92 | 5421 |
93 | t.nixon@datatables.net |
94 |
95 |
96 | | Garrett |
97 | Winters |
98 | Accountant |
99 | Tokyo |
100 | 63 |
101 | 2011/07/25 |
102 | $170,750 |
103 | 8422 |
104 | g.winters@datatables.net |
105 |
106 |
107 | | Ashton |
108 | Cox |
109 | Junior Technical Author |
110 | San Francisco |
111 | 66 |
112 | 2009/01/12 |
113 | $86,000 |
114 | 1562 |
115 | a.cox@datatables.net |
116 |
117 |
118 | | Cedric |
119 | Kelly |
120 | Senior JavaScript Developer |
121 | Edinburgh |
122 | 22 |
123 | 2012/03/29 |
124 | $433,060 |
125 | 6224 |
126 | c.kelly@datatables.net |
127 |
128 |
129 | | Airi |
130 | Satou |
131 | Accountant |
132 | Tokyo |
133 | 33 |
134 | 2008/11/28 |
135 | $162,700 |
136 | 5407 |
137 | a.satou@datatables.net |
138 |
139 |
140 | | Brielle |
141 | Williamson |
142 | Integration Specialist |
143 | New York |
144 | 61 |
145 | 2012/12/02 |
146 | $372,000 |
147 | 4804 |
148 | b.williamson@datatables.net |
149 |
150 |
151 | | Herrod |
152 | Chandler |
153 | Sales Assistant |
154 | San Francisco |
155 | 59 |
156 | 2012/08/06 |
157 | $137,500 |
158 | 9608 |
159 | h.chandler@datatables.net |
160 |
161 |
162 | | Rhona |
163 | Davidson |
164 | Integration Specialist |
165 | Tokyo |
166 | 55 |
167 | 2010/10/14 |
168 | $327,900 |
169 | 6200 |
170 | r.davidson@datatables.net |
171 |
172 |
173 | | Colleen |
174 | Hurst |
175 | JavaScript Developer |
176 | San Francisco |
177 | 39 |
178 | 2009/09/15 |
179 | $205,500 |
180 | 2360 |
181 | c.hurst@datatables.net |
182 |
183 |
184 | | Sonya |
185 | Frost |
186 | Software Engineer |
187 | Edinburgh |
188 | 23 |
189 | 2008/12/13 |
190 | $103,600 |
191 | 1667 |
192 | s.frost@datatables.net |
193 |
194 |
195 | | Jena |
196 | Gaines |
197 | Office Manager |
198 | London |
199 | 30 |
200 | 2008/12/19 |
201 | $90,560 |
202 | 3814 |
203 | j.gaines@datatables.net |
204 |
205 |
206 | | Quinn |
207 | Flynn |
208 | Support Lead |
209 | Edinburgh |
210 | 22 |
211 | 2013/03/03 |
212 | $342,000 |
213 | 9497 |
214 | q.flynn@datatables.net |
215 |
216 |
217 | | Charde |
218 | Marshall |
219 | Regional Director |
220 | San Francisco |
221 | 36 |
222 | 2008/10/16 |
223 | $470,600 |
224 | 6741 |
225 | c.marshall@datatables.net |
226 |
227 |
228 | | Haley |
229 | Kennedy |
230 | Senior Marketing Designer |
231 | London |
232 | 43 |
233 | 2012/12/18 |
234 | $313,500 |
235 | 3597 |
236 | h.kennedy@datatables.net |
237 |
238 |
239 | | Tatyana |
240 | Fitzpatrick |
241 | Regional Director |
242 | London |
243 | 19 |
244 | 2010/03/17 |
245 | $385,750 |
246 | 1965 |
247 | t.fitzpatrick@datatables.net |
248 |
249 |
250 | | Michael |
251 | Silva |
252 | Marketing Designer |
253 | London |
254 | 66 |
255 | 2012/11/27 |
256 | $198,500 |
257 | 1581 |
258 | m.silva@datatables.net |
259 |
260 |
261 | | Paul |
262 | Byrd |
263 | Chief Financial Officer (CFO) |
264 | New York |
265 | 64 |
266 | 2010/06/09 |
267 | $725,000 |
268 | 3059 |
269 | p.byrd@datatables.net |
270 |
271 |
272 | | Gloria |
273 | Little |
274 | Systems Administrator |
275 | New York |
276 | 59 |
277 | 2009/04/10 |
278 | $237,500 |
279 | 1721 |
280 | g.little@datatables.net |
281 |
282 |
283 | | Bradley |
284 | Greer |
285 | Software Engineer |
286 | London |
287 | 41 |
288 | 2012/10/13 |
289 | $132,000 |
290 | 2558 |
291 | b.greer@datatables.net |
292 |
293 |
294 | | Dai |
295 | Rios |
296 | Personnel Lead |
297 | Edinburgh |
298 | 35 |
299 | 2012/09/26 |
300 | $217,500 |
301 | 2290 |
302 | d.rios@datatables.net |
303 |
304 |
305 | | Jenette |
306 | Caldwell |
307 | Development Lead |
308 | New York |
309 | 30 |
310 | 2011/09/03 |
311 | $345,000 |
312 | 1937 |
313 | j.caldwell@datatables.net |
314 |
315 |
316 | | Yuri |
317 | Berry |
318 | Chief Marketing Officer (CMO) |
319 | New York |
320 | 40 |
321 | 2009/06/25 |
322 | $675,000 |
323 | 6154 |
324 | y.berry@datatables.net |
325 |
326 |
327 | | Caesar |
328 | Vance |
329 | Pre-Sales Support |
330 | New York |
331 | 21 |
332 | 2011/12/12 |
333 | $106,450 |
334 | 8330 |
335 | c.vance@datatables.net |
336 |
337 |
338 | | Doris |
339 | Wilder |
340 | Sales Assistant |
341 | Sydney |
342 | 23 |
343 | 2010/09/20 |
344 | $85,600 |
345 | 3023 |
346 | d.wilder@datatables.net |
347 |
348 |
349 | | Angelica |
350 | Ramos |
351 | Chief Executive Officer (CEO) |
352 | London |
353 | 47 |
354 | 2009/10/09 |
355 | $1,200,000 |
356 | 5797 |
357 | a.ramos@datatables.net |
358 |
359 |
360 | | Gavin |
361 | Joyce |
362 | Developer |
363 | Edinburgh |
364 | 42 |
365 | 2010/12/22 |
366 | $92,575 |
367 | 8822 |
368 | g.joyce@datatables.net |
369 |
370 |
371 | | Jennifer |
372 | Chang |
373 | Regional Director |
374 | Singapore |
375 | 28 |
376 | 2010/11/14 |
377 | $357,650 |
378 | 9239 |
379 | j.chang@datatables.net |
380 |
381 |
382 | | Brenden |
383 | Wagner |
384 | Software Engineer |
385 | San Francisco |
386 | 28 |
387 | 2011/06/07 |
388 | $206,850 |
389 | 1314 |
390 | b.wagner@datatables.net |
391 |
392 |
393 | | Fiona |
394 | Green |
395 | Chief Operating Officer (COO) |
396 | San Francisco |
397 | 48 |
398 | 2010/03/11 |
399 | $850,000 |
400 | 2947 |
401 | f.green@datatables.net |
402 |
403 |
404 | | Shou |
405 | Itou |
406 | Regional Marketing |
407 | Tokyo |
408 | 20 |
409 | 2011/08/14 |
410 | $163,000 |
411 | 8899 |
412 | s.itou@datatables.net |
413 |
414 |
415 | | Michelle |
416 | House |
417 | Integration Specialist |
418 | Sydney |
419 | 37 |
420 | 2011/06/02 |
421 | $95,400 |
422 | 2769 |
423 | m.house@datatables.net |
424 |
425 |
426 | | Suki |
427 | Burks |
428 | Developer |
429 | London |
430 | 53 |
431 | 2009/10/22 |
432 | $114,500 |
433 | 6832 |
434 | s.burks@datatables.net |
435 |
436 |
437 | | Prescott |
438 | Bartlett |
439 | Technical Author |
440 | London |
441 | 27 |
442 | 2011/05/07 |
443 | $145,000 |
444 | 3606 |
445 | p.bartlett@datatables.net |
446 |
447 |
448 | | Gavin |
449 | Cortez |
450 | Team Leader |
451 | San Francisco |
452 | 22 |
453 | 2008/10/26 |
454 | $235,500 |
455 | 2860 |
456 | g.cortez@datatables.net |
457 |
458 |
459 | | Martena |
460 | Mccray |
461 | Post-Sales support |
462 | Edinburgh |
463 | 46 |
464 | 2011/03/09 |
465 | $324,050 |
466 | 8240 |
467 | m.mccray@datatables.net |
468 |
469 |
470 | | Unity |
471 | Butler |
472 | Marketing Designer |
473 | San Francisco |
474 | 47 |
475 | 2009/12/09 |
476 | $85,675 |
477 | 5384 |
478 | u.butler@datatables.net |
479 |
480 |
481 | | Howard |
482 | Hatfield |
483 | Office Manager |
484 | San Francisco |
485 | 51 |
486 | 2008/12/16 |
487 | $164,500 |
488 | 7031 |
489 | h.hatfield@datatables.net |
490 |
491 |
492 | | Hope |
493 | Fuentes |
494 | Secretary |
495 | San Francisco |
496 | 41 |
497 | 2010/02/12 |
498 | $109,850 |
499 | 6318 |
500 | h.fuentes@datatables.net |
501 |
502 |
503 | | Vivian |
504 | Harrell |
505 | Financial Controller |
506 | San Francisco |
507 | 62 |
508 | 2009/02/14 |
509 | $452,500 |
510 | 9422 |
511 | v.harrell@datatables.net |
512 |
513 |
514 | | Timothy |
515 | Mooney |
516 | Office Manager |
517 | London |
518 | 37 |
519 | 2008/12/11 |
520 | $136,200 |
521 | 7580 |
522 | t.mooney@datatables.net |
523 |
524 |
525 | | Jackson |
526 | Bradshaw |
527 | Director |
528 | New York |
529 | 65 |
530 | 2008/09/26 |
531 | $645,750 |
532 | 1042 |
533 | j.bradshaw@datatables.net |
534 |
535 |
536 | | Olivia |
537 | Liang |
538 | Support Engineer |
539 | Singapore |
540 | 64 |
541 | 2011/02/03 |
542 | $234,500 |
543 | 2120 |
544 | o.liang@datatables.net |
545 |
546 |
547 | | Bruno |
548 | Nash |
549 | Software Engineer |
550 | London |
551 | 38 |
552 | 2011/05/03 |
553 | $163,500 |
554 | 6222 |
555 | b.nash@datatables.net |
556 |
557 |
558 | | Sakura |
559 | Yamamoto |
560 | Support Engineer |
561 | Tokyo |
562 | 37 |
563 | 2009/08/19 |
564 | $139,575 |
565 | 9383 |
566 | s.yamamoto@datatables.net |
567 |
568 |
569 | | Thor |
570 | Walton |
571 | Developer |
572 | New York |
573 | 61 |
574 | 2013/08/11 |
575 | $98,540 |
576 | 8327 |
577 | t.walton@datatables.net |
578 |
579 |
580 | | Finn |
581 | Camacho |
582 | Support Engineer |
583 | San Francisco |
584 | 47 |
585 | 2009/07/07 |
586 | $87,500 |
587 | 2927 |
588 | f.camacho@datatables.net |
589 |
590 |
591 | | Serge |
592 | Baldwin |
593 | Data Coordinator |
594 | Singapore |
595 | 64 |
596 | 2012/04/09 |
597 | $138,575 |
598 | 8352 |
599 | s.baldwin@datatables.net |
600 |
601 |
602 | | Zenaida |
603 | Frank |
604 | Software Engineer |
605 | New York |
606 | 63 |
607 | 2010/01/04 |
608 | $125,250 |
609 | 7439 |
610 | z.frank@datatables.net |
611 |
612 |
613 | | Zorita |
614 | Serrano |
615 | Software Engineer |
616 | San Francisco |
617 | 56 |
618 | 2012/06/01 |
619 | $115,000 |
620 | 4389 |
621 | z.serrano@datatables.net |
622 |
623 |
624 | | Jennifer |
625 | Acosta |
626 | Junior JavaScript Developer |
627 | Edinburgh |
628 | 43 |
629 | 2013/02/01 |
630 | $75,650 |
631 | 3431 |
632 | j.acosta@datatables.net |
633 |
634 |
635 | | Cara |
636 | Stevens |
637 | Sales Assistant |
638 | New York |
639 | 46 |
640 | 2011/12/06 |
641 | $145,600 |
642 | 3990 |
643 | c.stevens@datatables.net |
644 |
645 |
646 | | Hermione |
647 | Butler |
648 | Regional Director |
649 | London |
650 | 47 |
651 | 2011/03/21 |
652 | $356,250 |
653 | 1016 |
654 | h.butler@datatables.net |
655 |
656 |
657 | | Lael |
658 | Greer |
659 | Systems Administrator |
660 | London |
661 | 21 |
662 | 2009/02/27 |
663 | $103,500 |
664 | 6733 |
665 | l.greer@datatables.net |
666 |
667 |
668 | | Jonas |
669 | Alexander |
670 | Developer |
671 | San Francisco |
672 | 30 |
673 | 2010/07/14 |
674 | $86,500 |
675 | 8196 |
676 | j.alexander@datatables.net |
677 |
678 |
679 | | Shad |
680 | Decker |
681 | Regional Director |
682 | Edinburgh |
683 | 51 |
684 | 2008/11/13 |
685 | $183,000 |
686 | 6373 |
687 | s.decker@datatables.net |
688 |
689 |
690 | | Michael |
691 | Bruce |
692 | JavaScript Developer |
693 | Singapore |
694 | 29 |
695 | 2011/06/27 |
696 | $183,000 |
697 | 5384 |
698 | m.bruce@datatables.net |
699 |
700 |
701 | | Donna |
702 | Snider |
703 | Customer Support |
704 | New York |
705 | 27 |
706 | 2011/01/25 |
707 | $112,000 |
708 | 4226 |
709 | d.snider@datatables.net |
710 |
711 |
712 |
713 |
714 |
715 |
716 |
--------------------------------------------------------------------------------