@arquimedes.co/eureka-forms 3.0.54-new-steps → 3.0.54-test

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 (103) hide show
  1. package/dist/@Types/FormStep.d.ts +2 -7
  2. package/dist/@Types/FormStep.js +1 -2
  3. package/dist/FormSteps/MapperStep/MaterialMapperStep/Element/MapperElementComponent.js +1 -1
  4. package/dist/FormSteps/Step.js +4 -19
  5. package/dist/FormSteps/StepFunctions.js +0 -14
  6. package/dist/FormSteps/StepFunctions.test.js +0 -54
  7. package/dist/Shared/ErkDatePicker/ErkDatePicker.js +7 -5
  8. package/dist/Shared/ErkDateRangePicker/ErkDateRangePicker.d.ts +3 -2
  9. package/dist/Shared/ErkDateRangePicker/ErkDateRangePicker.js +5 -4
  10. package/dist/constants/FormStepTypes.d.ts +1 -5
  11. package/dist/constants/FormStepTypes.js +0 -4
  12. package/dist/index.lib.d.ts +2 -4
  13. package/dist/index.lib.js +1 -3
  14. package/package.json +7 -8
  15. package/dist/@Types/AvailabilityFormStep.d.ts +0 -48
  16. package/dist/@Types/AvailabilityFormStep.js +0 -24
  17. package/dist/@Types/BankAccountFormStep.d.ts +0 -67
  18. package/dist/@Types/BankAccountFormStep.js +0 -14
  19. package/dist/@Types/BookingFormStep.d.ts +0 -166
  20. package/dist/@Types/BookingFormStep.js +0 -44
  21. package/dist/@Types/CalendarFormStep.d.ts +0 -192
  22. package/dist/@Types/CalendarFormStep.js +0 -48
  23. package/dist/@Types/CommunicationChannelFormStep.d.ts +0 -51
  24. package/dist/@Types/CommunicationChannelFormStep.js +0 -15
  25. package/dist/@Types/ConsentFormStep.d.ts +0 -36
  26. package/dist/@Types/ConsentFormStep.js +0 -8
  27. package/dist/@Types/EntityFormFormStep.d.ts +0 -66
  28. package/dist/@Types/EntityFormFormStep.js +0 -20
  29. package/dist/@Types/EventFormStep.d.ts +0 -52
  30. package/dist/@Types/EventFormStep.js +0 -13
  31. package/dist/@Types/ExternalReferenceFormStep.d.ts +0 -74
  32. package/dist/@Types/ExternalReferenceFormStep.js +0 -20
  33. package/dist/@Types/LocationFormStep.d.ts +0 -159
  34. package/dist/@Types/LocationFormStep.js +0 -46
  35. package/dist/@Types/NumericFormSteps.d.ts +0 -108
  36. package/dist/@Types/NumericFormSteps.js +0 -20
  37. package/dist/@Types/PredefinedSelectorFormStep.d.ts +0 -51
  38. package/dist/@Types/PredefinedSelectorFormStep.js +0 -39
  39. package/dist/@Types/StepRef.d.ts +0 -135
  40. package/dist/@Types/StepRef.js +0 -49
  41. package/dist/FormSteps/BookingStep/BookingStep.d.ts +0 -17
  42. package/dist/FormSteps/BookingStep/BookingStep.js +0 -14
  43. package/dist/FormSteps/BookingStep/MaterialBookingStep/MaterialBookingStep.d.ts +0 -7
  44. package/dist/FormSteps/BookingStep/MaterialBookingStep/MaterialBookingStep.js +0 -32
  45. package/dist/FormSteps/CalendarStep/CalendarStep.d.ts +0 -7
  46. package/dist/FormSteps/CalendarStep/CalendarStep.js +0 -14
  47. package/dist/FormSteps/CalendarStep/MaterialCalendarStep/MaterialCalendarStep.d.ts +0 -7
  48. package/dist/FormSteps/CalendarStep/MaterialCalendarStep/MaterialCalendarStep.js +0 -31
  49. package/dist/FormSteps/LocationStep/LocationStep.d.ts +0 -10
  50. package/dist/FormSteps/LocationStep/LocationStep.js +0 -14
  51. package/dist/FormSteps/LocationStep/MaterialLocationStep/MaterialLocationStep.d.ts +0 -3
  52. package/dist/FormSteps/LocationStep/MaterialLocationStep/MaterialLocationStep.js +0 -47
  53. package/dist/FormSteps/LocationStep/MaterialLocationStep/MaterialLocationStep.module.css +0 -18
  54. package/dist/FormSteps/NumberStep/MaterialNumberStep/MaterialNumberStep.d.ts +0 -3
  55. package/dist/FormSteps/NumberStep/MaterialNumberStep/MaterialNumberStep.js +0 -168
  56. package/dist/FormSteps/NumberStep/MaterialNumberStep/MaterialNumberStep.module.css +0 -94
  57. package/dist/FormSteps/NumberStep/NumberStep.d.ts +0 -10
  58. package/dist/FormSteps/NumberStep/NumberStep.js +0 -14
  59. package/dist/Icons/AddIcon.d.ts +0 -3
  60. package/dist/Icons/AddIcon.js +0 -7
  61. package/dist/Icons/EditIcon.d.ts +0 -3
  62. package/dist/Icons/EditIcon.js +0 -7
  63. package/dist/Icons/RemoveIcon.d.ts +0 -3
  64. package/dist/Icons/RemoveIcon.js +0 -7
  65. package/dist/Icons/ViewDayIcon.d.ts +0 -3
  66. package/dist/Icons/ViewDayIcon.js +0 -7
  67. package/dist/Icons/ViewWeekIcon.d.ts +0 -3
  68. package/dist/Icons/ViewWeekIcon.js +0 -7
  69. package/dist/Shared/ErkAddressAutocomplete/ErkAddressAutocomplete.d.ts +0 -19
  70. package/dist/Shared/ErkAddressAutocomplete/ErkAddressAutocomplete.js +0 -80
  71. package/dist/Shared/ErkAddressAutocomplete/ErkAddressAutocomplete.module.css +0 -82
  72. package/dist/Shared/ErkAddressAutocomplete/googlePlaces.d.ts +0 -29
  73. package/dist/Shared/ErkAddressAutocomplete/googlePlaces.js +0 -139
  74. package/dist/Shared/ErkBookingPicker/ErkBookingPicker.d.ts +0 -31
  75. package/dist/Shared/ErkBookingPicker/ErkBookingPicker.js +0 -223
  76. package/dist/Shared/ErkBookingPicker/ErkBookingPicker.module.css +0 -608
  77. package/dist/Shared/ErkBookingPicker/ErkBookingPicker.stories.d.ts +0 -28
  78. package/dist/Shared/ErkBookingPicker/ErkBookingPicker.stories.js +0 -117
  79. package/dist/Shared/ErkBookingPicker/ErkBookingPicker.stories.test.d.ts +0 -1
  80. package/dist/Shared/ErkBookingPicker/ErkBookingPicker.stories.test.js +0 -49
  81. package/dist/Shared/ErkBookingPicker/ErkBookingPicker.test.d.ts +0 -1
  82. package/dist/Shared/ErkBookingPicker/ErkBookingPicker.test.js +0 -107
  83. package/dist/Shared/ErkCalendar/CalendarFunctions.d.ts +0 -28
  84. package/dist/Shared/ErkCalendar/CalendarFunctions.js +0 -121
  85. package/dist/Shared/ErkCalendar/CalendarPopovers.d.ts +0 -45
  86. package/dist/Shared/ErkCalendar/CalendarPopovers.js +0 -110
  87. package/dist/Shared/ErkCalendar/ErkCalendar.d.ts +0 -73
  88. package/dist/Shared/ErkCalendar/ErkCalendar.js +0 -281
  89. package/dist/Shared/ErkCalendar/ErkCalendar.module.css +0 -785
  90. package/dist/Shared/ErkCalendar/ErkCalendar.test.d.ts +0 -1
  91. package/dist/Shared/ErkCalendar/ErkCalendar.test.js +0 -171
  92. package/dist/Shared/ErkLocationField/ErkLocationField.d.ts +0 -23
  93. package/dist/Shared/ErkLocationField/ErkLocationField.js +0 -73
  94. package/dist/Shared/ErkLocationField/ErkLocationField.module.css +0 -29
  95. package/dist/Shared/ErkLocationField/addressFields.d.ts +0 -12
  96. package/dist/Shared/ErkLocationField/addressFields.js +0 -34
  97. package/dist/Shared/ErkLocationField/locationRestrictions.d.ts +0 -6
  98. package/dist/Shared/ErkLocationField/locationRestrictions.js +0 -51
  99. package/dist/Shared/ErkLocationInput/ErkLocationInput.d.ts +0 -15
  100. package/dist/Shared/ErkLocationInput/ErkLocationInput.js +0 -502
  101. package/dist/Shared/ErkLocationInput/ErkLocationInput.module.css +0 -115
  102. package/dist/Shared/ErkNumberField/ErkNumberField.d.ts +0 -42
  103. package/dist/Shared/ErkNumberField/ErkNumberField.js +0 -170
@@ -1,94 +0,0 @@
1
- .container {
2
- display: flex;
3
- flex-direction: column;
4
- width: 100%;
5
- }
6
-
7
- .inputRow {
8
- display: flex;
9
- align-items: flex-start;
10
- gap: 12px;
11
- width: 100%;
12
- }
13
-
14
- .selectWrapper {
15
- width: 100px;
16
- min-width: 90px;
17
- }
18
-
19
- .dividerSlash {
20
- align-self: flex-start;
21
- display: flex;
22
- align-items: center;
23
- justify-content: center;
24
- height: 40px;
25
- font-size: 20px;
26
- font-weight: bold;
27
- color: var(--eureka-text, #333);
28
- opacity: 0.6;
29
- margin-left: 2px;
30
- margin-right: 2px;
31
- }
32
-
33
- .suffixText {
34
- align-self: flex-start;
35
- display: flex;
36
- align-items: center;
37
- height: 40px;
38
- font-size: 14px;
39
- font-weight: 600;
40
- color: var(--eureka-primary, #1976d2);
41
- padding: 0 4px;
42
- user-select: none;
43
- }
44
-
45
- /* Read-Only Styles */
46
- .readOnlyContainer {
47
- width: 100%;
48
- margin-bottom: 8px;
49
- }
50
-
51
- .readOnlyCard {
52
- display: flex;
53
- align-items: center;
54
- padding: 12px 16px;
55
- border: 1px solid var(--eureka-outline, #e0e0e0);
56
- border-radius: 12px;
57
- background-color: var(--eureka-bg, #ffffff);
58
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
59
- transition: box-shadow 0.2s ease, border-color 0.2s ease;
60
- }
61
-
62
- .readOnlyCard:hover {
63
- border-color: var(--eureka-primary, #1976d2);
64
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08);
65
- }
66
-
67
- .readOnlyDetails {
68
- display: flex;
69
- flex-direction: column;
70
- gap: 2px;
71
- width: 100%;
72
- }
73
-
74
- .readOnlyLabel {
75
- font-size: 11px !important;
76
- text-transform: uppercase;
77
- letter-spacing: 0.5px;
78
- color: var(--eureka-text, #333) !important;
79
- opacity: 0.6;
80
- font-weight: 600 !important;
81
- }
82
-
83
- .readOnlyValue {
84
- font-size: 16px !important;
85
- font-weight: 600 !important;
86
- color: var(--eureka-primary, #1976d2) !important;
87
- }
88
-
89
- .readOnlyDesc {
90
- font-size: 12px !important;
91
- color: var(--eureka-text, #333) !important;
92
- opacity: 0.5;
93
- margin-top: 2px !important;
94
- }
@@ -1,10 +0,0 @@
1
- import { NumberStep } from '../../@Types/FormStep';
2
- import { StepProps } from '../Step';
3
- export interface NumberStepProps extends StepProps {
4
- /** The NumberStep to display */
5
- step: NumberStep;
6
- /** The icon to display */
7
- IconComponent?: React.ElementType;
8
- }
9
- declare function NumberStepComponent(props: NumberStepProps): JSX.Element;
10
- export default NumberStepComponent;
@@ -1,14 +0,0 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
2
- import { FormStyleTypes } from '../../constants/FormStepTypes';
3
- import MaterialNumberStep from './MaterialNumberStep/MaterialNumberStep';
4
- import { useAppSelector } from '../../hooks';
5
- function NumberStepComponent(props) {
6
- const { formStyle } = useAppSelector((state) => state.global);
7
- switch (formStyle.type) {
8
- case FormStyleTypes.MATERIAL:
9
- default: {
10
- return _jsx(MaterialNumberStep, { ...props });
11
- }
12
- }
13
- }
14
- export default NumberStepComponent;
@@ -1,3 +0,0 @@
1
- import { IconProps } from './@ErkIcon';
2
- declare function AddIcon(props: IconProps): JSX.Element;
3
- export default AddIcon;
@@ -1,7 +0,0 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
2
- import { useIconProps } from './@ErkIcon';
3
- function AddIcon(props) {
4
- const iconProps = useIconProps(props);
5
- return (_jsx("svg", { ...iconProps, viewBox: "0 0 24 24", xmlns: "http://www.w3.org/2000/svg", children: _jsx("path", { d: "M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z" }) }));
6
- }
7
- export default AddIcon;
@@ -1,3 +0,0 @@
1
- import { IconProps } from './@ErkIcon';
2
- declare function EditIcon(props: IconProps): JSX.Element;
3
- export default EditIcon;
@@ -1,7 +0,0 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
2
- import { useIconProps } from './@ErkIcon';
3
- function EditIcon(props) {
4
- const iconProps = useIconProps(props);
5
- return (_jsx("svg", { ...iconProps, version: "1.1", viewBox: "0 0 24 24", xmlns: "http://www.w3.org/2000/svg", children: _jsx("path", { d: "M3 17.25V21h3.75L17.81 9.94l-3.75-3.75L3 17.25zM20.71 7.04c.39-.39.39-1.02 0-1.41l-2.34-2.34c-.39-.39-1.02-.39-1.41 0l-1.83 1.83 3.75 3.75 1.83-1.83z" }) }));
6
- }
7
- export default EditIcon;
@@ -1,3 +0,0 @@
1
- import { IconProps } from './@ErkIcon';
2
- declare function RemoveIcon(props: IconProps): JSX.Element;
3
- export default RemoveIcon;
@@ -1,7 +0,0 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
2
- import { useIconProps } from './@ErkIcon';
3
- function RemoveIcon(props) {
4
- const iconProps = useIconProps(props);
5
- return (_jsx("svg", { ...iconProps, viewBox: "0 0 24 24", xmlns: "http://www.w3.org/2000/svg", children: _jsx("path", { d: "M19 13H5v-2h14v2z" }) }));
6
- }
7
- export default RemoveIcon;
@@ -1,3 +0,0 @@
1
- import { IconProps } from './@ErkIcon';
2
- declare function ViewDayIcon(props: IconProps): JSX.Element;
3
- export default ViewDayIcon;
@@ -1,7 +0,0 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
2
- import { useIconProps } from './@ErkIcon';
3
- function ViewDayIcon(props) {
4
- const iconProps = useIconProps(props);
5
- return (_jsx("svg", { ...iconProps, viewBox: "0 0 24 24", xmlns: "http://www.w3.org/2000/svg", children: _jsx("path", { d: "M2 21h19v-2H2v2zm0-4h19v-8H2v8zm0-10h19V5H2v2z" }) }));
6
- }
7
- export default ViewDayIcon;
@@ -1,3 +0,0 @@
1
- import { IconProps } from './@ErkIcon';
2
- declare function ViewWeekIcon(props: IconProps): JSX.Element;
3
- export default ViewWeekIcon;
@@ -1,7 +0,0 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
2
- import { useIconProps } from './@ErkIcon';
3
- function ViewWeekIcon(props) {
4
- const iconProps = useIconProps(props);
5
- return (_jsx("svg", { ...iconProps, viewBox: "0 0 24 24", xmlns: "http://www.w3.org/2000/svg", children: _jsx("path", { d: "M6 5H3c-.55 0-1 .45-1 1v12c0 .55.45 1 1 1h3c.55 0 1-.45 1-1V6c0-.55-.45-1-1-1zm14 0h-3c-.55 0-1 .45-1 1v12c0 .55.45 1 1 1h3c.55 0 1-.45 1-1V6c0-.55-.45-1-1-1zm-7 0h-3c-.55 0-1 .45-1 1v12c0 .55.45 1 1 1h3c.55 0 1-.45 1-1V6c0-.55-.45-1-1-1z" }) }));
6
- }
7
- export default ViewWeekIcon;
@@ -1,19 +0,0 @@
1
- import React from 'react';
2
- import { LocationStepValue } from '../../@Types/LocationFormStep';
3
- export interface ErkAddressAutocompleteProps {
4
- value?: LocationStepValue | null;
5
- onChange: (value: LocationStepValue) => void;
6
- /** ISO-2 para acotar las sugerencias (ej. ['co']). */
7
- regionCodes?: string[];
8
- placeholder?: string;
9
- error?: boolean;
10
- required?: boolean;
11
- readOnly?: boolean;
12
- inputRef?: React.Ref<HTMLInputElement>;
13
- }
14
- /**
15
- * Buscador de direcciones con el `Autocomplete` de Base UI + Google Places.
16
- * Emite un `LocationStepValue` (source GOOGLE_PLACES) con el desglose estructurado.
17
- */
18
- declare function ErkAddressAutocomplete({ value, onChange, regionCodes, placeholder, error, required, readOnly, inputRef, }: ErkAddressAutocompleteProps): JSX.Element;
19
- export default ErkAddressAutocomplete;
@@ -1,80 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { useCallback, useEffect, useRef, useState } from 'react';
3
- import { Autocomplete } from '@base-ui/react/autocomplete';
4
- import { fetchAddressSuggestions, loadPlaces, newSessionToken, resolvePrediction, } from './googlePlaces';
5
- import styles from './ErkAddressAutocomplete.module.css';
6
- /**
7
- * Buscador de direcciones con el `Autocomplete` de Base UI + Google Places.
8
- * Emite un `LocationStepValue` (source GOOGLE_PLACES) con el desglose estructurado.
9
- */
10
- function ErkAddressAutocomplete({ value, onChange, regionCodes = ['co'], placeholder = 'Buscar dirección…', error = false, required = false, readOnly = false, inputRef, }) {
11
- const apiKey = import.meta.env.VITE_GOOGLE_MAPS_API_KEY ?? '';
12
- const [ready, setReady] = useState(false);
13
- const [inputValue, setInputValue] = useState(value?.address ?? value?.name ?? '');
14
- const [options, setOptions] = useState([]);
15
- const [loading, setLoading] = useState(false);
16
- const [hasSearched, setHasSearched] = useState(false);
17
- const debounceRef = useRef(undefined);
18
- const sessionTokenRef = useRef(undefined);
19
- useEffect(() => {
20
- if (readOnly)
21
- return;
22
- let active = true;
23
- void loadPlaces(apiKey)
24
- .then(() => {
25
- if (!active)
26
- return;
27
- sessionTokenRef.current = newSessionToken();
28
- setReady(true);
29
- })
30
- .catch(() => {
31
- if (active)
32
- setReady(false);
33
- });
34
- return () => {
35
- active = false;
36
- };
37
- }, [apiKey, readOnly]);
38
- const handleInput = useCallback((text) => {
39
- setInputValue(text);
40
- if (debounceRef.current)
41
- clearTimeout(debounceRef.current);
42
- if (!ready || !text || text.length < 3) {
43
- setOptions([]);
44
- setHasSearched(false);
45
- return;
46
- }
47
- setLoading(true);
48
- debounceRef.current = setTimeout(() => {
49
- void (async () => {
50
- try {
51
- setOptions(await fetchAddressSuggestions(text, {
52
- sessionToken: sessionTokenRef.current,
53
- regionCodes,
54
- }));
55
- }
56
- catch {
57
- setOptions([]);
58
- }
59
- finally {
60
- setLoading(false);
61
- setHasSearched(true);
62
- }
63
- })();
64
- }, 300);
65
- }, [ready, regionCodes]);
66
- const handleSelect = useCallback(async (prediction) => {
67
- try {
68
- const stepValue = await resolvePrediction(prediction);
69
- setInputValue(stepValue.address ?? stepValue.name ?? prediction.label);
70
- setOptions([]);
71
- onChange(stepValue);
72
- }
73
- finally {
74
- // Cada selección cierra la sesión de billing de Google.
75
- sessionTokenRef.current = newSessionToken();
76
- }
77
- }, [onChange]);
78
- return (_jsxs(Autocomplete.Root, { items: options, mode: "none", value: inputValue, onValueChange: handleInput, disabled: readOnly, children: [_jsx(Autocomplete.Input, { ref: inputRef, placeholder: placeholder, required: required, readOnly: readOnly, className: error ? `${styles.input} ${styles.inputError}` : styles.input }), _jsx(Autocomplete.Portal, { children: _jsx(Autocomplete.Positioner, { className: styles.positioner, sideOffset: 4, children: _jsxs(Autocomplete.Popup, { className: styles.popup, children: [loading && _jsx("div", { className: styles.status, children: "Buscando\u2026" }), _jsx(Autocomplete.Empty, { className: styles.status, children: hasSearched ? 'No se encontraron resultados' : 'Escribe para buscar…' }), _jsx(Autocomplete.List, { className: styles.list, children: (option) => (_jsxs(Autocomplete.Item, { value: option, className: styles.item, onClick: () => void handleSelect(option), children: [_jsx("span", { className: styles.optionLabel, children: option.label }), option.description && (_jsx("span", { className: styles.optionDescription, children: option.description }))] }, option.placeId)) })] }) }) })] }));
79
- }
80
- export default ErkAddressAutocomplete;
@@ -1,82 +0,0 @@
1
- .input {
2
- width: 100%;
3
- box-sizing: border-box;
4
- height: 40px;
5
- padding: 6px 12px;
6
- font-size: 1rem;
7
- color: var(--eureka-text, #333);
8
- background-color: var(--eureka-bg, #fff);
9
- border: 1px solid var(--eureka-outline, #ccc);
10
- border-radius: 10px;
11
- outline: none;
12
- }
13
-
14
- .input:hover:not(:disabled) {
15
- border-color: var(--eureka-primary, #1976d2);
16
- }
17
-
18
- .input:focus {
19
- border-color: var(--eureka-primary, #1976d2);
20
- border-width: 2px;
21
- padding: 5px 11px;
22
- }
23
-
24
- .input:disabled {
25
- opacity: 0.5;
26
- }
27
-
28
- .inputError {
29
- border-color: var(--eureka-error, #e53935);
30
- }
31
-
32
- .positioner {
33
- z-index: 1400;
34
- width: var(--anchor-width);
35
- }
36
-
37
- .popup {
38
- box-sizing: border-box;
39
- max-height: 320px;
40
- overflow-y: auto;
41
- padding: 4px;
42
- background-color: var(--eureka-bg, #fff);
43
- border: 1px solid var(--eureka-outline, #ccc);
44
- border-radius: 10px;
45
- box-shadow: 0 4px 16px rgb(0 0 0 / 12%);
46
- }
47
-
48
- .list {
49
- display: flex;
50
- flex-direction: column;
51
- }
52
-
53
- .status {
54
- padding: 10px 12px;
55
- font-size: 0.875rem;
56
- color: var(--eureka-text, #666);
57
- opacity: 0.7;
58
- }
59
-
60
- .item {
61
- display: flex;
62
- flex-direction: column;
63
- gap: 2px;
64
- padding: 8px 12px;
65
- border-radius: 8px;
66
- cursor: pointer;
67
- }
68
-
69
- .item[data-highlighted],
70
- .item:hover {
71
- background-color: var(--eureka-primary, #1976d2);
72
- color: #fff;
73
- }
74
-
75
- .optionLabel {
76
- font-size: 0.9375rem;
77
- }
78
-
79
- .optionDescription {
80
- font-size: 0.8125rem;
81
- opacity: 0.7;
82
- }
@@ -1,29 +0,0 @@
1
- import { LocationAddressDetail, LocationStepValue } from '../../@Types/LocationFormStep';
2
- /** Asegura el script cargado y las clases de Places listas. Idempotente. */
3
- export declare function loadPlaces(apiKey: string): Promise<void>;
4
- /** Token de sesión nuevo (mejora el billing/relevancia de Google). */
5
- export declare function newSessionToken(): any;
6
- /** Reverse-geocoding para el modo GPS: coordenadas → dirección estructurada. */
7
- export declare function reverseGeocode(apiKey: string, lat: number, lng: number): Promise<{
8
- address?: string;
9
- addressDetail: LocationAddressDetail;
10
- }>;
11
- export interface AddressPrediction {
12
- placeId: string;
13
- label: string;
14
- description: string;
15
- toPlace: () => any;
16
- }
17
- export interface FetchSuggestionsOptions {
18
- sessionToken?: any;
19
- /** ISO-2, ej. ['co'] */
20
- regionCodes?: string[];
21
- }
22
- export declare function fetchAddressSuggestions(input: string, options?: FetchSuggestionsOptions): Promise<AddressPrediction[]>;
23
- /**
24
- * Descompone los `addressComponents` de un Place en el shape estructurado del step.
25
- * Acepta el formato nuevo (`longText`/`shortText`) y el legacy (`long_name`/`short_name`).
26
- */
27
- export declare function parseAddressComponents(components: any[] | null | undefined): LocationAddressDetail;
28
- /** Resuelve una predicción a un `LocationStepValue` completo (fetchFields + parse). */
29
- export declare function resolvePrediction(prediction: AddressPrediction): Promise<LocationStepValue>;
@@ -1,139 +0,0 @@
1
- import { LocationInputMode } from '../../@Types/LocationFormStep';
2
- /**
3
- * Carga y consulta de Google Places (nueva API `AutocompleteSuggestion`).
4
- * Encapsula el script loader + importLibrary que antes vivía inline en ErkLocationInput,
5
- * para reutilizarlo desde el autocomplete de Base UI sin duplicar lógica.
6
- */
7
- // Google's new Places classes (AutocompleteSuggestion/SessionToken) are untyped in the
8
- // installed @types/google.maps, so they're kept as `any` — same approach as ErkLocationInput.
9
- let loadPromise = null;
10
- let suggestionClass = null;
11
- let sessionTokenClass = null;
12
- let geocoderClass = null;
13
- function loadScript(apiKey) {
14
- if (typeof window === 'undefined')
15
- return Promise.resolve();
16
- const win = window;
17
- if (win.google?.maps?.importLibrary)
18
- return Promise.resolve();
19
- if (loadPromise)
20
- return loadPromise;
21
- loadPromise = new Promise((resolve, reject) => {
22
- const script = document.createElement('script');
23
- script.src = `https://maps.googleapis.com/maps/api/js?key=${apiKey}&loading=async`;
24
- script.async = true;
25
- script.defer = true;
26
- script.onload = () => resolve();
27
- script.onerror = () => {
28
- loadPromise = null;
29
- reject(new Error('Google Maps script failed to load.'));
30
- };
31
- document.head.appendChild(script);
32
- });
33
- return loadPromise;
34
- }
35
- /** Asegura el script cargado y las clases de Places listas. Idempotente. */
36
- export async function loadPlaces(apiKey) {
37
- await loadScript(apiKey);
38
- const win = window;
39
- if (win.google?.maps?.importLibrary && !suggestionClass) {
40
- const places = await win.google.maps.importLibrary('places');
41
- suggestionClass = places.AutocompleteSuggestion;
42
- sessionTokenClass = places.AutocompleteSessionToken;
43
- }
44
- }
45
- /** Token de sesión nuevo (mejora el billing/relevancia de Google). */
46
- export function newSessionToken() {
47
- return sessionTokenClass ? new sessionTokenClass() : undefined;
48
- }
49
- /** Reverse-geocoding para el modo GPS: coordenadas → dirección estructurada. */
50
- export async function reverseGeocode(apiKey, lat, lng) {
51
- await loadScript(apiKey);
52
- const win = window;
53
- if (win.google?.maps?.importLibrary && !geocoderClass) {
54
- const geocoding = await win.google.maps.importLibrary('geocoding');
55
- geocoderClass = geocoding.Geocoder;
56
- }
57
- else if (!geocoderClass && win.google?.maps?.Geocoder) {
58
- geocoderClass = win.google.maps.Geocoder;
59
- }
60
- if (!geocoderClass)
61
- return { addressDetail: {} };
62
- const geocoder = new geocoderClass();
63
- return new Promise((resolve) => {
64
- geocoder.geocode({ location: { lat, lng } }, (results, status) => {
65
- if (status === 'OK' && results?.[0]) {
66
- resolve({
67
- address: results[0].formatted_address,
68
- addressDetail: parseAddressComponents(results[0].address_components),
69
- });
70
- }
71
- else {
72
- resolve({ addressDetail: {} });
73
- }
74
- });
75
- });
76
- }
77
- export async function fetchAddressSuggestions(input, options) {
78
- if (!suggestionClass)
79
- return [];
80
- const request = { input };
81
- if (options?.sessionToken)
82
- request.sessionToken = options.sessionToken;
83
- if (options?.regionCodes)
84
- request.includedRegionCodes = options.regionCodes;
85
- const { suggestions } = await suggestionClass.fetchAutocompleteSuggestions(request);
86
- return suggestions
87
- .filter((s) => s.placePrediction)
88
- .map((s) => ({
89
- placeId: s.placePrediction.placeId,
90
- label: s.placePrediction.mainText?.text ?? s.placePrediction.text.text,
91
- description: s.placePrediction.secondaryText?.text ?? s.placePrediction.text.text,
92
- toPlace: () => s.placePrediction.toPlace(),
93
- }));
94
- }
95
- /**
96
- * Descompone los `addressComponents` de un Place en el shape estructurado del step.
97
- * Acepta el formato nuevo (`longText`/`shortText`) y el legacy (`long_name`/`short_name`).
98
- */
99
- export function parseAddressComponents(components) {
100
- const detail = {};
101
- for (const component of components ?? []) {
102
- const types = component.types;
103
- const longName = component.longText ?? component.long_name;
104
- const shortName = component.shortText ?? component.short_name;
105
- if (types.includes('route'))
106
- detail.street = longName;
107
- else if (types.includes('street_number'))
108
- detail.streetNumber = longName;
109
- else if (types.includes('subpremise'))
110
- detail.unit = longName;
111
- else if (types.includes('neighborhood') || types.includes('sublocality'))
112
- detail.neighborhood = longName;
113
- else if (types.includes('locality'))
114
- detail.city = longName;
115
- else if (types.includes('administrative_area_level_1'))
116
- detail.state = longName;
117
- else if (types.includes('country')) {
118
- detail.country = longName;
119
- detail.countryCode = shortName;
120
- }
121
- else if (types.includes('postal_code'))
122
- detail.postalCode = longName;
123
- }
124
- return detail;
125
- }
126
- /** Resuelve una predicción a un `LocationStepValue` completo (fetchFields + parse). */
127
- export async function resolvePrediction(prediction) {
128
- const place = prediction.toPlace();
129
- await place.fetchFields({ fields: ['displayName', 'formattedAddress', 'location', 'addressComponents'] });
130
- return {
131
- source: LocationInputMode.GOOGLE_PLACES,
132
- latitude: place.location?.lat(),
133
- longitude: place.location?.lng(),
134
- name: place.displayName ?? prediction.label,
135
- address: place.formattedAddress ?? undefined,
136
- placeId: prediction.placeId,
137
- addressDetail: parseAddressComponents(place.addressComponents),
138
- };
139
- }
@@ -1,31 +0,0 @@
1
- import { BookablePerson, BookingMode, BookingSlot, BookingValue, PersonSelectionMode } from '../../@Types/BookingFormStep';
2
- export interface ErkBookingPickerProps {
3
- value: BookingValue | null;
4
- onChange: (value: BookingValue | null) => void;
5
- label: string;
6
- description?: string | null;
7
- durationMinutes: number;
8
- bufferMinutes?: number;
9
- bookingMode?: BookingMode;
10
- temporaryLockMinutes?: number;
11
- personSelectionMode?: PersonSelectionMode;
12
- persons?: BookablePerson[];
13
- /** Recopila nombre/correo del que agenda. */
14
- collectContact?: boolean;
15
- /** Provee los slots disponibles para una persona + día. */
16
- fetchSlots?: (args: {
17
- personId?: string;
18
- date: string;
19
- }) => Promise<BookingSlot[]>;
20
- readOnly?: boolean;
21
- error?: string;
22
- }
23
- /**
24
- * Selector de cita: una tarjeta de entrada ("Agendar cita") abre el wizard en un modal —
25
- * una decisión por pantalla (persona → día → hora → confirmar), con panel izquierdo de
26
- * resumen que se va llenando, breadcrumb navegable arriba y barra inferior Atrás / Siguiente.
27
- * En el paso final el panel derecho desaparece y el resumen se expande en una columna
28
- * centrada (cross-fade corto). Confirmar cierra el modal y deja el resumen compacto.
29
- */
30
- declare function ErkBookingPicker({ value, onChange, label, description, durationMinutes, bufferMinutes, bookingMode, temporaryLockMinutes, personSelectionMode, persons, collectContact, fetchSlots, readOnly, error, }: ErkBookingPickerProps): JSX.Element;
31
- export default ErkBookingPicker;