@ryuzaki13/react-foundation-lib 1.4.2 → 1.4.4
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/dist/hooks/useFloatingListbox.d.ts +1 -1
- package/package.json +1 -5
- package/src/array/README.mdx +4 -12
- package/src/binary/README.mdx +3 -11
- package/src/bounded-copy-stack/README.mdx +8 -14
- package/src/context-menu/README.mdx +11 -11
- package/src/copy/README.mdx +3 -11
- package/src/crypto/README.mdx +3 -11
- package/src/date-segments/README.mdx +3 -3
- package/src/dom/README.mdx +3 -11
- package/src/error/README.mdx +2 -2
- package/src/file/README.mdx +3 -11
- package/src/fingerprint/README.mdx +3 -3
- package/src/form/README.mdx +2 -2
- package/src/formatters/README.mdx +0 -6
- package/src/formatters/boolean/README.mdx +3 -11
- package/src/formulas/README.mdx +2 -8
- package/src/http/README.mdx +3 -3
- package/src/media/README.mdx +4 -4
- package/src/notifications/README.mdx +2 -2
- package/src/number-scale/README.mdx +1 -1
- package/src/odata-service/README.mdx +5 -11
- package/src/presets/README.mdx +2 -2
- package/src/pwa/README.mdx +0 -8
- package/src/query-client/README.mdx +5 -8
- package/src/range-output/README.mdx +3 -3
- package/src/session-storage/README.mdx +2 -2
- package/src/string-comparison/README.mdx +2 -2
- package/src/table/README.mdx +2 -10
- package/src/types/README.mdx +13 -13
- package/src/utils/README.mdx +4 -10
- package/src/validators/README.mdx +3 -3
- package/src/virtualizer/README.mdx +2 -6
- package/src/xml/README.mdx +3 -3
- package/dist/currency/currency.d.ts +0 -8
- package/dist/currency/currency.d.ts.map +0 -1
- package/dist/currency/index.d.ts +0 -2
- package/dist/currency/index.d.ts.map +0 -1
- package/dist/currency/index.js +0 -16
- package/dist/currency/index.js.map +0 -1
- package/src/currency/README.mdx +0 -155
|
@@ -51,8 +51,8 @@ export declare function useFloatingListbox<T>({ options, selectedIndex, open, on
|
|
|
51
51
|
setFloating: (node: HTMLElement | null) => void;
|
|
52
52
|
} & import("@floating-ui/react").ExtendedRefs<import("@floating-ui/react").ReferenceType>;
|
|
53
53
|
context: {
|
|
54
|
-
update: () => void;
|
|
55
54
|
x: number;
|
|
55
|
+
update: () => void;
|
|
56
56
|
y: number;
|
|
57
57
|
placement: Placement;
|
|
58
58
|
strategy: import("@floating-ui/utils").Strategy;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ryuzaki13/react-foundation-lib",
|
|
3
|
-
"version": "1.4.
|
|
3
|
+
"version": "1.4.4",
|
|
4
4
|
"description": "Reusable React and TypeScript foundation utilities, hooks, and primitives.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Ryuzaki13",
|
|
@@ -57,10 +57,6 @@
|
|
|
57
57
|
"types": "./dist/crypto/index.d.ts",
|
|
58
58
|
"import": "./dist/crypto/index.js"
|
|
59
59
|
},
|
|
60
|
-
"./currency": {
|
|
61
|
-
"types": "./dist/currency/index.d.ts",
|
|
62
|
-
"import": "./dist/currency/index.js"
|
|
63
|
-
},
|
|
64
60
|
"./date-segments": {
|
|
65
61
|
"types": "./dist/date-segments/index.d.ts",
|
|
66
62
|
"import": "./dist/date-segments/index.js"
|
package/src/array/README.mdx
CHANGED
|
@@ -2,7 +2,7 @@ import { Meta } from "@storybook/addon-docs/blocks";
|
|
|
2
2
|
|
|
3
3
|
<Meta title="Foundation Lib/API/Array" />
|
|
4
4
|
|
|
5
|
-
# Работа с массивами
|
|
5
|
+
# Работа с массивами
|
|
6
6
|
|
|
7
7
|
Модуль `array` содержит небольшие типизированные функции для типовых операций с массивами:
|
|
8
8
|
|
|
@@ -16,11 +16,9 @@ import { Meta } from "@storybook/addon-docs/blocks";
|
|
|
16
16
|
|
|
17
17
|
Функции не зависят от React, браузерного DOM, TanStack или других внешних runtime-библиотек. Их можно использовать в обычном TypeScript/JavaScript-коде, React-компонентах, store, mapper, validator и на границах сохранения или восстановления конфигурации.
|
|
18
18
|
|
|
19
|
-
README рассчитан на разработчика, который использует опубликованный пакет и не читает его исходный код. Здесь отдельно объясняются базовые понятия JavaScript/TypeScript, точное поведение каждой функции, ограничения и типовые ошибки.
|
|
20
|
-
|
|
21
19
|
## Содержание
|
|
22
20
|
|
|
23
|
-
- [
|
|
21
|
+
- [Импорт](#импорт)
|
|
24
22
|
- [Минимальные понятия JavaScript и TypeScript](#минимальные-понятия-javascript-и-typescript)
|
|
25
23
|
- [Как выбрать функцию](#как-выбрать-функцию)
|
|
26
24
|
- [Быстрый старт](#быстрый-старт)
|
|
@@ -37,20 +35,14 @@ README рассчитан на разработчика, который испо
|
|
|
37
35
|
- [Краткий справочник API](#краткий-справочник-api)
|
|
38
36
|
- [Вопросы и ответы](#вопросы-и-ответы)
|
|
39
37
|
|
|
40
|
-
##
|
|
41
|
-
|
|
42
|
-
Установите пакет в приложении:
|
|
43
|
-
|
|
44
|
-
```bash
|
|
45
|
-
npm install @ryuzaki13/react-foundation-lib
|
|
46
|
-
```
|
|
38
|
+
## Импорт
|
|
47
39
|
|
|
48
40
|
Импортируйте функции только из точечного entrypoint `/array`:
|
|
49
41
|
|
|
50
42
|
```ts
|
|
51
43
|
import { arrayGroupBy, arrayToMap, arrayUniqueBy, moveArrayItem } from "@ryuzaki13/react-foundation-lib/array";
|
|
52
44
|
|
|
53
|
-
import type
|
|
45
|
+
import { type ReorderAction } from "@ryuzaki13/react-foundation-lib/array";
|
|
54
46
|
```
|
|
55
47
|
|
|
56
48
|
Корневой импорт пакета не поддерживается:
|
package/src/binary/README.mdx
CHANGED
|
@@ -2,7 +2,7 @@ import { Meta } from "@storybook/addon-docs/blocks";
|
|
|
2
2
|
|
|
3
3
|
<Meta title="Foundation Lib/API/Binary" />
|
|
4
4
|
|
|
5
|
-
# Работа с бинарными данными
|
|
5
|
+
# Работа с бинарными данными
|
|
6
6
|
|
|
7
7
|
Модуль `binary` преобразует строковое бинарное содержимое в браузерный `Blob`, определяет предполагаемый MIME-тип документа и предоставляет React hook для типового сценария «base64 → `{ blob, mime }`».
|
|
8
8
|
|
|
@@ -16,12 +16,10 @@ import { Meta } from "@storybook/addon-docs/blocks";
|
|
|
16
16
|
|
|
17
17
|
Модуль является предметно-независимым foundation-слоем. Он не знает бизнес-коды документов, не выполняет HTTP/OData-запросы, не загружает файлы с диска, не создаёт viewer и не проверяет, безопасно ли содержимое.
|
|
18
18
|
|
|
19
|
-
README рассчитан на разработчика, который использует опубликованный пакет без доступа к исходному коду. Здесь объясняются базовые понятия, все публичные функции, точный приоритет MIME, поддерживаемые форматы, ошибки, React lifecycle, безопасность и управление object URL.
|
|
20
|
-
|
|
21
19
|
## Содержание
|
|
22
20
|
|
|
23
21
|
- [Назначение и границы модуля](#назначение-и-границы-модуля)
|
|
24
|
-
- [
|
|
22
|
+
- [Импорт](#импорт)
|
|
25
23
|
- [Минимальные понятия](#минимальные-понятия)
|
|
26
24
|
- [Как выбрать API](#как-выбрать-api)
|
|
27
25
|
- [Быстрый старт](#быстрый-старт)
|
|
@@ -72,13 +70,7 @@ README рассчитан на разработчика, который испо
|
|
|
72
70
|
|
|
73
71
|
Не копируйте логику скачивания рядом с `binaryToBlob`. Для готового `Blob` уже существует `downloadFileFromBlob` в `/dom`.
|
|
74
72
|
|
|
75
|
-
##
|
|
76
|
-
|
|
77
|
-
Установите пакет:
|
|
78
|
-
|
|
79
|
-
```bash
|
|
80
|
-
npm install @ryuzaki13/react-foundation-lib
|
|
81
|
-
```
|
|
73
|
+
## Импорт
|
|
82
74
|
|
|
83
75
|
Импортируйте API только из опубликованного subpath `/binary`:
|
|
84
76
|
|
|
@@ -2,16 +2,14 @@ import { Meta } from "@storybook/addon-docs/blocks";
|
|
|
2
2
|
|
|
3
3
|
<Meta title="Foundation Lib/Data/Bounded Copy Stack" />
|
|
4
4
|
|
|
5
|
-
# Ограниченный стек копий
|
|
5
|
+
# Ограниченный стек копий
|
|
6
6
|
|
|
7
7
|
Модуль хранит небольшой список последних скопированных сущностей. Новый элемент помещается в начало, повтор по `fingerprint` обновляет существующую запись, а старые записи удаляются при превышении лимита.
|
|
8
8
|
|
|
9
|
-
Документ рассчитан на разработчика без доступа к исходникам пакета. Ниже объясняются структура элемента, различие `id` и `fingerprint`, порядок записей, ссылки на payload и все граничные случаи.
|
|
10
|
-
|
|
11
9
|
## Содержание
|
|
12
10
|
|
|
13
11
|
- [Назначение и границы](#назначение-и-границы)
|
|
14
|
-
- [
|
|
12
|
+
- [Импорт](#импорт)
|
|
15
13
|
- [Основные понятия](#основные-понятия)
|
|
16
14
|
- [Быстрый старт](#быстрый-старт)
|
|
17
15
|
- [`pushBoundedCopyStackItem`](#pushboundedcopystackitem)
|
|
@@ -44,11 +42,7 @@ import { Meta } from "@storybook/addon-docs/blocks";
|
|
|
44
42
|
|
|
45
43
|
Clipboard helpers находятся в `@ryuzaki13/react-foundation-lib/copy`. Владелец state/storage находится в host-приложении.
|
|
46
44
|
|
|
47
|
-
##
|
|
48
|
-
|
|
49
|
-
```bash
|
|
50
|
-
npm install @ryuzaki13/react-foundation-lib
|
|
51
|
-
```
|
|
45
|
+
## Импорт
|
|
52
46
|
|
|
53
47
|
```ts
|
|
54
48
|
import {
|
|
@@ -57,11 +51,11 @@ import {
|
|
|
57
51
|
pushBoundedCopyStackItem
|
|
58
52
|
} from "@ryuzaki13/react-foundation-lib/bounded-copy-stack";
|
|
59
53
|
|
|
60
|
-
import
|
|
61
|
-
BoundedCopyStackItem,
|
|
62
|
-
BoundedCopyStackOptions,
|
|
63
|
-
BoundedCopyStackPushInput,
|
|
64
|
-
BoundedCopyStackPushResult
|
|
54
|
+
import {
|
|
55
|
+
type BoundedCopyStackItem,
|
|
56
|
+
type BoundedCopyStackOptions,
|
|
57
|
+
type BoundedCopyStackPushInput,
|
|
58
|
+
type BoundedCopyStackPushResult
|
|
65
59
|
} from "@ryuzaki13/react-foundation-lib/bounded-copy-stack";
|
|
66
60
|
```
|
|
67
61
|
|
|
@@ -2,7 +2,7 @@ import { Meta } from "@storybook/addon-docs/blocks";
|
|
|
2
2
|
|
|
3
3
|
<Meta title="Foundation Lib/Interaction/Context Menu State" />
|
|
4
4
|
|
|
5
|
-
# Состояние и anchors контекстного меню
|
|
5
|
+
# Состояние и anchors контекстного меню
|
|
6
6
|
|
|
7
7
|
Модуль описывает открытое/закрытое состояние контекстного меню, источник открытия и два вида anchor: DOM element или экранная точка. Также он создаёт virtual anchor для Floating UI.
|
|
8
8
|
|
|
@@ -11,7 +11,7 @@ import { Meta } from "@storybook/addon-docs/blocks";
|
|
|
11
11
|
## Содержание
|
|
12
12
|
|
|
13
13
|
- [Назначение и границы](#назначение-и-границы)
|
|
14
|
-
- [
|
|
14
|
+
- [Импорт](#импорт)
|
|
15
15
|
- [Модель данных](#модель-данных)
|
|
16
16
|
- [Получение точки](#получение-точки)
|
|
17
17
|
- [`createVirtualAnchor`](#createvirtualanchor)
|
|
@@ -48,7 +48,7 @@ host React/Floating UI/menu component
|
|
|
48
48
|
|
|
49
49
|
Готовый visual primitive находится в `@ryuzaki13/react-foundation-ui/context-menu`.
|
|
50
50
|
|
|
51
|
-
##
|
|
51
|
+
## Импорт
|
|
52
52
|
|
|
53
53
|
```ts
|
|
54
54
|
import {
|
|
@@ -61,14 +61,14 @@ import {
|
|
|
61
61
|
toggleMenu
|
|
62
62
|
} from "@ryuzaki13/react-foundation-lib/context-menu";
|
|
63
63
|
|
|
64
|
-
import
|
|
65
|
-
ElementMenuAnchor,
|
|
66
|
-
MenuAnchor,
|
|
67
|
-
MenuOpenSource,
|
|
68
|
-
MenuPoint,
|
|
69
|
-
MenuState,
|
|
70
|
-
OpenMenuPayload,
|
|
71
|
-
PointMenuAnchor
|
|
64
|
+
import {
|
|
65
|
+
type ElementMenuAnchor,
|
|
66
|
+
type MenuAnchor,
|
|
67
|
+
type MenuOpenSource,
|
|
68
|
+
type MenuPoint,
|
|
69
|
+
type MenuState,
|
|
70
|
+
type OpenMenuPayload,
|
|
71
|
+
type PointMenuAnchor
|
|
72
72
|
} from "@ryuzaki13/react-foundation-lib/context-menu";
|
|
73
73
|
```
|
|
74
74
|
|
package/src/copy/README.mdx
CHANGED
|
@@ -2,7 +2,7 @@ import { Meta } from "@storybook/addon-docs/blocks";
|
|
|
2
2
|
|
|
3
3
|
<Meta title="Foundation Lib/API/Copy" />
|
|
4
4
|
|
|
5
|
-
# Копирование текста
|
|
5
|
+
# Копирование текста
|
|
6
6
|
|
|
7
7
|
Модуль `copy` содержит React hooks для копирования текста в системный буфер обмена, чтения текста из DOM-элемента и показа короткого состояния «скопировано».
|
|
8
8
|
|
|
@@ -14,12 +14,10 @@ import { Meta } from "@storybook/addon-docs/blocks";
|
|
|
14
14
|
|
|
15
15
|
Модуль ориентирован на браузер. Он скрывает технический выбор между современным Clipboard API и legacy fallback, но не отменяет браузерные разрешения и ограничения безопасности.
|
|
16
16
|
|
|
17
|
-
README рассчитан на разработчика, который использует опубликованный пакет без доступа к исходному коду. Здесь объясняются базовые понятия React и DOM, точное поведение каждого hook, обработка ошибок, доступность, тестирование и известные ограничения.
|
|
18
|
-
|
|
19
17
|
## Содержание
|
|
20
18
|
|
|
21
19
|
- [Назначение и границы модуля](#назначение-и-границы-модуля)
|
|
22
|
-
- [
|
|
20
|
+
- [Импорт](#импорт)
|
|
23
21
|
- [Минимальные понятия](#минимальные-понятия)
|
|
24
22
|
- [Как выбрать API](#как-выбрать-api)
|
|
25
23
|
- [Быстрый старт](#быстрый-старт)
|
|
@@ -72,13 +70,7 @@ README рассчитан на разработчика, который испо
|
|
|
72
70
|
| Реализовать визуальную кнопку/tooltip | UI-компонент приложения или foundation UI-пакет |
|
|
73
71
|
| Скопировать изображение или rich HTML | Отдельная реализация Clipboard API для нужного формата |
|
|
74
72
|
|
|
75
|
-
##
|
|
76
|
-
|
|
77
|
-
Установите пакет:
|
|
78
|
-
|
|
79
|
-
```bash
|
|
80
|
-
npm install @ryuzaki13/react-foundation-lib
|
|
81
|
-
```
|
|
73
|
+
## Импорт
|
|
82
74
|
|
|
83
75
|
Модуль использует React hooks. Приложение должно предоставить совместимые peer-зависимости React:
|
|
84
76
|
|
package/src/crypto/README.mdx
CHANGED
|
@@ -2,7 +2,7 @@ import { Meta } from "@storybook/addon-docs/blocks";
|
|
|
2
2
|
|
|
3
3
|
<Meta title="Foundation Lib/API/Crypto" />
|
|
4
4
|
|
|
5
|
-
# Идентификаторы и строковые hash
|
|
5
|
+
# Идентификаторы и строковые hash
|
|
6
6
|
|
|
7
7
|
Модуль `crypto` предоставляет небольшие функции для двух разных задач:
|
|
8
8
|
|
|
@@ -13,12 +13,10 @@ import { Meta } from "@storybook/addon-docs/blocks";
|
|
|
13
13
|
|
|
14
14
|
Несмотря на имя entrypoint, строковые hash этого модуля не являются криптографическими. Они не подходят для паролей, подписей, access token, проверки безопасности или сокрытия персональных данных.
|
|
15
15
|
|
|
16
|
-
README рассчитан на разработчика, который использует опубликованный пакет без доступа к исходному коду. Здесь объясняются базовые понятия, точные форматы результатов, browser runtime, Unicode, коллизии, React/SSR, тестирование и безопасные границы применения.
|
|
17
|
-
|
|
18
16
|
## Содержание
|
|
19
17
|
|
|
20
18
|
- [Назначение и границы модуля](#назначение-и-границы-модуля)
|
|
21
|
-
- [
|
|
19
|
+
- [Импорт](#импорт)
|
|
22
20
|
- [Минимальные понятия](#минимальные-понятия)
|
|
23
21
|
- [Как выбрать API](#как-выбрать-api)
|
|
24
22
|
- [Быстрый старт](#быстрый-старт)
|
|
@@ -71,13 +69,7 @@ README рассчитан на разработчика, который испо
|
|
|
71
69
|
| Детерминированные hash | `hashString`, `hashString128`, `hashString128Base64Url`, `stringToElementId` | Та же точная строка даёт тот же результат. |
|
|
72
70
|
| Случайный идентификатор | `uuidv4` | Каждый вызов должен создавать новое случайное значение. |
|
|
73
71
|
|
|
74
|
-
##
|
|
75
|
-
|
|
76
|
-
Установите пакет:
|
|
77
|
-
|
|
78
|
-
```bash
|
|
79
|
-
npm install @ryuzaki13/react-foundation-lib
|
|
80
|
-
```
|
|
72
|
+
## Импорт
|
|
81
73
|
|
|
82
74
|
Импортируйте функции только из опубликованного subpath `/crypto`:
|
|
83
75
|
|
|
@@ -2,7 +2,7 @@ import { Meta } from "@storybook/addon-docs/blocks";
|
|
|
2
2
|
|
|
3
3
|
<Meta title="Foundation Lib/Date/Segments" />
|
|
4
4
|
|
|
5
|
-
# Сегменты даты и времени
|
|
5
|
+
# Сегменты даты и времени
|
|
6
6
|
|
|
7
7
|
Модуль разбирает строковую маску на редактируемые сегменты и литералы, преобразует `Date` в значения полей и строго собирает `Date` обратно. Он предназначен для segment-based date/time inputs.
|
|
8
8
|
|
|
@@ -11,7 +11,7 @@ import { Meta } from "@storybook/addon-docs/blocks";
|
|
|
11
11
|
## Содержание
|
|
12
12
|
|
|
13
13
|
- [Назначение и границы](#назначение-и-границы)
|
|
14
|
-
- [
|
|
14
|
+
- [Импорт](#импорт)
|
|
15
15
|
- [Базовые понятия](#базовые-понятия)
|
|
16
16
|
- [Поддерживаемые tokens](#поддерживаемые-tokens)
|
|
17
17
|
- [`parseDateSegmentMask`](#parsedatesegmentmask)
|
|
@@ -40,7 +40,7 @@ new Date(2026, 2, 3, 18, 3)
|
|
|
40
40
|
|
|
41
41
|
Модуль не рендерит input, не управляет focus/caret, не форматирует итоговую дату для UI/backend и не парсит ISO/OData строку. Для общего парсинга/форматирования используйте `/formatters`.
|
|
42
42
|
|
|
43
|
-
##
|
|
43
|
+
## Импорт
|
|
44
44
|
|
|
45
45
|
```ts
|
|
46
46
|
import {
|
package/src/dom/README.mdx
CHANGED
|
@@ -2,7 +2,7 @@ import { Meta } from "@storybook/addon-docs/blocks";
|
|
|
2
2
|
|
|
3
3
|
<Meta title="Foundation Lib/API/DOM" />
|
|
4
4
|
|
|
5
|
-
# Browser DOM и focus helpers
|
|
5
|
+
# Browser DOM и focus helpers
|
|
6
6
|
|
|
7
7
|
Модуль `dom` содержит небольшие browser helpers и React hooks для типовых инфраструктурных задач:
|
|
8
8
|
|
|
@@ -17,12 +17,10 @@ import { Meta } from "@storybook/addon-docs/blocks";
|
|
|
17
17
|
|
|
18
18
|
Модуль является низкоуровневым browser foundation-слоем. Он не создаёт готовые кнопки, dialog, modal, popover, tooltip или download UI. Визуальный компонент по-прежнему отвечает за семантический HTML, ARIA, стили, анимацию, стек overlay, сообщения об ошибках и пользовательский сценарий.
|
|
19
19
|
|
|
20
|
-
README рассчитан на разработчика, который использует опубликованный пакет без прямого доступа к исходному коду. Здесь объясняются базовые понятия DOM и React, все публичные функции, точный lifecycle, defaults, cleanup, ограничения доступности, тестирование и частые ошибки.
|
|
21
|
-
|
|
22
20
|
## Содержание
|
|
23
21
|
|
|
24
22
|
- [Назначение и границы модуля](#назначение-и-границы-модуля)
|
|
25
|
-
- [
|
|
23
|
+
- [Импорт](#импорт)
|
|
26
24
|
- [Runtime и browser boundary](#runtime-и-browser-boundary)
|
|
27
25
|
- [Минимальные понятия](#минимальные-понятия)
|
|
28
26
|
- [Как выбрать API](#как-выбрать-api)
|
|
@@ -91,13 +89,7 @@ README рассчитан на разработчика, который испо
|
|
|
91
89
|
|
|
92
90
|
Если приложению нужен готовый UI primitive, сначала ищите его в `@ryuzaki13/react-foundation-ui`. Модуль `dom` нужен авторам primitives и для специальных browser-сценариев, а не для повторной сборки локальных modal/dialog в каждом feature.
|
|
93
91
|
|
|
94
|
-
##
|
|
95
|
-
|
|
96
|
-
Установите пакет:
|
|
97
|
-
|
|
98
|
-
```bash
|
|
99
|
-
npm install @ryuzaki13/react-foundation-lib
|
|
100
|
-
```
|
|
92
|
+
## Импорт
|
|
101
93
|
|
|
102
94
|
Entrypoint экспортирует React hooks, поэтому host-приложение должно предоставить совместимые peer-зависимости:
|
|
103
95
|
|
package/src/error/README.mdx
CHANGED
|
@@ -2,11 +2,11 @@ import { Meta } from "@storybook/addon-docs/blocks";
|
|
|
2
2
|
|
|
3
3
|
<Meta title="Foundation Lib/Errors/Missing Context" />
|
|
4
4
|
|
|
5
|
-
# Ошибка отсутствующего React context
|
|
5
|
+
# Ошибка отсутствующего React context
|
|
6
6
|
|
|
7
7
|
Модуль создаёт единообразное диагностическое сообщение, когда custom hook вызван вне нужного Provider.
|
|
8
8
|
|
|
9
|
-
##
|
|
9
|
+
## Импорт
|
|
10
10
|
|
|
11
11
|
```ts
|
|
12
12
|
import { createMissingContextError, createMissingContextErrorMessage } from "@ryuzaki13/react-foundation-lib/error";
|
package/src/file/README.mdx
CHANGED
|
@@ -2,7 +2,7 @@ import { Meta } from "@storybook/addon-docs/blocks";
|
|
|
2
2
|
|
|
3
3
|
<Meta title="Foundation Lib/API/File" />
|
|
4
4
|
|
|
5
|
-
# Работа с пользовательскими файлами
|
|
5
|
+
# Работа с пользовательскими файлами
|
|
6
6
|
|
|
7
7
|
Модуль `file` содержит browser helpers для четырёх связанных задач:
|
|
8
8
|
|
|
@@ -13,12 +13,10 @@ import { Meta } from "@storybook/addon-docs/blocks";
|
|
|
13
13
|
|
|
14
14
|
Модуль является низкоуровневым foundation-слоем. Он не рисует `<input type="file">`, не отправляет файл на backend, не показывает preview или progress, не проверяет реальное содержимое файла и не заменяет серверную валидацию.
|
|
15
15
|
|
|
16
|
-
README рассчитан на разработчика, который использует опубликованный пакет без доступа к исходному коду. Поэтому ниже отдельно объясняются базовые понятия JavaScript/TypeScript, точный порядок проверок, структура результатов, все публичные функции и типы, фактические классы ошибок, ограничения безопасности и известные особенности текущей реализации.
|
|
17
|
-
|
|
18
16
|
## Содержание
|
|
19
17
|
|
|
20
18
|
- [Назначение и границы модуля](#назначение-и-границы-модуля)
|
|
21
|
-
- [
|
|
19
|
+
- [Импорт](#импорт)
|
|
22
20
|
- [Runtime и browser boundary](#runtime-и-browser-boundary)
|
|
23
21
|
- [Минимальные понятия](#минимальные-понятия)
|
|
24
22
|
- [Как выбрать API](#как-выбрать-api)
|
|
@@ -90,13 +88,7 @@ README рассчитан на разработчика, который испо
|
|
|
90
88
|
|
|
91
89
|
Если нужен только обычный upload через `multipart/form-data`, браузерный `File` можно положить в `FormData` напрямую. Предварительное чтение всего файла через `readFile` для этого не обязательно.
|
|
92
90
|
|
|
93
|
-
##
|
|
94
|
-
|
|
95
|
-
Установите пакет:
|
|
96
|
-
|
|
97
|
-
```bash
|
|
98
|
-
npm install @ryuzaki13/react-foundation-lib
|
|
99
|
-
```
|
|
91
|
+
## Импорт
|
|
100
92
|
|
|
101
93
|
Импортируйте API только из опубликованного subpath `/file`:
|
|
102
94
|
|
|
@@ -2,14 +2,14 @@ import { Meta } from "@storybook/addon-docs/blocks";
|
|
|
2
2
|
|
|
3
3
|
<Meta title="Foundation Lib/Browser/Client Fingerprint" />
|
|
4
4
|
|
|
5
|
-
# Client fingerprint
|
|
5
|
+
# Client fingerprint
|
|
6
6
|
|
|
7
7
|
`getClientFingerprint` лениво загружает FingerprintJS, получает `visitorId` и кеширует Promise на всё время жизни JavaScript-модуля.
|
|
8
8
|
|
|
9
|
-
##
|
|
9
|
+
## Импорт
|
|
10
10
|
|
|
11
11
|
```bash
|
|
12
|
-
npm install @
|
|
12
|
+
npm install @fingerprintjs/fingerprintjs
|
|
13
13
|
```
|
|
14
14
|
|
|
15
15
|
```ts
|
package/src/form/README.mdx
CHANGED
|
@@ -2,11 +2,11 @@ import { Meta } from "@storybook/addon-docs/blocks";
|
|
|
2
2
|
|
|
3
3
|
<Meta title="Foundation Lib/Forms/Form Errors" />
|
|
4
4
|
|
|
5
|
-
# Чтение первой ошибки формы
|
|
5
|
+
# Чтение первой ошибки формы
|
|
6
6
|
|
|
7
7
|
Модуль содержит одну функцию `readFirstFormError`. Она получает неоднородный массив ошибок и возвращает первое найденное текстовое сообщение.
|
|
8
8
|
|
|
9
|
-
##
|
|
9
|
+
## Импорт
|
|
10
10
|
|
|
11
11
|
```ts
|
|
12
12
|
import { readFirstFormError } from "@ryuzaki13/react-foundation-lib/form";
|
|
@@ -8,12 +8,6 @@ import { Meta } from "@storybook/addon-docs/blocks";
|
|
|
8
8
|
|
|
9
9
|
Документация разделена по предметным областям, чтобы разработчику не приходилось читать один огромный файл. Этот README объясняет общие правила, помогает выбрать API и подробно описывает небольшие helpers верхнего уровня.
|
|
10
10
|
|
|
11
|
-
## Установка
|
|
12
|
-
|
|
13
|
-
```bash
|
|
14
|
-
npm install @ryuzaki13/react-foundation-lib
|
|
15
|
-
```
|
|
16
|
-
|
|
17
11
|
Пакет является ESM. Корневого импорта пакета нет. Все formatter functions и их типы импортируются из точечного entrypoint:
|
|
18
12
|
|
|
19
13
|
```ts
|
|
@@ -2,7 +2,7 @@ import { Meta } from "@storybook/addon-docs/blocks";
|
|
|
2
2
|
|
|
3
3
|
<Meta title="Foundation Lib/API/Formatters/Boolean" />
|
|
4
4
|
|
|
5
|
-
# Boolean и ABAP boolean
|
|
5
|
+
# Boolean и ABAP boolean
|
|
6
6
|
|
|
7
7
|
Подмодуль `boolean` преобразует значения между JavaScript `boolean` и двухсимвольным ABAP-контрактом:
|
|
8
8
|
|
|
@@ -11,12 +11,10 @@ import { Meta } from "@storybook/addon-docs/blocks";
|
|
|
11
11
|
|
|
12
12
|
Также он предоставляет более широкий parser `parseBoolean` для простых пользовательских или transport-значений.
|
|
13
13
|
|
|
14
|
-
README рассчитан на разработчика без доступа к исходному коду. Ниже описано точное, местами неочевидное поведение всех трёх публичных функций. Особенно важно не путать строгий `parseAbapBoolean`, расширенный `parseBoolean` и truthy-семантику `toAbapBoolean`.
|
|
15
|
-
|
|
16
14
|
## Содержание
|
|
17
15
|
|
|
18
16
|
- [Назначение и границы](#назначение-и-границы)
|
|
19
|
-
- [
|
|
17
|
+
- [Импорт](#импорт)
|
|
20
18
|
- [Минимальные понятия](#минимальные-понятия)
|
|
21
19
|
- [Как выбрать функцию](#как-выбрать-функцию)
|
|
22
20
|
- [`parseAbapBoolean`](#parseabapboolean)
|
|
@@ -47,13 +45,7 @@ README рассчитан на разработчика без доступа к
|
|
|
47
45
|
- не сериализует JSON, URL или OData query;
|
|
48
46
|
- не гарантирует, что широкий `toAbapBoolean(unknown)` подходит конкретному backend-контракту.
|
|
49
47
|
|
|
50
|
-
##
|
|
51
|
-
|
|
52
|
-
Установите пакет:
|
|
53
|
-
|
|
54
|
-
```bash
|
|
55
|
-
npm install @ryuzaki13/react-foundation-lib
|
|
56
|
-
```
|
|
48
|
+
## Импорт
|
|
57
49
|
|
|
58
50
|
Все boolean helpers импортируются из единственного опубликованного subpath `/formatters`:
|
|
59
51
|
|
package/src/formulas/README.mdx
CHANGED
|
@@ -17,12 +17,10 @@ import { Meta } from "@storybook/addon-docs/blocks";
|
|
|
17
17
|
контролируемая причина ошибки выполнения
|
|
18
18
|
```
|
|
19
19
|
|
|
20
|
-
README рассчитан на разработчика без доступа к исходному коду. Здесь описано точное поведение всего публичного API, включая преобразование значений, реестр, validation, ошибки и связь с formatter pipeline.
|
|
21
|
-
|
|
22
20
|
## Содержание
|
|
23
21
|
|
|
24
22
|
- [Назначение и границы](#назначение-и-границы)
|
|
25
|
-
- [
|
|
23
|
+
- [Импорт](#импорт)
|
|
26
24
|
- [Быстрый старт](#быстрый-старт)
|
|
27
25
|
- [Основные понятия](#основные-понятия)
|
|
28
26
|
- [Описание формулы](#описание-формулы)
|
|
@@ -71,11 +69,7 @@ Host-приложение владеет прикладными `TableFormulaDef
|
|
|
71
69
|
|
|
72
70
|
Сериализуемая конфигурация колонки хранит только стабильный `formulaId` и ordered dependencies. Реальная функция остаётся доверенным кодом приложения.
|
|
73
71
|
|
|
74
|
-
##
|
|
75
|
-
|
|
76
|
-
```bash
|
|
77
|
-
npm install @ryuzaki13/react-foundation-lib
|
|
78
|
-
```
|
|
72
|
+
## Импорт
|
|
79
73
|
|
|
80
74
|
Используйте только опубликованный package subpath `/formulas`:
|
|
81
75
|
|
package/src/http/README.mdx
CHANGED
|
@@ -2,14 +2,14 @@ import { Meta } from "@storybook/addon-docs/blocks";
|
|
|
2
2
|
|
|
3
3
|
<Meta title="Foundation Lib/HTTP/Headers and Text Response" />
|
|
4
4
|
|
|
5
|
-
# HTTP headers и текстовые ответы
|
|
5
|
+
# HTTP headers и текстовые ответы
|
|
6
6
|
|
|
7
7
|
Модуль создаёт стандартный набор HTTP-заголовков запрета кеширования и обычный `Response` с UTF-8 plain text.
|
|
8
8
|
|
|
9
9
|
## Содержание
|
|
10
10
|
|
|
11
11
|
- [Назначение и границы](#назначение-и-границы)
|
|
12
|
-
- [
|
|
12
|
+
- [Импорт](#импорт)
|
|
13
13
|
- [`createNoStoreHeaders`](#createnostoreheaders)
|
|
14
14
|
- [`createTextHttpResponse`](#createtexthttpresponse)
|
|
15
15
|
- [Runtime и безопасность](#runtime-и-безопасность)
|
|
@@ -26,7 +26,7 @@ Headers с no-store + Response(text/plain; charset=UTF-8)
|
|
|
26
26
|
|
|
27
27
|
Модуль не выполняет `fetch`, не сериализует JSON, не задаёт CORS, CSP, cookies или authorization и не превращает ошибки transport в response автоматически.
|
|
28
28
|
|
|
29
|
-
##
|
|
29
|
+
## Импорт
|
|
30
30
|
|
|
31
31
|
```ts
|
|
32
32
|
import { createNoStoreHeaders, createTextHttpResponse } from "@ryuzaki13/react-foundation-lib/http";
|
package/src/media/README.mdx
CHANGED
|
@@ -2,7 +2,7 @@ import { Meta } from "@storybook/addon-docs/blocks";
|
|
|
2
2
|
|
|
3
3
|
<Meta title="Foundation Lib/API/Media" />
|
|
4
4
|
|
|
5
|
-
# Адаптивность и media queries
|
|
5
|
+
# Адаптивность и media queries
|
|
6
6
|
|
|
7
7
|
Модуль `media` содержит общий низкоуровневый контракт адаптивности для React-приложений:
|
|
8
8
|
|
|
@@ -14,12 +14,12 @@ import { Meta } from "@storybook/addon-docs/blocks";
|
|
|
14
14
|
- преобразование количества пикселей относительно размера `em`;
|
|
15
15
|
- расчёт проектной высоты control.
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
Ниже отдельно объясняются базовые понятия CSS и React, точные значения, fallback-порядок, SSR, hydration, подписки, cleanup, ограничения и все публичные exports.
|
|
18
18
|
|
|
19
19
|
## Содержание
|
|
20
20
|
|
|
21
21
|
- [Граница ответственности](#граница-ответственности)
|
|
22
|
-
- [
|
|
22
|
+
- [Импорт](#импорт)
|
|
23
23
|
- [Минимальные понятия](#минимальные-понятия)
|
|
24
24
|
- [Как выбрать API](#как-выбрать-api)
|
|
25
25
|
- [Проектные брейкпоинты](#проектные-брейкпоинты)
|
|
@@ -82,7 +82,7 @@ import { Meta } from "@storybook/addon-docs/blocks";
|
|
|
82
82
|
|
|
83
83
|
Если задача решается только стилями, сначала используйте CSS. JavaScript hook нужен, когда media query действительно влияет на вычисления, выбор поведения, параметры сторонней библиотеки или внешний store.
|
|
84
84
|
|
|
85
|
-
##
|
|
85
|
+
## Импорт
|
|
86
86
|
|
|
87
87
|
Установите пакет:
|
|
88
88
|
|
|
@@ -22,12 +22,12 @@ import { Meta } from "@storybook/addon-docs/blocks";
|
|
|
22
22
|
|
|
23
23
|
Для ошибок внутри формы лучше показывать сообщение рядом с полем. Уведомление — дополнительный, а не единственный канал обратной связи.
|
|
24
24
|
|
|
25
|
-
##
|
|
25
|
+
## Импорт
|
|
26
26
|
|
|
27
27
|
Модулю нужен peer dependency `zustand`.
|
|
28
28
|
|
|
29
29
|
```bash
|
|
30
|
-
npm install
|
|
30
|
+
npm install zustand
|
|
31
31
|
```
|
|
32
32
|
|
|
33
33
|
```ts
|
|
@@ -15,14 +15,14 @@ import { Meta } from "@storybook/addon-docs/blocks";
|
|
|
15
15
|
- поиска пар «код + текст» в справочных коллекциях;
|
|
16
16
|
- хранения общих настроек OData-справочников.
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
В примерах объясняется не только вызов функции, но и смысл входных данных, результат, ограничения и типичные ошибки.
|
|
19
19
|
|
|
20
20
|
> Ранее helpers справочных коллекций публиковались через отдельный subpath `@ryuzaki13/react-foundation-lib/odata`. Теперь этот код входит в `odata-service`. Старый subpath удалён без compatibility alias.
|
|
21
21
|
|
|
22
22
|
## Содержание
|
|
23
23
|
|
|
24
24
|
- [Что делает и чего не делает модуль](#что-делает-и-чего-не-делает-модуль)
|
|
25
|
-
- [
|
|
25
|
+
- [Импорт](#импорт)
|
|
26
26
|
- [Зависимости и среда выполнения](#зависимости-и-среда-выполнения)
|
|
27
27
|
- [OData V2 простыми словами](#odata-v2-простыми-словами)
|
|
28
28
|
- [Быстрый старт](#быстрый-старт)
|
|
@@ -99,13 +99,7 @@ host entity / feature / widget
|
|
|
99
99
|
бизнес-правила, экран, пользовательский сценарий
|
|
100
100
|
```
|
|
101
101
|
|
|
102
|
-
##
|
|
103
|
-
|
|
104
|
-
Установите пакет:
|
|
105
|
-
|
|
106
|
-
```bash
|
|
107
|
-
npm install @ryuzaki13/react-foundation-lib
|
|
108
|
-
```
|
|
102
|
+
## Импорт
|
|
109
103
|
|
|
110
104
|
Для полного entrypoint также разрешите совместимые peer dependencies, если package manager не сделал этого автоматически:
|
|
111
105
|
|
|
@@ -142,7 +136,7 @@ import { buildODataFilter } from "@ryuzaki13/react-foundation-lib";
|
|
|
142
136
|
import { buildODataFilter } from "@ryuzaki13/react-foundation-lib/dist/odata-service/filters";
|
|
143
137
|
|
|
144
138
|
// Неверно: прежний subpath удалён после объединения модулей.
|
|
145
|
-
import { findCollectionPairs } from "@ryuzaki13/react-foundation-lib/odata";
|
|
139
|
+
import { findCollectionPairs } from "@ryuzaki13/react-foundation-lib/odata-service";
|
|
146
140
|
```
|
|
147
141
|
|
|
148
142
|
### `import type` для TypeScript-типов
|
|
@@ -2586,7 +2580,7 @@ beforeEach(() => {
|
|
|
2586
2580
|
До:
|
|
2587
2581
|
|
|
2588
2582
|
```ts
|
|
2589
|
-
import { buildSeparatedArrays, findCollectionPairs, ODataDateFormat, useODataCollectionStore } from "@ryuzaki13/react-foundation-lib/odata";
|
|
2583
|
+
import { buildSeparatedArrays, findCollectionPairs, ODataDateFormat, useODataCollectionStore } from "@ryuzaki13/react-foundation-lib/odata-service";
|
|
2590
2584
|
```
|
|
2591
2585
|
|
|
2592
2586
|
После:
|
package/src/presets/README.mdx
CHANGED
|
@@ -2,11 +2,11 @@ import { Meta } from "@storybook/addon-docs/blocks";
|
|
|
2
2
|
|
|
3
3
|
<Meta title="Foundation Lib/Data/Presets" />
|
|
4
4
|
|
|
5
|
-
# Общие preset helpers
|
|
5
|
+
# Общие preset helpers
|
|
6
6
|
|
|
7
7
|
Модуль проверяет восстановленные preset ids, сопоставляет их с option objects и ищет одну option по id.
|
|
8
8
|
|
|
9
|
-
##
|
|
9
|
+
## Импорт
|
|
10
10
|
|
|
11
11
|
```ts
|
|
12
12
|
import { getPresetOption, normalizePresetIds, resolvePresetOptionsByIds } from "@ryuzaki13/react-foundation-lib/presets";
|
package/src/pwa/README.mdx
CHANGED
|
@@ -13,14 +13,6 @@ import { Meta } from "@storybook/addon-docs/blocks";
|
|
|
13
13
|
|
|
14
14
|
Используйте точный subpath. Внутренний файл `serviceWorker` не является самостоятельным публичным export, даже если отдельные функции используются самим hook.
|
|
15
15
|
|
|
16
|
-
## Установка
|
|
17
|
-
|
|
18
|
-
Для `useServiceWorkerUpdate` нужен React. Cache policy не имеет React-зависимости.
|
|
19
|
-
|
|
20
|
-
```bash
|
|
21
|
-
npm install @ryuzaki13/react-foundation-lib react
|
|
22
|
-
```
|
|
23
|
-
|
|
24
16
|
## Часть 1. Обновление Service Worker
|
|
25
17
|
|
|
26
18
|
### Задача hook
|
|
@@ -14,14 +14,14 @@ import { Meta } from "@storybook/addon-docs/blocks";
|
|
|
14
14
|
- синхронизирует cache data и invalidation между вкладками;
|
|
15
15
|
- предоставляет низкоуровневые helpers для optimistic update и rollback.
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
Здесь описаны жизненный цикл данных, точное поведение функций, ограничения browser API и полный публичный API.
|
|
18
18
|
|
|
19
19
|
> Ранее optimistic update был описан отдельным документом. Теперь весь смысл, примеры, ограничения и API находятся только на этой странице.
|
|
20
20
|
|
|
21
21
|
## Содержание
|
|
22
22
|
|
|
23
23
|
- [Назначение и границы](#назначение-и-границы)
|
|
24
|
-
- [
|
|
24
|
+
- [Импорт](#импорт)
|
|
25
25
|
- [Обязательные build-time constants](#обязательные-build-time-constants)
|
|
26
26
|
- [Основные понятия TanStack Query](#основные-понятия-tanstack-query)
|
|
27
27
|
- [Как выбрать cache strategy](#как-выбрать-cache-strategy)
|
|
@@ -92,15 +92,12 @@ queryOptions/useQuery/useMutation
|
|
|
92
92
|
|
|
93
93
|
Broadcast не является четвёртым хранилищем. Он только передаёт изменения между уже работающими вкладками.
|
|
94
94
|
|
|
95
|
-
##
|
|
95
|
+
## Импорт
|
|
96
96
|
|
|
97
|
-
Установите
|
|
97
|
+
Установите совместимые peer dependencies:
|
|
98
98
|
|
|
99
99
|
```bash
|
|
100
|
-
npm install @
|
|
101
|
-
npm install react @tanstack/react-query \
|
|
102
|
-
@tanstack/query-persist-client-core \
|
|
103
|
-
@tanstack/query-broadcast-client-experimental
|
|
100
|
+
npm install react @tanstack/react-query @tanstack/query-persist-client-core @tanstack/query-broadcast-client-experimental
|
|
104
101
|
```
|
|
105
102
|
|
|
106
103
|
Публичный импорт:
|
|
@@ -2,14 +2,14 @@ import { Meta } from "@storybook/addon-docs/blocks";
|
|
|
2
2
|
|
|
3
3
|
<Meta title="Foundation Lib/Data/Range Output" />
|
|
4
4
|
|
|
5
|
-
# Подстановка открытых границ
|
|
5
|
+
# Подстановка открытых границ
|
|
6
6
|
|
|
7
7
|
Модуль хранит в UI открытые границы диапазона как `null`, но позволяет подставить конкретные значения при внешнем выводе или сохранении.
|
|
8
8
|
|
|
9
9
|
## Содержание
|
|
10
10
|
|
|
11
11
|
- [Назначение](#назначение)
|
|
12
|
-
- [
|
|
12
|
+
- [Импорт](#импорт)
|
|
13
13
|
- [Контракты](#контракты)
|
|
14
14
|
- [`readRangeOutputValueFallback`](#readrangeoutputvaluefallback)
|
|
15
15
|
- [`resolveRangeOutputValue`](#resolverangeoutputvalue)
|
|
@@ -28,7 +28,7 @@ external output [0, 6]
|
|
|
28
28
|
|
|
29
29
|
Исходное UI-значение не изменяется. `null` заменяется только при построении отдельного output tuple.
|
|
30
30
|
|
|
31
|
-
##
|
|
31
|
+
## Импорт
|
|
32
32
|
|
|
33
33
|
```ts
|
|
34
34
|
import { readRangeOutputValueFallback, resolveRangeOutputValue } from "@ryuzaki13/react-foundation-lib/range-output";
|
|
@@ -2,11 +2,11 @@ import { Meta } from "@storybook/addon-docs/blocks";
|
|
|
2
2
|
|
|
3
3
|
<Meta title="Foundation Lib/Browser/Session Storage ID" />
|
|
4
4
|
|
|
5
|
-
# Идентификатор вкладочной сессии
|
|
5
|
+
# Идентификатор вкладочной сессии
|
|
6
6
|
|
|
7
7
|
`getSessionStorageId` возвращает стабильный id в пределах одной browser-вкладки. При первом вызове id создаётся и сохраняется в `sessionStorage`, при следующих — читается по тому же ключу.
|
|
8
8
|
|
|
9
|
-
##
|
|
9
|
+
## Импорт
|
|
10
10
|
|
|
11
11
|
```ts
|
|
12
12
|
import { getSessionStorageId } from "@ryuzaki13/react-foundation-lib/session-storage";
|
|
@@ -2,11 +2,11 @@ import { Meta } from "@storybook/addon-docs/blocks";
|
|
|
2
2
|
|
|
3
3
|
<Meta title="Foundation Lib/Data/String Comparison" />
|
|
4
4
|
|
|
5
|
-
# Сравнение строк
|
|
5
|
+
# Сравнение строк
|
|
6
6
|
|
|
7
7
|
`compareStrings` задаёт единый порядок строк для русскоязычных UI-списков, смешанной кириллицы/латиницы и числовых суффиксов.
|
|
8
8
|
|
|
9
|
-
##
|
|
9
|
+
## Импорт
|
|
10
10
|
|
|
11
11
|
```ts
|
|
12
12
|
import { compareStrings } from "@ryuzaki13/react-foundation-lib/string-comparison";
|
package/src/table/README.mdx
CHANGED
|
@@ -9,14 +9,12 @@ import { Meta } from "@storybook/addon-docs/blocks";
|
|
|
9
9
|
- `@ryuzaki13/react-foundation-lib/table` — типы и helpers для TanStack Table v9, колонок, layout, выбора строк и ячеек, а также OData metadata;
|
|
10
10
|
- `@ryuzaki13/react-foundation-lib/tree-table` — построение древовидных строк и преобразование плоских аналитических данных в иерархию.
|
|
11
11
|
|
|
12
|
-
Документ рассчитан на разработчика без доступа к исходному коду пакета и с минимальным знанием JavaScript, TypeScript, React и TanStack Table. В нём объясняются не только названия функций, но и смысл каждого состояния, правила идентификаторов, результат вызова, ограничения и типичные ошибки.
|
|
13
|
-
|
|
14
12
|
> Документ один, потому что плоская и древовидная таблицы используют общие понятия строк, колонок, идентификаторов и selection. Публичных import path при этом два: API `tree-table` не реэкспортируется из `table`, а API `table` не реэкспортируется из `tree-table`.
|
|
15
13
|
|
|
16
14
|
## Содержание
|
|
17
15
|
|
|
18
16
|
- [Назначение и границы](#назначение-и-границы)
|
|
19
|
-
- [
|
|
17
|
+
- [Импорт](#импорт)
|
|
20
18
|
- [Что нужно знать перед началом](#что-нужно-знать-перед-началом)
|
|
21
19
|
- [Как выбрать нужную часть API](#как-выбрать-нужную-часть-api)
|
|
22
20
|
- [Быстрый старт: плоская таблица](#быстрый-старт-плоская-таблица)
|
|
@@ -134,13 +132,7 @@ import { Meta } from "@storybook/addon-docs/blocks";
|
|
|
134
132
|
table helpers очищают только локальный UI state
|
|
135
133
|
```
|
|
136
134
|
|
|
137
|
-
##
|
|
138
|
-
|
|
139
|
-
Установите пакет:
|
|
140
|
-
|
|
141
|
-
```bash
|
|
142
|
-
npm install @ryuzaki13/react-foundation-lib
|
|
143
|
-
```
|
|
135
|
+
## Импорт
|
|
144
136
|
|
|
145
137
|
Для `table` host должен разрешить совместимые peer dependencies React и TanStack Table:
|
|
146
138
|
|
package/src/types/README.mdx
CHANGED
|
@@ -2,13 +2,13 @@ import { Meta } from "@storybook/addon-docs/blocks";
|
|
|
2
2
|
|
|
3
3
|
<Meta title="Foundation Lib/Contracts/Common Types" />
|
|
4
4
|
|
|
5
|
-
# Общие технические типы
|
|
5
|
+
# Общие технические типы
|
|
6
6
|
|
|
7
7
|
Модуль содержит небольшие общие TypeScript-контракты для value state, ABAP boolean, базовых значений, диапазонов и строк таблицы. Единственная runtime-функция — `isBaseType`.
|
|
8
8
|
|
|
9
9
|
## Содержание
|
|
10
10
|
|
|
11
|
-
- [
|
|
11
|
+
- [Импорт](#импорт)
|
|
12
12
|
- [`State`](#state)
|
|
13
13
|
- [`AbapBoolean`](#abapboolean)
|
|
14
14
|
- [`Primitive` и `BaseType`](#primitive-и-basetype)
|
|
@@ -18,21 +18,21 @@ import { Meta } from "@storybook/addon-docs/blocks";
|
|
|
18
18
|
- [`RowRecord`](#rowrecord)
|
|
19
19
|
- [Ошибки проектирования](#ошибки-проектирования)
|
|
20
20
|
|
|
21
|
-
##
|
|
21
|
+
## Импорт
|
|
22
22
|
|
|
23
23
|
```ts
|
|
24
24
|
import { isBaseType } from "@ryuzaki13/react-foundation-lib/types";
|
|
25
25
|
|
|
26
|
-
import
|
|
27
|
-
AbapBoolean,
|
|
28
|
-
ArrayType,
|
|
29
|
-
BaseType,
|
|
30
|
-
InputType,
|
|
31
|
-
ObjectType,
|
|
32
|
-
Primitive,
|
|
33
|
-
RangeType,
|
|
34
|
-
RowRecord,
|
|
35
|
-
State
|
|
26
|
+
import {
|
|
27
|
+
type AbapBoolean,
|
|
28
|
+
type ArrayType,
|
|
29
|
+
type BaseType,
|
|
30
|
+
type InputType,
|
|
31
|
+
type ObjectType,
|
|
32
|
+
type Primitive,
|
|
33
|
+
type RangeType,
|
|
34
|
+
type RowRecord,
|
|
35
|
+
type State
|
|
36
36
|
} from "@ryuzaki13/react-foundation-lib/types";
|
|
37
37
|
```
|
|
38
38
|
|
package/src/utils/README.mdx
CHANGED
|
@@ -2,7 +2,7 @@ import { Meta } from "@storybook/addon-docs/blocks";
|
|
|
2
2
|
|
|
3
3
|
<Meta title="Foundation Lib/API/Utils" />
|
|
4
4
|
|
|
5
|
-
# Общие утилиты
|
|
5
|
+
# Общие утилиты
|
|
6
6
|
|
|
7
7
|
Модуль `utils` объединяет небольшие технические функции, которые нужны в разных частях React- и TypeScript-приложения:
|
|
8
8
|
|
|
@@ -16,14 +16,14 @@ import { Meta } from "@storybook/addon-docs/blocks";
|
|
|
16
16
|
- копирование древовидной структуры;
|
|
17
17
|
- единая точка вывода ошибок в `console.error`.
|
|
18
18
|
|
|
19
|
-
|
|
19
|
+
Ниже объясняются назначение каждого аргумента, точный результат, побочные эффекты, различия похожих функций и ограничения.
|
|
20
20
|
|
|
21
21
|
> `utils` — это опубликованный entrypoint, а не приглашение складывать сюда любую бизнес-логику. В модуле нет HTTP-запросов, UI-компонентов, доменных правил, нормализации пользовательского ввода и криптографии.
|
|
22
22
|
|
|
23
23
|
## Содержание
|
|
24
24
|
|
|
25
25
|
- [Назначение и границы](#назначение-и-границы)
|
|
26
|
-
- [
|
|
26
|
+
- [Импорт](#импорт)
|
|
27
27
|
- [Среда выполнения](#среда-выполнения)
|
|
28
28
|
- [Минимальные понятия](#минимальные-понятия)
|
|
29
29
|
- [Как выбрать функцию](#как-выбрать-функцию)
|
|
@@ -98,13 +98,7 @@ import { Meta } from "@storybook/addon-docs/blocks";
|
|
|
98
98
|
| UI primitives | `@ryuzaki13/react-foundation-ui/<module>` |
|
|
99
99
|
| Бизнес-преобразование сущности | entity/feature/widget host-приложения |
|
|
100
100
|
|
|
101
|
-
##
|
|
102
|
-
|
|
103
|
-
Установите пакет:
|
|
104
|
-
|
|
105
|
-
```bash
|
|
106
|
-
npm install @ryuzaki13/react-foundation-lib
|
|
107
|
-
```
|
|
101
|
+
## Импорт
|
|
108
102
|
|
|
109
103
|
Entrypoint `/utils` также экспортирует React-функции `childrenCount` и `createLazyComponent`. Поэтому host-приложение должно разрешить совместимую peer dependency React:
|
|
110
104
|
|
|
@@ -2,7 +2,7 @@ import { Meta } from "@storybook/addon-docs/blocks";
|
|
|
2
2
|
|
|
3
3
|
<Meta title="Foundation Lib/Validation/Runtime Guards" />
|
|
4
4
|
|
|
5
|
-
# Runtime guards и validators
|
|
5
|
+
# Runtime guards и validators
|
|
6
6
|
|
|
7
7
|
Модуль содержит небольшие проверки для `unknown`, object-like значений, image extensions, positive integer, URL и Floating UI DOM reference.
|
|
8
8
|
|
|
@@ -10,7 +10,7 @@ import { Meta } from "@storybook/addon-docs/blocks";
|
|
|
10
10
|
|
|
11
11
|
## Содержание
|
|
12
12
|
|
|
13
|
-
- [
|
|
13
|
+
- [Импорт](#импорт)
|
|
14
14
|
- [Как работают type guards](#как-работают-type-guards)
|
|
15
15
|
- [`isSafe`](#issafe)
|
|
16
16
|
- [`isObject`, `isRecord`, `asRecord`](#isobject-isrecord-asrecord)
|
|
@@ -22,7 +22,7 @@ import { Meta } from "@storybook/addon-docs/blocks";
|
|
|
22
22
|
- [Security boundary](#security-boundary)
|
|
23
23
|
- [Полный API](#полный-api)
|
|
24
24
|
|
|
25
|
-
##
|
|
25
|
+
## Импорт
|
|
26
26
|
|
|
27
27
|
```ts
|
|
28
28
|
import {
|
|
@@ -2,15 +2,11 @@ import { Meta } from "@storybook/addon-docs/blocks";
|
|
|
2
2
|
|
|
3
3
|
<Meta title="Foundation Lib/React/Virtualizer Pagination" />
|
|
4
4
|
|
|
5
|
-
# Дозагрузка virtualized списка
|
|
5
|
+
# Дозагрузка virtualized списка
|
|
6
6
|
|
|
7
7
|
`useFetchNextPageEffect` вызывает `fetchNextPage`, когда последняя отрендеренная virtual item достигает конца уже загруженного списка.
|
|
8
8
|
|
|
9
|
-
##
|
|
10
|
-
|
|
11
|
-
```bash
|
|
12
|
-
npm install react @tanstack/react-virtual @ryuzaki13/react-foundation-lib
|
|
13
|
-
```
|
|
9
|
+
## Импорт
|
|
14
10
|
|
|
15
11
|
```ts
|
|
16
12
|
import { useFetchNextPageEffect } from "@ryuzaki13/react-foundation-lib/virtualizer";
|
package/src/xml/README.mdx
CHANGED
|
@@ -2,14 +2,14 @@ import { Meta } from "@storybook/addon-docs/blocks";
|
|
|
2
2
|
|
|
3
3
|
<Meta title="Foundation Lib/Data/XML" />
|
|
4
4
|
|
|
5
|
-
# Простые XML helpers
|
|
5
|
+
# Простые XML helpers
|
|
6
6
|
|
|
7
7
|
Модуль экранирует XML-текст, строит последовательность простых полей и читает текст первого тега через `DOMParser`.
|
|
8
8
|
|
|
9
9
|
## Содержание
|
|
10
10
|
|
|
11
11
|
- [Назначение и границы](#назначение-и-границы)
|
|
12
|
-
- [
|
|
12
|
+
- [Импорт](#импорт)
|
|
13
13
|
- [`escapeXmlValue`](#escapexmlvalue)
|
|
14
14
|
- [`buildXmlFields`](#buildxmlfields)
|
|
15
15
|
- [`getXmlTagText`](#getxmltagtext)
|
|
@@ -33,7 +33,7 @@ import { Meta } from "@storybook/addon-docs/blocks";
|
|
|
33
33
|
- не проверяет parser errors;
|
|
34
34
|
- не выполняет network request.
|
|
35
35
|
|
|
36
|
-
##
|
|
36
|
+
## Импорт
|
|
37
37
|
|
|
38
38
|
```ts
|
|
39
39
|
import { buildXmlFields, escapeXmlValue, getXmlTagText } from "@ryuzaki13/react-foundation-lib/xml";
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import { type WrappedODataParameters } from "../odata-service";
|
|
2
|
-
/** Runtime-режим валюты, который задается общим OData-параметром страницы. */
|
|
3
|
-
export type CurrencyMode = "internal" | "rub";
|
|
4
|
-
/** Собирает display-подпись с валютным суффиксом. */
|
|
5
|
-
export declare function resolveCurrencyAwareLabel(label: string, currencyLabels: readonly [string, string] | undefined, currencyMode: CurrencyMode | null | undefined): string;
|
|
6
|
-
/** Определяет режим валюты по общему OData-параметру `p_curr`. */
|
|
7
|
-
export declare function resolveCurrencyModeFromODataParameters(params?: WrappedODataParameters): CurrencyMode | null;
|
|
8
|
-
//# sourceMappingURL=currency.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"currency.d.ts","sourceRoot":"","sources":["../../src/currency/currency.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAI/D,8EAA8E;AAC9E,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,KAAK,CAAC;AAE9C,qDAAqD;AACrD,wBAAgB,yBAAyB,CACxC,KAAK,EAAE,MAAM,EACb,cAAc,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,EACrD,YAAY,EAAE,YAAY,GAAG,IAAI,GAAG,SAAS,GAC3C,MAAM,CAWR;AAED,kEAAkE;AAClE,wBAAgB,sCAAsC,CAAC,MAAM,CAAC,EAAE,sBAAsB,GAAG,YAAY,GAAG,IAAI,CAU3G"}
|
package/dist/currency/index.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/currency/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC"}
|
package/dist/currency/index.js
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
//#region src/currency/currency.ts
|
|
2
|
-
var e = "p_curr";
|
|
3
|
-
function t(e, t, n) {
|
|
4
|
-
if (!t || !n) return e;
|
|
5
|
-
let r = t[n === "internal" ? 0 : 1]?.trim() ?? "", i = r.startsWith(",");
|
|
6
|
-
return r ? `${e}${i ? "" : " "}${r}` : e;
|
|
7
|
-
}
|
|
8
|
-
function n(t) {
|
|
9
|
-
if (!t || !Object.prototype.hasOwnProperty.call(t, e)) return null;
|
|
10
|
-
let n = t[e]?.value;
|
|
11
|
-
return n === !1 ? "internal" : n === !0 ? "rub" : null;
|
|
12
|
-
}
|
|
13
|
-
//#endregion
|
|
14
|
-
export { t as resolveCurrencyAwareLabel, n as resolveCurrencyModeFromODataParameters };
|
|
15
|
-
|
|
16
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../src/currency/currency.ts"],"sourcesContent":["import { type WrappedODataParameters } from \"../odata-service\";\n\nconst CURRENCY_PARAMETER_ID = \"p_curr\";\n\n/** Runtime-режим валюты, который задается общим OData-параметром страницы. */\nexport type CurrencyMode = \"internal\" | \"rub\";\n\n/** Собирает display-подпись с валютным суффиксом. */\nexport function resolveCurrencyAwareLabel(\n\tlabel: string,\n\tcurrencyLabels: readonly [string, string] | undefined,\n\tcurrencyMode: CurrencyMode | null | undefined\n): string {\n\tif (!currencyLabels || !currencyMode) {\n\t\treturn label;\n\t}\n\n\tconst currencyLabelIndex = currencyMode === \"internal\" ? 0 : 1;\n\tconst currencyLabel = currencyLabels[currencyLabelIndex]?.trim() ?? \"\";\n\tconst hasComma = currencyLabel.startsWith(\",\");\n\n\t// NOTE: нужно закрепить правило, что запятая ставится в currencyLabel\n\treturn currencyLabel ? `${label}${hasComma ? \"\" : \" \"}${currencyLabel}` : label;\n}\n\n/** Определяет режим валюты по общему OData-параметру `p_curr`. */\nexport function resolveCurrencyModeFromODataParameters(params?: WrappedODataParameters): CurrencyMode | null {\n\tif (!params || !Object.prototype.hasOwnProperty.call(params, CURRENCY_PARAMETER_ID)) {\n\t\treturn null;\n\t}\n\n\tconst value = params[CURRENCY_PARAMETER_ID]?.value;\n\tif (value === false) return \"internal\";\n\tif (value === true) return \"rub\";\n\n\treturn null;\n}\n"],"mappings":";AAEA,IAAM,IAAwB;AAM9B,SAAgB,EACf,GACA,GACA,GACS;CACT,IAAI,CAAC,KAAkB,CAAC,GACvB,OAAO;CAIR,IAAM,IAAgB,EADK,MAAiB,aAAa,IAAI,EACL,EAAE,KAAK,KAAK,IAC9D,IAAW,EAAc,WAAW,GAAG;CAG7C,OAAO,IAAgB,GAAG,IAAQ,IAAW,KAAK,MAAM,MAAkB;AAC3E;AAGA,SAAgB,EAAuC,GAAsD;CAC5G,IAAI,CAAC,KAAU,CAAC,OAAO,UAAU,eAAe,KAAK,GAAQ,CAAqB,GACjF,OAAO;CAGR,IAAM,IAAQ,EAAO,EAAsB,EAAE;CAI7C,OAHI,MAAU,KAAc,aACxB,MAAU,KAAa,QAEpB;AACR"}
|
package/src/currency/README.mdx
DELETED
|
@@ -1,155 +0,0 @@
|
|
|
1
|
-
import { Meta } from "@storybook/addon-docs/blocks";
|
|
2
|
-
|
|
3
|
-
<Meta title="Foundation Lib/Data/Currency" />
|
|
4
|
-
|
|
5
|
-
# Валютные подписи через `@ryuzaki13/react-foundation-lib/currency`
|
|
6
|
-
|
|
7
|
-
Модуль связывает общий OData-параметр `p_curr` с отображаемой подписью показателя. Он определяет один из двух режимов валюты и добавляет соответствующий суффикс к label.
|
|
8
|
-
|
|
9
|
-
## Содержание
|
|
10
|
-
|
|
11
|
-
- [Назначение](#назначение)
|
|
12
|
-
- [Установка и импорт](#установка-и-импорт)
|
|
13
|
-
- [`CurrencyMode`](#currencymode)
|
|
14
|
-
- [`resolveCurrencyModeFromODataParameters`](#resolvecurrencymodefromodataparameters)
|
|
15
|
-
- [`resolveCurrencyAwareLabel`](#resolvecurrencyawarelabel)
|
|
16
|
-
- [Готовый pipeline](#готовый-pipeline)
|
|
17
|
-
- [Ограничения и ошибки](#ограничения-и-ошибки)
|
|
18
|
-
- [API-справочник](#api-справочник)
|
|
19
|
-
|
|
20
|
-
## Назначение
|
|
21
|
-
|
|
22
|
-
```text
|
|
23
|
-
wrapped OData params
|
|
24
|
-
{ p_curr: { value: true } }
|
|
25
|
-
│
|
|
26
|
-
▼
|
|
27
|
-
CurrencyMode "rub"
|
|
28
|
-
│
|
|
29
|
-
▼
|
|
30
|
-
"Выручка" + ["за тн", "руб/тн"]
|
|
31
|
-
│
|
|
32
|
-
▼
|
|
33
|
-
"Выручка руб/тн"
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
Модуль не форматирует денежное число, не конвертирует валюту и не строит OData query. Для чисел используйте `/formatters`, для OData params — `/odata-service`.
|
|
37
|
-
|
|
38
|
-
## Установка и импорт
|
|
39
|
-
|
|
40
|
-
```ts
|
|
41
|
-
import { resolveCurrencyAwareLabel, resolveCurrencyModeFromODataParameters } from "@ryuzaki13/react-foundation-lib/currency";
|
|
42
|
-
|
|
43
|
-
import type { CurrencyMode } from "@ryuzaki13/react-foundation-lib/currency";
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
Модуль ESM, не требует React или browser API. Параметры должны иметь публичную wrapped-форму из `/odata-service`.
|
|
47
|
-
|
|
48
|
-
## `CurrencyMode`
|
|
49
|
-
|
|
50
|
-
```ts
|
|
51
|
-
type CurrencyMode = "internal" | "rub";
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
- `internal` — внутренний режим;
|
|
55
|
-
- `rub` — рублёвый режим.
|
|
56
|
-
|
|
57
|
-
`null` используется resolver-функцией, когда режим определить нельзя.
|
|
58
|
-
|
|
59
|
-
## `resolveCurrencyModeFromODataParameters`
|
|
60
|
-
|
|
61
|
-
```ts
|
|
62
|
-
const mode = resolveCurrencyModeFromODataParameters(params);
|
|
63
|
-
```
|
|
64
|
-
|
|
65
|
-
Функция читает только собственное поле `p_curr.value`:
|
|
66
|
-
|
|
67
|
-
| Вход | Результат |
|
|
68
|
-
| ------------------------------- | ------------ |
|
|
69
|
-
| параметров нет | `null` |
|
|
70
|
-
| поля `p_curr` нет | `null` |
|
|
71
|
-
| `{ p_curr: { value: false } }` | `"internal"` |
|
|
72
|
-
| `{ p_curr: { value: true } }` | `"rub"` |
|
|
73
|
-
| `{ p_curr: { value: "true" } }` | `null` |
|
|
74
|
-
| `{ p_curr: { value: 1 } }` | `null` |
|
|
75
|
-
|
|
76
|
-
Строка `"true"` намеренно не приводится к boolean. Нормализуйте внешний payload на OData boundary, а не внутри UI label.
|
|
77
|
-
|
|
78
|
-
Пример с helper `/odata-service`:
|
|
79
|
-
|
|
80
|
-
```ts
|
|
81
|
-
import { wrapODataParams } from "@ryuzaki13/react-foundation-lib/odata-service";
|
|
82
|
-
|
|
83
|
-
const params = wrapODataParams({ p_curr: true });
|
|
84
|
-
const mode = resolveCurrencyModeFromODataParameters(params);
|
|
85
|
-
// "rub".
|
|
86
|
-
```
|
|
87
|
-
|
|
88
|
-
## `resolveCurrencyAwareLabel`
|
|
89
|
-
|
|
90
|
-
```ts
|
|
91
|
-
const label = resolveCurrencyAwareLabel("Выручка", ["за тн", "руб/тн"], "rub");
|
|
92
|
-
// "Выручка руб/тн".
|
|
93
|
-
```
|
|
94
|
-
|
|
95
|
-
Пара `currencyLabels` имеет фиксированный смысл:
|
|
96
|
-
|
|
97
|
-
```ts
|
|
98
|
-
readonly[(internalLabel, rubLabel)];
|
|
99
|
-
```
|
|
100
|
-
|
|
101
|
-
| Mode | Индекс суффикса |
|
|
102
|
-
| ---------- | --------------: |
|
|
103
|
-
| `internal` | 0 |
|
|
104
|
-
| `rub` | 1 |
|
|
105
|
-
|
|
106
|
-
Точные правила:
|
|
107
|
-
|
|
108
|
-
- без `currencyLabels` возвращается исходный `label`;
|
|
109
|
-
- при `null`/`undefined` mode возвращается исходный `label`;
|
|
110
|
-
- суффикс обрезается через `trim()`;
|
|
111
|
-
- пустой суффикс не добавляется;
|
|
112
|
-
- обычно между label и суффиксом добавляется один пробел;
|
|
113
|
-
- если обрезанный суффикс начинается с запятой, дополнительный пробел не добавляется.
|
|
114
|
-
|
|
115
|
-
```ts
|
|
116
|
-
resolveCurrencyAwareLabel("Выручка", [", за тн", ", руб/тн"], "rub");
|
|
117
|
-
// "Выручка, руб/тн".
|
|
118
|
-
|
|
119
|
-
resolveCurrencyAwareLabel("Выручка", ["", " "], "rub");
|
|
120
|
-
// "Выручка".
|
|
121
|
-
```
|
|
122
|
-
|
|
123
|
-
Исходный `label` не обрезается и не нормализуется.
|
|
124
|
-
|
|
125
|
-
## Готовый pipeline
|
|
126
|
-
|
|
127
|
-
```ts
|
|
128
|
-
function buildMetricLabel(
|
|
129
|
-
baseLabel: string,
|
|
130
|
-
currencyLabels: readonly [string, string] | undefined,
|
|
131
|
-
params: WrappedODataParameters | undefined
|
|
132
|
-
) {
|
|
133
|
-
const mode = resolveCurrencyModeFromODataParameters(params);
|
|
134
|
-
return resolveCurrencyAwareLabel(baseLabel, currencyLabels, mode);
|
|
135
|
-
}
|
|
136
|
-
```
|
|
137
|
-
|
|
138
|
-
Resolver чистый: одинаковый вход даёт одинаковую строку и не меняет params/labels.
|
|
139
|
-
|
|
140
|
-
## Ограничения и ошибки
|
|
141
|
-
|
|
142
|
-
- Поддерживается только параметр с точным id `p_curr`.
|
|
143
|
-
- Поддерживаются только два режима; код валюты `USD`, `EUR` и exchange rate не обрабатываются.
|
|
144
|
-
- Функция не проверяет грамматику и единицы измерения.
|
|
145
|
-
- Запятая должна входить в сам суффикс, если нужна форма `"Выручка, руб"`.
|
|
146
|
-
- Не передавайте плоский `{ p_curr: true }`: ожидается `{ p_curr: { value: true } }`.
|
|
147
|
-
- Не используйте label helper для финансовых вычислений.
|
|
148
|
-
|
|
149
|
-
## API-справочник
|
|
150
|
-
|
|
151
|
-
| Export | Результат |
|
|
152
|
-
| ---------------------------------------- | ----------------------- |
|
|
153
|
-
| `CurrencyMode` | `"internal" \| "rub"` |
|
|
154
|
-
| `resolveCurrencyModeFromODataParameters` | `CurrencyMode \| null` |
|
|
155
|
-
| `resolveCurrencyAwareLabel` | Итоговая display-строка |
|