UpdateModdlePropertiesHandler.js 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. import {
  2. reduce,
  3. keys,
  4. forEach
  5. } from 'min-dash';
  6. import {
  7. is,
  8. getBusinessObject
  9. } from '../../../util/ModelUtil';
  10. /**
  11. * @typedef {import('diagram-js/lib/command/CommandHandler').default} CommandHandler
  12. *
  13. * @typedef {import('diagram-js/lib/core/ElementRegistry').default} ElementRegistry
  14. *
  15. * @typedef {import('../../../model/Types').Shape} Shape
  16. * @typedef {import('../../../model/Types').ModdleElement} ModdleElement
  17. */
  18. /**
  19. * @implements {CommandHandler}
  20. *
  21. * @param {ElementRegistry} elementRegistry
  22. */
  23. export default function UpdateModdlePropertiesHandler(elementRegistry) {
  24. this._elementRegistry = elementRegistry;
  25. }
  26. UpdateModdlePropertiesHandler.$inject = [ 'elementRegistry' ];
  27. UpdateModdlePropertiesHandler.prototype.execute = function(context) {
  28. var element = context.element,
  29. moddleElement = context.moddleElement,
  30. properties = context.properties;
  31. if (!moddleElement) {
  32. throw new Error('<moddleElement> required');
  33. }
  34. // TODO(nikku): we need to ensure that ID properties
  35. // are properly registered / unregistered via
  36. // this._moddle.ids.assigned(id)
  37. var changed = context.changed || this._getVisualReferences(moddleElement).concat(element);
  38. var oldProperties = context.oldProperties || getModdleProperties(moddleElement, keys(properties));
  39. setModdleProperties(moddleElement, properties);
  40. context.oldProperties = oldProperties;
  41. context.changed = changed;
  42. return changed;
  43. };
  44. UpdateModdlePropertiesHandler.prototype.revert = function(context) {
  45. var oldProperties = context.oldProperties,
  46. moddleElement = context.moddleElement,
  47. changed = context.changed;
  48. setModdleProperties(moddleElement, oldProperties);
  49. return changed;
  50. };
  51. /**
  52. * Return visual references of given moddle element within the diagram.
  53. *
  54. * @param {ModdleElement} moddleElement
  55. *
  56. * @return {Shape[]}
  57. */
  58. UpdateModdlePropertiesHandler.prototype._getVisualReferences = function(moddleElement) {
  59. var elementRegistry = this._elementRegistry;
  60. if (is(moddleElement, 'bpmn:DataObject')) {
  61. return getAllDataObjectReferences(moddleElement, elementRegistry);
  62. }
  63. return [];
  64. };
  65. // helpers /////////////////
  66. function getModdleProperties(moddleElement, propertyNames) {
  67. return reduce(propertyNames, function(result, key) {
  68. result[key] = moddleElement.get(key);
  69. return result;
  70. }, {});
  71. }
  72. function setModdleProperties(moddleElement, properties) {
  73. forEach(properties, function(value, key) {
  74. moddleElement.set(key, value);
  75. });
  76. }
  77. function getAllDataObjectReferences(dataObject, elementRegistry) {
  78. return elementRegistry.filter(function(element) {
  79. return (
  80. is(element, 'bpmn:DataObjectReference') &&
  81. getBusinessObject(element).dataObjectRef === dataObject
  82. );
  83. });
  84. }