ui.pivot_grid.field_chooser.js 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525
  1. /**
  2. * DevExtreme (ui/pivot_grid/ui.pivot_grid.field_chooser.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 _icon = require("../../core/utils/icon");
  13. var _window = require("../../core/utils/window");
  14. var _type = require("../../core/utils/type");
  15. var _extend = require("../../core/utils/extend");
  16. var _array = require("../../core/utils/array");
  17. var _iterator = require("../../core/utils/iterator");
  18. var _message = require("../../localization/message");
  19. var _component_registrator = require("../../core/component_registrator");
  20. var _component_registrator2 = _interopRequireDefault(_component_registrator);
  21. var _uiPivot_grid = require("./ui.pivot_grid.utils");
  22. var _tree_view = require("../tree_view");
  23. var _tree_view2 = _interopRequireDefault(_tree_view);
  24. var _context_menu = require("../context_menu");
  25. var _context_menu2 = _interopRequireDefault(_context_menu);
  26. var _uiPivot_grid2 = require("./ui.pivot_grid.field_chooser_base");
  27. var _uiPivot_grid3 = _interopRequireDefault(_uiPivot_grid2);
  28. require("./data_source");
  29. function _interopRequireDefault(obj) {
  30. return obj && obj.__esModule ? obj : {
  31. "default": obj
  32. }
  33. }
  34. var DIV = "<div>";
  35. var hasWindow = (0, _window.hasWindow)();
  36. var FIELDCHOOSER_CLASS = "dx-pivotgridfieldchooser";
  37. var FIELDCHOOSER_CONTAINER_CLASS = "dx-pivotgridfieldchooser-container";
  38. var FIELDS_CONTAINER_CLASS = "dx-pivotgrid-fields-container";
  39. var AREA_DRAG_CLASS = "dx-pivotgrid-drag-action";
  40. function getDimensionFields(item, fields) {
  41. var result = [];
  42. if (item.items) {
  43. for (var i = 0; i < item.items.length; i++) {
  44. result.push.apply(result, getDimensionFields(item.items[i], fields))
  45. }
  46. } else {
  47. if ((0, _type.isDefined)(item.index)) {
  48. result.push(fields[item.index])
  49. }
  50. }
  51. return result
  52. }
  53. function getFirstItem(item, condition) {
  54. if (item.items) {
  55. for (var i = 0; i < item.items.length; i++) {
  56. var childrenItem = getFirstItem(item.items[i], condition);
  57. if (childrenItem) {
  58. return childrenItem
  59. }
  60. }
  61. }
  62. if (condition(item)) {
  63. return item
  64. }
  65. }
  66. var compareOrder = [function(a, b) {
  67. var aValue = -!!a.isMeasure;
  68. var bValue = +!!b.isMeasure;
  69. return aValue + bValue
  70. }, function(a, b) {
  71. var aValue = -!!(a.items && a.items.length);
  72. var bValue = +!!(b.items && b.items.length);
  73. return aValue + bValue
  74. }, function(a, b) {
  75. var aValue = +!!(false === a.isMeasure && a.field && a.field.levels && a.field.levels.length);
  76. var bValue = -!!(false === b.isMeasure && b.field && b.field.levels && b.field.levels.length);
  77. return aValue + bValue
  78. }, (0, _uiPivot_grid.getCompareFunction)(function(item) {
  79. return item.text
  80. })];
  81. function compareItems(a, b) {
  82. var result = 0;
  83. var i = 0;
  84. while (!result && compareOrder[i]) {
  85. result = compareOrder[i++](a, b)
  86. }
  87. return result
  88. }
  89. function getScrollable(container) {
  90. return container.find(".dx-scrollable").dxScrollable("instance")
  91. }
  92. var FieldChooser = _uiPivot_grid3.default.inherit({
  93. _getDefaultOptions: function() {
  94. return (0, _extend.extend)(this.callBase(), {
  95. height: 400,
  96. layout: 0,
  97. dataSource: null,
  98. onContextMenuPreparing: null,
  99. allowSearch: false,
  100. searchTimeout: 500,
  101. texts: {
  102. columnFields: (0, _message.format)("dxPivotGrid-columnFields"),
  103. rowFields: (0, _message.format)("dxPivotGrid-rowFields"),
  104. dataFields: (0, _message.format)("dxPivotGrid-dataFields"),
  105. filterFields: (0, _message.format)("dxPivotGrid-filterFields"),
  106. allFields: (0, _message.format)("dxPivotGrid-allFields")
  107. }
  108. })
  109. },
  110. _refreshDataSource: function() {
  111. var that = this;
  112. that._expandedPaths = [];
  113. that._changedHandler = that._changedHandler || function() {
  114. (0, _iterator.each)(that._dataChangedHandlers, function(_, func) {
  115. func()
  116. });
  117. that._fireContentReadyAction();
  118. that._skipStateChange = true;
  119. that.option("state", that._dataSource.state());
  120. that._skipStateChange = false
  121. };
  122. if (that._dataSource) {
  123. that._dataSource.off("changed", that._changedHandler);
  124. that._dataSource = void 0
  125. }
  126. that.callBase();
  127. that._dataSource && that._dataSource.on("changed", that._changedHandler)
  128. },
  129. _init: function() {
  130. this.callBase();
  131. this._refreshDataSource();
  132. this._dataChangedHandlers = [];
  133. this._initActions()
  134. },
  135. _initActions: function() {
  136. this._actions = {
  137. onContextMenuPreparing: this._createActionByOption("onContextMenuPreparing")
  138. }
  139. },
  140. _trigger: function(eventName, eventArg) {
  141. this._actions[eventName](eventArg)
  142. },
  143. _setOptionsByReference: function() {
  144. this.callBase();
  145. (0, _extend.extend)(this._optionsByReference, {
  146. dataSource: true
  147. })
  148. },
  149. _optionChanged: function(args) {
  150. var that = this;
  151. switch (args.name) {
  152. case "dataSource":
  153. that._refreshDataSource();
  154. that._invalidate();
  155. break;
  156. case "layout":
  157. case "texts":
  158. case "allowSearch":
  159. case "searchTimeout":
  160. that._invalidate();
  161. break;
  162. case "onContextMenuPreparing":
  163. that._actions[args.name] = that._createActionByOption(args.name);
  164. break;
  165. default:
  166. that.callBase(args)
  167. }
  168. },
  169. _clean: function(skipStateSetting) {
  170. !skipStateSetting && this._dataSource && this.option("state", this._dataSource.state());
  171. this.$element().children("." + FIELDCHOOSER_CONTAINER_CLASS).remove()
  172. },
  173. _renderLayout0: function($container) {
  174. var that = this;
  175. $container.addClass("dx-layout-0");
  176. var $row1 = (0, _renderer2.default)(DIV).addClass("dx-row").appendTo($container);
  177. var $row2 = (0, _renderer2.default)(DIV).addClass("dx-row").appendTo($container);
  178. var $col1 = (0, _renderer2.default)(DIV).addClass("dx-col").appendTo($row1);
  179. var $col2 = (0, _renderer2.default)(DIV).addClass("dx-col").appendTo($row1);
  180. var $col3 = (0, _renderer2.default)(DIV).addClass("dx-col").appendTo($row2);
  181. var $col4 = (0, _renderer2.default)(DIV).addClass("dx-col").appendTo($row2);
  182. that._renderArea($col1, "all");
  183. that._renderArea($col2, "row");
  184. that._renderArea($col2, "column");
  185. that._renderArea($col3, "filter");
  186. that._renderArea($col4, "data")
  187. },
  188. _renderLayout1: function($container) {
  189. var that = this;
  190. var $col1 = (0, _renderer2.default)(DIV).addClass("dx-col").appendTo($container);
  191. var $col2 = (0, _renderer2.default)(DIV).addClass("dx-col").appendTo($container);
  192. that._renderArea($col1, "all");
  193. that._renderArea($col2, "filter");
  194. that._renderArea($col2, "row");
  195. that._renderArea($col2, "column");
  196. that._renderArea($col2, "data")
  197. },
  198. _renderLayout2: function($container) {
  199. var that = this;
  200. $container.addClass("dx-layout-2");
  201. var $row1 = (0, _renderer2.default)(DIV).addClass("dx-row").appendTo($container);
  202. that._renderArea($row1, "all");
  203. var $row2 = (0, _renderer2.default)(DIV).addClass("dx-row").appendTo($container);
  204. var $col1 = (0, _renderer2.default)(DIV).addClass("dx-col").appendTo($row2);
  205. var $col2 = (0, _renderer2.default)(DIV).addClass("dx-col").appendTo($row2);
  206. that._renderArea($col1, "filter");
  207. that._renderArea($col1, "row");
  208. that._renderArea($col2, "column");
  209. that._renderArea($col2, "data")
  210. },
  211. _initMarkup: function() {
  212. var that = this;
  213. var $element = this.$element();
  214. var $container = (0, _renderer2.default)(DIV).addClass(FIELDCHOOSER_CONTAINER_CLASS).appendTo($element);
  215. var layout = that.option("layout");
  216. that.callBase();
  217. $element.addClass(FIELDCHOOSER_CLASS).addClass(FIELDS_CONTAINER_CLASS);
  218. that._dataChangedHandlers = [];
  219. var dataSource = this._dataSource;
  220. var currentState = "instantly" !== that.option("applyChangesMode") && dataSource && dataSource.state();
  221. currentState && that.option("state") && dataSource.state(that.option("state"), true);
  222. if (0 === layout) {
  223. that._renderLayout0($container)
  224. } else {
  225. if (1 === layout) {
  226. that._renderLayout1($container)
  227. } else {
  228. that._renderLayout2($container)
  229. }
  230. }
  231. currentState && dataSource.state(currentState, true)
  232. },
  233. _renderContentImpl: function() {
  234. this.callBase();
  235. this.renderSortable();
  236. this._renderContextMenu();
  237. this.updateDimensions()
  238. },
  239. _fireContentReadyAction: function() {
  240. if (!this._dataSource || !this._dataSource.isLoading()) {
  241. this.callBase()
  242. }
  243. },
  244. _getContextMenuArgs: function(dxEvent) {
  245. var targetFieldElement = (0, _renderer2.default)(dxEvent.target).closest(".dx-area-field");
  246. var targetGroupElement = (0, _renderer2.default)(dxEvent.target).closest(".dx-area-fields");
  247. var field;
  248. var area;
  249. if (targetFieldElement.length) {
  250. var fieldCopy = targetFieldElement.data("field");
  251. if (fieldCopy) {
  252. field = this.getDataSource().field(fieldCopy.index) || fieldCopy
  253. }
  254. }
  255. if (targetGroupElement.length) {
  256. area = targetGroupElement.attr("group")
  257. }
  258. return {
  259. event: dxEvent,
  260. field: field,
  261. area: area,
  262. items: []
  263. }
  264. },
  265. _renderContextMenu: function() {
  266. var that = this;
  267. var $container = that.$element();
  268. if (that._contextMenu) {
  269. that._contextMenu.$element().remove()
  270. }
  271. that._contextMenu = that._createComponent((0, _renderer2.default)(DIV).appendTo($container), _context_menu2.default, {
  272. onPositioning: function(actionArgs) {
  273. var event = actionArgs.event;
  274. if (!event) {
  275. return
  276. }
  277. var args = that._getContextMenuArgs(event);
  278. that._trigger("onContextMenuPreparing", args);
  279. if (args.items && args.items.length) {
  280. actionArgs.component.option("items", args.items)
  281. } else {
  282. actionArgs.cancel = true
  283. }
  284. },
  285. target: $container,
  286. onItemClick: function(params) {
  287. params.itemData.onItemClick && params.itemData.onItemClick(params)
  288. },
  289. cssClass: "dx-pivotgridfieldchooser-context-menu"
  290. })
  291. },
  292. _createTreeItems: function(fields, groupFieldNames, path) {
  293. var that = this;
  294. var isMeasure;
  295. var resultItems = [];
  296. var groupedItems = [];
  297. var groupFieldName = groupFieldNames[0];
  298. var fieldsByGroup = {};
  299. if (!groupFieldName) {
  300. (0, _iterator.each)(fields, function(index, field) {
  301. var icon;
  302. if (true === field.isMeasure) {
  303. icon = "measure"
  304. }
  305. if (false === field.isMeasure) {
  306. icon = field.groupName ? "hierarchy" : "dimension"
  307. }
  308. resultItems.push({
  309. index: field.index,
  310. field: field,
  311. key: field.dataField,
  312. selected: (0, _type.isDefined)(field.area),
  313. text: field.caption || field.dataField,
  314. icon: icon,
  315. isMeasure: field.isMeasure,
  316. isDefault: field.isDefault
  317. })
  318. })
  319. } else {
  320. (0, _iterator.each)(fields, function(index, field) {
  321. var groupName = field[groupFieldName] || "";
  322. fieldsByGroup[groupName] = fieldsByGroup[groupName] || [];
  323. fieldsByGroup[groupName].push(field);
  324. if (void 0 === isMeasure) {
  325. isMeasure = true
  326. }
  327. isMeasure = isMeasure && true === field.isMeasure
  328. });
  329. (0, _iterator.each)(fieldsByGroup, function(groupName, fields) {
  330. var currentPath = path ? path + "." + groupName : groupName;
  331. var items = that._createTreeItems(fields, groupFieldNames.slice(1), currentPath);
  332. if (groupName) {
  333. groupedItems.push({
  334. key: groupName,
  335. text: groupName,
  336. path: currentPath,
  337. isMeasure: items.isMeasure,
  338. expanded: (0, _array.inArray)(currentPath, that._expandedPaths) >= 0,
  339. items: items
  340. })
  341. } else {
  342. resultItems = items
  343. }
  344. });
  345. resultItems = groupedItems.concat(resultItems);
  346. resultItems.isMeasure = isMeasure
  347. }
  348. return resultItems
  349. },
  350. _createFieldsDataSource: function(dataSource) {
  351. var fields = dataSource && dataSource.fields() || [];
  352. fields = fields.filter(function(field) {
  353. return false !== field.visible && !(0, _type.isDefined)(field.groupIndex)
  354. });
  355. var treeItems = this._createTreeItems(fields, ["dimension", "displayFolder"]);
  356. (0, _uiPivot_grid.foreachDataLevel)(treeItems, function(items) {
  357. items.sort(compareItems)
  358. }, 0, "items");
  359. return treeItems
  360. },
  361. _renderFieldsTreeView: function(container) {
  362. var that = this;
  363. var dataSource = that._dataSource;
  364. var treeView = that._createComponent(container, _tree_view2.default, {
  365. dataSource: that._createFieldsDataSource(dataSource),
  366. showCheckBoxesMode: "normal",
  367. searchEnabled: that.option("allowSearch"),
  368. searchTimeout: that.option("searchTimeout"),
  369. itemTemplate: function(itemData, itemIndex, itemElement) {
  370. if (itemData.icon) {
  371. (0, _icon.getImageContainer)(itemData.icon).appendTo(itemElement)
  372. }(0, _renderer2.default)("<span>").toggleClass("dx-area-field", !itemData.items).data("field", itemData.field).text(itemData.text).appendTo(itemElement)
  373. },
  374. onItemCollapsed: function(e) {
  375. var index = (0, _array.inArray)(e.itemData.path, that._expandedPaths);
  376. if (index >= 0) {
  377. that._expandedPaths.splice(index, 1)
  378. }
  379. },
  380. onItemExpanded: function(e) {
  381. var index = (0, _array.inArray)(e.itemData.path, that._expandedPaths);
  382. if (index < 0) {
  383. that._expandedPaths.push(e.itemData.path)
  384. }
  385. },
  386. onItemSelectionChanged: function(e) {
  387. var data = e.itemData;
  388. var fields;
  389. var needSelectDefaultItem = true;
  390. var area;
  391. if (data.items) {
  392. if (data.selected) {
  393. treeView.unselectItem(data);
  394. return
  395. }
  396. that._processDemandState(function() {
  397. fields = getDimensionFields(data, dataSource.fields());
  398. for (var i = 0; i < fields.length; i++) {
  399. if (fields[i].area) {
  400. needSelectDefaultItem = false;
  401. break
  402. }
  403. }
  404. });
  405. if (needSelectDefaultItem) {
  406. var item = getFirstItem(data, function(item) {
  407. return item.isDefault
  408. }) || getFirstItem(data, function(item) {
  409. return (0, _type.isDefined)(item.index)
  410. });
  411. item && treeView.selectItem(item);
  412. return
  413. }
  414. } else {
  415. var field = dataSource.fields()[data.index];
  416. if (data.selected) {
  417. area = field.isMeasure ? "data" : "column"
  418. }
  419. if (field) {
  420. fields = [field]
  421. }
  422. }
  423. that._applyChanges(fields, {
  424. area: area,
  425. areaIndex: void 0
  426. })
  427. }
  428. });
  429. var dataChanged = function() {
  430. var scrollable = getScrollable(container);
  431. var scrollTop = scrollable ? scrollable.scrollTop() : 0;
  432. treeView.option({
  433. dataSource: that._createFieldsDataSource(dataSource)
  434. });
  435. scrollable = getScrollable(container);
  436. if (scrollable) {
  437. scrollable.scrollTo({
  438. y: scrollTop
  439. });
  440. scrollable.update()
  441. }
  442. };
  443. that._dataChangedHandlers.push(dataChanged)
  444. },
  445. _renderAreaFields: function($container, area) {
  446. var that = this;
  447. var dataSource = that._dataSource;
  448. var fields = dataSource ? (0, _extend.extend)(true, [], dataSource.getAreaFields(area, true)) : [];
  449. $container.empty();
  450. (0, _iterator.each)(fields, function(_, field) {
  451. if (false !== field.visible) {
  452. that.renderField(field, true).appendTo($container)
  453. }
  454. })
  455. },
  456. _renderArea: function(container, area) {
  457. var that = this;
  458. var $areaContainer = (0, _renderer2.default)(DIV).addClass("dx-area").appendTo(container);
  459. var $fieldsHeaderContainer = (0, _renderer2.default)(DIV).addClass("dx-area-fields-header").appendTo($areaContainer);
  460. var caption = that.option("texts." + area + "Fields");
  461. var $fieldsContent;
  462. (0, _renderer2.default)("<span>").addClass("dx-area-icon").addClass("dx-area-icon-" + area).appendTo($fieldsHeaderContainer);
  463. (0, _renderer2.default)("<span>").html("&nbsp;").appendTo($fieldsHeaderContainer);
  464. (0, _renderer2.default)("<span>").addClass("dx-area-caption").text(caption).appendTo($fieldsHeaderContainer);
  465. var $fieldsContainer = (0, _renderer2.default)(DIV).addClass("dx-area-fields").addClass(AREA_DRAG_CLASS).appendTo($areaContainer);
  466. if ("all" !== area) {
  467. $fieldsContainer.attr("group", area).attr("allow-scrolling", true);
  468. $fieldsContent = (0, _renderer2.default)(DIV).addClass("dx-area-field-container").appendTo($fieldsContainer);
  469. var render = function() {
  470. that._renderAreaFields($fieldsContent, area)
  471. };
  472. that._dataChangedHandlers.push(render);
  473. render();
  474. $fieldsContainer.dxScrollable()
  475. } else {
  476. $areaContainer.addClass("dx-all-fields");
  477. $fieldsContainer.addClass("dx-treeview-border-visible");
  478. that._renderFieldsTreeView($fieldsContainer)
  479. }
  480. },
  481. _getSortableOptions: function() {
  482. return {}
  483. },
  484. _adjustSortableOnChangedArgs: function() {},
  485. resetTreeView: function() {
  486. var treeView = this.$element().find(".dx-treeview").dxTreeView("instance");
  487. if (treeView) {
  488. treeView.option("searchValue", "");
  489. treeView.collapseAll()
  490. }
  491. },
  492. applyChanges: function() {
  493. var state = this.option("state");
  494. if ((0, _type.isDefined)(state)) {
  495. this._dataSource.state(state)
  496. }
  497. },
  498. cancelChanges: function() {
  499. var dataSource = this._dataSource;
  500. if (!dataSource.isLoading()) {
  501. this.option("state", dataSource.state());
  502. return true
  503. }
  504. return false
  505. },
  506. getDataSource: function() {
  507. return this._dataSource
  508. },
  509. updateDimensions: function() {
  510. var $scrollableElements = this.$element().find(".dx-area .dx-scrollable");
  511. $scrollableElements.dxScrollable("update")
  512. },
  513. _visibilityChanged: function(visible) {
  514. if (visible && hasWindow) {
  515. this.updateDimensions()
  516. }
  517. }
  518. });
  519. (0, _component_registrator2.default)("dxPivotGridFieldChooser", FieldChooser);
  520. module.exports = FieldChooser;