AlignElementsMenuProvider.js 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. import ICONS from './AlignElementsIcons';
  2. import {
  3. assign,
  4. forEach,
  5. } from 'min-dash';
  6. /**
  7. * @typedef {import('diagram-js/lib/features/align-elements/AlignElements').default} AlignElements
  8. * @typedef {import('diagram-js/lib/features/popup-menu/PopupMenu').default} PopupMenu
  9. * @typedef {import('diagram-js/lib/features/rules/Rules').default} Rules
  10. * @typedef {import('diagram-js/lib/i18n/translate/translate').default} Translate
  11. *
  12. * @typedef {import('diagram-js/lib/features/popup-menu/PopupMenu').PopupMenuEntries} PopupMenuEntries
  13. * @typedef {import('diagram-js/lib/features/popup-menu/PopupMenuProvider').default} PopupMenuProvider
  14. * @typedef {import('diagram-js/lib/features/popup-menu/PopupMenu').PopupMenuTarget} PopupMenuTarget
  15. */
  16. var ALIGNMENT_OPTIONS = [
  17. 'left',
  18. 'center',
  19. 'right',
  20. 'top',
  21. 'middle',
  22. 'bottom'
  23. ];
  24. /**
  25. * A provider for the `Align elements` popup menu.
  26. *
  27. * @implements {PopupMenuProvider}
  28. *
  29. * @param {PopupMenu} popupMenu
  30. * @param {AlignElements} alignElements
  31. * @param {Translate} translate
  32. * @param {Rules} rules
  33. */
  34. export default function AlignElementsMenuProvider(popupMenu, alignElements, translate, rules) {
  35. this._alignElements = alignElements;
  36. this._translate = translate;
  37. this._popupMenu = popupMenu;
  38. this._rules = rules;
  39. popupMenu.registerProvider('align-elements', this);
  40. }
  41. AlignElementsMenuProvider.$inject = [
  42. 'popupMenu',
  43. 'alignElements',
  44. 'translate',
  45. 'rules'
  46. ];
  47. /**
  48. * @param {PopupMenuTarget} target
  49. *
  50. * @return {PopupMenuEntries}
  51. */
  52. AlignElementsMenuProvider.prototype.getPopupMenuEntries = function(target) {
  53. var entries = {};
  54. if (this._isAllowed(target)) {
  55. assign(entries, this._getEntries(target));
  56. }
  57. return entries;
  58. };
  59. AlignElementsMenuProvider.prototype._isAllowed = function(target) {
  60. return this._rules.allowed('elements.align', { elements: target });
  61. };
  62. /**
  63. * @param {PopupMenuTarget} target
  64. *
  65. * @return {PopupMenuEntries}
  66. */
  67. AlignElementsMenuProvider.prototype._getEntries = function(target) {
  68. var alignElements = this._alignElements,
  69. translate = this._translate,
  70. popupMenu = this._popupMenu;
  71. var entries = {};
  72. forEach(ALIGNMENT_OPTIONS, function(alignment) {
  73. entries[ 'align-elements-' + alignment ] = {
  74. group: 'align',
  75. title: translate('Align elements ' + alignment),
  76. className: 'bjs-align-elements-menu-entry',
  77. imageHtml: ICONS[ alignment ],
  78. action: function() {
  79. alignElements.trigger(target, alignment);
  80. popupMenu.close();
  81. }
  82. };
  83. });
  84. return entries;
  85. };