e2cf10c158b43cbe17577dd0db71fe93662fc970479051cfdf9e9fda729c955c782390053497fc2b7c01ff5031c4d6012f5fa76b94749d13a6aeea7b29ffbc 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. 'use strict';
  2. exports.__esModule = true;
  3. exports.spreadsheetColumnLabel = spreadsheetColumnLabel;
  4. exports.spreadsheetColumnIndex = spreadsheetColumnIndex;
  5. exports.createSpreadsheetData = createSpreadsheetData;
  6. exports.createSpreadsheetObjectData = createSpreadsheetObjectData;
  7. exports.createEmptySpreadsheetData = createEmptySpreadsheetData;
  8. exports.translateRowsToColumns = translateRowsToColumns;
  9. exports.cellMethodLookupFactory = cellMethodLookupFactory;
  10. var _cellTypes = require('./../cellTypes');
  11. var _object = require('./object');
  12. var COLUMN_LABEL_BASE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
  13. var COLUMN_LABEL_BASE_LENGTH = COLUMN_LABEL_BASE.length;
  14. /**
  15. * Generates spreadsheet-like column names: A, B, C, ..., Z, AA, AB, etc.
  16. *
  17. * @param {Number} index Column index.
  18. * @returns {String}
  19. */
  20. function spreadsheetColumnLabel(index) {
  21. var dividend = index + 1;
  22. var columnLabel = '';
  23. var modulo = void 0;
  24. while (dividend > 0) {
  25. modulo = (dividend - 1) % COLUMN_LABEL_BASE_LENGTH;
  26. columnLabel = String.fromCharCode(65 + modulo) + columnLabel;
  27. dividend = parseInt((dividend - modulo) / COLUMN_LABEL_BASE_LENGTH, 10);
  28. }
  29. return columnLabel;
  30. }
  31. /**
  32. * Generates spreadsheet-like column index from theirs labels: A, B, C ...., Z, AA, AB, etc.
  33. *
  34. * @param {String} label Column label.
  35. * @returns {Number}
  36. */
  37. function spreadsheetColumnIndex(label) {
  38. var result = 0;
  39. if (label) {
  40. for (var i = 0, j = label.length - 1; i < label.length; i += 1, j -= 1) {
  41. result += Math.pow(COLUMN_LABEL_BASE_LENGTH, j) * (COLUMN_LABEL_BASE.indexOf(label[i]) + 1);
  42. }
  43. }
  44. --result;
  45. return result;
  46. }
  47. /**
  48. * Creates 2D array of Excel-like values "A1", "A2", ...
  49. *
  50. * @param {Number} rows Number of rows to generate.
  51. * @param {Number} columns Number of columns to generate.
  52. * @returns {Array}
  53. */
  54. function createSpreadsheetData() {
  55. var rows = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 100;
  56. var columns = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 4;
  57. var _rows = [],
  58. i,
  59. j;
  60. for (i = 0; i < rows; i++) {
  61. var row = [];
  62. for (j = 0; j < columns; j++) {
  63. row.push(spreadsheetColumnLabel(j) + (i + 1));
  64. }
  65. _rows.push(row);
  66. }
  67. return _rows;
  68. }
  69. /**
  70. * Creates 2D array of Excel-like values "A1", "A2", as an array of objects.
  71. *
  72. * @param {Number} rows Number of rows to generate.
  73. * @param {Number} colCount Number of columns to generate.
  74. * @returns {Array}
  75. */
  76. function createSpreadsheetObjectData() {
  77. var rows = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 100;
  78. var colCount = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 4;
  79. var _rows = [],
  80. i,
  81. j;
  82. for (i = 0; i < rows; i++) {
  83. var row = {};
  84. for (j = 0; j < colCount; j++) {
  85. row['prop' + j] = spreadsheetColumnLabel(j) + (i + 1);
  86. }
  87. _rows.push(row);
  88. }
  89. return _rows;
  90. }
  91. /**
  92. * Generates an empty data object.
  93. *
  94. * @param {Number} rows Number of rows to generate.
  95. * @param {Number} columns Number of columns to generate
  96. * @returns {Array}
  97. */
  98. function createEmptySpreadsheetData(rows, columns) {
  99. var data = [];
  100. var row = void 0;
  101. for (var i = 0; i < rows; i++) {
  102. row = [];
  103. for (var j = 0; j < columns; j++) {
  104. row.push('');
  105. }
  106. data.push(row);
  107. }
  108. return data;
  109. }
  110. function translateRowsToColumns(input) {
  111. var i,
  112. ilen,
  113. j,
  114. jlen,
  115. output = [],
  116. olen = 0;
  117. for (i = 0, ilen = input.length; i < ilen; i++) {
  118. for (j = 0, jlen = input[i].length; j < jlen; j++) {
  119. if (j == olen) {
  120. output.push([]);
  121. olen++;
  122. }
  123. output[j].push(input[i][j]);
  124. }
  125. }
  126. return output;
  127. }
  128. /**
  129. * Factory that produces a function for searching methods (or any properties) which could be defined directly in
  130. * table configuration or implicitly, within cell type definition.
  131. *
  132. * For example: renderer can be defined explicitly using "renderer" property in column configuration or it can be
  133. * defined implicitly using "type" property.
  134. *
  135. * Methods/properties defined explicitly always takes precedence over those defined through "type".
  136. *
  137. * If the method/property is not found in an object, searching is continued recursively through prototype chain, until
  138. * it reaches the Object.prototype.
  139. *
  140. *
  141. * @param methodName {String} name of the method/property to search (i.e. 'renderer', 'validator', 'copyable')
  142. * @param allowUndefined {Boolean} [optional] if false, the search is continued if methodName has not been found in cell "type"
  143. * @returns {Function}
  144. */
  145. function cellMethodLookupFactory(methodName, allowUndefined) {
  146. allowUndefined = typeof allowUndefined == 'undefined' ? true : allowUndefined;
  147. return function cellMethodLookup(row, col) {
  148. return function getMethodFromProperties(properties) {
  149. if (!properties) {
  150. return; // method not found
  151. } else if ((0, _object.hasOwnProperty)(properties, methodName) && properties[methodName] !== void 0) {
  152. // check if it is own and is not empty
  153. return properties[methodName]; // method defined directly
  154. } else if ((0, _object.hasOwnProperty)(properties, 'type') && properties.type) {
  155. // check if it is own and is not empty
  156. var type;
  157. if (typeof properties.type != 'string') {
  158. throw new Error('Cell type must be a string ');
  159. }
  160. type = (0, _cellTypes.getCellType)(properties.type);
  161. if ((0, _object.hasOwnProperty)(type, methodName)) {
  162. return type[methodName]; // method defined in type.
  163. } else if (allowUndefined) {
  164. return; // method does not defined in type (eg. validator), returns undefined
  165. }
  166. }
  167. return getMethodFromProperties(Object.getPrototypeOf(properties));
  168. }(typeof row == 'number' ? this.getCellMeta(row, col) : row);
  169. };
  170. }