@homecode/ui 4.20.0-beta-5 → 4.20.0-beta-7

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.
@@ -61,8 +61,17 @@ const TEXTAREA_SCROLL_TOP_OFFSET = {
61
61
  l: 50,
62
62
  };
63
63
  const Input = forwardRef((props, ref) => {
64
- const { type = 'text', size = 'm', variant = 'default', value, defaultValue = '', onChange, onFocus, onBlur, onClear, onInput, changeOnEnd, checkAutofill, hasClear, required, hideRequiredStar, disabled, error, label, placeholder, addonLeft, addonRight, forceLabelOnTop, scrollProps, step = 1, round, className, } = props;
65
64
  const inputRef = useRef(null);
65
+ const setRef = (element) => {
66
+ inputRef.current = element;
67
+ if (typeof ref === 'function') {
68
+ ref(element);
69
+ }
70
+ else if (ref) {
71
+ ref.current = element;
72
+ }
73
+ };
74
+ const { type = 'text', size = 'm', variant = 'default', value, defaultValue = '', onChange, onFocus, onBlur, onClear, onInput, changeOnEnd, checkAutofill, hasClear, required, hideRequiredStar, disabled, error, label, placeholder, addonLeft, addonRight, forceLabelOnTop, scrollProps, step = 1, round, className, } = props;
66
75
  const updateAutoComplete = () => {
67
76
  const form = inputRef.current?.closest('form');
68
77
  const val = form?.getAttribute('autocomplete');
@@ -292,7 +301,9 @@ const Input = forwardRef((props, ref) => {
292
301
  }, []);
293
302
  const Control = isTextArea ? 'span' : 'input';
294
303
  const classes = cn(S.root, isTextArea && S.isTextArea, S[`size-${size}`], S[`variant-${variant}`], isFocused && S.isFocused, error && S.hasError, hasClear && S.hasClear, disabled && S.isDisabled, round && S.round, className);
295
- return (jsxs("div", { className: classes, title: String(value), children: [jsxs("label", { className: S.main, children: [jsx("div", { className: S.border, suppressHydrationWarning: true, style: { clipPath: labelClipPath } }, "border"), renderAddon('left'), wrapControl(jsxs(Fragment, { children: [createElement(Control, { ...controlProps, className: cn(S.control, controlProps?.className), ref: inputRef, key: "control" }), isTextArea && controlProps.placeholder && !controlProps.value && (jsx("span", { className: S.placeholder, spellCheck: false, children: controlProps.placeholder }))] })), isNumber && (jsxs("div", { className: S.numberArrows, children: [jsx(Button, { variant: "clear", onClick: () => onNumberWheel(1), tabIndex: -1, children: jsx(Icon, { type: "chevronUp", size: size }) }), jsx(Button, { variant: "clear", onClick: () => onNumberWheel(-1), tabIndex: -1, children: jsx(Icon, { type: "chevronDown", size: size }) })] })), jsx(Label, { className: cn(S.label, addonRight && S.hasAddonRight), size: size, isOnTop: isLabelOnTop, isError: Boolean(error), onClipPathChange: onLabelClipPathChange, children: label }, "label"), renderAddon('right'), required && !hideRequiredStar && (jsx(RequiredStar, { size: size }, "required-star"))] }, "main"), hasClear && !disabled && hasValue && (jsx(Button, { className: S.clearButton, variant: "clear", size: size, square: true, onClick: onClearPress, title: "", children: jsx(Icon, { className: S.clearIcon, size: size, type: "close" }) }, "clear")), !disabled && typeof error === 'string' && (jsx(AssistiveText, { variant: "danger", size: size, children: error }, "assistive-text"))] }));
304
+ return (jsxs("div", { className: classes, title: String(value), children: [jsxs("label", { className: S.main, children: [jsx("div", { className: S.border, suppressHydrationWarning: true, style: { clipPath: labelClipPath } }, "border"), renderAddon('left'), wrapControl(jsxs(Fragment, { children: [createElement(Control, { ...controlProps, className: cn(S.control, controlProps?.className), ref: setRef, key: "control" }), isTextArea &&
305
+ controlProps.placeholder &&
306
+ !controlProps.value && (jsx("span", { className: S.placeholder, spellCheck: false, children: controlProps.placeholder }))] })), isNumber && (jsxs("div", { className: S.numberArrows, children: [jsx(Button, { variant: "clear", onClick: () => onNumberWheel(1), tabIndex: -1, children: jsx(Icon, { type: "chevronUp", size: size }) }), jsx(Button, { variant: "clear", onClick: () => onNumberWheel(-1), tabIndex: -1, children: jsx(Icon, { type: "chevronDown", size: size }) })] })), jsx(Label, { className: cn(S.label, addonRight && S.hasAddonRight), size: size, isOnTop: isLabelOnTop, isError: Boolean(error), onClipPathChange: onLabelClipPathChange, children: label }, "label"), renderAddon('right'), required && !hideRequiredStar && (jsx(RequiredStar, { size: size }, "required-star"))] }, "main"), hasClear && !disabled && hasValue && (jsx(Button, { className: S.clearButton, variant: "clear", size: size, square: true, onClick: onClearPress, title: "", children: jsx(Icon, { className: S.clearIcon, size: size, type: "close" }) }, "clear")), !disabled && typeof error === 'string' && (jsx(AssistiveText, { variant: "danger", size: size, children: error }, "assistive-text"))] }));
296
307
  });
297
308
 
298
309
  export { Input };
@@ -28,6 +28,7 @@ class Select extends Component {
28
28
  scrollInnerElem;
29
29
  onScrollInnerRef = elem => (this.scrollInnerElem = elem);
30
30
  focusedElem;
31
+ selectedElem;
31
32
  items = [];
32
33
  maxIndex = -1;
33
34
  isFirstSelectedMeet = false;
@@ -157,6 +158,9 @@ class Select extends Component {
157
158
  }
158
159
  }
159
160
  };
161
+ onSelectedElemRef = elem => {
162
+ this.selectedElem = elem;
163
+ };
160
164
  onDocumentClick = e => {
161
165
  if (!this.isClickedInside(e.target)) {
162
166
  this.store.isOpen = false;
@@ -524,8 +528,8 @@ class Select extends Component {
524
528
  onPointerUp: () => this.onItemToggle(id),
525
529
  onPointerEnter: () => this.onOptionHover(id),
526
530
  };
527
- if (isFocused || (isSelected && !this.onFocusedElemRef))
528
- // @ts-ignore
531
+ // @ts-ignore
532
+ if (isFocused || isSelected)
529
533
  props.ref = this.onFocusedElemRef;
530
534
  if (isIndeterminate || (isSelected && !this.isFirstSelectedMeet)) {
531
535
  this.isFirstSelectedMeet = true;
@@ -587,7 +591,7 @@ class Select extends Component {
587
591
  const { className, popupProps, size, error, blur, disabled } = this.props;
588
592
  const { isOpen, isFocused } = this.store;
589
593
  const classes = cn(S.root, className, S[`size-${size}`]);
590
- return (jsxs(Fragment, { children: [jsx(Popup, { className: classes, direction: "bottom", size: size, focusControl: true, hoverControl: isFocused, blur: blur, isOpen: isOpen, disabled: disabled, ...popupProps, onOpen: this.onPopupOpen, onClose: this.onPopupClose, trigger: this.renderTrigger(), triggerProps: {
594
+ return (jsxs(Fragment, { children: [jsx(Popup, { className: classes, direction: "bottom", size: size, focusControl: true, hoverControl: isFocused, blur: blur, isOpen: isOpen, disabled: disabled, ...popupProps, onOpen: this.onPopupOpen, onAfterClose: this.onPopupClose, trigger: this.renderTrigger(), triggerProps: {
591
595
  onFocus: this.onFocus,
592
596
  onBlur: this.onBlur,
593
597
  }, content: this.renderOptionsList() }), this.isErrorVisible() && (jsx(AssistiveText, { variant: "danger", size: size, children: error }))] }));
@@ -69,8 +69,10 @@ function Select2(props) {
69
69
  focusedItemId.current = items[index]?.id;
70
70
  setFocusedItemIndex(index);
71
71
  };
72
+ const [isSearchActive, setIsSearchActive] = useState(false);
72
73
  const handleSearchChange = (e, value) => {
73
74
  setSearchVal(value);
75
+ setIsSearchActive(true);
74
76
  onSearchChange?.(value);
75
77
  setNewItems(options.filter(filterOption));
76
78
  };
@@ -108,6 +110,8 @@ function Select2(props) {
108
110
  };
109
111
  const onPopupClose = () => {
110
112
  setIsOpen(false);
113
+ setSearchVal('');
114
+ setIsSearchActive(false);
111
115
  setItemFocus(0);
112
116
  };
113
117
  const onFocus = () => {
@@ -177,7 +181,7 @@ function Select2(props) {
177
181
  const renderTriggerInput = () => {
178
182
  return (jsx(Input, { ...triggerProps, ...inputProps,
179
183
  // TODO: autoComplete
180
- addonRight: triggerArrow, error: isErrorVisible, value: isFocused ? searchVal : selectedLabel, onChange: handleSearchChange, label: getFieldLabel(label) }));
184
+ addonRight: triggerArrow, error: isErrorVisible, value: isFocused && isSearchActive ? searchVal : selectedLabel, onChange: handleSearchChange, label: getFieldLabel(label) }));
181
185
  };
182
186
  const renderAdditionalLabel = () => {
183
187
  return null;
@@ -4,12 +4,33 @@ import { Component, ReactNode } from 'react';
4
4
  export declare const SelectHelpers: typeof H;
5
5
  export declare class Select extends Component<T.Props, T.State> {
6
6
  store: any;
7
- inputRef: import("react").RefObject<(props: import("../Input/Input.types").Props) => JSX.Element>;
7
+ inputRef: import("react").RefObject<import("react").ForwardRefExoticComponent<Omit<import("react").InputHTMLAttributes<HTMLInputElement>, "onChange"> & Omit<import("../Input/Input.types").ControlProps, "onChange" | "ref"> & import("../../types").FormControl<import("../Input/Input.types").Value, HTMLInputElement> & {
8
+ name?: string;
9
+ step?: number;
10
+ size?: import("../../types").Size;
11
+ label?: string;
12
+ variant?: import("../../types").Variant;
13
+ round?: boolean;
14
+ hideRequiredStar?: boolean;
15
+ forceLabelOnTop?: boolean;
16
+ error?: string | boolean;
17
+ hasClear?: boolean;
18
+ changeOnEnd?: boolean;
19
+ addonLeft?: ReactNode;
20
+ addonLeftClassName?: string;
21
+ addonRight?: ReactNode;
22
+ addonRightClassName?: string;
23
+ onClear?: () => void;
24
+ controlProps?: import("../Input/Input.types").ControlProps & import("../../types").ComponentType;
25
+ checkAutofill?: boolean;
26
+ scrollProps?: Partial<import("../Scroll/Scroll.types").Props>;
27
+ } & import("react").RefAttributes<HTMLInputElement>>>;
8
28
  triggerInputRef: import("react").RefObject<HTMLDivElement>;
9
29
  contentRef: import("react").RefObject<HTMLDivElement>;
10
30
  scrollInnerElem: HTMLDivElement;
11
31
  onScrollInnerRef: (elem: any) => any;
12
32
  focusedElem: HTMLDivElement;
33
+ selectedElem: HTMLDivElement;
13
34
  items: any[];
14
35
  maxIndex: number;
15
36
  isFirstSelectedMeet: boolean;
@@ -35,6 +56,7 @@ export declare class Select extends Component<T.Props, T.State> {
35
56
  getDefaultSelected(): any;
36
57
  isClickedInside: (elem: any) => any;
37
58
  onFocusedElemRef: (elem: any) => void;
59
+ onSelectedElemRef: (elem: any) => void;
38
60
  onDocumentClick: (e: any) => void;
39
61
  onDocumentKeyDown: (e: any) => void;
40
62
  onDocumentKeyUp: (e: any) => void;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@homecode/ui",
3
- "version": "4.20.0-beta-5",
3
+ "version": "4.20.0-beta-7",
4
4
  "description": "React UI components library",
5
5
  "scripts": {
6
6
  "test": "jest",