@hh.ru/magritte-ui-input 9.0.12 → 9.1.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.
package/index.js CHANGED
@@ -26,6 +26,6 @@ import './useFocus.js';
26
26
  import '@hh.ru/magritte-ui-typography';
27
27
  import '@hh.ru/magritte-common-number-formatter';
28
28
  import './useDateTimeMask.js';
29
- import './index.esm-LrCm-Ziw.js';
29
+ import './index.esm-CO13rGcB.js';
30
30
  import './useUncontrolledInput.js';
31
31
  //# sourceMappingURL=index.js.map
@@ -1,3 +1,3 @@
1
1
  export { MASKITO_DEFAULT_OPTIONS, type MaskitoOptions, type MaskitoPreprocessor, type MaskitoPostprocessor, } from '@maskito/core';
2
- export { type MaskitoDateMode, maskitoDateOptionsGenerator, maskitoDateTimeOptionsGenerator, maskitoTimeOptionsGenerator, } from '@maskito/kit';
2
+ export { type MaskitoDateMode, maskitoDateOptionsGenerator, maskitoDateRangeOptionsGenerator, maskitoDateTimeOptionsGenerator, maskitoTimeOptionsGenerator, } from '@maskito/kit';
3
3
  export { useMaskito } from '@maskito/react';
@@ -1,4 +1,4 @@
1
1
  import './index.css';
2
- export { M as MASKITO_DEFAULT_OPTIONS, m as maskitoDateOptionsGenerator, a as maskitoDateTimeOptionsGenerator, b as maskitoTimeOptionsGenerator, u as useMaskito } from './index.esm-LrCm-Ziw.js';
2
+ export { M as MASKITO_DEFAULT_OPTIONS, m as maskitoDateOptionsGenerator, a as maskitoDateRangeOptionsGenerator, b as maskitoDateTimeOptionsGenerator, c as maskitoTimeOptionsGenerator, u as useMaskito } from './index.esm-CO13rGcB.js';
3
3
  import 'react';
4
4
  //# sourceMappingURL=maskito-exports.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hh.ru/magritte-ui-input",
3
- "version": "9.0.12",
3
+ "version": "9.1.1",
4
4
  "main": "index.js",
5
5
  "types": "index.d.ts",
6
6
  "sideEffects": [
@@ -31,10 +31,10 @@
31
31
  "@hh.ru/magritte-common-use-multiple-refs": "1.1.9",
32
32
  "@hh.ru/magritte-design-tokens": "23.2.2",
33
33
  "@hh.ru/magritte-ui-breakpoint": "6.0.1",
34
- "@hh.ru/magritte-ui-form-helper": "2.0.7",
35
- "@hh.ru/magritte-ui-icon": "12.3.4",
34
+ "@hh.ru/magritte-ui-form-helper": "2.0.8",
35
+ "@hh.ru/magritte-ui-icon": "13.0.0",
36
36
  "@hh.ru/magritte-ui-mock-component": "1.1.5",
37
- "@hh.ru/magritte-ui-typography": "4.2.3"
37
+ "@hh.ru/magritte-ui-typography": "4.2.4"
38
38
  },
39
39
  "devDependencies": {
40
40
  "@maskito/core": "2.4.0",
@@ -44,5 +44,5 @@
44
44
  "publishConfig": {
45
45
  "access": "public"
46
46
  },
47
- "gitHead": "8ca374027f73643dd942a6d0a2d23ec870924a20"
47
+ "gitHead": "d768537d405d3ee73756252543f1cba4402e3d0e"
48
48
  }
package/types.d.ts CHANGED
@@ -140,6 +140,8 @@ export type DateTimeInputProps = InputBaseProps & {
140
140
  onButtonClick?: OnButtonClickType;
141
141
  /** Флаг скрытия маски при вводе */
142
142
  hideMask?: boolean;
143
+ /** Флаг ввода диапазона значений. Работает только с масками mm.yyyy и dd.mm.yyyy */
144
+ range?: boolean;
143
145
  };
144
146
  export type ControlledDateTimeInputProps = DateTimeInputProps & ControlledProps;
145
147
  export type UncontrolledDateTimeInputProps = DateTimeInputProps & UncontrolledProps;
@@ -1,3 +1,3 @@
1
1
  import { RefCallback } from 'react';
2
2
  import { type TimeInputRounding, type DateInputMask } from '@hh.ru/magritte-ui-input/types';
3
- export declare const useDateTimeMask: (dateMask?: DateInputMask, timeMask?: boolean, timeRounding?: TimeInputRounding) => RefCallback<HTMLElement>;
3
+ export declare const useDateTimeMask: (dateMask?: DateInputMask, timeMask?: boolean, timeRounding?: TimeInputRounding, range?: boolean) => RefCallback<HTMLElement>;
@@ -1,6 +1,6 @@
1
1
  import './index.css';
2
2
  import { useMemo } from 'react';
3
- import { M as MASKITO_DEFAULT_OPTIONS, a as maskitoDateTimeOptionsGenerator, m as maskitoDateOptionsGenerator, b as maskitoTimeOptionsGenerator, u as useMaskito } from './index.esm-LrCm-Ziw.js';
3
+ import { M as MASKITO_DEFAULT_OPTIONS, b as maskitoDateTimeOptionsGenerator, a as maskitoDateRangeOptionsGenerator, m as maskitoDateOptionsGenerator, c as maskitoTimeOptionsGenerator, u as useMaskito } from './index.esm-CO13rGcB.js';
4
4
 
5
5
  /**
6
6
  * Округление времени (в формате 00:00) до ближайшего заданного шага
@@ -94,7 +94,7 @@ const formatDDMaskPostprocessor = (state) => {
94
94
  }
95
95
  return state;
96
96
  };
97
- const useDateTimeMask = (dateMask, timeMask, timeRounding) => {
97
+ const useDateTimeMask = (dateMask, timeMask, timeRounding, range) => {
98
98
  const options = useMemo(() => {
99
99
  // маска 'dd' - исключение, которого нету в maskito api:
100
100
  if (dateMask === 'dd') {
@@ -105,6 +105,7 @@ const useDateTimeMask = (dateMask, timeMask, timeRounding) => {
105
105
  }
106
106
  const dateSeparator = '.';
107
107
  const dateMode = dateMask?.replace(/\./g, '/');
108
+ const rangeSeparator = ' – ';
108
109
  const timeMode = 'HH:MM';
109
110
  let options = { ...MASKITO_DEFAULT_OPTIONS };
110
111
  if (dateMask && timeMask) {
@@ -115,10 +116,16 @@ const useDateTimeMask = (dateMask, timeMask, timeRounding) => {
115
116
  });
116
117
  }
117
118
  else if (dateMask) {
118
- options = maskitoDateOptionsGenerator({
119
- mode: dateMode,
120
- separator: dateSeparator,
121
- });
119
+ options = range
120
+ ? maskitoDateRangeOptionsGenerator({
121
+ mode: dateMode,
122
+ dateSeparator,
123
+ rangeSeparator,
124
+ })
125
+ : maskitoDateOptionsGenerator({
126
+ mode: dateMode,
127
+ separator: dateSeparator,
128
+ });
122
129
  }
123
130
  else if (timeMask) {
124
131
  options = maskitoTimeOptionsGenerator({
@@ -137,7 +144,7 @@ const useDateTimeMask = (dateMask, timeMask, timeRounding) => {
137
144
  roundTimePostprocessor(Boolean(timeRounding && timeMode), timeRounding),
138
145
  ],
139
146
  };
140
- }, [dateMask, timeMask, timeRounding]);
147
+ }, [dateMask, timeMask, timeRounding, range]);
141
148
  return useMaskito({ options });
142
149
  };
143
150
 
@@ -1 +1 @@
1
- {"version":3,"file":"useDateTimeMask.js","sources":["../src/useDateTimeMask.ts"],"sourcesContent":["import { RefCallback, useMemo } from 'react';\n\nimport {\n MASKITO_DEFAULT_OPTIONS,\n MaskitoOptions,\n MaskitoPreprocessor,\n MaskitoPostprocessor,\n MaskitoDateMode,\n maskitoDateOptionsGenerator,\n maskitoDateTimeOptionsGenerator,\n maskitoTimeOptionsGenerator,\n useMaskito,\n} from '@hh.ru/magritte-ui-input/maskito-exports';\nimport { type TimeInputRounding, type DateInputMask } from '@hh.ru/magritte-ui-input/types';\n\n/**\n * Округление времени (в формате 00:00) до ближайшего заданного шага\n *\n * @param dateTime {String} Строка с постфиксом HH:MM, где H - часы, M - минуты\n * @param roundValue {Number} Шаг для округления\n * @returns {String}\n *\n * @example\n * roundTime('20.12.2023 15:19', 15); // '20.12.2023 15:15'\n * @example\n * roundTime('15:31', 60); // '16:00'\n */\nconst roundTime = (dateTime: string, roundValue: TimeInputRounding): string => {\n const regexp = /(\\d{2}):(\\d{2})$/;\n const match = dateTime.match(regexp);\n const time = match?.[0];\n\n if (time) {\n const [hours, minutes] = time.split(':').map(Number);\n const totalMinutes = hours * 60 + minutes;\n const roundedMinutes = Math.round(totalMinutes / roundValue) * roundValue;\n const roundedHours = Math.floor(roundedMinutes / 60) % 24;\n const formattedHours = String(roundedHours).padStart(2, '0');\n const formattedMinutes = String(roundedMinutes % 60).padStart(2, '0');\n return dateTime.replace(regexp, `${formattedHours}:${formattedMinutes}`);\n }\n\n return dateTime;\n};\n\n/** Постпроцессор для округления времени до заданного шага */\nconst roundTimePostprocessor =\n (enabled: boolean, rounding?: TimeInputRounding): MaskitoPostprocessor =>\n (state) =>\n enabled && rounding ? { ...state, value: roundTime(state.value, rounding) } : state;\n\n/** Препроцессор для автоматического добавления разделителей из маски */\nconst autoSeparatorsPreprocessor = (mask: Array<RegExp | string>): MaskitoPreprocessor => {\n let lastActionIsInsert = false;\n\n return (state, actionType) => {\n if (actionType === 'insert') {\n lastActionIsInsert = true;\n return state;\n }\n\n const canAddSeparator = actionType === 'validation' && lastActionIsInsert;\n lastActionIsInsert = false;\n\n if (canAddSeparator) {\n const { value, selection } = state.elementState;\n const [from, to] = selection;\n let newValue = '';\n const dateArray = value.split('');\n\n for (let i = 0; i < mask.length; i++) {\n if (i < dateArray.length) {\n newValue += dateArray[i];\n } else if (typeof mask[i] === 'string') {\n newValue += mask[i];\n } else {\n break;\n }\n }\n\n const addedCharacters = newValue.length - value.length;\n\n return {\n ...state,\n elementState: {\n value: newValue,\n selection: [from + addedCharacters, to + addedCharacters],\n },\n };\n }\n\n return state;\n };\n};\n\n/** Препроцессор для замены разделителей \"., :;/_\" на точку */\nconst replaceSeparatorsPreprocessor: MaskitoPreprocessor = (state, actionType) => {\n if (actionType === 'insert') {\n return {\n ...state,\n data: state.data\n .replace(/[^0-9., :;/_]/g, '')\n .replace(/[., :;/_]/g, '.')\n .replace(/([^0-9])\\1+/g, '$1'),\n };\n }\n return state;\n};\n\n/** Постпроцессор для преобразования 4 -> 04 при вводе с маской dd */\nconst formatDDMaskPostprocessor: MaskitoPostprocessor = (state) => {\n if (state.value.length === 1 && Number(state.value) > 3) {\n const [from, to] = state.selection;\n return {\n ...state,\n value: state.value.padStart(2, '0'),\n selection: [from + 1, to + 1],\n };\n }\n return state;\n};\n\nexport const useDateTimeMask = (\n dateMask?: DateInputMask,\n timeMask?: boolean,\n timeRounding?: TimeInputRounding\n): RefCallback<HTMLElement> => {\n const options = useMemo<MaskitoOptions>(() => {\n // маска 'dd' - исключение, которого нету в maskito api:\n if (dateMask === 'dd') {\n return {\n mask: /^([0-9]|0\\d|1\\d|2[0-9]|3[01])$/,\n postprocessors: [formatDDMaskPostprocessor],\n };\n }\n\n const dateSeparator = '.';\n const dateMode = dateMask?.replace(/\\./g, '/') as MaskitoDateMode;\n const timeMode = 'HH:MM';\n let options: MaskitoOptions = { ...MASKITO_DEFAULT_OPTIONS };\n\n if (dateMask && timeMask) {\n options = maskitoDateTimeOptionsGenerator({\n dateMode,\n timeMode,\n dateSeparator,\n });\n } else if (dateMask) {\n options = maskitoDateOptionsGenerator({\n mode: dateMode,\n separator: dateSeparator,\n });\n } else if (timeMask) {\n options = maskitoTimeOptionsGenerator({\n mode: timeMode,\n });\n }\n\n return {\n ...options,\n preprocessors: [\n replaceSeparatorsPreprocessor,\n ...(options.preprocessors || []),\n autoSeparatorsPreprocessor(options.mask as Array<RegExp | string>),\n ],\n postprocessors: [\n ...(options.postprocessors || []),\n roundTimePostprocessor(Boolean(timeRounding && timeMode), timeRounding),\n ],\n };\n }, [dateMask, timeMask, timeRounding]);\n\n return useMaskito({ options });\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useDateTimeMask.js","sources":["../src/useDateTimeMask.ts"],"sourcesContent":["import { RefCallback, useMemo } from 'react';\n\nimport {\n MASKITO_DEFAULT_OPTIONS,\n MaskitoOptions,\n MaskitoPreprocessor,\n MaskitoPostprocessor,\n MaskitoDateMode,\n maskitoDateOptionsGenerator,\n maskitoDateRangeOptionsGenerator,\n maskitoDateTimeOptionsGenerator,\n maskitoTimeOptionsGenerator,\n useMaskito,\n} from '@hh.ru/magritte-ui-input/maskito-exports';\nimport { type TimeInputRounding, type DateInputMask } from '@hh.ru/magritte-ui-input/types';\n\n/**\n * Округление времени (в формате 00:00) до ближайшего заданного шага\n *\n * @param dateTime {String} Строка с постфиксом HH:MM, где H - часы, M - минуты\n * @param roundValue {Number} Шаг для округления\n * @returns {String}\n *\n * @example\n * roundTime('20.12.2023 15:19', 15); // '20.12.2023 15:15'\n * @example\n * roundTime('15:31', 60); // '16:00'\n */\nconst roundTime = (dateTime: string, roundValue: TimeInputRounding): string => {\n const regexp = /(\\d{2}):(\\d{2})$/;\n const match = dateTime.match(regexp);\n const time = match?.[0];\n\n if (time) {\n const [hours, minutes] = time.split(':').map(Number);\n const totalMinutes = hours * 60 + minutes;\n const roundedMinutes = Math.round(totalMinutes / roundValue) * roundValue;\n const roundedHours = Math.floor(roundedMinutes / 60) % 24;\n const formattedHours = String(roundedHours).padStart(2, '0');\n const formattedMinutes = String(roundedMinutes % 60).padStart(2, '0');\n return dateTime.replace(regexp, `${formattedHours}:${formattedMinutes}`);\n }\n\n return dateTime;\n};\n\n/** Постпроцессор для округления времени до заданного шага */\nconst roundTimePostprocessor =\n (enabled: boolean, rounding?: TimeInputRounding): MaskitoPostprocessor =>\n (state) =>\n enabled && rounding ? { ...state, value: roundTime(state.value, rounding) } : state;\n\n/** Препроцессор для автоматического добавления разделителей из маски */\nconst autoSeparatorsPreprocessor = (mask: Array<RegExp | string>): MaskitoPreprocessor => {\n let lastActionIsInsert = false;\n\n return (state, actionType) => {\n if (actionType === 'insert') {\n lastActionIsInsert = true;\n return state;\n }\n\n const canAddSeparator = actionType === 'validation' && lastActionIsInsert;\n lastActionIsInsert = false;\n\n if (canAddSeparator) {\n const { value, selection } = state.elementState;\n const [from, to] = selection;\n let newValue = '';\n const dateArray = value.split('');\n\n for (let i = 0; i < mask.length; i++) {\n if (i < dateArray.length) {\n newValue += dateArray[i];\n } else if (typeof mask[i] === 'string') {\n newValue += mask[i];\n } else {\n break;\n }\n }\n\n const addedCharacters = newValue.length - value.length;\n\n return {\n ...state,\n elementState: {\n value: newValue,\n selection: [from + addedCharacters, to + addedCharacters],\n },\n };\n }\n\n return state;\n };\n};\n\n/** Препроцессор для замены разделителей \"., :;/_\" на точку */\nconst replaceSeparatorsPreprocessor: MaskitoPreprocessor = (state, actionType) => {\n if (actionType === 'insert') {\n return {\n ...state,\n data: state.data\n .replace(/[^0-9., :;/_]/g, '')\n .replace(/[., :;/_]/g, '.')\n .replace(/([^0-9])\\1+/g, '$1'),\n };\n }\n return state;\n};\n\n/** Постпроцессор для преобразования 4 -> 04 при вводе с маской dd */\nconst formatDDMaskPostprocessor: MaskitoPostprocessor = (state) => {\n if (state.value.length === 1 && Number(state.value) > 3) {\n const [from, to] = state.selection;\n return {\n ...state,\n value: state.value.padStart(2, '0'),\n selection: [from + 1, to + 1],\n };\n }\n return state;\n};\n\nexport const useDateTimeMask = (\n dateMask?: DateInputMask,\n timeMask?: boolean,\n timeRounding?: TimeInputRounding,\n range?: boolean\n): RefCallback<HTMLElement> => {\n const options = useMemo<MaskitoOptions>(() => {\n // маска 'dd' - исключение, которого нету в maskito api:\n if (dateMask === 'dd') {\n return {\n mask: /^([0-9]|0\\d|1\\d|2[0-9]|3[01])$/,\n postprocessors: [formatDDMaskPostprocessor],\n };\n }\n\n const dateSeparator = '.';\n const dateMode = dateMask?.replace(/\\./g, '/') as MaskitoDateMode;\n const rangeSeparator = ' – ';\n const timeMode = 'HH:MM';\n let options: MaskitoOptions = { ...MASKITO_DEFAULT_OPTIONS };\n\n if (dateMask && timeMask) {\n options = maskitoDateTimeOptionsGenerator({\n dateMode,\n timeMode,\n dateSeparator,\n });\n } else if (dateMask) {\n options = range\n ? maskitoDateRangeOptionsGenerator({\n mode: dateMode,\n dateSeparator,\n rangeSeparator,\n })\n : maskitoDateOptionsGenerator({\n mode: dateMode,\n separator: dateSeparator,\n });\n } else if (timeMask) {\n options = maskitoTimeOptionsGenerator({\n mode: timeMode,\n });\n }\n\n return {\n ...options,\n preprocessors: [\n replaceSeparatorsPreprocessor,\n ...(options.preprocessors || []),\n autoSeparatorsPreprocessor(options.mask as Array<RegExp | string>),\n ],\n postprocessors: [\n ...(options.postprocessors || []),\n roundTimePostprocessor(Boolean(timeRounding && timeMode), timeRounding),\n ],\n };\n }, [dateMask, timeMask, timeRounding, range]);\n\n return useMaskito({ options });\n};\n"],"names":[],"mappings":"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"}