@snack-uikit/fields 0.36.3 → 0.36.5-preview-c8fb5dcc.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 (69) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/README.md +11 -0
  3. package/dist/cjs/components/FieldColor/FieldColor.d.ts +5 -0
  4. package/dist/cjs/components/FieldColor/FieldColor.js +5 -3
  5. package/dist/cjs/components/FieldDate/FieldDate.d.ts +3 -0
  6. package/dist/cjs/components/FieldDate/FieldDate.js +5 -3
  7. package/dist/cjs/components/FieldDecorator/FieldDecorator.d.ts +12 -1
  8. package/dist/cjs/components/FieldDecorator/FieldDecorator.js +5 -3
  9. package/dist/cjs/components/FieldSecure/FieldSecure.d.ts +3 -1
  10. package/dist/cjs/components/FieldSecure/FieldSecure.js +5 -3
  11. package/dist/cjs/components/FieldSelect/FieldSelectMultiple.d.ts +1 -0
  12. package/dist/cjs/components/FieldSelect/FieldSelectMultiple.js +4 -2
  13. package/dist/cjs/components/FieldSelect/FieldSelectSingle.d.ts +1 -0
  14. package/dist/cjs/components/FieldSelect/FieldSelectSingle.js +4 -2
  15. package/dist/cjs/components/FieldSelect/types.d.ts +3 -1
  16. package/dist/cjs/components/FieldSlider/FieldSlider.d.ts +3 -1
  17. package/dist/cjs/components/FieldSlider/FieldSlider.js +5 -3
  18. package/dist/cjs/components/FieldStepper/FieldStepper.d.ts +3 -1
  19. package/dist/cjs/components/FieldStepper/FieldStepper.js +5 -3
  20. package/dist/cjs/components/FieldText/FieldText.d.ts +3 -1
  21. package/dist/cjs/components/FieldText/FieldText.js +5 -3
  22. package/dist/cjs/components/FieldTextArea/FieldTextArea.d.ts +3 -1
  23. package/dist/cjs/components/FieldTextArea/FieldTextArea.js +5 -3
  24. package/dist/cjs/components/FieldTime/FieldTime.d.ts +3 -0
  25. package/dist/cjs/components/FieldTime/FieldTime.js +5 -3
  26. package/dist/cjs/helperComponents/ButtonFieldList/ButtonFieldList.d.ts +1 -1
  27. package/dist/cjs/helperComponents/ButtonFieldList/ButtonFieldList.js +4 -2
  28. package/dist/cjs/types/allFields.d.ts +1 -1
  29. package/dist/esm/components/FieldColor/FieldColor.d.ts +5 -0
  30. package/dist/esm/components/FieldColor/FieldColor.js +2 -2
  31. package/dist/esm/components/FieldDate/FieldDate.d.ts +3 -0
  32. package/dist/esm/components/FieldDate/FieldDate.js +3 -3
  33. package/dist/esm/components/FieldDecorator/FieldDecorator.d.ts +12 -1
  34. package/dist/esm/components/FieldDecorator/FieldDecorator.js +4 -3
  35. package/dist/esm/components/FieldSecure/FieldSecure.d.ts +3 -1
  36. package/dist/esm/components/FieldSecure/FieldSecure.js +2 -2
  37. package/dist/esm/components/FieldSelect/FieldSelectMultiple.d.ts +1 -0
  38. package/dist/esm/components/FieldSelect/FieldSelectMultiple.js +2 -2
  39. package/dist/esm/components/FieldSelect/FieldSelectSingle.d.ts +1 -0
  40. package/dist/esm/components/FieldSelect/FieldSelectSingle.js +2 -2
  41. package/dist/esm/components/FieldSelect/types.d.ts +3 -1
  42. package/dist/esm/components/FieldSlider/FieldSlider.d.ts +3 -1
  43. package/dist/esm/components/FieldSlider/FieldSlider.js +2 -2
  44. package/dist/esm/components/FieldStepper/FieldStepper.d.ts +3 -1
  45. package/dist/esm/components/FieldStepper/FieldStepper.js +2 -2
  46. package/dist/esm/components/FieldText/FieldText.d.ts +3 -1
  47. package/dist/esm/components/FieldText/FieldText.js +2 -2
  48. package/dist/esm/components/FieldTextArea/FieldTextArea.d.ts +3 -1
  49. package/dist/esm/components/FieldTextArea/FieldTextArea.js +2 -2
  50. package/dist/esm/components/FieldTime/FieldTime.d.ts +3 -0
  51. package/dist/esm/components/FieldTime/FieldTime.js +3 -3
  52. package/dist/esm/helperComponents/ButtonFieldList/ButtonFieldList.d.ts +1 -1
  53. package/dist/esm/helperComponents/ButtonFieldList/ButtonFieldList.js +2 -2
  54. package/dist/esm/types/allFields.d.ts +1 -1
  55. package/package.json +4 -4
  56. package/src/components/FieldColor/FieldColor.tsx +5 -1
  57. package/src/components/FieldDate/FieldDate.tsx +15 -1
  58. package/src/components/FieldDecorator/FieldDecorator.tsx +49 -44
  59. package/src/components/FieldSecure/FieldSecure.tsx +5 -1
  60. package/src/components/FieldSelect/FieldSelectMultiple.tsx +2 -0
  61. package/src/components/FieldSelect/FieldSelectSingle.tsx +2 -0
  62. package/src/components/FieldSelect/types.ts +4 -1
  63. package/src/components/FieldSlider/FieldSlider.tsx +5 -0
  64. package/src/components/FieldStepper/FieldStepper.tsx +5 -0
  65. package/src/components/FieldText/FieldText.tsx +5 -0
  66. package/src/components/FieldTextArea/FieldTextArea.tsx +5 -1
  67. package/src/components/FieldTime/FieldTime.tsx +15 -1
  68. package/src/helperComponents/ButtonFieldList/ButtonFieldList.tsx +2 -1
  69. package/src/types/allFields.ts +1 -1
@@ -1,5 +1,15 @@
1
1
  import mergeRefs from 'merge-refs';
2
- import { FocusEvent, forwardRef, KeyboardEvent, MouseEvent, useCallback, useEffect, useMemo, useRef } from 'react';
2
+ import {
3
+ FocusEvent,
4
+ ForwardedRef,
5
+ forwardRef,
6
+ KeyboardEvent,
7
+ MouseEvent,
8
+ useCallback,
9
+ useEffect,
10
+ useMemo,
11
+ useRef,
12
+ } from 'react';
3
13
  import { useUncontrolledProp } from 'uncontrollable';
4
14
 
5
15
  import { Calendar, CalendarProps } from '@snack-uikit/calendar';
@@ -66,6 +76,8 @@ type FieldDateOwnProps = {
66
76
  */
67
77
  showClearButton?: boolean;
68
78
  mode: Mode;
79
+ /** Ref для корневой обертки компонента */
80
+ decoratorRef?: ForwardedRef<HTMLDivElement>;
69
81
  } & Pick<CalendarProps, 'buildCellProps'> &
70
82
  (
71
83
  | {
@@ -105,6 +117,7 @@ export const FieldDate = forwardRef<HTMLInputElement, FieldDateProps>(
105
117
  error,
106
118
  mode,
107
119
  onCopyButtonClick,
120
+ decoratorRef,
108
121
  ...rest
109
122
  },
110
123
  ref,
@@ -307,6 +320,7 @@ export const FieldDate = forwardRef<HTMLInputElement, FieldDateProps>(
307
320
  size={size}
308
321
  error={error}
309
322
  validationState={fieldValidationState}
323
+ ref={decoratorRef}
310
324
  {...extractSupportProps(rest)}
311
325
  >
312
326
  <Dropdown
@@ -1,5 +1,5 @@
1
1
  import cn from 'classnames';
2
- import { ReactNode } from 'react';
2
+ import { forwardRef, ReactNode } from 'react';
3
3
 
4
4
  import { SIZE } from '@snack-uikit/input-private';
5
5
  import { extractSupportProps, WithSupportProps } from '@snack-uikit/utils';
@@ -25,49 +25,54 @@ export type FieldDecoratorProps = WithSupportProps<
25
25
  FooterProps
26
26
  >;
27
27
 
28
- export function FieldDecorator({
29
- children,
30
- className,
31
- label,
32
- labelTooltip,
33
- required,
34
- labelFor,
35
- caption,
36
- length,
37
- hint,
38
- disabled,
39
- readonly,
40
- showHintIcon,
41
- labelTooltipPlacement,
42
- size = SIZE.S,
43
- error,
44
- validationState = VALIDATION_STATE.Default,
45
- ...rest
46
- }: FieldDecoratorProps) {
47
- const isFieldActive = !disabled && !readonly;
48
- const fieldValidationState = getValidationState({ validationState, error });
28
+ export const FieldDecorator = forwardRef<HTMLDivElement, FieldDecoratorProps>(
29
+ (
30
+ {
31
+ children,
32
+ className,
33
+ label,
34
+ labelTooltip,
35
+ required,
36
+ labelFor,
37
+ caption,
38
+ length,
39
+ hint,
40
+ disabled,
41
+ readonly,
42
+ showHintIcon,
43
+ labelTooltipPlacement,
44
+ size = SIZE.S,
45
+ error,
46
+ validationState = VALIDATION_STATE.Default,
47
+ ...rest
48
+ },
49
+ ref,
50
+ ) => {
51
+ const isFieldActive = !disabled && !readonly;
52
+ const fieldValidationState = getValidationState({ validationState, error });
49
53
 
50
- return (
51
- <div className={cn(styles.decorator, className)} {...extractSupportProps(rest)} data-size={size}>
52
- {label && (
53
- <Header
54
- labelTooltipPlacement={labelTooltipPlacement}
55
- required={required}
56
- label={label}
57
- labelTooltip={labelTooltip}
58
- labelFor={labelFor}
59
- caption={caption}
54
+ return (
55
+ <div className={cn(styles.decorator, className)} {...extractSupportProps(rest)} data-size={size} ref={ref}>
56
+ {label && (
57
+ <Header
58
+ labelTooltipPlacement={labelTooltipPlacement}
59
+ required={required}
60
+ label={label}
61
+ labelTooltip={labelTooltip}
62
+ labelFor={labelFor}
63
+ caption={caption}
64
+ size={size}
65
+ />
66
+ )}
67
+ {children}
68
+ <Footer
69
+ length={isFieldActive ? length : undefined}
70
+ hint={error || hint}
71
+ showHintIcon={showHintIcon}
60
72
  size={size}
73
+ validationState={isFieldActive ? fieldValidationState : VALIDATION_STATE.Default}
61
74
  />
62
- )}
63
- {children}
64
- <Footer
65
- length={isFieldActive ? length : undefined}
66
- hint={error || hint}
67
- showHintIcon={showHintIcon}
68
- size={size}
69
- validationState={isFieldActive ? fieldValidationState : VALIDATION_STATE.Default}
70
- />
71
- </div>
72
- );
73
- }
75
+ </div>
76
+ );
77
+ },
78
+ );
@@ -1,5 +1,5 @@
1
1
  import mergeRefs from 'merge-refs';
2
- import { forwardRef, ReactElement, useMemo, useRef, useState } from 'react';
2
+ import { ForwardedRef, forwardRef, ReactElement, useMemo, useRef, useState } from 'react';
3
3
 
4
4
  import {
5
5
  InputPrivate,
@@ -55,6 +55,8 @@ type FieldSecureOwnProps = {
55
55
  prefixIcon?: ReactElement;
56
56
  /** Свойство позволяет грузить данные в поле по требованию */
57
57
  asyncValueGetter?(): Promise<string>;
58
+ /** Ref для корневой обертки компонента */
59
+ decoratorRef?: ForwardedRef<HTMLDivElement>;
58
60
  };
59
61
 
60
62
  export type FieldSecureProps = WithSupportProps<FieldSecureOwnProps & InputProps & WrapperProps>;
@@ -91,6 +93,7 @@ export const FieldSecure = forwardRef<HTMLInputElement, FieldSecureProps>(
91
93
  asyncValueGetter,
92
94
  autoComplete,
93
95
  onCopyButtonClick,
96
+ decoratorRef,
94
97
  ...rest
95
98
  },
96
99
  ref,
@@ -205,6 +208,7 @@ export const FieldSecure = forwardRef<HTMLInputElement, FieldSecureProps>(
205
208
  size={size}
206
209
  error={error}
207
210
  validationState={fieldValidationState}
211
+ ref={decoratorRef}
208
212
  {...extractSupportProps(rest)}
209
213
  >
210
214
  <FieldContainerPrivate
@@ -53,6 +53,7 @@ export const FieldSelectMultiple = forwardRef<HTMLInputElement, FieldSelectMulti
53
53
  resetSearchOnOptionSelection = true,
54
54
  onOpenChange,
55
55
  selectedOptionFormatter = defaultSelectedOptionFormatter,
56
+ decoratorRef,
56
57
  ...rest
57
58
  } = props;
58
59
  const localRef = useRef<HTMLInputElement>(null);
@@ -180,6 +181,7 @@ export const FieldSelectMultiple = forwardRef<HTMLInputElement, FieldSelectMulti
180
181
  {...extractSupportProps(rest)}
181
182
  {...extractFieldDecoratorProps(props)}
182
183
  validationState={fieldValidationState}
184
+ ref={decoratorRef}
183
185
  >
184
186
  <Droplist
185
187
  {...extractListProps(props)}
@@ -60,6 +60,7 @@ export const FieldSelectSingle = forwardRef<HTMLInputElement, FieldSelectSingleP
60
60
  selectedOptionFormatter = defaultSelectedOptionFormatter,
61
61
  enableFuzzySearch = true,
62
62
  onCopyButtonClick,
63
+ decoratorRef,
63
64
  ...rest
64
65
  } = props;
65
66
  const localRef = useRef<HTMLInputElement>(null);
@@ -196,6 +197,7 @@ export const FieldSelectSingle = forwardRef<HTMLInputElement, FieldSelectSingleP
196
197
  {...extractSupportProps(rest)}
197
198
  {...extractFieldDecoratorProps(props)}
198
199
  validationState={fieldValidationState}
200
+ ref={decoratorRef}
199
201
  >
200
202
  <Droplist
201
203
  {...extractListProps(props)}
@@ -1,4 +1,4 @@
1
- import { ReactElement, ReactNode } from 'react';
1
+ import { ForwardedRef, ReactElement, ReactNode } from 'react';
2
2
 
3
3
  import { InputPrivateProps } from '@snack-uikit/input-private';
4
4
  import {
@@ -135,6 +135,9 @@ type FiledSelectCommonProps = WithSupportProps<{
135
135
  onOpenChange?(open: boolean): void;
136
136
 
137
137
  selectedOptionFormatter?: SelectedOptionFormatter;
138
+
139
+ /** Ref для корневой обертки компонента */
140
+ decoratorRef?: ForwardedRef<HTMLDivElement>;
138
141
  }> &
139
142
  Pick<
140
143
  DroplistProps,
@@ -1,6 +1,7 @@
1
1
  import mergeRefs from 'merge-refs';
2
2
  import {
3
3
  FocusEvent,
4
+ ForwardedRef,
4
5
  forwardRef,
5
6
  KeyboardEvent,
6
7
  ReactElement,
@@ -54,6 +55,8 @@ type FieldSliderOwnProps = {
54
55
  prefix?: ReactNode;
55
56
  /** Произвольный постфикс для поля */
56
57
  postfix?: ReactNode;
58
+ /** Ref для корневой обертки компонента */
59
+ decoratorRef?: ForwardedRef<HTMLDivElement>;
57
60
  };
58
61
 
59
62
  export type FieldSliderProps = WithSupportProps<FieldSliderOwnProps & SliderProps & WrapperProps>;
@@ -106,6 +109,7 @@ export const FieldSlider = forwardRef<HTMLInputElement, FieldSliderProps>(
106
109
  postfixIcon,
107
110
  prefix,
108
111
  postfix,
112
+ decoratorRef,
109
113
  ...rest
110
114
  },
111
115
  ref,
@@ -280,6 +284,7 @@ export const FieldSlider = forwardRef<HTMLInputElement, FieldSliderProps>(
280
284
  showHintIcon={showHintIcon}
281
285
  readonly={readonly}
282
286
  size={size}
287
+ ref={decoratorRef}
283
288
  {...extractSupportProps(rest)}
284
289
  >
285
290
  <FieldContainerPrivate
@@ -3,6 +3,7 @@ import mergeRefs from 'merge-refs';
3
3
  import {
4
4
  ChangeEvent,
5
5
  FocusEvent,
6
+ ForwardedRef,
6
7
  forwardRef,
7
8
  KeyboardEventHandler,
8
9
  MouseEvent,
@@ -59,6 +60,8 @@ type FieldStepperOwnProps = {
59
60
  prefix?: ReactNode;
60
61
  /** Произвольный постфикс для поля */
61
62
  postfix?: ReactNode;
63
+ /** Ref для корневой обертки компонента */
64
+ decoratorRef?: ForwardedRef<HTMLDivElement>;
62
65
  };
63
66
 
64
67
  export type FieldStepperProps = WithSupportProps<FieldStepperOwnProps & InputProps & WrapperProps>;
@@ -111,6 +114,7 @@ export const FieldStepper = forwardRef<HTMLInputElement, FieldStepperProps>(
111
114
  error,
112
115
  prefix,
113
116
  postfix,
117
+ decoratorRef,
114
118
  ...rest
115
119
  },
116
120
  ref,
@@ -223,6 +227,7 @@ export const FieldStepper = forwardRef<HTMLInputElement, FieldStepperProps>(
223
227
  size={size}
224
228
  validationState={fieldValidationState}
225
229
  error={error}
230
+ ref={decoratorRef}
226
231
  {...extractSupportProps(rest)}
227
232
  >
228
233
  <Tooltip
@@ -1,5 +1,6 @@
1
1
  import mergeRefs from 'merge-refs';
2
2
  import {
3
+ ForwardedRef,
3
4
  forwardRef,
4
5
  KeyboardEventHandler,
5
6
  ReactElement,
@@ -72,6 +73,8 @@ type FieldTextOwnProps = {
72
73
  postfix?: ReactNode;
73
74
  /** Кнопка действия внутри поля */
74
75
  button?: Button;
76
+ /** Ref для корневой обертки компонента */
77
+ decoratorRef?: ForwardedRef<HTMLDivElement>;
75
78
  };
76
79
 
77
80
  export type FieldTextProps = WithSupportProps<FieldTextOwnProps & InputProps & WrapperProps>;
@@ -111,6 +114,7 @@ export const FieldText = forwardRef<HTMLInputElement, FieldTextProps>(
111
114
  button: buttonProp,
112
115
  onPaste,
113
116
  onKeyDown,
117
+ decoratorRef,
114
118
  ...rest
115
119
  },
116
120
  ref,
@@ -224,6 +228,7 @@ export const FieldText = forwardRef<HTMLInputElement, FieldTextProps>(
224
228
  size={size}
225
229
  validationState={fieldValidationState}
226
230
  error={error}
231
+ ref={decoratorRef}
227
232
  {...extractSupportProps(rest)}
228
233
  >
229
234
  <FieldContainerPrivate
@@ -1,5 +1,5 @@
1
1
  import mergeRefs from 'merge-refs';
2
- import { ChangeEvent, forwardRef, useMemo, useRef } from 'react';
2
+ import { ChangeEvent, ForwardedRef, forwardRef, useMemo, useRef } from 'react';
3
3
 
4
4
  import { SIZE, useButtonNavigation, useClearButton } from '@snack-uikit/input-private';
5
5
  import { Scroll } from '@snack-uikit/scroll';
@@ -50,6 +50,8 @@ type FieldTextAreaOwnProps = {
50
50
  showClearButton?: boolean;
51
51
  /** Можно ли вводить больше разрешённого кол-ва символов */
52
52
  allowMoreThanMaxLength?: boolean;
53
+ /** Ref для корневой обертки компонента */
54
+ decoratorRef?: ForwardedRef<HTMLDivElement>;
53
55
  };
54
56
 
55
57
  export type FieldTextAreaProps = WithSupportProps<FieldTextAreaOwnProps & InputProps & WrapperProps>;
@@ -85,6 +87,7 @@ export const FieldTextArea = forwardRef<HTMLTextAreaElement, FieldTextAreaProps>
85
87
  size = SIZE.S,
86
88
  validationState = VALIDATION_STATE.Default,
87
89
  onCopyButtonClick,
90
+ decoratorRef,
88
91
  ...rest
89
92
  },
90
93
  ref,
@@ -147,6 +150,7 @@ export const FieldTextArea = forwardRef<HTMLTextAreaElement, FieldTextAreaProps>
147
150
  size={size}
148
151
  error={error}
149
152
  validationState={fieldValidationState}
153
+ ref={decoratorRef}
150
154
  {...extractSupportProps(rest)}
151
155
  >
152
156
  <FieldContainerPrivate
@@ -1,5 +1,15 @@
1
1
  import mergeRefs from 'merge-refs';
2
- import { FocusEvent, forwardRef, KeyboardEvent, MouseEvent, useCallback, useEffect, useMemo, useRef } from 'react';
2
+ import {
3
+ FocusEvent,
4
+ ForwardedRef,
5
+ forwardRef,
6
+ KeyboardEvent,
7
+ MouseEvent,
8
+ useCallback,
9
+ useEffect,
10
+ useMemo,
11
+ useRef,
12
+ } from 'react';
3
13
  import { useUncontrolledProp } from 'uncontrollable';
4
14
 
5
15
  import { TimePicker, TimePickerProps } from '@snack-uikit/calendar';
@@ -61,6 +71,8 @@ type FieldTimeOwnProps = {
61
71
  * @default true
62
72
  */
63
73
  showClearButton?: boolean;
74
+ /** Ref для корневой обертки компонента */
75
+ decoratorRef?: ForwardedRef<HTMLDivElement>;
64
76
  };
65
77
 
66
78
  export type FieldTimeProps = WithSupportProps<FieldTimeOwnProps & InputProps & WrapperProps>;
@@ -113,6 +125,7 @@ export const FieldTime = forwardRef<HTMLInputElement, FieldTimeProps>(
113
125
  validationState = VALIDATION_STATE.Default,
114
126
  error,
115
127
  onCopyButtonClick,
128
+ decoratorRef,
116
129
  ...rest
117
130
  },
118
131
  ref,
@@ -290,6 +303,7 @@ export const FieldTime = forwardRef<HTMLInputElement, FieldTimeProps>(
290
303
  size={size}
291
304
  error={error}
292
305
  validationState={fieldValidationState}
306
+ ref={decoratorRef}
293
307
  {...extractSupportProps(rest)}
294
308
  >
295
309
  <Dropdown
@@ -11,7 +11,7 @@ import styles from './styles.module.scss';
11
11
  type ButtonFieldListProps = Omit<ButtonFieldProps, 'arrowOpen' | 'hasArrow'> & NativeDroplistProps;
12
12
 
13
13
  export const ButtonFieldList = forwardRef<HTMLButtonElement, ButtonFieldListProps>(
14
- ({ items, selection, open, onOpenChange, ...rest }, ref) => {
14
+ ({ items, selection, open, onOpenChange, search, ...rest }, ref) => {
15
15
  const [isOpen, setIsOpen] = useUncontrolledProp(open, false, onOpenChange);
16
16
  const placement = getPlacement(rest);
17
17
 
@@ -23,6 +23,7 @@ export const ButtonFieldList = forwardRef<HTMLButtonElement, ButtonFieldListProp
23
23
  open={isOpen}
24
24
  onOpenChange={setIsOpen}
25
25
  closeDroplistOnItemClick={true}
26
+ search={search}
26
27
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment
27
28
  // @ts-ignore
28
29
  triggerElemRef={ref}
@@ -13,7 +13,7 @@ export type ButtonVariant = ValueOf<typeof BUTTON_VARIANT>;
13
13
 
14
14
  export type AsyncValueRequest = Promise<{ success: boolean; value?: string }>;
15
15
 
16
- export type NativeDroplistProps = Pick<DroplistProps, 'items' | 'open' | 'onOpenChange'> & {
16
+ export type NativeDroplistProps = Pick<DroplistProps, 'items' | 'open' | 'onOpenChange' | 'search'> & {
17
17
  selection?: Omit<SelectionSingleState, 'mode'>;
18
18
  };
19
19