@steroidsjs/core 3.0.0-beta.53 → 3.0.0-beta.55

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/actions/list.d.ts CHANGED
@@ -13,6 +13,11 @@ export interface IList {
13
13
  * Функция обратного вызова, вызываемая при получении списка.
14
14
  */
15
15
  onFetch?: (list: IList, query: Record<string, unknown>, components: any) => Promise<any>;
16
+ /**
17
+ * Обработчик события ошибки выполнения запроса
18
+ * @param args
19
+ */
20
+ onError?: (error: Record<string, any>) => void;
16
21
  /**
17
22
  * Функция условия, используемая для определения поведения списка на основе параметров запроса.
18
23
  */
package/actions/list.js CHANGED
@@ -43,6 +43,7 @@ var createList = function (listId, props) { return ({
43
43
  action: props.action || props.action === '' ? props.action : null,
44
44
  actionMethod: props.actionMethod || 'get',
45
45
  onFetch: props.onFetch,
46
+ onError: props.onError,
46
47
  condition: props.condition,
47
48
  scope: props.scope,
48
49
  total: props.total || null,
@@ -74,7 +75,11 @@ var httpFetchHandler = function (list, query, _a) {
74
75
  }
75
76
  return http
76
77
  .send(list.actionMethod, url || window.location.pathname, query)
77
- .then(function (response) { return response.data; });
78
+ .then(function (response) { return response.data; })["catch"](function (error) {
79
+ if (typeof list.onError === 'function') {
80
+ list.onError(error);
81
+ }
82
+ });
78
83
  };
79
84
  exports.httpFetchHandler = httpFetchHandler;
80
85
  var localFetchHandler = function (list, query) {
@@ -1,10 +1,139 @@
1
+ import * as React from 'react';
1
2
  import { ReactNode } from 'react';
2
3
  import { IComponents } from '../providers/ComponentsProvider';
3
4
  /**
4
5
  * Ui Component
5
6
  * Компонент для подгрузки и конфигурации UI компонентов приложения
6
7
  */
7
- export default class UiComponent {
8
+ export interface IUiApplicationComponent {
9
+ /**
10
+ * Компоненты приложения.
11
+ */
12
+ components: IComponents;
13
+ /**
14
+ * Иконки для использования в приложении.
15
+ */
16
+ icons: {
17
+ [name: string]: string | number | ReactNode;
18
+ };
19
+ /**
20
+ * Компоненты полей формы для использования в приложении.
21
+ */
22
+ fields: any;
23
+ /**
24
+ * Компоненты форматтеры для использования в приложении.
25
+ */
26
+ formatters: any;
27
+ /**
28
+ * Зарегистрированные компоненты полей формы.
29
+ */
30
+ _registeredFields: any;
31
+ /**
32
+ * Элемент портала.
33
+ */
34
+ _portalElement: HTMLElement | null;
35
+ /**
36
+ * Добавляет компоненты представлений.
37
+ * @param {any} components - Компоненты представлений.
38
+ */
39
+ addViews(components: any): void;
40
+ /**
41
+ * Рендерит компонент представления.
42
+ * @param {any} Component - Компонент или путь к компоненту представления.
43
+ * @param {any} props - Свойства компонента.
44
+ * @param {boolean} [forceNode=false] - Флаг, указывающий на принудительное отображение компонента как узла.
45
+ * @returns {React.ReactElement<any>|null} Возвращает элемент React или null.
46
+ */
47
+ renderView(Component: any, props: any, forceNode?: boolean): React.ReactElement<any> | null;
48
+ /**
49
+ * Возвращает компонент представления по указанному пути.
50
+ * @param {string} path - Путь к компоненту представления.
51
+ * @returns {any} Компонент представления или undefined, если не найден.
52
+ */
53
+ getView(path: any): any;
54
+ /**
55
+ * Добавляет компоненты полей формы.
56
+ * @param {any} components - Компоненты полей формы.
57
+ */
58
+ addFields(components: any): void;
59
+ /**
60
+ * Возвращает компонент поля формы по указанному пути.
61
+ * @param {string} path - Путь к компоненту поля формы.
62
+ * @returns {React.ComponentType<any>|undefined} Компонент поля формы или undefined, если не найден.
63
+ */
64
+ getField(path: string): React.ComponentType<any> | undefined;
65
+ /**
66
+ * Возвращает свойства конфигурации компонента поля формы по указанному пути.
67
+ * @param {string} path - Путь к компоненту поля формы.
68
+ * @param {any} model - Модель.
69
+ * @param {any} attribute - Атрибут.
70
+ * @returns {any} Свойства конфигурации компонента поля формы.
71
+ */
72
+ getFieldProps(path: string, model?: any, attribute?: any): any;
73
+ /**
74
+ * Добавляет компоненты форматтеров.
75
+ * @param {any} components - Компоненты форматтеров.
76
+ */
77
+ addFormatters(components: any): void;
78
+ /**
79
+ * Возвращает компонент форматтера по указанному пути.
80
+ * @param {string} path - Путь к компоненту форматтера.
81
+ * @returns {React.ComponentType<any>|undefined} Компонент форматтера или undefined, если не найден.
82
+ */
83
+ getFormatter(path: string): React.ComponentType<any> | undefined;
84
+ /**
85
+ * Возвращает свойства конфигурации компонента форматтера по указанному пути.
86
+ * @param {string} path - Путь к компоненту форматтера.
87
+ * @returns {any} Свойства конфигурации компонента форматтера.
88
+ */
89
+ getFormatterProps(path: string): any;
90
+ /**
91
+ * Добавляет иконки.
92
+ * @param {{ [name: string]: string | ReactNode }} icons - Иконки.
93
+ */
94
+ addIcons(icons: {
95
+ [name: string]: string | ReactNode;
96
+ }): void;
97
+ /**
98
+ * Возвращает иконку по указанному имени.
99
+ * @param {string} name - Имя иконки.
100
+ * @returns {string | number | ReactNode | null} Иконка или null, если не найдена.
101
+ */
102
+ getIcon(name: string): string | number | ReactNode | null;
103
+ /**
104
+ * Добавляет модели.
105
+ * @param {any} models - Модели.
106
+ */
107
+ addModels(models: any): void;
108
+ /**
109
+ * Регистрирует поле формы.
110
+ * @param {string} formId - Идентификатор формы.
111
+ * @param {string} attribute - Атрибут.
112
+ * @param {any} type - Тип.
113
+ */
114
+ registerField(formId: string, attribute: string, type: any): void;
115
+ /**
116
+ * Возвращает зарегистрированные поля формы для указанного идентификатора формы.
117
+ * @param {string} formId - Идентификатор формы.
118
+ * @returns {any} Зарегистрированные поля формы.
119
+ */
120
+ getRegisteredFields(formId: string): any;
121
+ /**
122
+ * Задает элемент портала.
123
+ * @param {HTMLElement} element - Элемент портала.
124
+ */
125
+ setPortalElement(element: HTMLElement): void;
126
+ /**
127
+ * Возвращает элемент портала.
128
+ * @returns {HTMLElement | null} Элемент портала или null, если не задан.
129
+ */
130
+ getPortalElement(): HTMLElement | null;
131
+ }
132
+ /**
133
+ * Ui Component
134
+ * Компонент для подгрузки и конфигурации UI компонентов приложения
135
+ */
136
+ export default class UiComponent implements IUiApplicationComponent {
8
137
  components: IComponents;
9
138
  _components: any;
10
139
  _models: any;
@@ -102,6 +102,11 @@ export interface IListConfig {
102
102
  * @return {Promise}
103
103
  */
104
104
  onFetch?: (list: IList, query: Record<string, unknown>, http: any) => Promise<any>;
105
+ /**
106
+ * Обработчик события ошибки выполнения запроса
107
+ * @param args
108
+ */
109
+ onError?: (error: Record<string, any>) => void;
105
110
  /**
106
111
  * Обработчик, который составляет список условий для локальной фильтрации элементов коллекции
107
112
  * @param {Object} query
package/hooks/useList.js CHANGED
@@ -189,6 +189,7 @@ function useList(config) {
189
189
  action: config.action || config.action === '' ? config.action : null,
190
190
  actionMethod: config.actionMethod || exports.defaultConfig.actionMethod,
191
191
  onFetch: config.onFetch,
192
+ onError: config.onError,
192
193
  condition: config.condition,
193
194
  scope: config.scope,
194
195
  items: null,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@steroidsjs/core",
3
- "version": "3.0.0-beta.53",
3
+ "version": "3.0.0-beta.55",
4
4
  "description": "",
5
5
  "author": "Vladimir Kozhin <hello@kozhindev.com>",
6
6
  "repository": {
@@ -28,6 +28,7 @@
28
28
  "@maskito/core": "^0.12.1",
29
29
  "@maskito/kit": "^0.12.1",
30
30
  "@maskito/react": "^0.12.1",
31
+ "@splidejs/react-splide": "^0.7.12",
31
32
  "axios": "^0.21.1",
32
33
  "connected-react-router": "^6.9.3",
33
34
  "domready": "^1.0.8",
@@ -1,5 +1,6 @@
1
1
  import * as React from 'react';
2
2
  import { PropsWithChildren } from 'react';
3
+ import { IUiApplicationComponent } from 'src/components/UiComponent';
3
4
  import { IResourceComponent } from '../components/ResourceComponent';
4
5
  declare global {
5
6
  interface Window {
@@ -13,7 +14,7 @@ export interface IComponents {
13
14
  http?: any;
14
15
  locale?: any;
15
16
  store?: any;
16
- ui?: any;
17
+ ui?: IUiApplicationComponent;
17
18
  resource?: IResourceComponent;
18
19
  ws?: any;
19
20
  pushNotification?: any;
@@ -1,5 +1,6 @@
1
+ /// <reference types="react" />
1
2
  import { IAccordionItemProps } from './Accordion';
2
- declare function AccordionItem(props: IAccordionItemProps): any;
3
+ declare function AccordionItem(props: IAccordionItemProps): import("react").ReactElement<any, string | import("react").JSXElementConstructor<any>>;
3
4
  declare namespace AccordionItem {
4
5
  var defaultProps: import("./Accordion").IAccordionViewProps;
5
6
  }
@@ -49,7 +49,7 @@ export interface IAvatarViewProps extends IAvatarProps {
49
49
  onError: () => void;
50
50
  formattedTitle: () => void;
51
51
  }
52
- declare function Avatar(props: IAvatarProps): any;
52
+ declare function Avatar(props: IAvatarProps): import("react").ReactElement<any, string | import("react").JSXElementConstructor<any>>;
53
53
  declare namespace Avatar {
54
54
  var defaultProps: {
55
55
  size: string;
@@ -1,3 +1,4 @@
1
+ /// <reference types="react" />
1
2
  import { DayPickerProps } from 'react-day-picker';
2
3
  export interface ICalendarProps extends IUiComponent {
3
4
  /**
@@ -67,7 +68,7 @@ export interface ICalendarViewProps extends ICalendarProps {
67
68
  */
68
69
  toggleCaptionPanel: () => void;
69
70
  }
70
- declare function Calendar(props: ICalendarProps): any;
71
+ declare function Calendar(props: ICalendarProps): import("react").ReactElement<any, string | import("react").JSXElementConstructor<any>>;
71
72
  declare namespace Calendar {
72
73
  var defaultProps: {
73
74
  numberOfMonths: number;
@@ -90,5 +90,5 @@ export interface ICardProps extends IUiComponent {
90
90
  title?: string;
91
91
  }
92
92
  export type ICardViewProps = ICardProps;
93
- declare function Card(props: ICardProps): any;
93
+ declare function Card(props: ICardProps): import("react").ReactElement<any, string | import("react").JSXElementConstructor<any>>;
94
94
  export default Card;
@@ -53,7 +53,7 @@ export interface ICopyToClipboardProps extends IUiComponent {
53
53
  export interface ICopyToClipboardViewProps extends ICopyToClipboardProps {
54
54
  onClick: () => void;
55
55
  }
56
- declare function CopyToClipboard(props: ICopyToClipboardProps): any;
56
+ declare function CopyToClipboard(props: ICopyToClipboardProps): React.ReactElement<any, string | React.JSXElementConstructor<any>>;
57
57
  declare namespace CopyToClipboard {
58
58
  var defaultProps: {
59
59
  showCopyIcon: boolean;
@@ -0,0 +1,25 @@
1
+ import React from 'react';
2
+ import { Options, SplideProps } from '@splidejs/react-splide';
3
+ /**
4
+ * Пропсы для компонента Slider.
5
+ */
6
+ export interface ISliderProps extends IUiComponent, Omit<SplideProps, 'items'> {
7
+ /**
8
+ * Опции слайдера.
9
+ */
10
+ sliderOptions: Options;
11
+ /**
12
+ * Элементы слайдера.
13
+ */
14
+ items: Record<string, any>[];
15
+ /**
16
+ * Представление элемента слайдера.
17
+ */
18
+ itemView: CustomView | any;
19
+ /**
20
+ * Дополнительные свойства.
21
+ */
22
+ [key: string]: any;
23
+ }
24
+ export type ISliderViewProps = ISliderProps;
25
+ export default function Slider(props: ISliderProps): React.ReactElement<any, string | React.JSXElementConstructor<any>>;
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ exports.__esModule = true;
14
+ var hooks_1 = require("../../../hooks");
15
+ function Slider(props) {
16
+ var components = (0, hooks_1.useComponents)();
17
+ return components.ui.renderView(props.view || 'content.SliderView', __assign({}, props));
18
+ }
19
+ exports["default"] = Slider;
@@ -0,0 +1,2 @@
1
+ import Slider from './Slider';
2
+ export default Slider;
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ exports.__esModule = true;
6
+ var Slider_1 = __importDefault(require("./Slider"));
7
+ exports["default"] = Slider_1["default"];
@@ -8,4 +8,5 @@ import { Detail, DetailItem } from './Detail';
8
8
  import Icon from './Icon';
9
9
  import Menu from './Menu';
10
10
  import CopyToClipboard from './CopyToClipboard';
11
- export { Avatar, AvatarGroup, Accordion, AccordionItem, Alert, Card, DropDown, Badge, Detail, DetailItem, Icon, Menu, CopyToClipboard, };
11
+ import Slider from './Slider';
12
+ export { Avatar, AvatarGroup, Accordion, AccordionItem, Alert, Card, DropDown, Badge, Detail, DetailItem, Icon, Menu, CopyToClipboard, Slider, };
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  exports.__esModule = true;
6
- exports.CopyToClipboard = exports.Menu = exports.Icon = exports.DetailItem = exports.Detail = exports.Badge = exports.DropDown = exports.Card = exports.Alert = exports.AccordionItem = exports.Accordion = exports.AvatarGroup = exports.Avatar = void 0;
6
+ exports.Slider = exports.CopyToClipboard = exports.Menu = exports.Icon = exports.DetailItem = exports.Detail = exports.Badge = exports.DropDown = exports.Card = exports.Alert = exports.AccordionItem = exports.Accordion = exports.AvatarGroup = exports.Avatar = void 0;
7
7
  var Avatar_1 = require("./Avatar");
8
8
  exports.Avatar = Avatar_1.Avatar;
9
9
  exports.AvatarGroup = Avatar_1.AvatarGroup;
@@ -27,3 +27,5 @@ var Menu_1 = __importDefault(require("./Menu"));
27
27
  exports.Menu = Menu_1["default"];
28
28
  var CopyToClipboard_1 = __importDefault(require("./CopyToClipboard"));
29
29
  exports.CopyToClipboard = CopyToClipboard_1["default"];
30
+ var Slider_1 = __importDefault(require("./Slider"));
31
+ exports.Slider = Slider_1["default"];
@@ -42,14 +42,19 @@ var react_1 = require("react");
42
42
  var fieldWrapper_1 = __importDefault(require("../Field/fieldWrapper"));
43
43
  var hooks_1 = require("../../../hooks");
44
44
  function CheckboxField(props) {
45
+ var _a, _b;
45
46
  var components = (0, hooks_1.useComponents)();
46
47
  var onChangeHandler = React.useCallback(function () {
47
- props.input.onChange(!props.input.value);
48
+ var _a;
49
+ props.input.onChange(!((_a = props.input) === null || _a === void 0 ? void 0 : _a.value));
48
50
  if (props.onChange) {
49
51
  props.onChange();
50
52
  }
51
53
  }, [props]);
52
- var inputProps = (0, react_1.useMemo)(function () { return (__assign({ name: props.input.name, type: 'checkbox', checked: !!props.input.value, onChange: onChangeHandler, disabled: props.disabled }, props.inputProps)); }, [onChangeHandler, props.disabled, props.input.name, props.input.value, props.inputProps]);
54
+ var inputProps = (0, react_1.useMemo)(function () {
55
+ var _a, _b;
56
+ return (__assign({ name: (_a = props.input) === null || _a === void 0 ? void 0 : _a.name, type: 'checkbox', checked: !!((_b = props.input) === null || _b === void 0 ? void 0 : _b.value), onChange: onChangeHandler, disabled: props.disabled }, props.inputProps));
57
+ }, [onChangeHandler, props.disabled, (_a = props.input) === null || _a === void 0 ? void 0 : _a.name, (_b = props.input) === null || _b === void 0 ? void 0 : _b.value, props.inputProps]);
53
58
  return components.ui.renderView(props.view || 'form.CheckboxFieldView', __assign(__assign({}, props), { inputProps: inputProps }));
54
59
  }
55
60
  CheckboxField.defaultProps = {
@@ -274,8 +274,12 @@ function Form(props) {
274
274
  requestError_1 = _c.sent();
275
275
  console.error(requestError_1); // eslint-disable-line no-console
276
276
  dispatch((0, form_2.formSetSubmitting)(props.formId, false));
277
- props.onError(requestError_1);
278
- reduxDispatch((0, notifications_1.showNotification)(props.submitErrorMessage || __('Ошибка сервера'), 'danger'));
277
+ if (typeof props.onError === 'function') {
278
+ props.onError(requestError_1);
279
+ }
280
+ else {
281
+ reduxDispatch((0, notifications_1.showNotification)(props.submitErrorMessage || __('Ошибка сервера'), 'danger'));
282
+ }
279
283
  return [2 /*return*/, null];
280
284
  case 12:
281
285
  // Skip on 2fa
@@ -71,8 +71,11 @@ function SwitcherField(props) {
71
71
  var _a;
72
72
  if (!(0, isEqual_1["default"])(prevSelectedIds, selectedIds)) {
73
73
  props.input.onChange.call(null, (_a = selectedIds[0]) !== null && _a !== void 0 ? _a : null);
74
+ if (props.onChange) {
75
+ props.onChange(selectedIds);
76
+ }
74
77
  }
75
- }, [selectedIds, props.input.onChange, prevSelectedIds]);
78
+ }, [selectedIds, props.input.onChange, prevSelectedIds, props, items]);
76
79
  return components.ui.renderView(props.view || 'form.SwitcherFieldView', __assign(__assign({}, props), { items: items, inputProps: inputProps, hoveredId: hoveredId, selectedIds: selectedIds, onItemHover: onItemHover, onItemSelect: onItemSelect }));
77
80
  }
78
81
  SwitcherField.defaultProps = {
@@ -1,5 +1,5 @@
1
1
  /// <reference types="react" />
2
- import { IContentColumnViewProps } from '../Grid/Grid';
2
+ import { IColumnViewProps } from '../Grid/Grid';
3
3
  /**
4
4
  * CheckboxColumn
5
5
  * Колонка с чекбоксом, которая позволяет выбирать одну или все записи в таблице.
@@ -24,7 +24,7 @@ export interface ICheckboxColumnProps {
24
24
  view?: CustomView;
25
25
  [key: string]: any;
26
26
  }
27
- export interface ICheckboxColumnViewProps extends IContentColumnViewProps {
27
+ export interface ICheckboxColumnViewProps extends IColumnViewProps {
28
28
  fieldProps: Record<string, any>;
29
29
  input: {
30
30
  name: string;
@@ -2,7 +2,7 @@ import * as React from 'react';
2
2
  import { ILinkProps } from 'src/ui/nav/Link/Link';
3
3
  import { IListConfig, ListControlPosition } from '../../../hooks/useList';
4
4
  import { IControlItem } from '../../nav/Controls/Controls';
5
- export interface IContentColumnViewProps extends IGridColumn {
5
+ export interface IColumnViewProps extends IGridColumn {
6
6
  item: Record<string, any>;
7
7
  size: Size;
8
8
  primaryKey: string;
@@ -97,6 +97,18 @@ export interface IGridColumn {
97
97
  attribute: string;
98
98
  isLeft?: boolean;
99
99
  };
100
+ /**
101
+ * Диаграмма.
102
+ * Цвет должен соответствовать success | warning | danger | secondary.
103
+ * Цвета можно расширить или изменить через стили (см. colors.scss в react-bootstrap)
104
+ */
105
+ diagram?: {
106
+ type: 'horizontal' | 'vertical' | 'circle';
107
+ items: {
108
+ color: 'success' | 'warning' | 'danger' | 'secondary' | string;
109
+ percentageAttribute: string;
110
+ }[];
111
+ };
100
112
  }
101
113
  /**
102
114
  * Grid
@@ -55,6 +55,7 @@ function List(props) {
55
55
  searchForm: props.searchForm,
56
56
  autoDestroy: props.autoDestroy,
57
57
  onFetch: props.onFetch,
58
+ onError: props.onError,
58
59
  condition: props.condition,
59
60
  addressBar: props.addressBar,
60
61
  scope: props.scope,
@@ -86,7 +86,7 @@ export interface ITreeViewProps extends ITreeProps {
86
86
  })[];
87
87
  levelPadding?: number;
88
88
  }
89
- declare function Tree(props: ITreeProps): any;
89
+ declare function Tree(props: ITreeProps): React.ReactElement<any, string | React.JSXElementConstructor<any>>;
90
90
  declare namespace Tree {
91
91
  var defaultProps: {
92
92
  itemsKey: string;