ui.pivot_grid.js 51 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164
  1. /**
  2. * DevExtreme (ui/pivot_grid/ui.pivot_grid.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 _window = require("../../core/utils/window");
  13. var _browser = require("../../core/utils/browser");
  14. var _events_engine = require("../../events/core/events_engine");
  15. var _events_engine2 = _interopRequireDefault(_events_engine);
  16. var _component_registrator = require("../../core/component_registrator");
  17. var _component_registrator2 = _interopRequireDefault(_component_registrator);
  18. var _dom = require("../../core/utils/dom");
  19. var _string = require("../../core/utils/string");
  20. var _common = require("../../core/utils/common");
  21. var _iterator = require("../../core/utils/iterator");
  22. var _type = require("../../core/utils/type");
  23. var _extend = require("../../core/utils/extend");
  24. var _click = require("../../events/click");
  25. var _message = require("../../localization/message");
  26. var _ui = require("../widget/ui.widget");
  27. var _ui2 = _interopRequireDefault(_ui);
  28. var _utils = require("../../events/utils");
  29. var _uiGrid_core = require("../grid_core/ui.grid_core.utils");
  30. var _uiPivot_grid = require("./ui.pivot_grid.utils");
  31. var _uiPivot_grid2 = require("./ui.pivot_grid.data_controller");
  32. var _data_source = require("./data_source");
  33. var _data_source2 = _interopRequireDefault(_data_source);
  34. var _uiPivot_grid3 = require("./ui.pivot_grid.data_area");
  35. var _uiPivot_grid4 = require("./ui.pivot_grid.headers_area");
  36. var _size = require("../../core/utils/size");
  37. var _uiPivot_grid5 = require("./ui.pivot_grid.fields_area");
  38. var _uiPivot_grid6 = require("./ui.pivot_grid.field_chooser");
  39. var _uiPivot_grid7 = _interopRequireDefault(_uiPivot_grid6);
  40. var _uiPivot_grid8 = require("./ui.pivot_grid.field_chooser_base");
  41. var _uiPivot_grid9 = _interopRequireDefault(_uiPivot_grid8);
  42. var _uiPivot_grid10 = require("./ui.pivot_grid.export");
  43. var _uiPivot_grid11 = require("./ui.pivot_grid.chart_integration");
  44. var _uiPivot_grid12 = _interopRequireDefault(_uiPivot_grid11);
  45. var _popup = require("../popup");
  46. var _popup2 = _interopRequireDefault(_popup);
  47. var _context_menu = require("../context_menu");
  48. var _context_menu2 = _interopRequireDefault(_context_menu);
  49. var _deferred = require("../../core/utils/deferred");
  50. function _interopRequireDefault(obj) {
  51. return obj && obj.__esModule ? obj : {
  52. "default": obj
  53. }
  54. }
  55. var window = (0, _window.getWindow)();
  56. var DATA_AREA_CELL_CLASS = "dx-area-data-cell";
  57. var ROW_AREA_CELL_CLASS = "dx-area-row-cell";
  58. var COLUMN_AREA_CELL_CLASS = "dx-area-column-cell";
  59. var DESCRIPTION_AREA_CELL_CLASS = "dx-area-description-cell";
  60. var BORDERS_CLASS = "dx-pivotgrid-border";
  61. var PIVOTGRID_CLASS = "dx-pivotgrid";
  62. var ROW_LINES_CLASS = "dx-row-lines";
  63. var BOTTOM_ROW_CLASS = "dx-bottom-row";
  64. var BOTTOM_BORDER_CLASS = "dx-bottom-border";
  65. var FIELDS_CONTAINER_CLASS = "dx-pivotgrid-fields-container";
  66. var FIELDS_CLASS = "dx-area-fields";
  67. var FIELD_CHOOSER_POPUP_CLASS = "dx-fieldchooser-popup";
  68. var INCOMPRESSIBLE_FIELDS_CLASS = "dx-incompressible-fields";
  69. var OVERFLOW_HIDDEN_CLASS = "dx-overflow-hidden";
  70. var TR = "<tr>";
  71. var TD = "<td>";
  72. var DIV = "<div>";
  73. var TEST_HEIGHT = 66666;
  74. function getArraySum(array) {
  75. var sum = 0;
  76. (0, _iterator.each)(array, function(_, value) {
  77. sum += value || 0
  78. });
  79. return sum
  80. }
  81. function adjustSizeArray(sizeArray, space) {
  82. var delta = space / sizeArray.length;
  83. for (var i = 0; i < sizeArray.length; i++) {
  84. sizeArray[i] -= delta
  85. }
  86. }
  87. function unsubscribeScrollEvents(area) {
  88. area.off("scroll").off("stop")
  89. }
  90. function subscribeToScrollEvent(area, handler) {
  91. unsubscribeScrollEvents(area);
  92. area.on("scroll", handler).on("stop", handler)
  93. }
  94. var scrollBarInfoCache = {};
  95. function getScrollBarInfo(useNativeScrolling) {
  96. if (scrollBarInfoCache[useNativeScrolling]) {
  97. return scrollBarInfoCache[useNativeScrolling]
  98. }
  99. var scrollBarWidth = 0;
  100. var options = {};
  101. var container = (0, _renderer2.default)(DIV).css({
  102. position: "absolute",
  103. visibility: "hidden",
  104. top: -1e3,
  105. left: -1e3,
  106. width: 100,
  107. height: 100
  108. }).appendTo("body");
  109. var content = (0, _renderer2.default)("<p>").css({
  110. width: "100%",
  111. height: 200
  112. }).appendTo(container);
  113. if ("auto" !== useNativeScrolling) {
  114. options.useNative = !!useNativeScrolling;
  115. options.useSimulatedScrollbar = !useNativeScrolling
  116. }
  117. container.dxScrollable(options);
  118. var scrollBarUseNative = container.dxScrollable("instance").option("useNative");
  119. scrollBarWidth = scrollBarUseNative ? container.width() - content.width() : 0;
  120. container.remove();
  121. scrollBarInfoCache[useNativeScrolling] = {
  122. scrollBarWidth: scrollBarWidth,
  123. scrollBarUseNative: scrollBarUseNative
  124. };
  125. return scrollBarInfoCache[useNativeScrolling]
  126. }
  127. function getCommonBorderWidth(elements, direction) {
  128. var borderStyleNames = "width" === direction ? ["borderLeftWidth", "borderRightWidth"] : ["borderTopWidth", "borderBottomWidth"];
  129. var width = 0;
  130. (0, _iterator.each)(elements, function(_, elem) {
  131. var computedStyle = window.getComputedStyle(elem.get(0));
  132. borderStyleNames.forEach(function(borderStyleName) {
  133. width += parseFloat(computedStyle[borderStyleName]) || 0
  134. })
  135. });
  136. return width
  137. }
  138. function clickedOnFieldsArea($targetElement) {
  139. return $targetElement.closest("." + FIELDS_CLASS).length || $targetElement.find("." + FIELDS_CLASS).length
  140. }
  141. var PivotGrid = _ui2.default.inherit({
  142. _getDefaultOptions: function() {
  143. return (0, _extend.extend)(this.callBase(), {
  144. scrolling: {
  145. timeout: 300,
  146. renderingThreshold: 150,
  147. minTimeout: 10,
  148. mode: "standard",
  149. useNative: "auto",
  150. removeInvisiblePages: true,
  151. virtualRowHeight: 50,
  152. virtualColumnWidth: 100
  153. },
  154. encodeHtml: true,
  155. dataSource: null,
  156. activeStateEnabled: false,
  157. fieldChooser: {
  158. minWidth: 250,
  159. minHeight: 250,
  160. enabled: true,
  161. allowSearch: false,
  162. searchTimeout: 500,
  163. layout: 0,
  164. title: (0, _message.format)("dxPivotGrid-fieldChooserTitle"),
  165. width: 600,
  166. height: 600,
  167. applyChangesMode: "instantly"
  168. },
  169. onContextMenuPreparing: null,
  170. allowSorting: false,
  171. allowSortingBySummary: false,
  172. allowFiltering: false,
  173. allowExpandAll: false,
  174. wordWrapEnabled: true,
  175. fieldPanel: {
  176. showColumnFields: true,
  177. showFilterFields: true,
  178. showDataFields: true,
  179. showRowFields: true,
  180. allowFieldDragging: true,
  181. visible: false,
  182. texts: {
  183. columnFieldArea: (0, _message.format)("dxPivotGrid-columnFieldArea"),
  184. rowFieldArea: (0, _message.format)("dxPivotGrid-rowFieldArea"),
  185. filterFieldArea: (0, _message.format)("dxPivotGrid-filterFieldArea"),
  186. dataFieldArea: (0, _message.format)("dxPivotGrid-dataFieldArea")
  187. }
  188. },
  189. dataFieldArea: "column",
  190. "export": {
  191. enabled: false,
  192. fileName: "PivotGrid",
  193. proxyUrl: void 0,
  194. ignoreExcelErrors: true
  195. },
  196. showRowTotals: true,
  197. showRowGrandTotals: true,
  198. showColumnTotals: true,
  199. showColumnGrandTotals: true,
  200. hideEmptySummaryCells: true,
  201. showTotalsPrior: "none",
  202. rowHeaderLayout: "standard",
  203. loadPanel: {
  204. enabled: true,
  205. text: (0, _message.format)("Loading"),
  206. width: 200,
  207. height: 70,
  208. showIndicator: true,
  209. indicatorSrc: "",
  210. showPane: true
  211. },
  212. texts: {
  213. grandTotal: (0, _message.format)("dxPivotGrid-grandTotal"),
  214. total: (0, _message.getFormatter)("dxPivotGrid-total"),
  215. noData: (0, _message.format)("dxDataGrid-noDataText"),
  216. showFieldChooser: (0, _message.format)("dxPivotGrid-showFieldChooser"),
  217. expandAll: (0, _message.format)("dxPivotGrid-expandAll"),
  218. collapseAll: (0, _message.format)("dxPivotGrid-collapseAll"),
  219. sortColumnBySummary: (0, _message.getFormatter)("dxPivotGrid-sortColumnBySummary"),
  220. sortRowBySummary: (0, _message.getFormatter)("dxPivotGrid-sortRowBySummary"),
  221. removeAllSorting: (0, _message.format)("dxPivotGrid-removeAllSorting"),
  222. exportToExcel: (0, _message.format)("dxDataGrid-exportToExcel"),
  223. dataNotAvailable: (0, _message.format)("dxPivotGrid-dataNotAvailable")
  224. },
  225. onCellClick: null,
  226. onCellPrepared: null,
  227. showBorders: false,
  228. stateStoring: {
  229. enabled: false,
  230. storageKey: null,
  231. type: "localStorage",
  232. customLoad: null,
  233. customSave: null,
  234. savingTimeout: 2e3
  235. },
  236. onExpandValueChanging: null,
  237. renderCellCountLimit: 2e4,
  238. onExporting: null,
  239. onExported: null,
  240. onFileSaving: null,
  241. headerFilter: {
  242. width: 252,
  243. height: 325,
  244. allowSearch: false,
  245. showRelevantValues: false,
  246. searchTimeout: 500,
  247. texts: {
  248. emptyValue: (0, _message.format)("dxDataGrid-headerFilterEmptyValue"),
  249. ok: (0, _message.format)("dxDataGrid-headerFilterOK"),
  250. cancel: (0, _message.format)("dxDataGrid-headerFilterCancel")
  251. }
  252. }
  253. })
  254. },
  255. _getDataControllerOptions: function() {
  256. var that = this;
  257. return {
  258. component: that,
  259. dataSource: that.option("dataSource"),
  260. texts: that.option("texts"),
  261. showRowTotals: that.option("showRowTotals"),
  262. showRowGrandTotals: that.option("showRowGrandTotals"),
  263. showColumnTotals: that.option("showColumnTotals"),
  264. showTotalsPrior: that.option("showTotalsPrior"),
  265. showColumnGrandTotals: that.option("showColumnGrandTotals"),
  266. dataFieldArea: that.option("dataFieldArea"),
  267. rowHeaderLayout: that.option("rowHeaderLayout"),
  268. hideEmptySummaryCells: that.option("hideEmptySummaryCells"),
  269. onFieldsPrepared: function(fields) {
  270. (0, _iterator.each)(fields, function(index, field) {
  271. (0, _iterator.each)(["allowSorting", "allowSortingBySummary", "allowFiltering", "allowExpandAll"], function(_, optionName) {
  272. if (void 0 === field[optionName]) {
  273. (0, _uiPivot_grid.setFieldProperty)(field, optionName, that.option(optionName))
  274. }
  275. })
  276. })
  277. }
  278. }
  279. },
  280. _initDataController: function() {
  281. var that = this;
  282. that._dataController && that._dataController.dispose();
  283. that._dataController = new _uiPivot_grid2.DataController(that._getDataControllerOptions());
  284. if ((0, _window.hasWindow)()) {
  285. that._dataController.changed.add(function() {
  286. that._render()
  287. })
  288. }
  289. that._dataController.scrollChanged.add(function(options) {
  290. that._scrollLeft = options.left;
  291. that._scrollTop = options.top
  292. });
  293. that._dataController.loadingChanged.add(function(isLoading) {
  294. that._updateLoading()
  295. });
  296. that._dataController.progressChanged.add(that._updateLoading.bind(that));
  297. that._dataController.dataSourceChanged.add(function() {
  298. that._trigger("onChanged")
  299. });
  300. var expandValueChanging = that.option("onExpandValueChanging");
  301. if (expandValueChanging) {
  302. that._dataController.expandValueChanging.add(function(e) {
  303. expandValueChanging(e)
  304. })
  305. }
  306. },
  307. _init: function() {
  308. var that = this;
  309. that.callBase();
  310. that._initDataController();
  311. that._scrollLeft = that._scrollTop = null;
  312. that._initActions()
  313. },
  314. _initActions: function() {
  315. var that = this;
  316. that._actions = {
  317. onChanged: that._createActionByOption("onChanged"),
  318. onContextMenuPreparing: that._createActionByOption("onContextMenuPreparing"),
  319. onCellClick: that._createActionByOption("onCellClick"),
  320. onExporting: that._createActionByOption("onExporting"),
  321. onExported: that._createActionByOption("onExported"),
  322. onFileSaving: that._createActionByOption("onFileSaving"),
  323. onCellPrepared: that._createActionByOption("onCellPrepared")
  324. }
  325. },
  326. _trigger: function(eventName, eventArg) {
  327. this._actions[eventName](eventArg)
  328. },
  329. _optionValuesEqual: function(name, oldValue, newValue) {
  330. if ("dataSource" === name && newValue instanceof _data_source2.default && oldValue instanceof _data_source2.default) {
  331. return newValue === oldValue
  332. }
  333. return this.callBase.apply(this, arguments)
  334. },
  335. _optionChanged: function(args) {
  336. var that = this;
  337. switch (args.name) {
  338. case "dataSource":
  339. case "allowSorting":
  340. case "allowFiltering":
  341. case "allowExpandAll":
  342. case "allowSortingBySummary":
  343. case "scrolling":
  344. case "stateStoring":
  345. that._initDataController();
  346. that._fieldChooserPopup.hide();
  347. that._renderFieldChooser();
  348. that._invalidate();
  349. break;
  350. case "texts":
  351. case "showTotalsPrior":
  352. case "showRowTotals":
  353. case "showRowGrandTotals":
  354. case "showColumnTotals":
  355. case "showColumnGrandTotals":
  356. case "hideEmptySummaryCells":
  357. case "dataFieldArea":
  358. that._dataController.updateViewOptions(that._getDataControllerOptions());
  359. break;
  360. case "useNativeScrolling":
  361. case "encodeHtml":
  362. case "renderCellCountLimit":
  363. break;
  364. case "rtlEnabled":
  365. that.callBase(args);
  366. that._renderFieldChooser();
  367. that._renderContextMenu();
  368. (0, _window.hasWindow)() && that._renderLoadPanel(that._dataArea.groupElement(), that.$element());
  369. that._invalidate();
  370. break;
  371. case "export":
  372. that._renderDescriptionArea();
  373. break;
  374. case "onExpandValueChanging":
  375. break;
  376. case "onCellClick":
  377. case "onContextMenuPreparing":
  378. case "onExporting":
  379. case "onExported":
  380. case "onFileSaving":
  381. case "onCellPrepared":
  382. that._actions[args.name] = that._createActionByOption(args.name);
  383. break;
  384. case "fieldChooser":
  385. that._renderFieldChooser();
  386. that._renderDescriptionArea();
  387. break;
  388. case "loadPanel":
  389. if ((0, _window.hasWindow)()) {
  390. that._renderLoadPanel(that._dataArea.groupElement(), that.$element());
  391. that._invalidate()
  392. }
  393. break;
  394. case "fieldPanel":
  395. that._renderDescriptionArea();
  396. that._invalidate();
  397. break;
  398. case "headerFilter":
  399. that._renderFieldChooser();
  400. that._invalidate();
  401. break;
  402. case "showBorders":
  403. that._tableElement().toggleClass(BORDERS_CLASS, !!args.value);
  404. that.updateDimensions();
  405. break;
  406. case "wordWrapEnabled":
  407. that._tableElement().toggleClass("dx-word-wrap", !!args.value);
  408. that.updateDimensions();
  409. break;
  410. case "rowHeaderLayout":
  411. that._tableElement().find("." + ROW_AREA_CELL_CLASS).toggleClass("dx-area-tree-view", "tree" === args.value);
  412. that._dataController.updateViewOptions(that._getDataControllerOptions());
  413. break;
  414. case "height":
  415. case "width":
  416. that._hasHeight = null;
  417. that.callBase(args);
  418. that.resize();
  419. break;
  420. default:
  421. that.callBase(args)
  422. }
  423. },
  424. _updateScrollPosition: function(columnsArea, rowsArea, dataArea) {
  425. var that = this;
  426. var scrollTop;
  427. var scrollLeft;
  428. var scrolled = that._scrollTop || that._scrollLeft;
  429. if (that._scrollUpdating) {
  430. return
  431. }
  432. that._scrollUpdating = true;
  433. if (rowsArea && !rowsArea.hasScroll() && that._hasHeight) {
  434. that._scrollTop = null
  435. }
  436. if (columnsArea && !columnsArea.hasScroll()) {
  437. that._scrollLeft = null
  438. }
  439. if (null !== that._scrollTop || null !== that._scrollLeft || scrolled || that.option("rtlEnabled")) {
  440. scrollTop = that._scrollTop || 0;
  441. scrollLeft = that._scrollLeft || 0;
  442. dataArea.scrollTo({
  443. x: scrollLeft,
  444. y: scrollTop
  445. });
  446. columnsArea.scrollTo(scrollLeft);
  447. rowsArea.scrollTo(scrollTop);
  448. that._dataController.updateWindowScrollPosition(that._scrollTop)
  449. }
  450. that._scrollUpdating = false
  451. },
  452. _subscribeToEvents: function(columnsArea, rowsArea, dataArea) {
  453. var that = this;
  454. var scrollHandler = function(e) {
  455. var scrollOffset = e.scrollOffset;
  456. var leftOffset = (0, _type.isDefined)(scrollOffset.left) ? scrollOffset.left : that._scrollLeft;
  457. var topOffset = (0, _type.isDefined)(scrollOffset.top) && that._hasHeight ? scrollOffset.top : that._scrollTop;
  458. if ((that._scrollLeft || 0) !== (leftOffset || 0) || (that._scrollTop || 0) !== (topOffset || 0)) {
  459. that._scrollLeft = leftOffset;
  460. that._scrollTop = topOffset;
  461. that._updateScrollPosition(columnsArea, rowsArea, dataArea);
  462. if ("virtual" === that.option("scrolling.mode")) {
  463. that._dataController.setViewportPosition(that._scrollLeft, that._scrollTop)
  464. }
  465. }
  466. };
  467. (0, _iterator.each)([columnsArea, rowsArea, dataArea], function(_, area) {
  468. subscribeToScrollEvent(area, scrollHandler)
  469. });
  470. !that._hasHeight && that._dataController.subscribeToWindowScrollEvents(dataArea.groupElement())
  471. },
  472. _clean: _common.noop,
  473. _needDelayResizing: function(cellsInfo) {
  474. var cellsCount = cellsInfo.length * (cellsInfo.length ? cellsInfo[0].length : 0);
  475. return cellsCount > this.option("renderCellCountLimit")
  476. },
  477. _renderFieldChooser: function() {
  478. var that = this;
  479. var container = that._pivotGridContainer;
  480. var fieldChooserOptions = that.option("fieldChooser") || {};
  481. var toolbarItems = "onDemand" === fieldChooserOptions.applyChangesMode ? [{
  482. toolbar: "bottom",
  483. location: "after",
  484. widget: "dxButton",
  485. options: {
  486. text: (0, _message.format)("OK"),
  487. onClick: function(e) {
  488. that._fieldChooserPopup.$content().dxPivotGridFieldChooser("applyChanges");
  489. that._fieldChooserPopup.hide()
  490. }
  491. }
  492. }, {
  493. toolbar: "bottom",
  494. location: "after",
  495. widget: "dxButton",
  496. options: {
  497. text: (0, _message.format)("Cancel"),
  498. onClick: function(e) {
  499. that._fieldChooserPopup.hide()
  500. }
  501. }
  502. }] : [];
  503. var fieldChooserComponentOptions = {
  504. layout: fieldChooserOptions.layout,
  505. texts: fieldChooserOptions.texts || {},
  506. dataSource: that.getDataSource(),
  507. allowSearch: fieldChooserOptions.allowSearch,
  508. searchTimeout: fieldChooserOptions.searchTimeout,
  509. width: void 0,
  510. height: void 0,
  511. headerFilter: that.option("headerFilter"),
  512. encodeHtml: that.option("encodeHtml"),
  513. applyChangesMode: fieldChooserOptions.applyChangesMode,
  514. onContextMenuPreparing: function(e) {
  515. that._trigger("onContextMenuPreparing", e)
  516. }
  517. };
  518. var popupOptions = {
  519. shading: false,
  520. title: fieldChooserOptions.title,
  521. width: fieldChooserOptions.width,
  522. height: fieldChooserOptions.height,
  523. showCloseButton: true,
  524. resizeEnabled: true,
  525. minWidth: fieldChooserOptions.minWidth,
  526. minHeight: fieldChooserOptions.minHeight,
  527. toolbarItems: toolbarItems,
  528. onResize: function(e) {
  529. e.component.$content().dxPivotGridFieldChooser("updateDimensions")
  530. },
  531. onShown: function(e) {
  532. that._createComponent(e.component.content(), _uiPivot_grid7.default, fieldChooserComponentOptions)
  533. },
  534. onHidden: function(e) {
  535. var fieldChooser = e.component.$content().dxPivotGridFieldChooser("instance");
  536. fieldChooser.resetTreeView();
  537. fieldChooser.cancelChanges()
  538. }
  539. };
  540. if (that._fieldChooserPopup) {
  541. that._fieldChooserPopup.option(popupOptions);
  542. that._fieldChooserPopup.$content().dxPivotGridFieldChooser(fieldChooserComponentOptions)
  543. } else {
  544. that._fieldChooserPopup = that._createComponent((0, _renderer2.default)(DIV).addClass(FIELD_CHOOSER_POPUP_CLASS).appendTo(container), _popup2.default, popupOptions)
  545. }
  546. },
  547. _renderContextMenu: function() {
  548. var that = this;
  549. var $container = that._pivotGridContainer;
  550. if (that._contextMenu) {
  551. that._contextMenu.$element().remove()
  552. }
  553. that._contextMenu = that._createComponent((0, _renderer2.default)(DIV).appendTo($container), _context_menu2.default, {
  554. onPositioning: function(actionArgs) {
  555. var event = actionArgs.event;
  556. actionArgs.cancel = true;
  557. if (!event) {
  558. return
  559. }
  560. var targetElement = event.target.cellIndex >= 0 ? event.target : (0, _renderer2.default)(event.target).closest("td").get(0);
  561. if (!targetElement) {
  562. return
  563. }
  564. var args = that._createEventArgs(targetElement, event);
  565. var items = that._getContextMenuItems(args);
  566. if (items) {
  567. actionArgs.component.option("items", items);
  568. actionArgs.cancel = false;
  569. return
  570. }
  571. },
  572. onItemClick: function(params) {
  573. params.itemData.onItemClick && params.itemData.onItemClick(params)
  574. },
  575. cssClass: PIVOTGRID_CLASS,
  576. target: that.$element()
  577. })
  578. },
  579. _getContextMenuItems: function(e) {
  580. var that = this;
  581. var items = [];
  582. var texts = that.option("texts");
  583. if ("row" === e.area || "column" === e.area) {
  584. var areaFields = e[e.area + "Fields"];
  585. var oppositeAreaFields = e["column" === e.area ? "rowFields" : "columnFields"];
  586. var field = e.cell.path && areaFields[e.cell.path.length - 1];
  587. var dataSource = that.getDataSource();
  588. if (field && field.allowExpandAll && e.cell.path.length < e[e.area + "Fields"].length && !dataSource.paginate()) {
  589. items.push({
  590. beginGroup: true,
  591. icon: "none",
  592. text: texts.expandAll,
  593. onItemClick: function() {
  594. dataSource.expandAll(field.index)
  595. }
  596. });
  597. items.push({
  598. text: texts.collapseAll,
  599. icon: "none",
  600. onItemClick: function() {
  601. dataSource.collapseAll(field.index)
  602. }
  603. })
  604. }
  605. if (e.cell.isLast && !dataSource.paginate()) {
  606. var sortingBySummaryItemCount = 0;
  607. (0, _iterator.each)(oppositeAreaFields, function(index, field) {
  608. if (!field.allowSortingBySummary) {
  609. return
  610. }(0, _iterator.each)(e.dataFields, function(dataIndex, dataField) {
  611. if ((0, _type.isDefined)(e.cell.dataIndex) && e.cell.dataIndex !== dataIndex) {
  612. return
  613. }
  614. var showDataFieldCaption = !(0, _type.isDefined)(e.cell.dataIndex) && e.dataFields.length > 1;
  615. var textFormat = "column" === e.area ? texts.sortColumnBySummary : texts.sortRowBySummary;
  616. var checked = (0, _uiPivot_grid.findField)(e.dataFields, field.sortBySummaryField) === dataIndex && (e.cell.path || []).join("/") === (field.sortBySummaryPath || []).join("/");
  617. var text = (0, _string.format)(textFormat, showDataFieldCaption ? field.caption + " - " + dataField.caption : field.caption);
  618. items.push({
  619. beginGroup: 0 === sortingBySummaryItemCount,
  620. icon: checked ? "desc" === field.sortOrder ? "sortdowntext" : "sortuptext" : "none",
  621. text: text,
  622. onItemClick: function() {
  623. dataSource.field(field.index, {
  624. sortBySummaryField: dataField.name || dataField.caption || dataField.dataField,
  625. sortBySummaryPath: e.cell.path,
  626. sortOrder: "desc" === field.sortOrder ? "asc" : "desc"
  627. });
  628. dataSource.load()
  629. }
  630. });
  631. sortingBySummaryItemCount++
  632. })
  633. });
  634. (0, _iterator.each)(oppositeAreaFields, function(index, field) {
  635. if (!field.allowSortingBySummary || !(0, _type.isDefined)(field.sortBySummaryField)) {
  636. return
  637. }
  638. items.push({
  639. beginGroup: 0 === sortingBySummaryItemCount,
  640. icon: "none",
  641. text: texts.removeAllSorting,
  642. onItemClick: function() {
  643. (0, _iterator.each)(oppositeAreaFields, function(index, field) {
  644. dataSource.field(field.index, {
  645. sortBySummaryField: void 0,
  646. sortBySummaryPath: void 0,
  647. sortOrder: void 0
  648. })
  649. });
  650. dataSource.load()
  651. }
  652. });
  653. return false
  654. })
  655. }
  656. }
  657. if (that.option("fieldChooser.enabled")) {
  658. items.push({
  659. beginGroup: true,
  660. icon: "columnchooser",
  661. text: texts.showFieldChooser,
  662. onItemClick: function() {
  663. that._fieldChooserPopup.show()
  664. }
  665. })
  666. }
  667. if (that.option("export.enabled")) {
  668. items.push({
  669. beginGroup: true,
  670. icon: "exportxlsx",
  671. text: texts.exportToExcel,
  672. onItemClick: function() {
  673. that.exportToExcel()
  674. }
  675. })
  676. }
  677. e.items = items;
  678. that._trigger("onContextMenuPreparing", e);
  679. items = e.items;
  680. if (items && items.length) {
  681. return items
  682. }
  683. },
  684. _createEventArgs: function(targetElement, dxEvent) {
  685. var that = this;
  686. var dataSource = that.getDataSource();
  687. var args = {
  688. rowFields: dataSource.getAreaFields("row"),
  689. columnFields: dataSource.getAreaFields("column"),
  690. dataFields: dataSource.getAreaFields("data"),
  691. event: dxEvent
  692. };
  693. if (clickedOnFieldsArea((0, _renderer2.default)(targetElement))) {
  694. return (0, _extend.extend)(that._createFieldArgs(targetElement), args)
  695. } else {
  696. return (0, _extend.extend)(that._createCellArgs(targetElement), args)
  697. }
  698. },
  699. _createFieldArgs: function(targetElement) {
  700. var field = (0, _renderer2.default)(targetElement).children().data("field");
  701. var args = {
  702. field: field
  703. };
  704. return (0, _type.isDefined)(field) ? args : {}
  705. },
  706. _createCellArgs: function(cellElement) {
  707. var $cellElement = (0, _renderer2.default)(cellElement);
  708. var columnIndex = cellElement.cellIndex;
  709. var rowIndex = cellElement.parentElement.rowIndex;
  710. var $table = $cellElement.closest("table");
  711. var data = $table.data("data");
  712. var cell = data && data[rowIndex] && data[rowIndex][columnIndex];
  713. var args = {
  714. area: $table.data("area"),
  715. rowIndex: rowIndex,
  716. columnIndex: columnIndex,
  717. cellElement: (0, _dom.getPublicElement)($cellElement),
  718. cell: cell
  719. };
  720. return args
  721. },
  722. _handleCellClick: function(e) {
  723. var that = this;
  724. var args = that._createEventArgs(e.currentTarget, e);
  725. var cell = args.cell;
  726. if (!cell || !args.area && (args.rowIndex || args.columnIndex)) {
  727. return
  728. }
  729. that._trigger("onCellClick", args);
  730. cell && !args.cancel && (0, _type.isDefined)(cell.expanded) && setTimeout(function() {
  731. that._dataController[cell.expanded ? "collapseHeaderItem" : "expandHeaderItem"](args.area, cell.path)
  732. })
  733. },
  734. _getNoDataText: function() {
  735. return this.option("texts.noData")
  736. },
  737. _renderNoDataText: _uiGrid_core.renderNoDataText,
  738. _renderLoadPanel: _uiGrid_core.renderLoadPanel,
  739. _updateLoading: function(progress) {
  740. var that = this;
  741. var isLoading = that._dataController.isLoading();
  742. if (!that._loadPanel) {
  743. return
  744. }
  745. var loadPanelVisible = that._loadPanel.option("visible");
  746. if (!loadPanelVisible) {
  747. that._startLoadingTime = new Date
  748. }
  749. if (isLoading) {
  750. if (progress) {
  751. if (new Date - that._startLoadingTime >= 1e3) {
  752. that._loadPanel.option("message", Math.floor(100 * progress) + "%")
  753. }
  754. } else {
  755. that._loadPanel.option("message", that.option("loadPanel.text"))
  756. }
  757. }
  758. clearTimeout(that._hideLoadingTimeoutID);
  759. if (loadPanelVisible && !isLoading) {
  760. that._hideLoadingTimeoutID = setTimeout(function() {
  761. that._loadPanel.option("visible", false);
  762. that.$element().removeClass(OVERFLOW_HIDDEN_CLASS)
  763. })
  764. } else {
  765. that._loadPanel.option("visible", isLoading);
  766. that.$element().toggleClass(OVERFLOW_HIDDEN_CLASS, !isLoading)
  767. }
  768. },
  769. _renderDescriptionArea: function() {
  770. var _this = this;
  771. var $element = this.$element();
  772. var $descriptionCell = $element.find("." + DESCRIPTION_AREA_CELL_CLASS);
  773. var $toolbarContainer = (0, _renderer2.default)(DIV).addClass("dx-pivotgrid-toolbar");
  774. var fieldPanel = this.option("fieldPanel");
  775. var $filterHeader = $element.find(".dx-filter-header");
  776. var $columnHeader = $element.find(".dx-column-header");
  777. var $targetContainer;
  778. if (fieldPanel.visible && fieldPanel.showFilterFields) {
  779. $targetContainer = $filterHeader
  780. } else {
  781. if (fieldPanel.visible && (fieldPanel.showDataFields || fieldPanel.showColumnFields)) {
  782. $targetContainer = $columnHeader
  783. } else {
  784. $targetContainer = $descriptionCell
  785. }
  786. }
  787. $columnHeader.toggleClass(BOTTOM_BORDER_CLASS, !!(fieldPanel.visible && (fieldPanel.showDataFields || fieldPanel.showColumnFields)));
  788. $filterHeader.toggleClass(BOTTOM_BORDER_CLASS, !!(fieldPanel.visible && fieldPanel.showFilterFields));
  789. $descriptionCell.toggleClass("dx-pivotgrid-background", fieldPanel.visible && (fieldPanel.showDataFields || fieldPanel.showColumnFields || fieldPanel.showRowFields));
  790. this.$element().find(".dx-pivotgrid-toolbar").remove();
  791. $toolbarContainer.prependTo($targetContainer);
  792. if (this.option("fieldChooser.enabled")) {
  793. var $buttonElement = (0, _renderer2.default)(DIV).appendTo($toolbarContainer).addClass("dx-pivotgrid-field-chooser-button");
  794. var buttonOptions = {
  795. icon: "columnchooser",
  796. hint: this.option("texts.showFieldChooser"),
  797. onClick: function() {
  798. _this.getFieldChooserPopup().show()
  799. }
  800. };
  801. this._createComponent($buttonElement, "dxButton", buttonOptions)
  802. }
  803. if (this.option("export.enabled")) {
  804. var _$buttonElement = (0, _renderer2.default)(DIV).appendTo($toolbarContainer).addClass("dx-pivotgrid-export-button");
  805. var _buttonOptions = {
  806. icon: "exportxlsx",
  807. hint: this.option("texts.exportToExcel"),
  808. onClick: function() {
  809. _this.exportToExcel()
  810. }
  811. };
  812. this._createComponent(_$buttonElement, "dxButton", _buttonOptions)
  813. }
  814. },
  815. _detectHasContainerHeight: function() {
  816. var that = this;
  817. var element = that.$element();
  818. if ((0, _type.isDefined)(that._hasHeight) || element.is(":hidden")) {
  819. return
  820. }
  821. that._pivotGridContainer.addClass("dx-hidden");
  822. var testElement = (0, _renderer2.default)(DIV).height(TEST_HEIGHT);
  823. element.append(testElement);
  824. that._hasHeight = element.height() !== TEST_HEIGHT;
  825. that._pivotGridContainer.removeClass("dx-hidden");
  826. testElement.remove()
  827. },
  828. _renderHeaders: function(rowHeaderContainer, columnHeaderContainer, filterHeaderContainer, dataHeaderContainer) {
  829. var that = this;
  830. var dataSource = that.getDataSource();
  831. that._rowFields = that._rowFields || new _uiPivot_grid5.FieldsArea(that, "row");
  832. that._rowFields.render(rowHeaderContainer, dataSource.getAreaFields("row"));
  833. that._columnFields = that._columnFields || new _uiPivot_grid5.FieldsArea(that, "column");
  834. that._columnFields.render(columnHeaderContainer, dataSource.getAreaFields("column"));
  835. that._filterFields = that._filterFields || new _uiPivot_grid5.FieldsArea(that, "filter");
  836. that._filterFields.render(filterHeaderContainer, dataSource.getAreaFields("filter"));
  837. that._dataFields = that._dataFields || new _uiPivot_grid5.FieldsArea(that, "data");
  838. that._dataFields.render(dataHeaderContainer, dataSource.getAreaFields("data"));
  839. that.$element().dxPivotGridFieldChooserBase("instance").renderSortable()
  840. },
  841. _createTableElement: function() {
  842. var that = this;
  843. var $table = (0, _renderer2.default)("<table>").css({
  844. width: "100%"
  845. }).toggleClass(BORDERS_CLASS, !!that.option("showBorders")).toggleClass("dx-word-wrap", !!that.option("wordWrapEnabled"));
  846. _events_engine2.default.on($table, (0, _utils.addNamespace)(_click.name, "dxPivotGrid"), "td", that._handleCellClick.bind(that));
  847. return $table
  848. },
  849. _renderDataArea: function(dataAreaElement) {
  850. var that = this;
  851. var dataArea = that._dataArea || new _uiPivot_grid3.DataArea(that);
  852. that._dataArea = dataArea;
  853. dataArea.render(dataAreaElement, that._dataController.getCellsInfo());
  854. return dataArea
  855. },
  856. _renderRowsArea: function(rowsAreaElement) {
  857. var that = this;
  858. var rowsArea = that._rowsArea || new _uiPivot_grid4.VerticalHeadersArea(that);
  859. that._rowsArea = rowsArea;
  860. rowsArea.render(rowsAreaElement, that._dataController.getRowsInfo());
  861. return rowsArea
  862. },
  863. _renderColumnsArea: function(columnsAreaElement) {
  864. var that = this;
  865. var columnsArea = that._columnsArea || new _uiPivot_grid4.HorizontalHeadersArea(that);
  866. that._columnsArea = columnsArea;
  867. columnsArea.render(columnsAreaElement, that._dataController.getColumnsInfo());
  868. return columnsArea
  869. },
  870. _initMarkup: function() {
  871. var that = this;
  872. that.callBase.apply(this, arguments);
  873. that.$element().addClass(PIVOTGRID_CLASS)
  874. },
  875. _renderContentImpl: function() {
  876. var that = this;
  877. var columnsAreaElement;
  878. var rowsAreaElement;
  879. var dataAreaElement;
  880. var tableElement;
  881. var isFirstDrawing = !that._pivotGridContainer;
  882. var rowHeaderContainer;
  883. var columnHeaderContainer;
  884. var filterHeaderContainer;
  885. var dataHeaderContainer;
  886. tableElement = !isFirstDrawing && that._tableElement();
  887. if (!tableElement) {
  888. that.$element().addClass(ROW_LINES_CLASS).addClass(FIELDS_CONTAINER_CLASS);
  889. that._pivotGridContainer = (0, _renderer2.default)(DIV).addClass("dx-pivotgrid-container");
  890. that._renderFieldChooser();
  891. that._renderContextMenu();
  892. columnsAreaElement = (0, _renderer2.default)(TD).addClass(COLUMN_AREA_CELL_CLASS);
  893. rowsAreaElement = (0, _renderer2.default)(TD).addClass(ROW_AREA_CELL_CLASS);
  894. dataAreaElement = (0, _renderer2.default)(TD).addClass(DATA_AREA_CELL_CLASS);
  895. tableElement = that._createTableElement();
  896. dataHeaderContainer = (0, _renderer2.default)(TD).addClass("dx-data-header");
  897. filterHeaderContainer = (0, _renderer2.default)("<td>").attr("colspan", "2").addClass("dx-filter-header");
  898. columnHeaderContainer = (0, _renderer2.default)(TD).addClass("dx-column-header");
  899. rowHeaderContainer = (0, _renderer2.default)(TD).addClass(DESCRIPTION_AREA_CELL_CLASS);
  900. (0, _renderer2.default)(TR).append(filterHeaderContainer).appendTo(tableElement);
  901. (0, _renderer2.default)(TR).append(dataHeaderContainer).append(columnHeaderContainer).appendTo(tableElement);
  902. (0, _renderer2.default)(TR).toggleClass("dx-ie", true === _browser.msie).append(rowHeaderContainer).append(columnsAreaElement).appendTo(tableElement);
  903. (0, _renderer2.default)(TR).addClass(BOTTOM_ROW_CLASS).append(rowsAreaElement).append(dataAreaElement).appendTo(tableElement);
  904. that._pivotGridContainer.append(tableElement);
  905. that.$element().append(that._pivotGridContainer);
  906. if ("tree" === that.option("rowHeaderLayout")) {
  907. rowsAreaElement.addClass("dx-area-tree-view")
  908. }
  909. }
  910. that.$element().addClass(OVERFLOW_HIDDEN_CLASS);
  911. that._createComponent(that.$element(), _uiPivot_grid9.default, {
  912. dataSource: that.getDataSource(),
  913. encodeHtml: that.option("encodeHtml"),
  914. allowFieldDragging: that.option("fieldPanel.allowFieldDragging"),
  915. headerFilter: that.option("headerFilter"),
  916. visible: that.option("visible")
  917. });
  918. var dataArea = that._renderDataArea(dataAreaElement);
  919. var rowsArea = that._renderRowsArea(rowsAreaElement);
  920. var columnsArea = that._renderColumnsArea(columnsAreaElement);
  921. dataArea.tableElement().prepend(columnsArea.headElement());
  922. if (isFirstDrawing) {
  923. that._renderLoadPanel(dataArea.groupElement().parent(), that.$element());
  924. that._renderDescriptionArea();
  925. rowsArea.processScroll();
  926. columnsArea.processScroll()
  927. } [dataArea, rowsArea, columnsArea].forEach(function(area) {
  928. unsubscribeScrollEvents(area)
  929. });
  930. that._renderHeaders(rowHeaderContainer, columnHeaderContainer, filterHeaderContainer, dataHeaderContainer);
  931. that._update(isFirstDrawing)
  932. },
  933. _update: function(isFirstDrawing) {
  934. var that = this;
  935. var updateHandler = function() {
  936. that.updateDimensions().done(function() {
  937. that._subscribeToEvents(that._columnsArea, that._rowsArea, that._dataArea)
  938. })
  939. };
  940. if (that._needDelayResizing(that._dataArea.getData()) && isFirstDrawing) {
  941. setTimeout(updateHandler)
  942. } else {
  943. updateHandler()
  944. }
  945. },
  946. _fireContentReadyAction: function() {
  947. if (!this._dataController.isLoading()) {
  948. this.callBase()
  949. }
  950. },
  951. getScrollPath: function(area) {
  952. var that = this;
  953. if ("column" === area) {
  954. return that._columnsArea.getScrollPath(that._scrollLeft)
  955. } else {
  956. return that._rowsArea.getScrollPath(that._scrollTop)
  957. }
  958. },
  959. getDataSource: function() {
  960. return this._dataController.getDataSource()
  961. },
  962. getFieldChooserPopup: function() {
  963. return this._fieldChooserPopup
  964. },
  965. hasScroll: function(area) {
  966. var that = this;
  967. return "column" === area ? that._columnsArea.hasScroll() : that._rowsArea.hasScroll()
  968. },
  969. _dimensionChanged: function() {
  970. this.updateDimensions()
  971. },
  972. _visibilityChanged: function(visible) {
  973. if (visible) {
  974. this.updateDimensions()
  975. }
  976. },
  977. _dispose: function() {
  978. var that = this;
  979. clearTimeout(that._hideLoadingTimeoutID);
  980. that.callBase.apply(that, arguments);
  981. if (that._dataController) {
  982. that._dataController.dispose()
  983. }
  984. },
  985. _tableElement: function() {
  986. return this.$element().find("table").first()
  987. },
  988. addWidgetPrefix: function(className) {
  989. return "dx-pivotgrid-" + className
  990. },
  991. resize: function() {
  992. this.updateDimensions()
  993. },
  994. isReady: function() {
  995. return this.callBase() && !this._dataController.isLoading()
  996. },
  997. updateDimensions: function() {
  998. var that = this;
  999. var groupWidth;
  1000. var groupHeight;
  1001. var tableElement = that._tableElement();
  1002. var rowsArea = that._rowsArea;
  1003. var columnsArea = that._columnsArea;
  1004. var dataArea = that._dataArea;
  1005. var bordersWidth;
  1006. var totalWidth = 0;
  1007. var totalHeight = 0;
  1008. var rowsAreaWidth = 0;
  1009. var scrollingOptions = that.option("scrolling") || {};
  1010. var scrollBarInfo = getScrollBarInfo(scrollingOptions.useNative);
  1011. var scrollBarWidth = scrollBarInfo.scrollBarWidth;
  1012. var dataAreaCell = tableElement.find("." + DATA_AREA_CELL_CLASS);
  1013. var rowAreaCell = tableElement.find("." + ROW_AREA_CELL_CLASS);
  1014. var columnAreaCell = tableElement.find("." + COLUMN_AREA_CELL_CLASS);
  1015. var descriptionCell = tableElement.find("." + DESCRIPTION_AREA_CELL_CLASS);
  1016. var filterHeaderCell = tableElement.find(".dx-filter-header");
  1017. var columnHeaderCell = tableElement.find(".dx-column-header");
  1018. var rowFieldsHeader = that._rowFields;
  1019. var d = new _deferred.Deferred;
  1020. if (!(0, _window.hasWindow)()) {
  1021. return
  1022. }
  1023. var needSynchronizeFieldPanel = rowFieldsHeader.isVisible() && "tree" !== that.option("rowHeaderLayout");
  1024. that._detectHasContainerHeight();
  1025. if (!dataArea.headElement().length) {
  1026. dataArea.tableElement().prepend(columnsArea.headElement())
  1027. }
  1028. if (needSynchronizeFieldPanel) {
  1029. rowsArea.updateColspans(rowFieldsHeader.getColumnsCount());
  1030. rowsArea.tableElement().prepend(rowFieldsHeader.headElement())
  1031. }
  1032. tableElement.addClass(INCOMPRESSIBLE_FIELDS_CLASS);
  1033. dataArea.reset();
  1034. rowsArea.reset();
  1035. columnsArea.reset();
  1036. rowFieldsHeader.reset();
  1037. (0, _common.deferUpdate)(function() {
  1038. var resultWidths = dataArea.getColumnsWidth();
  1039. var rowHeights = rowsArea.getRowsHeight();
  1040. var rowsAreaHeights = needSynchronizeFieldPanel ? rowHeights.slice(1) : rowHeights;
  1041. var dataAreaHeights = dataArea.getRowsHeight();
  1042. var descriptionCellHeight = (0, _size.getSize)(descriptionCell[0], "height", {
  1043. paddings: true,
  1044. borders: true,
  1045. margins: true
  1046. }) + (needSynchronizeFieldPanel ? rowHeights[0] : 0);
  1047. var columnsAreaRowCount = that._dataController.getColumnsInfo().length;
  1048. var resultHeights = (0, _uiPivot_grid.mergeArraysByMaxValue)(rowsAreaHeights, dataAreaHeights.slice(columnsAreaRowCount));
  1049. var columnsAreaRowHeights = dataAreaHeights.slice(0, columnsAreaRowCount);
  1050. var columnsAreaHeight = getArraySum(columnsAreaRowHeights);
  1051. var rowsAreaColumnWidths = rowsArea.getColumnsWidth();
  1052. if (that._hasHeight) {
  1053. bordersWidth = getCommonBorderWidth([columnAreaCell, dataAreaCell, tableElement, columnHeaderCell, filterHeaderCell], "height");
  1054. groupHeight = that.$element().height() - filterHeaderCell.height() - tableElement.find(".dx-data-header").height() - (Math.max(dataArea.headElement().height(), columnAreaCell.height(), descriptionCellHeight) + bordersWidth)
  1055. }
  1056. totalWidth = dataArea.tableElement().width();
  1057. totalHeight = getArraySum(resultHeights);
  1058. if (!totalWidth || !totalHeight) {
  1059. d.resolve();
  1060. return
  1061. }
  1062. rowsAreaWidth = getArraySum(rowsAreaColumnWidths);
  1063. var elementWidth = that.$element().width();
  1064. bordersWidth = getCommonBorderWidth([rowAreaCell, dataAreaCell, tableElement], "width");
  1065. groupWidth = elementWidth - rowsAreaWidth - bordersWidth;
  1066. groupWidth = groupWidth > 0 ? groupWidth : totalWidth;
  1067. var hasRowsScroll = that._hasHeight && totalHeight - groupHeight >= 1;
  1068. var hasColumnsScroll = totalWidth - groupWidth >= 1;
  1069. if (!hasRowsScroll) {
  1070. groupHeight = totalHeight + (hasColumnsScroll ? scrollBarWidth : 0)
  1071. }(0, _common.deferRender)(function() {
  1072. columnsArea.tableElement().append(dataArea.headElement());
  1073. rowFieldsHeader.tableElement().append(rowsArea.headElement());
  1074. if (!hasColumnsScroll && hasRowsScroll && scrollBarWidth) {
  1075. adjustSizeArray(resultWidths, scrollBarWidth);
  1076. totalWidth -= scrollBarWidth
  1077. }
  1078. if (descriptionCellHeight > columnsAreaHeight) {
  1079. adjustSizeArray(columnsAreaRowHeights, columnsAreaHeight - descriptionCellHeight);
  1080. columnsArea.setRowsHeight(columnsAreaRowHeights)
  1081. }
  1082. tableElement.removeClass(INCOMPRESSIBLE_FIELDS_CLASS);
  1083. columnHeaderCell.children().css("maxWidth", groupWidth);
  1084. columnsArea.groupWidth(groupWidth);
  1085. columnsArea.processScrollBarSpacing(hasRowsScroll ? scrollBarWidth : 0);
  1086. columnsArea.setColumnsWidth(resultWidths);
  1087. rowsArea.groupHeight(that._hasHeight ? groupHeight : "auto");
  1088. rowsArea.processScrollBarSpacing(hasColumnsScroll ? scrollBarWidth : 0);
  1089. rowsArea.setColumnsWidth(rowsAreaColumnWidths);
  1090. rowsArea.setRowsHeight(resultHeights);
  1091. dataArea.setColumnsWidth(resultWidths);
  1092. dataArea.setRowsHeight(resultHeights);
  1093. dataArea.groupWidth(groupWidth);
  1094. dataArea.groupHeight(that._hasHeight ? groupHeight : "auto");
  1095. needSynchronizeFieldPanel && rowFieldsHeader.setColumnsWidth(rowsAreaColumnWidths);
  1096. dataAreaCell.toggleClass(BOTTOM_BORDER_CLASS, !hasRowsScroll);
  1097. rowAreaCell.toggleClass(BOTTOM_BORDER_CLASS, !hasRowsScroll);
  1098. if (!that._hasHeight && elementWidth !== that.$element().width()) {
  1099. var diff = elementWidth - that.$element().width();
  1100. if (!hasColumnsScroll) {
  1101. adjustSizeArray(resultWidths, diff);
  1102. columnsArea.setColumnsWidth(resultWidths);
  1103. dataArea.setColumnsWidth(resultWidths)
  1104. }
  1105. dataArea.groupWidth(groupWidth - diff);
  1106. columnsArea.groupWidth(groupWidth - diff)
  1107. }
  1108. if ("virtual" === scrollingOptions.mode) {
  1109. var virtualContentParams = that._dataController.calculateVirtualContentParams({
  1110. virtualRowHeight: scrollingOptions.virtualRowHeight,
  1111. virtualColumnWidth: scrollingOptions.virtualColumnWidth,
  1112. itemWidths: resultWidths,
  1113. itemHeights: resultHeights,
  1114. rowCount: resultHeights.length,
  1115. columnCount: resultWidths.length,
  1116. viewportWidth: groupWidth,
  1117. viewportHeight: that._hasHeight ? groupHeight : (0, _renderer2.default)(window).outerHeight()
  1118. });
  1119. dataArea.setVirtualContentParams({
  1120. top: virtualContentParams.contentTop,
  1121. left: virtualContentParams.contentLeft,
  1122. width: virtualContentParams.width,
  1123. height: virtualContentParams.height
  1124. });
  1125. rowsArea.setVirtualContentParams({
  1126. top: virtualContentParams.contentTop,
  1127. width: rowsAreaWidth,
  1128. height: virtualContentParams.height
  1129. });
  1130. columnsArea.setVirtualContentParams({
  1131. left: virtualContentParams.contentLeft,
  1132. width: virtualContentParams.width,
  1133. height: columnsArea.groupElement().height()
  1134. })
  1135. }
  1136. var updateScrollableResults = [];
  1137. dataArea.processScroll(scrollBarInfo.scrollBarUseNative, hasColumnsScroll, hasRowsScroll);
  1138. (0, _iterator.each)([columnsArea, rowsArea, dataArea], function(_, area) {
  1139. updateScrollableResults.push(area && area.updateScrollable())
  1140. });
  1141. that._updateLoading();
  1142. that._renderNoDataText(dataAreaCell);
  1143. _deferred.when.apply(_renderer2.default, updateScrollableResults).done(function() {
  1144. that._updateScrollPosition(columnsArea, rowsArea, dataArea);
  1145. d.resolve()
  1146. })
  1147. })
  1148. });
  1149. return d
  1150. },
  1151. applyPartialDataSource: function(area, path, dataSource) {
  1152. this._dataController.applyPartialDataSource(area, path, dataSource)
  1153. }
  1154. }).inherit(_uiPivot_grid10.ExportMixin).include(_uiPivot_grid12.default);
  1155. (0, _component_registrator2.default)("dxPivotGrid", PivotGrid);
  1156. module.exports = PivotGrid;