UNPKG

dmn-js-decision-table-custom-z

Version:

A decision table view for dmn-js

491 lines (398 loc) 14.5 kB
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); } function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); } function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } import { isArray, forEach, keys, reduce } from 'min-dash'; // creating descriptors ////////// var createHooks = [copyTableProperties, copyBusinessObjectProperties]; var reviveHooks = [reviveBusinessObject, reviveTableElement]; /** * Return a serializable snapshot of the given elements. * * @param {Array<Base>} elements list of table elements * * @return {Tree} descriptor tree */ export function createDescriptor(element, cache, hooks) { hooks = hooks || createHooks; cache = cache || {}; if (isArray(element)) { return createDescriptors0(element, cache, hooks); } else { return createDescriptor0(element, cache, hooks); } } /** * Create descriptors of elements, returning { descriptors: [], descriptorCache }. * * @param {Array<Base>} elements list of table elements * @param {Object} cache the create cache * * @return {Object} new descriptors + updated cache */ function createDescriptors0(elements, cache, hooks) { return reduce(elements, function (result, element) { var currentCache = result.descriptorCache, currentDescriptors = result.root; var _createDescriptor = createDescriptor0(element, currentCache, hooks), root = _createDescriptor.root, descriptorCache = _createDescriptor.descriptorCache; return { root: [].concat(_toConsumableArray(currentDescriptors), [root]), descriptorCache: _objectSpread({}, currentCache, {}, descriptorCache) }; }, { root: [], descriptorCache: cache }); } function createDescriptor0(element, cache, hooks) { var id = element.id; var descriptor = { id: id }; var elements = cache.elements || {}; var existingDescriptor = elements[id]; // element already created; nothing to do if (existingDescriptor) { return { root: existingDescriptor, descriptorCache: cache }; } // we're new; need to initialize element via hooks // we assume we're not handling recursive data structures // here. Otherwise we'd need to pre-populate the cache // with the given element var element0 = evaluateHooks(element, descriptor, hooks, _objectSpread({}, cache, { elements: elements })); return { root: element0.root, descriptorCache: _objectSpread({}, element0.descriptorCache, { elements: _objectSpread({}, element0.descriptorCache.elements, _defineProperty({}, id, element0.root)) }) }; } function evaluateHooks(element, descriptor, hooks, cache) { function create(element, descriptorCache) { return createDescriptor(element, descriptorCache, hooks); } return reduce(hooks, function (result, hook) { return hook(element, result.root, result.descriptorCache, create); }, { root: descriptor, descriptorCache: cache }); } import { Row, Col, Cell } from 'table-js/lib/model'; function copyTableProperties(element, descriptor, cache, create) { var descriptorCache = cache; var newDesc = _objectSpread({}, descriptor, { type: getType(element) }); if (element instanceof Row || element instanceof Col) { var cells0 = create(element.cells, descriptorCache); newDesc.cells = cells0.root; descriptorCache = cells0.descriptorCache; } return { root: newDesc, descriptorCache: descriptorCache }; } function copyBusinessObjectProperties(element, descriptor, cache) { var businessObject = element.businessObject; if (!businessObject) { return { root: descriptor, descriptorCache: cache }; } // need to clone businessObject var bo0 = createBoDescriptor(businessObject, cache); return { root: _objectSpread({}, descriptor, { businessObject: bo0.root }), descriptorCache: bo0.descriptorCache }; } function getType(element) { if (element instanceof Row) { return 'row'; } if (element instanceof Col) { return 'col'; } if (element instanceof Cell) { return 'cell'; } throw new Error('cannot deduce element type: #' + element.id); } function createBoDescriptor(bo, cache) { var boCache, existingBoDesc; var id = bo.id; if (id) { boCache = cache.boCache || {}; existingBoDesc = boCache[id]; // businessObject already created; nothing to do if (existingBoDesc) { return { root: existingBoDesc, descriptorCache: cache }; } } var descriptor = { $type: bo.$type }; if (id) { descriptor.id = id; boCache = _objectSpread({}, boCache, _defineProperty({}, id, descriptor)); cache = _objectSpread({}, cache, { boCache: boCache }); } // TODO(nikku): distinguish relations and containment // Need to build up the whole tree and revive relations afterwards // ITERATE OVER ALL SET PROPERTIES // (Object.keys(bo) or via bo.$descriptor....) bo.$descriptor.properties.forEach(function (property) { var value = bo[property.name]; // const propertyDescriptor = bo.$model.getPropertyDescriptor(bo, property.name), // isId = propertyDescriptor.isId, // isReference = propertyDescriptor.isReference; // not set if (!value) { return; } // arrays of moddle elements if (isArray(value)) { value = value.map(function (b) { var value0 = createBoDescriptor(b, cache); cache = value0.descriptorCache; return value0.root; }); } // moddle elements if (value.$type) { var value0 = createBoDescriptor(value, cache); cache = value0.descriptorCache; value = value0.root; } // other values descriptor[property.name] = value; }); return { root: descriptor, descriptorCache: cache }; } // reviving ////////// export function reviveDescriptor(entry, reviveCache, hooks) { hooks = hooks || reviveHooks; reviveCache = reviveCache || {}; if (isArray(entry.root)) { return reviveDescriptors0(entry, reviveCache, hooks); } else { return reviveDescriptor0(entry, reviveCache, hooks); } } /** * TBD: document this! * * @param {[type]} entry [description] * @param {[type]} reviveCache [description] * @param {[type]} hooks [description] * @return {[type]} [description] */ function reviveDescriptors0(entry, reviveCache, hooks) { var descriptors = entry.root; var descriptorCache = entry.descriptorCache; return reduce(descriptors, function (result, element) { var currentCache = result.reviveCache, currentDescriptors = result.root; var _reviveDescriptor = reviveDescriptor0({ root: element, descriptorCache: descriptorCache }, currentCache, hooks), root = _reviveDescriptor.root, reviveCache = _reviveDescriptor.reviveCache; return { root: [].concat(_toConsumableArray(currentDescriptors), [root]), reviveCache: reviveCache }; }, { root: [], reviveCache: reviveCache }); } /** * TBD: document this! * * @param {[type]} entry [description] * @param {[type]} cache [description] * @param {[type]} hooks [description] * @return {[type]} [description] */ function reviveDescriptor0(entry, reviveCache, hooks) { var descriptor = entry.root; var id = descriptor.id; var elements = reviveCache.elements || {}; var existingElement = elements[id]; // element already created; nothing to do if (existingElement) { return { root: existingElement, reviveCache: reviveCache }; } // start with a fake element; haha <3 var element = { id: id }; // we're new; need to initialize element via hooks var element0 = evaluateReviveHooks(entry, element, hooks, _objectSpread({}, reviveCache, { elements: elements })); return { root: element0.root, reviveCache: _objectSpread({}, element0.reviveCache, { elements: _objectSpread({}, element0.reviveCache.elements, _defineProperty({}, id, element0.root)) }) }; } // entry = { root, descriptorCache } // element = { id: foo } // hooks = [ ... ] // reviveCache = { ... } function evaluateReviveHooks(entry, element, hooks, reviveCache) { function revive(entry, reviveCache) { return reviveDescriptor(entry, reviveCache, hooks); } return reduce(hooks, function (result, hook) { return hook(entry, result.root, result.reviveCache, revive); }, { root: element, reviveCache: reviveCache }); } function reviveTableElement(entry, element, reviveCache, revive) { var descriptor = entry.root; var createCache = entry.descriptorCache; var elementAttrs = _objectSpread({}, element); // make sure table element ID is same as moddle element ID if (element.businessObject && element.businessObject.id) { elementAttrs.id = element.businessObject.id; } if (descriptor.type === 'row' || descriptor.type === 'col') { var cells0 = revive({ root: descriptor.cells, descriptorCache: createCache }, reviveCache); elementAttrs.cells = cells0.root; reviveCache = cells0.reviveCache; } var Constructor = getConstructor(descriptor); var newElement = new Constructor(elementAttrs); // set parent row or col if (newElement instanceof Row) { newElement.cells.forEach(function (cell) { cell.row = newElement; }); } else if (newElement instanceof Col) { newElement.cells.forEach(function (cell) { cell.col = newElement; }); } return { root: newElement, reviveCache: reviveCache }; } function reviveBusinessObject(entry, element, reviveCache) { var businessObject = entry.root.businessObject; if (!businessObject) { return { root: element, reviveCache: reviveCache }; } // need to clone businessObject var bo0 = createBo({ root: businessObject, descriptorCache: entry.descriptorCache }, reviveCache); return { root: _objectSpread({}, element, { businessObject: bo0.root }), reviveCache: bo0.reviveCache }; } function getConstructor(descriptor) { switch (descriptor.type) { case 'row': return Row; case 'cell': return Cell; case 'col': return Col; default: throw new Error('unknown element type: #' + descriptor.type); } } function createBo(entry, reviveCache) { var boDescriptor = entry.root; var id = boDescriptor.id; var boCache, existingBo; if (id) { boCache = reviveCache.boCache || {}; existingBo = boCache[id]; // businessObject already created; nothing to do if (existingBo) { return { root: existingBo, reviveCache: reviveCache }; } } var newBoAttrs = {}; // set attrs for new business object (might include creating other business objects) keys(boDescriptor).forEach(function (key) { var val, val0; if (boDescriptor[key].$type) { val0 = createBo({ root: boDescriptor[key] }, reviveCache); val = val0.root; reviveCache = val0.reviveCache; boCache = reviveCache.boCache || {}; } else if (isArray(boDescriptor[key])) { val = boDescriptor[key].map(function (b) { val0 = createBo({ root: b }, reviveCache); reviveCache = val0.reviveCache; boCache = reviveCache.boCache || {}; return val0.root; }); } else { val = boDescriptor[key]; } newBoAttrs[key] = val; }); var type = newBoAttrs.$type; delete newBoAttrs.$type; // generate new ID if not supposed to be kept or already assigned if (!reviveCache._keepIds || reviveCache._model.ids.assigned(newBoAttrs.id)) { delete newBoAttrs.id; } var newBo = reviveCache._dmnFactory.create(type, newBoAttrs); // set up $parent relationships for moddle elements forEach(newBoAttrs, function (newBoAttr) { if (newBoAttr.$type) { newBoAttr.$parent = newBo; } if (isArray(newBoAttr)) { newBoAttr.forEach(function (a) { return a.$parent = newBo; }); } }); if (id) { boCache = _objectSpread({}, boCache, _defineProperty({}, id, newBo)); reviveCache = _objectSpread({}, reviveCache, { boCache: boCache }); } return { root: newBo, reviveCache: reviveCache }; } //# sourceMappingURL=DescriptorUtil.js.map