@builttocreate/engine-utils 2.3.2 → 2.4.0-beta.0.1

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.
@@ -7,7 +7,8 @@ exports["default"] = void 0;
7
7
  // Display Fields
8
8
  var uniqueId = 'uniqueId';
9
9
  var image = 'image';
10
- var richText = 'richText'; // Data Fields
10
+ var richText = 'richText';
11
+ var block = 'block'; // Data Fields
11
12
 
12
13
  var text = 'text';
13
14
  var textarea = 'textarea';
@@ -25,6 +26,7 @@ var chart = 'chart';
25
26
  var types = {
26
27
  uniqueId: uniqueId,
27
28
  image: image,
29
+ block: block,
28
30
  richText: richText,
29
31
  text: text,
30
32
  textarea: textarea,
@@ -44,6 +46,7 @@ types.all = Object.keys(types);
44
46
  types.titles = {
45
47
  uniqueId: 'Auto Number',
46
48
  image: 'Image',
49
+ block: 'Display Text',
47
50
  richText: 'Rich Text',
48
51
  text: 'Short Text',
49
52
  textarea: 'Long Text',
@@ -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.handleMultiSelectOptionToggle = exports.getTemplateWithLookups = exports.getMultiSelectFieldValue = exports.getImportFieldValues = exports.getDefaultOption = exports.getDefaultFieldValuesFromTemplate = exports.getChartFieldValue = exports["default"] = void 0;
8
+ exports.isTargetOptionDeleted = exports.isFieldEmpty = exports.handleMultiSelectOptionToggle = exports.getTemplateWithLookups = exports.getMultiSelectFieldValue = exports.getImportFieldValues = exports.getDefaultOption = exports.getDefaultFieldValuesFromTemplate = exports.getChartFieldValue = exports["default"] = void 0;
9
9
 
10
10
  var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
11
11
 
@@ -13,14 +13,18 @@ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/de
13
13
 
14
14
  var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
15
15
 
16
- var _FieldTypes = _interopRequireDefault(require("./constants/FieldTypes"));
17
-
18
16
  var _chartHelper = require("./chartHelper");
19
17
 
20
18
  var _tableHelper = require("./tableHelper");
21
19
 
22
20
  var _generateObjectId = _interopRequireDefault(require("./generateObjectId"));
23
21
 
22
+ var _FieldTypes = _interopRequireDefault(require("./constants/FieldTypes"));
23
+
24
+ var _FieldDisplayTypes = _interopRequireDefault(require("./constants/FieldDisplayTypes"));
25
+
26
+ var _FieldTableColumnTypes = _interopRequireDefault(require("./constants/FieldTableColumnTypes"));
27
+
24
28
  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; }
25
29
 
26
30
  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; }
@@ -281,8 +285,76 @@ var getTemplateWithLookups = function getTemplateWithLookups(template) {
281
285
  });
282
286
  return nextTemplate;
283
287
  };
288
+ /**
289
+ * This method checks if the field passed via input is empty by checking
290
+ * the field.value.
291
+ * @param {*} fieldProps
292
+ * @returns
293
+ */
294
+
284
295
 
285
296
  exports.getTemplateWithLookups = getTemplateWithLookups;
297
+
298
+ var isFieldEmpty = function isFieldEmpty(fieldType, fieldValue, fieldOptions, fieldDisplayType, fieldColumnType) {
299
+ var isEmpty = false;
300
+ if (fieldType === _FieldTypes["default"].block) return;
301
+
302
+ if (fieldType === _FieldTypes["default"].text && (!fieldValue || fieldValue && fieldValue.replace(/\s+/g, '').length == 0)) {
303
+ isEmpty = true;
304
+ } else if (fieldType === _FieldTypes["default"].textarea && (!fieldValue || fieldValue && fieldValue.replace(/\s+/g, '').length == 0)) {
305
+ isEmpty = true;
306
+ } else if (fieldType === _FieldTypes["default"].number && !fieldValue) {
307
+ isEmpty = true;
308
+ } else if (fieldType === _FieldTypes["default"].date && !fieldValue) {
309
+ isEmpty = true;
310
+ } else if (fieldType === _FieldTypes["default"].signature && !fieldValue) {
311
+ isEmpty = true;
312
+ } else if (fieldType === _FieldTypes["default"].dropdown && (!fieldValue || fieldValue && fieldOptions.length > 0 && isTargetOptionDeleted(fieldValue, fieldOptions))) {
313
+ isEmpty = true;
314
+ } else if (fieldType === _FieldTypes["default"].multiSelect && (!fieldValue || fieldValue && fieldOptions.length > 0 && isTargetOptionDeleted(fieldValue, fieldOptions))) {
315
+ isEmpty = true;
316
+ } else if (fieldType === _FieldTypes["default"].image && (!fieldValue || fieldValue && fieldValue.length === 0)) {
317
+ isEmpty = true;
318
+ } else if (fieldType === _FieldTypes["default"].chart && (!fieldValue || fieldValue && fieldValue.length === 0)) {
319
+ isEmpty = true;
320
+ } else if (fieldType === _FieldTypes["default"].table && fieldDisplayType === _FieldDisplayTypes["default"].original && (!fieldValue || fieldValue && fieldValue.filter(function (item) {
321
+ return !item.deleted;
322
+ }).length === 0)) {
323
+ isEmpty = true;
324
+ } else if (fieldType === _FieldTypes["default"].table && fieldDisplayType === _FieldDisplayTypes["default"].text && fieldColumnType === _FieldTableColumnTypes["default"].dropdown && (!fieldValue || fieldValue && fieldOptions.length > 0 && isTargetOptionDeleted(fieldValue, fieldOptions))) {
325
+ isEmpty = true;
326
+ } else if (fieldType === _FieldTypes["default"].table && fieldDisplayType !== _FieldDisplayTypes["default"].text && fieldColumnType === _FieldTableColumnTypes["default"].dropdown && (!fieldValue || fieldValue && fieldOptions.length > 0 && isTargetOptionDeleted(fieldValue, fieldOptions))) {
327
+ isEmpty = true;
328
+ } else if (fieldType === _FieldTypes["default"].table && fieldDisplayType === _FieldDisplayTypes["default"].text && fieldColumnType === _FieldTableColumnTypes["default"].text && (!fieldValue || fieldValue && fieldValue.replace(/\s+/g, '').length == 0)) {
329
+ isEmpty = true;
330
+ } else if (fieldType === _FieldTypes["default"].table && fieldDisplayType === _FieldDisplayTypes["default"].text && fieldColumnType === _FieldTableColumnTypes["default"].image && (!fieldValue || fieldValue && fieldValue.length === 0)) {
331
+ isEmpty = true;
332
+ }
333
+
334
+ return isEmpty;
335
+ };
336
+ /**
337
+ * This function checks whether an option associated with multiselect or dropdown
338
+ * field is deleted.
339
+ * @param {*} value // value
340
+ * @param {*} options
341
+ */
342
+
343
+
344
+ exports.isFieldEmpty = isFieldEmpty;
345
+
346
+ var isTargetOptionDeleted = function isTargetOptionDeleted(value, options) {
347
+ //Dropdown field has value as a string whereas multiselect has value as an array
348
+ var nextValue = value && typeof value === 'string' ? value : value[0]; //If user unchecks an option in mutliselect value will be undefiend
349
+
350
+ if (!nextValue) return true;
351
+ var targetOption = options.find(function (option) {
352
+ return option._id === nextValue;
353
+ });
354
+ return targetOption ? targetOption.deleted : true;
355
+ };
356
+
357
+ exports.isTargetOptionDeleted = isTargetOptionDeleted;
286
358
  var _default = {
287
359
  getDefaultOption: getDefaultOption,
288
360
  getChartFieldValue: getChartFieldValue,
@@ -290,6 +362,8 @@ var _default = {
290
362
  handleMultiSelectOptionToggle: handleMultiSelectOptionToggle,
291
363
  getDefaultFieldValuesFromTemplate: getDefaultFieldValuesFromTemplate,
292
364
  getImportFieldValues: getImportFieldValues,
293
- getTemplateWithLookups: getTemplateWithLookups
365
+ getTemplateWithLookups: getTemplateWithLookups,
366
+ isFieldEmpty: isFieldEmpty,
367
+ isTargetOptionDeleted: isTargetOptionDeleted
294
368
  };
295
369
  exports["default"] = _default;
@@ -393,38 +393,104 @@ var duplicateDocumentPage = function duplicateDocumentPage(doc, fileId, pageId)
393
393
  (_nextDoc$fields = nextDoc.fields) === null || _nextDoc$fields === void 0 ? void 0 : _nextDoc$fields.forEach(function (field) {
394
394
  if (field.file === fileId) fieldLookup[field._id] = field;
395
395
  });
396
- var newFieldsLookupByOldId = {};
396
+ /**
397
+ * Step 1: Duplicate fields associated with target page
398
+ */
399
+
400
+ var fieldIdsToDuplicate = []; //Step 1.1 Get all field Ids from primary page
401
+
402
+ var targetPageIndex = nextDoc.files[fileIndex].pages.findIndex(function (page) {
403
+ return page._id === pageId;
404
+ });
405
+ if (targetPageIndex !== -1) nextDoc.files[fileIndex].pages[targetPageIndex].fieldPositions.forEach(function (fieldPosition) {
406
+ return fieldIdsToDuplicate.push(fieldPosition.field);
407
+ }); //Step 1.2 Get all field Ids from view page
408
+
409
+ if (nextDoc.files[fileIndex].views && nextDoc.files[fileIndex].views.length > 0) {
410
+ nextDoc.files[fileIndex].views.forEach(function (view) {
411
+ var viewPageIndex = view.pages.findIndex(function (page) {
412
+ return page._id === pageId;
413
+ });
397
414
 
398
- var duplicateFieldForFieldPosition = function duplicateFieldForFieldPosition(field) {
415
+ if (viewPageIndex !== -1) {
416
+ view.pages[viewPageIndex].fieldPositions.forEach(function (fieldPosition) {
417
+ if (fieldIdsToDuplicate.indexOf(fieldPosition.field) === -1) fieldIdsToDuplicate.push(fieldPosition.field);
418
+ });
419
+ }
420
+ });
421
+ }
422
+
423
+ var newFieldsLookupByOldId = {};
424
+ var duplicatedFields = [];
425
+ fieldIdsToDuplicate.forEach(function (fieldId) {
399
426
  /**
400
427
  * Why do we check if a new field has already been created?
401
428
  *
402
429
  * That is because multiple field positions can be associated with the same
403
430
  * field. If a field has already been created by a previous field position
404
- * that is linked to the same field as the current target then just return
405
- * the existing newly created field.
431
+ * that is linked to the same field as the current target then do not create
432
+ * again.
406
433
  */
407
- if (newFieldsLookupByOldId[field._id]) return newFieldsLookupByOldId[field._id];
434
+ if (newFieldsLookupByOldId[fieldId]) return;
435
+ var field = fieldLookup[fieldId];
408
436
 
409
437
  var duplicateField = _objectSpread(_objectSpread({}, field), {}, {
410
438
  _id: (0, _generateObjectId["default"])()
411
439
  });
412
440
 
413
- nextDoc.fields.push(duplicateField);
414
- changelogInfo.fields.push(duplicateField);
441
+ duplicatedFields.push(duplicateField);
415
442
  /**
416
443
  * Add to lookup so it can be used with other associated field positions
417
444
  */
418
445
 
419
446
  newFieldsLookupByOldId[field._id] = duplicateField;
420
- return duplicateField;
421
- };
447
+ });
422
448
  /**
423
- * Step 1: Update Primary View Page Order
449
+ * Step 2: Update newly duplicated fields logic properties
424
450
  *
425
- * IMPORTANT NOTE: Page order update must go before page object creation.
451
+ * This step can only be done after all fields have been properly duplicated.
452
+ *
453
+ * We only need to update logic conditions that referenced the target page
454
+ * that we are duplicating. We do this by checking the logic.condition[x].page
455
+ * property of the condition.
426
456
  */
427
457
 
458
+ duplicatedFields = duplicatedFields.map(function (duplicatedField) {
459
+ if (!duplicatedField.logic || !duplicatedField.logic.conditions || duplicatedField.logic.conditions.length < 1) return duplicatedField;
460
+
461
+ var nextField = _objectSpread(_objectSpread({}, duplicatedField), {}, {
462
+ logic: _objectSpread({}, duplicatedField.logic)
463
+ });
464
+
465
+ nextField.logic.conditions = nextField.logic.conditions.map(function (condition) {
466
+ /**
467
+ * 1. Only update conditions associated with the current page being duplicated.
468
+ * 2. Only update conditions associated with a field that was duplicated.
469
+ */
470
+ if (condition.page === pageId && newFieldsLookupByOldId[condition.field]) {
471
+ return _objectSpread(_objectSpread({}, condition), {}, {
472
+ page: newPageId,
473
+ field: newFieldsLookupByOldId[condition.field]._id
474
+ });
475
+ } else {
476
+ return condition;
477
+ }
478
+ });
479
+ return nextField;
480
+ });
481
+ /**
482
+ * Step 3: Add newly duplicated fields changelogs and update doucment
483
+ */
484
+
485
+ duplicatedFields.forEach(function (duplicateField) {
486
+ changelogInfo.fields.push(duplicateField);
487
+ nextDoc.fields.push(duplicateField);
488
+ });
489
+ /**
490
+ * Step 4: Update Primary View Page Order
491
+ *
492
+ * IMPORTANT NOTE: Page order update must go before page object creation.
493
+ */
428
494
 
429
495
  var pageOrder = getPageOrder(nextDoc.files[fileIndex].pageOrder, nextDoc.files[fileIndex].pages);
430
496
  var primaryPageOrderIndex = pageOrder.findIndex(function (id) {
@@ -434,7 +500,7 @@ var duplicateDocumentPage = function duplicateDocumentPage(doc, fileId, pageId)
434
500
  nextDoc.files[fileIndex].pageOrder = pageOrder;
435
501
  nextDoc.files[fileIndex].pageOrder.splice(primaryPageOrderTargetIndex, 0, newPageId);
436
502
  /**
437
- * Step 2: Generate Primary View Page
503
+ * Step 5: Generate Primary View Page
438
504
  */
439
505
 
440
506
  var primaryPageIndex = nextDoc.files[fileIndex].pages.findIndex(function (page) {
@@ -445,20 +511,20 @@ var duplicateDocumentPage = function duplicateDocumentPage(doc, fileId, pageId)
445
511
  fieldPositions: []
446
512
  }, pageDefaults);
447
513
  nextDoc.files[fileIndex].pages[primaryPageIndex].fieldPositions.forEach(function (fieldPosition) {
448
- var newField = duplicateFieldForFieldPosition(fieldLookup[fieldPosition.field]);
514
+ var newField = newFieldsLookupByOldId[fieldPosition.field];
449
515
  newPrimaryPage.fieldPositions.push(_objectSpread(_objectSpread({}, fieldPosition), {}, {
450
516
  field: newField._id
451
517
  }));
452
518
  });
453
519
  nextDoc.files[fileIndex].pages.splice(primaryPageIndex + 1, 0, newPrimaryPage);
454
520
  /**
455
- * Step 3: Update Primary Page Changelog
521
+ * Step 6: Update Primary Page Changelog
456
522
  */
457
523
 
458
524
  changelogInfo.primaryPages.targetIndex = primaryPageOrderTargetIndex;
459
525
  changelogInfo.primaryPages.page = newPrimaryPage;
460
526
  /**
461
- * Step 4: Update Views
527
+ * Step 7: Update Views
462
528
  */
463
529
 
464
530
  if (nextDoc.files[fileIndex].views && nextDoc.files[fileIndex].views.length > 0) {
@@ -470,7 +536,7 @@ var duplicateDocumentPage = function duplicateDocumentPage(doc, fileId, pageId)
470
536
  });
471
537
  if (viewPageIndex === -1) return view;
472
538
  /**
473
- * Step 4.1 Update View Page Order.
539
+ * Step 7.1 Update View Page Order.
474
540
  *
475
541
  * IMPORTANT NOTE: Page order update must go before page object creation.
476
542
  */
@@ -483,7 +549,7 @@ var duplicateDocumentPage = function duplicateDocumentPage(doc, fileId, pageId)
483
549
  nextView.pageOrder = nextViewPageOrder;
484
550
  nextView.pageOrder.splice(nextViewTargetPageOrderIndex, 0, newPageId);
485
551
  /**
486
- * Step 4.2 Update View Pages
552
+ * Step 7.2 Update View Pages
487
553
  */
488
554
 
489
555
  var newViewPage = _objectSpread(_objectSpread({}, nextView.pages[viewPageIndex]), {}, {
@@ -492,14 +558,14 @@ var duplicateDocumentPage = function duplicateDocumentPage(doc, fileId, pageId)
492
558
  }, pageDefaults);
493
559
 
494
560
  nextView.pages[viewPageIndex].fieldPositions.forEach(function (fieldPosition) {
495
- var newField = duplicateFieldForFieldPosition(fieldLookup[fieldPosition.field]);
561
+ var newField = newFieldsLookupByOldId[fieldPosition.field];
496
562
  newViewPage.fieldPositions.push(_objectSpread(_objectSpread({}, fieldPosition), {}, {
497
563
  field: newField._id
498
564
  }));
499
565
  });
500
566
  nextView.pages.splice(viewPageIndex + 1, 0, newViewPage);
501
567
  /**
502
- * Step 4.3 Add View Page Changelog Info
568
+ * Step 7.3 Add View Page Changelog Info
503
569
  */
504
570
 
505
571
  changelogInfo.viewPages.push({
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@builttocreate/engine-utils",
3
- "version": "2.3.2",
3
+ "version": "2.4.0-beta.0.1",
4
4
  "description": "Utility library for common logic shared across web and mobile",
5
5
  "main": "dist/index.js",
6
6
  "files": [