otsdaq_utilities  v2_05_02_indev
clipboard.js
1 var Clipboard = function(table){
2  this.table = table;
3  this.mode = true;
4  this.copySelector = false;
5  this.copySelectorParams = {};
6  this.copyFormatter = false;
7  this.copyFormatterParams = {};
8  this.pasteParser = function(){};
9  this.pasteAction = function(){};
10  this.htmlElement = false;
11  this.config = {};
12 
13  this.blocked = true; //block copy actions not originating from this command
14 };
15 
16 Clipboard.prototype.initialize = function(){
17  var self = this;
18 
19  this.mode = this.table.options.clipboard;
20 
21  if(this.mode === true || this.mode === "copy"){
22  this.table.element.addEventListener("copy", function(e){
23  var data;
24 
25  self.processConfig();
26 
27  if(!self.blocked){
28  e.preventDefault();
29 
30  data = self.generateContent();
31 
32  if (window.clipboardData && window.clipboardData.setData) {
33  window.clipboardData.setData('Text', data);
34  } else if (e.clipboardData && e.clipboardData.setData) {
35  e.clipboardData.setData('text/plain', data);
36  if(self.htmlElement){
37  e.clipboardData.setData('text/html', self.htmlElement.outerHTML);
38  }
39  } else if (e.originalEvent && e.originalEvent.clipboardData.setData) {
40  e.originalEvent.clipboardData.setData('text/plain', data);
41  if(self.htmlElement){
42  e.originalEvent.clipboardData.setData('text/html', self.htmlElement.outerHTML);
43  }
44  }
45 
46  self.table.options.clipboardCopied.call(this.table, data);
47 
48  self.reset();
49  }
50  });
51  }
52 
53  if(this.mode === true || this.mode === "paste"){
54  this.table.element.addEventListener("paste", function(e){
55  self.paste(e);
56  });
57  }
58 
59  this.setPasteParser(this.table.options.clipboardPasteParser);
60  this.setPasteAction(this.table.options.clipboardPasteAction);
61 };
62 
63 Clipboard.prototype.processConfig = function(){
64  var config = {
65  columnHeaders:"groups",
66  rowGroups:true,
67  columnCalcs:true,
68  };
69 
70  if(typeof this.table.options.clipboardCopyHeader !== "undefined"){
71  config.columnHeaders = this.table.options.clipboardCopyHeader;
72  console.warn("DEPRECATION WARNING - clipboardCopyHeader option has been deprecated, please use the columnHeaders property on the clipboardCopyConfig option");
73  }
74 
75  if(this.table.options.clipboardCopyConfig){
76  for(var key in this.table.options.clipboardCopyConfig){
77  config[key] = this.table.options.clipboardCopyConfig[key];
78  }
79  }
80 
81  if (config.rowGroups && this.table.options.groupBy && this.table.modExists("groupRows")){
82  this.config.rowGroups = true;
83  }
84 
85  if(config.columnHeaders){
86  if((config.columnHeaders === "groups" || config === true) && this.table.columnManager.columns.length != this.table.columnManager.columnsByIndex.length){
87  this.config.columnHeaders = "groups";
88  }else{
89  this.config.columnHeaders = "columns";
90  }
91  }else{
92  this.config.columnHeaders = false;
93  }
94 
95  if (config.columnCalcs && this.table.modExists("columnCalcs")){
96  this.config.columnCalcs = true;
97  }
98 };
99 
100 
101 Clipboard.prototype.reset = function(){
102  this.blocked = false;
103  this.originalSelectionText = "";
104 };
105 
106 
107 Clipboard.prototype.setPasteAction = function(action){
108 
109  switch(typeof action){
110  case "string":
111  this.pasteAction = this.pasteActions[action];
112 
113  if(!this.pasteAction){
114  console.warn("Clipboard Error - No such paste action found:", action);
115  }
116  break;
117 
118  case "function":
119  this.pasteAction = action;
120  break;
121  }
122 };
123 
124 Clipboard.prototype.setPasteParser = function(parser){
125  switch(typeof parser){
126  case "string":
127  this.pasteParser = this.pasteParsers[parser];
128 
129  if(!this.pasteParser){
130  console.warn("Clipboard Error - No such paste parser found:", parser);
131  }
132  break;
133 
134  case "function":
135  this.pasteParser = parser;
136  break;
137  }
138 };
139 
140 
141 Clipboard.prototype.paste = function(e){
142  var data, rowData, rows;
143 
144  if(this.checkPaseOrigin(e)){
145 
146  data = this.getPasteData(e);
147 
148  rowData = this.pasteParser.call(this, data);
149 
150  if(rowData){
151  e.preventDefault();
152 
153  if(this.table.modExists("mutator")){
154  rowData = this.mutateData(rowData);
155  }
156 
157  rows = this.pasteAction.call(this, rowData);
158  this.table.options.clipboardPasted.call(this.table, data, rowData, rows);
159  }else{
160  this.table.options.clipboardPasteError.call(this.table, data);
161  }
162  }
163 };
164 
165 Clipboard.prototype.mutateData = function(data){
166  var self = this,
167  output = [];
168 
169  if(Array.isArray(data)){
170  data.forEach(function(row){
171  output.push(self.table.modules.mutator.transformRow(row, "clipboard"));
172  });
173  }else{
174  output = data;
175  }
176 
177  return output;
178 };
179 
180 
181 Clipboard.prototype.checkPaseOrigin = function(e){
182  var valid = true;
183 
184  if(e.target.tagName != "DIV" || this.table.modules.edit.currentCell){
185  valid = false;
186  }
187 
188  return valid;
189 };
190 
191 Clipboard.prototype.getPasteData = function(e){
192  var data;
193 
194  if (window.clipboardData && window.clipboardData.getData) {
195  data = window.clipboardData.getData('Text');
196  } else if (e.clipboardData && e.clipboardData.getData) {
197  data = e.clipboardData.getData('text/plain');
198  } else if (e.originalEvent && e.originalEvent.clipboardData.getData) {
199  data = e.originalEvent.clipboardData.getData('text/plain');
200  }
201 
202  return data;
203 };
204 
205 
206 Clipboard.prototype.copy = function(selector, selectorParams, formatter, formatterParams, internal){
207  var range, sel, textRange;
208  this.blocked = false;
209 
210  if(this.mode === true || this.mode === "copy"){
211 
212  if (typeof window.getSelection != "undefined" && typeof document.createRange != "undefined") {
213  range = document.createRange();
214  range.selectNodeContents(this.table.element);
215  sel = window.getSelection();
216 
217  if(sel.toString() && internal){
218  selector = "userSelection";
219  formatter = "raw";
220  selectorParams = sel.toString();
221  }
222 
223  sel.removeAllRanges();
224  sel.addRange(range);
225  } else if (typeof document.selection != "undefined" && typeof document.body.createTextRange != "undefined") {
226  textRange = document.body.createTextRange();
227  textRange.moveToElementText(this.table.element);
228  textRange.select();
229  }
230 
231  this.setSelector(selector);
232  this.copySelectorParams = typeof selectorParams != "undefined" && selectorParams != null ? selectorParams : this.config.columnHeaders;
233  this.setFormatter(formatter);
234  this.copyFormatterParams = typeof formatterParams != "undefined" && formatterParams != null ? formatterParams : {};
235 
236  document.execCommand('copy');
237 
238  if(sel){
239  sel.removeAllRanges();
240  }
241  }
242 };
243 
244 Clipboard.prototype.setSelector = function(selector){
245  selector = selector || this.table.options.clipboardCopySelector;
246 
247  switch(typeof selector){
248  case "string":
249  if(this.copySelectors[selector]){
250  this.copySelector = this.copySelectors[selector];
251  }else{
252  console.warn("Clipboard Error - No such selector found:", selector);
253  }
254  break;
255 
256  case "function":
257  this.copySelector = selector;
258  break;
259  }
260 };
261 
262 Clipboard.prototype.setFormatter = function(formatter){
263 
264  formatter = formatter || this.table.options.clipboardCopyFormatter;
265 
266  switch(typeof formatter){
267  case "string":
268  if(this.copyFormatters[formatter]){
269  this.copyFormatter = this.copyFormatters[formatter];
270  }else{
271  console.warn("Clipboard Error - No such formatter found:", formatter);
272  }
273  break;
274 
275  case "function":
276  this.copyFormatter = formatter;
277  break;
278  }
279 };
280 
281 
282 Clipboard.prototype.generateContent = function(){
283  var data;
284 
285  this.htmlElement = false;
286  data = this.copySelector.call(this, this.config, this.copySelectorParams);
287 
288  return this.copyFormatter.call(this, data, this.config, this.copyFormatterParams);
289 };
290 
291 Clipboard.prototype.generateSimpleHeaders = function(columns){
292  var headers = [];
293 
294  columns.forEach(function(column){
295  headers.push(column.definition.title);
296  });
297 
298  return headers;
299 };
300 
301 Clipboard.prototype.generateColumnGroupHeaders = function(columns){
302  var output = [];
303 
304  this.table.columnManager.columns.forEach((column) => {
305  var colData = this.processColumnGroup(column);
306 
307  if(colData){
308  output.push(colData);
309  }
310  });
311 
312  return output;
313 };
314 
315 Clipboard.prototype.processColumnGroup = function(column){
316  var subGroups = column.columns;
317 
318  var groupData = {
319  type:"group",
320  title:column.definition.title,
321  column:column,
322  };
323 
324  if(subGroups.length){
325  groupData.subGroups = [];
326  groupData.width = 0;
327 
328  subGroups.forEach((subGroup) => {
329  var subGroupData = this.processColumnGroup(subGroup);
330 
331  if(subGroupData){
332  groupData.width += subGroupData.width;
333  groupData.subGroups.push(subGroupData);
334  }
335  });
336 
337  if(!groupData.width){
338  return false;
339  }
340  }else{
341  if(column.field && (column.definition.clipboard || (column.visible && column.definition.clipboard !== false))){
342  groupData.width = 1;
343  }else{
344  return false;
345  }
346  }
347 
348  return groupData;
349 };
350 
351 Clipboard.prototype.groupHeadersToRows = function(columns){
352 
353  var headers = [];
354 
355  function parseColumnGroup(column, level){
356 
357  if(typeof headers[level] === "undefined"){
358  headers[level] = [];
359  }
360 
361  headers[level].push(column.title);
362 
363  if(column.subGroups){
364  column.subGroups.forEach(function(subGroup){
365  parseColumnGroup(subGroup, level+1);
366  });
367  }else{
368  padColumnheaders();
369  }
370  }
371 
372  function padColumnheaders(){
373  var max = 0;
374 
375  headers.forEach(function(title){
376  var len = title.length;
377  if(len > max){
378  max = len;
379  }
380  });
381 
382  headers.forEach(function(title){
383  var len = title.length;
384  if(len < max){
385  for(var i = len; i < max; i++){
386  title.push("");
387  }
388  }
389  });
390  }
391 
392  columns.forEach(function(column){
393  parseColumnGroup(column,0);
394  });
395 
396  return headers;
397 };
398 
399 Clipboard.prototype.rowsToData = function(rows, columns, config, params){
400  var data = [];
401 
402  rows.forEach(function(row){
403  var rowArray = [],
404  rowData = row instanceof RowComponent ? row.getData("clipboard") : row;
405 
406  columns.forEach(function(column){
407  var value = column.getFieldValue(rowData);
408 
409  switch(typeof value){
410  case "object":
411  value = JSON.stringify(value);
412  break;
413 
414  case "undefined":
415  case "null":
416  value = "";
417  break;
418 
419  default:
420  value = value;
421  }
422 
423  rowArray.push(value);
424  });
425 
426  data.push(rowArray);
427  });
428 
429  return data;
430 };
431 
432 Clipboard.prototype.buildComplexRows = function(config){
433  var output = [],
434  groups = this.table.modules.groupRows.getGroups();
435 
436  groups.forEach((group) => {
437  output.push(this.processGroupData(group));
438  });
439 
440  return output;
441 };
442 
443 
444 
445 Clipboard.prototype.processGroupData = function(group){
446  var subGroups = group.getSubGroups();
447 
448  var groupData = {
449  type:"group",
450  key:group.key
451  };
452 
453  if(subGroups.length){
454  groupData.subGroups = [];
455 
456  subGroups.forEach((subGroup) => {
457  groupData.subGroups.push(this.processGroupData(subGroup));
458  });
459  }else{
460  groupData.rows = group.getRows(true);
461  }
462 
463  return groupData;
464 };
465 
466 Clipboard.prototype.getCalcRow = function (calcs, columns, selector, pos){
467  var calcData = calcs[selector];
468 
469  if(calcData){
470  if(pos){
471  calcData = calcData[pos];
472  }
473 
474  if(Object.keys(calcData).length){
475  return this.rowsToData([calcData], columns);
476  }
477  }
478 
479  return [];
480 };
481 
482 
483 Clipboard.prototype.buildOutput = function(rows, config, params){
484  var output = [],
485  calcs,
486  columns = [],
487  columnsByIndex = [];
488 
489  this.table.columnManager.columnsByIndex.forEach(function(column){
490  if(column.definition.clipboard || (column.visible && column.definition.clipboard !== false)){
491  columnsByIndex.push(column);
492  }
493  });
494 
495  if(config.columnHeaders == "groups"){
496  columns = this.generateColumnGroupHeaders(this.table.columnManager.columns);
497  output = output.concat(this.groupHeadersToRows(columns));
498  }else{
499  columns = columnsByIndex;
500 
501  output.push(this.generateSimpleHeaders(columns));
502  }
503 
504  if(this.config.columnCalcs){
505  calcs = this.table.getCalcResults();
506  }
507 
508  //generate styled content
509  if(this.table.options.clipboardCopyStyled){
510  this.generateHTML(rows, columns, calcs, config, params);
511  }
512 
513  //generate unstyled content
514  if(config.rowGroups){
515  rows.forEach((row) => {
516  output = output.concat(this.parseRowGroupData(row, columnsByIndex, config, params, calcs || {}));
517  });
518  }else{
519  if(config.columnCalcs){
520  output = output.concat(this.getCalcRow(calcs, columnsByIndex, "top"));
521  }
522 
523  output = output.concat(this.rowsToData(rows, columnsByIndex, config, params));
524 
525  if(config.columnCalcs){
526  output = output.concat(this.getCalcRow(calcs, columnsByIndex, "bottom"));
527  }
528  }
529 
530  return output;
531 };
532 
533 
534 Clipboard.prototype.parseRowGroupData = function (group, columns, config, params, calcObj){
535  var groupData = [];
536 
537  groupData.push([group.key]);
538 
539  if(group.subGroups){
540  group.subGroups.forEach((subGroup) => {
541  groupData = groupData.concat(this.parseRowGroupData(subGroup, config, params, calcObj[group.key] ? calcObj[group.key].groups || {} : {}));
542  });
543  }else{
544  if(config.columnCalcs){
545  groupData = groupData.concat(this.getCalcRow(calcObj, columns, group.key, "top"));
546  }
547 
548  groupData = groupData.concat(this.rowsToData(group.rows, columns, config, params));
549 
550  if(config.columnCalcs){
551  groupData = groupData.concat(this.getCalcRow(calcObj, columns, group.key, "bottom"));
552  }
553  }
554 
555  return groupData;
556 };
557 
558 
559 Clipboard.prototype.generateHTML = function (rows, columns, calcs, config, params){
560  var self = this,
561  data = [],
562  headers = [], body, oddRow, evenRow, calcRow, firstRow, firstCell, firstGroup, lastCell, styleCells;
563 
564  //create table element
565  this.htmlElement = document.createElement("table");
566  self.mapElementStyles(this.table.element, this.htmlElement, ["border-top", "border-left", "border-right", "border-bottom"]);
567 
568  function generateSimpleHeaders(){
569  var headerEl = document.createElement("tr");
570 
571  columns.forEach(function(column){
572  var columnEl = document.createElement("th");
573  columnEl.innerHTML = column.definition.title;
574 
575  self.mapElementStyles(column.getElement(), columnEl, ["border-top", "border-left", "border-right", "border-bottom", "background-color", "color", "font-weight", "font-family", "font-size"]);
576 
577  headerEl.appendChild(columnEl);
578  });
579 
580  self.mapElementStyles(self.table.columnManager.getHeadersElement(), headerEl, ["border-top", "border-left", "border-right", "border-bottom", "background-color", "color", "font-weight", "font-family", "font-size"]);
581 
582  self.htmlElement.appendChild(document.createElement("thead").appendChild(headerEl));
583  }
584 
585 
586  function generateHeaders(headers){
587 
588  var headerHolderEl = document.createElement("thead");
589 
590  headers.forEach(function(columns){
591  var headerEl = document.createElement("tr");
592 
593  columns.forEach(function(column){
594  var columnEl = document.createElement("th");
595 
596  if(column.width > 1){
597  columnEl.colSpan = column.width;
598  }
599 
600  if(column.height > 1){
601  columnEl.rowSpan = column.height;
602  }
603 
604  columnEl.innerHTML = column.title;
605 
606  self.mapElementStyles(column.element, columnEl, ["border-top", "border-left", "border-right", "border-bottom", "background-color", "color", "font-weight", "font-family", "font-size"]);
607 
608  headerEl.appendChild(columnEl);
609  });
610 
611  self.mapElementStyles(self.table.columnManager.getHeadersElement(), headerEl, ["border-top", "border-left", "border-right", "border-bottom", "background-color", "color", "font-weight", "font-family", "font-size"]);
612 
613  headerHolderEl.appendChild(headerEl);
614  });
615 
616  self.htmlElement.appendChild(headerHolderEl);
617 
618  }
619 
620  function parseColumnGroup(column, level){
621 
622  var actualColumns = [];
623 
624  if(typeof headers[level] === "undefined"){
625  headers[level] = [];
626  }
627 
628  headers[level].push({
629  title:column.title,
630  width:column.width,
631  height:1,
632  children:!!column.subGroups,
633  element:column.column.getElement(),
634  });
635 
636  if(column.subGroups){
637  column.subGroups.forEach(function(subGroup){
638  actualColumns = actualColumns.concat(parseColumnGroup(subGroup, level+1));
639  });
640 
641  return actualColumns;
642  }else{
643  return [column.column];
644  }
645  }
646 
647  function padVerticalColumnheaders(){
648  headers.forEach(function(row, index){
649  row.forEach(function(header){
650  if(!header.children){
651  header.height = headers.length - index;
652  }
653  });
654  });
655  }
656 
657  function addCalcRow(calcs, selector, pos){
658  var calcData = calcs[selector];
659 
660  if(calcData){
661  if(pos){
662  calcData = calcData[pos];
663  }
664 
665  if(Object.keys(calcData).length){
666  // calcRowIndexs.push(body.length);
667  processRows([calcData]);
668  }
669  }
670  }
671 
672  //create headers if needed
673  if(config.columnHeaders){
674  if(config.columnHeaders == "groups"){
675 
676  var actualColumns = [];
677 
678  columns.forEach(function(column){
679  actualColumns = actualColumns.concat(parseColumnGroup(column,0));
680  });
681 
682  columns = actualColumns;
683 
684  padVerticalColumnheaders();
685  generateHeaders(headers);
686  }else{
687  generateSimpleHeaders();
688  }
689  }
690 
691  // columns = this.table.columnManager.columnsByIndex;
692 
693  //create table body
694  body = document.createElement("tbody");
695 
696  //lookup row styles
697  if(window.getComputedStyle){
698  oddRow = this.table.element.querySelector(".tabulator-row-odd:not(.tabulator-group):not(.tabulator-calcs)");
699  evenRow = this.table.element.querySelector(".tabulator-row-even:not(.tabulator-group):not(.tabulator-calcs)");
700  calcRow = this.table.element.querySelector(".tabulator-row.tabulator-calcs");
701  firstRow = this.table.element.querySelector(".tabulator-row:not(.tabulator-group):not(.tabulator-calcs)");
702  firstGroup = this.table.element.getElementsByClassName("tabulator-group")[0];
703 
704  if(firstRow){
705  styleCells = firstRow.getElementsByClassName("tabulator-cell");
706  firstCell = styleCells[0];
707  lastCell = styleCells[styleCells.length - 1];
708  }
709  }
710 
711  function processRows(rowArray){
712  //add rows to table
713  rowArray.forEach(function(row, i){
714  var rowEl = document.createElement("tr"),
715  styleRow = firstRow,
716  isCalc = false,
717  rowData;
718 
719  if(row instanceof RowComponent){
720  rowData = row.getData("clipboard");
721  }else{
722  rowData = row;
723  isCalc = true;
724  }
725 
726  columns.forEach(function(column, j){
727  var cellEl = document.createElement("td"),
728  value = column.getFieldValue(rowData);
729 
730  switch(typeof value){
731  case "object":
732  value = JSON.stringify(value);
733  break;
734 
735  case "undefined":
736  case "null":
737  value = "";
738  break;
739 
740  default:
741  value = value;
742  }
743 
744  cellEl.innerHTML = value;
745 
746  if(column.definition.align){
747  cellEl.style.textAlign = column.definition.align;
748  }
749 
750  if(j < columns.length - 1){
751  if(firstCell){
752  self.mapElementStyles(firstCell, cellEl, ["border-top", "border-left", "border-right", "border-bottom", "color", "font-weight", "font-family", "font-size"]);
753  }
754  }else{
755  if(firstCell){
756  self.mapElementStyles(firstCell, cellEl, ["border-top", "border-left", "border-right", "border-bottom", "color", "font-weight", "font-family", "font-size"]);
757  }
758  }
759 
760  rowEl.appendChild(cellEl);
761  });
762 
763  if(isCalc){
764  styleRow = calcRow;
765  }else{
766  if(!(i % 2) && oddRow){
767  styleRow = oddRow;
768  }
769 
770  if((i % 2) && evenRow){
771  styleRow = evenRow;
772  }
773  }
774 
775  if(styleRow){
776  self.mapElementStyles(styleRow, rowEl, ["border-top", "border-left", "border-right", "border-bottom", "color", "font-weight", "font-family", "font-size", "background-color"]);
777  }
778 
779  body.appendChild(rowEl);
780  });
781  }
782 
783  function processGroup(group, calcObj){
784  var groupEl = document.createElement("tr"),
785  groupCellEl = document.createElement("td");
786 
787  groupCellEl.colSpan = columns.length;
788 
789  groupCellEl.innerHTML = group.key;
790 
791  groupEl.appendChild(groupCellEl);
792  body.appendChild(groupEl);
793 
794  self.mapElementStyles(firstGroup, groupEl, ["border-top", "border-left", "border-right", "border-bottom", "color", "font-weight", "font-family", "font-size", "background-color"]);
795 
796  if(group.subGroups){
797  group.subGroups.forEach((subGroup) => {
798  processGroup(subGroup, calcObj[group.key] ? calcObj[group.key].groups || {} : {});
799  });
800  }else{
801  if(config.columnCalcs){
802  addCalcRow(calcObj, group.key, "top");
803  }
804 
805  processRows(group.rows);
806 
807  if(config.columnCalcs){
808  addCalcRow(calcObj, group.key, "bottom");
809  }
810  }
811 
812  }
813 
814  if(config.rowGroups){
815  rows.forEach((group) => {
816  processGroup(group, calcs || {});
817  });
818  }else{
819  if(config.columnCalcs){
820  addCalcRow(calcs, "top");
821  }
822 
823  processRows(rows);
824 
825  if(config.columnCalcs){
826  addCalcRow(calcs, "bottom");
827  }
828  }
829 
830  this.htmlElement.appendChild(body);
831 };
832 
833 Clipboard.prototype.mapElementStyles = function(from, to, props){
834 
835  var lookup = {
836  "background-color" : "backgroundColor",
837  "color" : "fontColor",
838  "font-weight" : "fontWeight",
839  "font-family" : "fontFamily",
840  "font-size" : "fontSize",
841  "border-top" : "borderTop",
842  "border-left" : "borderLeft",
843  "border-right" : "borderRight",
844  "border-bottom" : "borderBottom",
845  };
846 
847  if(window.getComputedStyle){
848  var fromStyle = window.getComputedStyle(from);
849 
850  props.forEach(function(prop){
851  to.style[lookup[prop]] = fromStyle.getPropertyValue(prop);
852  });
853  }
854 
855  // return window.getComputedStyle ? window.getComputedStyle(element, null).getPropertyValue(property) : element.style[property.replace(/-([a-z])/g, function (g) { return g[1].toUpperCase(); })];
856 };
857 
858 
859 Clipboard.prototype.copySelectors = {
860  userSelection: function(config, params){
861  return params;
862  },
863  selected: function(config, params){
864  var rows = [];
865 
866  if(this.table.modExists("selectRow", true)){
867  rows = this.table.modules.selectRow.getSelectedRows();
868  }
869 
870  if(config.rowGroups){
871  console.warn("Clipboard Warning - select coptSelector does not support row groups");
872  }
873 
874  return this.buildOutput(rows, config, params)
875  },
876  table: function(config, params){
877  if(config.rowGroups){
878  console.warn("Clipboard Warning - table coptSelector does not support row groups");
879  }
880 
881  return this.buildOutput(this.table.rowManager.getComponents(), config, params);
882  },
883  active: function(config, params){
884  var rows;
885 
886  if(config.rowGroups){
887  rows = this.buildComplexRows(config);
888  }else{
889  rows = this.table.rowManager.getComponents("active");
890  }
891 
892  return this.buildOutput(rows, config, params);
893  },
894  visible: function(config, params){
895  var rows;
896 
897  if(config.rowGroups){
898  rows = this.buildComplexRows(config);
899  }else{
900  rows = this.table.rowManager.getComponents("visible");
901  }
902 
903  return this.buildOutput(rows, config, params);
904  },
905 };
906 
907 Clipboard.prototype.copyFormatters = {
908  raw: function(data, params){
909  return data;
910  },
911  table: function(data, params){
912  var output = [];
913 
914  data.forEach(function(row){
915  var newRow = [];
916  row.forEach(function(value){
917  if(typeof value == "undefined"){
918  value = "";
919  }
920 
921  value = typeof value == "undefined" || value === null ? "" : value.toString();
922 
923  if(value.match(/\r|\n/)){
924  value = value.split('"').join('""');
925  value = '"' + value + '"';
926  }
927  newRow.push(value);
928  });
929 
930  output.push(newRow.join("\t"));
931  });
932 
933  return output.join("\n");
934  },
935 };
936 
937 Clipboard.prototype.pasteParsers = {
938  table:function(clipboard){
939  var data = [],
940  success = false,
941  headerFindSuccess = true,
942  columns = this.table.columnManager.columns,
943  columnMap = [],
944  rows = [];
945 
946  //get data from clipboard into array of columns and rows.
947  clipboard = clipboard.split("\n");
948 
949  clipboard.forEach(function(row){
950  data.push(row.split("\t"));
951  });
952 
953  if(data.length && !(data.length === 1 && data[0].length < 2)){
954  success = true;
955 
956  //check if headers are present by title
957  data[0].forEach(function(value){
958  var column = columns.find(function(column){
959  return value && column.definition.title && value.trim() && column.definition.title.trim() === value.trim();
960  });
961 
962  if(column){
963  columnMap.push(column);
964  }else{
965  headerFindSuccess = false;
966  }
967  });
968 
969  //check if column headers are present by field
970  if(!headerFindSuccess){
971  headerFindSuccess = true;
972  columnMap = [];
973 
974  data[0].forEach(function(value){
975  var column = columns.find(function(column){
976  return value && column.field && value.trim() && column.field.trim() === value.trim();
977  });
978 
979  if(column){
980  columnMap.push(column);
981  }else{
982  headerFindSuccess = false;
983  }
984  });
985 
986  if(!headerFindSuccess){
987  columnMap = this.table.columnManager.columnsByIndex;
988  }
989  }
990 
991  //remove header row if found
992  if(headerFindSuccess){
993  data.shift();
994  }
995 
996  data.forEach(function(item){
997  var row = {};
998 
999  item.forEach(function(value, i){
1000  if(columnMap[i]){
1001  row[columnMap[i].field] = value;
1002  }
1003  });
1004 
1005  rows.push(row);
1006  });
1007 
1008  return rows;
1009  }else{
1010  return false;
1011  }
1012  }
1013 };
1014 
1015 Clipboard.prototype.pasteActions = {
1016  replace:function(rows){
1017  return this.table.setData(rows);
1018  },
1019  update:function(rows){
1020  return this.table.updateOrAddData(rows);
1021  },
1022  insert:function(rows){
1023  return this.table.addData(rows);
1024  },
1025 };
1026 
1027 
1028 
1029 Tabulator.prototype.registerModule("clipboard", Clipboard);