@formio/js 5.5.1 → 5.6.0

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 (67) hide show
  1. package/README.md +2 -2
  2. package/dist/formio.builder.css +26 -1
  3. package/dist/formio.builder.min.css +1 -1
  4. package/dist/formio.embed.js +1 -1
  5. package/dist/formio.embed.min.js +1 -1
  6. package/dist/formio.embed.min.js.LICENSE.txt +1 -1
  7. package/dist/formio.form.css +26 -1
  8. package/dist/formio.form.js +39 -215
  9. package/dist/formio.form.min.css +1 -1
  10. package/dist/formio.form.min.js +1 -1
  11. package/dist/formio.form.min.js.LICENSE.txt +2 -2
  12. package/dist/formio.full.css +26 -1
  13. package/dist/formio.full.js +41 -217
  14. package/dist/formio.full.min.css +1 -1
  15. package/dist/formio.full.min.js +1 -1
  16. package/dist/formio.full.min.js.LICENSE.txt +2 -2
  17. package/dist/formio.js +316 -185
  18. package/dist/formio.min.js +1 -1
  19. package/dist/formio.min.js.LICENSE.txt +12 -2
  20. package/dist/formio.utils.js +15 -15
  21. package/dist/formio.utils.min.js +1 -1
  22. package/dist/formio.utils.min.js.LICENSE.txt +2 -2
  23. package/lib/cjs/Embed.js +1 -1
  24. package/lib/cjs/Formio.js +1 -1
  25. package/lib/cjs/PDF.js +5 -0
  26. package/lib/cjs/Wizard.d.ts +5 -0
  27. package/lib/cjs/Wizard.js +22 -0
  28. package/lib/cjs/components/_classes/component/Component.js +2 -1
  29. package/lib/cjs/components/address/Address.js +5 -2
  30. package/lib/cjs/components/address/editForm/Address.edit.provider.d.ts +24 -0
  31. package/lib/cjs/components/address/editForm/Address.edit.provider.js +13 -0
  32. package/lib/cjs/components/datagrid/DataGrid.js +2 -1
  33. package/lib/cjs/components/file/File.js +17 -8
  34. package/lib/cjs/components/file/editForm/File.edit.file.d.ts +44 -0
  35. package/lib/cjs/components/file/editForm/File.edit.file.js +2 -1
  36. package/lib/cjs/components/form/Form.d.ts +7 -0
  37. package/lib/cjs/components/form/Form.js +24 -2
  38. package/lib/cjs/components/signature/Signature.js +2 -2
  39. package/lib/cjs/package.json +1 -1
  40. package/lib/cjs/providers/address/GoogleAddressProvider.d.ts +9 -1
  41. package/lib/cjs/providers/address/GoogleAddressProvider.js +116 -32
  42. package/lib/cjs/providers/storage/indexeddb.js +2 -2
  43. package/lib/cjs/utils/utils.d.ts +2 -5
  44. package/lib/cjs/utils/utils.js +2 -13
  45. package/lib/mjs/Embed.js +1 -1
  46. package/lib/mjs/Formio.js +1 -1
  47. package/lib/mjs/PDF.js +4 -0
  48. package/lib/mjs/Wizard.d.ts +5 -0
  49. package/lib/mjs/Wizard.js +22 -0
  50. package/lib/mjs/components/_classes/component/Component.js +1 -1
  51. package/lib/mjs/components/address/Address.js +5 -2
  52. package/lib/mjs/components/address/editForm/Address.edit.provider.d.ts +24 -0
  53. package/lib/mjs/components/address/editForm/Address.edit.provider.js +13 -0
  54. package/lib/mjs/components/datagrid/DataGrid.js +2 -1
  55. package/lib/mjs/components/file/File.js +17 -8
  56. package/lib/mjs/components/file/editForm/File.edit.file.d.ts +44 -0
  57. package/lib/mjs/components/file/editForm/File.edit.file.js +2 -1
  58. package/lib/mjs/components/form/Form.d.ts +7 -0
  59. package/lib/mjs/components/form/Form.js +24 -2
  60. package/lib/mjs/components/signature/Signature.js +2 -2
  61. package/lib/mjs/package.json +1 -1
  62. package/lib/mjs/providers/address/GoogleAddressProvider.d.ts +9 -1
  63. package/lib/mjs/providers/address/GoogleAddressProvider.js +94 -32
  64. package/lib/mjs/providers/storage/indexeddb.js +2 -2
  65. package/lib/mjs/utils/utils.d.ts +2 -5
  66. package/lib/mjs/utils/utils.js +3 -12
  67. package/package.json +7 -8
@@ -18,6 +18,7 @@ declare const _default: ({
18
18
  editor?: undefined;
19
19
  as?: undefined;
20
20
  logic?: undefined;
21
+ clearOnHide?: undefined;
21
22
  optionsLabelPosition?: undefined;
22
23
  inline?: undefined;
23
24
  defaultValue?: undefined;
@@ -48,6 +49,7 @@ declare const _default: ({
48
49
  editor?: undefined;
49
50
  as?: undefined;
50
51
  logic?: undefined;
52
+ clearOnHide?: undefined;
51
53
  optionsLabelPosition?: undefined;
52
54
  inline?: undefined;
53
55
  defaultValue?: undefined;
@@ -95,6 +97,7 @@ declare const _default: ({
95
97
  editor?: undefined;
96
98
  as?: undefined;
97
99
  logic?: undefined;
100
+ clearOnHide?: undefined;
98
101
  optionsLabelPosition?: undefined;
99
102
  inline?: undefined;
100
103
  defaultValue?: undefined;
@@ -125,6 +128,7 @@ declare const _default: ({
125
128
  editor?: undefined;
126
129
  as?: undefined;
127
130
  logic?: undefined;
131
+ clearOnHide?: undefined;
128
132
  optionsLabelPosition?: undefined;
129
133
  inline?: undefined;
130
134
  defaultValue?: undefined;
@@ -161,6 +165,7 @@ declare const _default: ({
161
165
  editor?: undefined;
162
166
  as?: undefined;
163
167
  logic?: undefined;
168
+ clearOnHide?: undefined;
164
169
  optionsLabelPosition?: undefined;
165
170
  inline?: undefined;
166
171
  defaultValue?: undefined;
@@ -191,6 +196,7 @@ declare const _default: ({
191
196
  tableView?: undefined;
192
197
  components?: undefined;
193
198
  logic?: undefined;
199
+ clearOnHide?: undefined;
194
200
  optionsLabelPosition?: undefined;
195
201
  inline?: undefined;
196
202
  defaultValue?: undefined;
@@ -237,6 +243,7 @@ declare const _default: ({
237
243
  rows?: undefined;
238
244
  editor?: undefined;
239
245
  as?: undefined;
246
+ clearOnHide?: undefined;
240
247
  optionsLabelPosition?: undefined;
241
248
  inline?: undefined;
242
249
  defaultValue?: undefined;
@@ -259,6 +266,7 @@ declare const _default: ({
259
266
  editor?: undefined;
260
267
  as?: undefined;
261
268
  logic?: undefined;
269
+ clearOnHide?: undefined;
262
270
  optionsLabelPosition?: undefined;
263
271
  inline?: undefined;
264
272
  defaultValue?: undefined;
@@ -281,6 +289,7 @@ declare const _default: ({
281
289
  editor?: undefined;
282
290
  as?: undefined;
283
291
  logic?: undefined;
292
+ clearOnHide?: undefined;
284
293
  optionsLabelPosition?: undefined;
285
294
  inline?: undefined;
286
295
  defaultValue?: undefined;
@@ -311,6 +320,7 @@ declare const _default: ({
311
320
  editor?: undefined;
312
321
  as?: undefined;
313
322
  logic?: undefined;
323
+ clearOnHide?: undefined;
314
324
  optionsLabelPosition?: undefined;
315
325
  inline?: undefined;
316
326
  defaultValue?: undefined;
@@ -323,6 +333,7 @@ declare const _default: ({
323
333
  placeholder: string;
324
334
  tooltip: string;
325
335
  weight: number;
336
+ clearOnHide: boolean;
326
337
  conditional: {
327
338
  json: {
328
339
  '==': (boolean | {
@@ -345,6 +356,37 @@ declare const _default: ({
345
356
  inline?: undefined;
346
357
  defaultValue?: undefined;
347
358
  values?: undefined;
359
+ } | {
360
+ type: string;
361
+ input: boolean;
362
+ key: string;
363
+ label: string;
364
+ placeholder: string;
365
+ tooltip: string;
366
+ weight: number;
367
+ conditional: {
368
+ json: {
369
+ '==': (boolean | {
370
+ var: string;
371
+ })[];
372
+ '==='?: undefined;
373
+ in?: undefined;
374
+ };
375
+ };
376
+ valueProperty?: undefined;
377
+ dataSrc?: undefined;
378
+ data?: undefined;
379
+ tableView?: undefined;
380
+ components?: undefined;
381
+ rows?: undefined;
382
+ editor?: undefined;
383
+ as?: undefined;
384
+ logic?: undefined;
385
+ clearOnHide?: undefined;
386
+ optionsLabelPosition?: undefined;
387
+ inline?: undefined;
388
+ defaultValue?: undefined;
389
+ values?: undefined;
348
390
  } | {
349
391
  type: string;
350
392
  input: boolean;
@@ -370,6 +412,7 @@ declare const _default: ({
370
412
  editor?: undefined;
371
413
  as?: undefined;
372
414
  logic?: undefined;
415
+ clearOnHide?: undefined;
373
416
  } | {
374
417
  type: string;
375
418
  input: boolean;
@@ -393,6 +436,7 @@ declare const _default: ({
393
436
  editor?: undefined;
394
437
  as?: undefined;
395
438
  logic?: undefined;
439
+ clearOnHide?: undefined;
396
440
  optionsLabelPosition?: undefined;
397
441
  inline?: undefined;
398
442
  defaultValue?: undefined;
@@ -290,8 +290,9 @@ export default [
290
290
  key: 'imageSize',
291
291
  label: 'Image Size',
292
292
  placeholder: '100',
293
- tooltip: 'The image size for previewing images.',
293
+ tooltip: 'The image size, in square pixels, for previewing images.',
294
294
  weight: 40,
295
+ clearOnHide: false,
295
296
  conditional: {
296
297
  json: {
297
298
  '==': [{ var: 'data.image' }, true],
@@ -63,6 +63,13 @@ export default class FormComponent extends Component {
63
63
  checkComponentConditions(data: any, flags: any, row: any): any;
64
64
  calculateValue(data: any, flags: any, row: any): any;
65
65
  setPristine(pristine: any): void;
66
+ /**
67
+ * Determine if an ancestor is hidden by the `hidden` JSON flag alone. An ancestor that has its
68
+ * own condition is governed by that condition instead and is left to `parentConditionallyHidden`
69
+ * — the `hidden` flag and conditionally-hidden are distinct states (FIO-11691).
70
+ * @returns {boolean} - TRUE if an ancestor is hidden in the JSON and has no condition.
71
+ */
72
+ hasAncestorHiddenInJsonOnly(): boolean;
66
73
  /**
67
74
  * Determine if the subform should be submitted.
68
75
  * @returns {*|boolean} - TRUE if the subform should be submitted, FALSE if it should not.
@@ -554,16 +554,38 @@ export default class FormComponent extends Component {
554
554
  this.subForm.setPristine(pristine);
555
555
  }
556
556
  }
557
+ /**
558
+ * Determine if an ancestor is hidden by the `hidden` JSON flag alone. An ancestor that has its
559
+ * own condition is governed by that condition instead and is left to `parentConditionallyHidden`
560
+ * — the `hidden` flag and conditionally-hidden are distinct states (FIO-11691).
561
+ * @returns {boolean} - TRUE if an ancestor is hidden in the JSON and has no condition.
562
+ */
563
+ hasAncestorHiddenInJsonOnly() {
564
+ let currentParent = this.parent;
565
+ while (currentParent) {
566
+ if (currentParent.component.hidden && !currentParent.hasCondition()) {
567
+ return true;
568
+ }
569
+ currentParent = currentParent.parent;
570
+ }
571
+ return false;
572
+ }
557
573
  /**
558
574
  * Determine if the subform should be submitted.
559
575
  * @returns {*|boolean} - TRUE if the subform should be submitted, FALSE if it should not.
560
576
  */
561
577
  get shouldSubmit() {
578
+ const savesAsReference = !this.component.hasOwnProperty('reference') || this.component.reference;
562
579
  const hiddenByJsonOnly = !this.hasCondition() && this.component.hidden;
580
+ // Layout ancestors (fieldset, panel, tabs...) hide us without appearing in our data path, so
581
+ // their hidden state is only reachable by walking the instance chain (FIO-9879).
582
+ const hiddenByAncestor = this.hasAncestorHiddenInJsonOnly() || this.parentConditionallyHidden();
583
+ // Gate on our own clearOnHide, never an ancestor's.
584
+ const clearedWhileHidden = (hiddenByJsonOnly || hiddenByAncestor) && this.component.clearOnHide;
563
585
  return (this.subFormReady &&
564
- (!this.component.hasOwnProperty('reference') || this.component.reference) &&
586
+ savesAsReference &&
565
587
  !this.shouldConditionallyClear() &&
566
- !(hiddenByJsonOnly && this.component.clearOnHide));
588
+ !clearedWhileHidden);
567
589
  }
568
590
  /**
569
591
  * Returns the data for the subform.
@@ -199,7 +199,7 @@ export default class SignatureComponent extends Input {
199
199
  penColor: this.component.penColor,
200
200
  backgroundColor: this.component.backgroundColor,
201
201
  });
202
- this.signaturePad.addEventListener('endStroke', () => this.setValue(this.signaturePad.toDataURL()));
202
+ this.signaturePad.addEventListener('endStroke', () => this.setValue(this.signaturePad.toDataURL(), { modified: true }));
203
203
  this.refs.signatureImage.setAttribute('src', this.signaturePad.toDataURL());
204
204
  this.onDisabled();
205
205
  // Ensure the signature is always the size of its container.
@@ -228,7 +228,7 @@ export default class SignatureComponent extends Input {
228
228
  event.preventDefault();
229
229
  this.showCanvas(true);
230
230
  this.signaturePad.clear();
231
- this.setValue(this.defaultValue);
231
+ this.setValue(this.defaultValue, { modified: true });
232
232
  });
233
233
  this.setValue(this.dataValue);
234
234
  return superAttach;
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "type": "module",
3
- "version": "5.5.1"
3
+ "version": "5.6.0"
4
4
 
5
5
  }
@@ -39,6 +39,14 @@ export class GoogleAddressProvider extends AddressProvider {
39
39
  * @returns {string} The alternative property to use for display value.
40
40
  */
41
41
  get alternativeDisplayValueProperty(): string;
42
+ /**
43
+ * @returns {string} The property to use for display value on places returned by the new Places API.
44
+ */
45
+ get newApiDisplayValueProperty(): string;
46
+ /**
47
+ * @returns {boolean} Whether the provider is configured to use the new Places API.
48
+ */
49
+ get usesNewPlacesApi(): boolean;
42
50
  /**
43
51
  * @param {AutocompleteOptions} options - The autocomplete options.
44
52
  */
@@ -78,7 +86,7 @@ export class GoogleAddressProvider extends AddressProvider {
78
86
  */
79
87
  addRequiredProviderOptions(options: AutocompleteOptions): void;
80
88
  filterPlace(place: any): {};
81
- attachAutocomplete(elem: any, index: any, onSelectAddress: any): any;
89
+ attachAutocomplete(elem: any, index: any, onSelectAddress: any, disable?: boolean): any;
82
90
  search(): Promise<void>;
83
91
  makeRequest(): Promise<void>;
84
92
  getDisplayValue(address: any): any;
@@ -5,6 +5,7 @@ import { AddressProvider } from './AddressProvider';
5
5
  const GOOGLE_MAPS_BASE_URL = 'https://maps.googleapis.com';
6
6
  const GOOGLE_MAPS_JS_URL = `${GOOGLE_MAPS_BASE_URL}/maps/api/js`;
7
7
  const GOOGLE_MAPS_JS_WITH_PARAMS_URL = `${GOOGLE_MAPS_JS_URL}?v=quarterly&libraries=places&loading=async&callback=googleMapsCallback`;
8
+ const NEW_PLACES_API_VERSION = 'newPlacesApi';
8
9
  /**
9
10
  * @typedef {object} AutocompleteOptions
10
11
  * @property {string[]} fields - The fields to include in the autocomplete response.
@@ -71,6 +72,18 @@ export class GoogleAddressProvider extends AddressProvider {
71
72
  get alternativeDisplayValueProperty() {
72
73
  return 'formatted_address';
73
74
  }
75
+ /**
76
+ * @returns {string} The property to use for display value on places returned by the new Places API.
77
+ */
78
+ get newApiDisplayValueProperty() {
79
+ return 'formattedAddress';
80
+ }
81
+ /**
82
+ * @returns {boolean} Whether the provider is configured to use the new Places API.
83
+ */
84
+ get usesNewPlacesApi() {
85
+ return this.options?.version === NEW_PLACES_API_VERSION;
86
+ }
74
87
  /**
75
88
  * @param {AutocompleteOptions} options - The autocomplete options.
76
89
  */
@@ -88,10 +101,11 @@ export class GoogleAddressProvider extends AddressProvider {
88
101
 
89
102
  */
90
103
  setAutocompleteOptions() {
91
- let options = _.get(this.options, 'autocompleteOptions', {});
92
- if (!_.isObject(options)) {
93
- options = {};
94
- }
104
+ // Clone so the stored provider options are never mutated: the required fields
105
+ // differ per Places API version, and stale fields from a previous computation
106
+ // must not leak into the next one (FIO-10428).
107
+ const storedOptions = _.get(this.options, 'autocompleteOptions', {});
108
+ const options = _.isObject(storedOptions) ? _.cloneDeep(storedOptions) : {};
95
109
  this.addRequiredProviderOptions(options);
96
110
  this.autocompleteOptions = options;
97
111
  }
@@ -131,14 +145,9 @@ export class GoogleAddressProvider extends AddressProvider {
131
145
  * @returns {string[]} The required address properties.
132
146
  */
133
147
  getRequiredAddressProperties() {
134
- return [
135
- 'address_components',
136
- 'formatted_address',
137
- 'geometry',
138
- 'place_id',
139
- 'plus_code',
140
- 'types',
141
- ];
148
+ return this.usesNewPlacesApi
149
+ ? ['addressComponents', 'formattedAddress', 'location', 'viewport', 'id', 'plusCode', 'types']
150
+ : ['address_components', 'formatted_address', 'geometry', 'place_id', 'plus_code', 'types'];
142
151
  }
143
152
  /**
144
153
  * Adds the required provider options to the options.
@@ -167,24 +176,75 @@ export class GoogleAddressProvider extends AddressProvider {
167
176
  }
168
177
  return filteredPlace;
169
178
  }
170
- attachAutocomplete(elem, index, onSelectAddress) {
179
+ attachAutocomplete(elem, index, onSelectAddress, disable = false) {
180
+ if (disable) {
181
+ return Promise.resolve();
182
+ }
171
183
  return Formio.libraryReady(this.getLibraryName()).then(() => {
172
- const autocomplete = new google.maps.places.Autocomplete(elem, this.autocompleteOptions);
173
- const listener = autocomplete.addListener('place_changed', () => {
174
- const place = this.filterPlace(autocomplete.getPlace());
175
- place.formattedPlace = _.get(autocomplete, 'gm_accessors_.place.se.formattedPrediction', place[this.alternativeDisplayValueProperty]);
176
- onSelectAddress(place, elem, index);
177
- });
178
- return () => {
179
- if (google?.maps?.event) {
180
- google.maps.event.clearInstanceListeners(autocomplete);
181
- google.maps.event.removeListener(listener);
182
- }
183
- document.querySelectorAll('.pac-container').forEach((node) => {
184
- if (node.parentNode) {
185
- node.parentNode.removeChild(node);
186
- }
184
+ this.setAutocompleteOptions();
185
+ if (!this.usesNewPlacesApi) {
186
+ const autocomplete = new google.maps.places.Autocomplete(elem, this.autocompleteOptions);
187
+ const listener = autocomplete.addListener('place_changed', () => {
188
+ const place = this.filterPlace(autocomplete.getPlace());
189
+ place.formattedPlace = _.get(autocomplete, 'gm_accessors_.place.se.formattedPrediction', place[this.alternativeDisplayValueProperty]);
190
+ onSelectAddress(place, elem, index);
187
191
  });
192
+ return () => {
193
+ if (google?.maps?.event) {
194
+ google.maps.event.clearInstanceListeners(autocomplete);
195
+ google.maps.event.removeListener(listener);
196
+ }
197
+ document.querySelectorAll('.pac-container').forEach((node) => {
198
+ if (node.parentNode) {
199
+ node.parentNode.removeChild(node);
200
+ }
201
+ });
202
+ };
203
+ }
204
+ const { fields, componentRestrictions, ...elementOptions } = this.autocompleteOptions;
205
+ const country = componentRestrictions?.country;
206
+ if (country) {
207
+ // The new element spells legacy componentRestrictions.country as includedRegionCodes.
208
+ elementOptions.includedRegionCodes = _.castArray(country);
209
+ }
210
+ elementOptions.noInputIcon = true;
211
+ const autocomplete = new google.maps.places.PlaceAutocompleteElement(elementOptions);
212
+ if (elem?.value) {
213
+ autocomplete.value = elem.value;
214
+ }
215
+ autocomplete.classList.add('form-control');
216
+ // Replace the existing element with the autocomplete element
217
+ elem.parentNode.replaceChildren(autocomplete);
218
+ const handlePlaceSelect = async (event) => {
219
+ let selectedPlace;
220
+ try {
221
+ const place = event.placePrediction.toPlace();
222
+ await place.fetchFields({
223
+ fields: fields || this.getRequiredAddressProperties(),
224
+ });
225
+ const convertedPlace = {
226
+ addressComponents: place.addressComponents || [],
227
+ formattedAddress: place.formattedAddress || '',
228
+ location: place.location || {},
229
+ viewport: place.viewport || {},
230
+ id: place.id || '',
231
+ plusCode: place.plusCode || {},
232
+ types: place.types || [],
233
+ };
234
+ selectedPlace = this.filterPlace(convertedPlace);
235
+ selectedPlace.formattedPlace = convertedPlace.formattedAddress;
236
+ }
237
+ catch (err) {
238
+ // fetchFields rejections are otherwise swallowed by the Maps event
239
+ // dispatcher; never let a failed details request drop the selection.
240
+ console.warn(`Unable to fetch the selected place's details: ${err}`);
241
+ selectedPlace = { formattedPlace: String(event.placePrediction?.text ?? '') };
242
+ }
243
+ onSelectAddress(selectedPlace, elem, index);
244
+ };
245
+ autocomplete.addEventListener('gmp-select', handlePlaceSelect);
246
+ return () => {
247
+ autocomplete.removeEventListener('gmp-select', handlePlaceSelect);
188
248
  };
189
249
  });
190
250
  }
@@ -195,10 +255,12 @@ export class GoogleAddressProvider extends AddressProvider {
195
255
  return Promise.resolve();
196
256
  }
197
257
  getDisplayValue(address) {
198
- const displayedProperty = _.has(address, this.displayValueProperty)
199
- ? this.displayValueProperty
200
- : this.alternativeDisplayValueProperty;
201
- return _.get(address, displayedProperty, '');
258
+ const displayedProperty = [
259
+ this.displayValueProperty,
260
+ this.alternativeDisplayValueProperty,
261
+ this.newApiDisplayValueProperty,
262
+ ].find((property) => _.has(address, property));
263
+ return displayedProperty ? _.get(address, displayedProperty, '') : '';
202
264
  }
203
265
  /**
204
266
  * Tries to remove the library if api key for loaded script is different.
@@ -1,4 +1,4 @@
1
- import { v4 as uuidv4 } from 'uuid';
1
+ import { guid } from '../../utils/utils';
2
2
  /**
3
3
  * indexedDb provider for file storage.
4
4
  * @returns {import('./typedefs').FileProvider} The FileProvider interface defined in index.js.
@@ -27,7 +27,7 @@ function indexeddb() {
27
27
  return new Promise((resolve, reject) => {
28
28
  reader.onload = () => {
29
29
  const blobObject = new Blob([file], { type: file.type });
30
- const id = uuidv4(blobObject);
30
+ const id = guid();
31
31
  const data = {
32
32
  id,
33
33
  data: blobObject,
@@ -163,11 +163,6 @@ export function convertStringToHTMLElement(str: string, selector: string): HTMLE
163
163
  * @returns {string} - A unique filename.
164
164
  */
165
165
  export function uniqueName(name: string, template: string, evalContext: object): string;
166
- /**
167
- * Returns a GUID
168
- * @returns {string} - A GUID.
169
- */
170
- export function guid(): string;
171
166
  /**
172
167
  * Return a translated date setting.
173
168
  * @param {string|Date} date - The date to translate.
@@ -520,6 +515,7 @@ export function announceScreenReaderMessage(component: any, value: any, index?:
520
515
  * @param {string} text The text to output to screen readers
521
516
  */
522
517
  export function screenReaderSpeech(text: string): void;
518
+ export { guid };
523
519
  /**
524
520
  * Map values through unfold and return first non-nil value.
525
521
  * @param {Array<T>} collection - The collection to map through unfold.;
@@ -536,3 +532,4 @@ export namespace componentValueTypes {
536
532
  let any: string;
537
533
  }
538
534
  export function interpolateErrors(component: Component, errors: FieldError[], interpolateFn: Function): [];
535
+ import { guid } from './formUtils';
@@ -2,7 +2,7 @@ import _ from 'lodash';
2
2
  import moment from 'moment-timezone/moment-timezone';
3
3
  import jtz from 'jstimezonedetect';
4
4
  import dompurify from 'dompurify';
5
- import { getValue } from './formUtils';
5
+ import { getValue, guid } from './formUtils';
6
6
  import { Evaluator } from './Evaluator';
7
7
  import ConditionOperators from './conditionOperators';
8
8
  import { jsonLogic, convertShowToBoolean } from '@formio/core';
@@ -529,17 +529,8 @@ export function uniqueName(name, template, evalContext) {
529
529
  const uniqueName = `${Evaluator.interpolate(template, evalContext)}${extension}`.replace(/[^0-9a-zA-Z.\-_ ]/g, '-');
530
530
  return uniqueName;
531
531
  }
532
- /**
533
- * Returns a GUID
534
- * @returns {string} - A GUID.
535
- */
536
- export function guid() {
537
- return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {
538
- const r = (Math.random() * 16) | 0;
539
- const v = c === 'x' ? r : (r & 0x3) | 0x8;
540
- return v.toString(16);
541
- });
542
- }
532
+ // Re-export GUID generator from @formio/core to avoid duplication
533
+ export { guid };
543
534
  /**
544
535
  * Return a translated date setting.
545
536
  * @param {string|Date} date - The date to translate.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@formio/js",
3
- "version": "5.5.1",
3
+ "version": "5.6.0",
4
4
  "description": "JavaScript powered Forms with JSON Form Builder",
5
5
  "main": "lib/cjs/index.js",
6
6
  "exports": {
@@ -56,6 +56,8 @@
56
56
  },
57
57
  "homepage": "https://github.com/formio/formio.js#readme",
58
58
  "dependencies": {
59
+ "@formio/bootstrap": "^4.0.5",
60
+ "@formio/core": "^2.8.3",
59
61
  "@formio/text-mask-addons": "^3.8.0-formio.4",
60
62
  "@formio/vanilla-text-mask": "^5.1.1-formio.1",
61
63
  "abortcontroller-polyfill": "^1.7.5",
@@ -69,7 +71,7 @@
69
71
  "core-js": "^3.37.1",
70
72
  "dialog-polyfill": "^0.5.6",
71
73
  "dom-autoscroller": "^2.3.4",
72
- "dompurify": "^3.4.12",
74
+ "dompurify": "^3.4.13",
73
75
  "downloadjs": "^1.4.7",
74
76
  "dragula": "^3.7.3",
75
77
  "eventemitter3": "^5.0.1",
@@ -88,12 +90,10 @@
88
90
  "signature_pad": "^4.2.0",
89
91
  "string-hash": "^1.1.3",
90
92
  "tippy.js": "^6.3.7",
91
- "uuid": "^9.0.0",
92
- "vanilla-picker": "^2.12.3",
93
- "@formio/bootstrap": "^4.0.4",
94
- "@formio/core": "^2.8.1"
93
+ "vanilla-picker": "^2.12.3"
95
94
  },
96
95
  "devDependencies": {
96
+ "@formio/eslint-config": "0.0.0",
97
97
  "@types/node": "^22.15.19",
98
98
  "ace-builds": "1.34.2",
99
99
  "async-limiter": "^2.0.0",
@@ -146,8 +146,7 @@
146
146
  "webpack-bundle-analyzer": "^4.10.2",
147
147
  "webpack-cli": "^5.1.1",
148
148
  "webpack-node-externals": "^3.0.0",
149
- "webpack-stream": "^7.0.0",
150
- "@formio/eslint-config": "0.0.0"
149
+ "webpack-stream": "^7.0.0"
151
150
  },
152
151
  "ossRepo": {
153
152
  "repo": "https://github.com/formio/formio.js.git",