ui.diagram.js 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916
  1. /**
  2. * DevExtreme (ui/diagram/ui.diagram.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. function _typeof(obj) {
  11. "@babel/helpers - typeof";
  12. return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(obj) {
  13. return typeof obj
  14. } : function(obj) {
  15. return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj
  16. }, _typeof(obj)
  17. }
  18. var _renderer = require("../../core/renderer");
  19. var _renderer2 = _interopRequireDefault(_renderer);
  20. var _ui = require("../widget/ui.widget");
  21. var _ui2 = _interopRequireDefault(_ui);
  22. var _drawer = require("../drawer");
  23. var _drawer2 = _interopRequireDefault(_drawer);
  24. var _component_registrator = require("../../core/component_registrator");
  25. var _component_registrator2 = _interopRequireDefault(_component_registrator);
  26. var _extend = require("../../core/utils/extend");
  27. var _type = require("../../core/utils/type");
  28. var _type2 = _interopRequireDefault(_type);
  29. var _data = require("../../core/utils/data");
  30. var _data2 = _interopRequireDefault(_data);
  31. var _uiDiagram = require("./ui.diagram.toolbar");
  32. var _uiDiagram2 = _interopRequireDefault(_uiDiagram);
  33. var _uiDiagram3 = require("./ui.diagram.leftpanel");
  34. var _uiDiagram4 = _interopRequireDefault(_uiDiagram3);
  35. var _uiDiagram5 = require("./ui.diagram.rightpanel");
  36. var _uiDiagram6 = _interopRequireDefault(_uiDiagram5);
  37. var _uiDiagram7 = require("./ui.diagram.contextmenu");
  38. var _uiDiagram8 = _interopRequireDefault(_uiDiagram7);
  39. var _uiDiagram9 = require("./ui.diagram.nodes");
  40. var _uiDiagram10 = _interopRequireDefault(_uiDiagram9);
  41. var _uiDiagram11 = require("./ui.diagram.edges");
  42. var _uiDiagram12 = _interopRequireDefault(_uiDiagram11);
  43. var _tooltip = require("../tooltip");
  44. var _tooltip2 = _interopRequireDefault(_tooltip);
  45. var _diagram_importer = require("./diagram_importer");
  46. var _window = require("../../core/utils/window");
  47. var _events_engine = require("../../events/core/events_engine");
  48. var _events_engine2 = _interopRequireDefault(_events_engine);
  49. var _utils = require("../../events/utils");
  50. var _utils2 = _interopRequireDefault(_utils);
  51. function _interopRequireDefault(obj) {
  52. return obj && obj.__esModule ? obj : {
  53. "default": obj
  54. }
  55. }
  56. function _classCallCheck(instance, Constructor) {
  57. if (!(instance instanceof Constructor)) {
  58. throw new TypeError("Cannot call a class as a function")
  59. }
  60. }
  61. function _defineProperties(target, props) {
  62. for (var i = 0; i < props.length; i++) {
  63. var descriptor = props[i];
  64. descriptor.enumerable = descriptor.enumerable || false;
  65. descriptor.configurable = true;
  66. if ("value" in descriptor) {
  67. descriptor.writable = true
  68. }
  69. Object.defineProperty(target, descriptor.key, descriptor)
  70. }
  71. }
  72. function _createClass(Constructor, protoProps, staticProps) {
  73. if (protoProps) {
  74. _defineProperties(Constructor.prototype, protoProps)
  75. }
  76. if (staticProps) {
  77. _defineProperties(Constructor, staticProps)
  78. }
  79. Object.defineProperty(Constructor, "prototype", {
  80. writable: false
  81. });
  82. return Constructor
  83. }
  84. function _get() {
  85. if ("undefined" !== typeof Reflect && Reflect.get) {
  86. _get = Reflect.get.bind()
  87. } else {
  88. _get = function(target, property, receiver) {
  89. var base = _superPropBase(target, property);
  90. if (!base) {
  91. return
  92. }
  93. var desc = Object.getOwnPropertyDescriptor(base, property);
  94. if (desc.get) {
  95. return desc.get.call(arguments.length < 3 ? target : receiver)
  96. }
  97. return desc.value
  98. }
  99. }
  100. return _get.apply(this, arguments)
  101. }
  102. function _superPropBase(object, property) {
  103. while (!Object.prototype.hasOwnProperty.call(object, property)) {
  104. object = _getPrototypeOf(object);
  105. if (null === object) {
  106. break
  107. }
  108. }
  109. return object
  110. }
  111. function _inherits(subClass, superClass) {
  112. if ("function" !== typeof superClass && null !== superClass) {
  113. throw new TypeError("Super expression must either be null or a function")
  114. }
  115. subClass.prototype = Object.create(superClass && superClass.prototype, {
  116. constructor: {
  117. value: subClass,
  118. writable: true,
  119. configurable: true
  120. }
  121. });
  122. Object.defineProperty(subClass, "prototype", {
  123. writable: false
  124. });
  125. if (superClass) {
  126. _setPrototypeOf(subClass, superClass)
  127. }
  128. }
  129. function _setPrototypeOf(o, p) {
  130. _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function(o, p) {
  131. o.__proto__ = p;
  132. return o
  133. };
  134. return _setPrototypeOf(o, p)
  135. }
  136. function _createSuper(Derived) {
  137. var hasNativeReflectConstruct = _isNativeReflectConstruct();
  138. return function() {
  139. var result, Super = _getPrototypeOf(Derived);
  140. if (hasNativeReflectConstruct) {
  141. var NewTarget = _getPrototypeOf(this).constructor;
  142. result = Reflect.construct(Super, arguments, NewTarget)
  143. } else {
  144. result = Super.apply(this, arguments)
  145. }
  146. return _possibleConstructorReturn(this, result)
  147. }
  148. }
  149. function _possibleConstructorReturn(self, call) {
  150. if (call && ("object" === _typeof(call) || "function" === typeof call)) {
  151. return call
  152. } else {
  153. if (void 0 !== call) {
  154. throw new TypeError("Derived constructors may only return object or undefined")
  155. }
  156. }
  157. return _assertThisInitialized(self)
  158. }
  159. function _assertThisInitialized(self) {
  160. if (void 0 === self) {
  161. throw new ReferenceError("this hasn't been initialised - super() hasn't been called")
  162. }
  163. return self
  164. }
  165. function _isNativeReflectConstruct() {
  166. if ("undefined" === typeof Reflect || !Reflect.construct) {
  167. return false
  168. }
  169. if (Reflect.construct.sham) {
  170. return false
  171. }
  172. if ("function" === typeof Proxy) {
  173. return true
  174. }
  175. try {
  176. Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function() {}));
  177. return true
  178. } catch (e) {
  179. return false
  180. }
  181. }
  182. function _getPrototypeOf(o) {
  183. _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function(o) {
  184. return o.__proto__ || Object.getPrototypeOf(o)
  185. };
  186. return _getPrototypeOf(o)
  187. }
  188. var DIAGRAM_CLASS = "dx-diagram";
  189. var DIAGRAM_FULLSCREEN_CLASS = "dx-diagram-fullscreen";
  190. var DIAGRAM_TOOLBAR_WRAPPER_CLASS = DIAGRAM_CLASS + "-toolbar-wrapper";
  191. var DIAGRAM_CONTENT_WRAPPER_CLASS = DIAGRAM_CLASS + "-content-wrapper";
  192. var DIAGRAM_DRAWER_WRAPPER_CLASS = DIAGRAM_CLASS + "-drawer-wrapper";
  193. var DIAGRAM_CONTENT_CLASS = DIAGRAM_CLASS + "-content";
  194. var DIAGRAM_KEY_FIELD = "id";
  195. var DIAGRAM_TEXT_FIELD = "text";
  196. var DIAGRAM_TYPE_FIELD = "type";
  197. var DIAGRAM_PARENT_KEY_FIELD = "parentId";
  198. var DIAGRAM_ITEMS_FIELD = "items";
  199. var DIAGRAM_FROM_FIELD = "from";
  200. var DIAGRAM_TO_FIELD = "to";
  201. var DIAGRAM_CONNECTION_POINT_SIDES = ["north", "east", "south", "west"];
  202. var DIAGRAM_NAMESPACE = "dxDiagramEvent";
  203. var FULLSCREEN_CHANGE_EVENT_NAME = _utils2.default.addNamespace("fullscreenchange", DIAGRAM_NAMESPACE);
  204. var IE_FULLSCREEN_CHANGE_EVENT_NAME = _utils2.default.addNamespace("msfullscreenchange", DIAGRAM_NAMESPACE);
  205. var WEBKIT_FULLSCREEN_CHANGE_EVENT_NAME = _utils2.default.addNamespace("webkitfullscreenchange", DIAGRAM_NAMESPACE);
  206. var MOZ_FULLSCREEN_CHANGE_EVENT_NAME = _utils2.default.addNamespace("mozfullscreenchange", DIAGRAM_NAMESPACE);
  207. var Diagram = function(_Widget) {
  208. _inherits(Diagram, _Widget);
  209. var _super = _createSuper(Diagram);
  210. function Diagram() {
  211. _classCallCheck(this, Diagram);
  212. return _super.apply(this, arguments)
  213. }
  214. _createClass(Diagram, [{
  215. key: "_init",
  216. value: function() {
  217. this._updateDiagramLockCount = 0;
  218. _get(_getPrototypeOf(Diagram.prototype), "_init", this).call(this);
  219. this._initDiagram()
  220. }
  221. }, {
  222. key: "_initMarkup",
  223. value: function() {
  224. _get(_getPrototypeOf(Diagram.prototype), "_initMarkup", this).call(this);
  225. var isServerSide = !(0, _window.hasWindow)();
  226. this.$element().addClass(DIAGRAM_CLASS);
  227. this._renderToolbar();
  228. var $contentWrapper = (0, _renderer2.default)("<div>").addClass(DIAGRAM_CONTENT_WRAPPER_CLASS).appendTo(this.$element());
  229. this._renderLeftPanel($contentWrapper);
  230. var $drawerWrapper = (0, _renderer2.default)("<div>").addClass(DIAGRAM_DRAWER_WRAPPER_CLASS).appendTo($contentWrapper);
  231. var $drawer = (0, _renderer2.default)("<div>").appendTo($drawerWrapper);
  232. var $content = (0, _renderer2.default)("<div>").addClass(DIAGRAM_CONTENT_CLASS).appendTo($drawer);
  233. this._renderRightPanel($drawer);
  234. this._renderContextMenu($content);
  235. !isServerSide && this._diagramInstance.createDocument($content[0])
  236. }
  237. }, {
  238. key: "_renderToolbar",
  239. value: function() {
  240. var _this = this;
  241. var $toolbarWrapper = (0, _renderer2.default)("<div>").addClass(DIAGRAM_TOOLBAR_WRAPPER_CLASS).appendTo(this.$element());
  242. this._toolbarInstance = this._createComponent($toolbarWrapper, _uiDiagram2.default, {
  243. onContentReady: function(e) {
  244. return _this._diagramInstance.barManager.registerBar(e.component.bar)
  245. },
  246. onPointerUp: this._onPanelPointerUp.bind(this),
  247. "export": this.option("export")
  248. })
  249. }
  250. }, {
  251. key: "_renderLeftPanel",
  252. value: function($parent) {
  253. var _this2 = this;
  254. var isServerSide = !(0, _window.hasWindow)();
  255. var $leftPanel = (0, _renderer2.default)("<div>").appendTo($parent);
  256. this._leftPanel = this._createComponent($leftPanel, _uiDiagram4.default, {
  257. dataSources: this._getDataSources(),
  258. customShapes: this._getCustomShapes(),
  259. onShapeCategoryRendered: function(e) {
  260. if (isServerSide) {
  261. return
  262. }
  263. var $toolboxContainer = (0, _renderer2.default)(e.$element);
  264. _this2._diagramInstance.createToolbox($toolboxContainer[0], 40, 8, {
  265. "data-toggle": "shape-toolbox-tooltip"
  266. }, e.category);
  267. _this2._createTooltips($parent, $toolboxContainer.find('[data-toggle="shape-toolbox-tooltip"]'))
  268. },
  269. onDataToolboxRendered: function(e) {
  270. return !isServerSide && _this2._diagramInstance.createDataSourceToolbox(e.key, e.$element[0])
  271. },
  272. onPointerUp: this._onPanelPointerUp.bind(this)
  273. })
  274. }
  275. }, {
  276. key: "_createTooltips",
  277. value: function($container, targets) {
  278. var _this3 = this;
  279. targets.each(function(index, element) {
  280. var $target = (0, _renderer2.default)(element);
  281. var $tooltip = (0, _renderer2.default)("<div>").html($target.attr("title")).appendTo($container);
  282. _this3._tooltipInstance = _this3._createComponent($tooltip, _tooltip2.default, {
  283. target: $target,
  284. showEvent: "mouseenter",
  285. hideEvent: "mouseleave",
  286. position: "top",
  287. animation: {
  288. show: {
  289. type: "fade",
  290. from: 0,
  291. to: 1,
  292. delay: 500
  293. },
  294. hide: {
  295. type: "fade",
  296. from: 1,
  297. to: 0,
  298. delay: 100
  299. }
  300. }
  301. })
  302. })
  303. }
  304. }, {
  305. key: "_invalidateLeftPanel",
  306. value: function() {
  307. if (this._leftPanel) {
  308. this._leftPanel.option({
  309. dataSources: this._getDataSources(),
  310. customShapes: this._getCustomShapes()
  311. })
  312. }
  313. }
  314. }, {
  315. key: "_renderRightPanel",
  316. value: function($parent) {
  317. var _this4 = this;
  318. var drawer = this._createComponent($parent, _drawer2.default, {
  319. closeOnOutsideClick: true,
  320. openedStateMode: "overlap",
  321. position: "right",
  322. template: function($options) {
  323. _this4._createComponent($options, _uiDiagram6.default, {
  324. onContentReady: function(e) {
  325. return _this4._diagramInstance.barManager.registerBar(e.component.bar)
  326. },
  327. onPointerUp: _this4._onPanelPointerUp.bind(_this4)
  328. })
  329. }
  330. });
  331. this._toolbarInstance.option("onWidgetCommand", function(e) {
  332. if ("options" === e.name) {
  333. drawer.toggle()
  334. }
  335. })
  336. }
  337. }, {
  338. key: "_onPanelPointerUp",
  339. value: function() {
  340. this._diagramInstance.captureFocus()
  341. }
  342. }, {
  343. key: "_renderContextMenu",
  344. value: function($mainElement) {
  345. var _this5 = this;
  346. var $contextMenu = (0, _renderer2.default)("<div>").appendTo(this.$element());
  347. this._createComponent($contextMenu, _uiDiagram8.default, {
  348. container: $mainElement,
  349. onContentReady: function(_ref) {
  350. var component = _ref.component;
  351. return _this5._diagramInstance.barManager.registerBar(component.bar)
  352. },
  353. onVisibleChanged: function(_ref2) {
  354. var component = _ref2.component;
  355. return _this5._diagramInstance.barManager.updateBarItemsState(component.bar)
  356. }
  357. })
  358. }
  359. }, {
  360. key: "_initDiagram",
  361. value: function() {
  362. var _getDiagram = (0, _diagram_importer.getDiagram)(),
  363. DiagramControl = _getDiagram.DiagramControl;
  364. this._diagramInstance = new DiagramControl;
  365. this._diagramInstance.onChanged = this._raiseDataChangeAction.bind(this);
  366. this._diagramInstance.onEdgeInserted = this._raiseEdgeInsertedAction.bind(this);
  367. this._diagramInstance.onEdgeUpdated = this._raiseEdgeUpdatedAction.bind(this);
  368. this._diagramInstance.onEdgeRemoved = this._raiseEdgeRemovedAction.bind(this);
  369. this._diagramInstance.onNodeInserted = this._raiseNodeInsertedAction.bind(this);
  370. this._diagramInstance.onNodeUpdated = this._raiseNodeUpdatedAction.bind(this);
  371. this._diagramInstance.onNodeRemoved = this._raiseNodeRemovedAction.bind(this);
  372. this._diagramInstance.onToolboxDragStart = this._raiseToolboxDragStart.bind(this);
  373. this._diagramInstance.onToolboxDragEnd = this._raiseToolboxDragEnd.bind(this);
  374. this._diagramInstance.onToggleFullscreen = this._onToggleFullscreen.bind(this);
  375. this._updateCustomShapes(this._getCustomShapes());
  376. this._refreshDataSources()
  377. }
  378. }, {
  379. key: "_refreshDataSources",
  380. value: function() {
  381. this._beginUpdateDiagram();
  382. this._refreshNodesDataSource();
  383. this._refreshEdgesDataSource();
  384. this._endUpdateDiagram()
  385. }
  386. }, {
  387. key: "_refreshNodesDataSource",
  388. value: function() {
  389. if (this._nodesOption) {
  390. this._nodesOption._disposeDataSource();
  391. delete this._nodesOption;
  392. delete this._nodes
  393. }
  394. if (this.option("nodes.dataSource")) {
  395. this._nodesOption = new _uiDiagram10.default(this);
  396. this._nodesOption.option("dataSource", this.option("nodes.dataSource"));
  397. this._nodesOption._refreshDataSource()
  398. }
  399. }
  400. }, {
  401. key: "_refreshEdgesDataSource",
  402. value: function() {
  403. if (this._edgesOption) {
  404. this._edgesOption._disposeDataSource();
  405. delete this._edgesOption;
  406. delete this._edges
  407. }
  408. if (this.option("edges.dataSource")) {
  409. this._edgesOption = new _uiDiagram12.default(this);
  410. this._edgesOption.option("dataSource", this.option("edges.dataSource"));
  411. this._edgesOption._refreshDataSource()
  412. }
  413. }
  414. }, {
  415. key: "_getDiagramData",
  416. value: function() {
  417. var value;
  418. var _getDiagram2 = (0, _diagram_importer.getDiagram)(),
  419. DiagramCommand = _getDiagram2.DiagramCommand;
  420. this._diagramInstance.commandManager.getCommand(DiagramCommand.Export).execute(function(data) {
  421. value = data
  422. });
  423. return value
  424. }
  425. }, {
  426. key: "_setDiagramData",
  427. value: function(data, keepExistingItems) {
  428. var _getDiagram3 = (0, _diagram_importer.getDiagram)(),
  429. DiagramCommand = _getDiagram3.DiagramCommand;
  430. this._diagramInstance.commandManager.getCommand(DiagramCommand.Import).execute({
  431. data: data,
  432. keepExistingItems: keepExistingItems
  433. })
  434. }
  435. }, {
  436. key: "_getDataSources",
  437. value: function() {
  438. return this.option("dataSources") || {}
  439. }
  440. }, {
  441. key: "_createDiagramDataSource",
  442. value: function(parameters) {
  443. var key = parameters.key || "0";
  444. var title = parameters.title || "Data Source";
  445. var nodes = parameters.nodes || {};
  446. var edges = parameters.edges || {};
  447. var data = {
  448. key: key,
  449. title: title,
  450. nodeDataSource: nodes.dataSource,
  451. edgeDataSource: edges.dataSource,
  452. nodeDataImporter: {
  453. getKey: this._createGetter(nodes.keyExpr || DIAGRAM_KEY_FIELD),
  454. setKey: this._createSetter(nodes.keyExpr || DIAGRAM_KEY_FIELD),
  455. getText: this._createGetter(nodes.textExpr || DIAGRAM_TEXT_FIELD),
  456. setText: this._createSetter(nodes.textExpr || DIAGRAM_TEXT_FIELD),
  457. getType: this._createGetter(nodes.typeExpr || DIAGRAM_TYPE_FIELD),
  458. setType: this._createSetter(nodes.typeExpr || DIAGRAM_TYPE_FIELD),
  459. getParentKey: this._createGetter(nodes.parentKeyExpr || DIAGRAM_PARENT_KEY_FIELD),
  460. setParentKey: this._createSetter(nodes.parentKeyExpr || DIAGRAM_PARENT_KEY_FIELD),
  461. getItems: this._createGetter(nodes.itemsExpr || DIAGRAM_ITEMS_FIELD),
  462. setItems: this._createSetter(nodes.itemsExpr || DIAGRAM_ITEMS_FIELD)
  463. },
  464. edgeDataImporter: {
  465. getKey: this._createGetter(edges.keyExpr || DIAGRAM_KEY_FIELD),
  466. setKey: this._createSetter(edges.keyExpr || DIAGRAM_KEY_FIELD),
  467. getFrom: this._createGetter(edges.fromExpr || DIAGRAM_FROM_FIELD),
  468. setFrom: this._createSetter(edges.fromExpr || DIAGRAM_FROM_FIELD),
  469. getTo: this._createGetter(edges.toExpr || DIAGRAM_TO_FIELD),
  470. setTo: this._createSetter(edges.toExpr || DIAGRAM_TO_FIELD)
  471. },
  472. layoutType: this._getDataSourceLayoutType(parameters.layout)
  473. };
  474. var _getDiagram4 = (0, _diagram_importer.getDiagram)(),
  475. DiagramCommand = _getDiagram4.DiagramCommand;
  476. this._diagramInstance.commandManager.getCommand(DiagramCommand.ImportDataSource).execute(data);
  477. var dataSources = this._getDataSources();
  478. dataSources[key] = data;
  479. this.option("dataSources", dataSources)
  480. }
  481. }, {
  482. key: "_getDataSourceLayoutType",
  483. value: function(layout) {
  484. var _getDiagram5 = (0, _diagram_importer.getDiagram)(),
  485. DataLayoutType = _getDiagram5.DataLayoutType;
  486. switch (layout) {
  487. case "tree":
  488. return DataLayoutType.Tree;
  489. case "sugiyama":
  490. return DataLayoutType.Sugiyama
  491. }
  492. }
  493. }, {
  494. key: "_deleteDiagramDataSource",
  495. value: function(key) {
  496. var dataSources = this._getDataSources();
  497. if (dataSources[key]) {
  498. var _getDiagram6 = (0, _diagram_importer.getDiagram)(),
  499. DiagramCommand = _getDiagram6.DiagramCommand;
  500. this._diagramInstance.commandManager.getCommand(DiagramCommand.CloseDataSource).execute(key);
  501. delete dataSources[key];
  502. this.option("dataSources", dataSources)
  503. }
  504. }
  505. }, {
  506. key: "_nodesDataSourceChanged",
  507. value: function(nodes) {
  508. this._nodes = nodes;
  509. this._bindDiagramData()
  510. }
  511. }, {
  512. key: "_edgesDataSourceChanged",
  513. value: function(edges) {
  514. this._edges = edges;
  515. this._bindDiagramData()
  516. }
  517. }, {
  518. key: "_createGetter",
  519. value: function(expr) {
  520. return _data2.default.compileGetter(expr)
  521. }
  522. }, {
  523. key: "_createSetter",
  524. value: function(expr) {
  525. if (_type2.default.isFunction(expr)) {
  526. return expr
  527. }
  528. return _data2.default.compileSetter(expr)
  529. }
  530. }, {
  531. key: "_createOptionGetter",
  532. value: function(optionName) {
  533. var expr = this.option(optionName);
  534. return this._createGetter(expr)
  535. }
  536. }, {
  537. key: "_createOptionSetter",
  538. value: function(optionName) {
  539. var expr = this.option(optionName);
  540. return this._createSetter(expr)
  541. }
  542. }, {
  543. key: "_bindDiagramData",
  544. value: function() {
  545. if (this._updateDiagramLockCount || !this._isBindingMode()) {
  546. return
  547. }
  548. var _getDiagram7 = (0, _diagram_importer.getDiagram)(),
  549. DiagramCommand = _getDiagram7.DiagramCommand;
  550. var data = {
  551. nodeDataSource: this._nodes,
  552. edgeDataSource: this._edges,
  553. nodeDataImporter: {
  554. getKey: this._createOptionGetter("nodes.keyExpr"),
  555. setKey: this._createOptionSetter("nodes.keyExpr"),
  556. getText: this._createOptionGetter("nodes.textExpr"),
  557. setText: this._createOptionSetter("nodes.textExpr"),
  558. getType: this._createOptionGetter("nodes.typeExpr"),
  559. setType: this._createOptionSetter("nodes.typeExpr"),
  560. getParentKey: this._createOptionGetter("nodes.parentKeyExpr"),
  561. setParentKey: this._createOptionSetter("nodes.parentKeyExpr"),
  562. getItems: this._createOptionGetter("nodes.itemsExpr"),
  563. setItems: this._createOptionSetter("nodes.itemsExpr")
  564. },
  565. edgeDataImporter: {
  566. getKey: this._createOptionGetter("edges.keyExpr"),
  567. setKey: this._createOptionSetter("edges.keyExpr"),
  568. getFrom: this._createOptionGetter("edges.fromExpr"),
  569. setFrom: this._createOptionSetter("edges.fromExpr"),
  570. getTo: this._createOptionGetter("edges.toExpr"),
  571. setTo: this._createOptionSetter("edges.toExpr")
  572. },
  573. layoutType: this._getDataBindingLayoutType()
  574. };
  575. this._diagramInstance.commandManager.getCommand(DiagramCommand.BindDocument).execute(data)
  576. }
  577. }, {
  578. key: "_getDataBindingLayoutType",
  579. value: function() {
  580. var _getDiagram8 = (0, _diagram_importer.getDiagram)(),
  581. DataLayoutType = _getDiagram8.DataLayoutType;
  582. switch (this.option("layout")) {
  583. case "sugiyama":
  584. return DataLayoutType.Sugiyama;
  585. default:
  586. return DataLayoutType.Tree
  587. }
  588. }
  589. }, {
  590. key: "_isBindingMode",
  591. value: function() {
  592. return this._nodes || this._edges
  593. }
  594. }, {
  595. key: "_beginUpdateDiagram",
  596. value: function() {
  597. this._updateDiagramLockCount++
  598. }
  599. }, {
  600. key: "_endUpdateDiagram",
  601. value: function() {
  602. this._updateDiagramLockCount = Math.max(this._updateDiagramLockCount - 1, 0);
  603. if (!this._updateDiagramLockCount) {
  604. this._bindDiagramData()
  605. }
  606. }
  607. }, {
  608. key: "_getCustomShapes",
  609. value: function() {
  610. return this.option("customShapes") || []
  611. }
  612. }, {
  613. key: "_updateCustomShapes",
  614. value: function(customShapes, prevCustomShapes) {
  615. if (Array.isArray(prevCustomShapes)) {
  616. this._diagramInstance.removeCustomShapes(customShapes.map(function(s) {
  617. return s.id
  618. }))
  619. }
  620. if (Array.isArray(customShapes)) {
  621. this._diagramInstance.addCustomShapes(customShapes.map(function(s) {
  622. return {
  623. id: s.id,
  624. title: s.title,
  625. svgUrl: s.svgUrl,
  626. svgLeft: s.svgLeft,
  627. svgTop: s.svgTop,
  628. svgWidth: s.svgWidth,
  629. svgHeight: s.svgHeight,
  630. defaultWidth: s.defaultWidth,
  631. defaultHeight: s.defaultHeight,
  632. defaultText: s.defaultText,
  633. allowHasText: s.allowHasText,
  634. textLeft: s.textLeft,
  635. textTop: s.textTop,
  636. textWidth: s.textWidth,
  637. textHeight: s.textHeight,
  638. connectionPoints: s.connectionPoints && s.connectionPoints.map(function(pt) {
  639. return {
  640. x: pt.x,
  641. y: pt.y,
  642. side: DIAGRAM_CONNECTION_POINT_SIDES.indexOf(pt.side)
  643. }
  644. })
  645. }
  646. }))
  647. }
  648. }
  649. }, {
  650. key: "_onToggleFullscreen",
  651. value: function(fullscreen) {
  652. this._changeNativeFullscreen(fullscreen);
  653. this.$element().toggleClass(DIAGRAM_FULLSCREEN_CLASS, fullscreen);
  654. this._diagramInstance.updateLayout()
  655. }
  656. }, {
  657. key: "_changeNativeFullscreen",
  658. value: function(setModeOn) {
  659. var window = (0, _window.getWindow)();
  660. if (window.self === window.top || setModeOn === this._inNativeFullscreen()) {
  661. return
  662. }
  663. if (setModeOn) {
  664. this._subscribeFullscreenNativeChanged()
  665. } else {
  666. this._unsubscribeFullscreenNativeChanged()
  667. }
  668. this._setNativeFullscreen(setModeOn)
  669. }
  670. }, {
  671. key: "_setNativeFullscreen",
  672. value: function(on) {
  673. var window = (0, _window.getWindow)();
  674. var document = window.self.document;
  675. var body = window.self.document.body;
  676. if (on) {
  677. if (body.requestFullscreen) {
  678. body.requestFullscreen()
  679. } else {
  680. if (body.mozRequestFullscreen) {
  681. body.mozRequestFullscreen()
  682. } else {
  683. if (body.webkitRequestFullscreen) {
  684. body.webkitRequestFullscreen()
  685. } else {
  686. if (body.msRequestFullscreen) {
  687. body.msRequestFullscreen()
  688. }
  689. }
  690. }
  691. }
  692. } else {
  693. if (document.exitFullscreen) {
  694. document.exitFullscreen()
  695. } else {
  696. if (document.mozCancelFullscreen) {
  697. document.mozCancelFullscreen()
  698. } else {
  699. if (document.webkitExitFullscreen) {
  700. document.webkitExitFullscreen()
  701. } else {
  702. if (document.msExitFullscreen) {
  703. document.msExitFullscreen()
  704. }
  705. }
  706. }
  707. }
  708. }
  709. }
  710. }, {
  711. key: "_inNativeFullscreen",
  712. value: function() {
  713. var document = (0, _window.getWindow)().document;
  714. var fullscreenElement = document.fullscreenElement || document.msFullscreenElement || document.webkitFullscreenElement;
  715. var isInFullscreen = fullscreenElement === document.body || document.webkitIsFullscreen;
  716. return !!isInFullscreen
  717. }
  718. }, {
  719. key: "_subscribeFullscreenNativeChanged",
  720. value: function() {
  721. var document = (0, _window.getWindow)().document;
  722. var handler = this._onNativeFullscreenChangeHandler.bind(this);
  723. _events_engine2.default.on(document, FULLSCREEN_CHANGE_EVENT_NAME, handler);
  724. _events_engine2.default.on(document, IE_FULLSCREEN_CHANGE_EVENT_NAME, handler);
  725. _events_engine2.default.on(document, WEBKIT_FULLSCREEN_CHANGE_EVENT_NAME, handler);
  726. _events_engine2.default.on(document, MOZ_FULLSCREEN_CHANGE_EVENT_NAME, handler)
  727. }
  728. }, {
  729. key: "_unsubscribeFullscreenNativeChanged",
  730. value: function() {
  731. var document = (0, _window.getWindow)().document;
  732. _events_engine2.default.off(document, FULLSCREEN_CHANGE_EVENT_NAME);
  733. _events_engine2.default.off(document, IE_FULLSCREEN_CHANGE_EVENT_NAME);
  734. _events_engine2.default.off(document, WEBKIT_FULLSCREEN_CHANGE_EVENT_NAME);
  735. _events_engine2.default.off(document, MOZ_FULLSCREEN_CHANGE_EVENT_NAME)
  736. }
  737. }, {
  738. key: "_onNativeFullscreenChangeHandler",
  739. value: function() {
  740. if (!this._inNativeFullscreen()) {
  741. this._unsubscribeFullscreenNativeChanged();
  742. this._setFullscreen(false)
  743. }
  744. }
  745. }, {
  746. key: "getData",
  747. value: function() {
  748. return this._getDiagramData()
  749. }
  750. }, {
  751. key: "setData",
  752. value: function(data, updateExistingItemsOnly) {
  753. this._setDiagramData(data, updateExistingItemsOnly);
  754. this._raiseDataChangeAction()
  755. }
  756. }, {
  757. key: "createDataSource",
  758. value: function(parameters) {
  759. this._createDiagramDataSource(parameters)
  760. }
  761. }, {
  762. key: "deleteDataSource",
  763. value: function(key) {
  764. this._deleteDiagramDataSource(key)
  765. }
  766. }, {
  767. key: "_getDefaultOptions",
  768. value: function() {
  769. return (0, _extend.extend)(_get(_getPrototypeOf(Diagram.prototype), "_getDefaultOptions", this).call(this), {
  770. onDataChanged: null,
  771. nodes: {
  772. dataSource: null,
  773. keyExpr: DIAGRAM_KEY_FIELD,
  774. textExpr: DIAGRAM_TEXT_FIELD,
  775. typeExpr: DIAGRAM_TYPE_FIELD,
  776. parentKeyExpr: DIAGRAM_PARENT_KEY_FIELD,
  777. itemsExpr: DIAGRAM_ITEMS_FIELD
  778. },
  779. edges: {
  780. dataSource: null,
  781. keyExpr: DIAGRAM_KEY_FIELD,
  782. fromExpr: DIAGRAM_FROM_FIELD,
  783. toExpr: DIAGRAM_TO_FIELD
  784. },
  785. layout: "tree",
  786. customShapes: [],
  787. "export": {
  788. fileName: "Diagram",
  789. proxyUrl: void 0
  790. }
  791. })
  792. }
  793. }, {
  794. key: "_createDataChangeAction",
  795. value: function() {
  796. this._dataChangeAction = this._createActionByOption("onDataChanged")
  797. }
  798. }, {
  799. key: "_raiseDataChangeAction",
  800. value: function() {
  801. if (!this.option("onDataChanged")) {
  802. return
  803. }
  804. if (!this._dataChangeAction) {
  805. this._createDataChangeAction()
  806. }
  807. this._dataChangeAction({
  808. data: this.getData()
  809. })
  810. }
  811. }, {
  812. key: "_raiseEdgeInsertedAction",
  813. value: function(data, callback) {
  814. if (this._edgesOption) {
  815. this._edgesOption.insert(data, callback)
  816. }
  817. }
  818. }, {
  819. key: "_raiseEdgeUpdatedAction",
  820. value: function(key, data, callback) {
  821. if (this._edgesOption) {
  822. this._edgesOption.update(key, data, callback)
  823. }
  824. }
  825. }, {
  826. key: "_raiseEdgeRemovedAction",
  827. value: function(key, callback) {
  828. if (this._edgesOption) {
  829. this._edgesOption.remove(key, callback)
  830. }
  831. }
  832. }, {
  833. key: "_raiseNodeInsertedAction",
  834. value: function(data, callback) {
  835. if (this._nodesOption) {
  836. this._nodesOption.insert(data, callback)
  837. }
  838. }
  839. }, {
  840. key: "_raiseNodeUpdatedAction",
  841. value: function(key, data, callback) {
  842. if (this._nodesOption) {
  843. this._nodesOption.update(key, data, callback)
  844. }
  845. }
  846. }, {
  847. key: "_raiseNodeRemovedAction",
  848. value: function(key, callback) {
  849. if (this._nodesOption) {
  850. this._nodesOption.remove(key, callback)
  851. }
  852. }
  853. }, {
  854. key: "_raiseToolboxDragStart",
  855. value: function() {
  856. if (this._leftPanel) {
  857. this._leftPanel.$element().addClass("dx-skip-gesture-event")
  858. }
  859. }
  860. }, {
  861. key: "_raiseToolboxDragEnd",
  862. value: function() {
  863. if (this._leftPanel) {
  864. this._leftPanel.$element().removeClass("dx-skip-gesture-event")
  865. }
  866. }
  867. }, {
  868. key: "_optionChanged",
  869. value: function(args) {
  870. switch (args.name) {
  871. case "nodes":
  872. this._refreshNodesDataSource();
  873. break;
  874. case "edges":
  875. this._refreshEdgesDataSource();
  876. break;
  877. case "layout":
  878. this._refreshDataSources();
  879. break;
  880. case "customShapes":
  881. this._updateCustomShapes(args.value, args.previousValue);
  882. this._invalidateLeftPanel();
  883. break;
  884. case "onDataChanged":
  885. this._createDataChangeAction();
  886. break;
  887. case "dataSources":
  888. this._invalidateLeftPanel();
  889. break;
  890. case "export":
  891. this._toolbarInstance.option("export", this.option("export"));
  892. break;
  893. default:
  894. _get(_getPrototypeOf(Diagram.prototype), "_optionChanged", this).call(this, args)
  895. }
  896. }
  897. }]);
  898. return Diagram
  899. }(_ui2.default);
  900. (0, _component_registrator2.default)("dxDiagram", Diagram);
  901. module.exports = Diagram;