@homecode/ui 4.27.15 → 4.27.17

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/.nvmrc CHANGED
@@ -1 +1 @@
1
- 18
1
+ 22
@@ -63,6 +63,8 @@ function Form(props) {
63
63
  const touchedRef = useRef(touched);
64
64
  const errorsRef = useRef(errors);
65
65
  const onChangeRef = useRef(onChange);
66
+ const onChangeHandlerRef = useRef(null); // Add this
67
+ const onBlurHandlerRef = useRef(null); // Add this
66
68
  const setValues = (newValues) => {
67
69
  _setValues(newValues);
68
70
  valuesRef.current = newValues;
@@ -182,14 +184,18 @@ function Form(props) {
182
184
  const newValues = { ...valuesRef.current, [field]: val };
183
185
  if (onChangeRef.current && !onChangeRef.current(newValues))
184
186
  return;
187
+ const isTouched = !compare(val, initialValues[field]);
185
188
  setValue(field, val);
186
- setFieldTouched(field, true);
189
+ setFieldTouched(field, isTouched);
187
190
  calcChanged(field, val);
188
191
  validate();
189
- }, [calcChanged, validate]);
192
+ }, [calcChanged, validate, initialValues]);
190
193
  const onBlurHandler = useCallback((name) => {
191
194
  setFieldTouched(name, true);
192
195
  }, []);
196
+ // Update refs to always point to latest handlers
197
+ onChangeHandlerRef.current = onChangeHandler;
198
+ onBlurHandlerRef.current = onBlurHandler;
193
199
  const onSubmitHandler = async (e) => {
194
200
  e?.preventDefault();
195
201
  dropFocusFromSubmit();
@@ -199,7 +205,6 @@ function Form(props) {
199
205
  await onSubmit({ ...values });
200
206
  setIsLoading(false);
201
207
  };
202
- // Simple field component - let memo on Field handle optimization
203
208
  const FieldComponent = useRef((fieldProps) => {
204
209
  const { name } = fieldProps;
205
210
  const fullProps = {
@@ -209,8 +214,8 @@ function Form(props) {
209
214
  markEdited,
210
215
  isChanged: changedRef.current[name],
211
216
  isTouched: touchedRef.current[name],
212
- handleChange: onChangeHandler,
213
- handleBlur: onBlurHandler,
217
+ handleChange: (...args) => onChangeHandlerRef.current(...args),
218
+ handleBlur: (...args) => onBlurHandlerRef.current(...args),
214
219
  };
215
220
  if (validationSchemaRef.current?.[name]?.empty === false) {
216
221
  fullProps.required = true;
@@ -238,41 +243,29 @@ function Form(props) {
238
243
  // Effects
239
244
  useEffect(() => {
240
245
  validationSchemaRef.current = validationSchema;
246
+ validate();
241
247
  }, [validationSchema]);
248
+ useEffect(() => {
249
+ defaultValuesRef.current = updateDefaultValues();
250
+ calcChangedAll(initialValues);
251
+ }, [defaultValues]);
252
+ useEffect(() => {
253
+ setValues(cloneValues(initialValues));
254
+ setTouched({});
255
+ setChanged({});
256
+ setIsDirty(false);
257
+ updateIsEmpty();
258
+ validate();
259
+ if (onInit)
260
+ onInit(formAPI);
261
+ }, [initialValues]);
242
262
  useEffect(() => {
243
263
  calcChangedAll();
244
264
  validate();
245
265
  if (onInit)
246
266
  onInit(formAPI);
247
267
  }, []);
248
- useEffect(() => {
249
- const validationChanged = !compare(validationSchema, validationSchemaRef.current);
250
- const initialValsChanged = !compare(initialValues, props.initialValues);
251
- const defaultValsChanged = !compare(defaultValues, props.defaultValues);
252
- if (initialValsChanged) {
253
- setValues(cloneValues(initialValues));
254
- validate();
255
- if (onInit)
256
- onInit(formAPI);
257
- }
258
- if (defaultValsChanged) {
259
- defaultValuesRef.current = updateDefaultValues();
260
- }
261
- if (initialValsChanged || defaultValsChanged) {
262
- calcChangedAll(initialValues);
263
- }
264
- if (initialValsChanged || validationChanged) {
265
- validate();
266
- }
267
- }, [
268
- initialValues,
269
- validationSchema,
270
- defaultValues,
271
- onInit,
272
- formAPI,
273
- calcChangedAll,
274
- validate,
275
- ]);
268
+ console.log('FORM: initialValues', initialValues);
276
269
  const classes = cn(S.root, className, isLoading && S.isLoading);
277
270
  return (jsx("form", { className: classes, ...restProps, onSubmit: onSubmitHandler, children: children(formAPI) }));
278
271
  }
@@ -5,16 +5,16 @@ import { Scroll } from '../Scroll/Scroll.js';
5
5
  import S from './Menu.styl.js';
6
6
 
7
7
  // @ts-ignore
8
- const MenuComponent = forwardRef(({ children, className, ...props }, ref) => {
8
+ const MenuComponent = forwardRef(({ children, className, textOverflow, ...props }, ref) => {
9
9
  const size = props.size || 'm';
10
10
  return (jsx(Scroll, { y: true,
11
11
  // @ts-ignore
12
- ref: ref, className: cn(S.root, className, S[`size-${size}`]), ...props, children: children }));
12
+ ref: ref, className: cn(S.root, className, S[`size-${size}`], textOverflow && S.textOverflow), ...props, children: children }));
13
13
  });
14
14
  const MenuItem = forwardRef((props, ref) => {
15
- const { children, className, selected, focused, disabled, level = 0, onClick, ...rest } = props;
16
- const classes = cn(S.item, level > 0 && S[`level-${level}`], selected && S.selected, focused && S.focused, disabled && S.disabled, className);
17
- return (jsx("div", { ref: ref, className: classes, onClick: disabled ? undefined : onClick, ...rest, children: jsx("span", { children: children }) }));
15
+ const { children, className, selected, focused, disabled, level = 0, onClick, textOverflow, ...rest } = props;
16
+ const classes = cn(S.item, level > 0 && S[`level-${level}`], selected && S.selected, focused && S.focused, disabled && S.disabled, textOverflow && S.textOverflow, className);
17
+ return (jsx("div", { ref: ref, className: classes, onClick: disabled ? undefined : onClick, ...rest, children: textOverflow ? children : jsx("span", { children: children }) }));
18
18
  });
19
19
  const MenuGroup = ({ children, className, label, size = 'm', ...props }) => {
20
20
  return (jsxs(Fragment, { children: [jsx("div", { className: cn(S.group, className, S[`size-${size}`]), ...props, children: label }), children] }));
@@ -1,7 +1,7 @@
1
1
  import styleInject from '../../../node_modules/style-inject/dist/style-inject.es.js';
2
2
 
3
- var css_248z = ".Menu_root__xhtlo{max-height:200px;width:100%}.keyboard .Menu_root__xhtlo{pointer-events:none}.Menu_item__VtmwS{align-items:center;animation:Menu_fadeIn__XRZkT .3s ease-out;cursor:pointer;display:flex;overflow:hidden;padding-bottom:0!important;padding-top:0!important;position:relative;text-align:left;text-overflow:ellipsis;-webkit-user-select:none;-moz-user-select:none;user-select:none;white-space:nowrap;width:100%}.Menu_item__VtmwS:first-child{border-top-left-radius:2px;border-top-right-radius:2px}.Menu_item__VtmwS:last-child{border-bottom-left-radius:2px;border-bottom-right-radius:2px}.Menu_item__VtmwS>span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.Menu_size-s__DA0r3 .Menu_item__VtmwS{font-size:12px;height:30px;padding:0 14px}.Menu_size-m__0EI47 .Menu_item__VtmwS{font-size:16px;height:40px;padding:0 16px}.Menu_size-l__PXpIm .Menu_item__VtmwS{font-size:20px;height:50px;padding:0 18px}.Menu_size-xl__U1WW8 .Menu_item__VtmwS{font-size:24px;height:60px;padding:0 20px}.Menu_item__VtmwS.Menu_selected__V71xy{background-color:var(--active-color-alpha-500)}.Menu_item__VtmwS.Menu_disabled__5afRm{cursor:not-allowed;opacity:.4}.keyboard .Menu_item__VtmwS.Menu_focused__FLWqW,.pointer .Menu_item__VtmwS:hover{box-shadow:inset 100vw 0 0 0 var(--accent-color-alpha-200)}.Menu_group__6e-Ef{background-color:var(--decent-color);color:var(--accent-color);font-size:14px;font-weight:500;padding:8px 12px;pointer-events:none;position:sticky;top:0;z-index:1}.Menu_levelIndent__S6HXJ{--menu-indent-size:var(--indent-s)}.Menu_levelIndent__S6HXJ.Menu_level-1__kueO2{padding-left:calc(var(--menu-indent-size)*2)}.Menu_levelIndent__S6HXJ.Menu_level-2__JZGkJ{padding-left:calc(var(--menu-indent-size)*3)}.Menu_levelIndent__S6HXJ.Menu_level-3__LFd-F{padding-left:calc(var(--menu-indent-size)*4)}.Menu_levelIndent__S6HXJ.Menu_level-4__2DUMl{padding-left:calc(var(--menu-indent-size)*5)}.Menu_levelIndent__S6HXJ.Menu_level-5__xpgvQ{padding-left:calc(var(--menu-indent-size)*6)}@keyframes Menu_fadeIn__XRZkT{0%{opacity:0}10%{opacity:0}to{opacity:1}}";
4
- var S = {"root":"Menu_root__xhtlo","item":"Menu_item__VtmwS","fadeIn":"Menu_fadeIn__XRZkT","size-s":"Menu_size-s__DA0r3","size-m":"Menu_size-m__0EI47","size-l":"Menu_size-l__PXpIm","size-xl":"Menu_size-xl__U1WW8","selected":"Menu_selected__V71xy","disabled":"Menu_disabled__5afRm","focused":"Menu_focused__FLWqW","group":"Menu_group__6e-Ef","levelIndent":"Menu_levelIndent__S6HXJ","level-1":"Menu_level-1__kueO2","level-2":"Menu_level-2__JZGkJ","level-3":"Menu_level-3__LFd-F","level-4":"Menu_level-4__2DUMl","level-5":"Menu_level-5__xpgvQ"};
3
+ var css_248z = ".Menu_root__xhtlo{max-height:200px;width:100%}.keyboard .Menu_root__xhtlo{pointer-events:none}.Menu_item__VtmwS{align-items:center;animation:Menu_fadeIn__XRZkT .3s ease-out;cursor:pointer;display:flex;overflow:hidden;padding-bottom:0!important;padding-top:0!important;position:relative;text-align:left;text-overflow:ellipsis;-webkit-user-select:none;-moz-user-select:none;user-select:none;white-space:nowrap;width:100%}.Menu_item__VtmwS:first-child{border-top-left-radius:2px;border-top-right-radius:2px}.Menu_item__VtmwS:last-child{border-bottom-left-radius:2px;border-bottom-right-radius:2px}.Menu_size-s__DA0r3 .Menu_item__VtmwS{font-size:12px;height:30px;padding:0 14px}.Menu_size-m__0EI47 .Menu_item__VtmwS{font-size:16px;height:40px;padding:0 16px}.Menu_size-l__PXpIm .Menu_item__VtmwS{font-size:20px;height:50px;padding:0 18px}.Menu_size-xl__U1WW8 .Menu_item__VtmwS{font-size:24px;height:60px;padding:0 20px}.Menu_item__VtmwS.Menu_selected__V71xy{background-color:var(--active-color-alpha-500)}.Menu_item__VtmwS.Menu_disabled__5afRm{cursor:not-allowed;opacity:.4}.keyboard .Menu_item__VtmwS.Menu_focused__FLWqW,.pointer .Menu_item__VtmwS:hover{box-shadow:inset 100vw 0 0 0 var(--accent-color-alpha-200)}.Menu_textOverflow__udsHR .Menu_item__VtmwS>span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.Menu_group__6e-Ef{background-color:var(--decent-color);color:var(--accent-color);font-size:14px;font-weight:500;padding:8px 12px;pointer-events:none;position:sticky;top:0;z-index:1}.Menu_levelIndent__S6HXJ{--menu-indent-size:var(--indent-s)}.Menu_levelIndent__S6HXJ.Menu_level-1__kueO2{padding-left:calc(var(--menu-indent-size)*2)}.Menu_levelIndent__S6HXJ.Menu_level-2__JZGkJ{padding-left:calc(var(--menu-indent-size)*3)}.Menu_levelIndent__S6HXJ.Menu_level-3__LFd-F{padding-left:calc(var(--menu-indent-size)*4)}.Menu_levelIndent__S6HXJ.Menu_level-4__2DUMl{padding-left:calc(var(--menu-indent-size)*5)}.Menu_levelIndent__S6HXJ.Menu_level-5__xpgvQ{padding-left:calc(var(--menu-indent-size)*6)}@keyframes Menu_fadeIn__XRZkT{0%{opacity:0}10%{opacity:0}to{opacity:1}}";
4
+ var S = {"root":"Menu_root__xhtlo","item":"Menu_item__VtmwS","fadeIn":"Menu_fadeIn__XRZkT","size-s":"Menu_size-s__DA0r3","size-m":"Menu_size-m__0EI47","size-l":"Menu_size-l__PXpIm","size-xl":"Menu_size-xl__U1WW8","selected":"Menu_selected__V71xy","disabled":"Menu_disabled__5afRm","focused":"Menu_focused__FLWqW","textOverflow":"Menu_textOverflow__udsHR","group":"Menu_group__6e-Ef","levelIndent":"Menu_levelIndent__S6HXJ","level-1":"Menu_level-1__kueO2","level-2":"Menu_level-2__JZGkJ","level-3":"Menu_level-3__LFd-F","level-4":"Menu_level-4__2DUMl","level-5":"Menu_level-5__xpgvQ"};
5
5
  styleInject(css_248z);
6
6
 
7
7
  export { S as default };
@@ -5,6 +5,7 @@ export interface MenuProps extends ScrollProps {
5
5
  children: ReactNode;
6
6
  className?: string;
7
7
  size?: Size;
8
+ textOverflow?: boolean;
8
9
  }
9
10
  export interface MenuItemProps extends React.HTMLAttributes<HTMLDivElement> {
10
11
  children: ReactNode;
@@ -14,6 +15,7 @@ export interface MenuItemProps extends React.HTMLAttributes<HTMLDivElement> {
14
15
  disabled?: boolean;
15
16
  level?: number;
16
17
  size?: Size;
18
+ textOverflow?: boolean;
17
19
  }
18
20
  export interface MenuGroupProps {
19
21
  children: ReactNode;
@@ -1,13 +1,15 @@
1
1
  import { Size } from 'uilib/types';
2
2
  import { ButtonProps } from '../Button/Button';
3
+ import { ReactNode } from 'react';
3
4
  type ID = string | number;
4
- export type Item = ButtonProps & {
5
+ export type Item = Omit<ButtonProps, 'children'> & {
5
6
  id: ID;
6
7
  label: string;
7
- content: React.ReactNode | (() => React.ReactNode);
8
+ content: ReactNode | (() => ReactNode);
8
9
  contentClassName?: string;
9
10
  forceRender?: boolean;
10
11
  onClick?: (e: MouseEvent) => boolean | void;
12
+ children?: ButtonProps['children'];
11
13
  };
12
14
  export type RenderProps = {
13
15
  tabs: React.ReactNode;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@homecode/ui",
3
- "version": "4.27.15",
3
+ "version": "4.27.17",
4
4
  "description": "React UI components library",
5
5
  "scripts": {
6
6
  "tests": "jest",