@builttocreate/engine-utils 2.0.1 → 2.2.0-rc.1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports["default"] = void 0;
7
+ var types = {
8
+ document: 'document',
9
+ template: 'template',
10
+ version: 'version'
11
+ };
12
+ var _default = types;
13
+ exports["default"] = _default;
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports["default"] = exports.FileViews = void 0;
7
+ var FileViews = {
8
+ mobile: 'mobile'
9
+ };
10
+ exports.FileViews = FileViews;
11
+ var _default = FileViews;
12
+ exports["default"] = _default;
@@ -5,7 +5,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
- exports.getDefaultJoyDocPage = exports.getDefaultJoyDocFile = exports.getDefaultJoyDoc = exports.getCleanedJoyDocPages = exports.getCleanedJoyDoc = exports["default"] = void 0;
8
+ exports.sortPages = exports.getPageOrder = exports.getDocumentFromTemplate = exports.getDefaultTemplate = exports.getDefaultJoyDocPage = exports.getDefaultJoyDocFile = exports.getDefaultJoyDoc = exports.getDefaultDocument = exports.getCleanedJoyDocPages = exports.getCleanedJoyDoc = exports.duplicateDocumentPage = exports.duplicate = exports["default"] = exports.cleanPageOrder = void 0;
9
9
 
10
10
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
11
11
 
@@ -17,6 +17,8 @@ var _PageLayoutModes = _interopRequireDefault(require("./constants/PageLayoutMod
17
17
 
18
18
  var _FieldPresentationModes = _interopRequireDefault(require("./constants/FieldPresentationModes"));
19
19
 
20
+ var _DocumentTypes = _interopRequireDefault(require("./constants/DocumentTypes"));
21
+
20
22
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
21
23
 
22
24
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
@@ -199,13 +201,334 @@ var getCleanedJoyDocPages = function getCleanedJoyDocPages(pages) {
199
201
  return [getDefaultJoyDocPage()];
200
202
  }
201
203
  };
204
+ /**
205
+ * Get page order
206
+ *
207
+ * @param {Array} pages
208
+ * @param {Array} pageOrder
209
+ * @return {Array}
210
+ */
211
+
202
212
 
203
213
  exports.getCleanedJoyDocPages = getCleanedJoyDocPages;
214
+
215
+ var getPageOrder = function getPageOrder(pageOrder, pages) {
216
+ return pageOrder || pages.map(function (page) {
217
+ return page._id;
218
+ });
219
+ };
220
+ /**
221
+ *
222
+ * Clean pageOrder
223
+ *
224
+ * 1. Remove any pageIds associated with a missing page.
225
+ * 2. Remove any underfined or invalid pageIds
226
+ * 3. Remove any duplicate pageIds
227
+ *
228
+ * @param {Array} pageOrder //[string, string, ...]
229
+ * @param {Array} pages //[object, object, ...]
230
+ * @returns {Array}
231
+ */
232
+
233
+
234
+ exports.getPageOrder = getPageOrder;
235
+
236
+ var cleanPageOrder = function cleanPageOrder(pageOrder, pages) {
237
+ var pageLookup = {};
238
+ pages.forEach(function (page) {
239
+ return pageLookup[page._id] = page && !page.deleted;
240
+ });
241
+ return pageOrder.filter(function (pageId, index) {
242
+ return pageLookup[pageId] && pageId && pageOrder.indexOf(pageId) === index;
243
+ });
244
+ };
245
+ /**
246
+ * Sort pages based on pageOrder
247
+ */
248
+
249
+
250
+ exports.cleanPageOrder = cleanPageOrder;
251
+
252
+ var sortPages = function sortPages(pages, pageOrder) {
253
+ if (!pageOrder) return pages;
254
+ var pageLookup = {};
255
+ pages.forEach(function (page) {
256
+ pageLookup[page._id] = page;
257
+ });
258
+ var sortedPages = [];
259
+ pageOrder.forEach(function (pageId) {
260
+ if (pageLookup[pageId]) sortedPages.push(pageLookup[pageId]);
261
+ });
262
+ return sortedPages;
263
+ };
264
+ /**
265
+ * Get a properly formatted Document JoyDoc
266
+ *
267
+ * @returns {Object}
268
+ */
269
+
270
+
271
+ exports.sortPages = sortPages;
272
+
273
+ var getDefaultDocument = function getDefaultDocument() {
274
+ var type = _DocumentTypes["default"].document;
275
+
276
+ var _id = (0, _generateObjectId["default"])();
277
+
278
+ var identifier = "doc_".concat(_id);
279
+ var name = 'New Doc';
280
+ return getDefaultJoyDoc({
281
+ type: type,
282
+ _id: _id,
283
+ identifier: identifier,
284
+ name: name
285
+ });
286
+ };
287
+ /**
288
+ * Get a properly formatted Template JoyDoc
289
+ *
290
+ * @returns {Object}
291
+ */
292
+
293
+
294
+ exports.getDefaultDocument = getDefaultDocument;
295
+
296
+ var getDefaultTemplate = function getDefaultTemplate() {
297
+ var type = _DocumentTypes["default"].template;
298
+
299
+ var _id = (0, _generateObjectId["default"])();
300
+
301
+ var identifier = "template_".concat(_id);
302
+ var name = 'New Template';
303
+ return getDefaultJoyDoc({
304
+ type: type,
305
+ _id: _id,
306
+ identifier: identifier,
307
+ name: name
308
+ });
309
+ };
310
+ /**
311
+ * Get a properly formatted duplicate of a Template or Document
312
+ *
313
+ * @returns {Object}
314
+ */
315
+
316
+
317
+ exports.getDefaultTemplate = getDefaultTemplate;
318
+
319
+ var duplicate = function duplicate(original, defaults) {
320
+ //Remove all references to original template object
321
+ var origin = JSON.parse(JSON.stringify(original));
322
+
323
+ var _id = (0, _generateObjectId["default"])();
324
+
325
+ var identifier = origin.type === _DocumentTypes["default"].template ? "template_".concat(_id) : "doc_".concat(_id);
326
+ return _objectSpread(_objectSpread({}, origin), {}, {
327
+ _id: _id,
328
+ identifier: identifier,
329
+ createdOn: new Date().getTime(),
330
+ source: origin.identifier
331
+ }, defaults);
332
+ };
333
+ /**
334
+ * Get a properly formatted Document JoyDoc from Template JoyDoc
335
+ *
336
+ * @param {Object} template
337
+ * @returns {Object}
338
+ */
339
+
340
+
341
+ exports.duplicate = duplicate;
342
+
343
+ var getDocumentFromTemplate = function getDocumentFromTemplate(template) {
344
+ var _id = (0, _generateObjectId["default"])();
345
+
346
+ var identifier = "doc_".concat(_id); //Remove all references to original template object
347
+
348
+ var temp = JSON.parse(JSON.stringify(template));
349
+ return {
350
+ _id: _id,
351
+ identifier: identifier,
352
+ type: _DocumentTypes["default"].document,
353
+ name: temp.name,
354
+ template: temp.identifier,
355
+ source: temp.identifier,
356
+ files: temp.files,
357
+ fields: temp.fields
358
+ };
359
+ };
360
+ /**
361
+ * Handle Page Duplication for JoyDoc
362
+ *
363
+ * @param {Object} doc //Full JoyDoc Payload for Template or Document
364
+ * @param {String} fileId //File ID that contains the page we are duplicating
365
+ * @param {String} pageId
366
+ * @param {Object} pageDefaults
367
+ * @returns {Object}
368
+ */
369
+
370
+
371
+ exports.getDocumentFromTemplate = getDocumentFromTemplate;
372
+
373
+ var duplicateDocumentPage = function duplicateDocumentPage(doc, fileId, pageId) {
374
+ var _nextDoc$fields;
375
+
376
+ var pageDefaults = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
377
+ var changelogInfo = {
378
+ primaryPages: {
379
+ targetIndex: 0,
380
+ page: null
381
+ },
382
+ viewPages: [],
383
+ fields: []
384
+ };
385
+ var nextDoc = JSON.parse(JSON.stringify(doc));
386
+ var fileIndex = nextDoc.files.findIndex(function (file) {
387
+ return file._id === fileId;
388
+ });
389
+ var newPageId = (0, _generateObjectId["default"])();
390
+ var fieldLookup = {};
391
+ (_nextDoc$fields = nextDoc.fields) === null || _nextDoc$fields === void 0 ? void 0 : _nextDoc$fields.forEach(function (field) {
392
+ if (field.file === fileId) fieldLookup[field._id] = field;
393
+ });
394
+ var newFieldsLookupByOldId = {};
395
+
396
+ var duplicateFieldForFieldPosition = function duplicateFieldForFieldPosition(field) {
397
+ /**
398
+ * Why do we check if a new field has already been created?
399
+ *
400
+ * That is because multiple field positions can be associated with the same
401
+ * field. If a field has already been created by a previous field position
402
+ * that is linked to the same field as the current target then just return
403
+ * the existing newly created field.
404
+ */
405
+ if (newFieldsLookupByOldId[field._id]) return newFieldsLookupByOldId[field._id];
406
+
407
+ var duplicateField = _objectSpread(_objectSpread({}, field), {}, {
408
+ _id: (0, _generateObjectId["default"])()
409
+ });
410
+
411
+ nextDoc.fields.push(duplicateField);
412
+ changelogInfo.fields.push(duplicateField);
413
+ /**
414
+ * Add to lookup so it can be used with other associated field positions
415
+ */
416
+
417
+ newFieldsLookupByOldId[field._id] = duplicateField;
418
+ return duplicateField;
419
+ };
420
+ /**
421
+ * Step 1: Update Primary View Page Order
422
+ *
423
+ * IMPORTANT NOTE: Page order update must go before page object creation.
424
+ */
425
+
426
+
427
+ var pageOrder = getPageOrder(nextDoc.files[fileIndex].pageOrder, nextDoc.files[fileIndex].pages);
428
+ var primaryPageOrderIndex = pageOrder.findIndex(function (id) {
429
+ return id === pageId;
430
+ });
431
+ var primaryPageOrderTargetIndex = primaryPageOrderIndex + 1;
432
+ nextDoc.files[fileIndex].pageOrder = pageOrder;
433
+ nextDoc.files[fileIndex].pageOrder.splice(primaryPageOrderTargetIndex, 0, newPageId);
434
+ /**
435
+ * Step 2: Generate Primary View Page
436
+ */
437
+
438
+ var primaryPageIndex = nextDoc.files[fileIndex].pages.findIndex(function (page) {
439
+ return page._id === pageId;
440
+ });
441
+ var newPrimaryPage = primaryPageIndex === -1 ? null : _objectSpread(_objectSpread({}, nextDoc.files[fileIndex].pages[primaryPageIndex]), {}, {
442
+ _id: newPageId,
443
+ fieldPositions: []
444
+ }, pageDefaults);
445
+ nextDoc.files[fileIndex].pages[primaryPageIndex].fieldPositions.forEach(function (fieldPosition) {
446
+ var newField = duplicateFieldForFieldPosition(fieldLookup[fieldPosition.field]);
447
+ newPrimaryPage.fieldPositions.push(_objectSpread(_objectSpread({}, fieldPosition), {}, {
448
+ field: newField._id
449
+ }));
450
+ });
451
+ nextDoc.files[fileIndex].pages.splice(primaryPageIndex + 1, 0, newPrimaryPage);
452
+ /**
453
+ * Step 3: Update Primary Page Changelog
454
+ */
455
+
456
+ changelogInfo.primaryPages.targetIndex = primaryPageOrderTargetIndex;
457
+ changelogInfo.primaryPages.page = newPrimaryPage;
458
+ /**
459
+ * Step 4: Update Views
460
+ */
461
+
462
+ if (nextDoc.files[fileIndex].views && nextDoc.files[fileIndex].views.length > 0) {
463
+ nextDoc.files[fileIndex].views = nextDoc.files[fileIndex].views.map(function (view) {
464
+ var nextView = _objectSpread({}, view);
465
+
466
+ var viewPageIndex = nextView.pages.findIndex(function (page) {
467
+ return page._id === pageId;
468
+ });
469
+ if (viewPageIndex === -1) return view;
470
+ /**
471
+ * Step 4.1 Update View Page Order.
472
+ *
473
+ * IMPORTANT NOTE: Page order update must go before page object creation.
474
+ */
475
+
476
+ var nextViewPageOrder = getPageOrder(nextView.pageOrder, nextView.pages);
477
+ var nextViewPageOrderIndex = nextViewPageOrder.findIndex(function (id) {
478
+ return id === pageId;
479
+ });
480
+ var nextViewTargetPageOrderIndex = nextViewPageOrderIndex + 1;
481
+ nextView.pageOrder = nextViewPageOrder;
482
+ nextView.pageOrder.splice(nextViewTargetPageOrderIndex, 0, newPageId);
483
+ /**
484
+ * Step 4.2 Update View Pages
485
+ */
486
+
487
+ var newViewPage = _objectSpread(_objectSpread({}, nextView.pages[viewPageIndex]), {}, {
488
+ _id: newPageId,
489
+ fieldPositions: []
490
+ }, pageDefaults);
491
+
492
+ nextView.pages[viewPageIndex].fieldPositions.forEach(function (fieldPosition) {
493
+ var newField = duplicateFieldForFieldPosition(fieldLookup[fieldPosition.field]);
494
+ newViewPage.fieldPositions.push(_objectSpread(_objectSpread({}, fieldPosition), {}, {
495
+ field: newField._id
496
+ }));
497
+ });
498
+ nextView.pages.splice(viewPageIndex + 1, 0, newViewPage);
499
+ /**
500
+ * Step 4.3 Add View Page Changelog Info
501
+ */
502
+
503
+ changelogInfo.viewPages.push({
504
+ viewId: view._id,
505
+ view: view.type,
506
+ targetIndex: nextViewTargetPageOrderIndex,
507
+ page: newViewPage
508
+ });
509
+ return nextView;
510
+ });
511
+ }
512
+
513
+ return {
514
+ changelogInfo: changelogInfo,
515
+ doc: nextDoc
516
+ };
517
+ };
518
+
519
+ exports.duplicateDocumentPage = duplicateDocumentPage;
204
520
  var _default = {
205
521
  getDefaultJoyDocPage: getDefaultJoyDocPage,
206
522
  getDefaultJoyDocFile: getDefaultJoyDocFile,
207
523
  getDefaultJoyDoc: getDefaultJoyDoc,
208
524
  getCleanedJoyDoc: getCleanedJoyDoc,
209
- getCleanedJoyDocPages: getCleanedJoyDocPages
525
+ getCleanedJoyDocPages: getCleanedJoyDocPages,
526
+ getDefaultDocument: getDefaultDocument,
527
+ getDefaultTemplate: getDefaultTemplate,
528
+ getDocumentFromTemplate: getDocumentFromTemplate,
529
+ duplicate: duplicate,
530
+ duplicateDocumentPage: duplicateDocumentPage,
531
+ getPageOrder: getPageOrder,
532
+ sortPages: sortPages
210
533
  };
211
534
  exports["default"] = _default;
@@ -655,7 +655,7 @@ var generateTableLookup = function generateTableLookup(rows, columns) {
655
655
 
656
656
  if (cellValue && column.type === _FieldTableColumnTypes["default"].dropdown) {
657
657
  tableLookup[cellKey] = columnOptionsLookup[column._id][cellValue];
658
- } else if (cellValue && column.type === _FieldTableColumnTypes["default"].image) {
658
+ } else if ((cellValue || cellRawValue) && column.type === _FieldTableColumnTypes["default"].image) {
659
659
  tableLookup[cellKey] = cellRawValue;
660
660
  } else if (cellValue && formulaCell && containsOperands) {
661
661
  formulaCells.push(cellKey);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@builttocreate/engine-utils",
3
- "version": "2.0.1",
3
+ "version": "2.2.0-rc.1.0.0",
4
4
  "description": "Utility library for common logic shared across web and mobile",
5
5
  "main": "dist/index.js",
6
6
  "files": [