@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.
- package/dist/constants/FieldTypes.js +4 -1
- package/dist/fieldHelper.js +78 -4
- package/dist/joyDocHelper.js +85 -19
- package/package.json +1 -1
|
@@ -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';
|
|
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',
|
package/dist/fieldHelper.js
CHANGED
|
@@ -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;
|
package/dist/joyDocHelper.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
|
405
|
-
*
|
|
431
|
+
* that is linked to the same field as the current target then do not create
|
|
432
|
+
* again.
|
|
406
433
|
*/
|
|
407
|
-
if (newFieldsLookupByOldId[
|
|
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
|
-
|
|
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
|
-
|
|
421
|
-
};
|
|
447
|
+
});
|
|
422
448
|
/**
|
|
423
|
-
* Step
|
|
449
|
+
* Step 2: Update newly duplicated fields logic properties
|
|
424
450
|
*
|
|
425
|
-
*
|
|
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
|
|
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 =
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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 =
|
|
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
|
|
568
|
+
* Step 7.3 Add View Page Changelog Info
|
|
503
569
|
*/
|
|
504
570
|
|
|
505
571
|
changelogInfo.viewPages.push({
|