@evergis/react 4.0.124 → 4.0.127

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 (52) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +7 -7
  3. package/dist/components/Dashboard/componentTypes.d.ts +45 -8
  4. package/dist/components/Dashboard/containers/GridRowContainer/index.d.ts +4 -0
  5. package/dist/components/Dashboard/containers/StructuredDataContainer/StructuredDataContext.d.ts +9 -0
  6. package/dist/components/Dashboard/containers/StructuredDataContainer/components/DeleteRowDialog.d.ts +9 -0
  7. package/dist/components/Dashboard/containers/StructuredDataContainer/constants.d.ts +14 -0
  8. package/dist/components/Dashboard/containers/StructuredDataContainer/index.d.ts +10 -0
  9. package/dist/components/Dashboard/containers/StructuredDataContainer/styled.d.ts +18 -0
  10. package/dist/components/Dashboard/containers/StructuredDataContainer/types.d.ts +48 -0
  11. package/dist/components/Dashboard/containers/StructuredDataContainer/useStructuredData.d.ts +28 -0
  12. package/dist/components/Dashboard/containers/StructuredDataContainer/useStructuredDataDraft.d.ts +25 -0
  13. package/dist/components/Dashboard/containers/StructuredDataContainer/useStructuredDataSave.d.ts +17 -0
  14. package/dist/components/Dashboard/containers/StructuredDataContainer/useStructuredDataSchema.d.ts +11 -0
  15. package/dist/components/Dashboard/containers/StructuredDataContainer/utils/buildSchema.d.ts +14 -0
  16. package/dist/components/Dashboard/containers/StructuredDataContainer/utils/draftRows.d.ts +23 -0
  17. package/dist/components/Dashboard/containers/StructuredDataContainer/utils/filterValue.d.ts +14 -0
  18. package/dist/components/Dashboard/containers/StructuredDataContainer/utils/saveToSource.d.ts +18 -0
  19. package/dist/components/Dashboard/containers/index.d.ts +1 -0
  20. package/dist/components/Dashboard/containers/registry.d.ts +1 -0
  21. package/dist/components/Dashboard/elements/ElementTable/components/TableCell.d.ts +10 -0
  22. package/dist/components/Dashboard/elements/ElementTable/constants.d.ts +13 -0
  23. package/dist/components/Dashboard/elements/ElementTable/index.d.ts +9 -0
  24. package/dist/components/Dashboard/elements/ElementTable/styled.d.ts +28 -0
  25. package/dist/components/Dashboard/elements/ElementTable/types.d.ts +15 -0
  26. package/dist/components/Dashboard/elements/ElementTable/useCellEditing.d.ts +15 -0
  27. package/dist/components/Dashboard/elements/ElementTable/useTableView.d.ts +16 -0
  28. package/dist/components/Dashboard/elements/ElementTable/utils/isSameCellValue.d.ts +10 -0
  29. package/dist/components/Dashboard/elements/ElementTable/utils/sortRows.d.ts +12 -0
  30. package/dist/components/Dashboard/elements/index.d.ts +1 -0
  31. package/dist/components/Dashboard/elements/registry.d.ts +1 -0
  32. package/dist/components/Dashboard/grid/GridGroupView/index.d.ts +3 -0
  33. package/dist/components/Dashboard/grid/components/GridHeightResizer/index.d.ts +2 -0
  34. package/dist/components/Dashboard/grid/components/GridTrack/index.d.ts +2 -0
  35. package/dist/components/Dashboard/grid/components/GridTracks/styled.d.ts +14 -1
  36. package/dist/components/Dashboard/grid/constants.d.ts +8 -0
  37. package/dist/components/Dashboard/grid/hooks/useGridHeightResize.d.ts +8 -1
  38. package/dist/components/Dashboard/grid/utils/gridTracks.d.ts +11 -3
  39. package/dist/components/Dashboard/types.d.ts +89 -14
  40. package/dist/components/Dashboard/utils/applyTreeFilterToCondition.d.ts +1 -6
  41. package/dist/components/Dashboard/utils/filterValueKind.d.ts +19 -0
  42. package/dist/components/Dashboard/utils/formatDataSourceCondition.d.ts +2 -1
  43. package/dist/components/Dashboard/utils/getSelectedFilterValue.d.ts +1 -1
  44. package/dist/components/Dashboard/utils/getWrapperSizeStyle.d.ts +7 -1
  45. package/dist/components/Dashboard/utils/index.d.ts +1 -0
  46. package/dist/constants/styling.d.ts +1 -1
  47. package/dist/hooks/map/useIconsFromLayers.d.ts +1 -1
  48. package/dist/index.js +6268 -5387
  49. package/dist/index.js.map +1 -1
  50. package/dist/react.esm.js +6269 -5392
  51. package/dist/react.esm.js.map +1 -1
  52. package/package.json +5 -4
@@ -0,0 +1,10 @@
1
+ import { AttributeType } from '@evergis/api';
2
+ import { FeatureAttributeValue } from '../../../../../types';
3
+ /**
4
+ * Значение ячейки не изменилось.
5
+ *
6
+ * Даты сравниваем моментом времени, а не строкой: `DatePicker` отдаёт ISO с миллисекундами и
7
+ * повторяет текущее значение на каждый уход фокуса из поля — без этой проверки строка
8
+ * помечалась бы изменённой от одного лишь клика по иконке календаря.
9
+ */
10
+ export declare const isSameCellValue: (next: FeatureAttributeValue, current: FeatureAttributeValue, type: AttributeType) => boolean;
@@ -0,0 +1,12 @@
1
+ import { DraftRow, StructuredDataAttribute } from '../../../containers/StructuredDataContainer/types';
2
+ import { TableSort } from '../types';
3
+ /**
4
+ * Сортировка представления. Порядок строк в черновике не меняется — он же уходит в фильтр,
5
+ * а сортировка остаётся видом.
6
+ *
7
+ * Пустые ячейки всегда внизу независимо от направления: иначе смена направления прятала бы
8
+ * заполненные строки под пачкой пустых.
9
+ */
10
+ export declare const sortRows: (rows: DraftRow[], sort: TableSort | null, schema: StructuredDataAttribute[]) => DraftRow[];
11
+ /** Клик по заголовку: по возрастанию → по убыванию → исходный порядок. */
12
+ export declare const getNextSort: (current: TableSort | null, attributeName: string) => TableSort | null;
@@ -11,4 +11,5 @@ export * from './ElementLink';
11
11
  export * from './ElementMarkdown';
12
12
  export * from './ElementSlideshow';
13
13
  export * from './ElementSvg';
14
+ export * from './ElementTable';
14
15
  export * from './ElementTooltip';
@@ -14,4 +14,5 @@ export declare const elementComponents: {
14
14
  readonly markdown: import('react').FC<import('../componentTypes').ElementMarkdownProps>;
15
15
  readonly uploader: import('react').FC<import('../componentTypes').ElementUploaderProps>;
16
16
  readonly modal: import('react').FC<import('../componentTypes').ElementModalProps>;
17
+ readonly table: import('react').FC<import('../componentTypes').ElementTableProps>;
17
18
  };
@@ -6,5 +6,8 @@ import { ContainerProps } from '../../types';
6
6
  * По умолчанию сетка занимает всю высоту выделенного ей бокса ({@link GRID_FILL_DEFAULTS}) —
7
7
  * иначе `1fr`-строки раскладываются по содержимому. Если высота не определена и у родителя,
8
8
  * пропорции всё равно не заработают: взять их неоткуда, нужна заданная `options.height`.
9
+ *
10
+ * `options.autoHeight` меняет ту же высоту на минимум ({@link GRID_AUTO_FILL_DEFAULTS}): пропорции
11
+ * считаются от неё, но переросшее содержимое строк тянет сетку вниз, а не прокручивается внутри.
9
12
  */
10
13
  export declare const GridGroupView: FC<ContainerProps>;
@@ -2,6 +2,8 @@ import { FC } from 'react';
2
2
  interface GridHeightResizerProps {
3
3
  /** Доли всех строк сетки — база для пересчёта. */
4
4
  sizes: number[];
5
+ /** `options.autoHeight` сетки: жест задаёт не высоту, а нижний предел, ниже которого не сжимать. */
6
+ autoHeight?: boolean;
5
7
  getGrid: () => HTMLElement | null;
6
8
  onCommit: (height: string, sizes: number[]) => void;
7
9
  }
@@ -5,6 +5,8 @@ interface GridTrackProps {
5
5
  item: ConfigContainerChild;
6
6
  axis: GridAxis;
7
7
  index: number;
8
+ /** `options.autoHeight` родителя: трек растёт под содержимое, а не запирает его в скролле. */
9
+ autoHeight?: boolean;
8
10
  /** Доли текущего трека и следующего. `null` — трек последний, границы за ним нет. */
9
11
  pairSizes: [number, number] | null;
10
12
  /** Доли всех строк сетки — переданы последней строке, за которой тянется нижняя граница. */
@@ -21,6 +21,7 @@ export declare const GridBody: import('styled-components').StyledComponent<"div"
21
21
  $template: string;
22
22
  $axis: GridAxis;
23
23
  $gap: number;
24
+ $autoHeight?: boolean;
24
25
  }, never>;
25
26
  /**
26
27
  * Обёртка одного трека.
@@ -29,11 +30,16 @@ export declare const GridBody: import('styled-components').StyledComponent<"div"
29
30
  * ячейки может не отрендериться (`hideIfEmptyDataSource`, чужой `tabId`, пустое значение), и без
30
31
  * обёртки пропавший узел утащил бы всю сетку на трек влево. Во-вторых, даёт систему координат
31
32
  * (`position: relative`) для ручки ресайза, лежащей в зазоре.
33
+ *
34
+ * `min-height: 0` — то, чем обёртка разрешает треку быть ниже своего содержимого. В режиме
35
+ * `autoHeight` он снимается: этот же ноль становится «минимальным вкладом» grid-элемента, из
36
+ * которого сетка считает `auto`-минимум трека, и с ним `minmax(auto, Nfr)` не сработал бы вовсе.
32
37
  */
33
38
  export declare const GridTrackBox: import('styled-components').StyledComponent<"div", any, {
34
39
  $selected?: boolean;
35
40
  $selectable?: boolean;
36
41
  $hoverable?: boolean;
42
+ $autoHeight?: boolean;
37
43
  }, never>;
38
44
  /**
39
45
  * Содержимое трека, запертое в его границах.
@@ -47,5 +53,12 @@ export declare const GridTrackBox: import('styled-components').StyledComponent<"
47
53
  * Отдельный узел, а не `overflow` на самой обёртке трека: ручки ресайза лежат в ней же и
48
54
  * намеренно выходят за границы трека на `HANDLE_BLEED_PX` — скролл-контейнер срезал бы им
49
55
  * половину зоны захвата.
56
+ *
57
+ * В режиме `autoHeight` клип снимается целиком: скролл-контейнер сам является тем боксом, внутри
58
+ * которого содержимое запирается, и `auto`-минимум трека при нём не сработал бы — трек так и не
59
+ * узнал бы, что содержимое переросло. Горизонтальный клип уходит вместе с вертикальным: пары
60
+ * `overflow-x: auto` + `overflow-y: visible` в CSS не существует, вторая ось поднимает первую.
50
61
  */
51
- export declare const GridTrackContent: import('styled-components').StyledComponent<"div", any, {}, never>;
62
+ export declare const GridTrackContent: import('styled-components').StyledComponent<"div", any, {
63
+ $autoHeight?: boolean;
64
+ }, never>;
@@ -19,6 +19,14 @@ export declare const MIN_TRACK_RATIO = 0.25;
19
19
  * Явный `options.height` дефолт перекрывает — см. {@link getWrapperSizeStyle}.
20
20
  */
21
21
  export declare const GRID_FILL_DEFAULTS: CSSObject;
22
+ /**
23
+ * Тот же дефолт для режима `options.autoHeight`: занять выделенный бокс, но не запереться в нём.
24
+ *
25
+ * Жёсткая `height: 100%` в этом режиме и есть источник проблемы: узел ровно равен своему треку,
26
+ * и выросшее содержимое ему уже некуда деть, кроме внутреннего скролла. Минимум даёт ту же
27
+ * стартовую высоту, оставляя запас на рост.
28
+ */
29
+ export declare const GRID_AUTO_FILL_DEFAULTS: CSSObject;
22
30
  /**
23
31
  * Зазор между треками по умолчанию, px.
24
32
  *
@@ -2,6 +2,8 @@ import { GridResize } from './useGridResize';
2
2
  interface UseGridHeightResizeParams {
3
3
  /** Доли всех строк сетки — их сумма сохраняется при пересчёте. */
4
4
  sizes: number[];
5
+ /** `options.autoHeight` сетки: результат жеста — минимум, а не жёсткая высота. */
6
+ autoHeight?: boolean;
5
7
  getGrid: () => HTMLElement | null;
6
8
  onCommit: (height: string, sizes: number[]) => void;
7
9
  }
@@ -15,6 +17,11 @@ interface UseGridHeightResizeParams {
15
17
  *
16
18
  * Высота пишется в пикселях: единица, в которой её задал автор конфига, при таком жесте не
17
19
  * восстановима, а пиксели дают ровно тот результат, который пользователь видел под курсором.
20
+ *
21
+ * В режиме `autoHeight` в конфиг уходит та же `options.height`, но и превью, и результат означают
22
+ * МИНИМУМ: корню пишется `min-height`, трекам — `minmax(auto, Npx)`. Иначе жест врал бы ровно там,
23
+ * ради чего режим включают: под курсором сетка садилась бы на заданные пиксели, а после отпускания
24
+ * снова раздувалась содержимым.
18
25
  */
19
- export declare const useGridHeightResize: ({ sizes, getGrid, onCommit }: UseGridHeightResizeParams) => GridResize;
26
+ export declare const useGridHeightResize: ({ sizes, autoHeight, getGrid, onCommit, }: UseGridHeightResizeParams) => GridResize;
20
27
  export {};
@@ -27,7 +27,15 @@ export declare const toFrSize: (value: number) => string;
27
27
  *
28
28
  * `minmax(0, X)` вместо голого размера: голый трек имеет неявный минимум `auto`, и широкий контент
29
29
  * (таблица, график) распирает его изнутри, ломая заданные пропорции.
30
+ *
31
+ * `autoMin` возвращает этот самый минимум `auto` — ровно то, ради чего включают `autoHeight`:
32
+ * переросшее содержимое раздвигает трек вместо того, чтобы прокручиваться внутри него.
33
+ */
34
+ export declare const buildTrackTemplate: (sizes: string[], autoMin?: boolean) => string;
35
+ /**
36
+ * Значение `grid-template-rows` / `grid-template-columns` по долям детей.
37
+ *
38
+ * `autoHeight` отпускает минимум только у СТРОК: ширину растить нечем и незачем — по горизонтали
39
+ * узел и так волен прокручиваться, а `auto`-минимум колонки просто сломал бы заданные пропорции.
30
40
  */
31
- export declare const buildTrackTemplate: (sizes: string[]) => string;
32
- /** Значение `grid-template-rows` / `grid-template-columns` по долям детей. */
33
- export declare const buildGridTemplate: (children: ConfigContainerChild[], axis: GridAxis) => string;
41
+ export declare const buildGridTemplate: (children: ConfigContainerChild[], axis: GridAxis, autoHeight?: boolean) => string;
@@ -1,5 +1,5 @@
1
1
  import { CSSProperties, FC, ReactNode } from 'react';
2
- import { Geometry } from 'geojson';
2
+ import { FeatureCollection, Geometry } from 'geojson';
3
3
  import { i18n } from 'i18next';
4
4
  import { PieChartData, BarChartMarker } from '@evergis/charts';
5
5
  import { IconTypesKeys, IOption } from '@evergis/uilib-gl';
@@ -189,13 +189,16 @@ export interface ConfigLayoutOptions {
189
189
  */
190
190
  grid?: boolean;
191
191
  /**
192
- * Режим редактирования РАСКЛАДКИ сетки: перетаскивание границ, выделение ячеек,
193
- * контекстное меню с объединением/разделением/удалением. Читается только у внешнего
194
- * узла с `grid`; вложенные сетки наследуют режим через контекст.
192
+ * Разрешение править содержимое контейнера. Читают двое:
193
+ * - `ContainersGroup` с `grid` режим редактирования РАСКЛАДКИ: перетаскивание границ,
194
+ * выделение ячеек, контекстное меню с объединением/разделением/удалением. Берётся только
195
+ * у внешнего узла сетки; вложенные наследуют режим через контекст;
196
+ * - `StructuredData` — режим редактирования ТАБЛИЦЫ: правка ячеек, добавление и удаление
197
+ * строк, кнопки «Отменить»/«Сохранить». Не задан или `false` — таблица только на чтение.
195
198
  *
196
199
  * Не путать с `editMode` у `DashboardProvider`/`FeatureCardProvider` (в контейнерах —
197
- * `isEditing`): тот переключает редактирование АТРИБУТОВ объекта и к раскладке отношения
198
- * не имеет.
200
+ * `isEditing`): тот переключает редактирование АТРИБУТОВ объекта и к содержимому
201
+ * контейнеров отношения не имеет.
199
202
  */
200
203
  editMode?: boolean;
201
204
  /**
@@ -206,6 +209,25 @@ export interface ConfigLayoutOptions {
206
209
  * высоты нет и так.
207
210
  */
208
211
  fixedHeight?: boolean;
212
+ /**
213
+ * Секция растёт под содержимое: `options.height` применяется как МИНИМУМ (`min-height`),
214
+ * треки объявляются `minmax(auto, Nfr)` вместо `minmax(0, Nfr)`, а их содержимое перестаёт
215
+ * прокручиваться внутри трека. Нужен витринам, доращивающим контент уже после рендера
216
+ * («Показать ещё»): в обычном режиме трек по содержимому не растёт, и выросшее уходит во
217
+ * внутренний скролл вместо того, чтобы растянуть секцию.
218
+ *
219
+ * Читается у КАЖДОГО узла отдельно и управляет его собственными треками: у сетки это строки,
220
+ * у строки (`GridRow`) — вертикальный размер её ячеек. Чтобы рост дошёл снизу вверх, опция
221
+ * нужна на всей цепочке предков — включённая только у корня, она ничего не даст.
222
+ *
223
+ * Следствия, с которыми режим поставляется:
224
+ * - точен для секции с ОДНОЙ строкой; при нескольких переросшая строка раздувает соседей
225
+ * пропорционально долям — это семантика `fr`, «сосед держит свои пиксели» в CSS Grid не
226
+ * выражается;
227
+ * - вместе с вертикальным клипом уходит и горизонтальный: `overflow-y: visible` при
228
+ * `overflow-x: auto` в CSS невозможен.
229
+ */
230
+ autoHeight?: boolean;
209
231
  twoColumns?: boolean;
210
232
  /** Вписать график контейнера Chart в контейнер: по ширине всегда, по высоте — при заданной высоте (object-fit: contain). */
211
233
  fill?: boolean;
@@ -273,6 +295,13 @@ export interface ConfigExpandableOptions {
273
295
  }
274
296
  /** Связь с источником данных. */
275
297
  export interface ConfigDataSourceBindingOptions {
298
+ /**
299
+ * Схема структурированных данных контейнера {@link ContainerTemplate.StructuredData}.
300
+ *
301
+ * С источником — переопределение схемы источника: типы приходят от него, конфиг задаёт состав,
302
+ * `alias`, `stringFormat` и `isEditable`. Без источника — единственный источник схемы, обязателен.
303
+ */
304
+ attributesDescription?: ConfigAttributeDescription[];
276
305
  /** ⚠️ entity-ref: имя источника. */
277
306
  relatedDataSource?: string;
278
307
  relatedDataSources?: ConfigRelatedDataSource[];
@@ -329,6 +358,14 @@ export interface ConfigCollectionOptions {
329
358
  otherItems?: number;
330
359
  orderByValue?: boolean;
331
360
  orderByTitle?: boolean;
361
+ /**
362
+ * Имена атрибутов схемы, показываемые колонками представления `table`. Подмножество
363
+ * `attributesDescription` родительского контейнера; порядок колонок — порядок этого массива.
364
+ * Не задано — показываются все атрибуты схемы.
365
+ */
366
+ columnNames?: string[];
367
+ /** Разрешить сортировку представления кликом по заголовку колонки. Сортировка локальная — только вид. */
368
+ sort?: boolean;
332
369
  viewMode?: ViewMode;
333
370
  hideEmpty?: boolean;
334
371
  limit?: number;
@@ -418,6 +455,21 @@ export interface ConfigDataSourceAttribute {
418
455
  description?: string;
419
456
  stringFormat?: AttributeFormatConfiguration;
420
457
  }
458
+ /**
459
+ * Описание одного атрибута структуры для {@link ConfigDataSourceBindingOptions.attributesDescription}.
460
+ *
461
+ * Повторяет форму `AttributeConfigurationDc` из `@evergis/api`, но со `stringFormat` пакета
462
+ * ({@link AttributeFormatConfiguration} = DC + `roundDigitGroup`) — так же, как {@link ConfigDataSourceAttribute}.
463
+ */
464
+ export interface ConfigAttributeDescription {
465
+ attributeName: string;
466
+ type?: AttributeType;
467
+ alias?: string;
468
+ description?: string;
469
+ /** Значение атрибута правится в ячейке. `false` — только чтение, в features-API не передаётся. */
470
+ isEditable?: boolean;
471
+ stringFormat?: AttributeFormatConfiguration;
472
+ }
421
473
  export interface ConfigDataSource {
422
474
  name: string;
423
475
  alias?: string;
@@ -441,7 +493,16 @@ export interface EqlDataSource {
441
493
  items: FeatureDc[];
442
494
  attributes?: AttributesConfigurationDc["attributes"];
443
495
  }
444
- export type ConfigFilterValueType = "single" | "range" | "array";
496
+ /**
497
+ * Вид значения фильтра. Задаётся в конфиге и служит дискриминатором для type guard-ов
498
+ * (`isTreeFilterValue`, `isFeaturesFilterValue`) — угадывать вид по форме значения нельзя:
499
+ * `tree` и `features` оба объекты.
500
+ *
501
+ * - `single` / `range` / `array` — скалярные значения, подставляются и в `condition`, и в `parameters`;
502
+ * - `tree` — {@link TreeFilterValue}, объект «уровень → массив id» (плейсхолдеры `%name.lN`);
503
+ * - `features` — {@link FeaturesFilterValue}, подставляется ТОЛЬКО в `parameters`, в `condition` — никогда.
504
+ */
505
+ export type ConfigFilterValueType = "single" | "range" | "array" | "tree" | "features";
445
506
  export interface ConfigFilter {
446
507
  name: string;
447
508
  relatedDataSource?: string;
@@ -487,13 +548,22 @@ export interface ChipOption {
487
548
  * Пример: `{ l1: [1, 2], l3: [1023] }`.
488
549
  */
489
550
  export type TreeFilterValue = Record<string, Array<string | number>>;
551
+ /**
552
+ * Значение фильтра `valueType: "features"` — коллекция строк структурированных данных
553
+ * ({@link ContainerTemplate.StructuredData}). Геометрия не поддерживается, поэтому у всех фич
554
+ * `geometry: null`; данные строки лежат в `properties`.
555
+ *
556
+ * Подставляется только в `parameters` (питон-таска, url-источник). В `condition` не попадает
557
+ * никогда: там значение прошло бы через `formatConditionValue` и выродилось в `[object Object]`.
558
+ */
559
+ export type FeaturesFilterValue = FeatureCollection<null, Record<string, FeatureAttributeValue>>;
490
560
  export interface SelectedFilter {
491
- value: string | number | string[] | number[] | Date | Date[] | TreeFilterValue;
561
+ value: string | number | string[] | number[] | Date | Date[] | TreeFilterValue | FeaturesFilterValue;
492
562
  min?: string | number | Date;
493
563
  max?: string | number | Date;
494
564
  }
495
- /** Значение фильтра без объектного варианта "tree" — для скалярных/массивных фильтров. */
496
- export type ScalarFilterValue = Exclude<SelectedFilter["value"], TreeFilterValue>;
565
+ /** Значение фильтра без объектных вариантов "tree"/"features" — для скалярных/массивных фильтров. */
566
+ export type ScalarFilterValue = Exclude<SelectedFilter["value"], TreeFilterValue | FeaturesFilterValue>;
497
567
  export interface ConfigLayer {
498
568
  name: string;
499
569
  alias?: string;
@@ -566,15 +636,19 @@ export type FilterType = "checkbox" | "rangeNumber" | "rangeDate" | "text" | "dr
566
636
  * `"attributeValue"`, `"attributeUnits"`, `"attributeDescription"`, `"layerName"`.
567
637
  * - элементы-компоненты (`elements/registry.ts`): `"control"`, `"image"`, `"slideshow"`, `"svg"`,
568
638
  * `"icon"`, `"tooltip"`, `"tags"`, `"link"`, `"button"`, `"camera"`, `"chart"`, `"legend"`,
569
- * `"markdown"`, `"uploader"`, `"modal"`.
639
+ * `"markdown"`, `"uploader"`, `"modal"`, `"table"`.
570
640
  *
571
641
  * Slot-id (`"alias"`, `"value"`, `"units"`, ...) сюда **не относится** — это значения поля
572
642
  * `id`, см. parent-specific child-типы.
573
643
  */
574
- export type ConfigElementType = "text" | "attributeAlias" | "attributeValue" | "attributeUnits" | "attributeDescription" | "layerName" | "control" | "image" | "slideshow" | "svg" | "icon" | "tooltip" | "tags" | "link" | "button" | "camera" | "chart" | "legend" | "markdown" | "uploader" | "modal";
644
+ export type ConfigElementType = "text" | "attributeAlias" | "attributeValue" | "attributeUnits" | "attributeDescription" | "layerName" | "control" | "image" | "slideshow" | "svg" | "icon" | "tooltip" | "tags" | "link" | "button" | "camera" | "chart" | "legend" | "markdown" | "uploader" | "modal" | "table";
575
645
  export interface ConfigContainerChild extends Partial<ConfigContainer> {
576
646
  id?: string;
577
- type?: ConfigElementType;
647
+ /**
648
+ * Узел-лист. Кроме элементов сюда попадают фильтры — дети FiltersContainer тоже узлы конфига,
649
+ * а их `type` берётся из {@link FilterType}, а не из {@link ConfigElementType}.
650
+ */
651
+ type?: ConfigElementType | FilterType;
578
652
  templateName?: ContainerTemplate | HeaderTemplate;
579
653
  value?: string | number;
580
654
  defaultValue?: string | number;
@@ -623,7 +697,8 @@ export declare enum ContainerTemplate {
623
697
  EditDate = "EditDate",
624
698
  EditAttachment = "EditAttachment",
625
699
  Attachment = "Attachment",
626
- Divider = "Divider"
700
+ Divider = "Divider",
701
+ StructuredData = "StructuredData"
627
702
  }
628
703
  export declare enum HeaderTemplate {
629
704
  Default = "Default",
@@ -1,9 +1,4 @@
1
- import { SelectedFilter, TreeFilterValue } from '../types';
2
- /**
3
- * Объектное значение иерархического фильтра "tree" («уровень → массив id»),
4
- * в отличие от скалярных/массивных значений остальных фильтров.
5
- */
6
- export declare const isTreeFilterValue: (value?: SelectedFilter["value"]) => value is TreeFilterValue;
1
+ import { TreeFilterValue } from '../types';
7
2
  /**
8
3
  * Подставляет плейсхолдеры уровней `%name.l{N}` значениями id соответствующего уровня
9
4
  * (формат `[id1,id2,...]` для оператора IN). Уровни, отсутствующие в значении (или пустые),
@@ -0,0 +1,19 @@
1
+ import { ConfigFilter, FeaturesFilterValue, SelectedFilter, TreeFilterValue } from '../types';
2
+ /**
3
+ * Значение фильтра `valueType: "features"` — FeatureCollection со строками структурированных
4
+ * данных (контейнер `StructuredData`).
5
+ *
6
+ * Форма самодостаточна (`type: "FeatureCollection"`), поэтому конфиг для проверки не нужен.
7
+ */
8
+ export declare const isFeaturesFilterValue: (value?: SelectedFilter["value"]) => value is FeaturesFilterValue;
9
+ /**
10
+ * Объектное значение иерархического фильтра "tree" («уровень → массив id»).
11
+ *
12
+ * Вид значения определяется по конфигу фильтра: угадывать его по форме ненадёжно — `tree` и
13
+ * `features` оба объекты. Решают только два значения `valueType`: `"tree"` — да, `"features"` — нет.
14
+ * Всё остальное уходит в структурный фолбэк: у tree-фильтров в существующих конфигах `valueType`
15
+ * либо не проставлен, либо объявлен как `"array"` (значение при этом всё равно объектное), и
16
+ * трактовать такой фильтр как не-tree значило бы сломать их. Фолбэк намеренно узкий: ключи вида
17
+ * `l{N}`, значения — массивы. Пустой объект — это tree с пустым выбором, а не «неизвестное значение».
18
+ */
19
+ export declare const isTreeFilterValue: (value?: SelectedFilter["value"], configFilter?: ConfigFilter) => value is TreeFilterValue;
@@ -1,12 +1,13 @@
1
1
  import { QueryLayerServiceConfigurationDc } from '@evergis/api';
2
2
  import { ClientFeatureAttribute, ConfigFilter, SelectedFilter, SelectedFilters } from '../types';
3
- export declare const applyFiltersToCondition: ({ condition, name, defaultValue, filters, isSingle, isSetParams, }: {
3
+ export declare const applyFiltersToCondition: ({ condition, name, defaultValue, filters, isSingle, isSetParams, configFilter, }: {
4
4
  condition: string;
5
5
  name: string;
6
6
  defaultValue: SelectedFilter["value"];
7
7
  filters: SelectedFilters;
8
8
  isSingle?: boolean;
9
9
  isSetParams?: boolean;
10
+ configFilter?: ConfigFilter;
10
11
  }) => string | number;
11
12
  export declare const applyVarsToCondition: <T extends string | string[]>({ section, configFilters, filters, attributes, layerParams, eqlParameters, geometry, isSetParams, }: Pick<QueryLayerServiceConfigurationDc, "eqlParameters"> & {
12
13
  section: T;
@@ -1,2 +1,2 @@
1
1
  import { SelectedFilter, SelectedFilters } from '../types';
2
- export declare const getSelectedFilterValue: (filterName: string, selectedFilters: SelectedFilters, defaultValue: SelectedFilter["value"]) => string | number | Date | import('../types').TreeFilterValue | (string | number | Date | import('../types').TreeFilterValue)[];
2
+ export declare const getSelectedFilterValue: (filterName: string, selectedFilters: SelectedFilters, defaultValue: SelectedFilter["value"]) => string | number | Date | import('../types').TreeFilterValue | import('../types').FeaturesFilterValue | (string | number | Date | import('../types').TreeFilterValue | import('../types').FeaturesFilterValue)[];
@@ -16,6 +16,8 @@ export interface WrapperSizeParams {
16
16
  defaults?: CSSObject;
17
17
  /** Ширина по умолчанию, если `options.width` не задан. Контейнеры передают `FILL_SIZE`, элементы — нет. */
18
18
  defaultWidth?: CssSize;
19
+ /** `options.autoHeight`: высота — не жёсткий размер, а минимум, ниже которого узел не опускается. */
20
+ heightAsMin?: boolean;
19
21
  }
20
22
  export declare const isFillSize: (size?: CssSize) => boolean;
21
23
  /** Доля трека сетки: `"2fr"`, `"1.5fr"`. */
@@ -36,5 +38,9 @@ export declare const isFrSize: (size?: CssSize) => boolean;
36
38
  *
37
39
  * `overflow` уходит в CSS как есть и ничем не подменяется: не задан — работает браузерный
38
40
  * `visible`, то есть контент крупнее бокса вытекает на соседние слоты.
41
+ *
42
+ * `heightAsMin` переводит высоту в `min-height`: узел не опускается ниже неё, но перерастает под
43
+ * содержимое. Парного `minHeight: 0` в fill-режиме при этом нет — он немедленно погасил бы сам
44
+ * минимум, ради которого режим и включают.
39
45
  */
40
- export declare const getWrapperSizeStyle: ({ style, width: widthOption, height: heightOption, overflow, defaults, defaultWidth, }: WrapperSizeParams) => CSSObject | undefined;
46
+ export declare const getWrapperSizeStyle: ({ style, width: widthOption, height: heightOption, overflow, defaults, defaultWidth, heightAsMin, }: WrapperSizeParams) => CSSObject | undefined;
@@ -11,6 +11,7 @@ export * from './eqlParametersToPayload';
11
11
  export * from './formatChartRelatedValue';
12
12
  export * from './formatConditionValue';
13
13
  export * from './fetchQueryDescription';
14
+ export * from './filterValueKind';
14
15
  export * from './formatDataSourceCondition';
15
16
  export * from './formatElementValue';
16
17
  export * from './getAttributeByName';
@@ -16,7 +16,7 @@ export declare const DEFAULT_SYMBOL_HALO_COLOR = "#ffffff";
16
16
  export declare const DEFAULT_SYMBOL_PLACEMENT = "point";
17
17
  export declare const DEFAULT_SYMBOL_SPACING = 250;
18
18
  export declare const DEFAULT_ICON_OVERLAP = "never";
19
- export declare const DEFAULT_ICON_SIZE = 1;
19
+ export declare const DEFAULT_ICON_SIZE = 0.5;
20
20
  export declare const DEFAULT_ICON_ANCHOR = "center";
21
21
  export declare const DEFAULT_ICON_PADDING: number[];
22
22
  export declare const DEFAULT_ICON_ROTATE = 0;
@@ -1,4 +1,4 @@
1
- import { ClientStyle } from '../../types/styling';
1
+ import { ClientStyle } from '../../types';
2
2
  export interface LayerIconConfig {
3
3
  /** Идентификатор слоя */
4
4
  layerId: string;