@startlibs/form 1.1.3 → 1.2.0-rc.1

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 (112) hide show
  1. package/lib/AutoComplete.mjs +7 -7
  2. package/lib/AutoComplete.mjs.map +1 -1
  3. package/lib/Checkbox.mjs +4 -2
  4. package/lib/Checkbox.mjs.map +1 -1
  5. package/lib/Combobox.mjs +1 -1
  6. package/lib/Combobox.mjs.map +1 -1
  7. package/lib/DatePicker.mjs +25 -9
  8. package/lib/DatePicker.mjs.map +1 -1
  9. package/lib/Errors.mjs +20 -10
  10. package/lib/Errors.mjs.map +1 -1
  11. package/lib/ExpandableBox.mjs +1 -1
  12. package/lib/ExpandableBox.mjs.map +1 -1
  13. package/lib/Field.mjs +10 -5
  14. package/lib/Field.mjs.map +1 -1
  15. package/lib/FieldBox.mjs +3 -3
  16. package/lib/FieldBox.mjs.map +1 -1
  17. package/lib/InputboxGroup.mjs +1 -1
  18. package/lib/InputboxGroup.mjs.map +1 -1
  19. package/lib/RichText.mjs +11 -6
  20. package/lib/RichText.mjs.map +1 -1
  21. package/lib/TextInput.mjs +4 -4
  22. package/lib/TextInput.mjs.map +1 -1
  23. package/lib/alt/checkbox/SimpleCheckbox.mjs +1 -1
  24. package/lib/alt/checkbox/SimpleCheckbox.mjs.map +1 -1
  25. package/lib/alt/checkbox/ToggleCheckbox.mjs +4 -3
  26. package/lib/alt/checkbox/ToggleCheckbox.mjs.map +1 -1
  27. package/lib/alt/radiobox/CleanTabRadiobox.mjs +1 -1
  28. package/lib/alt/radiobox/CleanTabRadiobox.mjs.map +1 -1
  29. package/lib/alt/radiobox/SimpleRadiobox.mjs +2 -2
  30. package/lib/alt/radiobox/SimpleRadiobox.mjs.map +1 -1
  31. package/lib/alt/radiobox/TabRadiobox.mjs +1 -1
  32. package/lib/alt/radiobox/TabRadiobox.mjs.map +1 -1
  33. package/lib/index.cjs +94 -51
  34. package/lib/index.cjs.map +1 -1
  35. package/lib/index.mjs +2 -2
  36. package/lib/withFormImageInput.mjs +1 -1
  37. package/lib/withFormImageInput.mjs.map +1 -1
  38. package/lib-yak/AutoComplete.mjs +705 -0
  39. package/lib-yak/AutoComplete.mjs.map +1 -0
  40. package/lib-yak/Checkbox.mjs +80 -0
  41. package/lib-yak/Checkbox.mjs.map +1 -0
  42. package/lib-yak/Combobox.mjs +652 -0
  43. package/lib-yak/Combobox.mjs.map +1 -0
  44. package/lib-yak/ComboboxWithCustom.mjs +77 -0
  45. package/lib-yak/ComboboxWithCustom.mjs.map +1 -0
  46. package/lib-yak/DatePicker.mjs +774 -0
  47. package/lib-yak/DatePicker.mjs.map +1 -0
  48. package/lib-yak/EditableBox.mjs +495 -0
  49. package/lib-yak/EditableBox.mjs.map +1 -0
  50. package/lib-yak/Errors.mjs +226 -0
  51. package/lib-yak/Errors.mjs.map +1 -0
  52. package/lib-yak/ExpandableBox.mjs +247 -0
  53. package/lib-yak/ExpandableBox.mjs.map +1 -0
  54. package/lib-yak/Field.mjs +93 -0
  55. package/lib-yak/Field.mjs.map +1 -0
  56. package/lib-yak/FieldBox.mjs +173 -0
  57. package/lib-yak/FieldBox.mjs.map +1 -0
  58. package/lib-yak/Form.mjs +322 -0
  59. package/lib-yak/Form.mjs.map +1 -0
  60. package/lib-yak/FormValue.mjs +111 -0
  61. package/lib-yak/FormValue.mjs.map +1 -0
  62. package/lib-yak/InputboxGroup.mjs +146 -0
  63. package/lib-yak/InputboxGroup.mjs.map +1 -0
  64. package/lib-yak/Radiobox.mjs +69 -0
  65. package/lib-yak/Radiobox.mjs.map +1 -0
  66. package/lib-yak/RichText.mjs +776 -0
  67. package/lib-yak/RichText.mjs.map +1 -0
  68. package/lib-yak/TextInput.mjs +589 -0
  69. package/lib-yak/TextInput.mjs.map +1 -0
  70. package/lib-yak/alt/checkbox/SimpleCheckbox.mjs +225 -0
  71. package/lib-yak/alt/checkbox/SimpleCheckbox.mjs.map +1 -0
  72. package/lib-yak/alt/checkbox/ToggleCheckbox.mjs +173 -0
  73. package/lib-yak/alt/checkbox/ToggleCheckbox.mjs.map +1 -0
  74. package/lib-yak/alt/radiobox/CleanTabRadiobox.mjs +87 -0
  75. package/lib-yak/alt/radiobox/CleanTabRadiobox.mjs.map +1 -0
  76. package/lib-yak/alt/radiobox/IconRadioBox.mjs +138 -0
  77. package/lib-yak/alt/radiobox/IconRadioBox.mjs.map +1 -0
  78. package/lib-yak/alt/radiobox/SimpleRadiobox.mjs +203 -0
  79. package/lib-yak/alt/radiobox/SimpleRadiobox.mjs.map +1 -0
  80. package/lib-yak/alt/radiobox/TabRadiobox.mjs +117 -0
  81. package/lib-yak/alt/radiobox/TabRadiobox.mjs.map +1 -0
  82. package/lib-yak/enhanceInput.mjs +131 -0
  83. package/lib-yak/enhanceInput.mjs.map +1 -0
  84. package/lib-yak/index.mjs +28 -0
  85. package/lib-yak/index.mjs.map +1 -0
  86. package/lib-yak/useConfirmDialog.mjs +117 -0
  87. package/lib-yak/useConfirmDialog.mjs.map +1 -0
  88. package/lib-yak/useDraftConfirmation.mjs +56 -0
  89. package/lib-yak/useDraftConfirmation.mjs.map +1 -0
  90. package/lib-yak/validation.mjs +91 -0
  91. package/lib-yak/validation.mjs.map +1 -0
  92. package/lib-yak/withFormImageInput.mjs +298 -0
  93. package/lib-yak/withFormImageInput.mjs.map +1 -0
  94. package/package.json +13 -3
  95. package/src/AutoComplete.jsx +12 -12
  96. package/src/Checkbox.jsx +2 -2
  97. package/src/Combobox.jsx +1 -1
  98. package/src/DatePicker.jsx +25 -22
  99. package/src/Errors.jsx +18 -8
  100. package/src/ExpandableBox.jsx +3 -3
  101. package/src/Field.jsx +9 -4
  102. package/src/FieldBox.jsx +6 -6
  103. package/src/IconRadioBoxOldHubt.jsx +1 -1
  104. package/src/InputboxGroup.jsx +1 -1
  105. package/src/RichText.jsx +17 -13
  106. package/src/TextInput.jsx +37 -26
  107. package/src/alt/checkbox/SimpleCheckbox.jsx +5 -5
  108. package/src/alt/checkbox/ToggleCheckbox.jsx +9 -8
  109. package/src/alt/radiobox/CleanTabRadiobox.jsx +2 -2
  110. package/src/alt/radiobox/SimpleRadiobox.jsx +7 -7
  111. package/src/alt/radiobox/TabRadiobox.jsx +4 -4
  112. package/src/withFormImageInput.jsx +2 -2
@@ -0,0 +1,774 @@
1
+ import _defineProperty from '@babel/runtime/helpers/defineProperty';
2
+ import _objectWithoutProperties from '@babel/runtime/helpers/objectWithoutProperties';
3
+ import _extends from '@babel/runtime/helpers/extends';
4
+ import _isFinite from 'lodash/fp/isFinite';
5
+ import { yakDomTag } from '@startlibs/utils/yakDomTag';
6
+ import React, { forwardRef, useRef, useContext, useState, useEffect } from 'react';
7
+ import { styled, css } from '@yak/react';
8
+ import { useEnsureRef, usePopupToggle, StartlibsContext, usePrevious } from '@startlibs/core';
9
+ import { getColor, formatDate, getNumberInputType, formatDateToPattern, insertKeyframes, parseDate, callIfFunction } from '@startlibs/utils';
10
+ import { Icon } from '@startlibs/components';
11
+ import { Field } from './Field.mjs';
12
+ import { TextInput } from './TextInput.mjs';
13
+ import { useInput, enhanceInput } from './enhanceInput.mjs';
14
+ import { darken } from 'polished';
15
+
16
+ const _excluded = ["format", "min", "max", "weekStartsMonday", "label", "mandatory", "tabIndex", "helpText", "path", "timezoneOffset", "placeholder", "onBlur", "raw", "disabled", "level", "daysFromNowShortcuts", "monthsFromNowShortcuts"];
17
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
18
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
19
+ const CALENDAR_LEVEL_DAY = 'day';
20
+ const CALENDAR_LEVEL_MONTH = 'month';
21
+ const CALENDAR_LEVEL_YEAR = 'year';
22
+ const LEVELS = [CALENDAR_LEVEL_DAY, CALENDAR_LEVEL_MONTH, CALENDAR_LEVEL_YEAR];
23
+
24
+ // Nome fixo do @keyframes preservado: um `keyframes` do styled-components geraria um nome
25
+ // com hash, diferente do atual "datePickerFadeInDown" (quebraria quem lê animationName). Por
26
+ // isso o bloco fica fora de um template styled/css/keyframes, registrado pelo CSSOM (sem
27
+ // nonce) no primeiro render do DatePickerContainer (mesmo padrão de components/src/Loading.jsx).
28
+ const injectDatePickerFadeInDownKeyframes = () => insertKeyframes('datePickerFadeInDown', 'from { opacity: 0; transform: translateY(-10px); pointer-events: none; } to { opacity: 1; transform: none; pointer-events: none; }');
29
+
30
+ // styled(DatePickerContainerBase) mira num componente, não numa tag: ao contrário do antigo
31
+ // styled.div, o styled-components não filtra prop inválida pra <div> nesse caso. O template
32
+ // abaixo não lê nenhuma prop custom, então repassar tudo com {...props} é seguro.
33
+ const DatePickerContainerBase = /*#__PURE__*/React.forwardRef((props, ref) => {
34
+ injectDatePickerFadeInDownKeyframes();
35
+ return /*#__PURE__*/React.createElement("div", _extends({
36
+ ref: ref
37
+ }, props));
38
+ });
39
+ const DatePickerContainer = styled(DatePickerContainerBase)`
40
+ width: 20rem;
41
+ position: absolute;
42
+ z-index: 100;
43
+ background-color: white;
44
+ border-radius: 5px;
45
+ border: 1px solid ${__yakProps => {
46
+ const v = getColor('gray210');
47
+ return typeof v === 'function' ? v(__yakProps) : v;
48
+ }};
49
+ user-select: none;
50
+ box-shadow: 0 0 4px 0 rgba(0,0,0,0.2);
51
+ font-size: 13px;
52
+ text-align: center;
53
+ animation: 0.2s datePickerFadeInDown ease-out;
54
+ display: none;
55
+ @supports (flex-wrap: wrap) {
56
+ display: block;
57
+ }
58
+ input {
59
+ padding-right: 2.25rem;
60
+ @media (max-width: 600px) {
61
+ width: 2.5rem;
62
+ }
63
+ }
64
+ `;
65
+ const CalendarHeader = styled(yakDomTag("div"))`
66
+ display: flex;
67
+ padding: 0.5rem;
68
+ align-items: center;
69
+ `;
70
+ const CalendarContentContainer = styled(yakDomTag("div"))`
71
+ padding: 0 0.5rem 0.5rem 0.5rem;
72
+ display: flex;
73
+ flex-wrap: wrap;
74
+ justify-content: space-around;
75
+ `;
76
+ const WeekHeader = styled(CalendarContentContainer)`
77
+ font-size: 12px;
78
+ font-weight: 600;
79
+ cursor: default;
80
+ span {
81
+ width: 2.5rem;
82
+ }
83
+ `;
84
+ const CalendarClickable = styled(yakDomTag("a"))`
85
+ &:hover, &:focus {
86
+ background-color: rgba(0,0,0,0.1);
87
+ cursor: pointer;
88
+ }
89
+ `;
90
+ const TitleButton = styled(CalendarClickable)`
91
+ font-size: 16px;
92
+ font-weight: 600;
93
+ flex-grow: 1;
94
+ border-radius: 4px;
95
+ line-height: 3rem;
96
+ `;
97
+ const NavigationButton = styled(CalendarClickable)`
98
+ font-size: 21px;
99
+ width: 3rem;
100
+ text-align: center;
101
+ border-radius: 4px;
102
+ height: 3rem;
103
+ ${Icon} {
104
+ line-height: 3rem;
105
+ }
106
+ `;
107
+ const CalendarContent = styled(CalendarClickable)`
108
+ line-height: 2.25rem;
109
+ flex-grow: 1;
110
+ display: inline-block;
111
+ border-radius: 5px;
112
+ margin-top: 0.25rem;
113
+ margin-left: 0.25rem;
114
+ ${__yakProps => __yakProps["isEdge"] && css`color: rgba(0,0,0,0.4);`}
115
+ ${__yakProps => __yakProps["isSelected"] && css`box-shadow: inset 0 0 0 1px ${__yakProps => {
116
+ const v = getColor('gray210');
117
+ return typeof v === 'function' ? v(__yakProps) : v;
118
+ }};`}
119
+ ${__yakProps => __yakProps["isDisabled"] && css`pointer-events: none;
120
+ opacity: 0.5;`}
121
+ ${__yakProps => __yakProps["isCurrent"] && css`
122
+ background: ${__yakProps => {
123
+ const v = getColor('main');
124
+ return typeof v === 'function' ? v(__yakProps) : v;
125
+ }};
126
+ color: #FFF;
127
+ &:hover {
128
+ background-color: ${props => darken(0.075, getColor('main')(props))};
129
+ }
130
+ ${__yakProps => __yakProps["isSelected"] && css`box-shadow: none;`}
131
+ `}
132
+ `;
133
+ const DayItem = styled(CalendarContent)`
134
+ ${props => props.index % 7 === 0 && css`margin-left:0;`}
135
+ flex-basis: 12%;
136
+ `;
137
+ const MonthItem = styled(CalendarContent)`
138
+ ${props => props.index % 3 === 0 && css`margin-left:0;`}
139
+ flex-basis: 30%;
140
+ `;
141
+ const YearItem = styled(CalendarContent)`
142
+ ${props => props.index % 3 === 0 && css`margin-left:0;`}
143
+ flex-basis: 30%;
144
+ `;
145
+ const DatePickerInputIcon = styled(Icon)`
146
+ position: absolute;
147
+ outline: none;
148
+ bottom: 0;
149
+ font-size: 21px;
150
+ line-height: 3rem;
151
+ right: 0;
152
+ width: 2rem;
153
+ cursor: pointer;
154
+ color: ${__yakProps => {
155
+ const v = getColor('gray150');
156
+ return typeof v === 'function' ? v(__yakProps) : v;
157
+ }};
158
+ &:hover {
159
+ color: ${__yakProps => {
160
+ const v = getColor('main');
161
+ return typeof v === 'function' ? v(__yakProps) : v;
162
+ }};
163
+ }
164
+ display: none;
165
+ @supports (flex-wrap: wrap) {
166
+ display: block;
167
+ }
168
+ ${props => props.disabled && css`pointer-events: none;`}
169
+ @media (max-width: 600px) {
170
+ line-height: 42px;
171
+ width: 2.25rem;
172
+ }
173
+ `;
174
+ styled(Icon)`
175
+ color: ${__yakProps => {
176
+ const v = getColor('gray90');
177
+ return typeof v === 'function' ? v(__yakProps) : v;
178
+ }};
179
+ font-size: 12px;
180
+ position: absolute;
181
+ right: 40px;
182
+ bottom: 0;
183
+ transform: translateY(-50%);
184
+ cursor: pointer;
185
+ width: 1.5rem;
186
+ line-height: 1.5rem;
187
+ text-align: center;
188
+ border-radius: 50%;
189
+ background: rgba(0,0,0,0.1);
190
+ &:hover {
191
+ background: #f7d3d4;
192
+ color: ${__yakProps => {
193
+ const v = getColor('alert');
194
+ return typeof v === 'function' ? v(__yakProps) : v;
195
+ }};
196
+ }
197
+ `;
198
+ const InputAndIconWrapper = styled(yakDomTag("div"))`
199
+ position: relative;
200
+ `;
201
+ const ShortcutsWrapper = styled(yakDomTag("div"))`
202
+ display: flex;
203
+ flex-wrap: wrap;
204
+ gap: 0.5rem;
205
+ padding: 0.5rem 0.25rem 0;
206
+ color: ${__yakProps => {
207
+ const v = getColor('gray150');
208
+ return typeof v === 'function' ? v(__yakProps) : v;
209
+ }};
210
+
211
+ .link {
212
+ cursor: pointer;
213
+ font-weight: 600;
214
+ text-decoration: underline;
215
+
216
+ @media (max-width: 600px) {
217
+ font-size: 13px;
218
+ }
219
+
220
+ &:hover {
221
+ color: ${__yakProps => {
222
+ const v = getColor('main');
223
+ return typeof v === 'function' ? v(__yakProps) : v;
224
+ }};
225
+ }
226
+
227
+ ${__yakProps => __yakProps["disabled"] && css`
228
+ pointer-events: none;
229
+ opacity: 0.5;
230
+ `}
231
+ }
232
+ `;
233
+ const KeyMapper = level => {
234
+ const upDownSpacing = level === CALENDAR_LEVEL_DAY ? 7 : 3;
235
+ return {
236
+ 'ArrowLeft': -1,
237
+ 'ArrowRight': 1,
238
+ 'ArrowUp': -upDownSpacing,
239
+ 'ArrowDown': upDownSpacing
240
+ };
241
+ };
242
+ const getUTCDate = function (year) {
243
+ let month = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
244
+ let date = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;
245
+ let hour = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;
246
+ let min = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 0;
247
+ let sec = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 0;
248
+ let ms = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : 0;
249
+ return new Date(Date.UTC(year, month, date, hour, min, sec, ms));
250
+ };
251
+ const getUTCDateBefore = function (year) {
252
+ let month = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
253
+ let date = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;
254
+ let hour = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;
255
+ let min = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 0;
256
+ let sec = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 0;
257
+ let ms = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : -1;
258
+ return new Date(Date.UTC(year, month, date, hour, min, sec, ms));
259
+ };
260
+ const DatePicker = /*#__PURE__*/forwardRef((_ref, maybeInputRef) => {
261
+ let {
262
+ format = 'dd/MM/yyyy',
263
+ min = new Date(now().setUTCFullYear(now().getUTCFullYear() - 100)),
264
+ max = new Date(now().setUTCFullYear(now().getUTCFullYear() + 100)),
265
+ weekStartsMonday = false,
266
+ label,
267
+ mandatory,
268
+ tabIndex,
269
+ helpText,
270
+ path,
271
+ timezoneOffset = 0,
272
+ placeholder,
273
+ onBlur,
274
+ raw,
275
+ disabled,
276
+ level,
277
+ daysFromNowShortcuts,
278
+ // Uma array de números representando atalhos de dias a partir de agora, e.g. [0, 1, 3]
279
+ monthsFromNowShortcuts // Uma array de números representando atalhos de meses a partir de agora, e.g. [0, 1, 3]
280
+ } = _ref,
281
+ rest = _objectWithoutProperties(_ref, _excluded);
282
+ const inputRef = useEnsureRef(maybeInputRef);
283
+ const [formValue, setUnoffsetedFormValue, {
284
+ hasErrors
285
+ }] = useInput(_objectSpread({
286
+ path
287
+ }, rest), raw);
288
+ const setFormValue = newV => setUnoffsetedFormValue(_isFinite(newV) && newV !== -1 ? newV - timezoneOffset * 36e5 : newV);
289
+ const popup = usePopupToggle();
290
+ const calendarElement = useRef();
291
+ const messages = useContext(StartlibsContext).dateMessages;
292
+ const time = Number(formValue);
293
+ const offsetedTime = time + timezoneOffset * 36e5;
294
+ const [textValue, setRawTextValue] = useState(!isNaN(time) ? formatDate(new Date(offsetedTime), format, messages) : '');
295
+ const prevValue = usePrevious(textValue);
296
+ const [hasFormatErrors, setHasFormatErrors] = useState(false);
297
+ useEffect(() => {
298
+ if (textValue && prevValue && textValue.length > prevValue.length + 1) {
299
+ setTimeout(() => inputRef.current.setSelectionRange(inputRef.current.value.length + 1, inputRef.current.value.length + 1), 1);
300
+ }
301
+ }, [textValue]);
302
+ const isShortcutsEnabled = !!daysFromNowShortcuts && daysFromNowShortcuts.length > 0 || !!monthsFromNowShortcuts && monthsFromNowShortcuts.length > 0;
303
+ const setDateToNDaysFromNow = daysFromNow => {
304
+ const date = new Date(now());
305
+ date.setUTCDate(date.getUTCDate() + daysFromNow);
306
+ setFormValue(date.getTime());
307
+ updateText(date);
308
+ };
309
+ const setDateToNMonthsFromNow = monthsFromNow => {
310
+ const date = new Date(now());
311
+ date.setUTCMonth(date.getUTCMonth() + monthsFromNow);
312
+ setFormValue(date.getTime());
313
+ updateText(date);
314
+ };
315
+ const setTextValue = textValue => {
316
+ const value = formValue === -1 || isNaN(formValue) ? now() : new Date(Number(formValue));
317
+ const date = parseDate(textValue, value, format, messages);
318
+ if (isNaN(date.getTime())) {
319
+ const nextMonth = new Date(value);
320
+ const closestLeapYear = new Date(value);
321
+ nextMonth.setUTCMonth(value.getUTCMonth() + 1);
322
+ closestLeapYear.setUTCFullYear(getClosestNextLeapYear(value.getUTCFullYear()));
323
+ const nextMonthDate = parseDate(textValue, nextMonth, format, messages);
324
+ const closestLeapYearDate = parseDate(textValue, closestLeapYear, format, messages);
325
+ setRawTextValue(textValue);
326
+ setHasFormatErrors(isNaN(nextMonthDate.getTime()) && isNaN(closestLeapYearDate));
327
+ } else if (!inRange({
328
+ min,
329
+ max
330
+ }, date)) {
331
+ setRawTextValue(textValue);
332
+ setHasFormatErrors(true);
333
+ setFormValue(-1);
334
+ } else {
335
+ setRawTextValue(textValue);
336
+ setHasFormatErrors(false);
337
+ setFormValue(date.getTime());
338
+ }
339
+ };
340
+ const updateText = date => {
341
+ setTextValue(formatDate(date, format, messages));
342
+ setHasFormatErrors(false);
343
+ };
344
+ const setValue = value => {
345
+ setFormValue(value);
346
+ updateText(new Date(value));
347
+ };
348
+ const confirmValue = () => {
349
+ popup.close();
350
+ if (!textValue) {
351
+ setFormValue(undefined);
352
+ setHasFormatErrors(false);
353
+ } else {
354
+ const date = parseDate(textValue, new Date(formValue), format, messages, true);
355
+ if (isNaN(date.getTime())) {
356
+ setHasFormatErrors(true);
357
+ setFormValue(-1);
358
+ } else {
359
+ updateText(date);
360
+ }
361
+ }
362
+ };
363
+ const _onBlur = e => {
364
+ const currentTarget = e.currentTarget;
365
+ setTimeout(() => {
366
+ if (!currentTarget.contains(document.activeElement)) {
367
+ confirmValue();
368
+ }
369
+ callIfFunction(onBlur);
370
+ }, 1);
371
+ };
372
+ const onKeyDown = e => {
373
+ const isConfirm = e.key === 'Enter';
374
+ if (Object.keys(KeyMapper()).indexOf(e.key) >= 0 || isConfirm) {
375
+ if (popup.isOpen) {
376
+ e.preventDefault();
377
+ calendarElement.current.keyDown(e);
378
+ }
379
+ }
380
+ if (e.key === 'Escape') {
381
+ e.stopPropagation();
382
+ popup.close();
383
+ const date = new Date(formValue);
384
+ if (!isNaN(date.getTime())) updateText(date);
385
+ }
386
+ };
387
+ const refocus = e => inputRef.current.focus();
388
+ const onClick = e => {
389
+ if (disabled) return;
390
+ e.stopPropagation();
391
+ refocus();
392
+ };
393
+ const iconClick = e => {
394
+ e.stopPropagation();
395
+ if (popup.isOpen) {
396
+ refocus();
397
+ popup.close();
398
+ } else {
399
+ refocus();
400
+ }
401
+ };
402
+ const stopFocusPropagation = e => e.stopPropagation();
403
+
404
+ // const calendarValue = new Date(!isNaN(time) && formValue !== -1 ? offsetedTime : now())
405
+ const calendarValue = new Date(!isNaN(time) && formValue !== -1 ? offsetedTime : nowTimeZoneAdjusted(timezoneOffset));
406
+ calendarValue.setUTCHours(0, 0, 0);
407
+ return /*#__PURE__*/React.createElement(Field, {
408
+ helpText: helpText,
409
+ label: label,
410
+ mandatory: mandatory,
411
+ onClick: onClick,
412
+ onFocus: popup.open,
413
+ onBlur: _onBlur
414
+ }, /*#__PURE__*/React.createElement(InputAndIconWrapper, null, /*#__PURE__*/React.createElement(TextInput, {
415
+ raw: true,
416
+ disabled: disabled,
417
+ type: getNumberInputType(),
418
+ tabIndex: tabIndex,
419
+ ref: inputRef,
420
+ constraint: formatDateToPattern(format),
421
+ value: textValue,
422
+ setValue: setTextValue,
423
+ placeholder: placeholder,
424
+ hasErrors: hasErrors || hasFormatErrors,
425
+ onKeyDown: onKeyDown
426
+ }), /*#__PURE__*/React.createElement(DatePickerInputIcon, {
427
+ tabIndex: -1,
428
+ onFocus: stopFocusPropagation,
429
+ disabled: disabled,
430
+ onClick: iconClick,
431
+ icon: "calendar",
432
+ className: isShortcutsEnabled ? "hasShortcuts" : ""
433
+ })), (daysFromNowShortcuts === null || daysFromNowShortcuts === void 0 ? void 0 : daysFromNowShortcuts.length) > 0 || (monthsFromNowShortcuts === null || monthsFromNowShortcuts === void 0 ? void 0 : monthsFromNowShortcuts.length) > 0 ? /*#__PURE__*/React.createElement(ShortcutsWrapper, null, /*#__PURE__*/React.createElement("span", null, "Em:"), daysFromNowShortcuts === null || daysFromNowShortcuts === void 0 ? void 0 : daysFromNowShortcuts.map(daysFromNow => /*#__PURE__*/React.createElement("span", {
434
+ class: "link",
435
+ key: `days-from-now-${daysFromNow}`,
436
+ onClick: () => setDateToNDaysFromNow(daysFromNow),
437
+ disabled: disabled
438
+ }, daysFromNow, " dia", daysFromNow > 1 ? 's' : '')), monthsFromNowShortcuts === null || monthsFromNowShortcuts === void 0 ? void 0 : monthsFromNowShortcuts.map(monthsFromNow => /*#__PURE__*/React.createElement("span", {
439
+ class: "link",
440
+ key: `months-from-now${monthsFromNow}`,
441
+ onClick: () => setDateToNMonthsFromNow(monthsFromNow),
442
+ disabled: disabled
443
+ }, monthsFromNow, " ", monthsFromNow > 1 ? 'meses' : 'mês'))) : null, popup.isOpen && /*#__PURE__*/React.createElement(DatePickerCalendar, {
444
+ raw: true,
445
+ min: min,
446
+ max: max,
447
+ level: level,
448
+ weekStartsMonday: weekStartsMonday,
449
+ messages: messages,
450
+ ref: calendarElement,
451
+ updateTransientValue: updateText,
452
+ refocus: refocus,
453
+ onSelectDay: popup.toggle,
454
+ setValue: setValue,
455
+ value: calendarValue.getTime()
456
+ }));
457
+ });
458
+ const defaultProps = {
459
+ format: 'dd/MM/yyyy',
460
+ min: new Date(now().setUTCFullYear(now().getUTCFullYear() - 100)),
461
+ max: new Date(now().setUTCFullYear(now().getUTCFullYear() + 100)),
462
+ weekStartsMonday: false
463
+ };
464
+ class RawDatePickerCalendar extends React.Component {
465
+ constructor(props) {
466
+ super(props);
467
+ this.element = void 0;
468
+ this.setCurrentDatePlus = (n, type) => () => {
469
+ const date = new Date(this.state.currentDate.getTime());
470
+ switch (type) {
471
+ case CALENDAR_LEVEL_DAY:
472
+ date.setUTCDate(date.getUTCDate() + n);
473
+ break;
474
+ case CALENDAR_LEVEL_MONTH:
475
+ date.setUTCMonth(date.getUTCMonth() + n);
476
+ break;
477
+ case CALENDAR_LEVEL_YEAR:
478
+ date.setUTCFullYear(date.getUTCFullYear() + n);
479
+ break;
480
+ }
481
+ this.props.updateTransientValue && this.props.updateTransientValue(date);
482
+ this.setState({
483
+ currentDate: date
484
+ });
485
+ };
486
+ this.up = () => {
487
+ this.setState({
488
+ level: LEVELS[LEVELS.indexOf(this.state.level) + 1]
489
+ });
490
+ };
491
+ this.keyDown = e => {
492
+ const {
493
+ level,
494
+ currentDate
495
+ } = this.state;
496
+ const keyMapper = KeyMapper(level);
497
+ if (keyMapper[e.key]) {
498
+ e.preventDefault();
499
+ this.setCurrentDatePlus(keyMapper[e.key], level)();
500
+ }
501
+ if (e.key === 'Enter') {
502
+ e.stopPropagation();
503
+ e.preventDefault();
504
+ this.handleChange(currentDate);
505
+ }
506
+ };
507
+ this.handleChange = date => {
508
+ this.props.setValue(date.getTime());
509
+ if (this.state.level === CALENDAR_LEVEL_DAY && this.props.onSelectDay) {
510
+ this.props.onSelectDay();
511
+ }
512
+ this.setState({
513
+ level: LEVELS[Math.max(LEVELS.indexOf(this.state.level) - 1, 0)]
514
+ });
515
+ };
516
+ this.getView = () => {
517
+ switch (this.state.level) {
518
+ case CALENDAR_LEVEL_DAY:
519
+ return /*#__PURE__*/React.createElement(Calendar, _extends({}, this.props, this.state, {
520
+ handleChange: this.handleChange,
521
+ changeCurrentDate: this.setCurrentDatePlus,
522
+ up: this.up
523
+ }));
524
+ case CALENDAR_LEVEL_MONTH:
525
+ return /*#__PURE__*/React.createElement(Months, _extends({}, this.props, this.state, {
526
+ handleChange: this.handleChange,
527
+ changeCurrentDate: this.setCurrentDatePlus,
528
+ up: this.up
529
+ }));
530
+ case CALENDAR_LEVEL_YEAR:
531
+ return /*#__PURE__*/React.createElement(Years, _extends({}, this.props, this.state, {
532
+ handleChange: this.handleChange,
533
+ changeCurrentDate: this.setCurrentDatePlus
534
+ }));
535
+ default:
536
+ return null;
537
+ }
538
+ };
539
+ this.setRef = e => {
540
+ this.element = e;
541
+ };
542
+ this.state = {
543
+ level: this.props.level || CALENDAR_LEVEL_DAY,
544
+ currentDate: new Date(props.value || now())
545
+ };
546
+ }
547
+ componentDidUpdate(prevProps) {
548
+ if (prevProps.value !== this.props.value) {
549
+ this.setState({
550
+ currentDate: new Date(this.props.value)
551
+ });
552
+ }
553
+ }
554
+ render() {
555
+ return /*#__PURE__*/React.createElement("div", {
556
+ ref: this.setRef,
557
+ tabIndex: -1,
558
+ onFocus: this.props.refocus,
559
+ onKeyDown: this.keyDown
560
+ }, this.getView());
561
+ }
562
+ }
563
+ RawDatePickerCalendar.defaultProps = defaultProps;
564
+ const DatePickerCalendar = enhanceInput(RawDatePickerCalendar);
565
+ function now() {
566
+ const dt = new Date();
567
+ dt.setUTCHours(0, 0, 0, 0);
568
+ return dt;
569
+ }
570
+ function nowTimeZoneAdjusted(timezoneOffset) {
571
+ const timezoneOffsetMilliseconds = timezoneOffset * 3600000; // 3600000 milliseconds in an hour
572
+ const dt = new Date();
573
+ dt.setTime(dt.getTime() + timezoneOffsetMilliseconds);
574
+ dt.setUTCHours(0, 0, 0, 0);
575
+ return dt;
576
+ }
577
+ function inRange(context, date) {
578
+ return context.min <= date && context.max >= date;
579
+ }
580
+ const mapDays = (currentDate, dayOffset, fn) => {
581
+ const month = [];
582
+ const iter = new Date(currentDate);
583
+ iter.setUTCDate(1);
584
+ let startDay = dayOffset + iter.getUTCDate() - iter.getUTCDay();
585
+ if (startDay > 1 && startDay < 10) {
586
+ startDay = startDay - 7;
587
+ }
588
+ iter.setUTCDate(startDay);
589
+ for (let week = 0; week < 6; week++) {
590
+ for (let day = week * 7; day < week * 7 + 7; day++) {
591
+ month.push(fn(iter, startDay + day, day));
592
+ iter.setUTCDate(iter.getUTCDate() + 1);
593
+ }
594
+ }
595
+ return month;
596
+ };
597
+ const Calendar = _ref2 => {
598
+ let {
599
+ messages,
600
+ max,
601
+ min,
602
+ value,
603
+ currentDate,
604
+ weekStartsMonday,
605
+ changeCurrentDate,
606
+ handleChange,
607
+ up
608
+ } = _ref2;
609
+ const currentMonth = currentDate.getUTCMonth();
610
+ const dayOffset = weekStartsMonday ? 1 : 0;
611
+ const today = now().getTime();
612
+ const handleDateChange = e => {
613
+ const date = new Date(currentDate);
614
+ handleChange(new Date(date.setUTCDate(e.currentTarget.getAttribute('data-day'))));
615
+ };
616
+ const previousMonth = getUTCDateBefore(currentDate.getUTCFullYear(), currentDate.getUTCMonth());
617
+ const nextMonth = getUTCDate(currentDate.getUTCFullYear(), currentDate.getUTCMonth() + 1);
618
+ return /*#__PURE__*/React.createElement(DatePickerContainer, null, /*#__PURE__*/React.createElement(CalendarHeader, null, /*#__PURE__*/React.createElement(NavigationButton, {
619
+ disabled: !inRange({
620
+ min,
621
+ max
622
+ }, previousMonth),
623
+ onClick: changeCurrentDate(-1, CALENDAR_LEVEL_MONTH)
624
+ }, /*#__PURE__*/React.createElement(Icon, {
625
+ icon: "arrow-left-line"
626
+ })), /*#__PURE__*/React.createElement(TitleButton, {
627
+ onClick: up
628
+ }, messages('month', currentMonth), " ", currentDate.getUTCFullYear()), /*#__PURE__*/React.createElement(NavigationButton, {
629
+ disabled: !inRange({
630
+ min,
631
+ max
632
+ }, nextMonth),
633
+ onClick: changeCurrentDate(1, CALENDAR_LEVEL_MONTH)
634
+ }, /*#__PURE__*/React.createElement(Icon, {
635
+ icon: "arrow-right-line"
636
+ }))), /*#__PURE__*/React.createElement(WeekHeader, null, [0, 1, 2, 3, 4, 5, 6].map(day => /*#__PURE__*/React.createElement("span", {
637
+ key: day
638
+ }, messages('day', (day + dayOffset) % 7).slice(0, 3)))), /*#__PURE__*/React.createElement(CalendarContentContainer, null, mapDays(currentDate, dayOffset, (date, day, index) => /*#__PURE__*/React.createElement(DayItem, {
639
+ index: index,
640
+ key: date.getTime(),
641
+ onClick: handleDateChange,
642
+ "data-day": day,
643
+ isEdge: date.getUTCMonth() !== currentMonth,
644
+ isCurrent: date.getTime() === currentDate.getTime(),
645
+ isSelected: date.getTime() === value,
646
+ isDisabled: !inRange({
647
+ max,
648
+ min
649
+ }, date),
650
+ isToday: date.getTime() === today
651
+ }, date.getUTCDate()))));
652
+ };
653
+ const Months = _ref3 => {
654
+ let {
655
+ currentDate,
656
+ messages,
657
+ value,
658
+ changeCurrentDate,
659
+ handleChange,
660
+ up,
661
+ min,
662
+ max
663
+ } = _ref3;
664
+ const currentMonth = currentDate.getUTCMonth();
665
+ const sameYear = currentDate.getUTCFullYear() === new Date(value).getUTCFullYear();
666
+ const selectedMonth = sameYear ? currentDate.getUTCMonth() : undefined;
667
+ const handleMonthChange = e => {
668
+ const date = new Date(currentDate);
669
+ handleChange(new Date(date.setUTCMonth(e.currentTarget.getAttribute('data-month'))));
670
+ };
671
+ return /*#__PURE__*/React.createElement(DatePickerContainer, null, /*#__PURE__*/React.createElement(CalendarHeader, null, /*#__PURE__*/React.createElement(NavigationButton, {
672
+ disabled: !inRange({
673
+ min,
674
+ max
675
+ }, getUTCDateBefore(currentDate.getUTCFullYear())),
676
+ onClick: changeCurrentDate(-1, CALENDAR_LEVEL_YEAR)
677
+ }, /*#__PURE__*/React.createElement(Icon, {
678
+ icon: "arrow-left-line"
679
+ })), /*#__PURE__*/React.createElement(TitleButton, {
680
+ onClick: up
681
+ }, currentDate.getUTCFullYear()), /*#__PURE__*/React.createElement(NavigationButton, {
682
+ disabled: !inRange({
683
+ min,
684
+ max
685
+ }, getUTCDate(currentDate.getUTCFullYear() + 1)),
686
+ onClick: changeCurrentDate(1, CALENDAR_LEVEL_YEAR)
687
+ }, /*#__PURE__*/React.createElement(Icon, {
688
+ icon: "arrow-right-line"
689
+ }))), /*#__PURE__*/React.createElement(CalendarContentContainer, null, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11].map(month => /*#__PURE__*/React.createElement(MonthItem, {
690
+ disabled: !inRange({
691
+ min,
692
+ max
693
+ }, getUTCDate(currentDate.getUTCFullYear(), month)) && !inRange({
694
+ min,
695
+ max
696
+ }, getUTCDateBefore(currentDate.getUTCFullYear(), month + 1)),
697
+ onClick: handleMonthChange,
698
+ key: month,
699
+ "data-month": month,
700
+ index: month,
701
+ isCurrent: currentMonth === month,
702
+ isSelected: selectedMonth === month
703
+ }, messages('month', month).slice(0, 3)))));
704
+ };
705
+
706
+ // Given the specified context, produces an HTML string
707
+ // representing months of the year.
708
+
709
+ function mapYears(currentDate, fn) {
710
+ const result = [];
711
+ const year = currentDate.getUTCFullYear();
712
+ for (let i = 0; i < 4 * 3; i++) {
713
+ result.push(fn(year - year % 10 - 1 + i, i < 1 || i > 10, i));
714
+ }
715
+ return result;
716
+ }
717
+ const Years = _ref4 => {
718
+ let {
719
+ value,
720
+ currentDate,
721
+ changeCurrentDate,
722
+ handleChange,
723
+ min,
724
+ max
725
+ } = _ref4;
726
+ const currentYear = currentDate.getUTCFullYear();
727
+ const selectedYear = new Date(value).getUTCFullYear();
728
+ const handleYearChange = e => {
729
+ const date = new Date(currentDate);
730
+ handleChange(new Date(date.setUTCFullYear(e.currentTarget.getAttribute('data-year'))));
731
+ };
732
+ return /*#__PURE__*/React.createElement(DatePickerContainer, null, /*#__PURE__*/React.createElement(CalendarHeader, null, /*#__PURE__*/React.createElement(NavigationButton, {
733
+ disabled: !inRange({
734
+ min,
735
+ max
736
+ }, getUTCDateBefore(currentDate.getUTCFullYear())),
737
+ onClick: changeCurrentDate(-10, CALENDAR_LEVEL_YEAR)
738
+ }, /*#__PURE__*/React.createElement(Icon, {
739
+ icon: "arrow-left-line"
740
+ })), /*#__PURE__*/React.createElement(TitleButton, null, currentYear - currentYear % 10, "-", currentYear - currentYear % 10 + 9), /*#__PURE__*/React.createElement(NavigationButton, {
741
+ disabled: !inRange({
742
+ min,
743
+ max
744
+ }, getUTCDate(currentDate.getUTCFullYear() + 10)),
745
+ onClick: changeCurrentDate(10, CALENDAR_LEVEL_YEAR)
746
+ }, /*#__PURE__*/React.createElement(Icon, {
747
+ icon: "arrow-right-line"
748
+ }))), /*#__PURE__*/React.createElement(CalendarContentContainer, null, mapYears(currentDate, (year, outside, i) => /*#__PURE__*/React.createElement(YearItem, {
749
+ key: year,
750
+ onClick: handleYearChange,
751
+ disabled: !inRange({
752
+ min,
753
+ max
754
+ }, getUTCDate(year)) && !inRange({
755
+ min,
756
+ max
757
+ }, getUTCDateBefore(year + 1)),
758
+ "data-year": year,
759
+ index: i,
760
+ isCurrent: year === currentYear,
761
+ isSelected: year === selectedYear,
762
+ isEdge: outside
763
+ }, year))));
764
+ };
765
+ function getClosestNextLeapYear(year) {
766
+ let y = isNaN(year) ? now().getUTCFullYear() : year;
767
+ while (!(y % 100 === 0 ? y % 400 === 0 : y % 4 === 0)) {
768
+ y++;
769
+ }
770
+ return y;
771
+ }
772
+
773
+ export { CALENDAR_LEVEL_DAY, CALENDAR_LEVEL_MONTH, CALENDAR_LEVEL_YEAR, DatePicker };
774
+ //# sourceMappingURL=DatePicker.mjs.map