@steroidsjs/core 3.0.6 → 3.0.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.
package/en.json CHANGED
@@ -987,5 +987,7 @@
987
987
  "Параметры для кнопки отправки формы": "",
988
988
  "Конструктор редактора 'ckeditor5-react' из библиотеки @steroidsjs/ckeditor5/packages/ckeditor5-build-classic\nПримечание: для использования встроенного отображения 'HtmlField', данный компонент должен быть передан": "",
989
989
  "Компонент редактора 'ckeditor5-react' из библиотеки @ckeditor\nПримечание: для использования встроенного отображения 'HtmlField', данный компонент должен быть передан": "",
990
- "CSS-класс для элемента навигации.": ""
990
+ "Допустимое количество символов после разделителя": "",
991
+ "CSS-класс для элемента навигации.": "",
992
+ "Тип данных для параметров маршрута.": ""
991
993
  }
@@ -20,7 +20,7 @@ export type DataProviderItems = string | ({
20
20
  new (): Enum;
21
21
  }) | (string | number | {
22
22
  id: string | number | boolean;
23
- label: string | any;
23
+ label: string | Record<string, any>;
24
24
  [key: string]: any;
25
25
  })[];
26
26
  export interface IDataProvider {
@@ -24,7 +24,7 @@ export interface IDataSelectConfig {
24
24
  * Сделать активным первый элемент в списке
25
25
  * @example true
26
26
  */
27
- selectFirst?: any;
27
+ selectFirst?: boolean;
28
28
  /**
29
29
  * Список с идентификаторами выбранных элементов
30
30
  * @example [1, 4]
@@ -15,20 +15,20 @@ export interface IFileInput {
15
15
  * Экшен для отправки на бэкенд
16
16
  * @example '/api/v1/user/avatar/crop'
17
17
  */
18
- backendUrl?: any;
18
+ backendUrl?: string;
19
19
  /**
20
20
  * Список mime-типов
21
21
  */
22
- mimeTypes?: any;
22
+ mimeTypes?: string[];
23
23
  /**
24
24
  * Использовать только изображения
25
25
  */
26
- imagesOnly?: any;
27
- imagesProcessor?: any;
26
+ imagesOnly?: boolean;
27
+ imagesProcessor?: string;
28
28
  /**
29
29
  * Точные размеры изображений
30
30
  */
31
- imagesExactSize?: any;
31
+ imagesExactSize?: string;
32
32
  /**
33
33
  * Начальные файлы
34
34
  */
@@ -1,8 +1,9 @@
1
+ /// <reference types="react" />
1
2
  export default function useForm(): {
2
3
  formId: string;
3
4
  model: any;
4
5
  prefix: string | boolean;
5
6
  size: string;
6
- formDispatch: any;
7
+ formDispatch: import("react").Dispatch<any>;
7
8
  formSelector: (selector: (state: any, setValue: any) => any) => any;
8
9
  };
package/index.d.ts CHANGED
@@ -79,6 +79,11 @@ declare type CustomStyle = React.CSSProperties;
79
79
  */
80
80
  declare type CustomView = React.ReactNode | ((props: React.ComponentProps<any>) => JSX.Element);
81
81
 
82
+ /**
83
+ * Свойства для view компонента
84
+ */
85
+ declare type CustomViewProps = React.ComponentProps<any>;
86
+
82
87
  /**
83
88
  * Кастомная иконка
84
89
  * @example custom-icon
@@ -108,3 +113,8 @@ declare interface IUiComponent {
108
113
  */
109
114
  style?: CustomStyle,
110
115
  }
116
+
117
+ /**
118
+ * Тип данных для параметров маршрута.
119
+ */
120
+ declare type RouteParams = Record<string, any> | null;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@steroidsjs/core",
3
- "version": "3.0.6",
3
+ "version": "3.0.7",
4
4
  "description": "",
5
5
  "author": "Vladimir Kozhin <hello@kozhindev.com>",
6
6
  "repository": {
@@ -31,12 +31,12 @@ export interface IButtonProps extends IUiComponent {
31
31
  * Текст кнопки или ссылки
32
32
  * @example Save
33
33
  */
34
- label?: string | any;
34
+ label?: string;
35
35
  /**
36
36
  * Подсказка, отображается при наведении (через тег title)
37
37
  * @example Save
38
38
  */
39
- hint?: string | any;
39
+ hint?: string;
40
40
  /**
41
41
  * HTML Тип
42
42
  * @example submit
@@ -148,7 +148,7 @@ export interface IButtonProps extends IUiComponent {
148
148
  /**
149
149
  * Цвет текста кнопки или ссылки
150
150
  */
151
- textColor?: any;
151
+ textColor?: string;
152
152
  [key: string]: any;
153
153
  }
154
154
  export interface IButtonViewProps extends IButtonProps {
@@ -16,7 +16,7 @@ export interface IDateFieldProps extends IDateInputStateInput, IUiComponent, Pic
16
16
  /**
17
17
  * Свойства для view компонента
18
18
  */
19
- viewProps?: Record<string, unknown>;
19
+ viewProps?: CustomViewProps;
20
20
  /**
21
21
  * Свойства для компонента Calendar
22
22
  */
@@ -13,7 +13,7 @@ export interface IFieldProps extends IFieldWrapperInputProps {
13
13
  * Аттрибут (название) поля в форме
14
14
  * @example isVisible
15
15
  */
16
- attribute?: any;
16
+ attribute?: string;
17
17
  /**
18
18
  * Модель с полями формы
19
19
  * @example
@@ -70,16 +70,16 @@ export interface IFieldListProps extends IFieldWrapperInputProps, IUiComponent {
70
70
  /**
71
71
  * Пропсы для компонента отображения списка с группами полей - FieldListView
72
72
  */
73
- viewProps?: any;
73
+ viewProps?: CustomViewProps;
74
74
  /**
75
75
  * Переопределение view React компонента для кастомизации отображения группы полей
76
76
  * @example MyCustomView
77
77
  */
78
- itemView?: any;
78
+ itemView?: CustomView;
79
79
  /**
80
80
  * Пропсы для компонента отображения группы полей - FieldListItemView
81
81
  */
82
- itemViewProps?: any;
82
+ itemViewProps?: CustomViewProps;
83
83
  /**
84
84
  * При фокусировке на одном из элементов формы и нажатию на клавиши стрелок вверх/вниз + Shift
85
85
  * происходит добавление группы полей сверху или снизу соответственно
@@ -14,7 +14,7 @@ export interface IFieldSetProps extends IFormContext {
14
14
  * Заголовок для группы полей в форме
15
15
  * @example Save
16
16
  */
17
- label?: any;
17
+ label?: string;
18
18
  /**
19
19
  * Переопределение view React компонента для кастомизации отображения
20
20
  * @example MyCustomView
@@ -29,7 +29,7 @@ export interface IFieldSetProps extends IFormContext {
29
29
  export interface IFieldSetViewProps {
30
30
  className?: CssClassName;
31
31
  children?: React.ReactNode;
32
- label?: string | any;
32
+ label?: string;
33
33
  }
34
34
  declare function FieldSet(props: IFieldSetProps): JSX.Element;
35
35
  export default FieldSet;
@@ -47,7 +47,7 @@ export interface IFileFieldProps extends IFieldWrapperInputProps, IFileFieldComm
47
47
  * View компонент для элемента списка файлов
48
48
  * @example true
49
49
  */
50
- itemView?: any;
50
+ itemView?: CustomView;
51
51
  /**
52
52
  * Пропсы для элемента файла
53
53
  * @example true
@@ -38,11 +38,10 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
38
38
  };
39
39
  exports.__esModule = true;
40
40
  exports.FilesLayout = void 0;
41
- var React = __importStar(require("react"));
42
41
  var File_1 = __importDefault(require("fileup-core/lib/models/File"));
43
42
  var first_1 = __importDefault(require("lodash-es/first"));
44
43
  var values_1 = __importDefault(require("lodash-es/values"));
45
- var react_1 = require("react");
44
+ var react_1 = __importStar(require("react"));
46
45
  var useFile_1 = __importDefault(require("../../../hooks/useFile"));
47
46
  var hooks_1 = require("../../../hooks");
48
47
  var fieldWrapper_1 = __importDefault(require("../Field/fieldWrapper"));
@@ -55,7 +54,7 @@ var FILE_STATUS_END = 'end';
55
54
  function FileFieldComponent(props) {
56
55
  var components = (0, hooks_1.useComponents)();
57
56
  var _a = (0, useFile_1["default"])(props), files = _a.files, onBrowse = _a.onBrowse, onRemove = _a.onRemove;
58
- var _b = React.useState(false), isFilesLoaded = _b[0], setIsFilesLoaded = _b[1];
57
+ var _b = react_1["default"].useState(false), isFilesLoaded = _b[0], setIsFilesLoaded = _b[1];
59
58
  var FileFieldView = props.view || components.ui.getView('form.FileFieldView');
60
59
  var FileFieldItemView = props.itemView || components.ui.getView('form.FileFieldItemView');
61
60
  (0, react_1.useEffect)(function () {
@@ -125,13 +124,13 @@ function FileFieldComponent(props) {
125
124
  })
126
125
  }); }, [FileFieldItemView, files, onBrowse, onRemove, props.buttonProps, props.buttonView, props.className, props.disabled,
127
126
  props.filesLayout, props.imagesOnly, props.imagesProcessor, props.itemProps, props.showRemove, props.size]);
128
- return (React.createElement(FileFieldView, __assign({}, viewProps)));
127
+ return (react_1["default"].createElement(FileFieldView, __assign({}, viewProps)));
129
128
  }
130
129
  function FileField(props) {
131
130
  if (process.env.IS_SSR) {
132
131
  return null;
133
132
  }
134
- return (React.createElement(FileFieldComponent, __assign({}, props)));
133
+ return (react_1["default"].createElement(FileFieldComponent, __assign({}, props)));
135
134
  }
136
135
  FileField.defaultProps = {
137
136
  disabled: false,
@@ -2,6 +2,7 @@ import React from 'react';
2
2
  import { IButtonProps } from '@steroidsjs/core/ui/form/Button/Button';
3
3
  import { IAddressBarConfig } from '../../../hooks/useAddressBar';
4
4
  import { IFieldProps } from '../Field/Field';
5
+ import { providers } from '../../../utils/form';
5
6
  /**
6
7
  * Form
7
8
  *
@@ -60,7 +61,7 @@ export interface IFormProps extends IUiComponent {
60
61
  * ['age', 'integer']
61
62
  * ]
62
63
  */
63
- validators?: any[];
64
+ validators?: string[] | Array<string[]> | Array<Record<string, any>>;
64
65
  /**
65
66
  * Обработчик события перед отправкой формы
66
67
  * @param args
@@ -207,7 +208,7 @@ export interface IFormContext {
207
208
  /**
208
209
  * Провайдер
209
210
  */
210
- provider?: any;
211
+ provider?: typeof providers.redux | typeof providers.reducer;
211
212
  /**
212
213
  * Редьюсер
213
214
  */
@@ -218,7 +219,7 @@ export interface IFormContext {
218
219
  /**
219
220
  * Диспатч
220
221
  */
221
- dispatch?: any;
222
+ dispatch?: React.Dispatch<any>;
222
223
  }
223
224
  export declare const FormContext: React.Context<IFormContext>;
224
225
  declare function Form(props: IFormProps): JSX.Element;
@@ -22,6 +22,10 @@ export interface INumberFieldProps extends IBaseFieldProps {
22
22
  * @example 5
23
23
  */
24
24
  step?: number;
25
+ /**
26
+ * Допустимое количество символов после разделителя
27
+ */
28
+ decimal?: number;
25
29
  }
26
30
  export interface INumberFieldViewProps extends INumberFieldProps, IFieldWrapperOutputProps {
27
31
  inputProps: {
@@ -52,11 +52,20 @@ function NumberField(props) {
52
52
  min: props.min,
53
53
  value: props.input.value,
54
54
  required: props.required
55
- }, onChange).onInputChange;
55
+ }, onChange, props.decimal).onInputChange;
56
56
  var onStep = (0, react_1.useCallback)(function (isIncrement) {
57
57
  var _a;
58
- onChange(null, String(Number((_a = currentInputRef === null || currentInputRef === void 0 ? void 0 : currentInputRef.current) === null || _a === void 0 ? void 0 : _a.value) + (isIncrement ? step : -step)));
59
- }, [currentInputRef, onChange, step]);
58
+ var currentValue = Number((_a = currentInputRef === null || currentInputRef === void 0 ? void 0 : currentInputRef.current) === null || _a === void 0 ? void 0 : _a.value);
59
+ var newValue;
60
+ var fixToDecimal = function (value) { return props.decimal ? value.toFixed(props.decimal) : value; };
61
+ if (isIncrement) {
62
+ newValue = fixToDecimal(currentValue + step);
63
+ }
64
+ else {
65
+ newValue = fixToDecimal(currentValue - step);
66
+ }
67
+ onChange(null, String(newValue));
68
+ }, [currentInputRef, onChange, props.decimal, step]);
60
69
  var onStepUp = (0, react_1.useCallback)(function () {
61
70
  if (!(Number(currentInputRef.current.value) + step > props.max)) {
62
71
  onStep(true);
@@ -5,7 +5,7 @@ interface IInputTypeNumberProps {
5
5
  value: string | undefined | null;
6
6
  required?: boolean;
7
7
  }
8
- declare const useInputTypeNumber: (currentInputRef: React.MutableRefObject<HTMLInputElement>, inputTypeNumberProps: IInputTypeNumberProps, onChange: (event: React.ChangeEvent<HTMLInputElement>, value?: any) => void) => {
8
+ declare const useInputTypeNumber: (currentInputRef: React.MutableRefObject<HTMLInputElement>, inputTypeNumberProps: IInputTypeNumberProps, onChange: (event: React.ChangeEvent<HTMLInputElement>, value?: any) => void, decimal: number) => {
9
9
  onInputChange: (event: React.ChangeEvent<HTMLInputElement>) => void;
10
10
  };
11
11
  export default useInputTypeNumber;
@@ -4,7 +4,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  exports.__esModule = true;
6
6
  var react_1 = __importDefault(require("react"));
7
- var useInputTypeNumber = function (currentInputRef, inputTypeNumberProps, onChange) {
7
+ var useInputTypeNumber = function (currentInputRef, inputTypeNumberProps, onChange, decimal) {
8
8
  react_1["default"].useEffect(function () {
9
9
  var _a;
10
10
  var defaultValidity = __('The number is not valid.');
@@ -21,12 +21,18 @@ var useInputTypeNumber = function (currentInputRef, inputTypeNumberProps, onChan
21
21
  return true;
22
22
  }
23
23
  /**
24
- * Подходят как отрицательные так и положительные числа
25
- * @example -1
24
+ * Подходят как отрицательные так и положительные числа с плавающей точкой
25
+ * @example -1.0
26
+ * @example 1.1
27
+ */
28
+ var numericFloatRegExp = new RegExp("^-?\\d*\\.?\\d{0,".concat(decimal, "}$"));
29
+ /**
30
+ * Подходят как отрицательные так и положительные целые числа
26
31
  * @example 1
32
+ * @example -2
27
33
  */
28
- var numericRegex = /^-?\d*\.?\d+$/;
29
- return numericRegex.test(value);
34
+ var numericRegExp = new RegExp('^-?\\d*$');
35
+ return decimal ? numericFloatRegExp.test(value) : numericRegExp.test(value);
30
36
  };
31
37
  var onInputChange = function (event) {
32
38
  var _a;
@@ -16,7 +16,7 @@ export interface ITimeFieldProps extends IDateInputStateInput, IUiComponent {
16
16
  /**
17
17
  * Свойства для view компонента
18
18
  */
19
- viewProps?: Record<string, unknown>;
19
+ viewProps?: CustomViewProps;
20
20
  /**
21
21
  * Свойства для компонента панели времени
22
22
  */
@@ -20,7 +20,7 @@ export interface ITimeRangeFieldProps extends IDateInputStateInput, Omit<IFieldW
20
20
  /**
21
21
  * Свойства для view компонента
22
22
  */
23
- viewProps?: Record<string, unknown>;
23
+ viewProps?: CustomViewProps;
24
24
  /**
25
25
  * Свойства для компонента панели времени
26
26
  */
@@ -42,7 +42,7 @@ export interface ITooltipProps {
42
42
  * Текст подсказки
43
43
  * @example 'Это всплывающая подсказка.'
44
44
  */
45
- content?: string | any;
45
+ content?: string;
46
46
  /**
47
47
  * Вложенные элементы
48
48
  */
@@ -90,7 +90,7 @@ export interface ITooltipProps {
90
90
  }
91
91
  export interface ITooltipViewProps extends ITooltipProps {
92
92
  isTooltipVisible: boolean;
93
- content: string | any;
93
+ content: string;
94
94
  position: PositionType;
95
95
  style: ITooltipStylePosition;
96
96
  className?: CssClassName;
@@ -13,7 +13,7 @@ export interface IListProps extends IListConfig {
13
13
  /**
14
14
  * Свойства для элемента коллекции
15
15
  */
16
- itemProps?: Record<string, unknown>;
16
+ itemProps?: CustomViewProps;
17
17
  /**
18
18
  * Переопределение view React компонента для кастомизации отображения
19
19
  * @example MyCustomView
@@ -37,8 +37,8 @@ export interface IListItemViewProps {
37
37
  primaryKey: PrimaryKey;
38
38
  item: {
39
39
  id?: PrimaryKey;
40
- title?: string | any;
41
- label?: string | any;
40
+ title?: string;
41
+ label?: string;
42
42
  [key: string]: any;
43
43
  };
44
44
  index: number;
@@ -1,4 +1,4 @@
1
- /// <reference types="react" />
1
+ import React from 'react';
2
2
  import { IRouteItem } from '../Router/Router';
3
3
  /**
4
4
  * Breadcrumbs
@@ -55,6 +55,6 @@ export interface IBreadcrumbsProps {
55
55
  [key: string]: any;
56
56
  }
57
57
  export type IBreadcrumbsViewProps = IBreadcrumbsProps & {
58
- routeParams?: any;
58
+ routeParams?: Record<string, unknown>;
59
59
  };
60
60
  export default function Breadcrumbs(props: IBreadcrumbsProps): JSX.Element;
@@ -57,7 +57,7 @@ export interface IControlsViewProps extends IControlsProps {
57
57
  className?: CssClassName;
58
58
  items: (IControlItem & {
59
59
  icon?: string;
60
- label?: string | any;
60
+ label?: string;
61
61
  confirm?: string;
62
62
  color?: ColorName;
63
63
  outline?: boolean;
@@ -1,4 +1,4 @@
1
- /// <reference types="react" />
1
+ import { ComponentType } from 'react';
2
2
  import { IButtonProps } from '../../form/Button/Button';
3
3
  export interface INavItem extends IButtonProps {
4
4
  /**
@@ -38,7 +38,7 @@ export interface INavItem extends IButtonProps {
38
38
  * Контент, который отобразится, если элемент навигации будет активен
39
39
  * @example ContentComponent
40
40
  */
41
- content?: any;
41
+ content?: ComponentType<any> | string;
42
42
  /**
43
43
  * Свойства для компонента с контентом
44
44
  * @example
@@ -46,7 +46,7 @@ export interface INavItem extends IButtonProps {
46
46
  * content: 'Some text'
47
47
  * }
48
48
  */
49
- contentProps?: any;
49
+ contentProps?: Record<string, any>;
50
50
  /**
51
51
  * Вложенные элементы
52
52
  */