@ryuzaki13/react-foundation-lib 2.22.0 → 2.24.0
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/analytical-table/buildAnalyticalTableModel.d.ts +5 -2
- package/dist/analytical-table/buildAnalyticalTableModel.d.ts.map +1 -1
- package/dist/analytical-table/{calculations.d.ts → definition/calculations.d.ts} +1 -1
- package/dist/analytical-table/definition/calculations.d.ts.map +1 -0
- package/dist/analytical-table/definition/compileAnalyticalTableDefinition.d.ts +4 -0
- package/dist/analytical-table/definition/compileAnalyticalTableDefinition.d.ts.map +1 -0
- package/dist/analytical-table/definition/types.d.ts +70 -0
- package/dist/analytical-table/definition/types.d.ts.map +1 -0
- package/dist/analytical-table/definition/validateAnalyticalView.d.ts +5 -0
- package/dist/analytical-table/definition/validateAnalyticalView.d.ts.map +1 -0
- package/dist/analytical-table/{dateColumns.d.ts → dynamic-columns/dateColumns.d.ts} +2 -1
- package/dist/analytical-table/dynamic-columns/dateColumns.d.ts.map +1 -0
- package/dist/analytical-table/dynamic-columns/index.d.ts +3 -0
- package/dist/analytical-table/dynamic-columns/index.d.ts.map +1 -0
- package/dist/analytical-table/{dateColumnTypes.d.ts → dynamic-columns/types.d.ts} +3 -3
- package/dist/analytical-table/dynamic-columns/types.d.ts.map +1 -0
- package/dist/analytical-table/index.d.ts +7 -5
- package/dist/analytical-table/index.d.ts.map +1 -1
- package/dist/analytical-table/index.js +348 -187
- package/dist/analytical-table/index.js.map +1 -1
- package/dist/analytical-table/projections/expansion.d.ts +4 -0
- package/dist/analytical-table/projections/expansion.d.ts.map +1 -0
- package/dist/analytical-table/{exportProjection.d.ts → projections/exportProjection.d.ts} +1 -1
- package/dist/analytical-table/projections/exportProjection.d.ts.map +1 -0
- package/dist/analytical-table/projections/indexAnalyticalRows.d.ts +4 -0
- package/dist/analytical-table/projections/indexAnalyticalRows.d.ts.map +1 -0
- package/dist/analytical-table/projections/resolveRowsProjection.d.ts +4 -0
- package/dist/analytical-table/projections/resolveRowsProjection.d.ts.map +1 -0
- package/dist/analytical-table/{exportTypes.d.ts → projections/types.d.ts} +2 -2
- package/dist/analytical-table/projections/types.d.ts.map +1 -0
- package/dist/analytical-table/{aggregation.d.ts → runtime/aggregation.d.ts} +1 -1
- package/dist/analytical-table/runtime/aggregation.d.ts.map +1 -0
- package/dist/analytical-table/runtime/buildGroupedModel.d.ts +11 -0
- package/dist/analytical-table/runtime/buildGroupedModel.d.ts.map +1 -0
- package/dist/analytical-table/runtime/createAnalyticalTableRuntime.d.ts +10 -0
- package/dist/analytical-table/runtime/createAnalyticalTableRuntime.d.ts.map +1 -0
- package/dist/analytical-table/runtime/filtering.d.ts +7 -0
- package/dist/analytical-table/runtime/filtering.d.ts.map +1 -0
- package/dist/analytical-table/runtime/grouping.d.ts +10 -0
- package/dist/analytical-table/runtime/grouping.d.ts.map +1 -0
- package/dist/analytical-table/runtime/hierarchy.d.ts +20 -0
- package/dist/analytical-table/runtime/hierarchy.d.ts.map +1 -0
- package/dist/analytical-table/runtime/sorting.d.ts +5 -0
- package/dist/analytical-table/runtime/sorting.d.ts.map +1 -0
- package/dist/analytical-table/runtime/totals.d.ts +12 -0
- package/dist/analytical-table/runtime/totals.d.ts.map +1 -0
- package/dist/analytical-table/runtime/types.d.ts +71 -0
- package/dist/analytical-table/runtime/types.d.ts.map +1 -0
- package/dist/analytical-table/{valueComparison.d.ts → runtime/valueComparison.d.ts} +1 -1
- package/dist/analytical-table/runtime/valueComparison.d.ts.map +1 -0
- package/dist/analytical-table/types.d.ts +4 -7
- package/dist/analytical-table/types.d.ts.map +1 -1
- package/dist/chunks/{formatters-DNrfrzK0.js → formatters-DVqfmx3V.js} +293 -283
- package/dist/chunks/formatters-DVqfmx3V.js.map +1 -0
- package/dist/error-report/index.js +1 -1
- package/dist/formatters/formatDurationMinutes.d.ts +7 -0
- package/dist/formatters/formatDurationMinutes.d.ts.map +1 -0
- package/dist/formatters/index.d.ts +1 -0
- package/dist/formatters/index.d.ts.map +1 -1
- package/dist/formatters/index.js +5 -5
- package/dist/odata-service/formatters.d.ts +2 -2
- package/dist/table/index.js.map +1 -1
- package/dist/table/useTableRowSelection.d.ts +1 -1
- package/dist/table/useTableRowSelection.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/analytical-table/README.mdx +232 -143
- package/src/formatters/README.mdx +18 -0
- package/dist/analytical-table/aggregation.d.ts.map +0 -1
- package/dist/analytical-table/calculationTypes.d.ts +0 -11
- package/dist/analytical-table/calculationTypes.d.ts.map +0 -1
- package/dist/analytical-table/calculations.d.ts.map +0 -1
- package/dist/analytical-table/columnTypes.d.ts +0 -30
- package/dist/analytical-table/columnTypes.d.ts.map +0 -1
- package/dist/analytical-table/dataTypes.d.ts +0 -14
- package/dist/analytical-table/dataTypes.d.ts.map +0 -1
- package/dist/analytical-table/dateColumnTypes.d.ts.map +0 -1
- package/dist/analytical-table/dateColumns.d.ts.map +0 -1
- package/dist/analytical-table/expansion.d.ts +0 -4
- package/dist/analytical-table/expansion.d.ts.map +0 -1
- package/dist/analytical-table/exportProjection.d.ts.map +0 -1
- package/dist/analytical-table/exportTypes.d.ts.map +0 -1
- package/dist/analytical-table/filtering.d.ts +0 -4
- package/dist/analytical-table/filtering.d.ts.map +0 -1
- package/dist/analytical-table/indexAnalyticalRows.d.ts +0 -4
- package/dist/analytical-table/indexAnalyticalRows.d.ts.map +0 -1
- package/dist/analytical-table/modelTypes.d.ts +0 -43
- package/dist/analytical-table/modelTypes.d.ts.map +0 -1
- package/dist/analytical-table/valueComparison.d.ts.map +0 -1
- package/dist/analytical-table/viewTypes.d.ts +0 -24
- package/dist/analytical-table/viewTypes.d.ts.map +0 -1
- package/dist/chunks/formatters-DNrfrzK0.js.map +0 -1
|
@@ -1,41 +1,22 @@
|
|
|
1
|
-
# Analytical Table:
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
рекурсивно: `original` остаётся ссылкой на неизменяемую запись потребителя.
|
|
18
|
-
|
|
19
|
-
`AnalyticalColumn<T>` задаёт идентификатор, подпись, тип значения, необязательные
|
|
20
|
-
сравнение, фильтр, агрегацию и вычисление. В столбцах должны присутствовать также
|
|
21
|
-
скрытые зависимости формул. Ключи и отображаемые поля группировки могут ссылаться
|
|
22
|
-
прямо на поля values, не создавая технических столбцов интерфейса. Видимость, ширина,
|
|
23
|
-
закрепление и порядок столбцов относятся к UI и не должны пересчитывать модель.
|
|
24
|
-
Форматирование значений выполняется существующим `/formatters` на границе UI или
|
|
25
|
-
экспорта; runtime сохраняет числа числами.
|
|
26
|
-
|
|
27
|
-
`AnalyticalViewState` содержит группировки, сортировку, фильтры и идентификаторы
|
|
28
|
-
раскрытых строк. Оно сериализуемо, но не является загружаемыми данными.
|
|
29
|
-
`AnalyticalTableModel` содержит дерево `rows`, все строки `flatRows`, видимые строки
|
|
30
|
-
`visibleRows`, индекс `rowById`, общие итоги `grandTotals` и диагностику иерархии.
|
|
31
|
-
`Map` результата вычисляется локально: передавать его через serverFn не требуется.
|
|
1
|
+
# Analytical Table: модель полного снимка
|
|
2
|
+
|
|
3
|
+
`@ryuzaki13/react-foundation-lib/analytical-table` строит дерево, группировки,
|
|
4
|
+
фильтры, вычисляемые значения и итоги уже загруженных данных. Модуль работает в
|
|
5
|
+
SSR и браузере без React hooks, DOM, QueryClient, serverFn или OData. Загрузка,
|
|
6
|
+
отмена запросов, ошибки и авторизация остаются у транспорта потребителя.
|
|
7
|
+
|
|
8
|
+
Для одного расчёта используйте `buildAnalyticalTableModel`. Для таблицы, в которой
|
|
9
|
+
пользователь меняет фильтры, сортировку и раскрытие, один раз скомпилируйте описание
|
|
10
|
+
и создайте runtime на текущий снимок. Оба способа используют один вычислительный
|
|
11
|
+
конвейер и возвращают `AnalyticalTableModel`.
|
|
12
|
+
|
|
13
|
+
## Один вызов
|
|
14
|
+
|
|
15
|
+
Прежняя точка входа сохраняет сигнатуру и подходит для разового построения модели,
|
|
16
|
+
экспорта или простого потребителя без повторных изменений представления.
|
|
32
17
|
|
|
33
18
|
```ts
|
|
34
|
-
import {
|
|
35
|
-
buildAnalyticalTableModel,
|
|
36
|
-
projectAnalyticalTableExpansion,
|
|
37
|
-
type AnalyticalSnapshot
|
|
38
|
-
} from "@ryuzaki13/react-foundation-lib/analytical-table";
|
|
19
|
+
import { buildAnalyticalTableModel, type AnalyticalSnapshot } from "@ryuzaki13/react-foundation-lib/analytical-table";
|
|
39
20
|
|
|
40
21
|
const snapshot: AnalyticalSnapshot = {
|
|
41
22
|
rows: [
|
|
@@ -51,119 +32,227 @@ const model = buildAnalyticalTableModel({
|
|
|
51
32
|
],
|
|
52
33
|
state: {
|
|
53
34
|
grouping: [{ id: "customer", keyColumnIds: ["customer"] }],
|
|
54
|
-
sorting: [{ id: "amount", desc: true }]
|
|
35
|
+
sorting: [{ id: "amount", desc: true }],
|
|
36
|
+
expandedRowIds: "all"
|
|
55
37
|
}
|
|
56
38
|
});
|
|
57
|
-
|
|
39
|
+
// Общий итог — 100: дочерняя детализация не прибавляется к корню второй раз.
|
|
58
40
|
```
|
|
59
41
|
|
|
60
|
-
##
|
|
42
|
+
## Описание и runtime для интерактивной таблицы
|
|
43
|
+
|
|
44
|
+
`compileAnalyticalTableDefinition` проверяет описание, индексирует поля и
|
|
45
|
+
компилирует зависимости формул. `createAnalyticalTableRuntime` готовит исходные
|
|
46
|
+
строки одного снимка; `runtime.getModel(state)` меняет его представление.
|
|
47
|
+
|
|
48
|
+
```ts
|
|
49
|
+
import {
|
|
50
|
+
compileAnalyticalTableDefinition,
|
|
51
|
+
createAnalyticalTableRuntime,
|
|
52
|
+
type AnalyticalGroupingLevel,
|
|
53
|
+
type AnalyticalSnapshot,
|
|
54
|
+
type AnalyticalSorting
|
|
55
|
+
} from "@ryuzaki13/react-foundation-lib/analytical-table";
|
|
56
|
+
|
|
57
|
+
const definition = compileAnalyticalTableDefinition({
|
|
58
|
+
columns: [
|
|
59
|
+
{ id: "customerName", label: "Покупатель", kind: "dimension" },
|
|
60
|
+
{
|
|
61
|
+
id: "averagePrice",
|
|
62
|
+
label: "Средняя цена",
|
|
63
|
+
kind: "measure",
|
|
64
|
+
calculate: {
|
|
65
|
+
dependencies: ["amount", "quantity"],
|
|
66
|
+
compute: (values) => (Number(values.quantity) > 0 ? Number(values.amount) / Number(values.quantity) : null)
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
],
|
|
70
|
+
dataFields: [
|
|
71
|
+
{ id: "customerId" },
|
|
72
|
+
{ id: "quantity", aggregate: "sum" },
|
|
73
|
+
{ id: "price" },
|
|
74
|
+
{
|
|
75
|
+
id: "amount",
|
|
76
|
+
aggregate: "sum",
|
|
77
|
+
calculate: { dependencies: ["quantity", "price"], compute: (values) => Number(values.quantity) * Number(values.price) }
|
|
78
|
+
}
|
|
79
|
+
],
|
|
80
|
+
grandTotalsScope: "filtered"
|
|
81
|
+
});
|
|
82
|
+
const snapshot: AnalyticalSnapshot = {
|
|
83
|
+
rows: [
|
|
84
|
+
{ id: "order:1", values: { customerId: "a", customerName: "Компания А", quantity: 2, price: 30 } },
|
|
85
|
+
{ id: "order:2", values: { customerId: "a", customerName: "Компания А", quantity: 1, price: 120 } }
|
|
86
|
+
]
|
|
87
|
+
};
|
|
88
|
+
const runtime = createAnalyticalTableRuntime({ definition, snapshot });
|
|
89
|
+
const grouping: readonly AnalyticalGroupingLevel[] = [{ id: "customer", keyColumnIds: ["customerId"], displayColumnIds: ["customerName"] }];
|
|
90
|
+
const sorting: readonly AnalyticalSorting[] = [{ id: "averagePrice", desc: true }];
|
|
91
|
+
|
|
92
|
+
const initial = runtime.getModel({ grouping });
|
|
93
|
+
const sorted = runtime.getModel({ grouping, sorting });
|
|
94
|
+
const expanded = runtime.getModel({ grouping, sorting, expandedRowIds: "all" });
|
|
95
|
+
// Итоговая средняя цена — 60: (2 × 30 + 1 × 120) / (2 + 1).
|
|
96
|
+
// Сортировка и раскрытие не запускают формулы и агрегации повторно.
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
`columns` — столбцы представления. Колонка, которую пользователь временно скрыл,
|
|
100
|
+
остаётся в этом массиве: её видимость управляется UI. `dataFields` — служебные
|
|
101
|
+
поля с теми же возможностями вычисления, сравнения и агрегации; они доступны
|
|
102
|
+
формулам и итогам, но не попадают в `model.columns`. Поэтому зависимость вроде
|
|
103
|
+
`amount` не требует фиктивной скрытой колонки интерфейса. Идентификаторы уникальны
|
|
104
|
+
в общем каталоге `columns` + `dataFields`; зависимости формул должны быть объявлены
|
|
105
|
+
в одном из этих массивов. Поля, используемые только как ключи или подписи групп,
|
|
106
|
+
могут ссылаться прямо на `values` без отдельного дескриптора.
|
|
107
|
+
|
|
108
|
+
Runtime хранит **последний результат каждого этапа** внутри своего экземпляра.
|
|
109
|
+
Глобального кэша, истории снимков или транспортного кэша здесь нет. Массивы фильтров,
|
|
110
|
+
группировок, сортировки и раскрытия сравниваются по ссылке. Сохраняйте ссылку, пока
|
|
111
|
+
содержимое не изменилось; новый равный массив может повторно запустить свой этап.
|
|
112
|
+
Мутировать описание, снимок, элементы состояния или их массивы после передачи нельзя.
|
|
113
|
+
|
|
114
|
+
| Что изменилось | Что пересчитывается |
|
|
115
|
+
| -------------------------------------- | --------------------------------------------------------------------------------------------------- |
|
|
116
|
+
| Описание, поля или правила вычисления | Новая компиляция и новый runtime: исходные формулы и все следующие этапы. |
|
|
117
|
+
| `snapshot.rows` | Новый runtime с прежним скомпилированным описанием: исходные формулы и все следующие этапы. |
|
|
118
|
+
| Фильтры | Отбор, группировки и итоги, затем сортировка и раскрытие. Исходные формулы повторно не исполняются. |
|
|
119
|
+
| Группировки | Группировки и итоги, затем сортировка и раскрытие. Исходные формулы и готовый отбор сохраняются. |
|
|
120
|
+
| Сортировка | Порядок соседних строк и индексы; затем применяется раскрытие. Формулы и итоги сохраняются. |
|
|
121
|
+
| Раскрытие | Флаги раскрытия и индексы видимости. Формулы, группировки и итоги сохраняются. |
|
|
122
|
+
| Ширины, закрепление, видимость колонок | Это состояние UI; оно не входит в вычислительный runtime. |
|
|
61
123
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
124
|
+
Для новых `rows` создавайте новый runtime: существующий экземпляр не переключает
|
|
125
|
+
снимок. В React описание можно мемоизировать по его конфигурации, runtime — по
|
|
126
|
+
скомпилированному описанию и `snapshot.rows`. Обновление времени запроса при прежней
|
|
127
|
+
ссылке `rows` не требует нового runtime. Изменение реестра используемых формул также
|
|
128
|
+
требует повторной компиляции описания.
|
|
129
|
+
|
|
130
|
+
## Данные и карта исходников
|
|
131
|
+
|
|
132
|
+
`AnalyticalSnapshot<T>` содержит `rows`. Строка имеет стабильный `id`, необязательный
|
|
133
|
+
`parentId`, `values`, предметный `kind` и исходный DTO `original`. Номер позиции не
|
|
134
|
+
подходит для ID: обновление и сортировка должны сохранять identity. Runtime не
|
|
135
|
+
мутирует снимок и не копирует DTO рекурсивно — `original` сохраняет исходную ссылку.
|
|
136
|
+
|
|
137
|
+
`AnalyticalViewState` содержит только группировки, сортировку, фильтры и раскрытие.
|
|
138
|
+
Результат содержит дерево `rows`, все строки `flatRows`, видимые `visibleRows`,
|
|
139
|
+
`rowById`, `grandTotals` и `diagnostics`. Индекс `Map` вычисляется локально; передавать
|
|
140
|
+
модель через serverFn не требуется. Числа остаются числами; отображение использует
|
|
141
|
+
`/formatters` на границе UI или экспорта.
|
|
142
|
+
|
|
143
|
+
| Каталог | Ответственность |
|
|
144
|
+
| ----------------- | ------------------------------------------------------------------------------ |
|
|
145
|
+
| `definition` | Контракты описания, каталог полей, проверка зависимостей и компиляция формул. |
|
|
146
|
+
| `runtime` | Подготовка одного снимка, дерево, фильтрация, группировка, итоги и сортировка. |
|
|
147
|
+
| `dynamic-columns` | Календарные интервалы и проекция уже загруженных фактов в динамические ячейки. |
|
|
148
|
+
| `projections` | Раскрытие, согласованные индексы дерева и подготовка экспорта. |
|
|
149
|
+
|
|
150
|
+
Эта карта предназначена для сопровождения исходников. Потребители импортируют
|
|
151
|
+
публичные функции и типы только из `/analytical-table`.
|
|
152
|
+
|
|
153
|
+
## Иерархия, группировки и фильтры
|
|
154
|
+
|
|
155
|
+
Исходная иерархия строится через `/tree-table`: повторяющиеся ID, сироты и циклы
|
|
156
|
+
попадают в диагностику по правилам этого модуля. Пустой ID запрещён. Дополнительная
|
|
157
|
+
группировка объединяет только корневые ветви; исходные дети сохраняют родителей.
|
|
67
158
|
|
|
68
159
|
`AnalyticalGroupingLevel` задаёт `id`, составной `keyColumnIds` и отдельные
|
|
69
|
-
`displayColumnIds`.
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
`
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
`calculateAnalyticalValues`
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
`
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
Их приведение с явной timezone-политикой выполняет адаптер до передачи в runtime.
|
|
134
|
-
Неверные границы — ошибка; неверные факты и факты вне диапазона пропускаются.
|
|
160
|
+
`displayColumnIds`. ID группы зависит от пути ключей и типов, а не от подписи или
|
|
161
|
+
порядка строк. Число, строка, `null` и `undefined` различаются. Отображаемые поля
|
|
162
|
+
берутся из первой строки группы и должны однозначно определяться ключом. Пустой
|
|
163
|
+
список ключей и повторяющиеся уровни отклоняются. Сортировка и фильтры требуют
|
|
164
|
+
дескриптора поля из `columns` или `dataFields`.
|
|
165
|
+
|
|
166
|
+
Сортировка действует между соседями каждого уровня и сохраняет исходный порядок
|
|
167
|
+
при равенстве. Строки сравниваются через `/string-comparison`, календарные значения —
|
|
168
|
+
через `/formatters`; собственная семантика задаётся `compare`.
|
|
169
|
+
|
|
170
|
+
Фильтры поддерживают `equals`, `notEquals`, `contains`, `startsWith`, `in`, `between`,
|
|
171
|
+
`gt`, `gte`, `lt`, `lte`, `empty`, `notEmpty`. Текстовые `contains` и `startsWith` не
|
|
172
|
+
зависят от регистра. Условия объединяются через AND и применяются к вычисленным
|
|
173
|
+
исходным строкам **до** группировки: совпавший родитель сохраняет всю ветвь,
|
|
174
|
+
совпавший ребёнок — путь к нему. Для предметной семантики предусмотрен `filter` поля.
|
|
175
|
+
|
|
176
|
+
## Итоги и формулы
|
|
177
|
+
|
|
178
|
+
По умолчанию агрегируются исходные корни: дочерняя детализация не удваивает их
|
|
179
|
+
меры. `isAggregateRow` задаёт другую зернистость. `aggregate` поля поддерживает
|
|
180
|
+
`sum`, `min`, `max`, `avg`, `count` и callback. Числовые операции принимают только
|
|
181
|
+
конечные числа; преобразование DTO выполняет адаптер. Пустое числовое множество
|
|
182
|
+
даёт `null`; `count` считает непустые значения, включая ноль и `false`, и даёт 0
|
|
183
|
+
для пустого множества.
|
|
184
|
+
|
|
185
|
+
`aggregate(context)` описания возвращает групповые/общие значения и может
|
|
186
|
+
переопределить стандартные агрегаты. Контекст содержит `scope`, `groupingPath` и
|
|
187
|
+
исходные строки выбранной зернистости. Взвешенные доли следует вычислять из сумм
|
|
188
|
+
числителя и знаменателя, а не усреднять готовые проценты.
|
|
189
|
+
|
|
190
|
+
`grandTotalsScope: "filtered"` по умолчанию учитывает оставшиеся ветви; `"all"`
|
|
191
|
+
сохраняет итог полного снимка при фильтрации. `grandTotals: false` отключает его
|
|
192
|
+
расчёт. Сортировка, раскрытие и выбор строк не изменяют состав общих итогов.
|
|
193
|
+
|
|
194
|
+
`formula` задаёт `formulaId` и упорядоченные `dependencies` для существующего
|
|
195
|
+
реестра `/formulas`; им владеет composition root приложения. `calculate` задаёт
|
|
196
|
+
зависимости и чистый `compute(values)`. Одновременно задать оба способа нельзя.
|
|
197
|
+
Компиляция проверяет уникальность полей, неизвестные зависимости и циклы.
|
|
198
|
+
|
|
199
|
+
Исходные формулы вычисляются один раз при создании runtime. При изменении фильтров
|
|
200
|
+
или группировок зависимые итоговые формулы выполняются над новыми итогами. Явный
|
|
201
|
+
агрегат поля, результат `aggregate(context)` и значения пути имеют приоритет над
|
|
202
|
+
построчной формулой этого поля: сумма произведений сохраняется, а отношение сумм
|
|
203
|
+
вычисляется заново. Формулы должны учитывать отсутствующие поля итоговой строки;
|
|
204
|
+
ошибки конфигурации и исполнения не скрываются успешным нулём.
|
|
205
|
+
|
|
206
|
+
Низкоуровневые `createAnalyticalCalculationPlan(fields, requiredColumnIds?)` и
|
|
207
|
+
`calculateAnalyticalValues(values, plan)` остаются доступны для самостоятельных
|
|
208
|
+
вычислений; обычному потребителю достаточно скомпилированного описания.
|
|
209
|
+
|
|
210
|
+
## Календарные столбцы
|
|
211
|
+
|
|
212
|
+
`createAnalyticalDateColumnsPlan` строит `day/week/month/quarter/year` интервалы с
|
|
213
|
+
включительными `from`/`to`; неделя начинается в понедельник. ID содержит
|
|
214
|
+
гранулярность и начало периода; крайние интервалы обрезаются диапазоном. По
|
|
215
|
+
умолчанию разрешено до 366 столбцов; превышение лимита — ошибка.
|
|
216
|
+
|
|
217
|
+
Границы и даты фактов имеют контракт **YYYY-MM-DD**. `Date`, число и ISO timestamp
|
|
218
|
+
с временем не принимаются как календарные факты: их приводит адаптер с явной
|
|
219
|
+
политикой времени. Используются существующий календарный parser и форматтеры:
|
|
220
|
+
`formatDateAsODataDate` для машинных дат, `formatDateAsDate` для подписи дня.
|
|
221
|
+
Потребитель согласует настройки форматирования и календарную/timezone-политику
|
|
222
|
+
SSR и браузера. Неверный диапазон отклоняется; неверные факты и даты вне диапазона
|
|
223
|
+
пропускаются.
|
|
135
224
|
|
|
136
225
|
`projectAnalyticalDateFacts({ rows, facts, plan })` сопоставляет факты по составному
|
|
137
|
-
`identityColumnIds`, добавляя ячейки к копиям значений.
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
226
|
+
`identityColumnIds`, добавляя ячейки к копиям значений. Порядок, количество и ID
|
|
227
|
+
строк сохраняются. Факты с неполным ключом пропускаются, отсутствие фактов даёт
|
|
228
|
+
`null`; конфликт с существующим одноимённым полем вызывает ошибку.
|
|
229
|
+
|
|
230
|
+
`aggregateAnalyticalDateFacts` считает итоги по исходным фактам — это существенно
|
|
231
|
+
для `avg`, где среднее от средних неверно. Групповые итоги получают тем же способом
|
|
232
|
+
через aggregate callback. Факты с неполным ключом исключаются и из проекции, и из
|
|
233
|
+
итогов; допустимую область остальных фактов задаёт потребитель. Дополнительных
|
|
234
|
+
запросов эти функции не выполняют.
|
|
235
|
+
|
|
236
|
+
## Раскрытие и экспорт
|
|
237
|
+
|
|
238
|
+
`projectAnalyticalTableExpansion(model, expandedRowIds)` доступен отдельно; runtime
|
|
239
|
+
уже вызывает его на последнем этапе. Он сохраняет ссылки неизменённых ветвей,
|
|
240
|
+
игнорирует неизвестные ID и листья и возвращает переданную модель при неизменном
|
|
241
|
+
эффективном раскрытии. При изменении дерева все индексы указывают на актуальные
|
|
242
|
+
узлы, а рассчитанные итоги сохраняются.
|
|
243
|
+
|
|
244
|
+
`projectAnalyticalTableExport` принимает модель, упорядоченные столбцы с
|
|
245
|
+
`format(value, row)`, область `all/visible/selected`, `includeGroups` и
|
|
246
|
+
`includeGrandTotals`. По умолчанию экспортируются все строки отфильтрованной модели,
|
|
247
|
+
включая свёрнутые ветви. `includeGroups: false` убирает только синтетические группы,
|
|
248
|
+
сохраняя предметных родителей. Результат содержит заголовки и массивы значений;
|
|
249
|
+
создание файла относится к `/excel` или `/table-document`.
|
|
250
|
+
|
|
251
|
+
Итоги форматируются отдельным `formatTotal(value)`, поскольку у них нет исходной
|
|
252
|
+
строки `original`. Без него сохраняются raw значения независимо от форматтера
|
|
253
|
+
обычных строк. ID итога — `analytical-grand-total`; при конфликте со строкой модели
|
|
254
|
+
подбирается свободный детерминированный суффикс. Выбор области экспорта его не меняет.
|
|
255
|
+
|
|
256
|
+
Runtime полного снимка не содержит remote paging, sparse placeholders, LRU страниц
|
|
257
|
+
или второй кэш загруженных данных. Возможный серверный источник с постраничной
|
|
258
|
+
агрегацией должен иметь отдельный транспортный контракт.
|
|
@@ -68,6 +68,24 @@ import { formatDate, formatNumber } from "@ryuzaki13/react-foundation-lib/format
|
|
|
68
68
|
|
|
69
69
|
## Общие правила
|
|
70
70
|
|
|
71
|
+
### Длительность в минутах
|
|
72
|
+
|
|
73
|
+
`formatDurationMinutes(minutes)` показывает целые неотрицательные минуты с
|
|
74
|
+
переходом к часам и суткам. Это продолжительность, а не дата: сутки равны
|
|
75
|
+
24 часам независимо от часового пояса. Остатки сохраняются, включая нулевые.
|
|
76
|
+
|
|
77
|
+
```ts
|
|
78
|
+
import { formatDurationMinutes } from "@ryuzaki13/react-foundation-lib/formatters";
|
|
79
|
+
|
|
80
|
+
formatDurationMinutes(59); // "59 мин"
|
|
81
|
+
formatDurationMinutes(60); // "1 ч 0 мин"
|
|
82
|
+
formatDurationMinutes(1565); // "1 дн 2 ч 5 мин"
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Отрицательные, дробные, бесконечные и небезопасные значения вызывают
|
|
86
|
+
`RangeError`. Неизвестное начало периода и SSR fallback принадлежат
|
|
87
|
+
потребителю; formatter не читает часы и не создаёт таймеров.
|
|
88
|
+
|
|
71
89
|
### Formatter обычно не является validator-ом
|
|
72
90
|
|
|
73
91
|
Функция может иметь fallback для невалидного значения, но это не делает данные валидными:
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"aggregation.d.ts","sourceRoot":"","sources":["../../src/analytical-table/aggregation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAErD,4FAA4F;AAC5F,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,SAAS,OAAO,EAAE,EAAE,WAAW,EAAE,qBAAqB,GAAG,MAAM,GAAG,IAAI,CAyBvH"}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { type AnalyticalValues } from "./dataTypes";
|
|
2
|
-
export type AnalyticalCalculationStep = Readonly<{
|
|
3
|
-
columnId: string;
|
|
4
|
-
dependencies: readonly string[];
|
|
5
|
-
compute: (values: AnalyticalValues) => unknown;
|
|
6
|
-
}>;
|
|
7
|
-
export type AnalyticalCalculationPlan = Readonly<{
|
|
8
|
-
steps: readonly AnalyticalCalculationStep[];
|
|
9
|
-
requiredColumnIds: readonly string[];
|
|
10
|
-
}>;
|
|
11
|
-
//# sourceMappingURL=calculationTypes.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"calculationTypes.d.ts","sourceRoot":"","sources":["../../src/analytical-table/calculationTypes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEpD,MAAM,MAAM,yBAAyB,GAAG,QAAQ,CAAC;IAChD,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,OAAO,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,OAAO,CAAC;CAC/C,CAAC,CAAC;AAEH,MAAM,MAAM,yBAAyB,GAAG,QAAQ,CAAC;IAChD,KAAK,EAAE,SAAS,yBAAyB,EAAE,CAAC;IAC5C,iBAAiB,EAAE,SAAS,MAAM,EAAE,CAAC;CACrC,CAAC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"calculations.d.ts","sourceRoot":"","sources":["../../src/analytical-table/calculations.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,yBAAyB,EAAkC,KAAK,gBAAgB,EAAE,KAAK,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAEvI,0FAA0F;AAC1F,wBAAgB,+BAA+B,CAAC,CAAC,EAChD,OAAO,EAAE,SAAS,gBAAgB,CAAC,CAAC,CAAC,EAAE,EACvC,iBAAiB,GAAE,SAAS,MAAM,EAAuC,GACvE,yBAAyB,CAsC3B;AAED,wFAAwF;AACxF,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,gBAAgB,EAAE,IAAI,EAAE,yBAAyB,GAAG,gBAAgB,CAIrH"}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import { type AnalyticalDataRow, type AnalyticalValues } from "./dataTypes";
|
|
2
|
-
import { type AnalyticalFilter } from "./viewTypes";
|
|
3
|
-
export type AnalyticalAggregation = "sum" | "min" | "max" | "avg" | "count";
|
|
4
|
-
export type AnalyticalAggregateContext<TOriginal = unknown> = Readonly<{
|
|
5
|
-
scope: "group" | "grand";
|
|
6
|
-
/** Только исходные строки выбранной зернистости, без синтетических групп. */
|
|
7
|
-
rows: readonly AnalyticalDataRow<TOriginal>[];
|
|
8
|
-
groupingPath: AnalyticalValues;
|
|
9
|
-
}>;
|
|
10
|
-
export type AnalyticalFormula = Readonly<{
|
|
11
|
-
formulaId: string;
|
|
12
|
-
dependencies: readonly string[];
|
|
13
|
-
}>;
|
|
14
|
-
export type AnalyticalCalculation = Readonly<{
|
|
15
|
-
dependencies: readonly string[];
|
|
16
|
-
compute: (values: AnalyticalValues) => unknown;
|
|
17
|
-
}>;
|
|
18
|
-
export type AnalyticalColumn<TOriginal = unknown> = Readonly<{
|
|
19
|
-
id: string;
|
|
20
|
-
label?: string;
|
|
21
|
-
kind?: "dimension" | "measure";
|
|
22
|
-
valueType?: "string" | "number" | "boolean" | "date";
|
|
23
|
-
compare?: (left: unknown, right: unknown) => number;
|
|
24
|
-
filter?: (value: unknown, filter: AnalyticalFilter, row: AnalyticalDataRow<TOriginal>) => boolean;
|
|
25
|
-
aggregate?: AnalyticalAggregation | ((context: AnalyticalAggregateContext<TOriginal>) => unknown);
|
|
26
|
-
/** Исполнение использует реестр /formulas; зависимости определяют порядок расчёта. */
|
|
27
|
-
formula?: AnalyticalFormula;
|
|
28
|
-
calculate?: AnalyticalCalculation;
|
|
29
|
-
}>;
|
|
30
|
-
//# sourceMappingURL=columnTypes.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"columnTypes.d.ts","sourceRoot":"","sources":["../../src/analytical-table/columnTypes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,iBAAiB,EAAE,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC5E,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEpD,MAAM,MAAM,qBAAqB,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,OAAO,CAAC;AAE5E,MAAM,MAAM,0BAA0B,CAAC,SAAS,GAAG,OAAO,IAAI,QAAQ,CAAC;IACtE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC;IACzB,6EAA6E;IAC7E,IAAI,EAAE,SAAS,iBAAiB,CAAC,SAAS,CAAC,EAAE,CAAC;IAC9C,YAAY,EAAE,gBAAgB,CAAC;CAC/B,CAAC,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,QAAQ,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,CAAC,CAAC;AAEjG,MAAM,MAAM,qBAAqB,GAAG,QAAQ,CAAC;IAAE,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,OAAO,CAAA;CAAE,CAAC,CAAC;AAElI,MAAM,MAAM,gBAAgB,CAAC,SAAS,GAAG,OAAO,IAAI,QAAQ,CAAC;IAC5D,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;IAC/B,SAAS,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAC;IACrD,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC;IACpD,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,GAAG,EAAE,iBAAiB,CAAC,SAAS,CAAC,KAAK,OAAO,CAAC;IAClG,SAAS,CAAC,EAAE,qBAAqB,GAAG,CAAC,CAAC,OAAO,EAAE,0BAA0B,CAAC,SAAS,CAAC,KAAK,OAAO,CAAC,CAAC;IAClG,sFAAsF;IACtF,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAC5B,SAAS,CAAC,EAAE,qBAAqB,CAAC;CAClC,CAAC,CAAC"}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
/** Значения таблицы отделены от исходного DTO: runtime не изменяет снимок Query. */
|
|
2
|
-
export type AnalyticalValues = Readonly<Record<string, unknown>>;
|
|
3
|
-
export type AnalyticalDataRow<TOriginal = unknown> = Readonly<{
|
|
4
|
-
id: string;
|
|
5
|
-
parentId?: string | null;
|
|
6
|
-
kind?: string;
|
|
7
|
-
original?: TOriginal;
|
|
8
|
-
values: AnalyticalValues;
|
|
9
|
-
}>;
|
|
10
|
-
/** Готовый полный снимок. Его загрузкой и отменой владеет транспорт потребителя. */
|
|
11
|
-
export type AnalyticalSnapshot<TOriginal = unknown> = Readonly<{
|
|
12
|
-
rows: readonly AnalyticalDataRow<TOriginal>[];
|
|
13
|
-
}>;
|
|
14
|
-
//# sourceMappingURL=dataTypes.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"dataTypes.d.ts","sourceRoot":"","sources":["../../src/analytical-table/dataTypes.ts"],"names":[],"mappings":"AAAA,oFAAoF;AACpF,MAAM,MAAM,gBAAgB,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAEjE,MAAM,MAAM,iBAAiB,CAAC,SAAS,GAAG,OAAO,IAAI,QAAQ,CAAC;IAC7D,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,MAAM,EAAE,gBAAgB,CAAC;CACzB,CAAC,CAAC;AAEH,oFAAoF;AACpF,MAAM,MAAM,kBAAkB,CAAC,SAAS,GAAG,OAAO,IAAI,QAAQ,CAAC;IAC9D,IAAI,EAAE,SAAS,iBAAiB,CAAC,SAAS,CAAC,EAAE,CAAC;CAC9C,CAAC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"dateColumnTypes.d.ts","sourceRoot":"","sources":["../../src/analytical-table/dateColumnTypes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAC3D,OAAO,EAAE,KAAK,iBAAiB,EAAE,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE5E,+EAA+E;AAC/E,MAAM,MAAM,4BAA4B,GAAG,QAAQ,CAAC;IACnD,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;IAC3D,iBAAiB,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,iFAAiF;IACjF,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,qBAAqB,CAAC;IACnC,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC,CAAC;AAEH,MAAM,MAAM,oBAAoB,GAAG,QAAQ,CAAC;IAC3C,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;CACX,CAAC,CAAC;AAEH,MAAM,MAAM,yBAAyB,GAAG,QAAQ,CAAC;IAChD,OAAO,EAAE,4BAA4B,CAAC;IACtC,OAAO,EAAE,SAAS,oBAAoB,EAAE,CAAC;CACzC,CAAC,CAAC;AAEH,MAAM,MAAM,iCAAiC,CAAC,SAAS,GAAG,OAAO,IAAI,QAAQ,CAAC;IAC7E,IAAI,EAAE,SAAS,iBAAiB,CAAC,SAAS,CAAC,EAAE,CAAC;IAC9C,KAAK,EAAE,SAAS,gBAAgB,EAAE,CAAC;IACnC,IAAI,EAAE,yBAAyB,CAAC;CAChC,CAAC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"dateColumns.d.ts","sourceRoot":"","sources":["../../src/analytical-table/dateColumns.ts"],"names":[],"mappings":"AAeA,OAAO,EACN,KAAK,iBAAiB,EAEtB,KAAK,4BAA4B,EACjC,KAAK,yBAAyB,EAC9B,KAAK,gBAAgB,EACrB,KAAK,iCAAiC,EACtC,MAAM,SAAS,CAAC;AA+CjB,oFAAoF;AACpF,wBAAgB,+BAA+B,CAAC,OAAO,EAAE,4BAA4B,GAAG,yBAAyB,CAuBhH;AAYD,sGAAsG;AACtG,wBAAgB,0BAA0B,CAAC,CAAC,EAAE,IAAI,EAAE,iCAAiC,CAAC,CAAC,CAAC,GAAG,SAAS,iBAAiB,CAAC,CAAC,CAAC,EAAE,CA0BzH;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,SAAS,gBAAgB,EAAE,EAAE,IAAI,EAAE,yBAAyB,GAAG,gBAAgB,CAelI"}
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import { type AnalyticalTableModel } from "./types";
|
|
2
|
-
/** Раскрытие не меняет группировки, формулы и итоги; UI мемоизирует базовую модель отдельно. */
|
|
3
|
-
export declare function projectAnalyticalTableExpansion<T>(model: AnalyticalTableModel<T>, expandedRowIds: readonly string[] | "all"): AnalyticalTableModel<T>;
|
|
4
|
-
//# sourceMappingURL=expansion.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"expansion.d.ts","sourceRoot":"","sources":["../../src/analytical-table/expansion.ts"],"names":[],"mappings":"AACA,OAAO,EAA2B,KAAK,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAE7E,gGAAgG;AAChG,wBAAgB,+BAA+B,CAAC,CAAC,EAChD,KAAK,EAAE,oBAAoB,CAAC,CAAC,CAAC,EAC9B,cAAc,EAAE,SAAS,MAAM,EAAE,GAAG,KAAK,GACvC,oBAAoB,CAAC,CAAC,CAAC,CAUzB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"exportProjection.d.ts","sourceRoot":"","sources":["../../src/analytical-table/exportProjection.ts"],"names":[],"mappings":"AAAA,OAAO,EAA+B,KAAK,0BAA0B,EAAE,KAAK,mCAAmC,EAAE,MAAM,SAAS,CAAC;AAEjI,+FAA+F;AAC/F,wBAAgB,4BAA4B,CAAC,CAAC,EAAE,IAAI,EAAE,mCAAmC,CAAC,CAAC,CAAC,GAAG,0BAA0B,CAwBxH"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"exportTypes.d.ts","sourceRoot":"","sources":["../../src/analytical-table/exportTypes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,kBAAkB,EAAE,KAAK,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAElF,MAAM,MAAM,sBAAsB,CAAC,SAAS,GAAG,OAAO,IAAI,QAAQ,CAAC;IAClE,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,kBAAkB,CAAC,SAAS,CAAC,KAAK,OAAO,CAAC;IACzE,oFAAoF;IACpF,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC;CAC1C,CAAC,CAAC;AAEH,MAAM,MAAM,sBAAsB,GAAG,QAAQ,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAE7E,MAAM,MAAM,mBAAmB,GAAG,QAAQ,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;IAAC,MAAM,EAAE,SAAS,OAAO,EAAE,CAAA;CAAE,CAAC,CAAC;AAExI,MAAM,MAAM,0BAA0B,GAAG,QAAQ,CAAC;IACjD,OAAO,EAAE,SAAS,sBAAsB,EAAE,CAAC;IAC3C,IAAI,EAAE,SAAS,mBAAmB,EAAE,CAAC;CACrC,CAAC,CAAC;AAEH,MAAM,MAAM,mCAAmC,CAAC,SAAS,GAAG,OAAO,IAAI,QAAQ,CAAC;IAC/E,KAAK,EAAE,oBAAoB,CAAC,SAAS,CAAC,CAAC;IACvC,OAAO,CAAC,EAAE,SAAS,sBAAsB,CAAC,SAAS,CAAC,EAAE,CAAC;IACvD,KAAK,CAAC,EAAE,KAAK,GAAG,SAAS,GAAG,UAAU,CAAC;IACvC,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC7B,CAAC,CAAC"}
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import { type AnalyticalColumn, type AnalyticalDataRow, type AnalyticalFilter } from "./types";
|
|
2
|
-
/** Операции фильтра относятся к данным, поэтому одинаково работают при SSR и в браузере. */
|
|
3
|
-
export declare function matchesAnalyticalFilter<T>(row: AnalyticalDataRow<T>, filter: AnalyticalFilter, column?: AnalyticalColumn<T>): boolean;
|
|
4
|
-
//# sourceMappingURL=filtering.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"filtering.d.ts","sourceRoot":"","sources":["../../src/analytical-table/filtering.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,gBAAgB,EAAE,KAAK,iBAAiB,EAAE,KAAK,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAG/F,4FAA4F;AAC5F,wBAAgB,uBAAuB,CAAC,CAAC,EAAE,GAAG,EAAE,iBAAiB,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,CAAC,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAAG,OAAO,CAgCrI"}
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import { type AnalyticalModelRow, type AnalyticalTableModel } from "./types";
|
|
2
|
-
/** Единственный обход индексов полной и видимой проекций дерева. */
|
|
3
|
-
export declare function indexAnalyticalRows<T>(rows: readonly AnalyticalModelRow<T>[]): Pick<AnalyticalTableModel<T>, "flatRows" | "visibleRows" | "rowById">;
|
|
4
|
-
//# sourceMappingURL=indexAnalyticalRows.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"indexAnalyticalRows.d.ts","sourceRoot":"","sources":["../../src/analytical-table/indexAnalyticalRows.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,kBAAkB,EAAE,KAAK,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAE7E,oEAAoE;AACpE,wBAAgB,mBAAmB,CAAC,CAAC,EACpC,IAAI,EAAE,SAAS,kBAAkB,CAAC,CAAC,CAAC,EAAE,GACpC,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC,EAAE,UAAU,GAAG,aAAa,GAAG,SAAS,CAAC,CAcvE"}
|