ui.data_grid.export.js 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794
  1. /**
  2. * DevExtreme (ui/data_grid/ui.data_grid.export.js)
  3. * Version: 19.1.16
  4. * Build date: Tue Oct 18 2022
  5. *
  6. * Copyright (c) 2012 - 2022 Developer Express Inc. ALL RIGHTS RESERVED
  7. * Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/
  8. */
  9. "use strict";
  10. var _renderer = require("../../core/renderer");
  11. var _renderer2 = _interopRequireDefault(_renderer);
  12. var _class = require("../../core/class");
  13. var _class2 = _interopRequireDefault(_class);
  14. var _type = require("../../core/utils/type");
  15. var _extend = require("../../core/utils/extend");
  16. var _position = require("../../core/utils/position");
  17. var _array = require("../../core/utils/array");
  18. var _array2 = _interopRequireDefault(_array);
  19. var _uiData_grid = require("./ui.data_grid.core");
  20. var _uiData_grid2 = _interopRequireDefault(_uiData_grid);
  21. var _uiGrid_core = require("../grid_core/ui.grid_core.export_mixin");
  22. var _uiGrid_core2 = _interopRequireDefault(_uiGrid_core);
  23. var _exporter = require("../../exporter");
  24. var _message = require("../../localization/message");
  25. var _message2 = _interopRequireDefault(_message);
  26. var _button = require("../button");
  27. var _button2 = _interopRequireDefault(_button);
  28. var _list = require("../list");
  29. var _list2 = _interopRequireDefault(_list);
  30. var _context_menu = require("../context_menu");
  31. var _context_menu2 = _interopRequireDefault(_context_menu);
  32. var _deferred = require("../../core/utils/deferred");
  33. function _interopRequireDefault(obj) {
  34. return obj && obj.__esModule ? obj : {
  35. "default": obj
  36. }
  37. }
  38. var DATAGRID_EXPORT_MENU_CLASS = "dx-datagrid-export-menu";
  39. var DATAGRID_EXPORT_BUTTON_CLASS = "dx-datagrid-export-button";
  40. var DATAGRID_EXPORT_ICON = "export-to";
  41. var DATAGRID_EXPORT_EXCEL_ICON = "exportxlsx";
  42. var DATAGRID_EXPORT_SELECTED_ICON = "exportselected";
  43. var DATAGRID_EXPORT_EXCEL_BUTTON_ICON = "export-excel-button";
  44. var TOOLBAR_ITEM_AUTO_HIDE_CLASS = "dx-toolbar-item-auto-hide";
  45. var TOOLBAR_HIDDEN_BUTTON_CLASS = "dx-toolbar-hidden-button";
  46. var BUTTON_CLASS = "dx-button";
  47. var DATA_STYLE_OFFSET = 3;
  48. exports.DataProvider = _class2.default.inherit({
  49. _getGroupValue: function(item) {
  50. var key = item.key,
  51. data = item.data,
  52. rowType = item.rowType,
  53. groupIndex = item.groupIndex,
  54. summaryCells = item.summaryCells;
  55. var groupColumn = this._options.groupColumns[groupIndex];
  56. var value = _uiData_grid2.default.getDisplayValue(groupColumn, groupColumn.deserializeValue ? groupColumn.deserializeValue(key[groupIndex]) : key[groupIndex], data, rowType);
  57. var result = groupColumn.caption + ": " + _uiData_grid2.default.formatValue(value, groupColumn);
  58. if (summaryCells && summaryCells[0] && summaryCells[0].length) {
  59. result += " " + _uiData_grid2.default.getGroupRowSummaryText(summaryCells[0], this._options.summaryTexts)
  60. }
  61. return result
  62. },
  63. _correctCellIndex: function(cellIndex) {
  64. return cellIndex
  65. },
  66. _initOptions: function() {
  67. var exportController = this._exportController;
  68. var groupColumns = exportController._columnsController.getGroupColumns();
  69. var excelWrapTextEnabled = exportController.option("export.excelWrapTextEnabled");
  70. this._options = {
  71. columns: exportController._getColumns(this._initialColumnWidthsByColumnIndex),
  72. groupColumns: groupColumns,
  73. items: this._selectedRowsOnly || exportController._selectionOnly ? exportController._getSelectedItems() : exportController._getAllItems(),
  74. getVisibleIndex: exportController._columnsController.getVisibleIndex.bind(exportController._columnsController),
  75. isHeadersVisible: exportController.option("showColumnHeaders"),
  76. summaryTexts: exportController.option("summary.texts"),
  77. customizeExportData: exportController.option("customizeExportData"),
  78. rtlEnabled: exportController.option("rtlEnabled"),
  79. wrapTextEnabled: (0, _type.isDefined)(excelWrapTextEnabled) ? excelWrapTextEnabled : !!exportController.option("wordWrapEnabled"),
  80. customizeExcelCell: exportController.option("export.customizeExcelCell")
  81. }
  82. },
  83. hasCustomizeExcelCell: function() {
  84. return (0, _type.isDefined)(this._options.customizeExcelCell)
  85. },
  86. customizeExcelCell: function(e, cellSourceData) {
  87. if (this._options.customizeExcelCell) {
  88. e.gridCell = cellSourceData;
  89. if ((0, _type.isDefined)(this._exportController) && (0, _type.isDefined)(this._exportController.component)) {
  90. e.component = this._exportController.component
  91. }
  92. this._options.customizeExcelCell(e)
  93. }
  94. },
  95. ctor: function(exportController, initialColumnWidthsByColumnIndex, selectedRowsOnly) {
  96. this._exportController = exportController;
  97. this._initialColumnWidthsByColumnIndex = initialColumnWidthsByColumnIndex;
  98. this._selectedRowsOnly = selectedRowsOnly
  99. },
  100. getStyles: function() {
  101. var wrapTextEnabled = this._options.wrapTextEnabled;
  102. var styles = ["center", "left", "right"].map(function(alignment) {
  103. return {
  104. bold: true,
  105. alignment: alignment,
  106. wrapText: true
  107. }
  108. });
  109. this.getColumns().forEach(function(column) {
  110. styles.push({
  111. alignment: column.alignment || "left",
  112. format: column.format,
  113. wrapText: wrapTextEnabled,
  114. dataType: column.dataType
  115. })
  116. });
  117. styles.push({
  118. bold: true,
  119. wrapText: false,
  120. alignment: (0, _position.getDefaultAlignment)(this._options.rtlEnabled)
  121. });
  122. return styles
  123. },
  124. _getTotalCellStyleId: function(cellIndex) {
  125. var alignment = this.getColumns()[cellIndex] && this.getColumns()[cellIndex].alignment || "right";
  126. return ["center", "left", "right"].indexOf(alignment)
  127. },
  128. getStyleId: function(rowIndex, cellIndex) {
  129. if (rowIndex < this.getHeaderRowCount()) {
  130. return 0
  131. } else {
  132. if (this.isTotalCell(rowIndex - this.getHeaderRowCount(), cellIndex)) {
  133. return this._getTotalCellStyleId(cellIndex)
  134. } else {
  135. if (this.isGroupRow(rowIndex - this.getHeaderRowCount())) {
  136. return DATA_STYLE_OFFSET + this.getColumns().length
  137. } else {
  138. return cellIndex + DATA_STYLE_OFFSET
  139. }
  140. }
  141. }
  142. },
  143. getColumns: function(getColumnsByAllRows) {
  144. var columns = this._options.columns;
  145. return getColumnsByAllRows ? columns : columns[columns.length - 1]
  146. },
  147. getRowsCount: function() {
  148. return this._options.items.length + this.getHeaderRowCount()
  149. },
  150. getHeaderRowCount: function() {
  151. if (this.isHeadersVisible()) {
  152. return this._options.columns.length - 1
  153. }
  154. return 0
  155. },
  156. isGroupRow: function(rowIndex) {
  157. return rowIndex < this._options.items.length && "group" === this._options.items[rowIndex].rowType
  158. },
  159. getGroupLevel: function(rowIndex) {
  160. var item = this._options.items[rowIndex - this.getHeaderRowCount()];
  161. var groupIndex = item && item.groupIndex;
  162. if (item && "totalFooter" === item.rowType) {
  163. return 0
  164. }
  165. return (0, _type.isDefined)(groupIndex) ? groupIndex : this._options.groupColumns.length
  166. },
  167. getCellType: function(rowIndex, cellIndex) {
  168. var columns = this.getColumns();
  169. if (rowIndex < this.getHeaderRowCount()) {
  170. return "string"
  171. } else {
  172. rowIndex -= this.getHeaderRowCount()
  173. }
  174. if (cellIndex < columns.length) {
  175. var item = this._options.items.length && this._options.items[rowIndex];
  176. var column = columns[cellIndex];
  177. if (item && "data" === item.rowType) {
  178. if (isFinite(item.values[this._correctCellIndex(cellIndex)]) && !(0, _type.isDefined)(column.customizeText)) {
  179. return (0, _type.isDefined)(column.lookup) ? column.lookup.dataType : column.dataType
  180. }
  181. }
  182. return "string"
  183. }
  184. },
  185. ready: function() {
  186. var that = this;
  187. that._initOptions();
  188. var options = this._options;
  189. return (0, _deferred.when)(options.items).done(function(items) {
  190. options.customizeExportData && options.customizeExportData(that.getColumns(that.getHeaderRowCount() > 1), items);
  191. options.items = items
  192. }).fail(function() {
  193. options.items = []
  194. })
  195. },
  196. _convertFromGridGroupSummaryItems: function(gridGroupSummaryItems) {
  197. var result;
  198. if ((0, _type.isDefined)(gridGroupSummaryItems) && gridGroupSummaryItems.length > 0) {
  199. result = gridGroupSummaryItems.map(function(item) {
  200. return {
  201. value: item.value,
  202. name: item.name
  203. }
  204. })
  205. }
  206. return result
  207. },
  208. getCellData: function(rowIndex, cellIndex, isExcelJS) {
  209. var value;
  210. var column;
  211. var result = {
  212. cellSourceData: {},
  213. value: value
  214. };
  215. var columns = this.getColumns();
  216. var correctedCellIndex = this._correctCellIndex(cellIndex);
  217. if (rowIndex < this.getHeaderRowCount()) {
  218. var columnsRow = this.getColumns(true)[rowIndex];
  219. column = columnsRow[cellIndex];
  220. result.cellSourceData.rowType = "header";
  221. result.cellSourceData.column = column && column.gridColumn;
  222. result.value = column && column.caption
  223. } else {
  224. rowIndex -= this.getHeaderRowCount();
  225. var item = this._options.items.length && this._options.items[rowIndex];
  226. if (item) {
  227. var itemValues = item.values;
  228. result.cellSourceData.rowType = item.rowType;
  229. result.cellSourceData.column = columns[cellIndex] && columns[cellIndex].gridColumn;
  230. switch (item.rowType) {
  231. case "groupFooter":
  232. case "totalFooter":
  233. if (correctedCellIndex < itemValues.length) {
  234. value = itemValues[correctedCellIndex];
  235. if ((0, _type.isDefined)(value)) {
  236. result.cellSourceData.value = value.value;
  237. result.cellSourceData.totalSummaryItemName = value.name;
  238. result.value = _uiData_grid2.default.getSummaryText(value, this._options.summaryTexts)
  239. } else {
  240. result.cellSourceData.value = void 0
  241. }
  242. }
  243. break;
  244. case "group":
  245. result.cellSourceData.groupIndex = item.groupIndex;
  246. if (cellIndex < 1) {
  247. result.cellSourceData.column = this._options.groupColumns[item.groupIndex];
  248. result.cellSourceData.value = item.key[item.groupIndex];
  249. result.cellSourceData.groupSummaryItems = this._convertFromGridGroupSummaryItems(item.summaryCells[0]);
  250. result.value = this._getGroupValue(item)
  251. } else {
  252. var summaryItems = item.values[correctedCellIndex];
  253. if (Array.isArray(summaryItems)) {
  254. result.cellSourceData.groupSummaryItems = this._convertFromGridGroupSummaryItems(summaryItems);
  255. value = "";
  256. for (var i = 0; i < summaryItems.length; i++) {
  257. value += (i > 0 ? isExcelJS ? "\n" : " \n " : "") + _uiData_grid2.default.getSummaryText(summaryItems[i], this._options.summaryTexts)
  258. }
  259. result.value = value
  260. } else {
  261. result.cellSourceData.value = void 0
  262. }
  263. }
  264. break;
  265. default:
  266. column = columns[cellIndex];
  267. if (column) {
  268. var _value = itemValues[correctedCellIndex];
  269. var displayValue = _uiData_grid2.default.getDisplayValue(column, _value, item.data, item.rowType);
  270. result.value = !isFinite(displayValue) || column.customizeText ? _uiData_grid2.default.formatValue(displayValue, column) : displayValue;
  271. result.cellSourceData.value = _value
  272. }
  273. result.cellSourceData.data = item.data
  274. }
  275. }
  276. }
  277. return result
  278. },
  279. isHeadersVisible: function() {
  280. return this._options.isHeadersVisible
  281. },
  282. isTotalCell: function(rowIndex, cellIndex) {
  283. var items = this._options.items;
  284. var item = items[rowIndex];
  285. var correctCellIndex = this._correctCellIndex(cellIndex);
  286. var isSummaryAlignByColumn = item.summaryCells && item.summaryCells[correctCellIndex] && item.summaryCells[correctCellIndex].length > 0 && item.summaryCells[correctCellIndex][0].alignByColumn;
  287. return item && "groupFooter" === item.rowType || "totalFooter" === item.rowType || isSummaryAlignByColumn
  288. },
  289. getCellMerging: function(rowIndex, cellIndex) {
  290. var columns = this._options.columns;
  291. var column = columns[rowIndex] && columns[rowIndex][cellIndex];
  292. return column ? {
  293. colspan: (column.exportColspan || 1) - 1,
  294. rowspan: (column.rowspan || 1) - 1
  295. } : {
  296. colspan: 0,
  297. rowspan: 0
  298. }
  299. },
  300. getFrozenArea: function() {
  301. var that = this;
  302. return {
  303. x: 0,
  304. y: that.getHeaderRowCount()
  305. }
  306. }
  307. });
  308. exports.ExportController = _uiData_grid2.default.ViewController.inherit({}).include(_uiGrid_core2.default).inherit({
  309. _getEmptyCell: function() {
  310. return {
  311. caption: "",
  312. colspan: 1,
  313. rowspan: 1
  314. }
  315. },
  316. _updateColumnWidth: function(column, width) {
  317. column.width = width
  318. },
  319. _getColumns: function(initialColumnWidthsByColumnIndex) {
  320. var result = [];
  321. var i;
  322. var columns;
  323. var columnsController = this._columnsController;
  324. var rowCount = columnsController.getRowCount();
  325. for (i = 0; i <= rowCount; i++) {
  326. var currentHeaderRow = [];
  327. columns = columnsController.getVisibleColumns(i, true);
  328. var columnWidthsByColumnIndex = void 0;
  329. if (i === rowCount) {
  330. if (this._updateLockCount) {
  331. columnWidthsByColumnIndex = initialColumnWidthsByColumnIndex
  332. } else {
  333. var columnWidths = this._getColumnWidths(this._headersView, this._rowsView);
  334. if (columnWidths && columnWidths.length) {
  335. columnWidthsByColumnIndex = {};
  336. for (var _i = 0; _i < columns.length; _i++) {
  337. columnWidthsByColumnIndex[columns[_i].index] = columnWidths[_i]
  338. }
  339. }
  340. }
  341. }
  342. for (var j = 0; j < columns.length; j++) {
  343. var column = (0, _extend.extend)({}, columns[j], {
  344. dataType: "datetime" === columns[j].dataType ? "date" : columns[j].dataType,
  345. gridColumn: columns[j]
  346. });
  347. if (this._needColumnExporting(column)) {
  348. var currentColspan = this._calculateExportColspan(column);
  349. if ((0, _type.isDefined)(currentColspan)) {
  350. column.exportColspan = currentColspan
  351. }
  352. if (columnWidthsByColumnIndex) {
  353. this._updateColumnWidth(column, columnWidthsByColumnIndex[column.index])
  354. }
  355. currentHeaderRow.push(column)
  356. }
  357. }
  358. result.push(currentHeaderRow)
  359. }
  360. columns = result[rowCount];
  361. result = this._prepareItems(result.slice(0, -1));
  362. result.push(columns);
  363. return result
  364. },
  365. _calculateExportColspan: function(column) {
  366. var _this = this;
  367. if (!column.isBand) {
  368. return
  369. }
  370. var childColumns = this._columnsController.getChildrenByBandColumn(column.index, true);
  371. if (!(0, _type.isDefined)(childColumns)) {
  372. return
  373. }
  374. return childColumns.reduce(function(result, childColumn) {
  375. if (_this._needColumnExporting(childColumn)) {
  376. return result + (_this._calculateExportColspan(childColumn) || 1)
  377. } else {
  378. return result
  379. }
  380. }, 0)
  381. },
  382. _needColumnExporting: function(column) {
  383. return !column.command && (column.allowExporting || void 0 === column.allowExporting)
  384. },
  385. _getFooterSummaryItems: function(summaryCells, isTotal) {
  386. var result = [];
  387. var estimatedItemsCount = 1;
  388. var i = 0;
  389. do {
  390. var values = [];
  391. for (var j = 0; j < summaryCells.length; j++) {
  392. var summaryCell = summaryCells[j];
  393. var itemsLength = summaryCell.length;
  394. if (estimatedItemsCount < itemsLength) {
  395. estimatedItemsCount = itemsLength
  396. }
  397. values.push(summaryCell[i])
  398. }
  399. result.push({
  400. values: values,
  401. rowType: isTotal ? "totalFooter" : "groupFooter"
  402. })
  403. } while (i++ < estimatedItemsCount - 1);
  404. return result
  405. },
  406. _hasSummaryGroupFooters: function() {
  407. var groupItems = this.option("summary.groupItems");
  408. if ((0, _type.isDefined)(groupItems)) {
  409. for (var i = 0; i < groupItems.length; i++) {
  410. if (groupItems[i].showInGroupFooter) {
  411. return true
  412. }
  413. }
  414. }
  415. return false
  416. },
  417. _getItemsWithSummaryGroupFooters: function(sourceItems) {
  418. var result = [];
  419. var beforeGroupFooterItems = [];
  420. var groupFooterItems = [];
  421. for (var i = 0; i < sourceItems.length; i++) {
  422. var item = sourceItems[i];
  423. if ("groupFooter" === item.rowType) {
  424. groupFooterItems = this._getFooterSummaryItems(item.summaryCells);
  425. result = result.concat(beforeGroupFooterItems, groupFooterItems);
  426. beforeGroupFooterItems = []
  427. } else {
  428. beforeGroupFooterItems.push(item)
  429. }
  430. }
  431. return result.length ? result : beforeGroupFooterItems
  432. },
  433. _updateGroupValuesWithSummaryByColumn: function(sourceItems) {
  434. var summaryValues = [];
  435. for (var i = 0; i < sourceItems.length; i++) {
  436. var item = sourceItems[i];
  437. var summaryCells = item.summaryCells;
  438. if ("group" === item.rowType && summaryCells && summaryCells.length > 1) {
  439. var groupColumnCount = item.values.length;
  440. for (var j = 1; j < summaryCells.length; j++) {
  441. for (var k = 0; k < summaryCells[j].length; k++) {
  442. var summaryItem = summaryCells[j][k];
  443. if (summaryItem && summaryItem.alignByColumn) {
  444. if (!Array.isArray(summaryValues[j - groupColumnCount])) {
  445. summaryValues[j - groupColumnCount] = []
  446. }
  447. summaryValues[j - groupColumnCount].push(summaryItem)
  448. }
  449. }
  450. }
  451. if (summaryValues.length > 0) {
  452. _array2.default.merge(item.values, summaryValues);
  453. summaryValues = []
  454. }
  455. }
  456. }
  457. },
  458. _processUnExportedItems: function(items) {
  459. var columns = this._columnsController.getVisibleColumns(null, true);
  460. var groupColumns = this._columnsController.getGroupColumns();
  461. var values;
  462. var summaryCells;
  463. for (var i = 0; i < items.length; i++) {
  464. var item = items[i];
  465. values = [];
  466. summaryCells = [];
  467. for (var j = 0; j < columns.length; j++) {
  468. var column = columns[j];
  469. if (this._needColumnExporting(column)) {
  470. if (item.values) {
  471. if ("group" === item.rowType && !values.length) {
  472. values.push(item.key[item.groupIndex])
  473. } else {
  474. values.push(item.values[j])
  475. }
  476. }
  477. if (item.summaryCells) {
  478. if ("group" === item.rowType && !summaryCells.length) {
  479. summaryCells.push(item.summaryCells[j - groupColumns.length + item.groupIndex])
  480. } else {
  481. summaryCells.push(item.summaryCells[j])
  482. }
  483. }
  484. }
  485. }
  486. if (values.length) {
  487. item.values = values
  488. }
  489. if (summaryCells.length) {
  490. item.summaryCells = summaryCells
  491. }
  492. }
  493. },
  494. _getAllItems: function(data) {
  495. var that = this;
  496. var d = new _deferred.Deferred;
  497. var dataController = this.getController("data");
  498. var footerItems = dataController.footerItems();
  499. var totalItem = footerItems.length && footerItems[0];
  500. var summaryTotalItems = that.option("summary.totalItems");
  501. var summaryCells;
  502. (0, _deferred.when)(data).done(function(data) {
  503. dataController.loadAll(data).done(function(sourceItems, totalAggregates) {
  504. that._updateGroupValuesWithSummaryByColumn(sourceItems);
  505. if (that._hasSummaryGroupFooters()) {
  506. sourceItems = that._getItemsWithSummaryGroupFooters(sourceItems)
  507. }
  508. summaryCells = totalItem && totalItem.summaryCells;
  509. if ((0, _type.isDefined)(totalAggregates) && summaryTotalItems) {
  510. summaryCells = dataController._getSummaryCells(summaryTotalItems, totalAggregates)
  511. }
  512. var summaryItems = totalItem && that._getFooterSummaryItems(summaryCells, true);
  513. if (summaryItems) {
  514. sourceItems = sourceItems.concat(summaryItems)
  515. }
  516. that._processUnExportedItems(sourceItems);
  517. d.resolve(sourceItems)
  518. }).fail(d.reject)
  519. }).fail(d.reject);
  520. return d
  521. },
  522. _getSelectedItems: function() {
  523. var selectionController = this.getController("selection");
  524. var selectedRowData = selectionController.getSelectedRowsData();
  525. return this._getAllItems(selectedRowData)
  526. },
  527. _getColumnWidths: function(headersView, rowsView) {
  528. return headersView && headersView.isVisible() ? headersView.getColumnWidths() : rowsView.getColumnWidths()
  529. },
  530. init: function() {
  531. this._columnsController = this.getController("columns");
  532. this._rowsView = this.getView("rowsView");
  533. this._headersView = this.getView("columnHeadersView");
  534. this.createAction("onExporting", {
  535. excludeValidators: ["disabled", "readOnly"]
  536. });
  537. this.createAction("onExported", {
  538. excludeValidators: ["disabled", "readOnly"]
  539. });
  540. this.createAction("onFileSaving", {
  541. excludeValidators: ["disabled", "readOnly"]
  542. })
  543. },
  544. callbackNames: function() {
  545. return ["selectionOnlyChanged"]
  546. },
  547. getExportFormat: function() {
  548. return ["EXCEL"]
  549. },
  550. getDataProvider: function(selectedRowsOnly) {
  551. var columnWidths = this._getColumnWidths(this._headersView, this._rowsView);
  552. var initialColumnWidthsByColumnIndex;
  553. if (columnWidths && columnWidths.length) {
  554. initialColumnWidthsByColumnIndex = {};
  555. var columnsLastRowVisibleColumns = this._columnsController.getVisibleColumns(this._columnsController.getRowCount(), true);
  556. for (var i = 0; i < columnsLastRowVisibleColumns.length; i++) {
  557. initialColumnWidthsByColumnIndex[columnsLastRowVisibleColumns[i].index] = columnWidths[i]
  558. }
  559. }
  560. return new exports.DataProvider(this, initialColumnWidthsByColumnIndex, selectedRowsOnly)
  561. },
  562. exportToExcel: function(selectionOnly) {
  563. var that = this;
  564. that._selectionOnly = selectionOnly;
  565. (0, _exporter.export)(that.component.getDataProvider(), {
  566. fileName: that.option("export.fileName"),
  567. proxyUrl: that.option("export.proxyUrl"),
  568. format: "EXCEL",
  569. autoFilterEnabled: !!that.option("export.excelFilterEnabled"),
  570. rtlEnabled: that.option("rtlEnabled"),
  571. ignoreErrors: that.option("export.ignoreExcelErrors"),
  572. exportingAction: that.getAction("onExporting"),
  573. exportedAction: that.getAction("onExported"),
  574. fileSavingAction: that.getAction("onFileSaving")
  575. }, _exporter.excel.getData)
  576. },
  577. publicMethods: function() {
  578. return ["getDataProvider", "getExportFormat", "exportToExcel"]
  579. },
  580. selectionOnly: function(value) {
  581. if ((0, _type.isDefined)(value)) {
  582. this._isSelectedRows = value;
  583. this.selectionOnlyChanged.fire()
  584. } else {
  585. return this._isSelectedRows
  586. }
  587. }
  588. });
  589. _uiData_grid2.default.registerModule("export", {
  590. defaultOptions: function() {
  591. return {
  592. "export": {
  593. enabled: false,
  594. fileName: "DataGrid",
  595. excelFilterEnabled: false,
  596. excelWrapTextEnabled: void 0,
  597. proxyUrl: void 0,
  598. allowExportSelectedData: false,
  599. ignoreExcelErrors: true,
  600. texts: {
  601. exportTo: _message2.default.format("dxDataGrid-exportTo"),
  602. exportAll: _message2.default.format("dxDataGrid-exportAll"),
  603. exportSelectedRows: _message2.default.format("dxDataGrid-exportSelectedRows")
  604. }
  605. }
  606. }
  607. },
  608. controllers: {
  609. "export": exports.ExportController
  610. },
  611. extenders: {
  612. controllers: {
  613. editing: {
  614. callbackNames: function() {
  615. var callbackList = this.callBase();
  616. return (0, _type.isDefined)(callbackList) ? callbackList.push("editingChanged") : ["editingChanged"]
  617. },
  618. _updateEditButtons: function() {
  619. this.callBase();
  620. this.editingChanged.fire(this.hasChanges())
  621. }
  622. }
  623. },
  624. views: {
  625. headerPanel: {
  626. _getToolbarItems: function() {
  627. var items = this.callBase();
  628. return this._appendExportItems(items)
  629. },
  630. _appendExportItems: function(items) {
  631. var that = this;
  632. var exportOptions = that.option("export");
  633. if (exportOptions.enabled) {
  634. var exportItems = [];
  635. if (exportOptions.allowExportSelectedData) {
  636. exportItems.push({
  637. template: function(data, index, container) {
  638. var $container = (0, _renderer2.default)(container);
  639. that._renderButton(data, $container);
  640. that._renderExportMenu($container)
  641. },
  642. menuItemTemplate: function(data, index, container) {
  643. that._renderList(data, (0, _renderer2.default)(container))
  644. },
  645. name: "exportButton",
  646. allowExportSelected: true,
  647. location: "after",
  648. locateInMenu: "auto",
  649. sortIndex: 30
  650. })
  651. } else {
  652. exportItems.push({
  653. template: function(data, index, container) {
  654. that._renderButton(data, (0, _renderer2.default)(container))
  655. },
  656. menuItemTemplate: function(data, index, container) {
  657. that._renderButton(data, (0, _renderer2.default)(container), true)
  658. },
  659. name: "exportButton",
  660. location: "after",
  661. locateInMenu: "auto",
  662. sortIndex: 30
  663. })
  664. }
  665. items = items.concat(exportItems);
  666. that._correctItemsPosition(items)
  667. }
  668. return items
  669. },
  670. _renderButton: function(data, $container, withText) {
  671. var that = this;
  672. var buttonOptions = that._getButtonOptions(data.allowExportSelected);
  673. var $buttonContainer = that._getButtonContainer().addClass(DATAGRID_EXPORT_BUTTON_CLASS).appendTo($container);
  674. if (withText) {
  675. var wrapperNode = (0, _renderer2.default)("<div>").addClass(TOOLBAR_ITEM_AUTO_HIDE_CLASS);
  676. $container.wrapInner(wrapperNode).parent().addClass("dx-toolbar-menu-action dx-toolbar-menu-button " + TOOLBAR_HIDDEN_BUTTON_CLASS);
  677. buttonOptions.text = buttonOptions.hint
  678. }
  679. that._createComponent($buttonContainer, _button2.default, buttonOptions)
  680. },
  681. _renderList: function(data, $container) {
  682. var that = this;
  683. var texts = that.option("export.texts");
  684. var items = [{
  685. template: function(data, index, container) {
  686. that._renderFakeButton(data, (0, _renderer2.default)(container), DATAGRID_EXPORT_EXCEL_ICON)
  687. },
  688. text: texts.exportAll
  689. }, {
  690. template: function(data, index, container) {
  691. that._renderFakeButton(data, (0, _renderer2.default)(container), DATAGRID_EXPORT_SELECTED_ICON)
  692. },
  693. text: texts.exportSelectedRows,
  694. exportSelected: true
  695. }];
  696. that._createComponent($container, _list2.default, {
  697. items: items,
  698. onItemClick: function(e) {
  699. that._exportController.exportToExcel(e.itemData.exportSelected)
  700. },
  701. scrollingEnabled: false
  702. })
  703. },
  704. _renderFakeButton: function(data, $container, iconName) {
  705. var $icon = (0, _renderer2.default)("<div>").addClass("dx-icon dx-icon-" + iconName);
  706. var $text = (0, _renderer2.default)("<span>").addClass("dx-button-text").text(data.text);
  707. var $content = (0, _renderer2.default)("<div>").addClass("dx-button-content").append($icon).append($text);
  708. var $button = (0, _renderer2.default)("<div>").addClass(BUTTON_CLASS + " dx-button-has-text dx-button-has-icon dx-datagrid-toolbar-button").append($content);
  709. var $toolbarItem = (0, _renderer2.default)("<div>").addClass(TOOLBAR_ITEM_AUTO_HIDE_CLASS).append($button);
  710. $container.append($toolbarItem).parent().addClass("dx-toolbar-menu-custom " + TOOLBAR_HIDDEN_BUTTON_CLASS)
  711. },
  712. _correctItemsPosition: function(items) {
  713. items.sort(function(itemA, itemB) {
  714. return itemA.sortIndex - itemB.sortIndex
  715. })
  716. },
  717. _renderExportMenu: function($buttonContainer) {
  718. var that = this;
  719. var $button = $buttonContainer.find("." + BUTTON_CLASS);
  720. var texts = that.option("export.texts");
  721. var menuItems = [{
  722. text: texts.exportAll,
  723. icon: DATAGRID_EXPORT_EXCEL_ICON
  724. }, {
  725. text: texts.exportSelectedRows,
  726. exportSelected: true,
  727. icon: DATAGRID_EXPORT_SELECTED_ICON
  728. }];
  729. var $menuContainer = (0, _renderer2.default)("<div>").appendTo($buttonContainer);
  730. that._contextMenu = that._createComponent($menuContainer, _context_menu2.default, {
  731. showEvent: "dxclick",
  732. items: menuItems,
  733. cssClass: DATAGRID_EXPORT_MENU_CLASS,
  734. onItemClick: function(e) {
  735. that._exportController.exportToExcel(e.itemData.exportSelected)
  736. },
  737. target: $button,
  738. position: {
  739. at: "left bottom",
  740. my: "left top",
  741. offset: "0 3",
  742. collision: "fit",
  743. boundary: that._$parent,
  744. boundaryOffset: "1 1"
  745. }
  746. })
  747. },
  748. _isExportButtonVisible: function() {
  749. return this.option("export.enabled")
  750. },
  751. _getButtonOptions: function(allowExportSelected) {
  752. var that = this;
  753. var texts = that.option("export.texts");
  754. var options;
  755. if (allowExportSelected) {
  756. options = {
  757. hint: texts.exportTo,
  758. icon: DATAGRID_EXPORT_ICON
  759. }
  760. } else {
  761. options = {
  762. hint: texts.exportAll,
  763. icon: DATAGRID_EXPORT_EXCEL_BUTTON_ICON,
  764. onClick: function() {
  765. that._exportController.exportToExcel()
  766. }
  767. }
  768. }
  769. return options
  770. },
  771. optionChanged: function(args) {
  772. this.callBase(args);
  773. if ("export" === args.name) {
  774. args.handled = true;
  775. this._invalidate()
  776. }
  777. },
  778. init: function() {
  779. var that = this;
  780. this.callBase();
  781. this._exportController = this.getController("export");
  782. this._editingController = this.getController("editing");
  783. this._editingController.editingChanged.add(function(hasChanges) {
  784. that.setToolbarItemDisabled("exportButton", hasChanges)
  785. })
  786. },
  787. isVisible: function() {
  788. return this.callBase() || this._isExportButtonVisible()
  789. }
  790. }
  791. }
  792. }
  793. });