@steroidsjs/core 3.0.0-beta.103 → 3.0.0-beta.104
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/components/HttpComponent.d.ts +4 -4
- package/components/JwtHttpComponent.d.ts +2 -2
- package/components/LocaleComponent.d.ts +5 -5
- package/components/ResourceComponent.d.ts +2 -2
- package/components/WebSocketComponent.d.ts +6 -6
- package/docs-autogen-result.json +7426 -2731
- package/en.json +119 -110
- package/hooks/useFile.d.ts +1 -0
- package/hooks/useFile.js +2 -0
- package/package.json +2 -1
- package/ui/content/DropDown/DropDown.d.ts +1 -1
- package/ui/content/DropDown/DropDown.js +4 -4
- package/ui/form/Form/Form.js +4 -1
- package/ui/form/NumberField/NumberField.js +34 -7
- package/ui/nav/Router/Router.js +3 -0
- package/utils/calculateComponentAbsolutePosition.js +57 -21
- package/utils/form.d.ts +1 -0
- package/utils/form.js +16 -1
package/en.json
CHANGED
|
@@ -819,119 +819,128 @@
|
|
|
819
819
|
"Компонент для представления данных коллекции в виде иерархической структуры.": "A component for representing collection data in the form of a hierarchical structure.",
|
|
820
820
|
"Уникальный идентификатор,\nиспользуется для сохранения состояния открыта или закрыта ячейка": "Unique identifier \nused to save the open or closed state of a cell",
|
|
821
821
|
"Включает обработку вложенных данных из items": "Enables the processing of nested data from items",
|
|
822
|
-
"Callback вызываемый при нажатии на смену года или месяца в шапке Calendar": "",
|
|
823
|
-
"Пользовательский цвет для чекбокса": "",
|
|
824
|
-
"Кастомный домен": "",
|
|
825
|
-
"Куки для режима ssr": "",
|
|
826
|
-
"Ключ для хранения токена в куках": "",
|
|
827
|
-
"Url для http запросов": "",
|
|
822
|
+
"Callback вызываемый при нажатии на смену года или месяца в шапке Calendar": "Callback called when changing the year or month in the Calendar header",
|
|
823
|
+
"Пользовательский цвет для чекбокса": "Custom color for checkbox",
|
|
824
|
+
"Кастомный домен": "Custom domain",
|
|
825
|
+
"Куки для режима ssr": "Cookies for SSR mode",
|
|
826
|
+
"Ключ для хранения токена в куках": "Key for storing the token in cookies",
|
|
827
|
+
"Url для http запросов": "URL for HTTP requests",
|
|
828
|
+
"Срок хранения токена в хранилийе в днях": "Token storage duration in days",
|
|
829
|
+
"Имя хранилища для токена (local, session, или cookie)": "Token storage name (local, session, or cookie)",
|
|
830
|
+
"Ключ токена авторизации для локального хранилища": "Authorization token key for local storage",
|
|
831
|
+
"Запрос на обновление токена авторизации": "Authorization token refresh request",
|
|
832
|
+
"Хендлер для авторизации": "Authorization handler",
|
|
833
|
+
"Функция, которая вызывается на закрытие соединения": "Function called on connection closure",
|
|
834
|
+
"Функция, которая вызывается на отправку сообщения": "Function called on message sending",
|
|
835
|
+
"Функция, которая вызывается на открытие соединения": "Function called on connection opening",
|
|
836
|
+
"Массив streams": "Array of streams",
|
|
837
|
+
"url для websocket": "WebSocket URL",
|
|
838
|
+
"Колонки канбан доски": "Kanban board columns",
|
|
839
|
+
"Идентификатор канбан доски": "Kanban board identifier",
|
|
840
|
+
"Обработчик события окончания перетаскивания карточки или колонки": "Drag-and-drop card or column end event handler",
|
|
841
|
+
"Метод для добавления css-класса к элементу": "Method for adding a CSS class to an element",
|
|
842
|
+
"Утилита для создания css-классов по БЭМ": "Utility for creating CSS classes according to BEM",
|
|
843
|
+
"Метод для соединения нескольких classNames": "Method for combining multiple classNames",
|
|
844
|
+
"Метод для удаления css-класса у элемента": "Method for removing a CSS class from an element",
|
|
845
|
+
"Метод, который вызывается после запроса": "Method called after a request",
|
|
846
|
+
"Вызов метода delete": "Method call to delete",
|
|
847
|
+
"Вызов метода get": "Method call to get",
|
|
848
|
+
"Получение токена": "Token retrieval",
|
|
849
|
+
"Получение конфига для axios": "Get config for axios",
|
|
850
|
+
"Получение экземпляра axios": "Get axios instance",
|
|
851
|
+
"Получение url по методу": "Get URL by method",
|
|
852
|
+
"Метод, который можно вызвать при login": "Method callable on login",
|
|
853
|
+
"Метод, который можно вызвать при logout": "Method callable on logout",
|
|
854
|
+
"Вызов метода post": "Method call to post",
|
|
855
|
+
"Удаление токена": "Token deletion",
|
|
856
|
+
"Сбросить конфиг": "Reset configuration",
|
|
857
|
+
"Вызов http-метода": "HTTP method call",
|
|
858
|
+
"Изменение токена": "Token change",
|
|
859
|
+
"Изменение csrf токена": "CSRF token change",
|
|
860
|
+
"Получить модель": "Get model",
|
|
861
|
+
"Получить тип": "Get type",
|
|
862
|
+
"Форматирование модели модели": "Model formatting",
|
|
863
|
+
"Форматирование названия модели": "Model name formatting",
|
|
864
|
+
"Изменить модель": "Change model",
|
|
865
|
+
"Изменить тип": "Change type",
|
|
866
|
+
"Закрытие websocket соединения": "Close WebSocket connection",
|
|
867
|
+
"Открытие websocket соединения": "Open WebSocket connection",
|
|
868
|
+
"Подписка на streams": "Subscribe to streams",
|
|
869
|
+
"Подписка на stream": "Subscribe to a stream",
|
|
870
|
+
"Отписка от streams": "Unsubscribe from streams",
|
|
871
|
+
"Отписка от stream": "Unsubscribe from a stream",
|
|
872
|
+
"Отменить прослушивание метрик": "Cancel metric listening",
|
|
873
|
+
"Отписаться от метрик": "Unsubscribe from metrics",
|
|
874
|
+
"Провайдеры": "Providers",
|
|
875
|
+
"Редьюсеры": "Reducers",
|
|
876
|
+
"Хранилище": "Store",
|
|
877
|
+
"Вариация HttpComponent с функционалом обновления токена авторизации": "HttpComponent variation with authorization token refresh functionality",
|
|
878
|
+
"Компонент для локализации приложения. Поддерживает конфигурацию языка и временной зоны": "Component for application localization. Supports language and time zone configuration",
|
|
879
|
+
"Компонент для добавления метрик в приложение (например яндекс метрики)": "Component for adding metrics to the application (e.g., Yandex.Metrics)",
|
|
880
|
+
"Поменять счетчики": "Change counters",
|
|
881
|
+
"Инициализация компонента": "Component initialization",
|
|
882
|
+
"Старт": "Start",
|
|
883
|
+
"Добавление редьюсеров": "Add reducers",
|
|
884
|
+
"Конфигурация": "Configuration",
|
|
885
|
+
"Метод для dispatch": "Method for dispatch",
|
|
886
|
+
"Метод, который вызывается при ошибке": "Method called on error",
|
|
887
|
+
"Получение состояния": "Get state",
|
|
888
|
+
"Инициализация": "Initialization",
|
|
889
|
+
"Инициализация хранилища": "Storage initialization",
|
|
890
|
+
"Подписка": "Subscription",
|
|
891
|
+
"Компонент для создания websocket взаимодействия": "Component for creating WebSocket interaction",
|
|
892
|
+
"Получить значение из хранилища.": "Get value from storage",
|
|
893
|
+
"Удалить значение из хранилища.": "Remove value from storage",
|
|
894
|
+
"Установить значение в хранилище.": "Set value in storage",
|
|
895
|
+
"Включает обработку вложенных данных из items вида [{id: 1, name: 'John', items: [...]}]": "Enables processing of nested data from items like [{id: 1, name: 'John', items: [...]}]",
|
|
896
|
+
"\nКомпонент `FileField` представляет собой поле формы для загрузки файлов.\nОн использует хук `useFile` для управления состоянием файлов и выполнения операций с файлами, таких как выбор и удаление.\nКомпонент поддерживает различные варианты отображения файлов (список или стена) с помощью перечисления `FilesLayout`.\nНа backendUrl по дефолту файл отправляется в теле запроса в виде бинарного кода.\nЧтобы отправлять файл в виде form-data (например в таком виде принимает файл FileModule в библиотеке steroidsjs/nest),\nнужно передать в `FileField` пропс uploaderConfig, в котором нужно указать поле useFormData: true.\n": "The `FileField` component represents a form field for uploading files.\nIt uses the `useFile` hook to manage the state of files and perform file operations such as selection and deletion.\nThe component supports various file display options (list or wall) using the `FilesLayout` enum.\nBy default, files are sent as binary data in the request body to the backend URL.\nTo send a file as form-data (e.g., as accepted by the FileModule in the steroidsjs/nest library),\nyou need to pass the `uploaderConfig` prop to `FileField` and specify the `useFormData: true` field.\n",
|
|
897
|
+
"Массив исполнителей, которых можно назначить для выполнения задачи": "Array of performers that can be assigned to a task",
|
|
898
|
+
"Общий контекст обертка из библиотеки react-beautiful-dnd": "Common context wrapper from the react-beautiful-dnd library",
|
|
899
|
+
"Компонент обертка для регистрации элемента который можно переместить из библиотеки react-beautiful-dnd": "Wrapper component for registering a draggable item from the react-beautiful-dnd library",
|
|
900
|
+
"Компонент обертка для инициализации области куда можно переместить элемент из библиотеки react-beautiful-dnd": "Wrapper component for initializing the area where an item can be moved from the react-beautiful-dnd library",
|
|
901
|
+
"Идентификатор последней созданной задачи, нужен для определения последовательности id для новых задач": "Identifier of the last created task, needed to determine the sequence of IDs for new tasks",
|
|
902
|
+
"Обработчик события создания карточки": "Card creation event handler",
|
|
903
|
+
"Обработчик события окончания перетаскивания карточки или колонки\nВ result передается объект с информацией о событии": "Event handler for ending card or column dragging\nThe `result` parameter contains an object with event information",
|
|
904
|
+
"Обработчик события редактирования карточки": "Card editing event handler",
|
|
905
|
+
"Массив тегов для задач": "Array of tags for tasks",
|
|
906
|
+
"\nКомпонент в котором можно расположить различные элементы, например графики, таблицы на доске\n": "\nA component in which various elements can be placed, such as graphics, tables on a board\n",
|
|
907
|
+
"Заголовок для элемента": "Title for the element",
|
|
908
|
+
"Кастомная вьюшка для элемента": "Custom view for the element",
|
|
909
|
+
"Элементы дашборда": "Dashboard elements",
|
|
910
|
+
"Свойства для модального окна": "Properties for a modal window",
|
|
911
|
+
"Параметры для групп событий": "Event group parameters",
|
|
912
|
+
"Свойства для модального окна группы событий": "Properties for a modal window of event groups",
|
|
913
|
+
"Функция, которая вызовется при смене типа календаря": "Function called when the calendar type changes",
|
|
914
|
+
"Внутреннее описание события": "Internal event description",
|
|
915
|
+
"Идентификатор": "Identifier",
|
|
916
|
+
"События группы": "Event group",
|
|
917
|
+
"Название группы": "Group name",
|
|
918
|
+
"Идентификатор чата": "Chat identifier",
|
|
919
|
+
"Данные о текущем пользователе, нужны для отправки сообщений и определения сообщений пользователя": "Data about the current user, needed for sending messages and determining user messages",
|
|
920
|
+
"Коллекция сообщений": "Message collection",
|
|
921
|
+
"Event sending event handler": "Event sending event handler",
|
|
922
|
+
"\nКомплексный компонент календарь служит для планирования событий и их отображения в календаре.\n\nКомпонент умеет отображать события с помощью недельной сетки с шагом в 1 час,\nа также переключать отображение на сетку по месяцам с шагом 1 день.\nПрисутствует возможность добавлять в календарь события и создавать новые группы событий.\n\n": "The complex `Calendar` component is used for event planning and display in a calendar.\nThe component can display events using a weekly grid with a 1-hour interval\nand can switch to a monthly grid with a 1-day interval.\nIt also allows adding events to the calendar and creating new event groups.",
|
|
923
|
+
"Этот компонент позволяет создавать в проекте графики разных типов, используя библиотеки nivo, react-vis и другие.\n Под капотом для графиков могут использоваться различные библиотеки в зависимости от предпочтений и потребностей проекта.\n Для работы с nivo графиками, необходимо установить в проекте зависимости @nivo/core и соответствующий пакет графика, например @nivo/line.\n Компонент графика, независимо от выбранной библиотеки, нужно передать в пропс chartComponent.": "This component allows creating various types of charts in the project using libraries like nivo, react-vis, and others.\nDifferent chart libraries can be used under the hood depending on project preferences and needs. To work with nivo charts, you need to install dependencies like @nivo/core and the appropriate chart package, e.g., @nivo/line. Regardless of the chosen library, you need to pass the `chartComponent` prop for the chart component.",
|
|
924
|
+
"\nКомплексный компонент `Chat` предназначен для коммуникации пользователей с помощью текстовых сообщений.\n": "The complex `Chat` component is designed for user communication through text messages.\n",
|
|
925
|
+
"\nКомпонент `Kanban` позволяет создать доску для управления задачами.\nКоличество столбцов задается с помощью пропа `columns`.\nЗадачи на доске можно создавать, редактировать и перемещать с визуальным отображением.\n\nДля работы этого компонента необходимо установить в проекте зависимости `react-beautiful-dnd`\nи передать в пропсы `droppableComponent`, `draggableComponent` и `dndContext`\nкомпоненты `Droppable`, `Draggable` и `DragDropContext` соответственно.\n": "The `Kanban` component allows creating a board for task management. The number of columns is set using the `columns` prop.\nTasks on the board can be created, edited, and moved with visual representation.\nTo use this component, you need to install the `react-beautiful-dnd` dependencies in the project\nand pass the `Droppable`, `Draggable`, and `DragDropContext` components as `droppableComponent`, `draggableComponent`, and `dndContext` props, respectively.",
|
|
926
|
+
"\nПоле ввода почты. Этот компонент представляет собой поле ввода почты.\n\n": "Email input field. This component represents an email input field.",
|
|
927
|
+
"\nСоздает список из сгруппированных полей формы.\n": "Creates a list of grouped form fields.",
|
|
928
|
+
"\nКомпонент `Skeleton` представляет собой заглушку для отображения временных данных\nво время загрузки или ожидания загрузки реальных данных.\n": "The `Skeleton` component serves as a placeholder for displaying temporary data during loading or while waiting for real data.",
|
|
929
|
+
"\nКомпонент `ControlsColumn` предоставляет колонку с контролами.\n": "The `ControlsColumn` component provides a column with controls.",
|
|
930
|
+
"\nКомпонент для представления данных коллекции в виде иерархической структуры.\n": "A component for presenting collection data in the form of a hierarchical structure.",
|
|
931
|
+
"\nС помощью компонента `Link` вы можете легко настраивать цветовую схему элементов ссылок.\n": "With the `Link` component, you can easily customize the color scheme of link elements.",
|
|
932
|
+
"\nКомпонент навигации позволяет переключаться между группами связанного контента.\n\n": "The navigation component allows switching between groups of related content.",
|
|
933
|
+
"Кнопки\nМогут служить в качестве настраиваемых контроллов для создания функционала": "Buttons\nCan serve as customizable controls to create functionality",
|
|
934
|
+
"Фиксированная высота обертки в пикселях": "Fixed wrapper height in pixels",
|
|
935
|
+
"Чекбоксы\nМогут служить в качестве настраиваемых контроллов для создания функционала": "Checkboxes\nCan serve as customizable controls to create functionality",
|
|
936
|
+
"Заголовок графика": "Chart title",
|
|
828
937
|
"Срок хранения токена в хранилище в днях": "",
|
|
829
|
-
"Имя хранилища для токена (local, session, или cookie)": "",
|
|
830
|
-
"Ключ токена авторизации для локального хранилища": "",
|
|
831
|
-
"Запрос на обновление токена авторизации": "",
|
|
832
|
-
"Хендлер для авторизации": "",
|
|
833
|
-
"Функция, которая вызывается на закрытие соединения": "",
|
|
834
|
-
"Функция, которая вызывается на отправку сообщения": "",
|
|
835
|
-
"Функция, которая вызывается на открытие соединения": "",
|
|
836
|
-
"Массив streams": "",
|
|
837
|
-
"url для websocket": "",
|
|
838
|
-
"Колонки канбан доски": "",
|
|
839
|
-
"Идентификатор канбан доски": "",
|
|
840
|
-
"Обработчик события окончания перетаскивания карточки или колонки": "",
|
|
841
|
-
"Метод для добавления css-класса к элементу": "",
|
|
842
|
-
"Утилита для создания css-классов по БЭМ": "",
|
|
843
|
-
"Метод для соединения нескольких classNames": "",
|
|
844
|
-
"Метод для удаления css-класса у элемента": "",
|
|
845
|
-
"Метод, который вызывается после запроса": "",
|
|
846
|
-
"Вызов метода delete": "",
|
|
847
|
-
"Вызов метода get": "",
|
|
848
|
-
"Получение токена": "",
|
|
849
|
-
"Получение конфига для axios": "",
|
|
850
|
-
"Получение экземпляра axios": "",
|
|
851
|
-
"Получение url по методу": "",
|
|
852
|
-
"Метод, который можно вызвать при login": "",
|
|
853
|
-
"Метод, который можно вызвать при logout": "",
|
|
854
|
-
"Вызов метода post": "",
|
|
855
|
-
"Удаление токена": "",
|
|
856
|
-
"Сбросить конфиг": "",
|
|
857
|
-
"Вызов http-метода": "",
|
|
858
|
-
"Изменение токена": "",
|
|
859
|
-
"Изменение csrf токена": "",
|
|
860
|
-
"Получить модель": "",
|
|
861
|
-
"Получить тип": "",
|
|
862
|
-
"Форматирование модели модели": "",
|
|
863
|
-
"Форматирование названия модели": "",
|
|
864
|
-
"Изменить модель": "",
|
|
865
|
-
"Изменить тип": "",
|
|
866
|
-
"Закрытие websocket соединения": "",
|
|
867
|
-
"Открытие websocket соединения": "",
|
|
868
|
-
"Подписка на streams": "",
|
|
869
|
-
"Подписка на stream": "",
|
|
870
|
-
"Отписка от streams": "",
|
|
871
|
-
"Отписка от stream": "",
|
|
872
|
-
"Отменить прослушивание метрик": "",
|
|
873
|
-
"Отписаться от метрик": "",
|
|
874
|
-
"Провайдеры": "",
|
|
875
|
-
"Редьюсеры": "",
|
|
876
|
-
"Хранилище": "",
|
|
877
|
-
"Вариация HttpComponent с функционалом обновления токена авторизации": "",
|
|
878
|
-
"Компонент для локализации приложения. Поддерживает конфигурацию языка и временной зоны": "",
|
|
879
|
-
"Компонент для добавления метрик в приложение (например яндекс метрики)": "",
|
|
880
|
-
"Поменять счетчики": "",
|
|
881
|
-
"Инициализация компонента": "",
|
|
882
|
-
"Старт": "",
|
|
883
|
-
"Добавление редьюсеров": "",
|
|
884
|
-
"Конфигурация": "",
|
|
885
|
-
"Метод для dispatch": "",
|
|
886
|
-
"Метод, который вызывается при ошибке": "",
|
|
887
|
-
"Получение состояние": "",
|
|
888
|
-
"Инициализация": "",
|
|
889
|
-
"Инициализация хранилища": "",
|
|
890
|
-
"Подписка": "",
|
|
891
|
-
"Компонент для создания websocket взаимодействия": "",
|
|
892
|
-
"Получить значение из хранилища.": "",
|
|
893
|
-
"Удалить значение из хранилища.": "",
|
|
894
|
-
"Установить значение в хранилище.": "",
|
|
895
|
-
"Включает обработку вложенных данных из items вида [{id: 1, name: 'John', items: [...]}]": "",
|
|
896
|
-
"\nКомпонент `FileField` представляет собой поле формы для загрузки файлов.\nОн использует хук `useFile` для управления состоянием файлов и выполнения операций с файлами, таких как выбор и удаление.\nКомпонент поддерживает различные варианты отображения файлов (список или стена) с помощью перечисления `FilesLayout`.\nНа backendUrl по дефолту файл отправляется в теле запроса в виде бинарного кода.\nЧтобы отправлять файл в виде form-data (например в таком виде принимает файл FileModule в библиотеке steroidsjs/nest),\nнужно передать в `FileField` пропс uploaderConfig, в котором нужно указать поле useFormData: true.\n": "",
|
|
897
|
-
"Массив исполнителей, которых можно назначить для выполнения задачи": "",
|
|
898
|
-
"Общий контекст обертка из библиотеки react-beautiful-dnd": "",
|
|
899
|
-
"Компонент обертка для регистрации элемента который можно переместить из библиотеки react-beautiful-dnd": "",
|
|
900
|
-
"Компонент обертка для инициализации области куда можно переместить элемент из библиотеки react-beautiful-dnd": "",
|
|
901
|
-
"Идентификатор последней созданной задачи, нужен для определения последовательности id для новых задач": "",
|
|
902
|
-
"Обработчик события создания карточки": "",
|
|
903
|
-
"Обработчик события окончания перетаскивания карточки или колонки\nВ result передается объект с информацией о событии": "",
|
|
904
|
-
"Обработчик события редактирования карточки": "",
|
|
905
|
-
"Массив тегов для задач": "",
|
|
906
|
-
"\nКомпонент в котором можно расположить различные элементы, например графики, таблицы на доске\n": "",
|
|
907
|
-
"Заголовок для элемента": "",
|
|
908
|
-
"Кастомная вьюшка для элемента": "",
|
|
909
|
-
"Элементы дашборда": "",
|
|
910
|
-
"Свойства для модального окна": "",
|
|
911
|
-
"Параметры для групп событий": "",
|
|
912
938
|
"Свойства для модалного окна группы событий": "",
|
|
913
|
-
"Функция, которая вызовется при смене типа календаря": "",
|
|
914
939
|
"Внутреннее описания события": "",
|
|
915
|
-
"Идентификатор": "",
|
|
916
|
-
"События группы": "",
|
|
917
|
-
"Название группы": "",
|
|
918
|
-
"Идентификатор чата": "",
|
|
919
|
-
"Данные о текущем пользователе, нужны для отправки сообщений и определения сообщений пользователя": "",
|
|
920
|
-
"Коллекция сообщений": "",
|
|
921
|
-
"Обработчик события отправки сообщения": "",
|
|
922
|
-
"\nКомплексный компонент календарь служит для планирования событий и их отображения в календаре.\n\nКомпонент умеет отображать события с помощью недельной сетки с шагом в 1 час,\nа также переключать отображение на сетку по месяцам с шагом 1 день.\nПрисутствует возможность добавлять в календарь события и создавать новые группы событий.\n\n": "",
|
|
923
|
-
"Этот компонент позволяет создавать в проекте графики разных типов, используя библиотеки nivo, react-vis и другие.\n Под капотом для графиков могут использоваться различные библиотеки в зависимости от предпочтений и потребностей проекта.\n Для работы с nivo графиками, необходимо установить в проекте зависимости @nivo/core и соответствующий пакет графика, например @nivo/line.\n Компонент графика, независимо от выбранной библиотеки, нужно передать в пропс chartComponent.": "",
|
|
924
|
-
"\nКомплексный компонент `Chat` предназначен для коммуникации пользователей с помощью текстовых сообщений.\n": "",
|
|
925
|
-
"\nКомпонент `Kanban` позволяет создать доску для управления задачами.\nКоличество столбцов задается с помощью пропа `columns`.\nЗадачи на доске можно создавать, редактировать и перемещать с визуальным отображением.\n\nДля работы этого компонента необходимо установить в проекте зависимости `react-beautiful-dnd`\nи передать в пропсы `droppableComponent`, `draggableComponent` и `dndContext`\nкомпоненты `Droppable`, `Draggable` и `DragDropContext` соответственно.\n": "",
|
|
926
|
-
"\nПоле ввода почты. Этот компонент представляет собой поле ввода почты.\n\n": "",
|
|
927
|
-
"\nСоздает список из сгруппированных полей формы.\n": "",
|
|
928
|
-
"\nКомпонент `Skeleton` представляет собой заглушку для отображения временных данных\nво время загрузки или ожидания загрузки реальных данных.\n": "",
|
|
929
|
-
"\nКомпонент `ControlsColumn` предоставляет колонку с контролами.\n": "",
|
|
930
|
-
"\nКомпонент для представления данных коллекции в виде иерархической структуры.\n": "",
|
|
931
|
-
"\nС помощью компонента `Link` вы можете легко настраивать цветовую схему элементов ссылок.\n": "",
|
|
932
|
-
"\nКомпонент навигации позволяет переключаться между группами связанного контента.\n\n": "",
|
|
933
940
|
"Кнопки\nМогут служить в качестве настаиваемых контроллов для создания функционала": "",
|
|
934
|
-
"Фиксированная высота обертки в пикселях": "",
|
|
935
941
|
"Чекбоксы\nМогут служить в качестве настаиваемых контроллов для создания функционала": "",
|
|
936
|
-
"
|
|
942
|
+
"Иконка, которая отобразится слева от заголовка": "",
|
|
943
|
+
"Метод, который можно вызвать при login": "",
|
|
944
|
+
"Метод, который можно вызвать при logout": "",
|
|
945
|
+
"Получение состояние": ""
|
|
937
946
|
}
|
package/hooks/useFile.d.ts
CHANGED
package/hooks/useFile.js
CHANGED
|
@@ -14,6 +14,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
14
14
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
15
15
|
};
|
|
16
16
|
exports.__esModule = true;
|
|
17
|
+
exports.generateBackendUrl = void 0;
|
|
17
18
|
var react_1 = require("react");
|
|
18
19
|
var react_use_1 = require("react-use");
|
|
19
20
|
var fileup_core_1 = __importDefault(require("fileup-core"));
|
|
@@ -42,6 +43,7 @@ function generateBackendUrl(props) {
|
|
|
42
43
|
imagesExactSize: props.imagesExactSize
|
|
43
44
|
});
|
|
44
45
|
}
|
|
46
|
+
exports.generateBackendUrl = generateBackendUrl;
|
|
45
47
|
function useFile(props) {
|
|
46
48
|
var http = (0, index_1.useComponents)().http;
|
|
47
49
|
http.getAccessToken(); // TODO Run promise..
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@steroidsjs/core",
|
|
3
|
-
"version": "3.0.0-beta.
|
|
3
|
+
"version": "3.0.0-beta.104",
|
|
4
4
|
"description": "",
|
|
5
5
|
"author": "Vladimir Kozhin <hello@kozhindev.com>",
|
|
6
6
|
"repository": {
|
|
@@ -90,6 +90,7 @@
|
|
|
90
90
|
"jest-enzyme": "^7.1.2",
|
|
91
91
|
"rc-slider": "9.7.4",
|
|
92
92
|
"ts-jest": "^26.5.1",
|
|
93
|
+
"typedoc": "^0.21.0",
|
|
93
94
|
"typescript": "^4.9.5"
|
|
94
95
|
}
|
|
95
96
|
}
|
|
@@ -36,7 +36,7 @@ export interface IDropDownViewProps extends IDropDownProps, IAbsolutePositioning
|
|
|
36
36
|
/**
|
|
37
37
|
* Рассчет абсолютной позиции
|
|
38
38
|
*/
|
|
39
|
-
calculatePosition
|
|
39
|
+
calculatePosition?: (dropDownDimensions: Record<string, any>, arrowDimensions: Record<string, any>) => void;
|
|
40
40
|
/**
|
|
41
41
|
* Ссылка на view
|
|
42
42
|
*/
|
|
@@ -45,7 +45,7 @@ var TooltipPortalInner_1 = __importDefault(require("../../layout/Tooltip/Tooltip
|
|
|
45
45
|
var useAbsolutePositioning_1 = __importDefault(require("../../../hooks/useAbsolutePositioning"));
|
|
46
46
|
function DropDown(props) {
|
|
47
47
|
var components = (0, hooks_1.useComponents)();
|
|
48
|
-
var _a = (0, useAbsolutePositioning_1["default"])(props), isComponentExist = _a.isComponentExist, isComponentVisible = _a.isComponentVisible, calculateAbsolutePosition = _a.calculateAbsolutePosition, onShow = _a.onShow, onHide = _a.onHide, position = _a.position, style = _a.style;
|
|
48
|
+
var _a = (0, useAbsolutePositioning_1["default"])(props), isComponentExist = _a.isComponentExist, isComponentVisible = _a.isComponentVisible, calculateAbsolutePosition = _a.calculateAbsolutePosition, onShow = _a.onShow, onHide = _a.onHide, position = _a.position, arrowPosition = _a.arrowPosition, style = _a.style;
|
|
49
49
|
var childRef = (0, react_1.useRef)(null);
|
|
50
50
|
var isManualControl = props.visible !== undefined;
|
|
51
51
|
// Outside click -> close
|
|
@@ -70,8 +70,8 @@ function DropDown(props) {
|
|
|
70
70
|
}, [isComponentExist, isComponentVisible, onHide, props.closeMode]);
|
|
71
71
|
(0, react_use_1.useEvent)('mousedown', onAnyClick);
|
|
72
72
|
(0, react_use_1.useEvent)('touchstart', onAnyClick);
|
|
73
|
-
var calculatePosition = (0, react_1.useCallback)(function (componentSize) {
|
|
74
|
-
calculateAbsolutePosition(position, childRef.current, componentSize);
|
|
73
|
+
var calculatePosition = (0, react_1.useCallback)(function (componentSize, arrowSize) {
|
|
74
|
+
calculateAbsolutePosition(position, childRef.current, componentSize, arrowSize);
|
|
75
75
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
76
76
|
}, []);
|
|
77
77
|
var DropDownView = components.ui.getView(props.view || 'content.DropDownView');
|
|
@@ -93,7 +93,7 @@ function DropDown(props) {
|
|
|
93
93
|
isComponentExist && (
|
|
94
94
|
// TODO Change Portal to global
|
|
95
95
|
React.createElement(TooltipPortalInner_1["default"], null,
|
|
96
|
-
React.createElement(DropDownView, __assign({}, props, { className: props.className, forwardedRef: forwardedRef, content: props.content, position: position, style: style, calculatePosition: calculatePosition, isComponentVisible: isComponentVisible, onClose: onHide }))))));
|
|
96
|
+
React.createElement(DropDownView, __assign({}, props, { className: props.className, forwardedRef: forwardedRef, content: props.content, position: position, style: style, arrowPosition: arrowPosition, calculatePosition: calculatePosition, isComponentVisible: isComponentVisible, onClose: onHide }))))));
|
|
97
97
|
}
|
|
98
98
|
DropDown.defaultProps = {
|
|
99
99
|
autoPositioning: true,
|
package/ui/form/Form/Form.js
CHANGED
|
@@ -129,7 +129,7 @@ function Form(props) {
|
|
|
129
129
|
}
|
|
130
130
|
// Init data provider
|
|
131
131
|
var provider = props.useRedux ? form_1.providers.redux : form_1.providers.reducer;
|
|
132
|
-
var _b = provider.useForm(props.formId, initialValues), values = _b.values, submitCounter = _b.submitCounter, isInvalid = _b.isInvalid, isSubmitting = _b.isSubmitting, setErrors = _b.setErrors, reducer = _b.reducer, dispatch = _b.dispatch;
|
|
132
|
+
var _b = provider.useForm(props.formId, initialValues), values = _b.values, submitCounter = _b.submitCounter, isInvalid = _b.isInvalid, isSubmitting = _b.isSubmitting, errors = _b.errors, setErrors = _b.setErrors, reducer = _b.reducer, dispatch = _b.dispatch;
|
|
133
133
|
// Sync with address bar
|
|
134
134
|
(0, react_use_1.useUpdateEffect)(function () {
|
|
135
135
|
updateQuery(values);
|
|
@@ -147,6 +147,9 @@ function Form(props) {
|
|
|
147
147
|
dispatch((0, form_2.formDestroy)(props.formId));
|
|
148
148
|
}
|
|
149
149
|
});
|
|
150
|
+
// Clear Errors
|
|
151
|
+
var prevValues = (0, react_use_1.usePrevious)(values);
|
|
152
|
+
(0, react_use_1.useUpdateEffect)(function () { return (0, form_1.clearErrors)(values, prevValues, errors, setErrors); }, [errors, prevValues, setErrors, values]);
|
|
150
153
|
// OnChange handler
|
|
151
154
|
(0, react_use_1.useUpdateEffect)(function () {
|
|
152
155
|
if (props.onChange) {
|
|
@@ -10,12 +10,35 @@ var __assign = (this && this.__assign) || function () {
|
|
|
10
10
|
};
|
|
11
11
|
return __assign.apply(this, arguments);
|
|
12
12
|
};
|
|
13
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
16
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
17
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
18
|
+
}
|
|
19
|
+
Object.defineProperty(o, k2, desc);
|
|
20
|
+
}) : (function(o, m, k, k2) {
|
|
21
|
+
if (k2 === undefined) k2 = k;
|
|
22
|
+
o[k2] = m[k];
|
|
23
|
+
}));
|
|
24
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
25
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
26
|
+
}) : function(o, v) {
|
|
27
|
+
o["default"] = v;
|
|
28
|
+
});
|
|
29
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
30
|
+
if (mod && mod.__esModule) return mod;
|
|
31
|
+
var result = {};
|
|
32
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
33
|
+
__setModuleDefault(result, mod);
|
|
34
|
+
return result;
|
|
35
|
+
};
|
|
13
36
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
14
37
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
15
38
|
};
|
|
16
39
|
exports.__esModule = true;
|
|
17
40
|
/* eslint-disable max-len */
|
|
18
|
-
var react_1 = require("react");
|
|
41
|
+
var react_1 = __importStar(require("react"));
|
|
19
42
|
var hooks_1 = require("../../../hooks");
|
|
20
43
|
var fieldWrapper_1 = __importDefault(require("../Field/fieldWrapper"));
|
|
21
44
|
var useInputTypeNumber_1 = __importDefault(require("./hooks/useInputTypeNumber"));
|
|
@@ -23,6 +46,7 @@ var DEFAULT_STEP = 1;
|
|
|
23
46
|
function NumberField(props) {
|
|
24
47
|
var components = (0, hooks_1.useComponents)();
|
|
25
48
|
var _a = (0, hooks_1.useSaveCursorPosition)(props.input), currentInputRef = _a.inputRef, onChange = _a.onChange;
|
|
49
|
+
var step = react_1["default"].useMemo(function () { var _a; return (_a = props.step) !== null && _a !== void 0 ? _a : DEFAULT_STEP; }, [props.step]);
|
|
26
50
|
var onInputChange = (0, useInputTypeNumber_1["default"])(currentInputRef, {
|
|
27
51
|
max: props.max,
|
|
28
52
|
min: props.min,
|
|
@@ -30,15 +54,18 @@ function NumberField(props) {
|
|
|
30
54
|
}, onChange).onInputChange;
|
|
31
55
|
var onStep = (0, react_1.useCallback)(function (isIncrement) {
|
|
32
56
|
var _a;
|
|
33
|
-
var step = props.step || DEFAULT_STEP;
|
|
34
57
|
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)));
|
|
35
|
-
}, [currentInputRef, onChange,
|
|
58
|
+
}, [currentInputRef, onChange, step]);
|
|
36
59
|
var onStepUp = (0, react_1.useCallback)(function () {
|
|
37
|
-
|
|
38
|
-
|
|
60
|
+
if (!(Number(currentInputRef.current.value) + step > props.max)) {
|
|
61
|
+
onStep(true);
|
|
62
|
+
}
|
|
63
|
+
}, [currentInputRef, onStep, props.max, step]);
|
|
39
64
|
var onStepDown = (0, react_1.useCallback)(function () {
|
|
40
|
-
|
|
41
|
-
|
|
65
|
+
if (!(Number(currentInputRef.current.value) - step < props.min)) {
|
|
66
|
+
onStep(false);
|
|
67
|
+
}
|
|
68
|
+
}, [currentInputRef, onStep, props.min, step]);
|
|
42
69
|
var onKeyDown = (0, react_1.useCallback)(function (event) {
|
|
43
70
|
if (event.key === 'ArrowUp') {
|
|
44
71
|
onStepUp();
|
package/ui/nav/Router/Router.js
CHANGED
|
@@ -175,6 +175,9 @@ function Router(props) {
|
|
|
175
175
|
});
|
|
176
176
|
var result = renderComponent(routeItem, activePath, __assign(__assign({}, routeProps), { children: children }));
|
|
177
177
|
if (!result) {
|
|
178
|
+
if (children) {
|
|
179
|
+
return children;
|
|
180
|
+
}
|
|
178
181
|
// eslint-disable-next-line no-console
|
|
179
182
|
console.error('Not found component for route:', routeItem);
|
|
180
183
|
}
|
|
@@ -1,6 +1,19 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
exports.__esModule = true;
|
|
3
|
+
/* eslint-disable implicit-arrow-linebreak */
|
|
3
4
|
var useAbsolutePositioning_1 = require("../hooks/useAbsolutePositioning");
|
|
5
|
+
var isComponentBeyondTop = function (parentDimensions, componentSize, gap) {
|
|
6
|
+
return (parentDimensions.top - window.scrollY) <= Math.round(componentSize.height + gap);
|
|
7
|
+
};
|
|
8
|
+
var isComponentBeyondLeft = function (parentDimensions, componentSize, gap) {
|
|
9
|
+
return parentDimensions.left <= Math.round(componentSize.width + gap);
|
|
10
|
+
};
|
|
11
|
+
var isComponentBeyondRight = function (parentDimensions, componentSize, gap) {
|
|
12
|
+
return document.body.clientWidth - parentDimensions.right <= Math.round(componentSize.width + gap);
|
|
13
|
+
};
|
|
14
|
+
var isComponentBeyondBottom = function (parentDimensions, componentSize, gap) {
|
|
15
|
+
return (window.innerHeight - (parentDimensions.top + parentDimensions.height - window.scrollY)) <= Math.round(componentSize.height + gap);
|
|
16
|
+
};
|
|
4
17
|
function calculateComponentAbsolutePosition(gap, position, parentRef, componentSize, arrowSize, hasAutoPositioning) {
|
|
5
18
|
if (arrowSize === void 0) { arrowSize = null; }
|
|
6
19
|
if (hasAutoPositioning === void 0) { hasAutoPositioning = true; }
|
|
@@ -17,10 +30,9 @@ function calculateComponentAbsolutePosition(gap, position, parentRef, componentS
|
|
|
17
30
|
case useAbsolutePositioning_1.Position.TOP:
|
|
18
31
|
case useAbsolutePositioning_1.Position.TOP_LEFT:
|
|
19
32
|
case useAbsolutePositioning_1.Position.TOP_RIGHT:
|
|
20
|
-
// Проверка - выходит ли
|
|
33
|
+
// Проверка - выходит ли component за верхний край страницы?
|
|
21
34
|
// Если да - меняем позицию на bottom
|
|
22
|
-
if (hasAutoPositioning
|
|
23
|
-
&& ((parentDimensions.top - window.scrollY) <= Math.round(componentSize.height + gap))) {
|
|
35
|
+
if (hasAutoPositioning && isComponentBeyondTop(parentDimensions, componentSize, gap)) {
|
|
24
36
|
style.top = parentDimensions.top + parentDimensions.height;
|
|
25
37
|
position = position.replace(useAbsolutePositioning_1.Position.TOP, useAbsolutePositioning_1.Position.BOTTOM);
|
|
26
38
|
}
|
|
@@ -31,11 +43,9 @@ function calculateComponentAbsolutePosition(gap, position, parentRef, componentS
|
|
|
31
43
|
case useAbsolutePositioning_1.Position.BOTTOM:
|
|
32
44
|
case useAbsolutePositioning_1.Position.BOTTOM_LEFT:
|
|
33
45
|
case useAbsolutePositioning_1.Position.BOTTOM_RIGHT:
|
|
34
|
-
/// Проверка - выходит ли
|
|
46
|
+
/// Проверка - выходит ли component за нижний край страницы?
|
|
35
47
|
// Если да - меняем позицию на top
|
|
36
|
-
if (hasAutoPositioning
|
|
37
|
-
&& ((window.innerHeight - (parentDimensions.top + parentDimensions.height - window.scrollY))
|
|
38
|
-
<= Math.round(componentSize.height + gap))) {
|
|
48
|
+
if (hasAutoPositioning && isComponentBeyondBottom(parentDimensions, componentSize, gap)) {
|
|
39
49
|
style.top = parentDimensions.top - componentSize.height;
|
|
40
50
|
position = position.replace(useAbsolutePositioning_1.Position.BOTTOM, useAbsolutePositioning_1.Position.TOP);
|
|
41
51
|
}
|
|
@@ -46,9 +56,9 @@ function calculateComponentAbsolutePosition(gap, position, parentRef, componentS
|
|
|
46
56
|
case useAbsolutePositioning_1.Position.LEFT:
|
|
47
57
|
case useAbsolutePositioning_1.Position.LEFT_TOP:
|
|
48
58
|
case useAbsolutePositioning_1.Position.LEFT_BOTTOM:
|
|
49
|
-
// Проверка - выходит ли
|
|
59
|
+
// Проверка - выходит ли component за левый край страницы?
|
|
50
60
|
// Если да - меняем позицию на right
|
|
51
|
-
if (hasAutoPositioning && (parentDimensions
|
|
61
|
+
if (hasAutoPositioning && isComponentBeyondLeft(parentDimensions, componentSize, gap)) {
|
|
52
62
|
style.left = parentDimensions.right;
|
|
53
63
|
position = position.replace(useAbsolutePositioning_1.Position.LEFT, useAbsolutePositioning_1.Position.RIGHT);
|
|
54
64
|
}
|
|
@@ -59,10 +69,9 @@ function calculateComponentAbsolutePosition(gap, position, parentRef, componentS
|
|
|
59
69
|
case useAbsolutePositioning_1.Position.RIGHT:
|
|
60
70
|
case useAbsolutePositioning_1.Position.RIGHT_TOP:
|
|
61
71
|
case useAbsolutePositioning_1.Position.RIGHT_BOTTOM:
|
|
62
|
-
// Проверка - выходит ли
|
|
72
|
+
// Проверка - выходит ли component за правый край страницы?
|
|
63
73
|
// Если да - меняем позицию на left
|
|
64
|
-
if (hasAutoPositioning
|
|
65
|
-
&& (document.body.clientWidth - parentDimensions.right <= Math.round(componentSize.width + gap))) {
|
|
74
|
+
if (hasAutoPositioning && isComponentBeyondRight(parentDimensions, componentSize, gap)) {
|
|
66
75
|
style.left = parentDimensions.left - componentSize.width;
|
|
67
76
|
position = position.replace(useAbsolutePositioning_1.Position.RIGHT, useAbsolutePositioning_1.Position.LEFT);
|
|
68
77
|
}
|
|
@@ -72,6 +81,31 @@ function calculateComponentAbsolutePosition(gap, position, parentRef, componentS
|
|
|
72
81
|
break;
|
|
73
82
|
}
|
|
74
83
|
// eslint-disable-next-line default-case
|
|
84
|
+
switch (position) {
|
|
85
|
+
case useAbsolutePositioning_1.Position.LEFT:
|
|
86
|
+
case useAbsolutePositioning_1.Position.LEFT_TOP:
|
|
87
|
+
case useAbsolutePositioning_1.Position.LEFT_BOTTOM:
|
|
88
|
+
// Проверка - выходит ли component после изменения позиции на left за левый край страницы?
|
|
89
|
+
// Если да - меняем позицию на bottom
|
|
90
|
+
if (hasAutoPositioning && isComponentBeyondLeft(parentDimensions, componentSize, gap)) {
|
|
91
|
+
style.left = null;
|
|
92
|
+
style.top = parentDimensions.top + parentDimensions.height;
|
|
93
|
+
position = useAbsolutePositioning_1.Position.BOTTOM;
|
|
94
|
+
}
|
|
95
|
+
break;
|
|
96
|
+
case useAbsolutePositioning_1.Position.RIGHT:
|
|
97
|
+
case useAbsolutePositioning_1.Position.RIGHT_TOP:
|
|
98
|
+
case useAbsolutePositioning_1.Position.RIGHT_BOTTOM:
|
|
99
|
+
// Проверка - выходит ли component после изменения позиции на right за правый край страницы?
|
|
100
|
+
// Если да - меняем позицию на bottom
|
|
101
|
+
if (hasAutoPositioning && isComponentBeyondRight(parentDimensions, componentSize, gap)) {
|
|
102
|
+
style.left = null;
|
|
103
|
+
style.top = parentDimensions.top + parentDimensions.height;
|
|
104
|
+
position = useAbsolutePositioning_1.Position.BOTTOM;
|
|
105
|
+
}
|
|
106
|
+
break;
|
|
107
|
+
}
|
|
108
|
+
// eslint-disable-next-line default-case
|
|
75
109
|
switch (position) {
|
|
76
110
|
case useAbsolutePositioning_1.Position.TOP:
|
|
77
111
|
case useAbsolutePositioning_1.Position.BOTTOM:
|
|
@@ -80,7 +114,7 @@ function calculateComponentAbsolutePosition(gap, position, parentRef, componentS
|
|
|
80
114
|
break;
|
|
81
115
|
case useAbsolutePositioning_1.Position.TOP_LEFT:
|
|
82
116
|
case useAbsolutePositioning_1.Position.BOTTOM_LEFT:
|
|
83
|
-
// Ширина
|
|
117
|
+
// Ширина component больше родителя - стрелка на середину родителя
|
|
84
118
|
style.left = parentDimensions.left;
|
|
85
119
|
if (arrowSize && (parentDimensions.width < componentSize.width)) {
|
|
86
120
|
arrowPosition = { left: parentDimensions.width / 2 };
|
|
@@ -88,7 +122,7 @@ function calculateComponentAbsolutePosition(gap, position, parentRef, componentS
|
|
|
88
122
|
break;
|
|
89
123
|
case useAbsolutePositioning_1.Position.TOP_RIGHT:
|
|
90
124
|
case useAbsolutePositioning_1.Position.BOTTOM_RIGHT:
|
|
91
|
-
// Ширина
|
|
125
|
+
// Ширина component больше родителя - стрелка на середину родителя
|
|
92
126
|
style.left = parentDimensions.right - componentSize.width;
|
|
93
127
|
if (arrowSize && (parentDimensions.width < componentSize.width)) {
|
|
94
128
|
arrowPosition = {
|
|
@@ -118,13 +152,13 @@ function calculateComponentAbsolutePosition(gap, position, parentRef, componentS
|
|
|
118
152
|
}
|
|
119
153
|
break;
|
|
120
154
|
}
|
|
121
|
-
|
|
155
|
+
//Проверка - при позиционировании top/bottom component не выходит за пределы страницы по горизонтали
|
|
122
156
|
if (position.includes('top') || position.includes('bottom')) {
|
|
123
157
|
if (!position.includes('Left')
|
|
124
|
-
&& (
|
|
158
|
+
&& (parentDimensions.left <= Math.round((componentSize.width - parentDimensions.width) + gap))) {
|
|
125
159
|
style.right = null;
|
|
126
160
|
position = position.replace('Right', 'Left');
|
|
127
|
-
// Если ширина
|
|
161
|
+
// Если ширина component больше ширины родителя - выставить стрелку на середину родителя
|
|
128
162
|
if (parentDimensions.left < componentSize.width) {
|
|
129
163
|
arrowPosition = { left: parentDimensions.width / 2 };
|
|
130
164
|
}
|
|
@@ -144,15 +178,17 @@ function calculateComponentAbsolutePosition(gap, position, parentRef, componentS
|
|
|
144
178
|
style.right = document.body.clientWidth - parentDimensions.right;
|
|
145
179
|
}
|
|
146
180
|
}
|
|
147
|
-
// Проверка - при позиционировании left/right
|
|
181
|
+
// Проверка - при позиционировании left/right component не выходит за пределы страницы по вертикали
|
|
148
182
|
if (position.includes('left') || position.includes('right')) {
|
|
149
183
|
if (!position.includes('Top')
|
|
150
184
|
&& parentDimensions.top - window.scrollY <= Math.round((componentSize.height - parentDimensions.height) + gap)) {
|
|
151
185
|
position = position.replace('Bottom', 'Top');
|
|
152
|
-
if (parentDimensions.height < componentSize.height) {
|
|
153
|
-
arrowPosition = { top: parentDimensions.height / 2 };
|
|
154
|
-
}
|
|
155
186
|
style.top = parentDimensions.top;
|
|
187
|
+
if (arrowSize && parentDimensions.height < componentSize.height) {
|
|
188
|
+
arrowPosition = {
|
|
189
|
+
top: parentDimensions.height / 2
|
|
190
|
+
};
|
|
191
|
+
}
|
|
156
192
|
}
|
|
157
193
|
else if (!position.includes('Bottom')
|
|
158
194
|
&& (window.innerHeight - (parentDimensions.top + parentDimensions.height - window.scrollY)
|
package/utils/form.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/// <reference types="react" />
|
|
2
2
|
export declare const setInWithPath: (state: any, value: any, path: string[], pathIndex?: number) => any;
|
|
3
3
|
export declare const cleanEmptyObject: (object: any) => any;
|
|
4
|
+
export declare const clearErrors: (values: any, prevValues: any, errors: any, setErrors: any) => void;
|
|
4
5
|
export declare const providers: {
|
|
5
6
|
redux: {
|
|
6
7
|
useForm: (formId: any, initialValues: any) => any;
|