@sberbusiness/triplex-next-mcp-server 1.50.0-beta → 1.53.1
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/README.md +1 -0
- package/bundle/components/AlertProcess.md +6 -3
- package/bundle/components/AlertProcessSpoiler.md +216 -0
- package/bundle/components/Badge.md +4 -3
- package/bundle/components/ButtonDropdown.md +5 -3
- package/bundle/components/Carousel.md +671 -0
- package/bundle/components/CarouselExtended.md +7 -5
- package/bundle/components/CarouselIndicators.md +666 -0
- package/bundle/components/CarouselItem.md +579 -0
- package/bundle/components/CarouselNextButton.md +633 -0
- package/bundle/components/CarouselPrevButton.md +633 -0
- package/bundle/components/CarouselViewport.md +631 -0
- package/bundle/components/CheckboxTreeExtended.md +21 -7
- package/bundle/components/CheckboxTreeExtendedCheckbox.md +591 -0
- package/bundle/components/CheckboxTreeExtendedNode.md +577 -0
- package/bundle/components/Chip.md +1 -0
- package/bundle/components/ChipDatePicker.md +332 -0
- package/bundle/components/ChipDatePickerTarget.md +316 -0
- package/bundle/components/ChipMonthYearPicker.md +4 -3
- package/bundle/components/ChipMonthYearPickerTarget.md +318 -0
- package/bundle/components/ChipMultiselect.md +63 -73
- package/bundle/components/ChipSelect.md +385 -0
- package/bundle/components/ChipSelectTarget.md +388 -0
- package/bundle/components/ChipSuggest.md +10 -16
- package/bundle/components/ChipSuggestTarget.md +506 -0
- package/bundle/components/CollapsibleTree.md +2 -1
- package/bundle/components/CollapsibleTreeExtended.md +2 -1
- package/bundle/components/DateField.md +4 -2
- package/bundle/components/DatePickerExtended.md +16 -14
- package/bundle/components/DateRange.md +17 -10
- package/bundle/components/Dropdown.md +36 -63
- package/bundle/components/EmptyView.md +9 -4
- package/bundle/components/ExpandAnimation.md +9 -5
- package/bundle/components/FormField.md +1 -1
- package/bundle/components/ImageGallery.md +19 -52
- package/bundle/components/ImageGalleryExtended.md +123 -139
- package/bundle/components/ListItemControlsButtonDropdown.md +3 -2
- package/bundle/components/LoaderSmall.md +5 -4
- package/bundle/components/MonthYearRange.md +334 -0
- package/bundle/components/MultiselectField.md +81 -143
- package/bundle/components/Notification.md +2 -1
- package/bundle/components/NotificationGrouped.md +174 -0
- package/bundle/components/NumberField.md +259 -116
- package/bundle/components/OrderedList.md +149 -112
- package/bundle/components/Overlay.md +3 -2
- package/bundle/components/PageIndicators.md +306 -0
- package/bundle/components/Pagination.md +81 -3
- package/bundle/components/PaginationExtended.md +160 -0
- package/bundle/components/Portal.md +5 -2
- package/bundle/components/Puller.md +375 -0
- package/bundle/components/SMSField.md +277 -102
- package/bundle/components/SelectExtendedField.md +11 -7
- package/bundle/components/SelectField.md +7 -4
- package/bundle/components/SmartSpot.md +259 -0
- package/bundle/components/Step.md +2 -1
- package/bundle/components/Stepper.md +7 -7
- package/bundle/components/Suggest.md +7 -6
- package/bundle/components/SuggestField.md +8 -6
- package/bundle/components/TableBasic.md +12 -14
- package/bundle/components/Tooltip.md +9 -8
- package/bundle/guides/commits.md +4 -1
- package/bundle/guides/context.md +5 -5
- package/bundle/guides/stories.md +29 -21
- package/bundle/manifest.json +145 -13
- package/bundle/release-notes/1.50.0.mdx +4 -0
- package/bundle/release-notes/1.51.0.mdx +57 -0
- package/bundle/release-notes/1.52.0.mdx +55 -0
- package/bundle/release-notes/1.53.0.mdx +60 -0
- package/bundle/release-notes/1.54.0.mdx +45 -0
- package/bundle/release-notes/1.55.0.mdx +7 -0
- package/bundle/tokens.json +377 -222
- package/dist/index.js +39 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -96,9 +96,9 @@ Loader: `Element_Background_Brand` использует также `LoaderMiddle
|
|
|
96
96
|
- **`displayName = "LoaderSmall"`** — используется в React DevTools.
|
|
97
97
|
- **Значения `ELoaderSmallTheme`** (`brand` / `neutral`) и наличие `ELoaderSmallSize` в barrel —
|
|
98
98
|
часть публичного API, удаление или переименование — breaking change.
|
|
99
|
-
- **`ILoaderSmallProps` — не только props этого компонента.** `
|
|
100
|
-
него свой публичный интерфейс: `
|
|
101
|
-
"theme" | "size">` (`src/components/
|
|
99
|
+
- **`ILoaderSmallProps` — не только props этого компонента.** `PullerLoader` строит из
|
|
100
|
+
него свой публичный интерфейс: `IPullerLoaderProps extends Omit<ILoaderSmallProps,
|
|
101
|
+
"theme" | "size">` (`src/components/Puller/PullerLoader.tsx:8`). Любое
|
|
102
102
|
изменение формы `ILoaderSmallProps` автоматически меняет публичный API и этого компонента.
|
|
103
103
|
- **Токены `Loader-*` общие для семейства** — переименование ломает темизацию у потребителей
|
|
104
104
|
и затрагивает `LoaderMiddle`.
|
|
@@ -135,7 +135,7 @@ Loader: `Element_Background_Brand` использует также `LoaderMiddle
|
|
|
135
135
|
вида `queryByRole("status")` → `null`.
|
|
136
136
|
Тему выбирает по теме кнопки (`SECONDARY` / `SECONDARY_LIGHT` → `BRAND`,
|
|
137
137
|
остальные → `NEUTRAL`), размер — по размеру кнопки.
|
|
138
|
-
- `Dropdown` (`DropdownList
|
|
138
|
+
- `Dropdown` (`DropdownList`), `Puller` (`PullerList`, `PullerLoader`), `SuggestField`,
|
|
139
139
|
`ChipSuggest`, `SelectExtendedField`, `ListItemLoading` — показывают `LoaderSmall` с темой
|
|
140
140
|
`BRAND` во время подгрузки данных. В `related` не входят: это контракт по рендеру, ссылка
|
|
141
141
|
стоит с их стороны. `Button` — исключение «потребитель, опирающийся на хрупкую деталь»
|
|
@@ -172,6 +172,7 @@ Loader: `Element_Background_Brand` использует также `LoaderMiddle
|
|
|
172
172
|
|---|---|
|
|
173
173
|
| 2026-08-06 | Создан документ. AI-рефакторинг: JSDoc на компоненте, props и значениях `ELoaderSmallTheme`, документирован неиспользуемый `ELoaderSmallSize`, порядок импортов приведён к codestyle, константы-маппинги переименованы в `THEME_TO_CLASS_NAME_MAP` / `SIZE_TO_CLASS_NAME_MAP`, в стилях объединено дублирующееся объявление анимации точек — сама анимация задана один раз на `.dot`, а у `.dot1` / `.dot2` / `.dot3` осталась только `animation-delay` (правило `.dot1` с нулевой задержкой обязательно: без него класс исчезнет из CSS-модуля и из разметки), unit-тесты расширены с 3 до 6 кейсов. В stories `controls: { disable: true }` перенесён на верхний уровень `parameters` — внутри `docs` он не применялся. Публичный API, DOM и визуальное поведение не изменены. |
|
|
174
174
|
| 2026-09-29 | Аудит симметрии `related` (TRI-156): из `related` убраны имена без строки в `docs/ai/ROADMAP.md` (`ListItemLoading`); из `related` убраны потребители `Dropdown`, `SuggestField`, `SelectExtendedField` — ссылка на контракт по рендеру стоит с их стороны; `Button` оставлен как исключение «потребитель, опирающийся на хрупкую деталь». Пояснения к убранным именам сохранены прозой в «Связанные компоненты»; публичный API и поведение не затронуты. |
|
|
175
|
+
| 2026-10-21 | Переход на `Puller` (TRIPLEX-961): `IDropownMobileLoaderProps` переименован в `IPullerLoaderProps` и перенесён в `src/components/Puller/PullerLoader.tsx`. |
|
|
175
176
|
|
|
176
177
|
---
|
|
177
178
|
|
|
@@ -0,0 +1,334 @@
|
|
|
1
|
+
---
|
|
2
|
+
component: MonthYearRange
|
|
3
|
+
category: Date components
|
|
4
|
+
related: [DateRange]
|
|
5
|
+
tokens: []
|
|
6
|
+
stories: stories/MonthYearRange/MonthYearRange.stories.tsx
|
|
7
|
+
version: "1.0"
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# MonthYearRange
|
|
11
|
+
|
|
12
|
+
## Назначение
|
|
13
|
+
|
|
14
|
+
Управляемый диапазон месяцев с двумя полями «от» / «до» и кнопками сдвига обеих границ назад и вперёд. Поля и кнопки предоставляет потребитель через render-props; компонент задаёт раскладку, согласует выбранные границы и выполняет арифметику дат.
|
|
15
|
+
|
|
16
|
+
Используй когда: нужно выбрать период с точностью до месяца и перелистывать его на месяц, квартал или год.
|
|
17
|
+
|
|
18
|
+
Не используй когда: нужен диапазон полных дат с выбором дня — `DateRange`; нужен один месяц — `MonthYearField` или `ChipMonthYearPicker`; нужна только сетка календаря — `Calendar`.
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## Варианты и props
|
|
23
|
+
|
|
24
|
+
`IMonthYearRangeProps` наследует HTML-атрибуты `div` без `defaultValue` и стандартного `onChange`. Состояние диапазона хранит потребитель: компонент вызывает `onChange`, а новые значения получает через `value`.
|
|
25
|
+
|
|
26
|
+
### Обязательные props
|
|
27
|
+
|
|
28
|
+
| Prop | Тип | Описание |
|
|
29
|
+
|---|---|---|
|
|
30
|
+
| `value` | `TMonthYearRangeValue` | Кортеж `[start, end]` в формате `format` (по умолчанию `YYYYMMDD`). Пустая строка означает невыбранную границу. |
|
|
31
|
+
| `onChange` | Callback | Получает обе границы при изменении любого поля или сдвиге диапазона. |
|
|
32
|
+
| `renderPickerFrom` | Render-prop | Поле выбора месяца «от». |
|
|
33
|
+
| `renderPickerTo` | Render-prop | Поле выбора месяца «до». |
|
|
34
|
+
| `renderButtonBack` | Render-prop | Кнопка сдвига назад. Обязателен по типу даже при `hideNavigation`. |
|
|
35
|
+
| `renderButtonForward` | Render-prop | Кнопка сдвига вперёд. Обязателен по типу даже при `hideNavigation`. |
|
|
36
|
+
|
|
37
|
+
### Опциональные props
|
|
38
|
+
|
|
39
|
+
| Prop | По умолчанию | Описание |
|
|
40
|
+
|---|---|---|
|
|
41
|
+
| `format` | `dateFormatYYYYMMDD` | Формат дат moment в `value` и в `onChange` пикеров. Передаётся пикерам в render-props вместе с `value` и `onChange`. |
|
|
42
|
+
| `shiftAmount` | `1` | Величина сдвига обеих границ в единицах `shiftUnit`. |
|
|
43
|
+
| `shiftUnit` | `EMonthYearRangeShiftUnit.MONTH` | `MONTH`, `QUARTER` или `YEAR`: значения enum — строки `month`, `quarter`, `year` для Moment. |
|
|
44
|
+
| `hideNavigation` | `false` | Скрывает обе кнопки: их render-props не вызываются. |
|
|
45
|
+
| `className` | — | Дополнительный класс корневого контейнера, объединяется с внутренним через `clsx`. |
|
|
46
|
+
|
|
47
|
+
### Значение и согласование границ
|
|
48
|
+
|
|
49
|
+
Формат дат задаёт `format`, по умолчанию — `dateFormatYYYYMMDD` из `src/consts/DateConst.ts`. Хотя поля выбирают месяц, компонент хранит полную дату и не приводит день к первому числу месяца. Допускается неполный диапазон: `["", end]`, `[start, ""]` или `["", ""]`.
|
|
50
|
+
|
|
51
|
+
Обработчики полей сравнивают даты хронологически через `isDateAfter` из `src/components/DateRange/utils.ts`: обе строго парсятся `moment(value, format, true)`, сравнение строк не используется.
|
|
52
|
+
|
|
53
|
+
- новая граница «от» больше непустой «до» → `onChange([date, ""])`;
|
|
54
|
+
- новая граница «до» меньше непустой «от» → `onChange(["", date])`;
|
|
55
|
+
- равные границы сохраняются; если новая или противоположная граница пустая, порядок не проверяется.
|
|
56
|
+
|
|
57
|
+
Если хотя бы одна из сравниваемых дат невалидна в `format`, порядок считается корректным и значение записывается как есть: компонент не валидирует строку пикера в обработчике поля. Потребитель отвечает за формат и исходный порядок `value`.
|
|
58
|
+
|
|
59
|
+
### Что получают render-props
|
|
60
|
+
|
|
61
|
+
| Поле | Кому передаётся | Контракт |
|
|
62
|
+
|---|---|---|
|
|
63
|
+
| `value` | Пикерам | Соответствующая строка `start` или `end`. |
|
|
64
|
+
| `format` | Пикерам | Значение `format` компонента. При spread в `MonthYearField` задаёт полю тот же формат. |
|
|
65
|
+
| `onChange` | Пикерам | Принимает новую строку и согласует границы по правилам выше. |
|
|
66
|
+
| `children` | Кнопкам | Иконка направления: `CaretleftStrokeSrvIcon20` / `CaretrightStrokeSrvIcon20` с `paletteIndex={5}`. |
|
|
67
|
+
| `className` | Кнопкам | Класс `monthYearRangeButton` из LESS-модуля; отдельный класс `disabled` не добавляется. |
|
|
68
|
+
| `disabled` | Кнопкам | `true`, если хотя бы одна граница пустая. Применить его к DOM-кнопке обязан потребитель. |
|
|
69
|
+
| `onClick` | Кнопкам | Обработчик сдвига; при неполном или невалидном диапазоне не вызывает `onChange`. |
|
|
70
|
+
|
|
71
|
+
В примерах объект пикера целиком передаётся в `MonthYearField`, объект кнопки — в `ButtonIcon`. Собственных props `size`, `status` или `limitRange` у диапазона нет: их настраивают на полях. `format` задаётся на MonthYearRange и приходит в объект пикера. Не задавай `format` полю отдельно: если он стоит в JSX до spread, его перезапишет формат диапазона; если после — формат поля и диапазона разойдутся.
|
|
72
|
+
|
|
73
|
+
### Сдвиг диапазона
|
|
74
|
+
|
|
75
|
+
- Сдвиг (`shiftDateRange` из `src/components/DateRange/utils.ts`, общий с `DateRange`) строго парсит обе границы через `moment(value, format, true)`. Если хотя бы одна невалидна, функция возвращает `null` и `onChange` не вызывается.
|
|
76
|
+
- Кнопка назад сдвигает границы на `-shiftAmount`, вперёд — на `shiftAmount` через `Moment.add`. Обе границы сдвигаются независимо на одну величину; день сохраняется или сокращается до последнего дня целевого месяца. Например, `20240331` минус месяц → `20240229`, `20240229` плюс год → `20250228`.
|
|
77
|
+
- `shiftAmount` передаётся в Moment без проверки: рассчитан на целые положительные значения, отрицательное меняет направление кнопок.
|
|
78
|
+
- Сдвиг не исправляет порядок входного кортежа и не проверяет ограничения календаря `limitRange`. Потребитель согласует их с полями самостоятельно.
|
|
79
|
+
- Результат сериализуется обратно в `format`. Сдвиг на месяц, квартал или год может изменить длину диапазона в днях.
|
|
80
|
+
|
|
81
|
+
### Корневой элемент
|
|
82
|
+
|
|
83
|
+
`ref` указывает на корневой `div`. Остальные HTML-атрибуты (`id`, `data-*`, `aria-*`, `style`, обработчики событий) передаются на этот же элемент. `children` допускается унаследованным типом, но содержимое контейнера задаётся render-props и иконкой-разделителем.
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
## Дизайн-токены
|
|
88
|
+
|
|
89
|
+
Собственных дизайн-токенов нет: `styles/MonthYearRange.module.less` задаёт только flex-раскладку, `z-index` кнопок и размер разделителя 16 × 16 px. Цвета иконок задаются `paletteIndex={5}`.
|
|
90
|
+
|
|
91
|
+
Внешний вид полей и кнопок зависит от компонентов, возвращённых из render-props. Их токены переопределяются через `ThemeProvider`; см. `MonthYearField-ai.md`, `ButtonIcon-ai.md` и `ThemeProvider-ai.md`.
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
## Инварианты
|
|
96
|
+
|
|
97
|
+
- `forwardRef` обязателен; корневой DOM-элемент и ref-target — `HTMLDivElement`.
|
|
98
|
+
- Публичные имена `MonthYearRange`, `IMonthYearRangeProps`, `IMonthYearRangeButtonProvideProps`, `IMonthYearRangePickerProvideProps`, `TMonthYearRangeValue` и `EMonthYearRangeShiftUnit` экспортируются через `src/components/MonthYearRange/index.ts`; интерфейсы и `TMonthYearRangeValue` живут в `types.ts`, компонент — в `MonthYearRange.tsx`, enum — в `enums.ts`. Имена, типы и enum-значения нельзя менять без согласования. Собственного `utils.ts` нет: сравнение и сдвиг импортируются из `DateRange/utils.ts`, поэтому значения `EMonthYearRangeShiftUnit` должны оставаться строковыми единицами `moment`.
|
|
99
|
+
- Формат по умолчанию `YYYYMMDD` и пустая строка как невыбранная граница — часть контракта. `value` и аргумент `onChange` пикера должны быть в формате `format`.
|
|
100
|
+
- `disabled` кнопок зависит только от пустых границ; невалидные даты блокирует сам обработчик сдвига.
|
|
101
|
+
- Порядок содержимого: кнопка назад → поле «от» → иконка-разделитель → поле «до» → кнопка вперёд. `hideNavigation` исключает вызовы обоих render-props кнопок.
|
|
102
|
+
- `displayName` — `"MonthYearRange"`; React 17-совместимость сохраняется, React 18-only API не добавлять.
|
|
103
|
+
- Story IDs `components-date-components-monthyearrange--*` связаны с baseline `__screenshots__/date-components-monthyearrange--{story}--{xs|xl}.png`: test-runner удаляет префикс `components-` из имени файла. Не переименовывать stories без обновления скриншот-тестов.
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
|
|
107
|
+
## Accessibility
|
|
108
|
+
|
|
109
|
+
- Корневой `div` — контейнер без собственной роли, фокус-менеджмента или клавиатурной навигации. Переданные `aria-*` относятся к нему.
|
|
110
|
+
- Доступные имена полей «от» / «до» и кнопок с иконками задаёт потребитель. В `renderButtonBack` / `renderButtonForward` следует передать локализованные `aria-label` или `title`; компонент текста не добавляет.
|
|
111
|
+
- Переданный render-prop `disabled` нужно применить к нативной кнопке. Даже если потребитель его проигнорирует, обработчик дополнительно блокирует сдвиг неполного диапазона.
|
|
112
|
+
- Поведение полей, календаря, сообщения об ошибке и порядок табуляции определяются возвращёнными компонентами. Собственного `aria-live` и автоматического объявления изменённого диапазона нет.
|
|
113
|
+
|
|
114
|
+
---
|
|
115
|
+
|
|
116
|
+
## Связанные компоненты
|
|
117
|
+
|
|
118
|
+
- `DateRange` — альтернатива для диапазона полных дат. Имеет похожий render-prop API и дополнительные единицы сдвига `DAY` / `WEEK`; валидность дат перед сдвигом проверяет так же.
|
|
119
|
+
- `MonthYearField` — поле выбора одного месяца, используемое в примерах для обеих границ. Компонент диапазона не импортирует его напрямую.
|
|
120
|
+
- `ButtonIcon` — кнопка для переданных иконки, класса, `disabled` и `onClick` в примерах; доступное имя добавляет потребитель.
|
|
121
|
+
|
|
122
|
+
В `related` включён `DateRange` как альтернатива. Поля и кнопки выбирает потребитель, прямой зависимости по рендеру или наследования их интерфейсов в MonthYearRange нет.
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
## Stories
|
|
127
|
+
|
|
128
|
+
Основные истории: `stories/MonthYearRange/MonthYearRange.stories.tsx`
|
|
129
|
+
Файлы примеров: `stories/MonthYearRange/examples/`
|
|
130
|
+
|
|
131
|
+
| Story | Example file | Что демонстрирует |
|
|
132
|
+
|---|---|---|
|
|
133
|
+
| `Playground` | `Playground.tsx` | Интерактивное управление `shiftAmount`, `shiftUnit` и `hideNavigation`. |
|
|
134
|
+
| `Default` | `Default.tsx` | Два пустых `MonthYearField`, неактивные кнопки и сдвиг на месяц. |
|
|
135
|
+
| `Sizes` | `Sizes.tsx` | Поля SM / MD / LG; размер задаётся полям в render-props. |
|
|
136
|
+
| `WithoutNavigation` | `WithoutNavigation.tsx` | Только поля и разделитель; кнопки скрыты. |
|
|
137
|
+
| `Production` | `Production.tsx` | Пример `Example: production`: поля с `HelpBox` в постфиксе. |
|
|
138
|
+
| `VisualTests` | `VisualTests.tsx` | Заполненный диапазон `["19700101", "19700101"]` с активными кнопками. |
|
|
139
|
+
|
|
140
|
+
`Playground` исключён из скриншот-тестов. Остальные пять stories покрыты десятью baseline для viewport xs / xl в `__screenshots__/`. `Playground` и `VisualTests` не включаются в MCP bundle.
|
|
141
|
+
|
|
142
|
+
---
|
|
143
|
+
|
|
144
|
+
## История изменений
|
|
145
|
+
|
|
146
|
+
| Дата | Изменение |
|
|
147
|
+
|---|---|
|
|
148
|
+
| 2026-10-08 | Создан документ |
|
|
149
|
+
| 2026-10-15 | Добавлен prop `format` (по умолчанию `YYYYMMDD`), передаётся пикерам в render-props (`IMonthYearRangePickerProvideProps.format`). Границы сравниваются хронологически вместо сравнения строк. Сравнение и сдвиг используют `isDateAfter` и `shiftDateRange` из `DateRange/utils.ts`. Интерфейсы props и `TMonthYearRangeValue` вынесены в `types.ts` |
|
|
150
|
+
|
|
151
|
+
---
|
|
152
|
+
|
|
153
|
+
## Примеры использования
|
|
154
|
+
|
|
155
|
+
### Default
|
|
156
|
+
|
|
157
|
+
`stories/MonthYearRange/examples/Default.tsx`
|
|
158
|
+
|
|
159
|
+
```tsx
|
|
160
|
+
import React, { useState } from "react";
|
|
161
|
+
import {
|
|
162
|
+
ButtonIcon,
|
|
163
|
+
MonthYearField,
|
|
164
|
+
MonthYearRange,
|
|
165
|
+
EMonthYearRangeShiftUnit,
|
|
166
|
+
IMonthYearRangeButtonProvideProps,
|
|
167
|
+
IMonthYearRangePickerProvideProps,
|
|
168
|
+
TMonthYearRangeValue,
|
|
169
|
+
} from "@sberbusiness/triplex-next";
|
|
170
|
+
|
|
171
|
+
export const Default = () => {
|
|
172
|
+
const [value, setValue] = useState<TMonthYearRangeValue>(["", ""]);
|
|
173
|
+
const renderPicker = (props: IMonthYearRangePickerProvideProps) => (
|
|
174
|
+
<MonthYearField label="Label" placeholder="Select to proceed" {...props} />
|
|
175
|
+
);
|
|
176
|
+
const renderButton = (props: IMonthYearRangeButtonProvideProps) => <ButtonIcon {...props} />;
|
|
177
|
+
|
|
178
|
+
return (
|
|
179
|
+
<div style={{ maxWidth: "400px" }}>
|
|
180
|
+
<MonthYearRange
|
|
181
|
+
value={value}
|
|
182
|
+
onChange={setValue}
|
|
183
|
+
shiftAmount={1}
|
|
184
|
+
shiftUnit={EMonthYearRangeShiftUnit.MONTH}
|
|
185
|
+
renderPickerFrom={renderPicker}
|
|
186
|
+
renderPickerTo={renderPicker}
|
|
187
|
+
renderButtonBack={renderButton}
|
|
188
|
+
renderButtonForward={renderButton}
|
|
189
|
+
/>
|
|
190
|
+
</div>
|
|
191
|
+
);
|
|
192
|
+
};
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
### Sizes
|
|
196
|
+
|
|
197
|
+
`stories/MonthYearRange/examples/Sizes.tsx`
|
|
198
|
+
|
|
199
|
+
```tsx
|
|
200
|
+
import React, { useState } from "react";
|
|
201
|
+
import {
|
|
202
|
+
ButtonIcon,
|
|
203
|
+
MonthYearField,
|
|
204
|
+
MonthYearRange,
|
|
205
|
+
EMonthYearRangeShiftUnit,
|
|
206
|
+
IMonthYearRangeButtonProvideProps,
|
|
207
|
+
IMonthYearRangePickerProvideProps,
|
|
208
|
+
TMonthYearRangeValue,
|
|
209
|
+
EComponentSize,
|
|
210
|
+
} from "@sberbusiness/triplex-next";
|
|
211
|
+
|
|
212
|
+
interface ISizeItemProps {
|
|
213
|
+
size: EComponentSize;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
const SizeItem = ({ size }: ISizeItemProps) => {
|
|
217
|
+
const [value, setValue] = useState<TMonthYearRangeValue>(["", ""]);
|
|
218
|
+
|
|
219
|
+
const renderPicker = (props: IMonthYearRangePickerProvideProps) => (
|
|
220
|
+
<MonthYearField label="Label" placeholder="Select to proceed" size={size} {...props} />
|
|
221
|
+
);
|
|
222
|
+
const renderButton = (props: IMonthYearRangeButtonProvideProps) => <ButtonIcon {...props} />;
|
|
223
|
+
|
|
224
|
+
return (
|
|
225
|
+
<div style={{ maxWidth: 500 }}>
|
|
226
|
+
<div style={{ marginBottom: "8px", fontSize: "16px", fontWeight: "700" }}>{size.toUpperCase()}</div>
|
|
227
|
+
<MonthYearRange
|
|
228
|
+
value={value}
|
|
229
|
+
onChange={setValue}
|
|
230
|
+
shiftAmount={1}
|
|
231
|
+
shiftUnit={EMonthYearRangeShiftUnit.MONTH}
|
|
232
|
+
renderPickerFrom={renderPicker}
|
|
233
|
+
renderPickerTo={renderPicker}
|
|
234
|
+
renderButtonBack={renderButton}
|
|
235
|
+
renderButtonForward={renderButton}
|
|
236
|
+
/>
|
|
237
|
+
</div>
|
|
238
|
+
);
|
|
239
|
+
};
|
|
240
|
+
|
|
241
|
+
const SIZES = Object.values(EComponentSize);
|
|
242
|
+
|
|
243
|
+
export const Sizes = () => (
|
|
244
|
+
<div style={{ display: "flex", flexDirection: "column", gap: 16 }}>
|
|
245
|
+
{SIZES.map((size) => (
|
|
246
|
+
<SizeItem key={size} size={size} />
|
|
247
|
+
))}
|
|
248
|
+
</div>
|
|
249
|
+
);
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
### WithoutNavigation
|
|
253
|
+
|
|
254
|
+
`stories/MonthYearRange/examples/WithoutNavigation.tsx`
|
|
255
|
+
|
|
256
|
+
```tsx
|
|
257
|
+
import React, { useState } from "react";
|
|
258
|
+
import {
|
|
259
|
+
MonthYearField,
|
|
260
|
+
MonthYearRange,
|
|
261
|
+
IMonthYearRangePickerProvideProps,
|
|
262
|
+
TMonthYearRangeValue,
|
|
263
|
+
} from "@sberbusiness/triplex-next";
|
|
264
|
+
|
|
265
|
+
export const WithoutNavigation = () => {
|
|
266
|
+
const [value, setValue] = useState<TMonthYearRangeValue>(["", ""]);
|
|
267
|
+
const renderPicker = (props: IMonthYearRangePickerProvideProps) => (
|
|
268
|
+
<MonthYearField label="Label" placeholder="Select to proceed" {...props} />
|
|
269
|
+
);
|
|
270
|
+
|
|
271
|
+
return (
|
|
272
|
+
<div style={{ maxWidth: "300px" }}>
|
|
273
|
+
<MonthYearRange
|
|
274
|
+
value={value}
|
|
275
|
+
onChange={setValue}
|
|
276
|
+
hideNavigation
|
|
277
|
+
renderPickerFrom={renderPicker}
|
|
278
|
+
renderPickerTo={renderPicker}
|
|
279
|
+
renderButtonBack={() => null}
|
|
280
|
+
renderButtonForward={() => null}
|
|
281
|
+
/>
|
|
282
|
+
</div>
|
|
283
|
+
);
|
|
284
|
+
};
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
### Production
|
|
288
|
+
|
|
289
|
+
`stories/MonthYearRange/examples/Production.tsx`
|
|
290
|
+
|
|
291
|
+
```tsx
|
|
292
|
+
import React, { useState } from "react";
|
|
293
|
+
import {
|
|
294
|
+
ButtonIcon,
|
|
295
|
+
MonthYearField,
|
|
296
|
+
MonthYearRange,
|
|
297
|
+
EMonthYearRangeShiftUnit,
|
|
298
|
+
IMonthYearRangeButtonProvideProps,
|
|
299
|
+
IMonthYearRangePickerProvideProps,
|
|
300
|
+
TMonthYearRangeValue,
|
|
301
|
+
HelpBox,
|
|
302
|
+
ETooltipSize,
|
|
303
|
+
} from "@sberbusiness/triplex-next";
|
|
304
|
+
|
|
305
|
+
export const Production = () => {
|
|
306
|
+
const [value, setValue] = useState<TMonthYearRangeValue>(["", ""]);
|
|
307
|
+
|
|
308
|
+
const renderPicker = (props: IMonthYearRangePickerProvideProps) => (
|
|
309
|
+
<MonthYearField
|
|
310
|
+
label="Label"
|
|
311
|
+
placeholder="Select to proceed"
|
|
312
|
+
targetProps={{ postfix: <HelpBox tooltipSize={ETooltipSize.SM}>HelpBox text</HelpBox>, inputProps: {} }}
|
|
313
|
+
{...props}
|
|
314
|
+
/>
|
|
315
|
+
);
|
|
316
|
+
const renderButton = (props: IMonthYearRangeButtonProvideProps) => <ButtonIcon {...props} />;
|
|
317
|
+
|
|
318
|
+
return (
|
|
319
|
+
<div style={{ maxWidth: 660 }}>
|
|
320
|
+
<MonthYearRange
|
|
321
|
+
value={value}
|
|
322
|
+
onChange={setValue}
|
|
323
|
+
shiftAmount={1}
|
|
324
|
+
shiftUnit={EMonthYearRangeShiftUnit.MONTH}
|
|
325
|
+
renderPickerFrom={renderPicker}
|
|
326
|
+
renderPickerTo={renderPicker}
|
|
327
|
+
renderButtonBack={renderButton}
|
|
328
|
+
renderButtonForward={renderButton}
|
|
329
|
+
/>
|
|
330
|
+
</div>
|
|
331
|
+
);
|
|
332
|
+
};
|
|
333
|
+
```
|
|
334
|
+
|