UpdateLabelHandler.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. import {
  2. setLabel,
  3. getLabel
  4. } from '../LabelUtil';
  5. import {
  6. getExternalLabelMid,
  7. isLabelExternal,
  8. hasExternalLabel,
  9. isLabel
  10. } from '../../../util/LabelUtil';
  11. import {
  12. getBusinessObject,
  13. is
  14. } from '../../../util/ModelUtil';
  15. var NULL_DIMENSIONS = {
  16. width: 0,
  17. height: 0
  18. };
  19. /**
  20. * A handler that updates the text of a BPMN element.
  21. */
  22. export default function UpdateLabelHandler(modeling, textRenderer) {
  23. /**
  24. * Set the label and return the changed elements.
  25. *
  26. * Element parameter can be label itself or connection (i.e. sequence flow).
  27. *
  28. * @param {djs.model.Base} element
  29. * @param {String} text
  30. */
  31. function setText(element, text) {
  32. // external label if present
  33. var label = element.label || element;
  34. var labelTarget = element.labelTarget || element;
  35. setLabel(label, text, labelTarget !== label);
  36. return [ label, labelTarget ];
  37. }
  38. function preExecute(ctx) {
  39. var element = ctx.element,
  40. businessObject = element.businessObject,
  41. newLabel = ctx.newLabel;
  42. if (!isLabel(element)
  43. && isLabelExternal(element)
  44. && !hasExternalLabel(element)
  45. && !isEmptyText(newLabel)) {
  46. // create label
  47. var paddingTop = 7;
  48. var labelCenter = getExternalLabelMid(element);
  49. labelCenter = {
  50. x: labelCenter.x,
  51. y: labelCenter.y + paddingTop
  52. };
  53. modeling.createLabel(element, labelCenter, {
  54. id: businessObject.id + '_label',
  55. businessObject: businessObject
  56. });
  57. }
  58. }
  59. function execute(ctx) {
  60. ctx.oldLabel = getLabel(ctx.element);
  61. return setText(ctx.element, ctx.newLabel);
  62. }
  63. function revert(ctx) {
  64. return setText(ctx.element, ctx.oldLabel);
  65. }
  66. function postExecute(ctx) {
  67. var element = ctx.element,
  68. label = element.label || element,
  69. newLabel = ctx.newLabel,
  70. newBounds = ctx.newBounds,
  71. hints = ctx.hints || {};
  72. if (isLabel(label) && isEmptyText(newLabel)) {
  73. if (hints.removeShape !== false) {
  74. modeling.removeShape(label, { unsetLabel: false });
  75. }
  76. return;
  77. }
  78. // ignore internal labels for elements except text annotations
  79. if (!isLabelExternal(element) && !is(element, 'bpmn:TextAnnotation')) {
  80. return;
  81. }
  82. var bo = getBusinessObject(label);
  83. var text = bo.name || bo.text;
  84. // don't resize without text
  85. if (!text) {
  86. return;
  87. }
  88. // resize element based on label _or_ pre-defined bounds
  89. if (typeof newBounds === 'undefined') {
  90. newBounds = textRenderer.getExternalLabelBounds(label, text);
  91. }
  92. // setting newBounds to false or _null_ will
  93. // disable the postExecute resize operation
  94. if (newBounds) {
  95. modeling.resizeShape(label, newBounds, NULL_DIMENSIONS);
  96. }
  97. }
  98. // API
  99. this.preExecute = preExecute;
  100. this.execute = execute;
  101. this.revert = revert;
  102. this.postExecute = postExecute;
  103. }
  104. UpdateLabelHandler.$inject = [
  105. 'modeling',
  106. 'textRenderer'
  107. ];
  108. // helpers ///////////////////////
  109. function isEmptyText(label) {
  110. return !label || !label.trim();
  111. }