@builttocreate/engine-utils 2.2.0 → 2.3.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,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.getDocumentFromTemplate = exports.getDefaultTemplate = exports.getDefaultJoyDocPage = exports.getDefaultJoyDocFile = exports.getDefaultJoyDoc = exports.getDefaultDocument = exports.getCleanedJoyDocPages = exports.getCleanedJoyDoc = exports.duplicate = 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
 
@@ -201,6 +201,66 @@ var getCleanedJoyDocPages = function getCleanedJoyDocPages(pages) {
201
201
  return [getDefaultJoyDocPage()];
202
202
  }
203
203
  };
204
+ /**
205
+ * Get page order
206
+ *
207
+ * @param {Array} pages
208
+ * @param {Array} pageOrder
209
+ * @return {Array}
210
+ */
211
+
212
+
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
+ };
204
264
  /**
205
265
  * Get a properly formatted Document JoyDoc
206
266
  *
@@ -208,7 +268,7 @@ var getCleanedJoyDocPages = function getCleanedJoyDocPages(pages) {
208
268
  */
209
269
 
210
270
 
211
- exports.getCleanedJoyDocPages = getCleanedJoyDocPages;
271
+ exports.sortPages = sortPages;
212
272
 
213
273
  var getDefaultDocument = function getDefaultDocument() {
214
274
  var type = _DocumentTypes["default"].document;
@@ -297,8 +357,166 @@ var getDocumentFromTemplate = function getDocumentFromTemplate(template) {
297
357
  fields: temp.fields
298
358
  };
299
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
+
300
370
 
301
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;
302
520
  var _default = {
303
521
  getDefaultJoyDocPage: getDefaultJoyDocPage,
304
522
  getDefaultJoyDocFile: getDefaultJoyDocFile,
@@ -308,6 +526,9 @@ var _default = {
308
526
  getDefaultDocument: getDefaultDocument,
309
527
  getDefaultTemplate: getDefaultTemplate,
310
528
  getDocumentFromTemplate: getDocumentFromTemplate,
311
- duplicate: duplicate
529
+ duplicate: duplicate,
530
+ duplicateDocumentPage: duplicateDocumentPage,
531
+ getPageOrder: getPageOrder,
532
+ sortPages: sortPages
312
533
  };
313
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.2.0",
3
+ "version": "2.3.0",
4
4
  "description": "Utility library for common logic shared across web and mobile",
5
5
  "main": "dist/index.js",
6
6
  "files": [
@@ -12,6 +12,7 @@
12
12
  "build-src": "NODE_ENV=production babel src --out-dir dist --extensions '.js,.jsx' --ignore 'src/testUtils/*','src/**/*.stories.js','src/**/*.test.js','src/lib/**/*.test.js','src/**/__snapshots__','src/**/__mocks__'",
13
13
  "build": "npm run clean && npm run build-src",
14
14
  "prepublish": "npm run build",
15
+ "publish-beta": "npm publish --tag beta",
15
16
  "test": "jest",
16
17
  "test-watch": "jest --watch",
17
18
  "lint": "npx eslint ./src",