@formio/js 5.1.0-dev.6040.debc859 → 5.1.0-dev.6042.603237d

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.
Files changed (236) hide show
  1. package/Changelog.md +99 -310
  2. package/README.md +7 -0
  3. package/dist/formio.builder.css +1 -0
  4. package/dist/formio.builder.min.css +1 -1
  5. package/dist/formio.form.css +1 -0
  6. package/dist/formio.form.js +661 -672
  7. package/dist/formio.form.min.css +1 -1
  8. package/dist/formio.form.min.js +1 -1
  9. package/dist/formio.form.min.js.LICENSE.txt +3 -1
  10. package/dist/formio.full.css +1 -0
  11. package/dist/formio.full.js +688 -699
  12. package/dist/formio.full.min.css +1 -1
  13. package/dist/formio.full.min.js +1 -1
  14. package/dist/formio.full.min.js.LICENSE.txt +3 -1
  15. package/dist/formio.js +90 -68
  16. package/dist/formio.min.js +1 -1
  17. package/dist/formio.utils.js +103 -81
  18. package/dist/formio.utils.min.js +1 -1
  19. package/dist/formio.utils.min.js.LICENSE.txt +3 -1
  20. package/lib/cjs/Element.d.ts +2 -1
  21. package/lib/cjs/Element.js +18 -39
  22. package/lib/cjs/EventEmitter.js +2 -25
  23. package/lib/cjs/Form.js +2 -25
  24. package/lib/cjs/PDF.js +1 -1
  25. package/lib/cjs/PDFBuilder.js +4 -5
  26. package/lib/cjs/Webform.d.ts +2 -2
  27. package/lib/cjs/Webform.js +14 -15
  28. package/lib/cjs/WebformBuilder.d.ts +1 -0
  29. package/lib/cjs/WebformBuilder.js +44 -14
  30. package/lib/cjs/Wizard.d.ts +2 -2
  31. package/lib/cjs/Wizard.js +41 -27
  32. package/lib/cjs/WizardBuilder.js +1 -1
  33. package/lib/cjs/components/_classes/component/Component.d.ts +49 -15
  34. package/lib/cjs/components/_classes/component/Component.js +188 -125
  35. package/lib/cjs/components/_classes/component/editForm/Component.edit.conditional.js +1 -1
  36. package/lib/cjs/components/_classes/component/editForm/Component.edit.data.js +19 -0
  37. package/lib/cjs/components/_classes/component/editForm/Component.edit.logic.js +1 -1
  38. package/lib/cjs/components/_classes/component/editForm/utils.js +1 -1
  39. package/lib/cjs/components/_classes/componentModal/ComponentModal.js +1 -1
  40. package/lib/cjs/components/_classes/input/Input.js +1 -1
  41. package/lib/cjs/components/_classes/list/ListComponent.js +3 -3
  42. package/lib/cjs/components/_classes/nested/NestedComponent.d.ts +0 -1
  43. package/lib/cjs/components/_classes/nested/NestedComponent.form.js +13 -0
  44. package/lib/cjs/components/_classes/nested/NestedComponent.js +17 -25
  45. package/lib/cjs/components/_classes/nestedarray/NestedArrayComponent.js +1 -1
  46. package/lib/cjs/components/_classes/nesteddata/NestedDataComponent.d.ts +0 -2
  47. package/lib/cjs/components/_classes/nesteddata/NestedDataComponent.js +1 -12
  48. package/lib/cjs/components/address/Address.d.ts +9 -0
  49. package/lib/cjs/components/address/Address.js +32 -9
  50. package/lib/cjs/components/address/editForm/Address.edit.display.d.ts +4 -0
  51. package/lib/cjs/components/address/editForm/Address.edit.display.js +1 -0
  52. package/lib/cjs/components/address/editForm/Address.edit.provider.js +8 -8
  53. package/lib/cjs/components/alert/Alert.js +1 -1
  54. package/lib/cjs/components/button/Button.d.ts +1 -1
  55. package/lib/cjs/components/button/Button.js +7 -11
  56. package/lib/cjs/components/checkbox/Checkbox.js +1 -1
  57. package/lib/cjs/components/container/Container.js +1 -1
  58. package/lib/cjs/components/content/editForm/Content.edit.display.js +8 -0
  59. package/lib/cjs/components/currency/Currency.js +1 -1
  60. package/lib/cjs/components/currency/editForm/Currency.edit.display.js +12 -0
  61. package/lib/cjs/components/datagrid/DataGrid.js +5 -4
  62. package/lib/cjs/components/datamap/DataMap.js +2 -6
  63. package/lib/cjs/components/datetime/DateTime.d.ts +1 -1
  64. package/lib/cjs/components/datetime/DateTime.js +15 -13
  65. package/lib/cjs/components/datetime/editForm/DateTime.edit.validation.d.ts +66 -15
  66. package/lib/cjs/components/datetime/editForm/DateTime.edit.validation.js +68 -47
  67. package/lib/cjs/components/day/Day.js +2 -2
  68. package/lib/cjs/components/day/editForm/Day.edit.display.js +8 -0
  69. package/lib/cjs/components/editgrid/EditGrid.js +4 -14
  70. package/lib/cjs/components/editgrid/editForm/EditGrid.edit.display.js +1 -1
  71. package/lib/cjs/components/email/editForm/Email.edit.display.js +12 -0
  72. package/lib/cjs/components/fieldset/editForm/Fieldset.edit.display.js +8 -0
  73. package/lib/cjs/components/file/File.js +6 -2
  74. package/lib/cjs/components/file/editForm/File.edit.file.d.ts +13 -0
  75. package/lib/cjs/components/file/editForm/File.edit.file.js +1 -0
  76. package/lib/cjs/components/form/Form.d.ts +0 -1
  77. package/lib/cjs/components/form/Form.js +32 -24
  78. package/lib/cjs/components/form/editForm/Form.edit.form.js +4 -3
  79. package/lib/cjs/components/hidden/editForm/Hidden.edit.display.js +8 -0
  80. package/lib/cjs/components/html/HTML.js +1 -2
  81. package/lib/cjs/components/html/editForm/HTML.edit.display.js +8 -0
  82. package/lib/cjs/components/number/Number.js +1 -1
  83. package/lib/cjs/components/number/editForm/Number.edit.display.js +12 -0
  84. package/lib/cjs/components/panel/Panel.js +1 -1
  85. package/lib/cjs/components/password/editForm/Password.edit.display.js +13 -1
  86. package/lib/cjs/components/phonenumber/PhoneNumber.form.js +9 -1
  87. package/lib/cjs/components/radio/Radio.d.ts +8 -0
  88. package/lib/cjs/components/radio/Radio.js +17 -7
  89. package/lib/cjs/components/recaptcha/editForm/ReCaptcha.edit.display.js +1 -1
  90. package/lib/cjs/components/select/Select.d.ts +1 -0
  91. package/lib/cjs/components/select/Select.js +21 -5
  92. package/lib/cjs/components/select/editForm/Select.edit.data.d.ts +68 -110
  93. package/lib/cjs/components/select/editForm/Select.edit.data.js +3 -38
  94. package/lib/cjs/components/selectboxes/SelectBoxes.d.ts +6 -0
  95. package/lib/cjs/components/selectboxes/SelectBoxes.js +7 -1
  96. package/lib/cjs/components/signature/Signature.js +1 -1
  97. package/lib/cjs/components/survey/Survey.js +2 -2
  98. package/lib/cjs/components/tabs/Tabs.js +1 -0
  99. package/lib/cjs/components/tabs/editForm/Tabs.edit.display.js +8 -0
  100. package/lib/cjs/components/tags/Tags.js +1 -1
  101. package/lib/cjs/components/textarea/TextArea.js +10 -2
  102. package/lib/cjs/components/textarea/editForm/TextArea.edit.display.js +12 -0
  103. package/lib/cjs/components/textfield/TextField.js +9 -32
  104. package/lib/cjs/components/time/Time.js +1 -1
  105. package/lib/cjs/components/unknown/Unknown.form.d.ts +2 -1
  106. package/lib/cjs/components/unknown/Unknown.form.js +13 -9
  107. package/lib/cjs/components/url/editForm/Url.edit.display.js +12 -0
  108. package/lib/cjs/components/well/editForm/Well.edit.display.js +8 -0
  109. package/lib/cjs/formio.form.js +5 -5
  110. package/lib/cjs/providers/storage/uploadAdapter.js +8 -6
  111. package/lib/cjs/translations/en.d.ts +1 -234
  112. package/lib/cjs/translations/en.js +4 -2
  113. package/lib/cjs/utils/Evaluator.d.ts +20 -6
  114. package/lib/cjs/utils/Evaluator.js +38 -15
  115. package/lib/cjs/utils/builder.js +5 -5
  116. package/lib/cjs/utils/conditionOperators/IsEqualTo.js +3 -3
  117. package/lib/cjs/utils/formUtils.d.ts +2 -2
  118. package/lib/cjs/utils/index.d.ts +169 -2
  119. package/lib/cjs/utils/index.js +22 -2
  120. package/lib/cjs/utils/utils.d.ts +31 -45
  121. package/lib/cjs/utils/utils.js +80 -156
  122. package/lib/cjs/widgets/CalendarWidget.d.ts +1 -8
  123. package/lib/cjs/widgets/CalendarWidget.js +19 -40
  124. package/lib/mjs/Element.d.ts +2 -1
  125. package/lib/mjs/Element.js +11 -9
  126. package/lib/mjs/EventEmitter.js +2 -2
  127. package/lib/mjs/Form.js +1 -1
  128. package/lib/mjs/PDF.js +1 -1
  129. package/lib/mjs/PDFBuilder.js +1 -2
  130. package/lib/mjs/Webform.d.ts +2 -2
  131. package/lib/mjs/Webform.js +12 -13
  132. package/lib/mjs/WebformBuilder.d.ts +1 -0
  133. package/lib/mjs/WebformBuilder.js +37 -8
  134. package/lib/mjs/Wizard.d.ts +2 -2
  135. package/lib/mjs/Wizard.js +39 -25
  136. package/lib/mjs/WizardBuilder.js +1 -1
  137. package/lib/mjs/components/_classes/component/Component.d.ts +49 -15
  138. package/lib/mjs/components/_classes/component/Component.js +161 -75
  139. package/lib/mjs/components/_classes/component/editForm/Component.edit.conditional.js +1 -1
  140. package/lib/mjs/components/_classes/component/editForm/Component.edit.data.js +19 -0
  141. package/lib/mjs/components/_classes/component/editForm/Component.edit.logic.js +1 -1
  142. package/lib/mjs/components/_classes/component/editForm/utils.js +1 -1
  143. package/lib/mjs/components/_classes/componentModal/ComponentModal.js +1 -1
  144. package/lib/mjs/components/_classes/input/Input.js +1 -1
  145. package/lib/mjs/components/_classes/list/ListComponent.js +3 -3
  146. package/lib/mjs/components/_classes/nested/NestedComponent.d.ts +0 -1
  147. package/lib/mjs/components/_classes/nested/NestedComponent.form.js +13 -0
  148. package/lib/mjs/components/_classes/nested/NestedComponent.js +17 -25
  149. package/lib/mjs/components/_classes/nestedarray/NestedArrayComponent.js +1 -1
  150. package/lib/mjs/components/_classes/nesteddata/NestedDataComponent.d.ts +0 -2
  151. package/lib/mjs/components/_classes/nesteddata/NestedDataComponent.js +1 -12
  152. package/lib/mjs/components/address/Address.d.ts +9 -0
  153. package/lib/mjs/components/address/Address.js +32 -9
  154. package/lib/mjs/components/address/editForm/Address.edit.display.d.ts +4 -0
  155. package/lib/mjs/components/address/editForm/Address.edit.display.js +1 -0
  156. package/lib/mjs/components/address/editForm/Address.edit.provider.js +8 -8
  157. package/lib/mjs/components/alert/Alert.js +1 -1
  158. package/lib/mjs/components/button/Button.d.ts +1 -1
  159. package/lib/mjs/components/button/Button.js +7 -10
  160. package/lib/mjs/components/checkbox/Checkbox.js +1 -1
  161. package/lib/mjs/components/container/Container.js +1 -1
  162. package/lib/mjs/components/content/editForm/Content.edit.display.js +8 -0
  163. package/lib/mjs/components/currency/Currency.js +1 -1
  164. package/lib/mjs/components/currency/editForm/Currency.edit.display.js +12 -0
  165. package/lib/mjs/components/datagrid/DataGrid.js +5 -4
  166. package/lib/mjs/components/datamap/DataMap.js +2 -6
  167. package/lib/mjs/components/datetime/DateTime.d.ts +1 -1
  168. package/lib/mjs/components/datetime/DateTime.js +15 -13
  169. package/lib/mjs/components/datetime/editForm/DateTime.edit.validation.d.ts +66 -15
  170. package/lib/mjs/components/datetime/editForm/DateTime.edit.validation.js +68 -47
  171. package/lib/mjs/components/day/Day.js +2 -2
  172. package/lib/mjs/components/day/editForm/Day.edit.display.js +8 -0
  173. package/lib/mjs/components/editgrid/EditGrid.js +4 -13
  174. package/lib/mjs/components/editgrid/editForm/EditGrid.edit.display.js +1 -1
  175. package/lib/mjs/components/email/editForm/Email.edit.display.js +12 -0
  176. package/lib/mjs/components/fieldset/editForm/Fieldset.edit.display.js +8 -0
  177. package/lib/mjs/components/file/File.js +6 -2
  178. package/lib/mjs/components/file/editForm/File.edit.file.d.ts +13 -0
  179. package/lib/mjs/components/file/editForm/File.edit.file.js +1 -0
  180. package/lib/mjs/components/form/Form.d.ts +0 -1
  181. package/lib/mjs/components/form/Form.js +31 -24
  182. package/lib/mjs/components/form/editForm/Form.edit.form.js +3 -2
  183. package/lib/mjs/components/hidden/editForm/Hidden.edit.display.js +8 -0
  184. package/lib/mjs/components/html/HTML.js +1 -2
  185. package/lib/mjs/components/html/editForm/HTML.edit.display.js +8 -0
  186. package/lib/mjs/components/number/Number.js +1 -1
  187. package/lib/mjs/components/number/editForm/Number.edit.display.js +12 -0
  188. package/lib/mjs/components/panel/Panel.js +1 -1
  189. package/lib/mjs/components/password/editForm/Password.edit.display.js +13 -1
  190. package/lib/mjs/components/phonenumber/PhoneNumber.form.js +9 -1
  191. package/lib/mjs/components/radio/Radio.d.ts +8 -0
  192. package/lib/mjs/components/radio/Radio.js +17 -7
  193. package/lib/mjs/components/recaptcha/editForm/ReCaptcha.edit.display.js +1 -1
  194. package/lib/mjs/components/select/Select.d.ts +1 -0
  195. package/lib/mjs/components/select/Select.js +21 -5
  196. package/lib/mjs/components/select/editForm/Select.edit.data.d.ts +68 -110
  197. package/lib/mjs/components/select/editForm/Select.edit.data.js +3 -38
  198. package/lib/mjs/components/selectboxes/SelectBoxes.d.ts +6 -0
  199. package/lib/mjs/components/selectboxes/SelectBoxes.js +7 -1
  200. package/lib/mjs/components/signature/Signature.js +1 -1
  201. package/lib/mjs/components/survey/Survey.js +2 -2
  202. package/lib/mjs/components/tabs/Tabs.js +1 -0
  203. package/lib/mjs/components/tabs/editForm/Tabs.edit.display.js +8 -0
  204. package/lib/mjs/components/tags/Tags.js +1 -1
  205. package/lib/mjs/components/textarea/TextArea.js +10 -2
  206. package/lib/mjs/components/textarea/editForm/TextArea.edit.display.js +12 -0
  207. package/lib/mjs/components/textfield/TextField.js +3 -3
  208. package/lib/mjs/components/time/Time.js +1 -1
  209. package/lib/mjs/components/unknown/Unknown.form.d.ts +2 -1
  210. package/lib/mjs/components/unknown/Unknown.form.js +13 -9
  211. package/lib/mjs/components/url/editForm/Url.edit.display.js +12 -0
  212. package/lib/mjs/components/well/editForm/Well.edit.display.js +8 -0
  213. package/lib/mjs/formio.form.js +3 -3
  214. package/lib/mjs/providers/storage/uploadAdapter.js +8 -6
  215. package/lib/mjs/translations/en.d.ts +1 -234
  216. package/lib/mjs/translations/en.js +6 -47
  217. package/lib/mjs/utils/Evaluator.d.ts +20 -6
  218. package/lib/mjs/utils/Evaluator.js +31 -13
  219. package/lib/mjs/utils/builder.js +1 -1
  220. package/lib/mjs/utils/conditionOperators/IsEqualTo.js +1 -1
  221. package/lib/mjs/utils/formUtils.d.ts +2 -2
  222. package/lib/mjs/utils/index.d.ts +169 -2
  223. package/lib/mjs/utils/index.js +18 -1
  224. package/lib/mjs/utils/utils.d.ts +31 -45
  225. package/lib/mjs/utils/utils.js +72 -129
  226. package/lib/mjs/widgets/CalendarWidget.d.ts +1 -8
  227. package/lib/mjs/widgets/CalendarWidget.js +19 -40
  228. package/package.json +8 -6
  229. package/lib/cjs/i18n.d.ts +0 -13
  230. package/lib/cjs/i18n.js +0 -19
  231. package/lib/cjs/utils/i18n.d.ts +0 -19
  232. package/lib/cjs/utils/i18n.js +0 -120
  233. package/lib/mjs/i18n.d.ts +0 -13
  234. package/lib/mjs/i18n.js +0 -14
  235. package/lib/mjs/utils/i18n.d.ts +0 -19
  236. package/lib/mjs/utils/i18n.js +0 -112
@@ -1,30 +1,19 @@
1
1
  /* global jQuery */
2
2
  import _ from 'lodash';
3
- import jsonLogic from 'json-logic-js';
4
3
  import moment from 'moment-timezone/moment-timezone';
5
4
  import jtz from 'jstimezonedetect';
6
- import { lodashOperators } from './jsonlogic/operators';
7
5
  import dompurify from 'dompurify';
6
+ import dayjs from "dayjs";
7
+ import utc from 'dayjs/plugin/utc';
8
+ import timezone from 'dayjs/plugin/timezone';
9
+ import advancedFormat from 'dayjs/plugin/advancedFormat';
10
+ import { jsonLogic, convertShowToBoolean } from '@formio/core';
8
11
  import { getValue } from './formUtils';
9
12
  import { Evaluator } from './Evaluator';
10
13
  import ConditionOperators from './conditionOperators';
11
- const interpolate = Evaluator.interpolate;
12
- export * from './formUtils';
13
- // Configure JsonLogic
14
- lodashOperators.forEach((name) => jsonLogic.add_operation(`_${name}`, _[name]));
15
- // Retrieve Any Date
16
- jsonLogic.add_operation('getDate', (date) => {
17
- return moment(date).toISOString();
18
- });
19
- // Set Relative Minimum Date
20
- jsonLogic.add_operation('relativeMinDate', (relativeMinDate) => {
21
- return moment().subtract(relativeMinDate, 'days').toISOString();
22
- });
23
- // Set Relative Maximum Date
24
- jsonLogic.add_operation('relativeMaxDate', (relativeMaxDate) => {
25
- return moment().add(relativeMaxDate, 'days').toISOString();
26
- });
27
- export { jsonLogic, ConditionOperators, moment };
14
+ dayjs.extend(timezone);
15
+ dayjs.extend(advancedFormat);
16
+ dayjs.extend(utc);
28
17
  /**
29
18
  * Evaluate a method.
30
19
  * @param {Function|string|object} func - The function to evaluate.
@@ -210,7 +199,15 @@ export function checkSimpleConditional(component, condition, row, data, instance
210
199
  return true;
211
200
  }
212
201
  const splittedConditionPath = conditionComponentPath.split('.');
213
- const conditionalPaths = instance?.parent?.type === 'datagrid' || instance?.parent?.type === 'editgrid' ? [] : getConditionalPathsRecursive(splittedConditionPath, data);
202
+ const checkParentTypeInTree = (instance, componentType) => {
203
+ if (!instance?.parent) {
204
+ return false;
205
+ }
206
+ return instance?.parent.type === componentType || checkParentTypeInTree(instance.parent, componentType);
207
+ };
208
+ const conditionalPaths = checkParentTypeInTree(instance, 'datagrid') || checkParentTypeInTree(instance, 'editgrid')
209
+ ? []
210
+ : getConditionalPathsRecursive(splittedConditionPath, data);
214
211
  if (conditionalPaths.length > 0) {
215
212
  return conditionalPaths.map((path) => {
216
213
  const value = getComponentActualValue(path, data, row);
@@ -236,7 +233,7 @@ export function checkSimpleConditional(component, condition, row, data, instance
236
233
  default:
237
234
  result = _.every(conditionsResult.flat(), res => !!res);
238
235
  }
239
- return show ? result : !result;
236
+ return convertShowToBoolean(show) ? result : !result;
240
237
  }
241
238
  }
242
239
  /**
@@ -324,7 +321,7 @@ function getRow(component, row, instance, conditional) {
324
321
  }
325
322
  const dataParent = getDataParentComponent(instance);
326
323
  if (dataParent) {
327
- const parentPath = dataParent.paths?.localDataPath;
324
+ const parentPath = dataParent.paths?.localPath;
328
325
  const isTriggerCondtionComponentPath = condition.when || !condition.conditions
329
326
  ? condition.when?.startsWith(dataParent.paths?.localPath)
330
327
  : _.some(condition.conditions, cond => cond.component.startsWith(dataParent.paths?.localPath));
@@ -504,7 +501,7 @@ export function guid() {
504
501
  /**
505
502
  * Return a translated date setting.
506
503
  * @param {string|Date} date - The date to translate.
507
- * @returns {(null|Date)} - The translated date.
504
+ * @returns {(null|dayjs.Dayjs)} - The translated date.
508
505
  */
509
506
  export function getDateSetting(date) {
510
507
  if (_.isNil(date) || _.isNaN(date) || date === '') {
@@ -524,13 +521,13 @@ export function getDateSetting(date) {
524
521
  try {
525
522
  const value = Evaluator.evaluator(`return ${date};`, 'moment')(moment);
526
523
  if (typeof value === 'string') {
527
- dateSetting = moment(value);
524
+ dateSetting = dayjs(value);
528
525
  }
529
526
  else if (typeof value.toDate === 'function') {
530
- dateSetting = moment(value.toDate().toUTCString());
527
+ dateSetting = dayjs(value.toDate().toUTCString());
531
528
  }
532
529
  else if (value instanceof Date) {
533
- dateSetting = moment(value);
530
+ dateSetting = dayjs(value);
534
531
  }
535
532
  }
536
533
  catch (e) {
@@ -558,17 +555,17 @@ export function isValidDate(date) {
558
555
  * @returns {string} - The current timezone.
559
556
  */
560
557
  export function currentTimezone() {
561
- if (moment.currentTimezone) {
562
- return moment.currentTimezone;
558
+ if (dayjs.currentTimezone) {
559
+ return dayjs.currentTimezone;
563
560
  }
564
- moment.currentTimezone = jtz.determine().name();
565
- return moment.currentTimezone;
561
+ dayjs.currentTimezone = jtz.determine().name();
562
+ return dayjs.currentTimezone;
566
563
  }
567
564
  /**
568
565
  * Get an offset date provided a date object and timezone object.
569
566
  * @param {Date} date - The date to offset.
570
567
  * @param {string} timezone - The timezone to offset the date to.
571
- * @returns {Date} - The offset date.
568
+ * @returns {{date: Date, abbr: string}} - The offset date.
572
569
  */
573
570
  export function offsetDate(date, timezone) {
574
571
  if (timezone === 'UTC') {
@@ -577,134 +574,89 @@ export function offsetDate(date, timezone) {
577
574
  abbr: 'UTC'
578
575
  };
579
576
  }
580
- const dateMoment = moment(date).tz(timezone);
577
+ const dateMoment = dayjs(date).tz(timezone);
581
578
  return {
582
579
  date: new Date(date.getTime() + ((dateMoment.utcOffset() + date.getTimezoneOffset()) * 60000)),
583
580
  abbr: dateMoment.format('z')
584
581
  };
585
582
  }
586
583
  /**
587
- * Returns if the zones are loaded.
588
- * @returns {boolean} - TRUE if the zones are loaded; FALSE otherwise.
589
- */
590
- export function zonesLoaded() {
591
- return moment.zonesLoaded;
592
- }
593
- /**
594
- * Returns if we should load the zones.
584
+ * Returns if we should handle a timezone difference.
595
585
  * @param {string} timezone - The timezone to check if we should load the zones.
596
- * @returns {boolean} - TRUE if we should load the zones; FALSE otherwise.
586
+ * @returns {boolean} - TRUE if we should handle timezones; FALSE otherwise.
597
587
  */
598
- export function shouldLoadZones(timezone) {
599
- if (timezone === currentTimezone() || timezone === 'UTC') {
600
- return false;
601
- }
602
- return true;
588
+ export function shouldHandleTimezone(timezone) {
589
+ return !(timezone === currentTimezone() || timezone === 'UTC');
603
590
  }
604
591
  /**
605
- * Externally load the timezone data.
606
- * @param {string} url - The URL to load the timezone data from.
607
- * @param {string} timezone - The timezone to load.
608
- * @returns {Promise<any> | *} - Resolves when the zones for this timezone are loaded.
609
- */
610
- export function loadZones(url, timezone) {
611
- if (timezone && !shouldLoadZones(timezone)) {
612
- // Return non-resolving promise.
613
- return new Promise(_.noop);
614
- }
615
- if (moment.zonesPromise) {
616
- return moment.zonesPromise;
617
- }
618
- return moment.zonesPromise = fetch(url)
619
- .then(resp => resp.json().then(zones => {
620
- moment.tz.load(zones);
621
- moment.zonesLoaded = true;
622
- // Trigger a global event that the timezones have finished loading.
623
- if (document && document.createEvent && document.body && document.body.dispatchEvent) {
624
- var event = document.createEvent('Event');
625
- event.initEvent('zonesLoaded', true, true);
626
- document.body.dispatchEvent(event);
627
- }
628
- }));
629
- }
630
- /**
631
- * Get the moment date object for translating dates with timezones.
632
- * @param {string|Date} value - The value to convert into a moment date.
592
+ * Get the Dayjs date object for translating dates with timezones.
593
+ * @param {string|Date} value - The value to convert into a dayjs date.
633
594
  * @param {string} format - The format to convert the date to.
634
595
  * @param {string} timezone - The timezone to convert the date to.
635
596
  * @param {object} options - The options object
636
- * @returns {Date} - The moment date object.
597
+ * @returns {dayjs.Dayjs} - The dayjs date object.
637
598
  */
638
- export function momentDate(value, format, timezone, options) {
639
- const momentDate = moment(value);
599
+ export function dayjsDate(value, format, timezone, options) {
600
+ const dayjsDate = dayjs(value);
640
601
  if (!timezone) {
641
- return momentDate;
602
+ return dayjsDate;
642
603
  }
643
604
  if (timezone === 'UTC') {
644
605
  timezone = 'Etc/UTC';
645
606
  }
646
- if ((timezone !== currentTimezone() || (format && format.match(/\s(z$|z\s)/))) && (moment.zonesLoaded || options?.email)) {
647
- return momentDate.tz(timezone);
607
+ if ((timezone !== currentTimezone() || (format && format.match(/\s(z$|z\s)/))) && (shouldHandleTimezone(timezone) || options?.email)) {
608
+ return dayjsDate.tz(timezone);
648
609
  }
649
- return momentDate;
610
+ return dayjsDate;
650
611
  }
651
612
  /**
652
613
  * Format a date provided a value, format, and timezone object.
653
- * @param {string} timezonesUrl - The URL to load the timezone data from.
654
614
  * @param {string|Date} value - The value to format.
655
615
  * @param {string} format - The format to format the date to.
656
616
  * @param {string} timezone - The timezone to format the date to.
657
617
  * @param {string} flatPickrInputFormat - The format to use for flatpickr input.
658
618
  * @returns {string} - The formatted date.
659
619
  */
660
- export function formatDate(timezonesUrl, value, format, timezone, flatPickrInputFormat) {
661
- const momentDate = moment(value, flatPickrInputFormat || undefined);
620
+ export function formatDate(value, format, timezone, flatPickrInputFormat) {
621
+ const dayjsDate = dayjs(value, flatPickrInputFormat || undefined);
662
622
  if (timezone === currentTimezone()) {
663
623
  // See if our format contains a "z" timezone character.
664
624
  if (format.match(/\s(z$|z\s)/)) {
665
- loadZones(timezonesUrl);
666
- if (moment.zonesLoaded) {
667
- return momentDate.tz(timezone).format(convertFormatToMoment(format));
625
+ if (shouldHandleTimezone(timezone)) {
626
+ return dayjsDate.tz(timezone).format(convertFormatToDayjs(format));
668
627
  }
669
628
  else {
670
- return momentDate.format(convertFormatToMoment(format.replace(/\s(z$|z\s)/, '')));
629
+ return dayjsDate.format(convertFormatToDayjs(format.replace(/\s(z$|z\s)/, '')));
671
630
  }
672
631
  }
673
632
  // Return the standard format.
674
- return momentDate.format(convertFormatToMoment(format));
633
+ return dayjsDate.format(convertFormatToDayjs(format));
675
634
  }
676
635
  if (timezone === 'UTC') {
677
- const offset = offsetDate(momentDate.toDate(), 'UTC');
678
- return `${moment(offset.date).format(convertFormatToMoment(format))} UTC`;
636
+ const offset = offsetDate(dayjsDate.toDate(), 'UTC');
637
+ return `${dayjs(offset.date).format(convertFormatToDayjs(format))} UTC`;
679
638
  }
680
- // Load the zones since we need timezone information.
681
- loadZones(timezonesUrl);
682
- if (moment.zonesLoaded && timezone) {
683
- return momentDate.tz(timezone).format(`${convertFormatToMoment(format)} z`);
684
- }
685
- else {
686
- return momentDate.format(convertFormatToMoment(format));
639
+ if (shouldHandleTimezone(timezone)) {
640
+ return dayjsDate.tz(timezone).format(`${convertFormatToDayjs(format)} z`);
687
641
  }
642
+ return dayjsDate.format(convertFormatToDayjs(format));
688
643
  }
689
644
  /**
690
645
  * Pass a format function to format within a timezone.
691
- * @param {string} timezonesUrl - The URL to load the timezone data from.
692
646
  * @param {Function} formatFn - The format function to use.
693
647
  * @param {Date|string} date - The date to format.
694
648
  * @param {string} format - The format to format the date to.
695
649
  * @param {string} timezone - The timezone to format the date to.
696
650
  * @returns {string} - The formatted date.
697
651
  */
698
- export function formatOffset(timezonesUrl, formatFn, date, format, timezone) {
652
+ export function formatOffset(formatFn, date, format, timezone) {
699
653
  if (timezone === currentTimezone()) {
700
654
  return formatFn(date, format);
701
655
  }
702
656
  if (timezone === 'UTC') {
703
657
  return `${formatFn(offsetDate(date, 'UTC').date, format)} UTC`;
704
658
  }
705
- // Load the zones since we need timezone information.
706
- loadZones(timezonesUrl);
707
- if (moment.zonesLoaded) {
659
+ if (shouldHandleTimezone(timezone)) {
708
660
  const offset = offsetDate(date, timezone);
709
661
  return `${formatFn(offset.date, format)} ${offset.abbr}`;
710
662
  }
@@ -761,7 +713,7 @@ export function convertFormatToFlatpickr(format) {
761
713
  * @param {string} format - The format to convert.
762
714
  * @returns {string} - The converted format.
763
715
  */
764
- export function convertFormatToMoment(format) {
716
+ export function convertFormatToDayjs(format) {
765
717
  return format
766
718
  // Year conversion.
767
719
  .replace(/y/g, 'Y')
@@ -1310,11 +1262,10 @@ export function sanitize(string, options) {
1310
1262
  export function fastCloneDeep(obj) {
1311
1263
  return obj ? JSON.parse(JSON.stringify(obj)) : obj;
1312
1264
  }
1313
- export { Evaluator, interpolate };
1314
1265
  /**
1315
1266
  * Returns if the component is an input component.
1316
1267
  * @param {import('@formio/core').Component} componentJson - The JSON of a component.
1317
- * @returns {bool} - TRUE if the component is an input component; FALSE otherwise.
1268
+ * @returns {boolean} - TRUE if the component is an input component; FALSE otherwise.
1318
1269
  */
1319
1270
  export function isInputComponent(componentJson) {
1320
1271
  if (componentJson.input === false || componentJson.input === true) {
@@ -1338,7 +1289,7 @@ export function isInputComponent(componentJson) {
1338
1289
  /**
1339
1290
  * Takes a component path, and returns a component path array.
1340
1291
  * @param {string} pathStr - The path string to convert to an array.
1341
- * @returns {Arryay<number>} - The array of paths.
1292
+ * @returns {Array<string>} - The array of paths.
1342
1293
  */
1343
1294
  export function getArrayFromComponentPath(pathStr) {
1344
1295
  if (!pathStr || !_.isString(pathStr)) {
@@ -1502,26 +1453,6 @@ export function isPromise(value) {
1502
1453
  && typeof value.then === 'function'
1503
1454
  && Object.prototype.toString.call(value) === '[object Promise]';
1504
1455
  }
1505
- /**
1506
- * Determines if the component has a scoping parent in tree (a component which scopes its children and manages its
1507
- * changes by itself, e.g. EditGrid)
1508
- * @param {Component} componentInstance - The component to check for the scoping parent.
1509
- * @param {boolean} firstPass - Whether it is the first pass of the function
1510
- * @returns {boolean|*} - TRUE if the component has a scoping parent; FALSE otherwise
1511
- */
1512
- export function isInsideScopingComponent(componentInstance, firstPass = true) {
1513
- if (!firstPass && componentInstance?.hasScopedChildren) {
1514
- return true;
1515
- }
1516
- const dataParent = getDataParentComponent(componentInstance);
1517
- if (dataParent?.hasScopedChildren) {
1518
- return true;
1519
- }
1520
- else if (dataParent?.parent) {
1521
- return isInsideScopingComponent(dataParent.parent, false);
1522
- }
1523
- return false;
1524
- }
1525
1456
  /**
1526
1457
  * Returns all the focusable elements within the provided dom element.
1527
1458
  * @param {HTMLElement} element - The element to get the focusable elements from.
@@ -1532,8 +1463,6 @@ export function getFocusableElements(element) {
1532
1463
  textarea:not([disabled]), button:not([disabled]), [href]`;
1533
1464
  return element.querySelectorAll(focusableSelector);
1534
1465
  }
1535
- // Export lodash to save space with other libraries.
1536
- export { _ };
1537
1466
  export const componentValueTypes = {
1538
1467
  number: 'number',
1539
1468
  string: 'string',
@@ -1573,3 +1502,17 @@ export const interpolateErrors = (component, errors, interpolateFn) => {
1573
1502
  return { ...error, message: unescapeHTML(interpolateFn(toInterpolate, context)), context: { ...context } };
1574
1503
  });
1575
1504
  };
1505
+ /**
1506
+ * Checks if a string has timezone information encoded in it
1507
+ * Example: 2024-01-01T00:00:00Z -> true
1508
+ * Example: 2024-01-01T00:00:00+03:00 -> true
1509
+ * Example: 2011-05-03T00:00:00 -> false
1510
+ * @param {string} value the string value to check
1511
+ * @returns {boolean} if value has encoded timezone
1512
+ */
1513
+ export function hasEncodedTimezone(value) {
1514
+ if (typeof value !== 'string') {
1515
+ return false;
1516
+ }
1517
+ return (value.substring(value.length - 1) === 'z' || value.substring(value.length - 1) === 'Z' || value.match(/[+|-][0-9]{2}:[0-9]{2}$/));
1518
+ }
@@ -22,13 +22,6 @@ export default class CalendarWidget extends InputWidget {
22
22
  minDate: string;
23
23
  maxDate: string;
24
24
  };
25
- zoneLoading: boolean;
26
- timezonesUrl: string;
27
- /**
28
- * Load the timezones.
29
- * @returns {boolean} TRUE if the zones are loading, FALSE otherwise.
30
- */
31
- loadZones(): boolean;
32
25
  attach(input: any): Promise<any>;
33
26
  defaultFormat: {
34
27
  date: string;
@@ -84,7 +77,7 @@ export default class CalendarWidget extends InputWidget {
84
77
  * @returns {void}
85
78
  */
86
79
  setValue(value: any): void;
87
- getValueAsString(value: any, format: any): string;
80
+ getValueAsString(value: any, format?: string): string;
88
81
  setErrorClasses(hasErrors: any): void;
89
82
  isCalendarElement(element: any): any;
90
83
  initFlatpickr(Flatpickr: any): void;
@@ -1,8 +1,8 @@
1
- import { Formio } from '../Formio';
2
- import InputWidget from './InputWidget';
3
- import { convertFormatToFlatpickr, convertFormatToMask, convertFormatToMoment, formatDate, formatOffset, getBrowserInfo, getDateSetting, getLocaleDateFormatInfo, momentDate, zonesLoaded, shouldLoadZones, loadZones, } from '../utils/utils';
4
1
  import moment from 'moment';
5
2
  import _ from 'lodash';
3
+ import { Formio } from '../Formio';
4
+ import InputWidget from './InputWidget';
5
+ import { convertFormatToFlatpickr, convertFormatToMask, convertFormatToDayjs, formatDate, formatOffset, getBrowserInfo, getDateSetting, getLocaleDateFormatInfo, hasEncodedTimezone, dayjsDate } from '../utils';
6
6
  const DEFAULT_FORMAT = 'yyyy-MM-dd hh:mm a';
7
7
  const ISO_8601_FORMAT = 'yyyy-MM-ddTHH:mm:ssZ';
8
8
  const isIEBrowser = getBrowserInfo().ie;
@@ -46,29 +46,6 @@ export default class CalendarWidget extends InputWidget {
46
46
  else if (this.settings.time_24hr) {
47
47
  this.settings.format = this.settings.format.replace(/hh:mm a$/g, 'HH:mm');
48
48
  }
49
- this.zoneLoading = false;
50
- this.timezonesUrl = `${Formio.cdn['moment-timezone']}/data/packed/latest.json`;
51
- }
52
- /**
53
- * Load the timezones.
54
- * @returns {boolean} TRUE if the zones are loading, FALSE otherwise.
55
- */
56
- loadZones() {
57
- const timezone = this.timezone;
58
- if (this.zoneLoading) {
59
- return true;
60
- }
61
- if (!zonesLoaded() && shouldLoadZones(timezone)) {
62
- this.zoneLoading = true;
63
- loadZones(this.timezonesUrl, timezone).then(() => {
64
- this.zoneLoading = false;
65
- this.emit('redraw');
66
- });
67
- // Return zones are loading.
68
- return true;
69
- }
70
- // Zones are already loaded.
71
- return false;
72
49
  }
73
50
  attach(input) {
74
51
  const superAttach = super.attach(input);
@@ -79,7 +56,7 @@ export default class CalendarWidget extends InputWidget {
79
56
  };
80
57
  this.closedOn = 0;
81
58
  this.valueFormat = (this.settings.saveAs === 'date') ? ISO_8601_FORMAT : this.settings.dateFormat || ISO_8601_FORMAT;
82
- this.valueMomentFormat = convertFormatToMoment(this.valueFormat);
59
+ this.valueMomentFormat = convertFormatToDayjs(this.valueFormat);
83
60
  const isReadOnly = this.settings.readOnly;
84
61
  this.settings.minDate = isReadOnly ? null : getDateSetting(this.settings.minDate);
85
62
  this.settings.maxDate = isReadOnly ? null : getDateSetting(this.settings.maxDate);
@@ -241,9 +218,9 @@ export default class CalendarWidget extends InputWidget {
241
218
  */
242
219
  getDateValue(date, format, useTimezone) {
243
220
  if (useTimezone) {
244
- return momentDate(date, this.valueFormat, this.timezone).format(convertFormatToMoment(format));
221
+ return dayjsDate(date, this.valueFormat, this.timezone).format(convertFormatToDayjs(format));
245
222
  }
246
- return moment(date).format(convertFormatToMoment(format));
223
+ return moment(date).format(convertFormatToDayjs(format));
247
224
  }
248
225
  /**
249
226
  * Return the value of the selected date.
@@ -275,13 +252,15 @@ export default class CalendarWidget extends InputWidget {
275
252
  setValue(value) {
276
253
  const saveAsText = (this.settings.saveAs === 'text');
277
254
  if (!this.calendar) {
278
- value = value ? formatDate(this.timezonesUrl, value, convertFormatToMoment(this.settings.format), this.timezone, convertFormatToMoment(this.valueMomentFormat)) : value;
255
+ value = value ? formatDate(value, convertFormatToDayjs(this.settings.format), this.timezone, convertFormatToDayjs(this.valueMomentFormat)) : value;
279
256
  return super.setValue(value);
280
257
  }
281
- const zonesLoading = this.loadZones();
258
+ // If the component is a textfield that does not have timezone information included in the string value then skip
259
+ // the timezone offset
260
+ this.settings.skipOffset = this.component.type === 'textfield' && !hasEncodedTimezone(value);
282
261
  if (value) {
283
- if (!saveAsText && this.settings.readOnly && !zonesLoading) {
284
- this.calendar.setDate(momentDate(value, this.valueFormat, this.timezone).format(), false);
262
+ if (!saveAsText && this.settings.readOnly) {
263
+ this.calendar.setDate(dayjsDate(value, this.valueFormat, this.timezone).format(), false);
285
264
  }
286
265
  else if (this.isValueISO8601(value)) {
287
266
  this.calendar.setDate(value, false);
@@ -294,13 +273,13 @@ export default class CalendarWidget extends InputWidget {
294
273
  this.calendar.clear(false);
295
274
  }
296
275
  }
297
- getValueAsString(value, format) {
276
+ getValueAsString(value, format = '') {
298
277
  const inputFormat = format || this.dateFormat;
299
278
  const valueFormat = this.calendar ? this.valueFormat : this.settings.dateFormat;
300
279
  if (this.settings.saveAs === 'text' && this.componentInstance.parent && !this.settings.readOnly) {
301
- return moment(value, convertFormatToMoment(valueFormat)).format(convertFormatToMoment(valueFormat));
280
+ return moment(value, convertFormatToDayjs(valueFormat)).format(convertFormatToDayjs(valueFormat));
302
281
  }
303
- return formatDate(this.timezonesUrl, value, inputFormat, this.timezone, convertFormatToMoment(valueFormat));
282
+ return formatDate(value, inputFormat, this.timezone, convertFormatToDayjs(valueFormat));
304
283
  }
305
284
  setErrorClasses(hasErrors) {
306
285
  if (!this.input) {
@@ -391,7 +370,7 @@ export default class CalendarWidget extends InputWidget {
391
370
  const relatedTarget = event.relatedTarget ? event.relatedTarget : activeElement;
392
371
  if (!(isIEBrowser && !relatedTarget) && !this.isCalendarElement(relatedTarget)) {
393
372
  const inputValue = this.calendar.input.value;
394
- const dateValue = inputValue ? moment(this.calendar.input.value, convertFormatToMoment(this.valueFormat)).toDate() : inputValue;
373
+ const dateValue = inputValue ? moment(this.calendar.input.value, convertFormatToDayjs(this.valueFormat)).toDate() : inputValue;
395
374
  this.calendar.setDate(dateValue, true, this.settings.altFormat);
396
375
  }
397
376
  else if (!this.calendar.input.value && this.calendar.config.noCalendar) {
@@ -443,14 +422,14 @@ export default class CalendarWidget extends InputWidget {
443
422
  return (date, format) => {
444
423
  // Only format this if this is the altFormat and the form is readOnly.
445
424
  if (this.settings.readOnly && (format === this.settings.altFormat)) {
446
- if (!this.settings.enableTime || this.loadZones()) {
425
+ if (!this.settings.enableTime || this.settings.skipOffset) {
447
426
  return Flatpickr.formatDate(date, format);
448
427
  }
449
428
  const currentValue = new Date(this.getValue());
450
429
  if (currentValue.toString() === date.toString()) {
451
- return formatOffset(this.timezonesUrl, Flatpickr.formatDate.bind(Flatpickr), new Date(this.componentValue), format, this.timezone);
430
+ return formatOffset(Flatpickr.formatDate.bind(Flatpickr), new Date(this.componentValue), format, this.timezone);
452
431
  }
453
- return formatOffset(this.timezonesUrl, Flatpickr.formatDate.bind(Flatpickr), date, format, this.timezone);
432
+ return formatOffset(Flatpickr.formatDate.bind(Flatpickr), date, format, this.timezone);
454
433
  }
455
434
  return Flatpickr.formatDate(date, format);
456
435
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@formio/js",
3
- "version": "5.1.0-dev.6040.debc859",
3
+ "version": "5.1.0-dev.6042.603237d",
4
4
  "description": "JavaScript powered Forms with JSON Form Builder",
5
5
  "main": "lib/cjs/index.js",
6
6
  "exports": {
@@ -81,20 +81,21 @@
81
81
  "homepage": "https://github.com/formio/formio.js#readme",
82
82
  "dependencies": {
83
83
  "@formio/bootstrap": "v3.0.0-dev.121.085d187",
84
- "@formio/core": "v2.4.0-dev.2",
84
+ "@formio/core": "2.4.0-dev.267.2866472",
85
85
  "@formio/text-mask-addons": "3.8.0-formio.4",
86
86
  "@formio/vanilla-text-mask": "^5.1.1-formio.1",
87
87
  "abortcontroller-polyfill": "^1.7.5",
88
88
  "autocompleter": "^8.0.4",
89
- "bootstrap": "^5.3.3",
89
+ "bootstrap": "^5.3.4",
90
90
  "browser-cookies": "^1.2.0",
91
91
  "browser-md5-file": "^1.1.1",
92
92
  "choices.js": "^11.0.6",
93
93
  "compare-versions": "^6.1.1",
94
94
  "core-js": "^3.37.1",
95
+ "dayjs": "^1.11.13",
95
96
  "dialog-polyfill": "^0.5.6",
96
97
  "dom-autoscroller": "^2.3.4",
97
- "dompurify": "^3.1.6",
98
+ "dompurify": "^3.2.5",
98
99
  "downloadjs": "^1.4.7",
99
100
  "dragula": "^3.7.3",
100
101
  "eventemitter3": "^5.0.1",
@@ -108,7 +109,7 @@
108
109
  "jwt-decode": "^3.1.2",
109
110
  "lodash": "^4.17.21",
110
111
  "moment": "^2.29.4",
111
- "moment-timezone": "^0.5.44",
112
+ "moment-timezone": "^0.5.48",
112
113
  "quill": "^2.0.2",
113
114
  "signature_pad": "^4.2.0",
114
115
  "string-hash": "^1.1.3",
@@ -175,7 +176,8 @@
175
176
  "webpack-bundle-analyzer": "^4.10.2",
176
177
  "webpack-cli": "^5.1.1",
177
178
  "webpack-node-externals": "^3.0.0",
178
- "webpack-stream": "^7.0.0"
179
+ "webpack-stream": "^7.0.0",
180
+ "zx": "^8.5.4"
179
181
  },
180
182
  "nyc": {
181
183
  "check-coverage": true,
package/lib/cjs/i18n.d.ts DELETED
@@ -1,13 +0,0 @@
1
- declare namespace _default {
2
- let lng: string;
3
- let nsSeparator: string;
4
- let keySeparator: string;
5
- let pluralSeparator: string;
6
- let contextSeparator: string;
7
- namespace resources {
8
- namespace en {
9
- let translation: any;
10
- }
11
- }
12
- }
13
- export default _default;
package/lib/cjs/i18n.js DELETED
@@ -1,19 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const en_1 = __importDefault(require("./translations/en"));
7
- const utils_1 = require("./utils/utils");
8
- exports.default = {
9
- lng: 'en',
10
- nsSeparator: '::',
11
- keySeparator: '.|.',
12
- pluralSeparator: '._.',
13
- contextSeparator: '._.',
14
- resources: {
15
- en: {
16
- translation: (0, utils_1.fastCloneDeep)(en_1.default)
17
- }
18
- }
19
- };
@@ -1,19 +0,0 @@
1
- /**
2
- * This file is used to mimic the i18n library interface.
3
- */
4
- export class I18n {
5
- static languages: {};
6
- static setDefaultTranslations(languages: any): void;
7
- static init(languages?: {}): I18n;
8
- static createInstance(): I18n;
9
- constructor(languages?: {});
10
- languages: any;
11
- defaultKeys: any;
12
- language: string;
13
- currentLanguage: any;
14
- setLanguages(languages: any, noDefaultOverride: any): void;
15
- dir(lang?: string): "rtl" | "ltr";
16
- changeLanguage(language: any, ready?: null): void;
17
- addResourceBundle(language: any, type: any, strings: any): void;
18
- t(text: any, ...args: any[]): any;
19
- }