@builttocreate/engine-utils 2.7.0 → 2.8.0-beta.10

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.
@@ -1,39 +1,32 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
4
  Object.defineProperty(exports, "__esModule", {
6
5
  value: true
7
6
  });
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
-
7
+ exports.sortPages = exports.sortFieldPositionsByXAndYCoordinates = exports.removeOrphanedFieldsFromJoydoc = exports.mergeAssoicatedFieldPositionsForMobilePage = exports.getPageOrder = exports.getMobileViewFromFile = exports.getDocumentFromTemplate = exports.getDefaultTemplate = exports.getDefaultJoyDocPage = exports.getDefaultJoyDocFile = exports.getDefaultJoyDoc = exports.getDefaultDocument = exports.getCleanedJoyDocPages = exports.getCleanedJoyDoc = exports.generateMobileViewFromFile = exports.generateMobilePageFieldPositions = exports.generateMobilePage = exports.formatTableFieldPositions = exports.duplicateDocumentPage = exports.duplicate = exports["default"] = exports.cleanPageOrder = void 0;
8
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
10
9
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
11
-
12
10
  var _generateObjectId = _interopRequireDefault(require("./generateObjectId"));
13
-
14
11
  var _validateObjectId = _interopRequireDefault(require("./validateObjectId"));
15
-
16
12
  var _PageLayoutModes = _interopRequireDefault(require("./constants/PageLayoutModes"));
17
-
18
13
  var _FieldPresentationModes = _interopRequireDefault(require("./constants/FieldPresentationModes"));
19
-
20
14
  var _DocumentTypes = _interopRequireDefault(require("./constants/DocumentTypes"));
21
-
15
+ var _PageTypes = _interopRequireDefault(require("./constants/PageTypes"));
22
16
  var _FieldTypes = _interopRequireDefault(require("./constants/FieldTypes"));
23
-
17
+ var _FieldDisplayTypes = _interopRequireDefault(require("./constants/FieldDisplayTypes"));
18
+ var _FileViews = _interopRequireDefault(require("./constants/FileViews"));
19
+ var _FormStyleOptions = _interopRequireDefault(require("./constants/FormStyleOptions"));
24
20
  var _tableHelper = require("./tableHelper");
25
-
26
- 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; }
27
-
28
- 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; }
29
-
21
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
22
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
30
23
  /**
31
24
  * Create default page
32
25
  *
33
26
  * @param {Object} defaults
34
27
  * @return {Object}
35
28
  */
36
- var getDefaultJoyDocPage = function getDefaultJoyDocPage() {
29
+ var getDefaultJoyDocPage = exports.getDefaultJoyDocPage = function getDefaultJoyDocPage() {
37
30
  var defaults = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
38
31
  return _objectSpread({
39
32
  _id: (0, _generateObjectId["default"])(),
@@ -48,6 +41,7 @@ var getDefaultJoyDocPage = function getDefaultJoyDocPage() {
48
41
  padding: 24
49
42
  }, defaults);
50
43
  };
44
+
51
45
  /**
52
46
  * Create default file
53
47
  *
@@ -55,11 +49,7 @@ var getDefaultJoyDocPage = function getDefaultJoyDocPage() {
55
49
  * @param {Object} pageDefaults
56
50
  * @return {Object}
57
51
  */
58
-
59
-
60
- exports.getDefaultJoyDocPage = getDefaultJoyDocPage;
61
-
62
- var getDefaultJoyDocFile = function getDefaultJoyDocFile() {
52
+ var getDefaultJoyDocFile = exports.getDefaultJoyDocFile = function getDefaultJoyDocFile() {
63
53
  var defaults = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
64
54
  var pageDefaults = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
65
55
  var page = getDefaultJoyDocPage(pageDefaults);
@@ -73,6 +63,7 @@ var getDefaultJoyDocFile = function getDefaultJoyDocFile() {
73
63
  }
74
64
  }, defaults);
75
65
  };
66
+
76
67
  /**
77
68
  * Create default document
78
69
  *
@@ -80,11 +71,7 @@ var getDefaultJoyDocFile = function getDefaultJoyDocFile() {
80
71
  * @param {Object} pageDefaults
81
72
  * @return {Object}
82
73
  */
83
-
84
-
85
- exports.getDefaultJoyDocFile = getDefaultJoyDocFile;
86
-
87
- var getDefaultJoyDoc = function getDefaultJoyDoc() {
74
+ var getDefaultJoyDoc = exports.getDefaultJoyDoc = function getDefaultJoyDoc() {
88
75
  var defaults = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
89
76
  var fileDefaults = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
90
77
  var pageDefaults = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
@@ -97,6 +84,7 @@ var getDefaultJoyDoc = function getDefaultJoyDoc() {
97
84
  fields: []
98
85
  }, defaults);
99
86
  };
87
+
100
88
  /**
101
89
  * Get Clean JoyDoc Format
102
90
  *
@@ -111,78 +99,161 @@ var getDefaultJoyDoc = function getDefaultJoyDoc() {
111
99
  * @param {Object} doc
112
100
  * @returns {Object}
113
101
  */
114
-
115
-
116
- exports.getDefaultJoyDoc = getDefaultJoyDoc;
117
-
118
- var getCleanedJoyDoc = function getCleanedJoyDoc(doc) {
102
+ var getCleanedJoyDoc = exports.getCleanedJoyDoc = function getCleanedJoyDoc(doc) {
119
103
  if (!doc) return getDefaultJoyDoc();
104
+ var nextDoc = removeOrphanedFieldsFromJoydoc(doc);
120
105
 
121
- var nextDoc = _objectSpread({}, doc);
122
106
  /**
123
107
  * Step 1.1: Replace doc._id if it is not valid
124
108
  */
125
-
126
-
127
109
  if (nextDoc._id && !(0, _validateObjectId["default"])(nextDoc._id)) nextDoc._id = (0, _generateObjectId["default"])();
128
-
129
110
  if (nextDoc.files && nextDoc.files.length > 0) {
130
111
  nextDoc.files = nextDoc.files.map(function (file) {
131
112
  var _nextFile$views;
132
-
133
113
  var nextFile = _objectSpread({}, file);
114
+
134
115
  /**
135
116
  * Step 1.2: Replace files[x]._id if it is not valid
136
117
  */
137
-
138
-
139
118
  if (nextFile._id && !(0, _validateObjectId["default"])(nextFile._id)) nextFile._id = (0, _generateObjectId["default"])();
119
+
140
120
  /**
141
121
  * Step 1.3: Replace page ids and field ids if they are not valid
142
122
  */
143
-
144
123
  nextFile.pages = getCleanedJoyDocPages(nextFile.pages);
145
124
  nextFile.pageOrder = cleanPageOrder(getPageOrder(nextFile.pageOrder, nextFile.pages), nextFile.pages);
125
+
146
126
  /**
147
127
  * Step 1.4: Replace view page ids and field ids if they are not valid
148
128
  */
149
-
150
129
  if ((nextFile === null || nextFile === void 0 ? void 0 : (_nextFile$views = nextFile.views) === null || _nextFile$views === void 0 ? void 0 : _nextFile$views.length) > 0) {
151
130
  nextFile.views = nextFile.views.map(function (view) {
152
131
  var nextView = _objectSpread({}, view);
153
-
154
132
  nextView.pages = getCleanedJoyDocPages(nextView.pages);
155
133
  nextView.pageOrder = cleanPageOrder(getPageOrder(nextView.pageOrder, nextView.pages), nextView.pages);
156
134
  return nextView;
157
135
  });
158
136
  }
159
-
160
137
  return nextFile;
161
138
  });
162
139
  } else {
163
140
  nextDoc.files = [getDefaultJoyDocFile()];
164
141
  }
142
+
165
143
  /**
166
144
  * Logic below is used to clean the table field rowOrder by removing the
167
145
  * deletedRowIds / duplicateRowIds from the rowOrder.
168
146
  **/
169
-
170
-
171
147
  if (nextDoc.fields && nextDoc.fields.length > 0) {
172
148
  nextDoc.fields = nextDoc.fields.map(function (field) {
173
149
  var nextField = _objectSpread({}, field);
174
-
175
150
  if (field.type === _FieldTypes["default"].table) {
176
151
  var cleanedRoworder = (0, _tableHelper.getCleanedRowOrder)(field.rowOrder, field.value);
177
152
  nextField.rowOrder = cleanedRoworder;
178
153
  }
179
-
180
154
  return nextField;
181
155
  });
182
156
  }
183
-
184
157
  return nextDoc;
185
158
  };
159
+
160
+ /**
161
+ * Remove orphaned fields from doc
162
+ */
163
+
164
+ // export const removeOrphanedFieldsFromJoydoc = (doc) => {
165
+
166
+ // const nextDoc = { ...doc };
167
+
168
+ // /**
169
+ // * Logic below removes orphaned fields (ie fields without fieldPositions)
170
+ // */
171
+
172
+ // nextDoc.fields = nextDoc.fields.filter((field) => {
173
+
174
+ // let isOrphanedField = true;
175
+
176
+ // nextDoc.files.forEach((file) => {
177
+
178
+ // const primaryViewPages = file.pages;
179
+
180
+ // // Check if field is associated with any field positions in primary view pages
181
+ // const isFieldAssociatedWithPrimaryView = primaryViewPages.some((page) => {
182
+ // return page.fieldPositions.some((fieldPosition) => fieldPosition.field === field._id);
183
+ // });
184
+
185
+ // // Check if field is associated with other views
186
+ // let isFieldAssociatedWithAnotherView;
187
+
188
+ // if (file.views && file.views.length > 0) {
189
+
190
+ // isFieldAssociatedWithAnotherView = file.views.some((view) => {
191
+ // return view.pages.some((page) => {
192
+ // return page.fieldPositions.some((fieldPosition) => fieldPosition.field === field._id);
193
+ // });
194
+ // });
195
+
196
+ // }
197
+
198
+ // if (isFieldAssociatedWithPrimaryView || isFieldAssociatedWithAnotherView) {
199
+ // isOrphanedField = false;
200
+ // }
201
+
202
+ // });
203
+
204
+ // if (!isOrphanedField) return field;
205
+
206
+ // return null;
207
+
208
+ // });
209
+
210
+ // return nextDoc;
211
+
212
+ // };
213
+
214
+ var removeOrphanedFieldsFromJoydoc = exports.removeOrphanedFieldsFromJoydoc = function removeOrphanedFieldsFromJoydoc(doc) {
215
+ var _nextDoc$files;
216
+ var nextDoc = _objectSpread({}, doc);
217
+ var associatedFieldIdLookup = {};
218
+ nextDoc === null || nextDoc === void 0 ? void 0 : (_nextDoc$files = nextDoc.files) === null || _nextDoc$files === void 0 ? void 0 : _nextDoc$files.forEach(function (file) {
219
+ var _file$views;
220
+ /**
221
+ * Primary view
222
+ */
223
+ file.pages.forEach(function (page) {
224
+ page.fieldPositions.forEach(function (fieldPosition) {
225
+ return associatedFieldIdLookup[fieldPosition.field] = true;
226
+ });
227
+ });
228
+
229
+ /**
230
+ * Alternative view
231
+ */
232
+ (_file$views = file.views) === null || _file$views === void 0 ? void 0 : _file$views.forEach(function (view) {
233
+ var _view$pages;
234
+ view === null || view === void 0 ? void 0 : (_view$pages = view.pages) === null || _view$pages === void 0 ? void 0 : _view$pages.forEach(function (page) {
235
+ page === null || page === void 0 ? void 0 : page.fieldPositions.forEach(function (fieldPosition) {
236
+ return associatedFieldIdLookup[fieldPosition.field] = true;
237
+ });
238
+ });
239
+ });
240
+ });
241
+
242
+ /**
243
+ * Logic below removes orphaned fields (ie fields without fieldPositions)
244
+ */
245
+ var validFields = [];
246
+ var deletedFields = [];
247
+ nextDoc.fields.forEach(function (field) {
248
+ if (associatedFieldIdLookup[field._id]) validFields.push(field);else deletedFields.push(field);
249
+ });
250
+ nextDoc.fields = validFields;
251
+ nextDoc.deletedFields = deletedFields;
252
+ return {
253
+ doc: nextDoc
254
+ };
255
+ };
256
+
186
257
  /**
187
258
  * Get Cleaned JoyDoc Pages
188
259
  *
@@ -195,27 +266,20 @@ var getCleanedJoyDoc = function getCleanedJoyDoc(doc) {
195
266
  * @param {Object} doc
196
267
  * @returns {Object}
197
268
  */
198
-
199
-
200
- exports.getCleanedJoyDoc = getCleanedJoyDoc;
201
-
202
- var getCleanedJoyDocPages = function getCleanedJoyDocPages(pages) {
269
+ var getCleanedJoyDocPages = exports.getCleanedJoyDocPages = function getCleanedJoyDocPages(pages) {
203
270
  if ((pages === null || pages === void 0 ? void 0 : pages.length) > 0) {
204
271
  return pages.map(function (page) {
205
272
  /**
206
273
  * Step 1: Replace pages[x]._id if it is not valid
207
274
  */
208
275
  var nextPage = _objectSpread({}, page);
209
-
210
276
  if (nextPage._id && !(0, _validateObjectId["default"])(nextPage._id)) nextPage._id = (0, _generateObjectId["default"])();
211
-
212
277
  if (nextPage.fieldPositions && nextPage.fieldPositions.length > 0) {
213
278
  nextPage.fieldPositions = nextPage.fieldPositions.map(function (fieldPosition) {
214
279
  /**
215
280
  * Step 1.2: Replace fieldPosition _id and field reference if they are not valid
216
281
  */
217
282
  var nextFieldPosition = _objectSpread({}, fieldPosition);
218
-
219
283
  if (nextFieldPosition._id && !(0, _validateObjectId["default"])(nextFieldPosition._id)) nextFieldPosition._id = (0, _generateObjectId["default"])();
220
284
  if (nextFieldPosition.field && !(0, _validateObjectId["default"])(nextFieldPosition.field)) nextFieldPosition.field = (0, _generateObjectId["default"])();
221
285
  return nextFieldPosition;
@@ -223,13 +287,13 @@ var getCleanedJoyDocPages = function getCleanedJoyDocPages(pages) {
223
287
  } else {
224
288
  nextPage.fieldPositions = [];
225
289
  }
226
-
227
290
  return nextPage;
228
291
  });
229
292
  } else {
230
293
  return [getDefaultJoyDocPage()];
231
294
  }
232
295
  };
296
+
233
297
  /**
234
298
  * Get page order
235
299
  *
@@ -237,15 +301,12 @@ var getCleanedJoyDocPages = function getCleanedJoyDocPages(pages) {
237
301
  * @param {Array} pageOrder
238
302
  * @return {Array}
239
303
  */
240
-
241
-
242
- exports.getCleanedJoyDocPages = getCleanedJoyDocPages;
243
-
244
- var getPageOrder = function getPageOrder(pageOrder, pages) {
304
+ var getPageOrder = exports.getPageOrder = function getPageOrder(pageOrder, pages) {
245
305
  return pageOrder || pages.map(function (page) {
246
306
  return page._id;
247
307
  });
248
308
  };
309
+
249
310
  /**
250
311
  *
251
312
  * Clean pageOrder
@@ -258,11 +319,7 @@ var getPageOrder = function getPageOrder(pageOrder, pages) {
258
319
  * @param {Array} pages //[object, object, ...]
259
320
  * @returns {Array}
260
321
  */
261
-
262
-
263
- exports.getPageOrder = getPageOrder;
264
-
265
- var cleanPageOrder = function cleanPageOrder(pageOrder, pages) {
322
+ var cleanPageOrder = exports.cleanPageOrder = function cleanPageOrder(pageOrder, pages) {
266
323
  var pageLookup = {};
267
324
  pages.forEach(function (page) {
268
325
  return pageLookup[page._id] = page && !page.deleted;
@@ -271,14 +328,11 @@ var cleanPageOrder = function cleanPageOrder(pageOrder, pages) {
271
328
  return pageLookup[pageId] && pageId && pageOrder.indexOf(pageId) === index;
272
329
  });
273
330
  };
331
+
274
332
  /**
275
333
  * Sort pages based on pageOrder
276
334
  */
277
-
278
-
279
- exports.cleanPageOrder = cleanPageOrder;
280
-
281
- var sortPages = function sortPages(pages, pageOrder) {
335
+ var sortPages = exports.sortPages = function sortPages(pages, pageOrder) {
282
336
  if (!pageOrder) return pages;
283
337
  var pageLookup = {};
284
338
  pages.forEach(function (page) {
@@ -290,20 +344,15 @@ var sortPages = function sortPages(pages, pageOrder) {
290
344
  });
291
345
  return sortedPages;
292
346
  };
347
+
293
348
  /**
294
349
  * Get a properly formatted Document JoyDoc
295
350
  *
296
351
  * @returns {Object}
297
352
  */
298
-
299
-
300
- exports.sortPages = sortPages;
301
-
302
- var getDefaultDocument = function getDefaultDocument() {
353
+ var getDefaultDocument = exports.getDefaultDocument = function getDefaultDocument() {
303
354
  var type = _DocumentTypes["default"].document;
304
-
305
355
  var _id = (0, _generateObjectId["default"])();
306
-
307
356
  var identifier = "doc_".concat(_id);
308
357
  var name = 'New Doc';
309
358
  return getDefaultJoyDoc({
@@ -313,20 +362,15 @@ var getDefaultDocument = function getDefaultDocument() {
313
362
  name: name
314
363
  });
315
364
  };
365
+
316
366
  /**
317
367
  * Get a properly formatted Template JoyDoc
318
368
  *
319
369
  * @returns {Object}
320
370
  */
321
-
322
-
323
- exports.getDefaultDocument = getDefaultDocument;
324
-
325
- var getDefaultTemplate = function getDefaultTemplate() {
371
+ var getDefaultTemplate = exports.getDefaultTemplate = function getDefaultTemplate() {
326
372
  var type = _DocumentTypes["default"].template;
327
-
328
373
  var _id = (0, _generateObjectId["default"])();
329
-
330
374
  var identifier = "template_".concat(_id);
331
375
  var name = 'New Template';
332
376
  return getDefaultJoyDoc({
@@ -336,21 +380,16 @@ var getDefaultTemplate = function getDefaultTemplate() {
336
380
  name: name
337
381
  });
338
382
  };
383
+
339
384
  /**
340
385
  * Get a properly formatted duplicate of a Template or Document
341
386
  *
342
387
  * @returns {Object}
343
388
  */
344
-
345
-
346
- exports.getDefaultTemplate = getDefaultTemplate;
347
-
348
- var duplicate = function duplicate(original, defaults) {
389
+ var duplicate = exports.duplicate = function duplicate(original, defaults) {
349
390
  //Remove all references to original template object
350
391
  var origin = JSON.parse(JSON.stringify(original));
351
-
352
392
  var _id = (0, _generateObjectId["default"])();
353
-
354
393
  var identifier = origin.type === _DocumentTypes["default"].template ? "template_".concat(_id) : "doc_".concat(_id);
355
394
  return _objectSpread(_objectSpread({}, origin), {}, {
356
395
  _id: _id,
@@ -359,21 +398,18 @@ var duplicate = function duplicate(original, defaults) {
359
398
  source: origin.identifier
360
399
  }, defaults);
361
400
  };
401
+
362
402
  /**
363
403
  * Get a properly formatted Document JoyDoc from Template JoyDoc
364
404
  *
365
405
  * @param {Object} template
366
406
  * @returns {Object}
367
407
  */
368
-
369
-
370
- exports.duplicate = duplicate;
371
-
372
- var getDocumentFromTemplate = function getDocumentFromTemplate(template) {
408
+ var getDocumentFromTemplate = exports.getDocumentFromTemplate = function getDocumentFromTemplate(template) {
373
409
  var _id = (0, _generateObjectId["default"])();
410
+ var identifier = "doc_".concat(_id);
374
411
 
375
- var identifier = "doc_".concat(_id); //Remove all references to original template object
376
-
412
+ //Remove all references to original template object
377
413
  var temp = JSON.parse(JSON.stringify(template));
378
414
  return {
379
415
  _id: _id,
@@ -386,6 +422,7 @@ var getDocumentFromTemplate = function getDocumentFromTemplate(template) {
386
422
  fields: temp.fields
387
423
  };
388
424
  };
425
+
389
426
  /**
390
427
  * Handle Page Duplication for JoyDoc
391
428
  *
@@ -395,13 +432,8 @@ var getDocumentFromTemplate = function getDocumentFromTemplate(template) {
395
432
  * @param {Object} pageDefaults
396
433
  * @returns {Object}
397
434
  */
398
-
399
-
400
- exports.getDocumentFromTemplate = getDocumentFromTemplate;
401
-
402
- var duplicateDocumentPage = function duplicateDocumentPage(doc, fileId, pageId) {
435
+ var duplicateDocumentPage = exports.duplicateDocumentPage = function duplicateDocumentPage(doc, fileId, pageId) {
403
436
  var _nextDoc$fields;
404
-
405
437
  var pageDefaults = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
406
438
  var changelogInfo = {
407
439
  primaryPages: {
@@ -420,25 +452,26 @@ var duplicateDocumentPage = function duplicateDocumentPage(doc, fileId, pageId)
420
452
  (_nextDoc$fields = nextDoc.fields) === null || _nextDoc$fields === void 0 ? void 0 : _nextDoc$fields.forEach(function (field) {
421
453
  if (field.file === fileId) fieldLookup[field._id] = field;
422
454
  });
455
+
423
456
  /**
424
457
  * Step 1: Duplicate fields associated with target page
425
458
  */
459
+ var fieldIdsToDuplicate = [];
426
460
 
427
- var fieldIdsToDuplicate = []; //Step 1.1 Get all field Ids from primary page
428
-
461
+ //Step 1.1 Get all field Ids from primary page
429
462
  var targetPageIndex = nextDoc.files[fileIndex].pages.findIndex(function (page) {
430
463
  return page._id === pageId;
431
464
  });
432
465
  if (targetPageIndex !== -1) nextDoc.files[fileIndex].pages[targetPageIndex].fieldPositions.forEach(function (fieldPosition) {
433
466
  return fieldIdsToDuplicate.push(fieldPosition.field);
434
- }); //Step 1.2 Get all field Ids from view page
467
+ });
435
468
 
469
+ //Step 1.2 Get all field Ids from view page
436
470
  if (nextDoc.files[fileIndex].views && nextDoc.files[fileIndex].views.length > 0) {
437
471
  nextDoc.files[fileIndex].views.forEach(function (view) {
438
472
  var viewPageIndex = view.pages.findIndex(function (page) {
439
473
  return page._id === pageId;
440
474
  });
441
-
442
475
  if (viewPageIndex !== -1) {
443
476
  view.pages[viewPageIndex].fieldPositions.forEach(function (fieldPosition) {
444
477
  if (fieldIdsToDuplicate.indexOf(fieldPosition.field) === -1) fieldIdsToDuplicate.push(fieldPosition.field);
@@ -446,7 +479,6 @@ var duplicateDocumentPage = function duplicateDocumentPage(doc, fileId, pageId)
446
479
  }
447
480
  });
448
481
  }
449
-
450
482
  var newFieldsLookupByOldId = {};
451
483
  var duplicatedFields = [];
452
484
  fieldIdsToDuplicate.forEach(function (fieldId) {
@@ -460,18 +492,17 @@ var duplicateDocumentPage = function duplicateDocumentPage(doc, fileId, pageId)
460
492
  */
461
493
  if (newFieldsLookupByOldId[fieldId]) return;
462
494
  var field = fieldLookup[fieldId];
463
-
464
495
  var duplicateField = _objectSpread(_objectSpread({}, field), {}, {
465
496
  _id: (0, _generateObjectId["default"])()
466
497
  });
467
-
468
498
  duplicatedFields.push(duplicateField);
499
+
469
500
  /**
470
501
  * Add to lookup so it can be used with other associated field positions
471
502
  */
472
-
473
503
  newFieldsLookupByOldId[field._id] = duplicateField;
474
504
  });
505
+
475
506
  /**
476
507
  * Step 2: Update newly duplicated fields logic properties
477
508
  *
@@ -481,14 +512,11 @@ var duplicateDocumentPage = function duplicateDocumentPage(doc, fileId, pageId)
481
512
  * that we are duplicating. We do this by checking the logic.condition[x].page
482
513
  * property of the condition.
483
514
  */
484
-
485
515
  duplicatedFields = duplicatedFields.map(function (duplicatedField) {
486
516
  if (!duplicatedField.logic || !duplicatedField.logic.conditions || duplicatedField.logic.conditions.length < 1) return duplicatedField;
487
-
488
517
  var nextField = _objectSpread(_objectSpread({}, duplicatedField), {}, {
489
518
  logic: _objectSpread({}, duplicatedField.logic)
490
519
  });
491
-
492
520
  nextField.logic.conditions = nextField.logic.conditions.map(function (condition) {
493
521
  /**
494
522
  * 1. Only update conditions associated with the current page being duplicated.
@@ -505,20 +533,20 @@ var duplicateDocumentPage = function duplicateDocumentPage(doc, fileId, pageId)
505
533
  });
506
534
  return nextField;
507
535
  });
536
+
508
537
  /**
509
538
  * Step 3: Add newly duplicated fields changelogs and update doucment
510
539
  */
511
-
512
540
  duplicatedFields.forEach(function (duplicateField) {
513
541
  changelogInfo.fields.push(duplicateField);
514
542
  nextDoc.fields.push(duplicateField);
515
543
  });
544
+
516
545
  /**
517
546
  * Step 4: Update Primary View Page Order
518
547
  *
519
548
  * IMPORTANT NOTE: Page order update must go before page object creation.
520
549
  */
521
-
522
550
  var pageOrder = getPageOrder(nextDoc.files[fileIndex].pageOrder, nextDoc.files[fileIndex].pages);
523
551
  var primaryPageOrderIndex = pageOrder.findIndex(function (id) {
524
552
  return id === pageId;
@@ -526,10 +554,10 @@ var duplicateDocumentPage = function duplicateDocumentPage(doc, fileId, pageId)
526
554
  var primaryPageOrderTargetIndex = primaryPageOrderIndex + 1;
527
555
  nextDoc.files[fileIndex].pageOrder = pageOrder;
528
556
  nextDoc.files[fileIndex].pageOrder.splice(primaryPageOrderTargetIndex, 0, newPageId);
557
+
529
558
  /**
530
559
  * Step 5: Generate Primary View Page
531
560
  */
532
-
533
561
  var primaryPageIndex = nextDoc.files[fileIndex].pages.findIndex(function (page) {
534
562
  return page._id === pageId;
535
563
  });
@@ -544,30 +572,29 @@ var duplicateDocumentPage = function duplicateDocumentPage(doc, fileId, pageId)
544
572
  }));
545
573
  });
546
574
  nextDoc.files[fileIndex].pages.splice(primaryPageIndex + 1, 0, newPrimaryPage);
575
+
547
576
  /**
548
577
  * Step 6: Update Primary Page Changelog
549
578
  */
550
-
551
579
  changelogInfo.primaryPages.targetIndex = primaryPageOrderTargetIndex;
552
580
  changelogInfo.primaryPages.page = newPrimaryPage;
581
+
553
582
  /**
554
583
  * Step 7: Update Views
555
584
  */
556
-
557
585
  if (nextDoc.files[fileIndex].views && nextDoc.files[fileIndex].views.length > 0) {
558
586
  nextDoc.files[fileIndex].views = nextDoc.files[fileIndex].views.map(function (view) {
559
587
  var nextView = _objectSpread({}, view);
560
-
561
588
  var viewPageIndex = nextView.pages.findIndex(function (page) {
562
589
  return page._id === pageId;
563
590
  });
564
591
  if (viewPageIndex === -1) return view;
592
+
565
593
  /**
566
594
  * Step 7.1 Update View Page Order.
567
595
  *
568
596
  * IMPORTANT NOTE: Page order update must go before page object creation.
569
597
  */
570
-
571
598
  var nextViewPageOrder = getPageOrder(nextView.pageOrder, nextView.pages);
572
599
  var nextViewPageOrderIndex = nextViewPageOrder.findIndex(function (id) {
573
600
  return id === pageId;
@@ -575,15 +602,14 @@ var duplicateDocumentPage = function duplicateDocumentPage(doc, fileId, pageId)
575
602
  var nextViewTargetPageOrderIndex = nextViewPageOrderIndex + 1;
576
603
  nextView.pageOrder = nextViewPageOrder;
577
604
  nextView.pageOrder.splice(nextViewTargetPageOrderIndex, 0, newPageId);
605
+
578
606
  /**
579
607
  * Step 7.2 Update View Pages
580
608
  */
581
-
582
609
  var newViewPage = _objectSpread(_objectSpread({}, nextView.pages[viewPageIndex]), {}, {
583
610
  _id: newPageId,
584
611
  fieldPositions: []
585
612
  }, pageDefaults);
586
-
587
613
  nextView.pages[viewPageIndex].fieldPositions.forEach(function (fieldPosition) {
588
614
  var newField = newFieldsLookupByOldId[fieldPosition.field];
589
615
  newViewPage.fieldPositions.push(_objectSpread(_objectSpread({}, fieldPosition), {}, {
@@ -591,10 +617,10 @@ var duplicateDocumentPage = function duplicateDocumentPage(doc, fileId, pageId)
591
617
  }));
592
618
  });
593
619
  nextView.pages.splice(viewPageIndex + 1, 0, newViewPage);
620
+
594
621
  /**
595
622
  * Step 7.3 Add View Page Changelog Info
596
623
  */
597
-
598
624
  changelogInfo.viewPages.push({
599
625
  viewId: view._id,
600
626
  view: view.type,
@@ -604,15 +630,339 @@ var duplicateDocumentPage = function duplicateDocumentPage(doc, fileId, pageId)
604
630
  return nextView;
605
631
  });
606
632
  }
607
-
608
633
  return {
609
634
  changelogInfo: changelogInfo,
610
635
  doc: nextDoc
611
636
  };
612
637
  };
613
638
 
614
- exports.duplicateDocumentPage = duplicateDocumentPage;
615
- var _default = {
639
+ /**
640
+ * Generate the mobile view and add specific mobile view properties
641
+ *
642
+ * @param {Object} file //Full file object
643
+ * @returns {Object}
644
+ */
645
+ var getMobileViewFromFile = exports.getMobileViewFromFile = function getMobileViewFromFile(file) {
646
+ var _file$views2;
647
+ var mobileViewIndex = file !== null && file !== void 0 && file.views && (file === null || file === void 0 ? void 0 : (_file$views2 = file.views) === null || _file$views2 === void 0 ? void 0 : _file$views2.length) > 0 ? file.views.findIndex(function (view) {
648
+ return view.type === _FileViews["default"].mobile;
649
+ }) : -1;
650
+ if (mobileViewIndex !== -1) {
651
+ /**
652
+ * Why do we do this? Early versions of alternative views did not contain pageOrder so
653
+ * we ensure it's populated here.
654
+ */
655
+ var mobileView = file.views[mobileViewIndex];
656
+ var mobileViewPageOrder = cleanPageOrder(getPageOrder(mobileView.pageOrder, mobileView.pages), mobileView.pages);
657
+ return _objectSpread(_objectSpread({}, mobileView), {}, {
658
+ pageOrder: mobileViewPageOrder
659
+ });
660
+ } else {
661
+ return generateMobileViewFromFile(file);
662
+ }
663
+ };
664
+
665
+ /**
666
+ * Generates the alternative mobile view from the default file view.
667
+ *
668
+ * @param {Object} file //Full file object
669
+ * @returns {Object}
670
+ */
671
+ var generateMobileViewFromFile = exports.generateMobileViewFromFile = function generateMobileViewFromFile(file) {
672
+ var pages = file.pages || [];
673
+ var pageOrder = cleanPageOrder(getPageOrder(file.pageOrder, file.pages), file.pages);
674
+ return {
675
+ _id: (0, _generateObjectId["default"])(),
676
+ type: _FileViews["default"].mobile,
677
+ pages: (0, _toConsumableArray2["default"])(pages).map(function (page) {
678
+ var _id = page._id,
679
+ name = page.name,
680
+ identifier = page.identifier,
681
+ fieldPositions = page.fieldPositions,
682
+ rowHeight = page.rowHeight;
683
+ return generateMobilePage({
684
+ _id: _id,
685
+ identifier: identifier,
686
+ name: name,
687
+ fieldPositions: fieldPositions,
688
+ rowHeight: rowHeight
689
+ });
690
+ }),
691
+ pageOrder: (0, _toConsumableArray2["default"])(pageOrder)
692
+ };
693
+ };
694
+
695
+ /**
696
+ * Apply the pr
697
+ *
698
+ * @param {Object} page
699
+ * @returns {Objectg}
700
+ */
701
+ var generateMobilePage = exports.generateMobilePage = function generateMobilePage(page) {
702
+ return _objectSpread(_objectSpread({}, page), {}, {
703
+ fieldPositions: page.fieldPositions ? generateMobilePageFieldPositions(page.fieldPositions, page.rowHeight) : [],
704
+ type: _PageTypes["default"].mobile,
705
+ rowHeight: 1,
706
+ cols: 1,
707
+ padding: 12,
708
+ width: 816,
709
+ height: 1056,
710
+ layout: _PageLayoutModes["default"].grid,
711
+ presentation: _FieldPresentationModes["default"].normal
712
+ });
713
+ };
714
+ var generateMobilePageFieldPositions = exports.generateMobilePageFieldPositions = function generateMobilePageFieldPositions(fieldPositions, originalRowHeight) {
715
+ var mobileFieldPositions = [];
716
+
717
+ /**
718
+ * Step 1: Sort fieldPositions
719
+ */
720
+ var sortedFieldPositions = sortFieldPositionsByXAndYCoordinates(fieldPositions);
721
+ sortedFieldPositions.forEach(function (joySpecFieldPosition) {
722
+ var mobileFieldPositionData = _objectSpread(_objectSpread({}, joySpecFieldPosition), {}, {
723
+ titleDisplay: _FormStyleOptions["default"].displayInline,
724
+ displayType: _FieldDisplayTypes["default"].original,
725
+ height: joySpecFieldPosition.height * (originalRowHeight || 1),
726
+ width: 1,
727
+ x: 0
728
+ });
729
+
730
+ /**
731
+ * Step 1.2 Hide chart lines on mobile
732
+ */
733
+ if (joySpecFieldPosition.type === _FieldTypes["default"].chart) mobileFieldPositionData.primaryDisplayOnly = true;
734
+ mobileFieldPositions.push(mobileFieldPositionData);
735
+ });
736
+ return mergeAssoicatedFieldPositionsForMobilePage(mobileFieldPositions);
737
+ };
738
+
739
+ /**
740
+ * Merge Field Positions assoicated with the same Field.
741
+ *
742
+ * Why do duplicate fields get created from fieldPositions
743
+ *
744
+ * The same field can get added twice because we may have multiple fieldPositions belonging
745
+ * to the same field. This can happen with dropdown, multiSelect, and table fields.
746
+ *
747
+ * Since the fields get generated by looping over the fieldPositions and not regular fields
748
+ * we may encounter the the same field multiple times because it has multiple fieldPositions.
749
+ *
750
+ * @param {Array} fields
751
+ * @returns {Array}
752
+ */
753
+ var mergeAssoicatedFieldPositionsForMobilePage = exports.mergeAssoicatedFieldPositionsForMobilePage = function mergeAssoicatedFieldPositionsForMobilePage(fieldPositions) {
754
+ var filteredFieldPositions = [];
755
+ fieldPositions === null || fieldPositions === void 0 ? void 0 : fieldPositions.forEach(function (fieldPosition) {
756
+ var fieldPositionIndex = filteredFieldPositions.findIndex(function (filtered) {
757
+ var _filtered$field, _fieldPosition$field;
758
+ return (filtered === null || filtered === void 0 ? void 0 : (_filtered$field = filtered.field) === null || _filtered$field === void 0 ? void 0 : _filtered$field.toString()) === (fieldPosition === null || fieldPosition === void 0 ? void 0 : (_fieldPosition$field = fieldPosition.field) === null || _fieldPosition$field === void 0 ? void 0 : _fieldPosition$field.toString());
759
+ });
760
+
761
+ //Only add field to the list if it hasn't already been added
762
+ if (fieldPositionIndex === -1) filteredFieldPositions.push(fieldPosition);
763
+ });
764
+ return filteredFieldPositions;
765
+ };
766
+
767
+ /**
768
+ * Sort fields by their y and x coordinates
769
+ *
770
+ * For example:
771
+ * [
772
+ * { "y": 3, "x": 4 },
773
+ * { "y": 3, "x": 1 },
774
+ * { "y": 2, "x": 0 },
775
+ * { "y": 1, "x": 5.22 },
776
+ * { "y": 1, "x": 10 },
777
+ * { "y": 1, "x": 0 },
778
+ * ]
779
+ * will become the following after sort
780
+ * [
781
+ * { "y": 1, "x": 0 },
782
+ * { "y": 1, "x": 5.22 },
783
+ * { "y": 1, "x": 10 },
784
+ * { "y": 2, "x": 0 },
785
+ * { "y": 3, "x": 1 },
786
+ * { "y": 3, "x": 4 }
787
+ * ];
788
+ *
789
+ * @param {Array} fieldPositions
790
+ * @returns {Array}
791
+ */
792
+ var sortFieldPositionsByXAndYCoordinates = exports.sortFieldPositionsByXAndYCoordinates = function sortFieldPositionsByXAndYCoordinates(fieldPositions) {
793
+ var sortedFieldPositions = (0, _toConsumableArray2["default"])(fieldPositions);
794
+ sortedFieldPositions.sort(function (a, b) {
795
+ if (a.y === b.y) {
796
+ return a.x - b.x;
797
+ } else if (a.y > b.y) {
798
+ return 1;
799
+ } else if (a.y < b.y) {
800
+ return -1;
801
+ } else {
802
+ return 0;
803
+ }
804
+ });
805
+ return sortedFieldPositions;
806
+ };
807
+
808
+ /**
809
+ * Formats individual table cell field positions that have already been merged with their associated field.
810
+ * This additional information is added and used for rendering the fieldPositions on the form.
811
+ *
812
+ * For instance, adds properties like columnType, calculatedCellValue, options, etc.
813
+ *
814
+ * @param {Array} fieldPositions
815
+ * @returns {Array}
816
+ */
817
+ var formatTableFieldPositions = exports.formatTableFieldPositions = function formatTableFieldPositions(fieldPositions) {
818
+ /**
819
+ * We only want to generate the table value calculated lookup for each table field once.
820
+ * We use these lookups because multiple table fieldPositions belonging to the same table
821
+ * field will all use the same table value calculated lookup.
822
+ */
823
+ var tableFieldLookup = {};
824
+ var nextFieldPositions = [];
825
+ (0, _toConsumableArray2["default"])(fieldPositions).forEach(function (fieldPosition) {
826
+ var nextFieldPosition = _objectSpread({}, fieldPosition);
827
+ if (fieldPosition.type === _FieldTypes["default"].table) {
828
+ var field = fieldPosition.field,
829
+ column = fieldPosition.column,
830
+ rowIndex = fieldPosition.rowIndex,
831
+ tableColumns = fieldPosition.tableColumns,
832
+ value = fieldPosition.value,
833
+ rowOrder = fieldPosition.rowOrder,
834
+ tableColumnOrder = fieldPosition.tableColumnOrder;
835
+
836
+ /**
837
+ * Step 1: Generate rows, rowOrder, tableColumns, etc. lookups for associated field. We only have to
838
+ * do this once per-field. This increases performance if there are multiple form positions associated
839
+ * with the same form.
840
+ */
841
+ if (!tableFieldLookup[field]) {
842
+ /**
843
+ * Step 1.1 Handle rows
844
+ */
845
+ var nextRows = (0, _tableHelper.getRows)(value);
846
+ var nextRowOrder = (0, _tableHelper.getCleanedRowOrder)(rowOrder, nextRows);
847
+ var nextSortedRows = (0, _tableHelper.sortRows)(nextRows, nextRowOrder);
848
+
849
+ /**
850
+ * Step 1.2 Handle columns
851
+ */
852
+ var nextTableColumnOrder = (0, _tableHelper.getCleanedColumnOrder)(tableColumnOrder, tableColumns);
853
+ var nextSortedTableColumns = (0, _tableHelper.sortColumns)(tableColumns, nextTableColumnOrder);
854
+ var nextTableColumns = (0, _tableHelper.getColumns)(nextSortedTableColumns);
855
+ var nextTableColumnLookup = {};
856
+ nextTableColumns.forEach(function (column) {
857
+ return nextTableColumnLookup[column._id] = column;
858
+ });
859
+
860
+ /**
861
+ * Step 1.3 Handle cell calculations
862
+ */
863
+ var calculatedValue = (0, _tableHelper.generateTableLookup)(nextSortedRows, nextSortedTableColumns);
864
+ tableFieldLookup[field] = {
865
+ value: nextSortedRows,
866
+ rowOrder: nextRowOrder,
867
+ tableColumns: nextTableColumns,
868
+ tableColumnOrder: nextTableColumnOrder,
869
+ tableColumnLookup: nextTableColumnLookup,
870
+ calculatedValue: calculatedValue
871
+ };
872
+ }
873
+
874
+ /**
875
+ * Ensure each table field has a properly formatted properties
876
+ */
877
+ nextFieldPosition.value = tableFieldLookup[field].value;
878
+ nextFieldPosition.rowOrder = tableFieldLookup[field].rowOrder;
879
+ nextFieldPosition.tableColumns = tableFieldLookup[field].tableColumns;
880
+ nextFieldPosition.tableColumnOrder = tableFieldLookup[field].tableColumnOrder;
881
+
882
+ /**
883
+ * Add calculated value lookup. For instance, { A1: '', B1: '', C1: '', ... }
884
+ */
885
+ nextFieldPosition.calculatedValue = tableFieldLookup[field].calculatedValue;
886
+
887
+ /**
888
+ * Individual Table Cell vs Entire Table
889
+ *
890
+ * Only add cellValue, calculatedCellValue, columnType, and column options to
891
+ * individually mapped table cell fieldPositions. Regular table fields (entire table)
892
+ * just simply use the fieldPositions.value parameter so we don't need the calculated
893
+ * values, etc.
894
+ *
895
+ * We determine an individual table cell fieldPosition vs an entire table
896
+ * fieldPosition by checking for column and rowIndex. Individual cells have
897
+ * column and rowIndex but regular tables do not.
898
+ *
899
+ * Note:
900
+ * rowIndex + 1 is used while calculating cell value since column operands
901
+ * start from 1 instead of zero in the table lookups
902
+ * (ie: [A1:{}, B1:{}] instead of [A0:{}, B0:{}])
903
+ *
904
+ * If tableRowIndex associated with a cell doesn't have a table row associated
905
+ * with it (ie rows[rowIndex] is undefined) it means that particular row is deleted
906
+ */
907
+ if (tableFieldLookup[field] && column && typeof rowIndex === 'number') {
908
+ var _tableFieldLookup$fie;
909
+ /**
910
+ * What is the difference between rowIndex and targetRowIndex?
911
+ *
912
+ * - The rowIndex on the fieldPosition is the saved index of where the rowId lives inside of the rowOrder.
913
+ * - The targetRowIndex is the actual index of the row object inside the value (array of row data) of the field.
914
+ *
915
+ * We use the fieldPosition.rowIndex to get the rowId from the rowOrder. Then we use the rowId to locate
916
+ * the assoicated row object data in the value property. The rowOrder and value (rows) do not follow the same
917
+ * order. The rowOrder is updated when users insert rows, move rows up or down, etc. it manages where rows
918
+ * are at in the list and how they should be rendered. This is why the rowIndex uses the rowOrder.
919
+ */
920
+ var targetColumn = tableFieldLookup[field].tableColumnLookup[column];
921
+ var targetRowId = tableFieldLookup[field].rowOrder[rowIndex];
922
+ var targetRowIndex = tableFieldLookup[field].value.findIndex(function (row) {
923
+ return (row === null || row === void 0 ? void 0 : row._id) === targetRowId;
924
+ });
925
+
926
+ /**
927
+ * Add proper rowId to the field position so that it can be used
928
+ * inside the element for change handlers;
929
+ */
930
+ nextFieldPosition.rowId = targetRowId;
931
+
932
+ /**
933
+ * If rows[rowIndex] is undefined, it means the row that was present
934
+ * at the particular rowIndex was deleted
935
+ */
936
+ nextFieldPosition.cellValue = ((_tableFieldLookup$fie = tableFieldLookup[field].value[targetRowIndex]) === null || _tableFieldLookup$fie === void 0 ? void 0 : _tableFieldLookup$fie.cells[column]) || '';
937
+
938
+ /**
939
+ * Skip any individual field position that is associated with a deleted column.
940
+ * targetColumn will appear as undefined if a column is deleted
941
+ */
942
+ if (targetColumn) {
943
+ nextFieldPosition.calculatedCellValue = tableFieldLookup[field].calculatedValue["".concat(targetColumn.operand).concat(targetRowIndex + 1)];
944
+ nextFieldPosition.columnType = targetColumn.type;
945
+ nextFieldPosition.options = targetColumn.options;
946
+ nextFieldPosition.columnIdentifier = targetColumn.identifier;
947
+
948
+ /**
949
+ * IMPORTANT NOTE: We only add individual table cell field position into
950
+ * the fieldPosition list if the associated column is not deleted.
951
+ */
952
+ nextFieldPositions.push(nextFieldPosition);
953
+ }
954
+ } else {
955
+ //Push table fields with original display type
956
+ nextFieldPositions.push(nextFieldPosition);
957
+ }
958
+ } else {
959
+ //Push other fields
960
+ nextFieldPositions.push(nextFieldPosition);
961
+ }
962
+ });
963
+ return nextFieldPositions;
964
+ };
965
+ var _default = exports["default"] = {
616
966
  getDefaultJoyDocPage: getDefaultJoyDocPage,
617
967
  getDefaultJoyDocFile: getDefaultJoyDocFile,
618
968
  getDefaultJoyDoc: getDefaultJoyDoc,
@@ -624,6 +974,11 @@ var _default = {
624
974
  duplicate: duplicate,
625
975
  duplicateDocumentPage: duplicateDocumentPage,
626
976
  getPageOrder: getPageOrder,
627
- sortPages: sortPages
628
- };
629
- exports["default"] = _default;
977
+ sortPages: sortPages,
978
+ sortFieldPositionsByXAndYCoordinates: sortFieldPositionsByXAndYCoordinates,
979
+ mergeAssoicatedFieldPositionsForMobilePage: mergeAssoicatedFieldPositionsForMobilePage,
980
+ generateMobileViewFromFile: generateMobileViewFromFile,
981
+ generateMobilePage: generateMobilePage,
982
+ generateMobilePageFieldPositions: generateMobilePageFieldPositions,
983
+ formatTableFieldPositions: formatTableFieldPositions
984
+ };