@steroidsjs/core 3.0.0-beta.92 → 3.0.0-beta.94
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/ClientStorageComponent.d.ts +12 -18
- package/components/ClientStorageComponent.js +0 -16
- package/components/HtmlComponent.d.ts +26 -2
- package/components/HttpComponent.d.ts +98 -16
- package/components/HttpComponent.js +0 -9
- package/components/JwtHttpComponent.d.ts +20 -5
- package/components/JwtHttpComponent.js +4 -0
- package/components/LocaleComponent.d.ts +12 -12
- package/components/LocaleComponent.js +0 -2
- package/components/MetaComponent.d.ts +30 -93
- package/components/MetricsComponent.d.ts +20 -1
- package/components/MetricsComponent.js +4 -0
- package/components/ResourceComponent.d.ts +9 -15
- package/components/SocialComponent.d.ts +16 -1
- package/components/StoreComponent.d.ts +44 -1
- package/components/UiComponent.d.ts +8 -16
- package/components/WebSocketComponent.d.ts +66 -7
- package/components/WebSocketComponent.js +4 -0
- package/docs-autogen-result.json +13221 -10520
- package/en.json +81 -4
- package/hooks/useApplication.d.ts +22 -6
- package/hooks/useSaveCursorPosition.js +3 -0
- package/package.json +3 -3
- package/providers/ComponentsProvider.d.ts +10 -5
- package/ui/content/CalendarSystem/CalendarSystem.d.ts +16 -4
- package/ui/content/CalendarSystem/CalendarSystem.js +10 -15
- package/ui/content/CalendarSystem/hooks/useCalendarSystemModals.d.ts +12 -0
- package/ui/content/CalendarSystem/hooks/useCalendarSystemModals.js +85 -0
- package/ui/content/CalendarSystem/utils/utils.d.ts +3 -1
- package/ui/content/CalendarSystem/utils/utils.js +6 -1
- package/ui/form/EmailField/EmailField.d.ts +6 -0
- package/ui/form/EmailField/EmailField.js +44 -0
- package/ui/form/EmailField/hooks/useInputTypeEmail.d.ts +5 -0
- package/ui/form/EmailField/hooks/useInputTypeEmail.js +31 -0
- package/ui/form/EmailField/index.d.ts +2 -0
- package/ui/form/EmailField/index.js +7 -0
- package/ui/form/Field/Field.js +2 -1
- package/ui/form/InputField/InputField.d.ts +2 -2
- package/ui/form/InputField/InputField.js +7 -1
- package/ui/form/InputField/hooks/useInputFieldWarningByType.d.ts +3 -0
- package/ui/form/InputField/hooks/useInputFieldWarningByType.js +35 -0
- package/ui/form/NumberField/hooks/useInputTypeNumber.d.ts +1 -1
- package/ui/form/NumberField/hooks/useInputTypeNumber.js +9 -13
- package/ui/form/index.d.ts +3 -1
- package/ui/form/index.js +5 -2
package/en.json
CHANGED
|
@@ -821,9 +821,86 @@
|
|
|
821
821
|
"Включает обработку вложенных данных из items": "Enables the processing of nested data from items",
|
|
822
822
|
"Callback вызываемый при нажатии на смену года или месяца в шапке Calendar": "",
|
|
823
823
|
"Пользовательский цвет для чекбокса": "",
|
|
824
|
-
"
|
|
825
|
-
"
|
|
824
|
+
"Кастомный домен": "",
|
|
825
|
+
"Куки для режима ssr": "",
|
|
826
|
+
"Ключ для хранения токена в куках": "",
|
|
827
|
+
"Url для http запросов": "",
|
|
828
|
+
"Срок хранения токена в хранилище в днях": "",
|
|
829
|
+
"Имя хранилища для токена (local, session, или cookie)": "",
|
|
830
|
+
"Ключ токена авторизации для локального хранилища": "",
|
|
831
|
+
"Запрос на обновление токена авторизации": "",
|
|
832
|
+
"Хендлер для авторизации": "",
|
|
833
|
+
"Функция, которая вызывается на закрытие соединения": "",
|
|
834
|
+
"Функция, которая вызывается на отправку сообщения": "",
|
|
835
|
+
"Функция, которая вызывается на открытие соединения": "",
|
|
836
|
+
"Массив streams": "",
|
|
837
|
+
"url для websocket": "",
|
|
826
838
|
"Колонки канбан доски": "",
|
|
827
839
|
"Идентификатор канбан доски": "",
|
|
828
|
-
"Обработчик события окончания перетаскивания карточки или колонки": ""
|
|
829
|
-
|
|
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
|
+
}
|
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
/// <reference types="react" />
|
|
2
|
+
import { IHttpComponentConfig } from 'src/components/HttpComponent';
|
|
3
|
+
import { IWebSocketComponentConfig } from 'src/components/WebSocketComponent';
|
|
4
|
+
import { ILocaleComponentConfig } from 'src/components/LocaleComponent';
|
|
5
|
+
import { IJwtHttpComponentConfig } from 'src/components/JwtHttpComponent';
|
|
6
|
+
import { IResourceComponentConfig } from 'src/components/ResourceComponent';
|
|
2
7
|
import { IThemeProviderProps } from '../providers/ThemeProvider';
|
|
3
|
-
import ClientStorageComponent from '../components/ClientStorageComponent';
|
|
8
|
+
import ClientStorageComponent, { IClientStorageComponentConfig } from '../components/ClientStorageComponent';
|
|
4
9
|
import HtmlComponent from '../components/HtmlComponent';
|
|
5
10
|
import StoreComponent from '../components/StoreComponent';
|
|
6
11
|
import UiComponent from '../components/UiComponent';
|
|
@@ -10,6 +15,10 @@ import { IRouteItem, IRouterProps } from '../ui/nav/Router/Router';
|
|
|
10
15
|
import MetricsComponent from '../components/MetricsComponent';
|
|
11
16
|
import { IScreenProviderProps } from '../providers/ScreenProvider';
|
|
12
17
|
import { IFetchConfig } from '../hooks/useFetch';
|
|
18
|
+
export interface IComponentConfig {
|
|
19
|
+
className?: Record<string, any>;
|
|
20
|
+
[key: string]: any;
|
|
21
|
+
}
|
|
13
22
|
/**
|
|
14
23
|
* Application HOC
|
|
15
24
|
* Обертка над корневым компонентом приложения, используется только в `Application.tsx`. Добавляет через React Context
|
|
@@ -17,11 +26,18 @@ import { IFetchConfig } from '../hooks/useFetch';
|
|
|
17
26
|
*/
|
|
18
27
|
export interface IApplicationHookConfig {
|
|
19
28
|
components?: {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
29
|
+
clientStorage?: IClientStorageComponentConfig & IComponentConfig;
|
|
30
|
+
html?: IComponentConfig;
|
|
31
|
+
http?: IHttpComponentConfig & IJwtHttpComponentConfig & IComponentConfig;
|
|
32
|
+
locale?: ILocaleComponentConfig & IComponentConfig;
|
|
33
|
+
store?: IComponentConfig;
|
|
34
|
+
ui?: IComponentConfig;
|
|
35
|
+
resource?: IResourceComponentConfig & IComponentConfig;
|
|
36
|
+
ws?: IWebSocketComponentConfig & IComponentConfig;
|
|
37
|
+
pushNotification?: IComponentConfig;
|
|
38
|
+
meta?: IComponentConfig;
|
|
39
|
+
[key: string]: IComponentConfig;
|
|
40
|
+
};
|
|
25
41
|
onInit?: (components: IComponents) => void;
|
|
26
42
|
useGlobal?: boolean;
|
|
27
43
|
reducers?: any;
|
|
@@ -3,6 +3,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
exports.__esModule = true;
|
|
6
|
+
/* eslint-disable max-len */
|
|
7
|
+
/* eslint-disable no-unneeded-ternary */
|
|
8
|
+
/* eslint-disable consistent-return */
|
|
6
9
|
/* eslint-disable no-return-assign */
|
|
7
10
|
/* eslint-disable no-unused-expressions */
|
|
8
11
|
var react_1 = __importDefault(require("react"));
|
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.94",
|
|
4
4
|
"description": "",
|
|
5
5
|
"author": "Vladimir Kozhin <hello@kozhindev.com>",
|
|
6
6
|
"repository": {
|
|
@@ -25,8 +25,8 @@
|
|
|
25
25
|
"watch": "tsc -p tsconfig-debug.json"
|
|
26
26
|
},
|
|
27
27
|
"dependencies": {
|
|
28
|
-
"@maskito/core": "
|
|
29
|
-
"@maskito/kit": "
|
|
28
|
+
"@maskito/core": "1.7.0",
|
|
29
|
+
"@maskito/kit": "1.7.0",
|
|
30
30
|
"@maskito/react": "^0.12.1",
|
|
31
31
|
"@splidejs/react-splide": "^0.7.12",
|
|
32
32
|
"axios": "^0.21.1",
|
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
2
|
import { PropsWithChildren } from 'react';
|
|
3
|
+
import { IHttpComponent } from 'src/components/HttpComponent';
|
|
4
|
+
import { IHtmlComponent } from 'src/components/HtmlComponent';
|
|
5
|
+
import { IWebSocketComponent } from 'src/components/WebSocketComponent';
|
|
6
|
+
import { IMetaComponent } from 'src/components/MetaComponent';
|
|
7
|
+
import { IStoreComponent } from 'src/components/StoreComponent';
|
|
3
8
|
import { IClientStorageComponent } from '../components/ClientStorageComponent';
|
|
4
9
|
import { ILocaleComponent } from '../components/LocaleComponent';
|
|
5
10
|
import { IUiApplicationComponent } from '../components/UiComponent';
|
|
@@ -11,15 +16,15 @@ declare global {
|
|
|
11
16
|
}
|
|
12
17
|
export interface IComponents {
|
|
13
18
|
clientStorage?: IClientStorageComponent;
|
|
14
|
-
html?:
|
|
15
|
-
http?:
|
|
19
|
+
html?: IHtmlComponent;
|
|
20
|
+
http?: IHttpComponent;
|
|
16
21
|
locale?: ILocaleComponent;
|
|
17
|
-
store?:
|
|
22
|
+
store?: IStoreComponent;
|
|
18
23
|
ui?: IUiApplicationComponent;
|
|
19
24
|
resource?: IResourceComponent;
|
|
20
|
-
ws?:
|
|
25
|
+
ws?: IWebSocketComponent;
|
|
21
26
|
pushNotification?: any;
|
|
22
|
-
meta?:
|
|
27
|
+
meta?: IMetaComponent;
|
|
23
28
|
[key: string]: any;
|
|
24
29
|
}
|
|
25
30
|
export interface IComponentsProviderProps extends PropsWithChildren<any> {
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { IModalProps } from '../../../ui/modal/Modal/Modal';
|
|
3
3
|
import CalendarEnum from './enums/CalendarType';
|
|
4
|
+
export type CalendarSystemModalFields = 'title' | 'eventGroupId' | 'date' | 'description';
|
|
5
|
+
export interface IEventInitialValues extends IEvent {
|
|
6
|
+
eventGroupId: string;
|
|
7
|
+
}
|
|
4
8
|
export interface IDay {
|
|
5
9
|
dayNumber: number;
|
|
6
10
|
date: Date;
|
|
@@ -14,21 +18,23 @@ export interface IPresentDateInfo {
|
|
|
14
18
|
dateToDisplay: string;
|
|
15
19
|
}
|
|
16
20
|
export interface IEvent {
|
|
21
|
+
id: number;
|
|
17
22
|
date: Date;
|
|
18
23
|
title: string;
|
|
19
24
|
color?: string;
|
|
25
|
+
description?: string;
|
|
20
26
|
[key: string]: any;
|
|
21
27
|
}
|
|
22
28
|
export interface IEventGroup {
|
|
23
29
|
id: number;
|
|
24
30
|
label: string;
|
|
25
31
|
color?: string;
|
|
26
|
-
events: IEvent[];
|
|
32
|
+
events: Omit<IEvent, 'color'>[];
|
|
27
33
|
}
|
|
28
34
|
export interface ICalendarSystemProps extends IUiComponent {
|
|
29
35
|
onCreateEvent?: () => void;
|
|
30
36
|
onChangeCalendarType?: (newType: string) => void;
|
|
31
|
-
|
|
37
|
+
calendarModalProps?: IModalProps;
|
|
32
38
|
eventBlock: {
|
|
33
39
|
title: string;
|
|
34
40
|
eventGroups: IEventGroup[];
|
|
@@ -47,10 +53,16 @@ export interface ICalendarSystemViewProps extends Omit<ICalendarSystemProps, 'ca
|
|
|
47
53
|
onChangeCalendarType: (newType: string) => void;
|
|
48
54
|
onMonthChange: (newDate: Date) => void;
|
|
49
55
|
applyControl: (event: React.MouseEvent<HTMLElement>) => void;
|
|
50
|
-
|
|
56
|
+
openCreateModal: VoidFunction;
|
|
57
|
+
openEditModal: (event: IEvent) => void;
|
|
51
58
|
getEventsFromDate: (dateFromDay: Date, isMonth: boolean) => IEvent[];
|
|
52
59
|
onChangeEventGroupsIds: (selectedIds: number[]) => void;
|
|
53
60
|
weekDays: string[];
|
|
54
61
|
}
|
|
55
|
-
export
|
|
62
|
+
export interface ICalendarSystemModalViewProps extends IModalProps {
|
|
63
|
+
eventGroups: IEventGroup[];
|
|
64
|
+
onEventSubmit: (fields: Record<CalendarSystemModalFields, string>, eventInitialValues?: IEventInitialValues) => void;
|
|
65
|
+
isCreate: boolean;
|
|
66
|
+
eventInitialValues?: any;
|
|
67
|
+
}
|
|
56
68
|
export default function CalendarSystem(props: ICalendarSystemProps): React.ReactElement<any, string | React.JSXElementConstructor<any>>;
|
|
@@ -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
|
+
/* eslint-disable no-return-assign */
|
|
17
18
|
/* eslint-disable default-case */
|
|
18
19
|
/* eslint-disable no-unused-expressions */
|
|
19
20
|
/* eslint-disable no-plusplus */
|
|
@@ -23,25 +24,24 @@ var concat_1 = __importDefault(require("lodash-es/concat"));
|
|
|
23
24
|
var slice_1 = __importDefault(require("lodash-es/slice"));
|
|
24
25
|
var localeData_1 = __importDefault(require("dayjs/plugin/localeData"));
|
|
25
26
|
var upperFirst_1 = __importDefault(require("lodash-es/upperFirst"));
|
|
26
|
-
var modal_1 = require("../../../actions/modal");
|
|
27
27
|
var useCalendarControls_1 = __importDefault(require("./hooks/useCalendarControls"));
|
|
28
28
|
var useDisplayDate_1 = __importDefault(require("./hooks/useDisplayDate"));
|
|
29
29
|
var useMonthCalendar_1 = __importDefault(require("./hooks/useMonthCalendar"));
|
|
30
30
|
var hooks_1 = require("../../../hooks");
|
|
31
31
|
var addEventIfMatchDate_1 = require("./helpers/addEventIfMatchDate");
|
|
32
32
|
var CalendarType_1 = __importDefault(require("./enums/CalendarType"));
|
|
33
|
+
var useCalendarSystemModals_1 = __importDefault(require("./hooks/useCalendarSystemModals"));
|
|
33
34
|
dayjs_1["default"].extend(localeData_1["default"]);
|
|
34
35
|
function CalendarSystem(props) {
|
|
35
|
-
var _a;
|
|
36
36
|
var components = (0, hooks_1.useComponents)();
|
|
37
|
-
var
|
|
38
|
-
var _b = react_1["default"].useState(
|
|
39
|
-
var _c =
|
|
40
|
-
var _d = (
|
|
41
|
-
var _e =
|
|
42
|
-
var _f = (0,
|
|
43
|
-
var _g = (0, hooks_1.useWeekCalendar)(currentMonthDate), currentWeekDays = _g.currentWeek, weekControls = _g.weekControls, forceUpdateWeekOnMonthChange = _g.forceUpdateWeekOnMonthChange;
|
|
37
|
+
var _a = react_1["default"].useState(props.eventBlock.eventGroups || []), innerEventGroups = _a[0], setInnerEventGroups = _a[1];
|
|
38
|
+
var _b = react_1["default"].useState([]), selectedEventGroupsIds = _b[0], setSelectedEventGroupsIds = _b[1];
|
|
39
|
+
var _c = (0, useDisplayDate_1["default"])(), dateToDisplay = _c.dateToDisplay, setNewDateToDisplay = _c.setNewDateToDisplay;
|
|
40
|
+
var _d = react_1["default"].useState(CalendarType_1["default"].MONTH), calendarType = _d[0], setCalendarType = _d[1];
|
|
41
|
+
var _e = (0, useMonthCalendar_1["default"])(), monthCalendarDays = _e.calendarArray, setCurrentMonthDate = _e.setCurrentMonthDate, currentMonthDate = _e.currentMonthDate;
|
|
42
|
+
var _f = (0, hooks_1.useWeekCalendar)(currentMonthDate), currentWeekDays = _f.currentWeek, weekControls = _f.weekControls, forceUpdateWeekOnMonthChange = _f.forceUpdateWeekOnMonthChange;
|
|
44
43
|
var applyControl = (0, useCalendarControls_1["default"])(calendarType, weekControls);
|
|
44
|
+
var _g = (0, useCalendarSystemModals_1["default"])(props.calendarModalProps, innerEventGroups, setInnerEventGroups), openCreateModal = _g.openCreateModal, openEditModal = _g.openEditModal;
|
|
45
45
|
var onChangeCalendarType = react_1["default"].useCallback(function (newType) {
|
|
46
46
|
setCalendarType(newType);
|
|
47
47
|
if (props.onChangeCalendarType) {
|
|
@@ -96,11 +96,6 @@ function CalendarSystem(props) {
|
|
|
96
96
|
}
|
|
97
97
|
return hoursArray;
|
|
98
98
|
}, []);
|
|
99
|
-
|
|
100
|
-
var createModalProps = react_1["default"].useMemo(function () { return (__assign(__assign({}, props.createEventModalProps), { component: createModalView })); }, [createModalView, props.createEventModalProps]);
|
|
101
|
-
var onClickCreate = react_1["default"].useCallback(function () {
|
|
102
|
-
dispatch((0, modal_1.openModal)(createModalView, createModalProps));
|
|
103
|
-
}, [createModalProps, createModalView, dispatch]);
|
|
104
|
-
return components.ui.renderView(props.view || 'content.CalendarSystemView', __assign(__assign({}, props), { dateToDisplay: dateToDisplay, monthCalendarDays: monthCalendarDays, calendarType: calendarType, currentWeekDays: currentWeekDays, createModalProps: createModalProps, eventGroups: innerEventGroups, eventGroupsTitle: props.eventBlock.title, allHours: allHours, selectedEventGroupsIds: selectedEventGroupsIds, onChangeCalendarType: onChangeCalendarType, onMonthChange: onMonthChange, applyControl: applyControl, onClickCreate: onClickCreate, getEventsFromDate: getEventsFromDate, onChangeEventGroupsIds: function (newSelectedEventGroupsIds) { return setSelectedEventGroupsIds(newSelectedEventGroupsIds); }, weekDays: weekDays }));
|
|
99
|
+
return components.ui.renderView(props.view || 'content.CalendarSystemView', __assign(__assign({}, props), { dateToDisplay: dateToDisplay, monthCalendarDays: monthCalendarDays, calendarType: calendarType, currentWeekDays: currentWeekDays, eventGroups: innerEventGroups, eventGroupsTitle: props.eventBlock.title, allHours: allHours, selectedEventGroupsIds: selectedEventGroupsIds, onChangeCalendarType: onChangeCalendarType, onMonthChange: onMonthChange, applyControl: applyControl, openCreateModal: openCreateModal, getEventsFromDate: getEventsFromDate, onChangeEventGroupsIds: function (newSelectedEventGroupsIds) { return setSelectedEventGroupsIds(newSelectedEventGroupsIds); }, openEditModal: openEditModal, weekDays: weekDays }));
|
|
105
100
|
}
|
|
106
101
|
exports["default"] = CalendarSystem;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { IModalProps } from '../../../modal/Modal/Modal';
|
|
3
|
+
import { ICalendarSystemModalViewProps, IEvent, IEventGroup } from '../CalendarSystem';
|
|
4
|
+
declare const useCalendarSystemModals: (calendarModalProps: IModalProps, innerEventGroups: IEventGroup[], setInnerEventGroups: React.Dispatch<React.SetStateAction<IEventGroup[]>>) => {
|
|
5
|
+
openCreateModal: () => void;
|
|
6
|
+
openEditModal: (event: IEvent) => void;
|
|
7
|
+
getEventFromGroup: (event: IEvent) => IEventGroup;
|
|
8
|
+
getModalProps: (isCreate: boolean, eventInitialValues?: IEvent & {
|
|
9
|
+
eventGroupId: number;
|
|
10
|
+
}) => ICalendarSystemModalViewProps;
|
|
11
|
+
};
|
|
12
|
+
export default useCalendarSystemModals;
|
|
@@ -0,0 +1,85 @@
|
|
|
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
|
+
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
14
|
+
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
15
|
+
if (ar || !(i in from)) {
|
|
16
|
+
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
17
|
+
ar[i] = from[i];
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return to.concat(ar || Array.prototype.slice.call(from));
|
|
21
|
+
};
|
|
22
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
23
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
24
|
+
};
|
|
25
|
+
exports.__esModule = true;
|
|
26
|
+
var react_1 = __importDefault(require("react"));
|
|
27
|
+
var react_redux_1 = require("react-redux");
|
|
28
|
+
var isEqual_1 = __importDefault(require("lodash-es/isEqual"));
|
|
29
|
+
var maxBy_1 = __importDefault(require("lodash-es/maxBy"));
|
|
30
|
+
var modal_1 = require("../../../../actions/modal");
|
|
31
|
+
var useComponents_1 = __importDefault(require("../../../../hooks/useComponents"));
|
|
32
|
+
var utils_1 = require("../utils/utils");
|
|
33
|
+
var DEFAULT_ID = 0;
|
|
34
|
+
var useCalendarSystemModals = function (calendarModalProps, innerEventGroups, setInnerEventGroups) {
|
|
35
|
+
var dispatch = (0, react_redux_1.useDispatch)();
|
|
36
|
+
var components = (0, useComponents_1["default"])();
|
|
37
|
+
var calendarModalView = (calendarModalProps === null || calendarModalProps === void 0 ? void 0 : calendarModalProps.component) || components.ui.getView('content.CalendarSystemModalView');
|
|
38
|
+
var onEventSubmit = react_1["default"].useCallback(function (fields, eventInitialValues) {
|
|
39
|
+
var _a;
|
|
40
|
+
var eventGroupId = fields.eventGroupId, date = fields.date, title = fields.title, description = fields.description;
|
|
41
|
+
var currentEventGroups = __spreadArray([], innerEventGroups, true);
|
|
42
|
+
if (eventInitialValues) {
|
|
43
|
+
// Удаляем событие из предыдущей группы
|
|
44
|
+
var previousGroupIndex = currentEventGroups.findIndex(function (group) { return group.id === Number(eventInitialValues.eventGroupId); });
|
|
45
|
+
var previousGroup = __assign({}, currentEventGroups[previousGroupIndex]);
|
|
46
|
+
previousGroup.events = previousGroup.events.filter(function (event) { return event.id !== eventInitialValues.id; });
|
|
47
|
+
currentEventGroups = __spreadArray(__spreadArray(__spreadArray([], currentEventGroups.slice(0, previousGroupIndex), true), [
|
|
48
|
+
previousGroup
|
|
49
|
+
], false), currentEventGroups.slice(previousGroupIndex + 1), true);
|
|
50
|
+
}
|
|
51
|
+
var changeableEventGroupIndex = currentEventGroups.findIndex(function (group) { return group.id === eventGroupId; });
|
|
52
|
+
var changeableEventGroup = __assign({}, currentEventGroups[changeableEventGroupIndex]);
|
|
53
|
+
var updatedEvent = {
|
|
54
|
+
id: (((_a = (0, maxBy_1["default"])(changeableEventGroup.events, function (event) { return event.id; })) === null || _a === void 0 ? void 0 : _a.id) || DEFAULT_ID) + 1,
|
|
55
|
+
date: new Date(date),
|
|
56
|
+
title: title,
|
|
57
|
+
description: description
|
|
58
|
+
};
|
|
59
|
+
changeableEventGroup.events.push(updatedEvent);
|
|
60
|
+
changeableEventGroup.events = (0, utils_1.sortEventsInGroup)(changeableEventGroup);
|
|
61
|
+
currentEventGroups = __spreadArray(__spreadArray(__spreadArray([], currentEventGroups.slice(0, changeableEventGroupIndex), true), [
|
|
62
|
+
changeableEventGroup
|
|
63
|
+
], false), currentEventGroups.slice(changeableEventGroupIndex + 1), true);
|
|
64
|
+
setInnerEventGroups(currentEventGroups);
|
|
65
|
+
}, [innerEventGroups, setInnerEventGroups]);
|
|
66
|
+
var getModalProps = react_1["default"].useCallback(function (isCreate, eventInitialValues) { return (__assign(__assign({}, calendarModalProps), { component: calendarModalView, eventGroups: innerEventGroups, onEventSubmit: onEventSubmit, isCreate: isCreate, eventInitialValues: eventInitialValues })); }, [calendarModalProps, calendarModalView, innerEventGroups, onEventSubmit]);
|
|
67
|
+
var getEventFromGroup = react_1["default"].useCallback(function (event) { return innerEventGroups
|
|
68
|
+
.find(function (group) { return group.events
|
|
69
|
+
.some(function (groupEvent) { return (0, isEqual_1["default"])((0, utils_1.getOmittedEvent)(groupEvent), (0, utils_1.getOmittedEvent)(event)); }); }); }, [innerEventGroups]);
|
|
70
|
+
var openCreateModal = react_1["default"].useCallback(function () {
|
|
71
|
+
dispatch((0, modal_1.openModal)(calendarModalView, getModalProps(true)));
|
|
72
|
+
}, [getModalProps, calendarModalView, dispatch]);
|
|
73
|
+
var openEditModal = react_1["default"].useCallback(function (event) {
|
|
74
|
+
var _a;
|
|
75
|
+
var eventGroupId = ((_a = getEventFromGroup(event)) === null || _a === void 0 ? void 0 : _a.id) || 0;
|
|
76
|
+
dispatch((0, modal_1.openModal)(calendarModalView, getModalProps(false, __assign(__assign({}, event), { eventGroupId: eventGroupId }))));
|
|
77
|
+
}, [getModalProps, calendarModalView, dispatch, getEventFromGroup]);
|
|
78
|
+
return {
|
|
79
|
+
openCreateModal: openCreateModal,
|
|
80
|
+
openEditModal: openEditModal,
|
|
81
|
+
getEventFromGroup: getEventFromGroup,
|
|
82
|
+
getModalProps: getModalProps
|
|
83
|
+
};
|
|
84
|
+
};
|
|
85
|
+
exports["default"] = useCalendarSystemModals;
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
-
import { IDay } from '../CalendarSystem';
|
|
1
|
+
import { IDay, IEvent, IEventGroup } from '../CalendarSystem';
|
|
2
2
|
export declare const getWeekDaysFromDate: (date: Date) => IDay[];
|
|
3
3
|
export declare const isDateIsToday: (date: Date) => boolean;
|
|
4
|
+
export declare const getOmittedEvent: (event: IEvent | Omit<IEvent, 'color'>) => any;
|
|
5
|
+
export declare const sortEventsInGroup: (group: IEventGroup) => Omit<IEvent, "color">[];
|
|
@@ -3,9 +3,10 @@ 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.isDateIsToday = exports.getWeekDaysFromDate = void 0;
|
|
6
|
+
exports.sortEventsInGroup = exports.getOmittedEvent = exports.isDateIsToday = exports.getWeekDaysFromDate = void 0;
|
|
7
7
|
/* eslint-disable no-plusplus */
|
|
8
8
|
var dayjs_1 = __importDefault(require("dayjs"));
|
|
9
|
+
var omit_1 = __importDefault(require("lodash-es/omit"));
|
|
9
10
|
var SIX_DAYS_DIFF = 6;
|
|
10
11
|
var MAX_DAYS_DIFF_IN_WEEK = 7;
|
|
11
12
|
var getWeekDaysFromDate = function (date) {
|
|
@@ -27,3 +28,7 @@ var getWeekDaysFromDate = function (date) {
|
|
|
27
28
|
exports.getWeekDaysFromDate = getWeekDaysFromDate;
|
|
28
29
|
var isDateIsToday = function (date) { return (0, dayjs_1["default"])(date).isToday(); };
|
|
29
30
|
exports.isDateIsToday = isDateIsToday;
|
|
31
|
+
var getOmittedEvent = function (event) { return (0, omit_1["default"])(event, ['color', 'eventGroupId']); };
|
|
32
|
+
exports.getOmittedEvent = getOmittedEvent;
|
|
33
|
+
var sortEventsInGroup = function (group) { return group.events.sort(function (eventA, eventB) { return eventA.date.getTime() - eventB.date.getTime(); }); };
|
|
34
|
+
exports.sortEventsInGroup = sortEventsInGroup;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { IBaseFieldProps } from '../InputField/InputField';
|
|
2
|
+
import { IFieldWrapperInputProps } from '../Field/fieldWrapper';
|
|
3
|
+
export interface IEmailFieldProps extends IBaseFieldProps, IFieldWrapperInputProps {
|
|
4
|
+
}
|
|
5
|
+
declare const _default: import("../Field/fieldWrapper").FieldWrapperComponent<IEmailFieldProps>;
|
|
6
|
+
export default _default;
|
|
@@ -0,0 +1,44 @@
|
|
|
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
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
14
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
15
|
+
};
|
|
16
|
+
exports.__esModule = true;
|
|
17
|
+
/* eslint-disable max-len */
|
|
18
|
+
var react_1 = __importDefault(require("react"));
|
|
19
|
+
var hooks_1 = require("../../../hooks");
|
|
20
|
+
var fieldWrapper_1 = __importDefault(require("../Field/fieldWrapper"));
|
|
21
|
+
var useInputTypeEmail_1 = __importDefault(require("./hooks/useInputTypeEmail"));
|
|
22
|
+
/**
|
|
23
|
+
* EmailField
|
|
24
|
+
* Поле для ввода почты
|
|
25
|
+
*/
|
|
26
|
+
function EmailField(props) {
|
|
27
|
+
var components = (0, hooks_1.useComponents)();
|
|
28
|
+
var _a = (0, hooks_1.useSaveCursorPosition)(props.input), currentInputRef = _a.inputRef, onChange = _a.onChange;
|
|
29
|
+
var onInputChange = (0, useInputTypeEmail_1["default"])(currentInputRef, onChange, props.input.value).onInputChange;
|
|
30
|
+
var onClear = react_1["default"].useCallback(function () { return props.input.onChange(''); }, [props.input]);
|
|
31
|
+
var inputProps = react_1["default"].useMemo(function () {
|
|
32
|
+
var _a;
|
|
33
|
+
return (__assign({ name: props.input.name, value: (_a = props.input.value) !== null && _a !== void 0 ? _a : '', onChange: onInputChange, type: 'text', placeholder: props.placeholder, disabled: props.disabled, required: props.required }, props.inputProps));
|
|
34
|
+
}, [onInputChange, props.disabled, props.input.name, props.input.value, props.inputProps, props.placeholder, props.required]);
|
|
35
|
+
return components.ui.renderView(props.view || 'form.InputFieldView', __assign(__assign({}, props), { inputProps: inputProps, inputRef: currentInputRef, onClear: onClear }));
|
|
36
|
+
}
|
|
37
|
+
EmailField.defaultProps = {
|
|
38
|
+
size: 'md',
|
|
39
|
+
disabled: false,
|
|
40
|
+
required: false,
|
|
41
|
+
showClear: false,
|
|
42
|
+
maskOptions: null
|
|
43
|
+
};
|
|
44
|
+
exports["default"] = (0, fieldWrapper_1["default"])('EmailField', EmailField);
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
declare const useInputTypeEmail: (currentInputRef: React.MutableRefObject<HTMLInputElement>, onChange: (event: React.ChangeEvent<HTMLInputElement>, value?: any) => void, currentValue: string | null | undefined) => {
|
|
3
|
+
onInputChange: (event: React.ChangeEvent<HTMLInputElement>) => void;
|
|
4
|
+
};
|
|
5
|
+
export default useInputTypeEmail;
|
|
@@ -0,0 +1,31 @@
|
|
|
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
|
+
/* eslint-disable max-len */
|
|
7
|
+
/* eslint-disable no-unused-expressions */
|
|
8
|
+
var react_1 = __importDefault(require("react"));
|
|
9
|
+
var DEFAULT_VALIDITY = __('Неправильный формат адреса электронной почты.');
|
|
10
|
+
var useInputTypeEmail = function (currentInputRef, onChange, currentValue) {
|
|
11
|
+
var isValueEmail = function (value) {
|
|
12
|
+
//In that case it's testing if value is empty string or not defined
|
|
13
|
+
if (!value) {
|
|
14
|
+
return false;
|
|
15
|
+
}
|
|
16
|
+
var emailRegexp = /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|.(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
|
|
17
|
+
return emailRegexp.test(value.toLowerCase());
|
|
18
|
+
};
|
|
19
|
+
var errorMessage = isValueEmail(currentValue) ? '' : DEFAULT_VALIDITY;
|
|
20
|
+
react_1["default"].useEffect(function () {
|
|
21
|
+
var _a;
|
|
22
|
+
(_a = currentInputRef.current) === null || _a === void 0 ? void 0 : _a.setCustomValidity(errorMessage);
|
|
23
|
+
}, [currentInputRef, currentValue, errorMessage]);
|
|
24
|
+
var onInputChange = function (event) {
|
|
25
|
+
onChange(event);
|
|
26
|
+
};
|
|
27
|
+
return {
|
|
28
|
+
onInputChange: onInputChange
|
|
29
|
+
};
|
|
30
|
+
};
|
|
31
|
+
exports["default"] = useInputTypeEmail;
|
|
@@ -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 EmailField_1 = __importDefault(require("./EmailField"));
|
|
7
|
+
exports["default"] = EmailField_1["default"];
|
package/ui/form/Field/Field.js
CHANGED
|
@@ -50,7 +50,8 @@ function Field(props) {
|
|
|
50
50
|
var fieldModel = (0, react_1.useMemo)(function () {
|
|
51
51
|
var _a;
|
|
52
52
|
var model = props.model || context.model;
|
|
53
|
-
var
|
|
53
|
+
var modelAttributes = (((_a = components.meta.getModel(model)) === null || _a === void 0 ? void 0 : _a.attributes) || []);
|
|
54
|
+
var result = modelAttributes
|
|
54
55
|
.find(function (field) { return field.attribute === props.attribute; });
|
|
55
56
|
return result || {};
|
|
56
57
|
}, [components, props.model, context.model, props.attribute]);
|
|
@@ -3,7 +3,7 @@ import { InputHTMLAttributes, ReactNode } from 'react';
|
|
|
3
3
|
import { MaskitoOptions } from '@maskito/core';
|
|
4
4
|
import { IFieldWrapperInputProps, IFieldWrapperOutputProps } from '../Field/fieldWrapper';
|
|
5
5
|
export declare const MASK_PRESETS: {
|
|
6
|
-
date: MaskitoOptions
|
|
6
|
+
date: Required<MaskitoOptions>;
|
|
7
7
|
phone: {
|
|
8
8
|
mask: any[];
|
|
9
9
|
};
|
|
@@ -11,7 +11,7 @@ export declare const MASK_PRESETS: {
|
|
|
11
11
|
mask: any[];
|
|
12
12
|
};
|
|
13
13
|
};
|
|
14
|
-
type IElementInputType = 'button' | 'checkbox' | 'color' | 'date' | 'datetime-local' | 'email' | 'file' | 'hidden' | 'image' | 'month' | 'number' | 'password' | 'radio' | 'range' | 'reset' | 'search' | 'submit' | 'tel' | 'text' | 'time' | 'url' | 'week' | string;
|
|
14
|
+
export type IElementInputType = 'button' | 'checkbox' | 'color' | 'date' | 'datetime-local' | 'email' | 'file' | 'hidden' | 'image' | 'month' | 'number' | 'password' | 'radio' | 'range' | 'reset' | 'search' | 'submit' | 'tel' | 'text' | 'time' | 'url' | 'week' | string;
|
|
15
15
|
export interface IBaseFieldProps extends IFieldWrapperInputProps, IUiComponent {
|
|
16
16
|
/**
|
|
17
17
|
* Свойства для элемента input
|
|
@@ -47,12 +47,15 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
47
47
|
};
|
|
48
48
|
exports.__esModule = true;
|
|
49
49
|
exports.MASK_PRESETS = void 0;
|
|
50
|
+
/* eslint-disable no-unused-expressions */
|
|
51
|
+
/* eslint-disable max-len */
|
|
50
52
|
var React = __importStar(require("react"));
|
|
51
53
|
var react_1 = require("react");
|
|
52
54
|
var react_2 = require("@maskito/react");
|
|
53
55
|
var kit_1 = require("@maskito/kit");
|
|
54
56
|
var fieldWrapper_1 = __importDefault(require("../Field/fieldWrapper"));
|
|
55
57
|
var hooks_1 = require("../../../hooks");
|
|
58
|
+
var useInputFieldWarningByType_1 = require("./hooks/useInputFieldWarningByType");
|
|
56
59
|
exports.MASK_PRESETS = {
|
|
57
60
|
date: (0, kit_1.maskitoDateOptionsGenerator)({
|
|
58
61
|
mode: 'dd/mm/yyyy'
|
|
@@ -93,6 +96,7 @@ function InputField(props) {
|
|
|
93
96
|
maskedInputRef(inputRef.current);
|
|
94
97
|
}
|
|
95
98
|
}, [inputRef, maskedInputRef]);
|
|
99
|
+
(0, useInputFieldWarningByType_1.useInputFieldWarningByType)(props.type);
|
|
96
100
|
var onClear = React.useCallback(function () { return props.input.onChange(''); }, [props.input]);
|
|
97
101
|
var inputProps = (0, react_1.useMemo)(function () {
|
|
98
102
|
var _a;
|
|
@@ -102,7 +106,9 @@ function InputField(props) {
|
|
|
102
106
|
if (props.type === 'hidden') {
|
|
103
107
|
return null;
|
|
104
108
|
}
|
|
105
|
-
return components.ui.renderView(props.view || 'form.InputFieldView', __assign(__assign(__assign({}, props), props.viewProps), { inputProps: inputProps,
|
|
109
|
+
return components.ui.renderView(props.view || 'form.InputFieldView', __assign(__assign(__assign({}, props), props.viewProps), { inputProps: inputProps,
|
|
110
|
+
// If type was recognized as unsupported in InputField, then we do not pass ref.
|
|
111
|
+
inputRef: useInputFieldWarningByType_1.INPUT_TYPES_SUPPORTED_SELECTION.includes(props.type) ? inputRef : null, onClear: onClear }));
|
|
106
112
|
}
|
|
107
113
|
InputField.defaultProps = {
|
|
108
114
|
type: 'text',
|