@formio/js 5.1.0-dev.6109.79f22ad → 5.1.0-dev.6112.86987a5
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/README.md +7 -0
- package/dist/formio.builder.css +1 -0
- package/dist/formio.builder.min.css +1 -1
- package/dist/formio.form.css +1 -0
- package/dist/formio.form.js +116 -149
- package/dist/formio.form.min.css +1 -1
- package/dist/formio.form.min.js +1 -1
- package/dist/formio.full.css +1 -0
- package/dist/formio.full.js +123 -156
- package/dist/formio.full.min.css +1 -1
- package/dist/formio.full.min.js +1 -1
- package/dist/formio.js +65 -54
- package/dist/formio.min.js +1 -1
- package/dist/formio.utils.js +76 -76
- package/dist/formio.utils.min.js +1 -1
- package/lib/cjs/Element.d.ts +2 -1
- package/lib/cjs/Element.js +18 -39
- package/lib/cjs/EventEmitter.js +2 -25
- package/lib/cjs/Form.js +2 -25
- package/lib/cjs/PDF.js +1 -1
- package/lib/cjs/PDFBuilder.d.ts +1 -0
- package/lib/cjs/PDFBuilder.js +10 -11
- package/lib/cjs/Webform.d.ts +2 -2
- package/lib/cjs/Webform.js +9 -9
- package/lib/cjs/WebformBuilder.d.ts +1 -1
- package/lib/cjs/WebformBuilder.js +45 -21
- package/lib/cjs/Wizard.d.ts +1 -2
- package/lib/cjs/Wizard.js +18 -24
- package/lib/cjs/WizardBuilder.js +1 -1
- package/lib/cjs/components/_classes/component/Component.d.ts +0 -1
- package/lib/cjs/components/_classes/component/Component.js +57 -62
- package/lib/cjs/components/_classes/component/editForm/Component.edit.conditional.js +1 -1
- package/lib/cjs/components/_classes/component/editForm/Component.edit.logic.js +1 -1
- package/lib/cjs/components/_classes/componentModal/ComponentModal.js +1 -1
- package/lib/cjs/components/_classes/input/Input.d.ts +1 -1
- package/lib/cjs/components/_classes/input/Input.js +3 -3
- package/lib/cjs/components/_classes/list/ListComponent.js +1 -1
- package/lib/cjs/components/_classes/nested/NestedComponent.js +7 -7
- package/lib/cjs/components/_classes/nestedarray/NestedArrayComponent.js +1 -1
- package/lib/cjs/components/_classes/nesteddata/NestedDataComponent.js +1 -1
- package/lib/cjs/components/address/Address.js +1 -1
- package/lib/cjs/components/alert/Alert.js +1 -1
- package/lib/cjs/components/button/Button.js +1 -1
- package/lib/cjs/components/checkbox/Checkbox.js +1 -1
- package/lib/cjs/components/container/Container.js +1 -1
- package/lib/cjs/components/currency/Currency.js +1 -1
- package/lib/cjs/components/datagrid/DataGrid.js +1 -1
- package/lib/cjs/components/datamap/DataMap.js +7 -2
- package/lib/cjs/components/datetime/DateTime.d.ts +1 -1
- package/lib/cjs/components/datetime/DateTime.js +15 -13
- package/lib/cjs/components/day/Day.js +2 -2
- package/lib/cjs/components/editgrid/EditGrid.js +1 -1
- package/lib/cjs/components/editgrid/editForm/EditGrid.edit.display.js +1 -1
- package/lib/cjs/components/fieldset/Fieldset.js +1 -0
- package/lib/cjs/components/file/File.js +1 -1
- package/lib/cjs/components/form/Form.js +14 -2
- package/lib/cjs/components/form/editForm/Form.edit.form.js +4 -3
- package/lib/cjs/components/number/Number.js +1 -1
- package/lib/cjs/components/panel/Panel.js +1 -1
- package/lib/cjs/components/radio/Radio.d.ts +8 -0
- package/lib/cjs/components/radio/Radio.js +16 -6
- package/lib/cjs/components/recaptcha/editForm/ReCaptcha.edit.display.js +1 -1
- package/lib/cjs/components/select/Select.js +7 -3
- package/lib/cjs/components/select/editForm/Select.edit.data.js +1 -1
- package/lib/cjs/components/selectboxes/SelectBoxes.d.ts +6 -0
- package/lib/cjs/components/selectboxes/SelectBoxes.js +1 -1
- package/lib/cjs/components/signature/Signature.js +1 -1
- package/lib/cjs/components/survey/Survey.js +1 -1
- package/lib/cjs/components/tags/Tags.js +1 -1
- package/lib/cjs/components/textarea/TextArea.js +9 -4
- package/lib/cjs/components/textfield/TextField.js +13 -31
- package/lib/cjs/components/time/Time.js +1 -1
- package/lib/cjs/formio.form.js +5 -5
- package/lib/cjs/providers/storage/uploadAdapter.js +1 -1
- package/lib/cjs/translations/en.d.ts +1 -232
- package/lib/cjs/translations/en.js +4 -2
- package/lib/cjs/utils/Evaluator.d.ts +20 -6
- package/lib/cjs/utils/Evaluator.js +38 -15
- package/lib/cjs/utils/builder.js +5 -5
- package/lib/cjs/utils/conditionOperators/IsEqualTo.js +3 -3
- package/lib/cjs/utils/formUtils.d.ts +2 -2
- package/lib/cjs/utils/index.d.ts +169 -2
- package/lib/cjs/utils/index.js +22 -2
- package/lib/cjs/utils/utils.d.ts +22 -37
- package/lib/cjs/utils/utils.js +64 -135
- package/lib/cjs/widgets/CalendarWidget.d.ts +1 -8
- package/lib/cjs/widgets/CalendarWidget.js +17 -43
- package/lib/mjs/Element.d.ts +2 -1
- package/lib/mjs/Element.js +11 -9
- package/lib/mjs/EventEmitter.js +2 -2
- package/lib/mjs/Form.js +1 -1
- package/lib/mjs/PDF.js +1 -1
- package/lib/mjs/PDFBuilder.d.ts +1 -0
- package/lib/mjs/PDFBuilder.js +9 -10
- package/lib/mjs/Webform.d.ts +2 -2
- package/lib/mjs/Webform.js +7 -7
- package/lib/mjs/WebformBuilder.d.ts +1 -1
- package/lib/mjs/WebformBuilder.js +36 -13
- package/lib/mjs/Wizard.d.ts +1 -2
- package/lib/mjs/Wizard.js +17 -23
- package/lib/mjs/WizardBuilder.js +1 -1
- package/lib/mjs/components/_classes/component/Component.d.ts +0 -1
- package/lib/mjs/components/_classes/component/Component.js +30 -12
- package/lib/mjs/components/_classes/component/editForm/Component.edit.conditional.js +1 -1
- package/lib/mjs/components/_classes/component/editForm/Component.edit.logic.js +1 -1
- package/lib/mjs/components/_classes/componentModal/ComponentModal.js +1 -1
- package/lib/mjs/components/_classes/input/Input.d.ts +1 -1
- package/lib/mjs/components/_classes/input/Input.js +3 -3
- package/lib/mjs/components/_classes/list/ListComponent.js +1 -1
- package/lib/mjs/components/_classes/nested/NestedComponent.js +7 -7
- package/lib/mjs/components/_classes/nestedarray/NestedArrayComponent.js +1 -1
- package/lib/mjs/components/_classes/nesteddata/NestedDataComponent.js +1 -1
- package/lib/mjs/components/address/Address.js +1 -1
- package/lib/mjs/components/alert/Alert.js +1 -1
- package/lib/mjs/components/button/Button.js +1 -1
- package/lib/mjs/components/checkbox/Checkbox.js +1 -1
- package/lib/mjs/components/container/Container.js +1 -1
- package/lib/mjs/components/currency/Currency.js +1 -1
- package/lib/mjs/components/datagrid/DataGrid.js +1 -1
- package/lib/mjs/components/datamap/DataMap.js +7 -2
- package/lib/mjs/components/datetime/DateTime.d.ts +1 -1
- package/lib/mjs/components/datetime/DateTime.js +15 -13
- package/lib/mjs/components/day/Day.js +2 -2
- package/lib/mjs/components/editgrid/EditGrid.js +1 -1
- package/lib/mjs/components/editgrid/editForm/EditGrid.edit.display.js +1 -1
- package/lib/mjs/components/fieldset/Fieldset.js +1 -0
- package/lib/mjs/components/file/File.js +1 -1
- package/lib/mjs/components/form/Form.js +13 -2
- package/lib/mjs/components/form/editForm/Form.edit.form.js +3 -2
- package/lib/mjs/components/number/Number.js +1 -1
- package/lib/mjs/components/panel/Panel.js +1 -1
- package/lib/mjs/components/radio/Radio.d.ts +8 -0
- package/lib/mjs/components/radio/Radio.js +16 -6
- package/lib/mjs/components/recaptcha/editForm/ReCaptcha.edit.display.js +1 -1
- package/lib/mjs/components/select/Select.js +7 -3
- package/lib/mjs/components/select/editForm/Select.edit.data.js +1 -1
- package/lib/mjs/components/selectboxes/SelectBoxes.d.ts +6 -0
- package/lib/mjs/components/selectboxes/SelectBoxes.js +1 -1
- package/lib/mjs/components/signature/Signature.js +1 -1
- package/lib/mjs/components/survey/Survey.js +1 -1
- package/lib/mjs/components/tags/Tags.js +1 -1
- package/lib/mjs/components/textarea/TextArea.js +9 -4
- package/lib/mjs/components/textfield/TextField.js +7 -2
- package/lib/mjs/components/time/Time.js +1 -1
- package/lib/mjs/formio.form.js +3 -3
- package/lib/mjs/providers/storage/uploadAdapter.js +1 -1
- package/lib/mjs/translations/en.d.ts +1 -232
- package/lib/mjs/translations/en.js +8 -47
- package/lib/mjs/utils/Evaluator.d.ts +20 -6
- package/lib/mjs/utils/Evaluator.js +31 -13
- package/lib/mjs/utils/builder.js +1 -1
- package/lib/mjs/utils/conditionOperators/IsEqualTo.js +1 -1
- package/lib/mjs/utils/formUtils.d.ts +2 -2
- package/lib/mjs/utils/index.d.ts +169 -2
- package/lib/mjs/utils/index.js +18 -1
- package/lib/mjs/utils/utils.d.ts +22 -37
- package/lib/mjs/utils/utils.js +57 -109
- package/lib/mjs/widgets/CalendarWidget.d.ts +1 -8
- package/lib/mjs/widgets/CalendarWidget.js +17 -43
- package/package.json +5 -3
- package/lib/cjs/i18n.d.ts +0 -13
- package/lib/cjs/i18n.js +0 -19
- package/lib/cjs/utils/i18n.d.ts +0 -19
- package/lib/cjs/utils/i18n.js +0 -120
- package/lib/mjs/i18n.d.ts +0 -13
- package/lib/mjs/i18n.js +0 -14
- package/lib/mjs/utils/i18n.d.ts +0 -19
- package/lib/mjs/utils/i18n.js +0 -112
package/lib/mjs/utils/utils.js
CHANGED
@@ -1,31 +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
|
-
|
12
|
-
|
13
|
-
|
14
|
-
// Configure JsonLogic
|
15
|
-
lodashOperators.forEach((name) => jsonLogic.add_operation(`_${name}`, _[name]));
|
16
|
-
// Retrieve Any Date
|
17
|
-
jsonLogic.add_operation('getDate', (date) => {
|
18
|
-
return moment(date).toISOString();
|
19
|
-
});
|
20
|
-
// Set Relative Minimum Date
|
21
|
-
jsonLogic.add_operation('relativeMinDate', (relativeMinDate) => {
|
22
|
-
return moment().subtract(relativeMinDate, 'days').toISOString();
|
23
|
-
});
|
24
|
-
// Set Relative Maximum Date
|
25
|
-
jsonLogic.add_operation('relativeMaxDate', (relativeMaxDate) => {
|
26
|
-
return moment().add(relativeMaxDate, 'days').toISOString();
|
27
|
-
});
|
28
|
-
export { jsonLogic, ConditionOperators, moment };
|
14
|
+
dayjs.extend(timezone);
|
15
|
+
dayjs.extend(advancedFormat);
|
16
|
+
dayjs.extend(utc);
|
29
17
|
/**
|
30
18
|
* Evaluate a method.
|
31
19
|
* @param {Function|string|object} func - The function to evaluate.
|
@@ -211,7 +199,15 @@ export function checkSimpleConditional(component, condition, row, data, instance
|
|
211
199
|
return true;
|
212
200
|
}
|
213
201
|
const splittedConditionPath = conditionComponentPath.split('.');
|
214
|
-
const
|
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);
|
215
211
|
if (conditionalPaths.length > 0) {
|
216
212
|
return conditionalPaths.map((path) => {
|
217
213
|
const value = getComponentActualValue(path, data, row);
|
@@ -325,7 +321,7 @@ function getRow(component, row, instance, conditional) {
|
|
325
321
|
}
|
326
322
|
const dataParent = getDataParentComponent(instance);
|
327
323
|
if (dataParent) {
|
328
|
-
const parentPath = dataParent.paths?.
|
324
|
+
const parentPath = dataParent.paths?.localPath;
|
329
325
|
const isTriggerCondtionComponentPath = condition.when || !condition.conditions
|
330
326
|
? condition.when?.startsWith(dataParent.paths?.localPath)
|
331
327
|
: _.some(condition.conditions, cond => cond.component.startsWith(dataParent.paths?.localPath));
|
@@ -505,7 +501,7 @@ export function guid() {
|
|
505
501
|
/**
|
506
502
|
* Return a translated date setting.
|
507
503
|
* @param {string|Date} date - The date to translate.
|
508
|
-
* @returns {(null|
|
504
|
+
* @returns {(null|dayjs.Dayjs)} - The translated date.
|
509
505
|
*/
|
510
506
|
export function getDateSetting(date) {
|
511
507
|
if (_.isNil(date) || _.isNaN(date) || date === '') {
|
@@ -525,13 +521,13 @@ export function getDateSetting(date) {
|
|
525
521
|
try {
|
526
522
|
const value = Evaluator.evaluator(`return ${date};`, 'moment')(moment);
|
527
523
|
if (typeof value === 'string') {
|
528
|
-
dateSetting =
|
524
|
+
dateSetting = dayjs(value);
|
529
525
|
}
|
530
526
|
else if (typeof value.toDate === 'function') {
|
531
|
-
dateSetting =
|
527
|
+
dateSetting = dayjs(value.toDate().toUTCString());
|
532
528
|
}
|
533
529
|
else if (value instanceof Date) {
|
534
|
-
dateSetting =
|
530
|
+
dateSetting = dayjs(value);
|
535
531
|
}
|
536
532
|
}
|
537
533
|
catch (e) {
|
@@ -559,17 +555,17 @@ export function isValidDate(date) {
|
|
559
555
|
* @returns {string} - The current timezone.
|
560
556
|
*/
|
561
557
|
export function currentTimezone() {
|
562
|
-
if (
|
563
|
-
return
|
558
|
+
if (dayjs.currentTimezone) {
|
559
|
+
return dayjs.currentTimezone;
|
564
560
|
}
|
565
|
-
|
566
|
-
return
|
561
|
+
dayjs.currentTimezone = jtz.determine().name();
|
562
|
+
return dayjs.currentTimezone;
|
567
563
|
}
|
568
564
|
/**
|
569
565
|
* Get an offset date provided a date object and timezone object.
|
570
566
|
* @param {Date} date - The date to offset.
|
571
567
|
* @param {string} timezone - The timezone to offset the date to.
|
572
|
-
* @returns {Date} - The offset date.
|
568
|
+
* @returns {{date: Date, abbr: string}} - The offset date.
|
573
569
|
*/
|
574
570
|
export function offsetDate(date, timezone) {
|
575
571
|
if (timezone === 'UTC') {
|
@@ -578,134 +574,89 @@ export function offsetDate(date, timezone) {
|
|
578
574
|
abbr: 'UTC'
|
579
575
|
};
|
580
576
|
}
|
581
|
-
const dateMoment =
|
577
|
+
const dateMoment = dayjs(date).tz(timezone);
|
582
578
|
return {
|
583
579
|
date: new Date(date.getTime() + ((dateMoment.utcOffset() + date.getTimezoneOffset()) * 60000)),
|
584
580
|
abbr: dateMoment.format('z')
|
585
581
|
};
|
586
582
|
}
|
587
583
|
/**
|
588
|
-
* Returns if
|
589
|
-
* @returns {boolean} - TRUE if the zones are loaded; FALSE otherwise.
|
590
|
-
*/
|
591
|
-
export function zonesLoaded() {
|
592
|
-
return moment.zonesLoaded;
|
593
|
-
}
|
594
|
-
/**
|
595
|
-
* Returns if we should load the zones.
|
584
|
+
* Returns if we should handle a timezone difference.
|
596
585
|
* @param {string} timezone - The timezone to check if we should load the zones.
|
597
|
-
* @returns {boolean} - TRUE if we should
|
586
|
+
* @returns {boolean} - TRUE if we should handle timezones; FALSE otherwise.
|
598
587
|
*/
|
599
|
-
export function
|
600
|
-
|
601
|
-
return false;
|
602
|
-
}
|
603
|
-
return true;
|
604
|
-
}
|
605
|
-
/**
|
606
|
-
* Externally load the timezone data.
|
607
|
-
* @param {string} url - The URL to load the timezone data from.
|
608
|
-
* @param {string} timezone - The timezone to load.
|
609
|
-
* @returns {Promise<any> | *} - Resolves when the zones for this timezone are loaded.
|
610
|
-
*/
|
611
|
-
export function loadZones(url, timezone) {
|
612
|
-
if (timezone && !shouldLoadZones(timezone)) {
|
613
|
-
// Return non-resolving promise.
|
614
|
-
return new Promise(_.noop);
|
615
|
-
}
|
616
|
-
if (moment.zonesPromise) {
|
617
|
-
return moment.zonesPromise;
|
618
|
-
}
|
619
|
-
return moment.zonesPromise = fetch(url)
|
620
|
-
.then(resp => resp.json().then(zones => {
|
621
|
-
moment.tz.load(zones);
|
622
|
-
moment.zonesLoaded = true;
|
623
|
-
// Trigger a global event that the timezones have finished loading.
|
624
|
-
if (document && document.createEvent && document.body && document.body.dispatchEvent) {
|
625
|
-
var event = document.createEvent('Event');
|
626
|
-
event.initEvent('zonesLoaded', true, true);
|
627
|
-
document.body.dispatchEvent(event);
|
628
|
-
}
|
629
|
-
}));
|
588
|
+
export function shouldHandleTimezone(timezone) {
|
589
|
+
return !(timezone === currentTimezone() || timezone === 'UTC');
|
630
590
|
}
|
631
591
|
/**
|
632
|
-
* Get the
|
633
|
-
* @param {string|Date} value - The value to convert into a
|
592
|
+
* Get the Dayjs date object for translating dates with timezones.
|
593
|
+
* @param {string|Date} value - The value to convert into a dayjs date.
|
634
594
|
* @param {string} format - The format to convert the date to.
|
635
595
|
* @param {string} timezone - The timezone to convert the date to.
|
636
596
|
* @param {object} options - The options object
|
637
|
-
* @returns {
|
597
|
+
* @returns {dayjs.Dayjs} - The dayjs date object.
|
638
598
|
*/
|
639
|
-
export function
|
640
|
-
const
|
599
|
+
export function dayjsDate(value, format, timezone, options) {
|
600
|
+
const dayjsDate = dayjs(value);
|
641
601
|
if (!timezone) {
|
642
|
-
return
|
602
|
+
return dayjsDate;
|
643
603
|
}
|
644
604
|
if (timezone === 'UTC') {
|
645
605
|
timezone = 'Etc/UTC';
|
646
606
|
}
|
647
|
-
if ((timezone !== currentTimezone() || (format && format.match(/\s(z$|z\s)/))) && (
|
648
|
-
return
|
607
|
+
if ((timezone !== currentTimezone() || (format && format.match(/\s(z$|z\s)/))) && (shouldHandleTimezone(timezone) || options?.email)) {
|
608
|
+
return dayjsDate.tz(timezone);
|
649
609
|
}
|
650
|
-
return
|
610
|
+
return dayjsDate;
|
651
611
|
}
|
652
612
|
/**
|
653
613
|
* Format a date provided a value, format, and timezone object.
|
654
|
-
* @param {string} timezonesUrl - The URL to load the timezone data from.
|
655
614
|
* @param {string|Date} value - The value to format.
|
656
615
|
* @param {string} format - The format to format the date to.
|
657
616
|
* @param {string} timezone - The timezone to format the date to.
|
658
617
|
* @param {string} flatPickrInputFormat - The format to use for flatpickr input.
|
659
618
|
* @returns {string} - The formatted date.
|
660
619
|
*/
|
661
|
-
export function formatDate(
|
662
|
-
const
|
620
|
+
export function formatDate(value, format, timezone, flatPickrInputFormat) {
|
621
|
+
const dayjsDate = dayjs(value, flatPickrInputFormat || undefined);
|
663
622
|
if (timezone === currentTimezone()) {
|
664
623
|
// See if our format contains a "z" timezone character.
|
665
624
|
if (format.match(/\s(z$|z\s)/)) {
|
666
|
-
|
667
|
-
|
668
|
-
return momentDate.tz(timezone).format(convertFormatToMoment(format));
|
625
|
+
if (shouldHandleTimezone(timezone)) {
|
626
|
+
return dayjsDate.tz(timezone).format(convertFormatToDayjs(format));
|
669
627
|
}
|
670
628
|
else {
|
671
|
-
return
|
629
|
+
return dayjsDate.format(convertFormatToDayjs(format.replace(/\s(z$|z\s)/, '')));
|
672
630
|
}
|
673
631
|
}
|
674
632
|
// Return the standard format.
|
675
|
-
return
|
633
|
+
return dayjsDate.format(convertFormatToDayjs(format));
|
676
634
|
}
|
677
635
|
if (timezone === 'UTC') {
|
678
|
-
const offset = offsetDate(
|
679
|
-
return `${
|
680
|
-
}
|
681
|
-
// Load the zones since we need timezone information.
|
682
|
-
loadZones(timezonesUrl);
|
683
|
-
if (moment.zonesLoaded && timezone) {
|
684
|
-
return momentDate.tz(timezone).format(`${convertFormatToMoment(format)} z`);
|
636
|
+
const offset = offsetDate(dayjsDate.toDate(), 'UTC');
|
637
|
+
return `${dayjs(offset.date).format(convertFormatToDayjs(format))} UTC`;
|
685
638
|
}
|
686
|
-
|
687
|
-
return
|
639
|
+
if (shouldHandleTimezone(timezone)) {
|
640
|
+
return dayjsDate.tz(timezone).format(`${convertFormatToDayjs(format)} z`);
|
688
641
|
}
|
642
|
+
return dayjsDate.format(convertFormatToDayjs(format));
|
689
643
|
}
|
690
644
|
/**
|
691
645
|
* Pass a format function to format within a timezone.
|
692
|
-
* @param {string} timezonesUrl - The URL to load the timezone data from.
|
693
646
|
* @param {Function} formatFn - The format function to use.
|
694
647
|
* @param {Date|string} date - The date to format.
|
695
648
|
* @param {string} format - The format to format the date to.
|
696
649
|
* @param {string} timezone - The timezone to format the date to.
|
697
650
|
* @returns {string} - The formatted date.
|
698
651
|
*/
|
699
|
-
export function formatOffset(
|
652
|
+
export function formatOffset(formatFn, date, format, timezone) {
|
700
653
|
if (timezone === currentTimezone()) {
|
701
654
|
return formatFn(date, format);
|
702
655
|
}
|
703
656
|
if (timezone === 'UTC') {
|
704
657
|
return `${formatFn(offsetDate(date, 'UTC').date, format)} UTC`;
|
705
658
|
}
|
706
|
-
|
707
|
-
loadZones(timezonesUrl);
|
708
|
-
if (moment.zonesLoaded) {
|
659
|
+
if (shouldHandleTimezone(timezone)) {
|
709
660
|
const offset = offsetDate(date, timezone);
|
710
661
|
return `${formatFn(offset.date, format)} ${offset.abbr}`;
|
711
662
|
}
|
@@ -762,7 +713,7 @@ export function convertFormatToFlatpickr(format) {
|
|
762
713
|
* @param {string} format - The format to convert.
|
763
714
|
* @returns {string} - The converted format.
|
764
715
|
*/
|
765
|
-
export function
|
716
|
+
export function convertFormatToDayjs(format) {
|
766
717
|
return format
|
767
718
|
// Year conversion.
|
768
719
|
.replace(/y/g, 'Y')
|
@@ -1311,11 +1262,10 @@ export function sanitize(string, options) {
|
|
1311
1262
|
export function fastCloneDeep(obj) {
|
1312
1263
|
return obj ? JSON.parse(JSON.stringify(obj)) : obj;
|
1313
1264
|
}
|
1314
|
-
export { Evaluator, interpolate };
|
1315
1265
|
/**
|
1316
1266
|
* Returns if the component is an input component.
|
1317
1267
|
* @param {import('@formio/core').Component} componentJson - The JSON of a component.
|
1318
|
-
* @returns {
|
1268
|
+
* @returns {boolean} - TRUE if the component is an input component; FALSE otherwise.
|
1319
1269
|
*/
|
1320
1270
|
export function isInputComponent(componentJson) {
|
1321
1271
|
if (componentJson.input === false || componentJson.input === true) {
|
@@ -1339,7 +1289,7 @@ export function isInputComponent(componentJson) {
|
|
1339
1289
|
/**
|
1340
1290
|
* Takes a component path, and returns a component path array.
|
1341
1291
|
* @param {string} pathStr - The path string to convert to an array.
|
1342
|
-
* @returns {
|
1292
|
+
* @returns {Array<string>} - The array of paths.
|
1343
1293
|
*/
|
1344
1294
|
export function getArrayFromComponentPath(pathStr) {
|
1345
1295
|
if (!pathStr || !_.isString(pathStr)) {
|
@@ -1513,8 +1463,6 @@ export function getFocusableElements(element) {
|
|
1513
1463
|
textarea:not([disabled]), button:not([disabled]), [href]`;
|
1514
1464
|
return element.querySelectorAll(focusableSelector);
|
1515
1465
|
}
|
1516
|
-
// Export lodash to save space with other libraries.
|
1517
|
-
export { _ };
|
1518
1466
|
export const componentValueTypes = {
|
1519
1467
|
number: 'number',
|
1520
1468
|
string: 'string',
|
@@ -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
|
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, hasEncodedTimezone, } 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 =
|
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
|
221
|
+
return dayjsDate(date, this.valueFormat, this.timezone).format(convertFormatToDayjs(format));
|
245
222
|
}
|
246
|
-
return moment(date).format(
|
223
|
+
return moment(date).format(convertFormatToDayjs(format));
|
247
224
|
}
|
248
225
|
/**
|
249
226
|
* Return the value of the selected date.
|
@@ -275,18 +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(
|
255
|
+
value = value ? formatDate(value, convertFormatToDayjs(this.settings.format), this.timezone, convertFormatToDayjs(this.valueMomentFormat)) : value;
|
279
256
|
return super.setValue(value);
|
280
257
|
}
|
281
258
|
// If the component is a textfield that does not have timezone information included in the string value then skip
|
282
259
|
// the timezone offset
|
283
|
-
|
284
|
-
this.settings.skipOffset = true;
|
285
|
-
}
|
286
|
-
const zonesLoading = this.loadZones();
|
260
|
+
this.settings.skipOffset = this.component.type === 'textfield' && !hasEncodedTimezone(value);
|
287
261
|
if (value) {
|
288
|
-
if (!saveAsText && this.settings.readOnly
|
289
|
-
this.calendar.setDate(
|
262
|
+
if (!saveAsText && this.settings.readOnly) {
|
263
|
+
this.calendar.setDate(dayjsDate(value, this.valueFormat, this.timezone).format(), false);
|
290
264
|
}
|
291
265
|
else if (this.isValueISO8601(value)) {
|
292
266
|
this.calendar.setDate(value, false);
|
@@ -299,13 +273,13 @@ export default class CalendarWidget extends InputWidget {
|
|
299
273
|
this.calendar.clear(false);
|
300
274
|
}
|
301
275
|
}
|
302
|
-
getValueAsString(value, format) {
|
276
|
+
getValueAsString(value, format = '') {
|
303
277
|
const inputFormat = format || this.dateFormat;
|
304
278
|
const valueFormat = this.calendar ? this.valueFormat : this.settings.dateFormat;
|
305
279
|
if (this.settings.saveAs === 'text' && this.componentInstance.parent && !this.settings.readOnly) {
|
306
|
-
return moment(value,
|
280
|
+
return moment(value, convertFormatToDayjs(valueFormat)).format(convertFormatToDayjs(valueFormat));
|
307
281
|
}
|
308
|
-
return formatDate(
|
282
|
+
return formatDate(value, inputFormat, this.timezone, convertFormatToDayjs(valueFormat));
|
309
283
|
}
|
310
284
|
setErrorClasses(hasErrors) {
|
311
285
|
if (!this.input) {
|
@@ -396,7 +370,7 @@ export default class CalendarWidget extends InputWidget {
|
|
396
370
|
const relatedTarget = event.relatedTarget ? event.relatedTarget : activeElement;
|
397
371
|
if (!(isIEBrowser && !relatedTarget) && !this.isCalendarElement(relatedTarget)) {
|
398
372
|
const inputValue = this.calendar.input.value;
|
399
|
-
const dateValue = inputValue ? moment(this.calendar.input.value,
|
373
|
+
const dateValue = inputValue ? moment(this.calendar.input.value, convertFormatToDayjs(this.valueFormat)).toDate() : inputValue;
|
400
374
|
this.calendar.setDate(dateValue, true, this.settings.altFormat);
|
401
375
|
}
|
402
376
|
else if (!this.calendar.input.value && this.calendar.config.noCalendar) {
|
@@ -448,14 +422,14 @@ export default class CalendarWidget extends InputWidget {
|
|
448
422
|
return (date, format) => {
|
449
423
|
// Only format this if this is the altFormat and the form is readOnly.
|
450
424
|
if (this.settings.readOnly && (format === this.settings.altFormat)) {
|
451
|
-
if (!this.settings.enableTime || this.
|
425
|
+
if (!this.settings.enableTime || this.settings.skipOffset) {
|
452
426
|
return Flatpickr.formatDate(date, format);
|
453
427
|
}
|
454
428
|
const currentValue = new Date(this.getValue());
|
455
429
|
if (currentValue.toString() === date.toString()) {
|
456
|
-
return formatOffset(
|
430
|
+
return formatOffset(Flatpickr.formatDate.bind(Flatpickr), new Date(this.componentValue), format, this.timezone);
|
457
431
|
}
|
458
|
-
return formatOffset(
|
432
|
+
return formatOffset(Flatpickr.formatDate.bind(Flatpickr), date, format, this.timezone);
|
459
433
|
}
|
460
434
|
return Flatpickr.formatDate(date, format);
|
461
435
|
};
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@formio/js",
|
3
|
-
"version": "5.1.0-dev.
|
3
|
+
"version": "5.1.0-dev.6112.86987a5",
|
4
4
|
"description": "JavaScript powered Forms with JSON Form Builder",
|
5
5
|
"main": "lib/cjs/index.js",
|
6
6
|
"exports": {
|
@@ -81,7 +81,7 @@
|
|
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": "
|
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",
|
@@ -92,6 +92,7 @@
|
|
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
98
|
"dompurify": "^3.2.5",
|
@@ -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
|
-
};
|
package/lib/cjs/utils/i18n.d.ts
DELETED
@@ -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
|
-
}
|