@evergis/react 4.0.129 → 4.0.131

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 (38) hide show
  1. package/dist/components/Dashboard/componentTypes.d.ts +1 -1
  2. package/dist/components/Dashboard/components/AddButton/styled.d.ts +15 -0
  3. package/dist/components/Dashboard/components/index.d.ts +1 -0
  4. package/dist/components/Dashboard/constants.d.ts +12 -0
  5. package/dist/components/Dashboard/containers/AttachmentContainer/styled.d.ts +0 -1
  6. package/dist/components/Dashboard/containers/StructuredDataContainer/constants.d.ts +2 -0
  7. package/dist/components/Dashboard/containers/StructuredDataContainer/hooks/useStructuredData.d.ts +4 -0
  8. package/dist/components/Dashboard/containers/StructuredDataContainer/styled.d.ts +3 -0
  9. package/dist/components/Dashboard/containers/StructuredDataContainer/utils/filterValue.d.ts +3 -2
  10. package/dist/components/Dashboard/elements/ElementTable/components/TableCell.d.ts +1 -1
  11. package/dist/components/Dashboard/elements/ElementTable/constants.d.ts +5 -0
  12. package/dist/components/Dashboard/elements/ElementTable/hooks/useCellEditing.d.ts +25 -9
  13. package/dist/components/Dashboard/elements/ElementTable/hooks/useHeadOverlap.d.ts +15 -0
  14. package/dist/components/Dashboard/elements/ElementTable/hooks/useTableView.d.ts +10 -1
  15. package/dist/components/Dashboard/elements/ElementTable/styled.d.ts +51 -4
  16. package/dist/components/Dashboard/elements/ElementTable/types.d.ts +5 -0
  17. package/dist/components/Dashboard/elements/ElementTable/utils/tableBox.d.ts +20 -0
  18. package/dist/components/Dashboard/hooks/index.d.ts +1 -0
  19. package/dist/components/Dashboard/hooks/useDataSourceLoading.d.ts +2 -0
  20. package/dist/components/Dashboard/hooks/useGlobalContext.d.ts +2 -0
  21. package/dist/components/Dashboard/types.d.ts +8 -6
  22. package/dist/components/Dashboard/utils/applyQueryFilters.d.ts +3 -1
  23. package/dist/components/Dashboard/utils/formatDataSourceCondition.d.ts +5 -1
  24. package/dist/components/Dashboard/utils/getMapViewDataSources.d.ts +7 -0
  25. package/dist/components/Dashboard/utils/index.d.ts +2 -0
  26. package/dist/components/Dashboard/utils/toConditionsArray.d.ts +2 -0
  27. package/dist/contexts/GlobalContext/types.d.ts +4 -0
  28. package/dist/index.js +445 -127
  29. package/dist/index.js.map +1 -1
  30. package/dist/react.esm.js +439 -129
  31. package/dist/react.esm.js.map +1 -1
  32. package/package.json +3 -3
  33. package/dist/components/Dashboard/containers/StructuredDataContainer/useStructuredData.d.ts +0 -28
  34. package/dist/components/Dashboard/containers/StructuredDataContainer/useStructuredDataDraft.d.ts +0 -25
  35. package/dist/components/Dashboard/containers/StructuredDataContainer/useStructuredDataSave.d.ts +0 -17
  36. package/dist/components/Dashboard/containers/StructuredDataContainer/useStructuredDataSchema.d.ts +0 -11
  37. package/dist/components/Dashboard/elements/ElementTable/useCellEditing.d.ts +0 -15
  38. package/dist/components/Dashboard/elements/ElementTable/useTableView.d.ts +0 -16
@@ -109,7 +109,7 @@ export interface ElementSvgProps extends Omit<ContainerProps, "elementConfig"> {
109
109
  layerInfo?: QueryLayerServiceInfoDc;
110
110
  attributes?: ClientFeatureAttribute[];
111
111
  }
112
- export type ElementTableOptions = Pick<ConfigOptions, "columnNames" | "sort">;
112
+ export type ElementTableOptions = Pick<ConfigOptions, "sort" | "width" | "height">;
113
113
  export interface ElementTableConfig extends Omit<ConfigContainerChild, "options" | "type"> {
114
114
  type?: "table";
115
115
  options?: ElementTableOptions;
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Кнопка «добавить»: серая скруглённая, со значком и подписью. Общая на весь дашборд — вложения
3
+ * и таблица структурированных данных добавляют одинаковой кнопкой, разница только в значке.
4
+ *
5
+ * Размеры сняты с макета (все — в половину его пикселей, макет снят на удвоенной плотности):
6
+ * высота 24, поля 10, просвет между значком и подписью 6, значок 14, подпись 14.
7
+ *
8
+ * Скругление и ширина по содержимому — от самого `IconButton`: он скруглён по умолчанию, а с
9
+ * подписью в детях перестаёт держать фиксированную ширину. Значок ужат до 0.875rem: свой 1rem
10
+ * он заполняет краями, и на макете кружок мельче подписи, а не вровень с ней.
11
+ *
12
+ * Подпись темнее значка: `IconButton` красит и то и другое цветом иконки, но в макете подпись —
13
+ * обычный текст (`textPrimary`), а приглушён только значок.
14
+ */
15
+ export declare const AddButtonRow: import('styled-components').StyledComponent<import('react').FC<import('@evergis/uilib-gl').IIconButtonProps>, any, {}, never>;
@@ -1,3 +1,4 @@
1
+ export * from './AddButton/styled';
1
2
  export * from './AddFeatureButton';
2
3
  export * from './Chart';
3
4
  export * from './ChartLegend';
@@ -22,6 +22,18 @@ export declare const DEFAULT_CHART_ANGLE = 4;
22
22
  export declare const DEFAULT_CHART_HEIGHT = 90;
23
23
  export declare const STACK_BAR_TOTAL_HEIGHT = 20;
24
24
  export declare const FILTER_PREFIX = "%";
25
+ /** Имя системного геометрического фильтра — выделение, нарисованное пользователем на карте. */
26
+ export declare const GEOMETRY_FILTER_NAME = "geometry";
27
+ /** Имя системного фильтра «экстент видимой области карты» (EWKT, `SRID=3857`). */
28
+ export declare const EXTENT_FILTER_NAME = "extent";
29
+ /** Имя системного фильтра «уровень зума карты» (целое число). */
30
+ export declare const ZOOM_FILTER_NAME = "zoom";
31
+ /**
32
+ * Системные фильтры текущего вида карты. Их значения приходят не из `SelectedFilters`, а из
33
+ * `GlobalContext`, поэтому имена зарезервированы: одноимённый пользовательский фильтр будет
34
+ * перехвачен системной подстановкой — ровно как в случае `geometry`.
35
+ */
36
+ export declare const MAP_VIEW_FILTER_NAMES: string[];
25
37
  export declare const PROVIDER_PREFIX = "$";
26
38
  export declare enum ProviderPrefix {
27
39
  Card = "card",
@@ -34,6 +34,5 @@ export declare const ListActions: import('styled-components').StyledComponent<"d
34
34
  export declare const ListItemContainer: import('styled-components').StyledComponent<"div", any, {}, never>;
35
35
  export declare const ShowMoreButton: import('styled-components').StyledComponent<"div", any, {}, never>;
36
36
  export declare const AddButtonContainer: import('styled-components').StyledComponent<"div", any, {}, never>;
37
- export declare const AddButtonRow: import('styled-components').StyledComponent<import('react').FC<import('@evergis/uilib-gl').IIconButtonProps>, any, {}, never>;
38
37
  export declare const HiddenFileInput: import('styled-components').StyledComponent<"input", any, {}, never>;
39
38
  export declare const LinkDialogContent: import('styled-components').StyledComponent<"div", any, {}, never>;
@@ -1,4 +1,6 @@
1
1
  import { AttributeType } from '@evergis/api';
2
+ /** Слот представления: единственный ребёнок контейнера, рисующий данные (элемент `table`). */
3
+ export declare const STRUCTURED_DATA_VIEW_SLOT = "data";
2
4
  /**
3
5
  * Типы атрибутов с редактором ячейки. Атрибут любого другого типа показывается только на чтение,
4
6
  * даже если помечен `isEditable: true` — редактора для него нет.
@@ -9,6 +9,10 @@ import { StructuredDataContextValue } from '../types';
9
9
  * Вид источника на права правки не влияет — от него зависит только адресат «Сохранить». Слой
10
10
  * принимает запись через features-API, источник без `layerName` (EQL, python-скрипт, внешний
11
11
  * url) не принимает ничего, и правка такой таблицы уходит только в фильтр.
12
+ *
13
+ * Значение фильтра читается так же, как его читают остальные потребители дашборда: выбор
14
+ * пользователя, а пока его нет — `defaultValue` из конфига фильтра. Общего стейта, залитого
15
+ * дефолтами, в дашборде нет, поэтому фолбэк делает каждый потребитель сам.
12
16
  */
13
17
  export declare const useStructuredData: (type: WidgetType, elementConfig?: StructuredDataContainerConfig) => {
14
18
  contextValue: StructuredDataContextValue;
@@ -14,5 +14,8 @@ export declare const StructuredDataActions: import('styled-components').StyledCo
14
14
  /**
15
15
  * Область представления. Прокручивается внутри себя, чтобы длинная таблица не растягивала
16
16
  * контейнер за пределы отведённой ему ячейки; `min-height: 0` разрешает flex-ребёнку сжиматься.
17
+ *
18
+ * Собственный бокс таблицы (`options.width`/`height` представления) живёт внутри и на эту
19
+ * прокрутку не влияет: он ограничивает саму таблицу, а не отведённое контейнером место.
17
20
  */
18
21
  export declare const StructuredDataView: import('styled-components').StyledComponent<"div", any, import('@evergis/uilib-gl').FlexProps, never>;
@@ -3,8 +3,9 @@ import { DraftRow, StructuredDataAttribute } from '../types';
3
3
  /**
4
4
  * Строки черновика → значение фильтра `valueType: "features"`.
5
5
  *
6
- * В `properties` попадают ВСЕ атрибуты схемы, а не только показанные колонками: схема и вид
7
- * разделены, и вид не должен резать данные. Геометрия не поддерживается `geometry: null`.
6
+ * В `properties` попадает ровно схема: значения по её атрибутам, включая незаполненные. Лишние
7
+ * ключи черновика (пришли из источника, остались от прежней схемы) наружу не уходят, а объявленный
8
+ * атрибут уходит всегда. Геометрия не поддерживается — `geometry: null`.
8
9
  */
9
10
  export declare const toFeaturesFilterValue: (rows: DraftRow[], schema: StructuredDataAttribute[]) => FeaturesFilterValue;
10
11
  /**
@@ -3,7 +3,7 @@ import { TableCellProps } from '../types';
3
3
  /**
4
4
  * Ячейка таблицы.
5
5
  *
6
- * Вне фокуса значение всегда показано через `stringFormat` редактор подставляется по клику.
6
+ * Вне фокуса значение всегда показано через `stringFormat`, редактор подставляется на фокус.
7
7
  * Иначе форматирование (округление, разряды, единицы) пришлось бы дублировать внутри инпута,
8
8
  * а вводить в отформатированное поле нельзя.
9
9
  */
@@ -1,3 +1,8 @@
1
+ /**
2
+ * Насколько тело таблицы заехало под липкую шапку. Пишется на таблицу при прокрутке, читается
3
+ * стилем тела: ровно на эту величину тело и отсекается.
4
+ */
5
+ export declare const HEAD_OVERLAP_VARIABLE = "--table-head-overlap";
1
6
  /**
2
7
  * Признак времени в шаблоне `stringFormat.format`.
3
8
  *
@@ -1,15 +1,31 @@
1
- import { KeyboardEvent } from 'react';
1
+ import { FocusEvent, KeyboardEvent } from 'react';
2
2
  /**
3
- * Режим правки одной ячейки: открывается кликом по значению, закрывается кликом снаружи.
3
+ * Правка одной ячейки.
4
4
  *
5
- * Закрывать по `blur` нельзя: `DatePicker` уводит фокус из поля уже на клике по иконке
6
- * календаряредактор исчезал бы раньше, чем календарь успевал открыться. Поэтому слушаем
7
- * `mousedown` на документе, а клики внутри портала (`#portal-root`) считаем «своими»:
8
- * выпадающие слои контролов uilib живут именно там, вне DOM-поддерева ячейки.
5
+ * Открывает её фокус, а не клик: по таблице ходят Tab-ом, и на каждой ячейке сразу нужно поле
6
+ * с курсором кнопка, требующая ещё и Enter, ломала бы весь проход.
7
+ *
8
+ * Поэтому состояний три. `focused` ячейка под фокусом с закрытым редактором, состояние после
9
+ * Enter/Escape: фокус возвращается на кнопку, но правку заново не открывает (иначе выйти из неё
10
+ * было бы нечем), а Tab с неё идёт дальше по таблице.
11
+ *
12
+ * Закрывать правку по любому уходу фокуса нельзя: DatePicker уводит его из поля уже на клике по
13
+ * иконке календаря — редактор исчезал бы раньше, чем календарь успевал открыться. Клавиатурный
14
+ * уход видно по `relatedTarget` (фокус ушёл на соседнюю ячейку), мышиный ловит `mousedown`
15
+ * снаружи. Клики внутри портала (`#portal-root`) считаем «своими»: выпадающие слои контролов
16
+ * uilib живут именно там, вне DOM-поддерева ячейки.
9
17
  */
10
18
  export declare const useCellEditing: () => {
11
19
  editing: boolean;
12
- editorRef: import('react').MutableRefObject<HTMLDivElement>;
13
- startEditing: () => void;
14
- onKeyDown: ({ key }: KeyboardEvent<HTMLDivElement>) => void;
20
+ buttonProps: {
21
+ ref: import('react').MutableRefObject<HTMLButtonElement>;
22
+ onFocus: () => void;
23
+ onBlur: () => void;
24
+ onClick: () => void;
25
+ };
26
+ editorProps: {
27
+ ref: import('react').MutableRefObject<HTMLDivElement>;
28
+ onBlur: ({ relatedTarget }: FocusEvent<HTMLDivElement>) => void;
29
+ onKeyDown: (event: KeyboardEvent<HTMLDivElement>) => void;
30
+ };
15
31
  };
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Отсечка тела таблицы по нижней кромке липкой шапки.
3
+ *
4
+ * Шапка прозрачная — фон контейнера виден сквозь неё, и красить её нечем: цвет контейнера задаётся
5
+ * конфигом и меняется. Значит, строки не должны под неё заезжать в принципе. Тело для этого
6
+ * отсекается (`clip-path`) ровно на то, на сколько шапка его накрыла: низ шапки минус верх тела.
7
+ *
8
+ * Разница считается по факту, а не по величине прокрутки: она одинаково верна и когда прокручивает
9
+ * собственный бокс таблицы, и когда её прокручивает область представления контейнера. Пока
10
+ * не прокручено, низ шапки совпадает с верхом тела — отсекать нечего.
11
+ *
12
+ * Прокрутка не всплывает, но проходит фазу перехвата, поэтому слушаем документ: какой именно
13
+ * предок прокручивается, знать не нужно.
14
+ */
15
+ export declare const useHeadOverlap: (table: HTMLTableElement | null) => void;
@@ -1,10 +1,17 @@
1
1
  import { ElementTableConfig } from '../../../types';
2
2
  import { TableSort } from '../types';
3
3
  /**
4
- * Вид таблицы: набор и порядок колонок из `columnNames` плюс локальная сортировка.
4
+ * Вид таблицы: колонки плюс локальная сортировка.
5
+ *
6
+ * Набор и порядок колонок — это схема контейнера (`attributesDescription`) как есть: показываем
7
+ * ровно то, что описано, и в том же порядке. Своего отбора у представления нет — иначе описанный
8
+ * атрибут и видимая колонка расходились бы, а в фильтр всё равно уходят все атрибуты схемы.
5
9
  *
6
10
  * Сортировка живёт здесь, а не в контейнере: она ничего не меняет в данных и не должна
7
11
  * влиять на порядок строк, уходящих в фильтр.
12
+ *
13
+ * `width`/`height` — размер собственного бокса таблицы: он ограничивает её саму и прокручивает
14
+ * то, что не влезло. Место, отведённое контейнеру, задаётся его же опциями и живёт отдельно.
8
15
  */
9
16
  export declare const useTableView: (elementConfig?: ElementTableConfig) => {
10
17
  context: import('../../../containers/StructuredDataContainer/types').StructuredDataContextValue;
@@ -12,5 +19,7 @@ export declare const useTableView: (elementConfig?: ElementTableConfig) => {
12
19
  rows: import('../../../containers/StructuredDataContainer/types').DraftRow[];
13
20
  sort: TableSort;
14
21
  sortEnabled: boolean;
22
+ sizeCss: import('styled-components').CSSObject;
23
+ contentWidth: boolean;
15
24
  onSortToggle: (attributeName: string) => void;
16
25
  };
@@ -1,15 +1,59 @@
1
- export declare const TableWrapper: import('styled-components').StyledComponent<"table", any, {}, never>;
1
+ import { ContainerRootProps } from '../../styled';
2
+ /**
3
+ * Собственный бокс таблицы. Без размеров в `options` представления узел ничего не меняет:
4
+ * таблица растёт под содержимое, а прокручивает лишнее область представления контейнера.
5
+ *
6
+ * С размерами бокс становится её скролл-контейнером — и липкая шапка липнет уже к нему.
7
+ */
8
+ export declare const TableBox: import('styled-components').StyledComponent<"div", any, ContainerRootProps, never>;
9
+ /**
10
+ * Таблица. По умолчанию втискивается в ширину, которую ей дали: колонкам достаётся то, что есть,
11
+ * а длинные значения режутся многоточием внутри ячейки.
12
+ *
13
+ * `$contentWidth` (ширина бокса задана в `options`) переводит её на ширину по содержимому:
14
+ * колонки встают по своим значениям, предел ячейки снимается, и всё, что не влезло, уходит
15
+ * в горизонтальную прокрутку бокса. Иначе вышла бы бессмыслица — бокс с прокруткой, а значения
16
+ * всё равно с многоточием. `min-width` оставляет таблицу растянутой на весь бокс, когда
17
+ * содержимого на его ширину не набирается.
18
+ *
19
+ * Снятый предел ширины ячейки едет вниз css-переменной, а не правилом по `TableCellWrapper`:
20
+ * ячейка объявлена ниже по файлу, и селектор по ней отсюда попал бы в TDZ.
21
+ */
22
+ export declare const TableWrapper: import('styled-components').StyledComponent<"table", any, {
23
+ $contentWidth?: boolean;
24
+ }, never>;
2
25
  /**
3
26
  * Шапка липнет к верху области прокрутки — при длинной таблице заголовки остаются видны.
4
27
  *
5
- * Собственного фона у шапки нет: цвет из палитры не следовал за подложкой контейнера
6
- * и выделялся белым прямоугольником на любом фоне, отличном от базового.
28
+ * Своего фона у неё нет и не должно быть: контейнер дашборда красится цветом из конфига, и любой
29
+ * назначенный шапке цвет остался бы прямоугольником чужого цвета, как только фон контейнера
30
+ * поменяли. Под шапкой виден фон контейнера, а строки под неё не заезжают — тело отсечено
31
+ * (см. TableBody и useHeadOverlap).
7
32
  */
8
33
  export declare const TableHead: import('styled-components').StyledComponent<"thead", any, {}, never>;
9
34
  export declare const TableHeadCell: import('styled-components').StyledComponent<"th", any, {
10
35
  $sortable?: boolean;
11
36
  }, never>;
12
37
  export declare const TableHeadContent: import('styled-components').StyledComponent<"span", any, {}, never>;
38
+ /**
39
+ * Место под значок сортировки. Занято всегда, пока сортировка включена, а сам значок только
40
+ * прячется: появляясь и исчезая, он менял бы ширину колонки — и таблицу дёргало бы на каждый
41
+ * клик по заголовку, вместе с телом. Оба направления рисуются значком в 1rem, поэтому
42
+ * переключение asc/des ширину тоже не трогает.
43
+ */
44
+ export declare const TableSortSlot: import('styled-components').StyledComponent<"span", any, {
45
+ $active?: boolean;
46
+ }, never>;
47
+ /**
48
+ * Тело таблицы. Отсекается ровно на то, на сколько его накрыла липкая шапка: строки уходят под
49
+ * её нижнюю кромку и сквозь прозрачную шапку не проступают. Величину пишет {@link useHeadOverlap},
50
+ * без неё отсечка нулевая и разметка не меняется.
51
+ */
52
+ export declare const TableBody: import('styled-components').StyledComponent<"tbody", any, {}, never>;
53
+ /**
54
+ * Строка. Разделитель рисуют её ячейки: собственная рамка строки при раздельных рамках не
55
+ * рисуется вовсе, а при схлопнутых её рисовала бы таблица — и отсечка тела её бы не резала.
56
+ */
13
57
  export declare const TableRow: import('styled-components').StyledComponent<"tr", any, {}, never>;
14
58
  export declare const TableCellWrapper: import('styled-components').StyledComponent<"td", any, {}, never>;
15
59
  /** Колонка действий: узкая, не растягивается содержимым. */
@@ -17,7 +61,10 @@ export declare const TableActionsCell: import('styled-components').StyledCompone
17
61
  export declare const CellText: import('styled-components').StyledComponent<"div", any, {}, never>;
18
62
  /**
19
63
  * Редактируемая ячейка вне фокуса. Показывает значение по `stringFormat`, а редактор
20
- * подставляется по клику — иначе форматирование пришлось бы дублировать внутри инпута.
64
+ * подставляется на фокус — иначе форматирование пришлось бы дублировать внутри инпута.
65
+ *
66
+ * Кнопка, а не просто текст, именно ради фокуса: она — таб-стоп ячейки, и Tab по таблице
67
+ * открывает редактор с курсором внутри.
21
68
  */
22
69
  export declare const CellButton: import('styled-components').StyledComponent<"button", any, {}, never>;
23
70
  export declare const CellPlaceholder: import('styled-components').StyledComponent<"span", any, {}, never>;
@@ -1,6 +1,11 @@
1
1
  import { FeatureAttributeValue } from '../../../../types';
2
2
  import { DraftRow, StructuredDataAttribute } from '../../containers/StructuredDataContainer/types';
3
3
  export type SortDirection = "asc" | "desc";
4
+ /**
5
+ * Состояние правки ячейки: закрыта, закрыта под фокусом (вышли из редактора по Enter/Escape),
6
+ * открыт редактор.
7
+ */
8
+ export type CellMode = "idle" | "focused" | "editing";
4
9
  /** Сортировка представления: одна колонка за раз, `null` — исходный порядок строк. */
5
10
  export interface TableSort {
6
11
  attributeName: string;
@@ -0,0 +1,20 @@
1
+ import { CSSObject } from 'styled-components';
2
+ import { CssSize } from '../../../types';
3
+ /**
4
+ * Css собственного бокса таблицы: размер из `options` представления плюс прокрутка того,
5
+ * что в этот размер не влез.
6
+ *
7
+ * Размеров нет — нет и бокса: таблица занимает столько, сколько просит содержимое, а лишнее,
8
+ * как и раньше, уходит в прокрутку области представления контейнера.
9
+ *
10
+ * Проценты работают только по ширине. Между областью представления и таблицей стоит блочная
11
+ * обёртка элемента (`ElementValueWrapper`) с высотой `auto`, и `height: "100%"` в ней не
12
+ * разрешается — вертикальный предел задают конкретные единицы (`240`, `"20rem"`, `"50vh"`),
13
+ * а «занять всю выданную высоту» остаётся за `options.height` контейнера.
14
+ *
15
+ * `contain: inline-size` идёт в пару к fill-ширине: сама по себе она предком не ограничена
16
+ * (процент от раскладки, которая меряет себя содержимым, вырождается в `auto`), и таблица
17
+ * распирала бы ряд плиток или трек `auto` изнутри. С containment вклад бокса в ширину предка
18
+ * обнуляется: ширину он берёт снаружи, а внутрь по ней не смотрят.
19
+ */
20
+ export declare const getTableBoxStyle: (width?: CssSize, height?: CssSize) => CSSObject | undefined;
@@ -9,6 +9,7 @@ export * from './useFetchWithAuth';
9
9
  export * from './useChartChange';
10
10
  export * from './useChartData';
11
11
  export * from './useDashboardHeader';
12
+ export * from './useDataSourceLoading';
12
13
  export * from './useDataSources';
13
14
  export * from './useDiffPage';
14
15
  export * from './useEqualTileWidth';
@@ -0,0 +1,2 @@
1
+ import { WidgetType } from '../types';
2
+ export declare const useDataSourceLoading: (type: WidgetType) => boolean;
@@ -5,6 +5,8 @@ export declare const useGlobalContext: () => {
5
5
  themeName: import('../../..').ThemeName;
6
6
  api: import('@evergis/api').Api;
7
7
  ewktGeometry: string;
8
+ ewktExtent: string;
9
+ zoomLevel: number;
8
10
  notification: {
9
11
  add: (item: import('@evergis/uilib-gl').INotificationItem) => void;
10
12
  update: (patch: Partial<import('@evergis/uilib-gl').INotificationItem> & {
@@ -358,12 +358,6 @@ export interface ConfigCollectionOptions {
358
358
  otherItems?: number;
359
359
  orderByValue?: boolean;
360
360
  orderByTitle?: boolean;
361
- /**
362
- * Имена атрибутов схемы, показываемые колонками представления `table`. Подмножество
363
- * `attributesDescription` родительского контейнера; порядок колонок — порядок этого массива.
364
- * Не задано — показываются все атрибуты схемы.
365
- */
366
- columnNames?: string[];
367
361
  /** Разрешить сортировку представления кликом по заголовку колонки. Сортировка локальная — только вид. */
368
362
  sort?: boolean;
369
363
  viewMode?: ViewMode;
@@ -488,6 +482,14 @@ export interface ConfigDataSource {
488
482
  url?: string;
489
483
  type?: string;
490
484
  autoSyncLayer?: boolean;
485
+ /**
486
+ * Задержка перед запросом источника, мс. `0` или отсутствие поля — запрос сразу.
487
+ *
488
+ * Дебаунсит ЛЮБОЙ перезапрос источника: смену фильтров, движение карты (`%extent` / `%zoom`),
489
+ * autoSync-уведомления, правку конфига и первичную загрузку. Нужна тяжёлым источникам, чтобы
490
+ * серия быстрых событий схлопывалась в один запрос.
491
+ */
492
+ debounce?: number;
491
493
  }
492
494
  export interface EqlDataSource {
493
495
  items: FeatureDc[];
@@ -1,10 +1,12 @@
1
1
  import { ClientFeatureAttribute, ConfigFilter, SelectedFilters, WidgetDataSource } from '../types';
2
2
  import { QueryLayerServiceInfoDc } from '@evergis/api';
3
- export declare const applyQueryFilters: ({ parameters: configParameters, filters: configFilters, selectedFilters, geometry, attributes, layerInfo, dataSources, projectDataSources, }: {
3
+ export declare const applyQueryFilters: ({ parameters: configParameters, filters: configFilters, selectedFilters, geometry, extent, zoomLevel, attributes, layerInfo, dataSources, projectDataSources, }: {
4
4
  parameters: Record<string, any>;
5
5
  filters: ConfigFilter[];
6
6
  selectedFilters?: SelectedFilters;
7
7
  geometry?: string;
8
+ extent?: string;
9
+ zoomLevel?: number;
8
10
  attributes?: ClientFeatureAttribute[];
9
11
  layerInfo?: QueryLayerServiceInfoDc;
10
12
  dataSources: WidgetDataSource[];
@@ -9,13 +9,15 @@ export declare const applyFiltersToCondition: ({ condition, name, defaultValue,
9
9
  isSetParams?: boolean;
10
10
  configFilter?: ConfigFilter;
11
11
  }) => string | number;
12
- export declare const applyVarsToCondition: <T extends string | string[]>({ section, configFilters, filters, attributes, layerParams, eqlParameters, geometry, isSetParams, }: Pick<QueryLayerServiceConfigurationDc, "eqlParameters"> & {
12
+ export declare const applyVarsToCondition: <T extends string | string[]>({ section, configFilters, filters, attributes, layerParams, eqlParameters, geometry, extent, zoomLevel, isSetParams, }: Pick<QueryLayerServiceConfigurationDc, "eqlParameters"> & {
13
13
  section: T;
14
14
  configFilters: ConfigFilter[];
15
15
  filters: SelectedFilters;
16
16
  attributes?: ClientFeatureAttribute[];
17
17
  layerParams?: Record<string, string>;
18
18
  geometry?: string;
19
+ extent?: string;
20
+ zoomLevel?: number;
19
21
  isSetParams?: boolean;
20
22
  }) => T;
21
23
  type FormatDataSourceConditionParams = {
@@ -25,6 +27,8 @@ type FormatDataSourceConditionParams = {
25
27
  eqlParameters?: QueryLayerServiceConfigurationDc["eqlParameters"];
26
28
  layerParams?: Record<string, string>;
27
29
  geometry?: string;
30
+ extent?: string;
31
+ zoomLevel?: number;
28
32
  };
29
33
  export declare const formatDataSourceCondition: ({ condition, ...rest }: FormatDataSourceConditionParams & {
30
34
  condition?: string | string[];
@@ -0,0 +1,7 @@
1
+ import { ConfigDataSource } from '../types';
2
+ /**
3
+ * Источники, чей запрос зависит от текущего вида карты — в `parameters` или `condition` у них
4
+ * есть `%extent` / `%zoom`. Перезапрашивают при движении карты только их: иначе каждый пан
5
+ * дёргал бы все запросы страницы.
6
+ */
7
+ export declare const getMapViewDataSources: (dataSources?: ConfigDataSource[]) => ConfigDataSource[];
@@ -38,6 +38,7 @@ export * from './getFeatureCardHeader';
38
38
  export * from './getFilterComponent';
39
39
  export * from './getFilterSelectedItems';
40
40
  export * from './getFilterValue';
41
+ export * from './getMapViewDataSources';
41
42
  export * from './getFormattedAttributes';
42
43
  export * from './getImageUrl';
43
44
  export * from './getLayerInfo';
@@ -69,6 +70,7 @@ export * from './pieChartTooltipFromRelatedFeatures';
69
70
  export * from './removeDataSource';
70
71
  export * from './updateDataSource';
71
72
  export * from './sliceShownOtherItems';
73
+ export * from './toConditionsArray';
72
74
  export * from './toCssSize';
73
75
  export * from './toRenderableValue';
74
76
  export * from './tooltipNameFromAttributes';
@@ -0,0 +1,2 @@
1
+ /** Условие источника задаётся строкой или массивом строк — приводим к массиву для единообразного обхода. */
2
+ export declare const toConditionsArray: (value?: string | string[]) => string[];
@@ -7,6 +7,10 @@ export type GlobalContextProps = PropsWithChildren<{
7
7
  t?: i18n["t"];
8
8
  language?: string;
9
9
  ewktGeometry?: string;
10
+ /** Экстент видимой области карты в EWKT (`SRID=3857;POLYGON((...))`) — плейсхолдер `%extent`. */
11
+ ewktExtent?: string;
12
+ /** Целый уровень зума карты — плейсхолдер `%zoom`. */
13
+ zoomLevel?: number;
10
14
  themeName?: ThemeName;
11
15
  api?: Api;
12
16
  notification?: {