@ryuzaki13/react-foundation-lib 2.21.0 → 2.23.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.
Files changed (97) hide show
  1. package/dist/analytical-table/buildAnalyticalTableModel.d.ts +5 -2
  2. package/dist/analytical-table/buildAnalyticalTableModel.d.ts.map +1 -1
  3. package/dist/analytical-table/{calculations.d.ts → definition/calculations.d.ts} +1 -1
  4. package/dist/analytical-table/definition/calculations.d.ts.map +1 -0
  5. package/dist/analytical-table/definition/compileAnalyticalTableDefinition.d.ts +4 -0
  6. package/dist/analytical-table/definition/compileAnalyticalTableDefinition.d.ts.map +1 -0
  7. package/dist/analytical-table/definition/types.d.ts +70 -0
  8. package/dist/analytical-table/definition/types.d.ts.map +1 -0
  9. package/dist/analytical-table/definition/validateAnalyticalView.d.ts +5 -0
  10. package/dist/analytical-table/definition/validateAnalyticalView.d.ts.map +1 -0
  11. package/dist/analytical-table/{dateColumns.d.ts → dynamic-columns/dateColumns.d.ts} +2 -1
  12. package/dist/analytical-table/dynamic-columns/dateColumns.d.ts.map +1 -0
  13. package/dist/analytical-table/dynamic-columns/index.d.ts +3 -0
  14. package/dist/analytical-table/dynamic-columns/index.d.ts.map +1 -0
  15. package/dist/analytical-table/{dateColumnTypes.d.ts → dynamic-columns/types.d.ts} +3 -3
  16. package/dist/analytical-table/dynamic-columns/types.d.ts.map +1 -0
  17. package/dist/analytical-table/index.d.ts +7 -5
  18. package/dist/analytical-table/index.d.ts.map +1 -1
  19. package/dist/analytical-table/index.js +362 -201
  20. package/dist/analytical-table/index.js.map +1 -1
  21. package/dist/analytical-table/projections/expansion.d.ts +4 -0
  22. package/dist/analytical-table/projections/expansion.d.ts.map +1 -0
  23. package/dist/analytical-table/{exportProjection.d.ts → projections/exportProjection.d.ts} +1 -1
  24. package/dist/analytical-table/projections/exportProjection.d.ts.map +1 -0
  25. package/dist/analytical-table/projections/indexAnalyticalRows.d.ts +4 -0
  26. package/dist/analytical-table/projections/indexAnalyticalRows.d.ts.map +1 -0
  27. package/dist/analytical-table/projections/resolveRowsProjection.d.ts +4 -0
  28. package/dist/analytical-table/projections/resolveRowsProjection.d.ts.map +1 -0
  29. package/dist/analytical-table/{exportTypes.d.ts → projections/types.d.ts} +2 -2
  30. package/dist/analytical-table/projections/types.d.ts.map +1 -0
  31. package/dist/analytical-table/{aggregation.d.ts → runtime/aggregation.d.ts} +1 -1
  32. package/dist/analytical-table/runtime/aggregation.d.ts.map +1 -0
  33. package/dist/analytical-table/runtime/buildGroupedModel.d.ts +11 -0
  34. package/dist/analytical-table/runtime/buildGroupedModel.d.ts.map +1 -0
  35. package/dist/analytical-table/runtime/createAnalyticalTableRuntime.d.ts +10 -0
  36. package/dist/analytical-table/runtime/createAnalyticalTableRuntime.d.ts.map +1 -0
  37. package/dist/analytical-table/runtime/filtering.d.ts +7 -0
  38. package/dist/analytical-table/runtime/filtering.d.ts.map +1 -0
  39. package/dist/analytical-table/runtime/grouping.d.ts +10 -0
  40. package/dist/analytical-table/runtime/grouping.d.ts.map +1 -0
  41. package/dist/analytical-table/runtime/hierarchy.d.ts +20 -0
  42. package/dist/analytical-table/runtime/hierarchy.d.ts.map +1 -0
  43. package/dist/analytical-table/runtime/sorting.d.ts +5 -0
  44. package/dist/analytical-table/runtime/sorting.d.ts.map +1 -0
  45. package/dist/analytical-table/runtime/totals.d.ts +12 -0
  46. package/dist/analytical-table/runtime/totals.d.ts.map +1 -0
  47. package/dist/analytical-table/runtime/types.d.ts +71 -0
  48. package/dist/analytical-table/runtime/types.d.ts.map +1 -0
  49. package/dist/analytical-table/{valueComparison.d.ts → runtime/valueComparison.d.ts} +1 -1
  50. package/dist/analytical-table/runtime/valueComparison.d.ts.map +1 -0
  51. package/dist/analytical-table/types.d.ts +4 -7
  52. package/dist/analytical-table/types.d.ts.map +1 -1
  53. package/dist/chunks/{formatters-CEltML3y.js → formatters-D1ob2OkI.js} +501 -451
  54. package/dist/chunks/formatters-D1ob2OkI.js.map +1 -0
  55. package/dist/chunks/{odata-service-CWkHASdw.js → odata-service-tp2U5yIr.js} +415 -415
  56. package/dist/chunks/{odata-service-CWkHASdw.js.map → odata-service-tp2U5yIr.js.map} +1 -1
  57. package/dist/chunks/{validate-M2zPiLXn.js → validate-C8cQm_9m.js} +2 -2
  58. package/dist/chunks/{validate-M2zPiLXn.js.map → validate-C8cQm_9m.js.map} +1 -1
  59. package/dist/error-report/index.js +2 -2
  60. package/dist/excel/index.js +18 -18
  61. package/dist/formatters/formatFileSize.d.ts +7 -0
  62. package/dist/formatters/formatFileSize.d.ts.map +1 -0
  63. package/dist/formatters/index.d.ts +1 -0
  64. package/dist/formatters/index.d.ts.map +1 -1
  65. package/dist/formatters/index.js +5 -5
  66. package/dist/odata-service/formatters.d.ts +2 -2
  67. package/dist/odata-service/index.js +1 -1
  68. package/dist/table/index.js.map +1 -1
  69. package/dist/table/useTableRowSelection.d.ts +1 -1
  70. package/dist/table/useTableRowSelection.d.ts.map +1 -1
  71. package/package.json +1 -1
  72. package/src/analytical-table/README.mdx +232 -143
  73. package/src/formatters/README.mdx +8 -0
  74. package/dist/analytical-table/aggregation.d.ts.map +0 -1
  75. package/dist/analytical-table/calculationTypes.d.ts +0 -11
  76. package/dist/analytical-table/calculationTypes.d.ts.map +0 -1
  77. package/dist/analytical-table/calculations.d.ts.map +0 -1
  78. package/dist/analytical-table/columnTypes.d.ts +0 -30
  79. package/dist/analytical-table/columnTypes.d.ts.map +0 -1
  80. package/dist/analytical-table/dataTypes.d.ts +0 -14
  81. package/dist/analytical-table/dataTypes.d.ts.map +0 -1
  82. package/dist/analytical-table/dateColumnTypes.d.ts.map +0 -1
  83. package/dist/analytical-table/dateColumns.d.ts.map +0 -1
  84. package/dist/analytical-table/expansion.d.ts +0 -4
  85. package/dist/analytical-table/expansion.d.ts.map +0 -1
  86. package/dist/analytical-table/exportProjection.d.ts.map +0 -1
  87. package/dist/analytical-table/exportTypes.d.ts.map +0 -1
  88. package/dist/analytical-table/filtering.d.ts +0 -4
  89. package/dist/analytical-table/filtering.d.ts.map +0 -1
  90. package/dist/analytical-table/indexAnalyticalRows.d.ts +0 -4
  91. package/dist/analytical-table/indexAnalyticalRows.d.ts.map +0 -1
  92. package/dist/analytical-table/modelTypes.d.ts +0 -43
  93. package/dist/analytical-table/modelTypes.d.ts.map +0 -1
  94. package/dist/analytical-table/valueComparison.d.ts.map +0 -1
  95. package/dist/analytical-table/viewTypes.d.ts +0 -24
  96. package/dist/analytical-table/viewTypes.d.ts.map +0 -1
  97. package/dist/chunks/formatters-CEltML3y.js.map +0 -1
@@ -1,41 +1,22 @@
1
- # Analytical Table: чистая модель полного снимка
2
-
3
- Модуль `@ryuzaki13/react-foundation-lib/analytical-table` предоставляет вычислительный
4
- слой аналитической таблицы. Он подходит для SSR и браузера, не использует React hooks,
5
- QueryClient, serverFn, OData-запросы, SAP metadata, DOM или browser storage. Загрузкой, ошибками,
6
- отменой и авторизацией владеет транспорт приложения. Результат запроса передаётся
7
- как неизменяемый `AnalyticalSnapshot`; дополнительных запросов при группировке,
8
- сортировке или раскрытии нет.
9
-
10
- ## Контракт и владельцы состояния
11
-
12
- `AnalyticalSnapshot<T>` содержит `rows`. Каждая `AnalyticalDataRow<T>` содержит
13
- стабильный `id`, необязательный `parentId`, значения `values`, исходную запись
14
- `original` и необязательный предметный `kind`. Нельзя использовать номер позиции
15
- строки как идентификатор: сортировка и обновление снимка должны сохранять выбор и
16
- раскрытие. Runtime не изменяет исходные строки и не копирует предметные DTO
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
- const expanded = projectAnalyticalTableExpansion(model, "all");
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
- Построение исходной иерархии использует `/tree-table`. Повторяющиеся идентификаторы,
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
- значений, а не от подписи или порядка строк. Число, строка, null и undefined
71
- различаются. Отображаемые поля берутся из первой строки группы: потребитель обязан
72
- обеспечить, что они однозначно определяются ключом. Уровень не может иметь пустой
73
- список ключей. Повторяющиеся уровни отклоняются; сортировка и фильтры требуют
74
- известных дескрипторов столбцов.
75
-
76
- Сортировка применяется между соседними узлами на каждом уровне; она не отделяет
77
- детей от родителей. При равенстве сохраняется исходный порядок. Строковое сравнение
78
- использует `/string-comparison`, календарные значения — `/formatters`. Для иной
79
- семантики столбец задаёт `compare`.
80
-
81
- Фильтры поддерживают equals, notEquals, contains, startsWith, in, between, gt, gte,
82
- lt, lte, empty и notEmpty; текстовый поиск не зависит от регистра. Условия разных
83
- столбцов объединяются через AND. Фильтрация работает над исходными вычисленными
84
- строками **до** дополнительных группировок: совпавший родитель сохраняет ветвь
85
- целиком, совпавший ребёнок сохраняет путь к нему. Для предметной семантики есть
86
- `column.filter`.
87
-
88
- ## Итоги и зернистость
89
-
90
- По умолчанию агрегируются только исходные корневые строки. Дочерняя детализация не
91
- удваивает их меры. `isAggregateRow` позволяет явно выбрать другую зернистость.
92
- `column.aggregate` поддерживает sum, min, max, avg, count и callback. Числовые
93
- агрегации принимают только конечные числа; строковое преобразование внешних DTO
94
- выполняется в адаптере источника. Пустое числовое множество возвращает null;
95
- count считает непустые значения и возвращает 0 для пустого множества.
96
-
97
- `aggregate(context)` возвращает значения групповых/общих итогов и может переопределить
98
- результаты стандартных агрегаций. Контекст содержит `scope`, `groupingPath` и только
99
- исходные строки выбранной зернистости. Например, доля должна вычисляться как
100
- отношение сумм числителя и знаменателя, если предметный учёт требует взвешенного
101
- результата. Библиотека не усредняет проценты вместо этого правила.
102
-
103
- `grandTotalsScope: "filtered"` (по умолчанию) учитывает оставшиеся ветви, `"all"`
104
- сохраняет общие итоги полного снимка при визуальной фильтрации. `grandTotals: false`
105
- отключает их вычисление. Раскрытие и выбор строк общие итоги не меняют.
106
-
107
- ## Формулы и зависимые вычисления
108
-
109
- `createAnalyticalCalculationPlan(columns, requiredColumnIds?)` проверяет уникальность
110
- столбцов, зависимости и циклы, затем строит топологический порядок. `formula`
111
- содержит `formulaId` и упорядоченные `dependencies`: исполнение использует уже
112
- существующий реестр `/formulas`, который настраивает composition root приложения.
113
- `calculate` содержит зависимости и чистый `compute(values)` для вычислений,
114
- не представленных реестром. Одновременно задать formula и calculate нельзя.
115
-
116
- `calculateAnalyticalValues` возвращает отдельные значения. План компилируется один
117
- раз при построении модели и применяется к данным, затем к рассчитанным итогам.
118
- Явная агрегация колонки, результат `aggregate(context)` и значения пути группировки
119
- имеют приоритет над построчной формулой этой колонки. Зависимые формулы читают
120
- готовые итоги: сумма произведений сохраняется, а отношение сумм вычисляется заново.
121
- Вычисление должно учитывать отсутствующие значения в итоговой строке. Ошибки
122
- конфигурации и выполнения формул не скрываются успешным нулём.
123
-
124
- ## Динамические календарные столбцы
125
-
126
- `createAnalyticalDateColumnsPlan` строит day/week/month/quarter/year buckets с
127
- включительными `from`/`to`; неделя начинается в понедельник. Идентификатор содержит
128
- гранулярность и календарное начало bucket, а крайние интервалы обрезаются диапазоном.
129
- По умолчанию допустимо не более 366 столбцов; превышение лимита приводит к ошибке.
130
-
131
- Границы диапазона и поле даты каждого факта имеют контракт **YYYY-MM-DD**.
132
- `Date`, числа и ISO timestamp с временем не принимаются как календарные факты.
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
- пропускаются. Без фактов ячейка равна null; существующее одноимённое поле не
140
- перезаписывается молча. Это отдельная проекция уже загруженных данных, не схема
141
- дополнительной загрузки.
142
-
143
- `aggregateAnalyticalDateFacts` считает общие значения по исходным фактам. Особенно
144
- важно использовать его для avg: среднее от средних разных строк обычно неверно.
145
- Групповые итоги для таких данных следует считать тем же способом по соответствующему
146
- набору исходных фактов через aggregate callback. Факты с неполным ключом исключаются
147
- и из строк, и из итогов. Область переданного набора фактов определяет потребитель.
148
-
149
- ## Экспорт и производительность
150
-
151
- `projectAnalyticalTableExport` принимает модель, упорядоченные столбцы с необязательным
152
- `format(value, row)`, область all/visible/selected, `includeGroups` и
153
- `includeGrandTotals`. Результат содержит заголовки и массивы значений; дальнейшее
154
- создание XLSX или документа принадлежит `/excel` или `/table-document`. По умолчанию
155
- экспортируются все строки отфильтрованной модели, включая свёрнутые ветви.
156
- Предметные строки-родители не считаются синтетическими группами. Общие итоги
157
- форматируются отдельным `formatTotal(value)`: у них нет исходной строки `original`.
158
- Без него итоги сохраняют исходные значения, даже если форматтер строк задан отдельно.
159
-
160
- Для React следует мемоизировать базовую модель по `snapshot.rows`, колонкам,
161
- группировкам, сортировке, фильтрам и правилам итогов. Время последнего запроса не
162
- является зависимостью, когда данные структурно не изменились. Затем отдельно
163
- вызывается `projectAnalyticalTableExpansion(model, expandedRowIds)`; раскрытие не
164
- повторяет формулы, группировки и агрегации. Selection и layout остаются в UI.
165
-
166
- Полный снимок не требует LRU страниц, sparse placeholders, remote paging или
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
+ агрегацией должен иметь отдельный транспортный контракт.
@@ -461,3 +461,11 @@ Preset и formula registries — application configuration, а не component st
461
461
  ## Следующий шаг
462
462
 
463
463
  Если нужна одна простая функция, выберите строку в таблице быстрого выбора. Если настраивается таблица или сохраняемый пользовательский config, начните с [formatter pipeline](./pipeline/README.mdx) и затем откройте документы зависимых областей.
464
+
465
+ ## Размер файла
466
+
467
+ `formatFileSize(sizeBytes)` принимает неотрицательное безопасное целое число байтов
468
+ и выбирает двоичные единицы от Б до ПиБ. Дробная часть округляется до двух знаков
469
+ без лишних нулей: `formatFileSize(1536)` → `"1,5 КиБ"`, `formatFileSize(1023)` →
470
+ `"1 023 Б"`, `formatFileSize(0)` → `"0 Б"`. Невалидный размер вызывает `RangeError`.
471
+ Отсутствие размера (`null`) обрабатывается потребителем по смыслу его данных.
@@ -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"}