@dartcom/ui-kit 10.5.24 → 10.6.1

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.
@@ -1 +1 @@
1
- {"version":3,"file":"modal.d.ts","sourceRoot":"","sources":["../../../src/components/modal/modal.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAU/B,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;;AAiD3C,wBAAqC"}
1
+ {"version":3,"file":"modal.d.ts","sourceRoot":"","sources":["../../../src/components/modal/modal.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAS/B,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;;AAkC3C,wBAAqC"}
@@ -1 +1 @@
1
- import{jsx as e}from"react/jsx-runtime";import*as o from"react";import"../../stores/alert/alert.esm.js";import{modalStore as m}from"../../stores/modal/modal.esm.js";import r from"@mui/material/Box";import s from"@mui/material/Modal";import"../../node_modules/mobx-react-lite/es/index.esm.js";import{modalStyle as t}from"./styles.esm.js";import{observer as i}from"../../node_modules/mobx-react-lite/es/observer.esm.js";var a=i(({name:i,children:a,onClose:l,onOpen:n})=>{const d=o.useId(),p=m.getIsOpen(i);return o.useEffect(()=>{p?n?.({name:i}):l?.({name:i})},[p]),e(s,{open:p,onClose:()=>{m.close(i)},"aria-labelledby":`modal-${d}-title`,"aria-describedby":`modal-${d}-description`,children:e(r,{sx:({breakpoints:e})=>({...t,[e.up("sm")]:{minWidth:400},[e.down("sm")]:{minWidth:"80vw"}}),children:a})})});export{a as default};
1
+ import{jsx as e}from"react/jsx-runtime";import*as o from"react";import"../../stores/alert/alert.esm.js";import{modalStore as r}from"../../stores/modal/modal.esm.js";import m from"@mui/material/Modal";import"../../node_modules/mobx-react-lite/es/index.esm.js";import{ModalContainer as s}from"./styles.esm.js";import{observer as t}from"../../node_modules/mobx-react-lite/es/observer.esm.js";var a=t(({name:t,children:a,onClose:l,onOpen:i})=>{const d=o.useId(),n=r.getIsOpen(t);return o.useEffect(()=>{n?i?.({name:t}):l?.({name:t})},[n]),e(m,{open:n,onClose:()=>{r.close(t)},"aria-labelledby":`modal-${d}-title`,"aria-describedby":`modal-${d}-description`,children:e(s,{children:a})})});export{a as default};
@@ -1,3 +1,2 @@
1
- import { SxProps } from '@mui/material';
2
- export declare const modalStyle: SxProps;
1
+ export declare const ModalContainer: import("@emotion/styled").StyledComponent<import("@mui/system").BoxOwnProps<import("@mui/material").Theme> & Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, keyof import("@mui/system").BoxOwnProps<import("@mui/material").Theme>> & import("@mui/system").MUIStyledCommonProps<import("@mui/material").Theme>, {}, {}>;
3
2
  //# sourceMappingURL=styles.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../../src/components/modal/styles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAExC,eAAO,MAAM,UAAU,EAAE,OAcxB,CAAC"}
1
+ {"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../../src/components/modal/styles.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,cAAc,mXA6BzB,CAAC"}
@@ -1 +1 @@
1
- const o={position:"absolute",top:"50%",left:"50%",transform:"translate(-50%, -50%)",bgcolor:"background.paper",border:"2px solid #000",boxShadow:24,p:4,maxHeight:"90vh",overflowX:"auto",overflowY:"auto"};export{o as modalStyle};
1
+ import{styled as t,Box as o}from"@mui/material";const i=t(o)(({theme:t})=>{const{spacing:o,breakpoints:i,palette:a}=t;return{position:"absolute",top:"50%",left:"50%",transform:"translate(-50%, -50%)",backgroundColor:a.white.main,borderRadius:o(2),padding:o(2),maxHeight:"90vh",overflow:"auto",[i.up("sm")]:{minWidth:400},[i.down("sm")]:{minWidth:"80vw"}}});export{i as ModalContainer};
@@ -1,10 +1,10 @@
1
1
  export interface CustomModalProps {
2
2
  name: string;
3
3
  onClose?: (props: {
4
- name: CustomModalProps['name'];
4
+ name: string;
5
5
  }) => void;
6
6
  onOpen?: (props: {
7
- name: CustomModalProps['name'];
7
+ name: string;
8
8
  }) => void;
9
9
  }
10
10
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/modal/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IAEb,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,gBAAgB,CAAC,MAAM,CAAC,CAAA;KAAE,KAAK,IAAI,CAAC;IAC9D,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,gBAAgB,CAAC,MAAM,CAAC,CAAA;KAAE,KAAK,IAAI,CAAC;CAC9D"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/modal/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IAEb,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IAC5C,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;CAC5C"}
package/dist/index.cjs CHANGED
@@ -20,7 +20,6 @@ var Checkbox = require('@mui/material/Checkbox');
20
20
  var FormControlLabel = require('@mui/material/FormControlLabel');
21
21
  var styles$2 = require('@mui/material/styles');
22
22
  var DateField$1 = require('@mui/x-date-pickers/DateField');
23
- var Box = require('@mui/material/Box');
24
23
  var Modal = require('@mui/material/Modal');
25
24
  var lab = require('@mui/lab');
26
25
  var xDatePickers = require('@mui/x-date-pickers');
@@ -5662,9 +5661,134 @@ class ApiService {
5662
5661
  }
5663
5662
  }
5664
5663
 
5664
+ /**
5665
+ * SetService<T>
5666
+ *
5667
+ * Небольшой обёрткой над observable Set из MobX, которая:
5668
+ * - хранит уникальные значения типа T;
5669
+ * - предоставляет реактивные геттеры items / list;
5670
+ * - даёт удобные методы add / delete / toggle / clear;
5671
+ * - поддерживает batch‑операции addMany / deleteMany.
5672
+ *
5673
+ * Типичный сценарий использования:
5674
+ * - хранение множества выбранных id;
5675
+ * - хранение множества активных фильтров;
5676
+ * - хранение множества "выделенных" элементов в UI.
5677
+ *
5678
+ * Пример:
5679
+ * const selection = new SetService<string>();
5680
+ * selection.add('id-1');
5681
+ * selection.toggle('id-2');
5682
+ * selection.isContain('id-1'); // true
5683
+ */
5684
+ class SetService {
5685
+ /**
5686
+ * Внутренний набор значений.
5687
+ *
5688
+ * Используется observable.set, чтобы:
5689
+ * - изменения были реактивны для MobX;
5690
+ * - операции add/delete были O(1) по времени.
5691
+ */
5692
+ _items = observable.set();
5693
+ /**
5694
+ * Возвращает observable Set со всеми значениями.
5695
+ *
5696
+ * Подходит, если нужно работать с Set напрямую:
5697
+ * setService.items.has(value)
5698
+ */
5699
+ get items() {
5700
+ return this._items;
5701
+ }
5702
+ /**
5703
+ * Возвращает значения набора в виде обычного массива.
5704
+ *
5705
+ * Удобно использовать в React-компонентах:
5706
+ * setService.list.map(...)
5707
+ */
5708
+ get list() {
5709
+ return Array.from(this.items.values());
5710
+ }
5711
+ /**
5712
+ * Проверяет, содержится ли значение в наборе.
5713
+ *
5714
+ * @param value Значение для проверки.
5715
+ * @returns true, если value есть в наборе; иначе false.
5716
+ */
5717
+ has(value) {
5718
+ return this.items.has(value);
5719
+ }
5720
+ /**
5721
+ * Возвращает значение, пустой ли список
5722
+ * @returns true, если в списке нет ни одного элемента; иначе false.
5723
+ */
5724
+ get isEmpty() {
5725
+ return this.items.size === 0;
5726
+ }
5727
+ /**
5728
+ * Добавляет значение в набор.
5729
+ *
5730
+ * @param value Значение для добавления.
5731
+ */
5732
+ add(value) {
5733
+ this._items.add(value);
5734
+ }
5735
+ /**
5736
+ * Добавляет в набор несколько значений подряд.
5737
+ *
5738
+ * @param values Массив значений для добавления.
5739
+ */
5740
+ addMany(values) {
5741
+ values.forEach((value) => {
5742
+ this.add(value);
5743
+ });
5744
+ }
5745
+ /**
5746
+ * Удаляет значение из набора.
5747
+ *
5748
+ * @param value Значение для удаления.
5749
+ */
5750
+ delete(value) {
5751
+ this._items.delete(value);
5752
+ }
5753
+ /**
5754
+ * Удаляет из набора несколько значений подряд.
5755
+ *
5756
+ * @param values Массив значений для удаления.
5757
+ */
5758
+ deleteMany(values) {
5759
+ values.forEach((value) => {
5760
+ this.delete(value);
5761
+ });
5762
+ }
5763
+ /**
5764
+ * Переключает присутствие значения в наборе.
5765
+ *
5766
+ * Поведение:
5767
+ * - если значение уже есть, оно будет удалено;
5768
+ * - если значения нет, оно будет добавлено.
5769
+ *
5770
+ * @param value Значение для переключения.
5771
+ */
5772
+ toggle(value) {
5773
+ if (this.has(value)) {
5774
+ this.delete(value);
5775
+ }
5776
+ else {
5777
+ this.add(value);
5778
+ }
5779
+ }
5780
+ /**
5781
+ * Полностью очищает набор.
5782
+ */
5783
+ clear() {
5784
+ this._items.clear();
5785
+ }
5786
+ }
5787
+
5665
5788
  class CollectionService {
5666
5789
  props;
5667
5790
  _items = observable.map();
5791
+ selectedIds = new SetService();
5668
5792
  constructor(props) {
5669
5793
  this.props = props;
5670
5794
  makeAutoObservable(this);
@@ -5780,8 +5904,8 @@ class CollectionService {
5780
5904
  clear() {
5781
5905
  this._items.clear();
5782
5906
  this.updatedId = null;
5783
- this.selectedId = null;
5784
5907
  this.deletedId = null;
5908
+ this.selectedIds.clear();
5785
5909
  }
5786
5910
  _updatedId = null;
5787
5911
  get updatedId() {
@@ -5796,18 +5920,8 @@ class CollectionService {
5796
5920
  return item;
5797
5921
  }
5798
5922
  }
5799
- _selectedId = null;
5800
- get selectedId() {
5801
- return this._selectedId;
5802
- }
5803
- set selectedId(value) {
5804
- this._selectedId = value;
5805
- }
5806
- get selectedItem() {
5807
- if (this.selectedId != null) {
5808
- const item = this.getById(this.selectedId);
5809
- return item;
5810
- }
5923
+ get isUpdated() {
5924
+ return this.updatedId !== null;
5811
5925
  }
5812
5926
  _deletedId = null;
5813
5927
  get deletedId() {
@@ -5822,6 +5936,9 @@ class CollectionService {
5822
5936
  return item;
5823
5937
  }
5824
5938
  }
5939
+ get isDeleted() {
5940
+ return this.deletedId !== null;
5941
+ }
5825
5942
  }
5826
5943
 
5827
5944
  /**
@@ -9315,6 +9432,60 @@ class MapService {
9315
9432
  }
9316
9433
  }
9317
9434
  }
9435
+ /**
9436
+ * Вычисляет два узла, расположенных перпендикулярно отрезку
9437
+ * в его конечной точке на заданном расстоянии.
9438
+ *
9439
+ * Алгоритм:
9440
+ * 1. Вычисляет обратный азимут (направление от конечной точки к начальной).
9441
+ * 2. Поворачивает его на ±90° — получает два перпендикулярных направления.
9442
+ * 3. Смещает конечную точку на `offset` метров в каждую сторону,
9443
+ * используя плоскую аппроксимацию (приемлемо при offset ≤ 2000 м).
9444
+ *
9445
+ * Принимает и возвращает координаты в формате {@link FrontendLatLng}
9446
+ * (`{ lat, lng }`) для прямой совместимости с Leaflet.
9447
+ *
9448
+ * Типичный сценарий использования: построение нормалей к маршруту,
9449
+ * поперечных контрольных точек, перпендикулярных смещений на линии.
9450
+ *
9451
+ * @param params - Параметры расчёта.
9452
+ * @param params.from - Начальная точка отрезка.
9453
+ * @param params.to - Конечная точка отрезка. Перпендикуляр строится именно здесь.
9454
+ * @param params.offset - Расстояние смещения в метрах (по умолчанию 100 м).
9455
+ * @returns Два узла в формате {@link FrontendLatLng}, сдвинутых перпендикулярно
9456
+ * отрезку влево и вправо от конечной точки.
9457
+ *
9458
+ * @example
9459
+ * const { left, right } = mapService.getPerpendicularPoints({
9460
+ * from: { lat: 55.75, lng: 37.61 },
9461
+ * to: { lat: 55.76, lng: 37.62 },
9462
+ * });
9463
+ */
9464
+ getPerpendicularPoints({ from, to, offset = 100, }) {
9465
+ const φ1 = from.lat * this.DEG_TO_RAD;
9466
+ const λ1 = from.lng * this.DEG_TO_RAD;
9467
+ const φ2 = to.lat * this.DEG_TO_RAD;
9468
+ const λ2 = to.lng * this.DEG_TO_RAD;
9469
+ const Δλ = λ1 - λ2;
9470
+ const y = Math.sin(Δλ) * Math.cos(φ1);
9471
+ const x = Math.cos(φ2) * Math.sin(φ1) - Math.sin(φ2) * Math.cos(φ1) * Math.cos(Δλ);
9472
+ const reverseBearing = this.normalizeBearing(Math.atan2(y, x) * this.RAD_TO_DEG);
9473
+ const leftBearing = this.normalizeBearing(reverseBearing + 90);
9474
+ const rightBearing = this.normalizeBearing(reverseBearing + 270);
9475
+ const metersPerDegLat = (this.EARTH_RADIUS_M * Math.PI) / 180;
9476
+ const metersPerDegLon = metersPerDegLat * Math.cos(φ2);
9477
+ const shift = (bearing) => {
9478
+ const bearingRad = bearing * this.DEG_TO_RAD;
9479
+ return {
9480
+ lat: to.lat + (offset * Math.cos(bearingRad)) / metersPerDegLat,
9481
+ lng: to.lng + (offset * Math.sin(bearingRad)) / metersPerDegLon,
9482
+ };
9483
+ };
9484
+ return {
9485
+ left: shift(leftBearing),
9486
+ right: shift(rightBearing),
9487
+ };
9488
+ }
9318
9489
  }
9319
9490
  /**
9320
9491
  * Сервис для работы с географическими координатами и базовыми
@@ -44663,19 +44834,26 @@ const Loader = (props) => {
44663
44834
  return jsxRuntime.jsx(material.CircularProgress, { ...props });
44664
44835
  };
44665
44836
 
44666
- const modalStyle = {
44667
- position: 'absolute',
44668
- top: '50%',
44669
- left: '50%',
44670
- transform: 'translate(-50%, -50%)',
44671
- bgcolor: 'background.paper',
44672
- border: '2px solid #000',
44673
- boxShadow: 24,
44674
- p: 4,
44675
- maxHeight: '90vh',
44676
- overflowX: 'auto',
44677
- overflowY: 'auto',
44678
- };
44837
+ const ModalContainer = material.styled(material.Box)(({ theme }) => {
44838
+ const { spacing, breakpoints, palette } = theme;
44839
+ return {
44840
+ position: 'absolute',
44841
+ top: '50%',
44842
+ left: '50%',
44843
+ transform: 'translate(-50%, -50%)',
44844
+ backgroundColor: palette.white.main,
44845
+ borderRadius: spacing(2),
44846
+ padding: spacing(2),
44847
+ maxHeight: '90vh',
44848
+ overflow: 'auto',
44849
+ [breakpoints.up('sm')]: {
44850
+ minWidth: 400,
44851
+ },
44852
+ [breakpoints.down('sm')]: {
44853
+ minWidth: '80vw',
44854
+ },
44855
+ };
44856
+ });
44679
44857
 
44680
44858
  const CustomModal = ({ name, children, onClose, onOpen, }) => {
44681
44859
  const modalId = React__namespace.useId();
@@ -44690,17 +44868,7 @@ const CustomModal = ({ name, children, onClose, onOpen, }) => {
44690
44868
  }, [isOpen]);
44691
44869
  return (jsxRuntime.jsx(Modal, { open: isOpen, onClose: () => {
44692
44870
  modalStore.close(name);
44693
- }, "aria-labelledby": `modal-${modalId}-title`, "aria-describedby": `modal-${modalId}-description`, children: jsxRuntime.jsx(Box, { sx: ({ breakpoints }) => {
44694
- return {
44695
- ...modalStyle,
44696
- [breakpoints.up('sm')]: {
44697
- minWidth: 400,
44698
- },
44699
- [breakpoints.down('sm')]: {
44700
- minWidth: '80vw',
44701
- },
44702
- };
44703
- }, children: children }) }));
44871
+ }, "aria-labelledby": `modal-${modalId}-title`, "aria-describedby": `modal-${modalId}-description`, children: jsxRuntime.jsx(ModalContainer, { children: children }) }));
44704
44872
  };
44705
44873
  var modal = observer(CustomModal);
44706
44874
 
@@ -48191,9 +48359,11 @@ exports.LeafletLayer = LeafletLayer;
48191
48359
  exports.List = CustomList;
48192
48360
  exports.Loader = Loader;
48193
48361
  exports.Modal = modal;
48362
+ exports.ModalContainer = ModalContainer;
48194
48363
  exports.NoData = NoData;
48195
48364
  exports.Paragraph = Paragraph;
48196
48365
  exports.Select = FormSelect;
48366
+ exports.SetService = SetService;
48197
48367
  exports.Tabs = Tabs;
48198
48368
  exports.TangramLayer = TangramLayer;
48199
48369
  exports.TextField = TextField;
@@ -48259,7 +48429,6 @@ exports.localizationService = localizationService;
48259
48429
  exports.loggerService = loggerService;
48260
48430
  exports.mapService = mapService;
48261
48431
  exports.modalStore = modalStore;
48262
- exports.modalStyle = modalStyle;
48263
48432
  exports.numberRequiredSchema = numberRequiredSchema;
48264
48433
  exports.numberSchema = numberSchema;
48265
48434
  exports.parseTrafficSignCSVFile = parseTrafficSignCSVFile;
package/dist/index.esm.js CHANGED
@@ -1 +1 @@
1
- export{alertStore}from"./stores/alert/alert.esm.js";export{modalStore}from"./stores/modal/modal.esm.js";export{Operations}from"./lib/types.esm.js";export{useDeviceType}from"./lib/hooks/useDeviceType.esm.js";export{useGetUser,useLazyGetUser}from"./lib/hooks/useGetUser.esm.js";export{useShowErrorSnackbar}from"./lib/hooks/useShowErrorSnackbar.esm.js";export{useShowSnackbar}from"./lib/hooks/useShowSnackbar.esm.js";export{useSignIn}from"./lib/hooks/useSignIn.esm.js";export{useSignOut}from"./lib/hooks/useSignOut.esm.js";export{copyInformation,encodeString,getEntityNames,getImageSrc,getNewId,getUniqueKey,getUrlencodedBody,showSnackbar}from"./lib/utils.esm.js";export{_testApiKeys}from"./configs/global/constants.esm.js";export{GlobalConfig}from"./configs/global/global.esm.js";export{API_METHODS}from"./constants/api.esm.js";export{PanelsNames}from"./constants/map.esm.js";export{arraySchema,dateRequiredSchema,dateSchema,getStringRequiredSchema,getStringSchema,numberRequiredSchema,numberSchema}from"./constants/schema.esm.js";export{default as Accordion}from"./components/accordion/accordion.esm.js";export{default as AlertDialog}from"./components/alert-dialog/alert-dialog.esm.js";export{default as Button}from"./components/buttons/button/button.esm.js";export{default as DeleteButton}from"./components/buttons/delete/delete.esm.js";export{default as IconButton}from"./components/buttons/icon/icon.esm.js";export{default as UploadButton}from"./components/buttons/upload/upload.esm.js";export{default as Card}from"./components/card/card.esm.js";export{default as Checkbox}from"./components/checkbox/checkbox.esm.js";export{default as CopyText}from"./components/copy-text/copy-text.esm.js";export{default as DateField}from"./components/date-field/date-field.esm.js";export{default as DragList}from"./components/drag-list/drag-list.esm.js";export{default as DraggableContainer}from"./components/draggable-container/draggable-container.esm.js";export{default as ErrorBoundary}from"./components/error-boundary/error-boundary.esm.js";export{default as FormErrorMessage}from"./components/form/error-message/error-message.esm.js";export{default as Form}from"./components/form/form.esm.js";export{useFormContext}from"./components/form/hooks/useFormContext.esm.js";export{default as Input}from"./components/input/input.esm.js";export{SourceLayers,TangramSourceNames}from"./components/layers/leaflet/lib/types.esm.js";export{getAllLayers,getAllPointLayers,getAllPolygonLayers,getAllPolylineLayers,getBackendDate,getLayerModalsNames,getLayerName,getValidLayer}from"./components/layers/leaflet/lib/utils.esm.js";export{sourceUrl,tile_size}from"./components/layers/leaflet/config/constants.esm.js";export{getBuildingLayers}from"./components/layers/leaflet/layers/building/utils.esm.js";export{getBuiltupAreaLayers}from"./components/layers/leaflet/layers/builtup-area/utils.esm.js";export{getAdminAreaLayers}from"./components/layers/leaflet/layers/admin-area/utils.esm.js";export{getCameraLayers}from"./components/layers/leaflet/layers/camera/lib/utils.esm.js";export{cameraConfig}from"./components/layers/leaflet/layers/camera/config/constants.esm.js";export{getCityPOILayers}from"./components/layers/leaflet/layers/city-POI/utils.esm.js";export{getConditionLayers}from"./components/layers/leaflet/layers/condition/utils.esm.js";export{getFacilityAreaLayers}from"./components/layers/leaflet/layers/facility-area/utils.esm.js";export{landuseAreaFeatureTypes,landuseAreaLayerGeometryData,landuseAreaLayerLabelData}from"./components/layers/leaflet/layers/landuse-area/constants.esm.js";export{getLanduseAreaGeometryLayer,getLanduseAreaLabelLayer,getLanduseAreaLayers}from"./components/layers/leaflet/layers/landuse-area/utils.esm.js";export{getLaneMarkingArrowLayers}from"./components/layers/leaflet/layers/lane-marking-arrow/utils.esm.js";export{getLinkLayers}from"./components/layers/leaflet/layers/link/utils.esm.js";export{getNatureFieldLayers}from"./components/layers/leaflet/layers/nature-field/utils.esm.js";export{getNatureForestGeometryLayer,getNatureForestLayers}from"./components/layers/leaflet/layers/nature-forest/utils.esm.js";export{getOceanAreaLayers}from"./components/layers/leaflet/layers/ocean-area/utils.esm.js";export{getOneWayLayers}from"./components/layers/leaflet/layers/one-way/utils.esm.js";export{getPillarLayers}from"./components/layers/leaflet/layers/pillar/lib/utils.esm.js";export{pillarConfig}from"./components/layers/leaflet/layers/pillar/config/constants.esm.js";export{catIds,text_source}from"./components/layers/leaflet/layers/POI/constants.esm.js";export{getDefaultPOI,getPOILayers,getPOITypeLayer}from"./components/layers/leaflet/layers/POI/utils.esm.js";export{getPointAddressLayers}from"./components/layers/leaflet/layers/point-address/utils.esm.js";export{getRailroadLayers}from"./components/layers/leaflet/layers/railroad/utils.esm.js";export{getTrafficSignImgSrc,getTrafficSignLayers,parseTrafficSignCSVFile}from"./components/layers/leaflet/layers/traffic-sign/lib/utils.esm.js";export{allTrafficSigns,trafficSignConfig,trafficSigns,trafficSignsDop}from"./components/layers/leaflet/layers/traffic-sign/config/constants.esm.js";export{getTrafficSignalLayers}from"./components/layers/leaflet/layers/traffic-signal/lib/utils.esm.js";export{trafficSignalConfig}from"./components/layers/leaflet/layers/traffic-signal/config/constants.esm.js";export{getWaterAreaLayers}from"./components/layers/leaflet/layers/water-area/utils.esm.js";export{getWaterLinkLayers}from"./components/layers/leaflet/layers/water-link/utils.esm.js";export{default as LeafletLayer}from"./components/layers/leaflet/leaflet.esm.js";export{TangramLayer}from"./components/layers/leaflet/services/tangram-layer.esm.js";export{default as List}from"./components/list/list.esm.js";export{default as Loader}from"./components/loader/loader.esm.js";export{default as Modal}from"./components/modal/modal.esm.js";export{modalStyle}from"./components/modal/styles.esm.js";export{default as NoData}from"./components/no-data/no-data.esm.js";export{default as Paragraph}from"./components/paragraph/paragraph.esm.js";export{default as Select}from"./components/select/select.esm.js";export{default as Tabs}from"./components/tabs/tabs.esm.js";export{default as TextField}from"./components/text-field/text-field.esm.js";export{CSVUploader}from"./components/uploader/csv/csv.esm.js";export{default as ExcelUploader}from"./components/uploader/excel/excel.esm.js";export{default as AuthPage}from"./pages/auth/auth.esm.js";export{default as DartcomAuthProvider}from"./providers/auth/auth.esm.js";export{default as DartcomInitializeProvider}from"./providers/initialize/initialize.esm.js";export{default as DartcomLocalizationProvider}from"./providers/localization/localization.esm.js";export{default as DartcomProviders}from"./providers/providers.esm.js";export{ApiService}from"./services/api/api.service.esm.js";export{CollectionService}from"./services/collection/collection.service.esm.js";export{GeometryHistoryService}from"./services/geometry-history/geometry-history.service.esm.js";export{localStateService}from"./services/local-state/local-state.esm.js";export{localizationService}from"./services/localization/localization.esm.js";export{loggerService}from"./services/logger/logger.esm.js";export{mapService}from"./services/map/map.service.esm.js";export{queryService}from"./services/query/query.esm.js";
1
+ export{alertStore}from"./stores/alert/alert.esm.js";export{modalStore}from"./stores/modal/modal.esm.js";export{Operations}from"./lib/types.esm.js";export{useDeviceType}from"./lib/hooks/useDeviceType.esm.js";export{useGetUser,useLazyGetUser}from"./lib/hooks/useGetUser.esm.js";export{useShowErrorSnackbar}from"./lib/hooks/useShowErrorSnackbar.esm.js";export{useShowSnackbar}from"./lib/hooks/useShowSnackbar.esm.js";export{useSignIn}from"./lib/hooks/useSignIn.esm.js";export{useSignOut}from"./lib/hooks/useSignOut.esm.js";export{copyInformation,encodeString,getEntityNames,getImageSrc,getNewId,getUniqueKey,getUrlencodedBody,showSnackbar}from"./lib/utils.esm.js";export{_testApiKeys}from"./configs/global/constants.esm.js";export{GlobalConfig}from"./configs/global/global.esm.js";export{API_METHODS}from"./constants/api.esm.js";export{PanelsNames}from"./constants/map.esm.js";export{arraySchema,dateRequiredSchema,dateSchema,getStringRequiredSchema,getStringSchema,numberRequiredSchema,numberSchema}from"./constants/schema.esm.js";export{default as Accordion}from"./components/accordion/accordion.esm.js";export{default as AlertDialog}from"./components/alert-dialog/alert-dialog.esm.js";export{default as Button}from"./components/buttons/button/button.esm.js";export{default as DeleteButton}from"./components/buttons/delete/delete.esm.js";export{default as IconButton}from"./components/buttons/icon/icon.esm.js";export{default as UploadButton}from"./components/buttons/upload/upload.esm.js";export{default as Card}from"./components/card/card.esm.js";export{default as Checkbox}from"./components/checkbox/checkbox.esm.js";export{default as CopyText}from"./components/copy-text/copy-text.esm.js";export{default as DateField}from"./components/date-field/date-field.esm.js";export{default as DragList}from"./components/drag-list/drag-list.esm.js";export{default as DraggableContainer}from"./components/draggable-container/draggable-container.esm.js";export{default as ErrorBoundary}from"./components/error-boundary/error-boundary.esm.js";export{default as FormErrorMessage}from"./components/form/error-message/error-message.esm.js";export{default as Form}from"./components/form/form.esm.js";export{useFormContext}from"./components/form/hooks/useFormContext.esm.js";export{default as Input}from"./components/input/input.esm.js";export{SourceLayers,TangramSourceNames}from"./components/layers/leaflet/lib/types.esm.js";export{getAllLayers,getAllPointLayers,getAllPolygonLayers,getAllPolylineLayers,getBackendDate,getLayerModalsNames,getLayerName,getValidLayer}from"./components/layers/leaflet/lib/utils.esm.js";export{sourceUrl,tile_size}from"./components/layers/leaflet/config/constants.esm.js";export{getBuildingLayers}from"./components/layers/leaflet/layers/building/utils.esm.js";export{getBuiltupAreaLayers}from"./components/layers/leaflet/layers/builtup-area/utils.esm.js";export{getAdminAreaLayers}from"./components/layers/leaflet/layers/admin-area/utils.esm.js";export{getCameraLayers}from"./components/layers/leaflet/layers/camera/lib/utils.esm.js";export{cameraConfig}from"./components/layers/leaflet/layers/camera/config/constants.esm.js";export{getCityPOILayers}from"./components/layers/leaflet/layers/city-POI/utils.esm.js";export{getConditionLayers}from"./components/layers/leaflet/layers/condition/utils.esm.js";export{getFacilityAreaLayers}from"./components/layers/leaflet/layers/facility-area/utils.esm.js";export{landuseAreaFeatureTypes,landuseAreaLayerGeometryData,landuseAreaLayerLabelData}from"./components/layers/leaflet/layers/landuse-area/constants.esm.js";export{getLanduseAreaGeometryLayer,getLanduseAreaLabelLayer,getLanduseAreaLayers}from"./components/layers/leaflet/layers/landuse-area/utils.esm.js";export{getLaneMarkingArrowLayers}from"./components/layers/leaflet/layers/lane-marking-arrow/utils.esm.js";export{getLinkLayers}from"./components/layers/leaflet/layers/link/utils.esm.js";export{getNatureFieldLayers}from"./components/layers/leaflet/layers/nature-field/utils.esm.js";export{getNatureForestGeometryLayer,getNatureForestLayers}from"./components/layers/leaflet/layers/nature-forest/utils.esm.js";export{getOceanAreaLayers}from"./components/layers/leaflet/layers/ocean-area/utils.esm.js";export{getOneWayLayers}from"./components/layers/leaflet/layers/one-way/utils.esm.js";export{getPillarLayers}from"./components/layers/leaflet/layers/pillar/lib/utils.esm.js";export{pillarConfig}from"./components/layers/leaflet/layers/pillar/config/constants.esm.js";export{catIds,text_source}from"./components/layers/leaflet/layers/POI/constants.esm.js";export{getDefaultPOI,getPOILayers,getPOITypeLayer}from"./components/layers/leaflet/layers/POI/utils.esm.js";export{getPointAddressLayers}from"./components/layers/leaflet/layers/point-address/utils.esm.js";export{getRailroadLayers}from"./components/layers/leaflet/layers/railroad/utils.esm.js";export{getTrafficSignImgSrc,getTrafficSignLayers,parseTrafficSignCSVFile}from"./components/layers/leaflet/layers/traffic-sign/lib/utils.esm.js";export{allTrafficSigns,trafficSignConfig,trafficSigns,trafficSignsDop}from"./components/layers/leaflet/layers/traffic-sign/config/constants.esm.js";export{getTrafficSignalLayers}from"./components/layers/leaflet/layers/traffic-signal/lib/utils.esm.js";export{trafficSignalConfig}from"./components/layers/leaflet/layers/traffic-signal/config/constants.esm.js";export{getWaterAreaLayers}from"./components/layers/leaflet/layers/water-area/utils.esm.js";export{getWaterLinkLayers}from"./components/layers/leaflet/layers/water-link/utils.esm.js";export{default as LeafletLayer}from"./components/layers/leaflet/leaflet.esm.js";export{TangramLayer}from"./components/layers/leaflet/services/tangram-layer.esm.js";export{default as List}from"./components/list/list.esm.js";export{default as Loader}from"./components/loader/loader.esm.js";export{default as Modal}from"./components/modal/modal.esm.js";export{ModalContainer}from"./components/modal/styles.esm.js";export{default as NoData}from"./components/no-data/no-data.esm.js";export{default as Paragraph}from"./components/paragraph/paragraph.esm.js";export{default as Select}from"./components/select/select.esm.js";export{default as Tabs}from"./components/tabs/tabs.esm.js";export{default as TextField}from"./components/text-field/text-field.esm.js";export{CSVUploader}from"./components/uploader/csv/csv.esm.js";export{default as ExcelUploader}from"./components/uploader/excel/excel.esm.js";export{default as AuthPage}from"./pages/auth/auth.esm.js";export{default as DartcomAuthProvider}from"./providers/auth/auth.esm.js";export{default as DartcomInitializeProvider}from"./providers/initialize/initialize.esm.js";export{default as DartcomLocalizationProvider}from"./providers/localization/localization.esm.js";export{default as DartcomProviders}from"./providers/providers.esm.js";export{ApiService}from"./services/api/api.service.esm.js";export{CollectionService}from"./services/collection/collection.service.esm.js";export{GeometryHistoryService}from"./services/geometry-history/geometry-history.service.esm.js";export{localStateService}from"./services/local-state/local-state.esm.js";export{localizationService}from"./services/localization/localization.esm.js";export{loggerService}from"./services/logger/logger.esm.js";export{mapService}from"./services/map/map.service.esm.js";export{queryService}from"./services/query/query.esm.js";export{SetService}from"./services/set/set.service.esm.js";
@@ -1 +1 @@
1
- import{jsx as e}from"react/jsx-runtime";import"react";import"@mui/icons-material/ArrowDownward";import{Box as s}from"@mui/material";import"../../components/alert-dialog/alert-dialog.esm.js";import"@mui/material/IconButton";import"../../components/buttons/delete/delete.esm.js";import"../../components/buttons/icon/icon.esm.js";import"@mui/icons-material/CloudUpload";import"../../components/buttons/upload/styles.esm.js";import t from"../../components/card/card.esm.js";import"../../components/checkbox/checkbox.esm.js";import"../../node_modules/react-copy-to-clipboard-ts/dist/index.esm.js";import"../../lib/types.esm.js";import"axios";import"../../services/query/query.esm.js";import"../../node_modules/notistack/notistack.esm.esm.js";import"../../_virtual/uuid.esm.js";import"../../components/copy-text/styles.esm.js";import"@mui/x-date-pickers/DateField";import"../../components/paragraph/styles.esm.js";import"../../node_modules/@dnd-kit/core/dist/core.esm.esm.js";import"../../node_modules/@dnd-kit/sortable/dist/sortable.esm.esm.js";import"../../node_modules/react-error-boundary/dist/react-error-boundary.esm.js";import"../../components/layers/leaflet/lib/types.esm.js";import"../../components/layers/leaflet/layers/condition/types.esm.js";import"../../components/layers/leaflet/layers/landuse-area/constants.esm.js";import"../../components/layers/leaflet/layers/nature-field/constants.esm.js";import"../../components/layers/leaflet/layers/nature-forest/constants.esm.js";import"../../components/layers/leaflet/layers/POI/utils.esm.js";import"../../components/layers/leaflet/layers/traffic-sign/config/constants.esm.js";import"../../components/layers/leaflet/layers/road-poly/types.esm.js";import"../../components/layers/leaflet/layers/road-poly/constants.esm.js";import"../../components/layers/leaflet/config/constants.esm.js";import"../../components/layers/leaflet/scene.yaml.esm.js";import"../../_virtual/leaflet-src.esm.js";import"../../components/modal/modal.esm.js";import"@mui/lab";import"../../node_modules/react-papaparse/dist/react-papaparse.es.esm.js";const o=({children:o})=>e(s,{sx:{display:"flex",alignItems:"center",height:"100vh",width:"100vw",overflow:"hidden"},children:e(s,{sx:{margin:"auto",maxWidth:"400px",width:"100%"},children:e(t,{children:o})})});export{o as default};
1
+ import{jsx as e}from"react/jsx-runtime";import"react";import"@mui/icons-material/ArrowDownward";import{Box as s}from"@mui/material";import"../../components/alert-dialog/alert-dialog.esm.js";import"@mui/material/IconButton";import"../../components/buttons/delete/delete.esm.js";import"../../components/buttons/icon/icon.esm.js";import"@mui/icons-material/CloudUpload";import"../../components/buttons/upload/styles.esm.js";import t from"../../components/card/card.esm.js";import"../../components/checkbox/checkbox.esm.js";import"../../node_modules/react-copy-to-clipboard-ts/dist/index.esm.js";import"../../lib/types.esm.js";import"axios";import"../../services/query/query.esm.js";import"../../node_modules/notistack/notistack.esm.esm.js";import"../../_virtual/uuid.esm.js";import"../../components/copy-text/styles.esm.js";import"@mui/x-date-pickers/DateField";import"../../components/paragraph/styles.esm.js";import"../../node_modules/@dnd-kit/core/dist/core.esm.esm.js";import"../../node_modules/@dnd-kit/sortable/dist/sortable.esm.esm.js";import"../../node_modules/react-error-boundary/dist/react-error-boundary.esm.js";import"../../components/layers/leaflet/lib/types.esm.js";import"../../components/layers/leaflet/layers/condition/types.esm.js";import"../../components/layers/leaflet/layers/landuse-area/constants.esm.js";import"../../components/layers/leaflet/layers/nature-field/constants.esm.js";import"../../components/layers/leaflet/layers/nature-forest/constants.esm.js";import"../../components/layers/leaflet/layers/POI/utils.esm.js";import"../../components/layers/leaflet/layers/traffic-sign/config/constants.esm.js";import"../../components/layers/leaflet/layers/road-poly/types.esm.js";import"../../components/layers/leaflet/layers/road-poly/constants.esm.js";import"../../components/layers/leaflet/config/constants.esm.js";import"../../components/layers/leaflet/scene.yaml.esm.js";import"../../_virtual/leaflet-src.esm.js";import"../../components/modal/modal.esm.js";import"../../components/modal/styles.esm.js";import"@mui/lab";import"../../node_modules/react-papaparse/dist/react-papaparse.es.esm.js";const o=({children:o})=>e(s,{sx:{display:"flex",alignItems:"center",height:"100vh",width:"100vw",overflow:"hidden"},children:e(s,{sx:{margin:"auto",maxWidth:"400px",width:"100%"},children:e(t,{children:o})})});export{o as default};
@@ -1 +1 @@
1
- import{jsx as e,jsxs as s}from"react/jsx-runtime";import*as o from"react";import{useForm as t}from"../../node_modules/react-hook-form/dist/index.esm.esm.js";import"@mui/icons-material/ArrowDownward";import{Typography as r}from"@mui/material";import"../../components/alert-dialog/alert-dialog.esm.js";import m from"../../components/buttons/button/button.esm.js";import"../../components/buttons/delete/delete.esm.js";import"../../components/buttons/icon/icon.esm.js";import"@mui/icons-material/CloudUpload";import"../../components/buttons/upload/styles.esm.js";import"../../components/checkbox/checkbox.esm.js";import"../../node_modules/react-copy-to-clipboard-ts/dist/index.esm.js";import"../../lib/types.esm.js";import"axios";import"../../services/query/query.esm.js";import{useShowSnackbar as a}from"../../lib/hooks/useShowSnackbar.esm.js";import{useSignIn as n}from"../../lib/hooks/useSignIn.esm.js";import"../../_virtual/uuid.esm.js";import"../../node_modules/notistack/notistack.esm.esm.js";import"../../components/copy-text/styles.esm.js";import"@mui/x-date-pickers/DateField";import"../../components/paragraph/styles.esm.js";import i from"../../components/form/form.esm.js";import"../../node_modules/@dnd-kit/core/dist/core.esm.esm.js";import"../../node_modules/@dnd-kit/sortable/dist/sortable.esm.esm.js";import"../../node_modules/react-error-boundary/dist/react-error-boundary.esm.js";import l from"../../components/input/input.esm.js";import"../../components/layers/leaflet/lib/types.esm.js";import"../../components/layers/leaflet/layers/condition/types.esm.js";import"../../components/layers/leaflet/layers/landuse-area/constants.esm.js";import"../../components/layers/leaflet/layers/nature-field/constants.esm.js";import"../../components/layers/leaflet/layers/nature-forest/constants.esm.js";import"../../components/layers/leaflet/layers/POI/utils.esm.js";import"../../components/layers/leaflet/layers/traffic-sign/config/constants.esm.js";import"../../components/layers/leaflet/layers/road-poly/types.esm.js";import"../../components/layers/leaflet/layers/road-poly/constants.esm.js";import"../../components/layers/leaflet/config/constants.esm.js";import"../../components/layers/leaflet/scene.yaml.esm.js";import"../../_virtual/leaflet-src.esm.js";import"../../components/modal/modal.esm.js";import"@mui/lab";import"../../node_modules/react-papaparse/dist/react-papaparse.es.esm.js";import p from"../../layouts/auth/auth.esm.js";import{defaultValues as c}from"./constants.esm.js";import{resolver as d}from"./schema.esm.js";const u=({onSuccess:u,onError:f})=>{const j=n(),y=a(),b=t({defaultValues:c,resolver:d}),{register:h,formState:{isValid:k}}=b,g=o.useCallback(e=>{j.mutate({body:e})},[j]);return o.useEffect(()=>{if(j.error){f(j.error);const{response:e}=j.error;if(e){const{data:{detail:s}}=e;y({message:s,variant:"error"})}}},[j.error]),o.useEffect(()=>{j.data&&u(j.data)},[j.data]),e(p,{children:s(i,{form:b,onSubmit:g,sx:()=>({justifyContent:"center",justifyItems:"center",alignContent:"center",alignItems:"center"}),children:[e(r,{variant:"h4",children:"Авторизация"}),e(l,{...h("username"),label:"Логин",placeholder:"Введите логин"}),e(l,{...h("password"),label:"Пароль",placeholder:"Введите пароль",type:"password"}),e(m,{type:"submit",disabled:!k,children:"Войти"})]})})};export{u as default};
1
+ import{jsx as e,jsxs as s}from"react/jsx-runtime";import*as o from"react";import{useForm as t}from"../../node_modules/react-hook-form/dist/index.esm.esm.js";import"@mui/icons-material/ArrowDownward";import{Typography as r}from"@mui/material";import"../../components/alert-dialog/alert-dialog.esm.js";import m from"../../components/buttons/button/button.esm.js";import"../../components/buttons/delete/delete.esm.js";import"../../components/buttons/icon/icon.esm.js";import"@mui/icons-material/CloudUpload";import"../../components/buttons/upload/styles.esm.js";import"../../components/checkbox/checkbox.esm.js";import"../../node_modules/react-copy-to-clipboard-ts/dist/index.esm.js";import"../../lib/types.esm.js";import"axios";import"../../services/query/query.esm.js";import{useShowSnackbar as a}from"../../lib/hooks/useShowSnackbar.esm.js";import{useSignIn as n}from"../../lib/hooks/useSignIn.esm.js";import"../../_virtual/uuid.esm.js";import"../../node_modules/notistack/notistack.esm.esm.js";import"../../components/copy-text/styles.esm.js";import"@mui/x-date-pickers/DateField";import"../../components/paragraph/styles.esm.js";import i from"../../components/form/form.esm.js";import"../../node_modules/@dnd-kit/core/dist/core.esm.esm.js";import"../../node_modules/@dnd-kit/sortable/dist/sortable.esm.esm.js";import"../../node_modules/react-error-boundary/dist/react-error-boundary.esm.js";import l from"../../components/input/input.esm.js";import"../../components/layers/leaflet/lib/types.esm.js";import"../../components/layers/leaflet/layers/condition/types.esm.js";import"../../components/layers/leaflet/layers/landuse-area/constants.esm.js";import"../../components/layers/leaflet/layers/nature-field/constants.esm.js";import"../../components/layers/leaflet/layers/nature-forest/constants.esm.js";import"../../components/layers/leaflet/layers/POI/utils.esm.js";import"../../components/layers/leaflet/layers/traffic-sign/config/constants.esm.js";import"../../components/layers/leaflet/layers/road-poly/types.esm.js";import"../../components/layers/leaflet/layers/road-poly/constants.esm.js";import"../../components/layers/leaflet/config/constants.esm.js";import"../../components/layers/leaflet/scene.yaml.esm.js";import"../../_virtual/leaflet-src.esm.js";import"../../components/modal/modal.esm.js";import"../../components/modal/styles.esm.js";import"@mui/lab";import"../../node_modules/react-papaparse/dist/react-papaparse.es.esm.js";import p from"../../layouts/auth/auth.esm.js";import{defaultValues as c}from"./constants.esm.js";import{resolver as d}from"./schema.esm.js";const u=({onSuccess:u,onError:f})=>{const j=n(),y=a(),b=t({defaultValues:c,resolver:d}),{register:h,formState:{isValid:k}}=b,g=o.useCallback(e=>{j.mutate({body:e})},[j]);return o.useEffect(()=>{if(j.error){f(j.error);const{response:e}=j.error;if(e){const{data:{detail:s}}=e;y({message:s,variant:"error"})}}},[j.error]),o.useEffect(()=>{j.data&&u(j.data)},[j.data]),e(p,{children:s(i,{form:b,onSubmit:g,sx:()=>({justifyContent:"center",justifyItems:"center",alignContent:"center",alignItems:"center"}),children:[e(r,{variant:"h4",children:"Авторизация"}),e(l,{...h("username"),label:"Логин",placeholder:"Введите логин"}),e(l,{...h("password"),label:"Пароль",placeholder:"Введите пароль",type:"password"}),e(m,{type:"submit",disabled:!k,children:"Войти"})]})})};export{u as default};
@@ -1,7 +1,9 @@
1
1
  import { Nullable, StringOrNumber } from '../../lib';
2
+ import { SetService } from '../set';
2
3
  export declare class CollectionService<T, Id extends StringOrNumber> {
3
4
  private readonly props;
4
- private _items;
5
+ private readonly _items;
6
+ readonly selectedIds: SetService<Id>;
5
7
  constructor(props: {
6
8
  getId: (item: T) => Id;
7
9
  normalizeItem: (item: T) => T;
@@ -88,13 +90,11 @@ export declare class CollectionService<T, Id extends StringOrNumber> {
88
90
  get updatedId(): Nullable<Id>;
89
91
  set updatedId(value: Nullable<Id>);
90
92
  get updatedItem(): T | undefined;
91
- private _selectedId;
92
- get selectedId(): Nullable<Id>;
93
- set selectedId(value: Nullable<Id>);
94
- get selectedItem(): T | undefined;
93
+ get isUpdated(): boolean;
95
94
  private _deletedId;
96
95
  get deletedId(): Nullable<Id>;
97
96
  set deletedId(value: Nullable<Id>);
98
97
  get deletedItem(): T | undefined;
98
+ get isDeleted(): boolean;
99
99
  }
100
100
  //# sourceMappingURL=collection.service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"collection.service.d.ts","sourceRoot":"","sources":["../../../src/services/collection/collection.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAIjD,qBAAa,iBAAiB,CAAC,CAAC,EAAE,EAAE,SAAS,cAAc;IAIvD,OAAO,CAAC,QAAQ,CAAC,KAAK;IAHxB,OAAO,CAAC,MAAM,CAAuC;gBAGlC,KAAK,EAAE;QACtB,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,CAAC;QACvB,aAAa,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC;KAC/B;IAKH;;OAEG;IACI,WAAW,CAAC,IAAI,EAAE,CAAC;IAI1B;;OAEG;IACH,IAAW,KAAK,oDAEf;IAED;;OAEG;IACH,IAAW,IAAI,QAEd;IAED;;;;;;;;OAQG;IACI,SAAS,CAAC,CAAC,SAAS,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;IAIvD;;;;;;;;OAQG;IACI,SAAS,CAAC,CAAC,SAAS,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE;IAMnE;;;;;;;;;OASG;IACI,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;IAQxC;;;;;OAKG;IACI,OAAO,CAAC,EAAE,EAAE,EAAE;IAMrB;;;;OAIG;IACI,GAAG,CAAC,IAAI,EAAE,CAAC;IAQlB;;;;OAIG;IACI,OAAO,CAAC,KAAK,EAAE,CAAC,EAAE;IAMzB;;;;OAIG;IACI,MAAM,CAAC,EAAE,EAAE,EAAE;IAIpB;;;;OAIG;IACI,UAAU,CAAC,GAAG,EAAE,EAAE,EAAE;IAM3B;;OAEG;IACI,KAAK;IAQZ,OAAO,CAAC,UAAU,CAAsB;IACxC,IAAW,SAAS,iBAEnB;IACD,IAAW,SAAS,CAAC,KAAK,cAAA,EAEzB;IACD,IAAW,WAAW,kBAMrB;IAED,OAAO,CAAC,WAAW,CAAsB;IACzC,IAAW,UAAU,iBAEpB;IACD,IAAW,UAAU,CAAC,KAAK,cAAA,EAE1B;IACD,IAAW,YAAY,kBAMtB;IAED,OAAO,CAAC,UAAU,CAAsB;IACxC,IAAW,SAAS,iBAEnB;IACD,IAAW,SAAS,CAAC,KAAK,cAAA,EAEzB;IACD,IAAW,WAAW,kBAMrB;CACF"}
1
+ {"version":3,"file":"collection.service.d.ts","sourceRoot":"","sources":["../../../src/services/collection/collection.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAIjD,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAEpC,qBAAa,iBAAiB,CAAC,CAAC,EAAE,EAAE,SAAS,cAAc;IAMvD,OAAO,CAAC,QAAQ,CAAC,KAAK;IALxB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuC;IAE9D,SAAgB,WAAW,iBAAwB;gBAGhC,KAAK,EAAE;QACtB,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,CAAC;QACvB,aAAa,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC;KAC/B;IAKH;;OAEG;IACI,WAAW,CAAC,IAAI,EAAE,CAAC;IAI1B;;OAEG;IACH,IAAW,KAAK,oDAEf;IAED;;OAEG;IACH,IAAW,IAAI,QAEd;IAED;;;;;;;;OAQG;IACI,SAAS,CAAC,CAAC,SAAS,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;IAIvD;;;;;;;;OAQG;IACI,SAAS,CAAC,CAAC,SAAS,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE;IAMnE;;;;;;;;;OASG;IACI,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;IAQxC;;;;;OAKG;IACI,OAAO,CAAC,EAAE,EAAE,EAAE;IAMrB;;;;OAIG;IACI,GAAG,CAAC,IAAI,EAAE,CAAC;IAQlB;;;;OAIG;IACI,OAAO,CAAC,KAAK,EAAE,CAAC,EAAE;IAMzB;;;;OAIG;IACI,MAAM,CAAC,EAAE,EAAE,EAAE;IAIpB;;;;OAIG;IACI,UAAU,CAAC,GAAG,EAAE,EAAE,EAAE;IAM3B;;OAEG;IACI,KAAK;IASZ,OAAO,CAAC,UAAU,CAAsB;IACxC,IAAW,SAAS,iBAEnB;IACD,IAAW,SAAS,CAAC,KAAK,cAAA,EAEzB;IACD,IAAW,WAAW,kBAMrB;IACD,IAAW,SAAS,YAEnB;IAED,OAAO,CAAC,UAAU,CAAsB;IACxC,IAAW,SAAS,iBAEnB;IACD,IAAW,SAAS,CAAC,KAAK,cAAA,EAEzB;IACD,IAAW,WAAW,kBAMrB;IACD,IAAW,SAAS,YAEnB;CACF"}
@@ -1 +1 @@
1
- import{observable as e,makeAutoObservable as t}from"../../node_modules/mobx/dist/mobx.esm.esm.js";class d{props;_items=e.map();constructor(e){this.props=e,t(this)}getIdByItem(e){return this.props.getId(e)}get items(){return this._items}get list(){return Array.from(this.items.values())}findAllBy(e,t){return this.list.filter(d=>d[e]===t)}findAllIn(e,t){const d=new Set(t);return this.list.filter(t=>d.has(t[e]))}findAllWhere(e){const t=Object.entries(e);return this.list.filter(e=>t.every(([t,d])=>e[t]===d))}getById(e){return this.items.get(e)}add(e){const t=this.props.getId(e),d=this.props.normalizeItem(e);this._items.set(t,d)}addMany(e){e.forEach(e=>{this.add(e)})}delete(e){this._items.delete(e)}deleteMany(e){e.forEach(e=>{this.delete(e)})}clear(){this._items.clear(),this.updatedId=null,this.selectedId=null,this.deletedId=null}_updatedId=null;get updatedId(){return this._updatedId}set updatedId(e){this._updatedId=e}get updatedItem(){if(null!=this.updatedId){return this.getById(this.updatedId)}}_selectedId=null;get selectedId(){return this._selectedId}set selectedId(e){this._selectedId=e}get selectedItem(){if(null!=this.selectedId){return this.getById(this.selectedId)}}_deletedId=null;get deletedId(){return this._deletedId}set deletedId(e){this._deletedId=e}get deletedItem(){if(null!=this.deletedId){return this.getById(this.deletedId)}}}export{d as CollectionService};
1
+ import{observable as e,makeAutoObservable as t}from"../../node_modules/mobx/dist/mobx.esm.esm.js";import{SetService as d}from"../set/set.service.esm.js";class s{props;_items=e.map();selectedIds=new d;constructor(e){this.props=e,t(this)}getIdByItem(e){return this.props.getId(e)}get items(){return this._items}get list(){return Array.from(this.items.values())}findAllBy(e,t){return this.list.filter(d=>d[e]===t)}findAllIn(e,t){const d=new Set(t);return this.list.filter(t=>d.has(t[e]))}findAllWhere(e){const t=Object.entries(e);return this.list.filter(e=>t.every(([t,d])=>e[t]===d))}getById(e){return this.items.get(e)}add(e){const t=this.props.getId(e),d=this.props.normalizeItem(e);this._items.set(t,d)}addMany(e){e.forEach(e=>{this.add(e)})}delete(e){this._items.delete(e)}deleteMany(e){e.forEach(e=>{this.delete(e)})}clear(){this._items.clear(),this.updatedId=null,this.deletedId=null,this.selectedIds.clear()}_updatedId=null;get updatedId(){return this._updatedId}set updatedId(e){this._updatedId=e}get updatedItem(){if(null!=this.updatedId){return this.getById(this.updatedId)}}get isUpdated(){return null!==this.updatedId}_deletedId=null;get deletedId(){return this._deletedId}set deletedId(e){this._deletedId=e}get deletedItem(){if(null!=this.deletedId){return this.getById(this.deletedId)}}get isDeleted(){return null!==this.deletedId}}export{s as CollectionService};
@@ -6,4 +6,5 @@ export * from './localization';
6
6
  export * from './logger';
7
7
  export * from './map';
8
8
  export * from './query';
9
+ export * from './set';
9
10
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AAAA,cAAc,OAAO,CAAC;AACtB,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,UAAU,CAAC;AACzB,cAAc,OAAO,CAAC;AACtB,cAAc,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AAAA,cAAc,OAAO,CAAC;AACtB,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,UAAU,CAAC;AACzB,cAAc,OAAO,CAAC;AACtB,cAAc,SAAS,CAAC;AACxB,cAAc,OAAO,CAAC"}
@@ -256,6 +256,43 @@ declare class MapService {
256
256
  extractCoordinatesFromGeom(geom: GeoJsonMultiLineString): FrontendLatLng[][];
257
257
  extractCoordinatesFromGeom(geom: GeoJsonPolygon): FrontendLatLng[][];
258
258
  extractCoordinatesFromGeom(geom: GeoJsonMultiPolygon): FrontendLatLng[][][];
259
+ /**
260
+ * Вычисляет два узла, расположенных перпендикулярно отрезку
261
+ * в его конечной точке на заданном расстоянии.
262
+ *
263
+ * Алгоритм:
264
+ * 1. Вычисляет обратный азимут (направление от конечной точки к начальной).
265
+ * 2. Поворачивает его на ±90° — получает два перпендикулярных направления.
266
+ * 3. Смещает конечную точку на `offset` метров в каждую сторону,
267
+ * используя плоскую аппроксимацию (приемлемо при offset ≤ 2000 м).
268
+ *
269
+ * Принимает и возвращает координаты в формате {@link FrontendLatLng}
270
+ * (`{ lat, lng }`) для прямой совместимости с Leaflet.
271
+ *
272
+ * Типичный сценарий использования: построение нормалей к маршруту,
273
+ * поперечных контрольных точек, перпендикулярных смещений на линии.
274
+ *
275
+ * @param params - Параметры расчёта.
276
+ * @param params.from - Начальная точка отрезка.
277
+ * @param params.to - Конечная точка отрезка. Перпендикуляр строится именно здесь.
278
+ * @param params.offset - Расстояние смещения в метрах (по умолчанию 100 м).
279
+ * @returns Два узла в формате {@link FrontendLatLng}, сдвинутых перпендикулярно
280
+ * отрезку влево и вправо от конечной точки.
281
+ *
282
+ * @example
283
+ * const { left, right } = mapService.getPerpendicularPoints({
284
+ * from: { lat: 55.75, lng: 37.61 },
285
+ * to: { lat: 55.76, lng: 37.62 },
286
+ * });
287
+ */
288
+ getPerpendicularPoints({ from, to, offset, }: {
289
+ from: FrontendLatLng;
290
+ to: FrontendLatLng;
291
+ offset?: number;
292
+ }): {
293
+ left: FrontendLatLng;
294
+ right: FrontendLatLng;
295
+ };
259
296
  }
260
297
  /**
261
298
  * Сервис для работы с географическими координатами и базовыми
@@ -1 +1 @@
1
- {"version":3,"file":"map.service.d.ts","sourceRoot":"","sources":["../../../src/services/map/map.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"map.service.d.ts","sourceRoot":"","sources":["../../../src/services/map/map.service.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- import{DISTANCE_UNIT_FACTORS as t}from"./map.constants.esm.js";const e=new class{EARTH_RADIUS_M=6371e3;FULL_CIRCLE_DEGREES=360;COORDINATE_EQUALITY_EPSILON_M=.002;constructor(){}get HALF_CIRCLE_DEGREES(){return this.FULL_CIRCLE_DEGREES/2}get DEG_TO_RAD(){return Math.PI/this.HALF_CIRCLE_DEGREES}get RAD_TO_DEG(){return this.HALF_CIRCLE_DEGREES/Math.PI}normalizeBearing(t){return(t%this.FULL_CIRCLE_DEGREES+this.FULL_CIRCLE_DEGREES)%this.FULL_CIRCLE_DEGREES}normalizeLongitude(t){return(t+this.FULL_CIRCLE_DEGREES+this.HALF_CIRCLE_DEGREES)%this.FULL_CIRCLE_DEGREES-this.HALF_CIRCLE_DEGREES}calculateDestination=({coordinate:t,distance:e,azimuth:n,unit:i="meters"})=>{const s=t.lat*this.DEG_TO_RAD,a=t.lng*this.DEG_TO_RAD,r=this.normalizeBearing(n)*this.DEG_TO_RAD,o=this.distanceToMeters(e,i)/this.EARTH_RADIUS_M,h=Math.sin(s),l=Math.cos(s),c=Math.sin(o),E=Math.cos(o),_=Math.sin(r),D=Math.cos(r),u=Math.asin(h*E+l*c*D),L=a+Math.atan2(_*c*l,E-h*Math.sin(u));return{lat:u*this.RAD_TO_DEG,lng:this.normalizeLongitude(L*this.RAD_TO_DEG)}};haversineDistance(t,e,n="meters"){const i=t.lat*this.DEG_TO_RAD,s=e.lat*this.DEG_TO_RAD,a=(e.lat-t.lat)*this.DEG_TO_RAD,r=(e.lng-t.lng)*this.DEG_TO_RAD,o=Math.sin(a/2)**2+Math.cos(i)*Math.cos(s)*Math.sin(r/2)**2,h=2*Math.atan2(Math.sqrt(o),Math.sqrt(1-o)),l=this.EARTH_RADIUS_M*h;return this.convertDistance(l,n)}initialBearing(t,e){const n=t.lat*this.DEG_TO_RAD,i=e.lat*this.DEG_TO_RAD,s=t.lng*this.DEG_TO_RAD,a=e.lng*this.DEG_TO_RAD,r=Math.sin(a-s)*Math.cos(i),o=Math.cos(n)*Math.sin(i)-Math.sin(n)*Math.cos(i)*Math.cos(a-s);return this.normalizeBearing(Math.atan2(r,o)*this.RAD_TO_DEG)}convertDistance(e,n="meters"){return e/t[n]}distanceToMeters(e,n="meters"){return e*t[n]}getPolylineLength(t,e="meters"){const n=t.reduce((t,e,n,i)=>{const s=i[n+1];if(!s)return t;return t+this.haversineDistance(e,s,"meters")},0);return this.convertDistance(n,e)}coordinatesEqual(t,e){return this.haversineDistance(t,e,"meters")<=this.COORDINATE_EQUALITY_EPSILON_M}replaceInFlatRing(t,e,n,i){return t.map(t=>i(t,e)?n:t)}replaceCoordinateInLine(t,e,n,i=this.coordinatesEqual.bind(this)){return this.replaceInFlatRing(t,e,n,i)}replaceCoordinateInPolygon(t,e,n,i=this.coordinatesEqual.bind(this)){return t.map(t=>this.replaceInFlatRing(t,e,n,i))}replaceCoordinateInMultiPolygon(t,e,n,i=this.coordinatesEqual.bind(this)){return t.map(t=>this.replaceCoordinateInPolygon(t,e,n,i))}sampleLineByDistance(t,e={}){const{interval:n=1e3,maxPoints:i,unit:s="meters",includeStart:a=!1}=e;if(t.length<2)return[];const r=this.distanceToMeters(n,s);if(!Number.isFinite(r)||r<=0)return[];const o=[];let h=0,l=t[0];a&&o.push(l);for(let e=1;e<t.length;e++){const n=t[e],s=this.haversineDistance(l,n,"meters");if(Number.isFinite(s)&&0!==s){for(h+=s;h>=r;){const t=(s-(h-r))/s,e=l.lat+t*(n.lat-l.lat),a=l.lng+t*(n.lng-l.lng);if(o.push({lat:e,lng:a}),null!=i&&o.length>=i)return o;h-=r}l=n}else l=n}return null!=i?o.slice(0,i):o}getPolylineCenter(t){if(0===t.length)return null;if(1===t.length)return t[0];const e=this.getPolylineLength(t,"meters");if(0===e)return t[0];const n=e/2;let i=0,s=t[0];for(let e=1;e<t.length;e++){const a=t[e],r=this.haversineDistance(s,a,"meters");if(0!==r){if(i+r>=n){const t=(n-i)/r;return{lat:s.lat+t*(a.lat-s.lat),lng:s.lng+t*(a.lng-s.lng)}}i+=r,s=a}else s=a}return t[t.length-1]}coordinateToLatLng([t,e]){return{lat:e,lng:t}}extractCoordinatesFromGeom(t){switch(t.type){case"Point":return this.coordinateToLatLng(t.coordinates);case"LineString":return t.coordinates.map(t=>this.coordinateToLatLng(t));case"MultiLineString":case"Polygon":return t.coordinates.map(t=>t.map(t=>this.coordinateToLatLng(t)));case"MultiPolygon":return t.coordinates.map(t=>t.map(t=>t.map(t=>this.coordinateToLatLng(t))))}}};export{e as mapService};
1
+ import{DISTANCE_UNIT_FACTORS as t}from"./map.constants.esm.js";const n=new class{EARTH_RADIUS_M=6371e3;FULL_CIRCLE_DEGREES=360;COORDINATE_EQUALITY_EPSILON_M=.002;constructor(){}get HALF_CIRCLE_DEGREES(){return this.FULL_CIRCLE_DEGREES/2}get DEG_TO_RAD(){return Math.PI/this.HALF_CIRCLE_DEGREES}get RAD_TO_DEG(){return this.HALF_CIRCLE_DEGREES/Math.PI}normalizeBearing(t){return(t%this.FULL_CIRCLE_DEGREES+this.FULL_CIRCLE_DEGREES)%this.FULL_CIRCLE_DEGREES}normalizeLongitude(t){return(t+this.FULL_CIRCLE_DEGREES+this.HALF_CIRCLE_DEGREES)%this.FULL_CIRCLE_DEGREES-this.HALF_CIRCLE_DEGREES}calculateDestination=({coordinate:t,distance:n,azimuth:e,unit:i="meters"})=>{const s=t.lat*this.DEG_TO_RAD,a=t.lng*this.DEG_TO_RAD,r=this.normalizeBearing(e)*this.DEG_TO_RAD,o=this.distanceToMeters(n,i)/this.EARTH_RADIUS_M,h=Math.sin(s),l=Math.cos(s),c=Math.sin(o),E=Math.cos(o),_=Math.sin(r),D=Math.cos(r),g=Math.asin(h*E+l*c*D),R=a+Math.atan2(_*c*l,E-h*Math.sin(g));return{lat:g*this.RAD_TO_DEG,lng:this.normalizeLongitude(R*this.RAD_TO_DEG)}};haversineDistance(t,n,e="meters"){const i=t.lat*this.DEG_TO_RAD,s=n.lat*this.DEG_TO_RAD,a=(n.lat-t.lat)*this.DEG_TO_RAD,r=(n.lng-t.lng)*this.DEG_TO_RAD,o=Math.sin(a/2)**2+Math.cos(i)*Math.cos(s)*Math.sin(r/2)**2,h=2*Math.atan2(Math.sqrt(o),Math.sqrt(1-o)),l=this.EARTH_RADIUS_M*h;return this.convertDistance(l,e)}initialBearing(t,n){const e=t.lat*this.DEG_TO_RAD,i=n.lat*this.DEG_TO_RAD,s=t.lng*this.DEG_TO_RAD,a=n.lng*this.DEG_TO_RAD,r=Math.sin(a-s)*Math.cos(i),o=Math.cos(e)*Math.sin(i)-Math.sin(e)*Math.cos(i)*Math.cos(a-s);return this.normalizeBearing(Math.atan2(r,o)*this.RAD_TO_DEG)}convertDistance(n,e="meters"){return n/t[e]}distanceToMeters(n,e="meters"){return n*t[e]}getPolylineLength(t,n="meters"){const e=t.reduce((t,n,e,i)=>{const s=i[e+1];if(!s)return t;return t+this.haversineDistance(n,s,"meters")},0);return this.convertDistance(e,n)}coordinatesEqual(t,n){return this.haversineDistance(t,n,"meters")<=this.COORDINATE_EQUALITY_EPSILON_M}replaceInFlatRing(t,n,e,i){return t.map(t=>i(t,n)?e:t)}replaceCoordinateInLine(t,n,e,i=this.coordinatesEqual.bind(this)){return this.replaceInFlatRing(t,n,e,i)}replaceCoordinateInPolygon(t,n,e,i=this.coordinatesEqual.bind(this)){return t.map(t=>this.replaceInFlatRing(t,n,e,i))}replaceCoordinateInMultiPolygon(t,n,e,i=this.coordinatesEqual.bind(this)){return t.map(t=>this.replaceCoordinateInPolygon(t,n,e,i))}sampleLineByDistance(t,n={}){const{interval:e=1e3,maxPoints:i,unit:s="meters",includeStart:a=!1}=n;if(t.length<2)return[];const r=this.distanceToMeters(e,s);if(!Number.isFinite(r)||r<=0)return[];const o=[];let h=0,l=t[0];a&&o.push(l);for(let n=1;n<t.length;n++){const e=t[n],s=this.haversineDistance(l,e,"meters");if(Number.isFinite(s)&&0!==s){for(h+=s;h>=r;){const t=(s-(h-r))/s,n=l.lat+t*(e.lat-l.lat),a=l.lng+t*(e.lng-l.lng);if(o.push({lat:n,lng:a}),null!=i&&o.length>=i)return o;h-=r}l=e}else l=e}return null!=i?o.slice(0,i):o}getPolylineCenter(t){if(0===t.length)return null;if(1===t.length)return t[0];const n=this.getPolylineLength(t,"meters");if(0===n)return t[0];const e=n/2;let i=0,s=t[0];for(let n=1;n<t.length;n++){const a=t[n],r=this.haversineDistance(s,a,"meters");if(0!==r){if(i+r>=e){const t=(e-i)/r;return{lat:s.lat+t*(a.lat-s.lat),lng:s.lng+t*(a.lng-s.lng)}}i+=r,s=a}else s=a}return t[t.length-1]}coordinateToLatLng([t,n]){return{lat:n,lng:t}}extractCoordinatesFromGeom(t){switch(t.type){case"Point":return this.coordinateToLatLng(t.coordinates);case"LineString":return t.coordinates.map(t=>this.coordinateToLatLng(t));case"MultiLineString":case"Polygon":return t.coordinates.map(t=>t.map(t=>this.coordinateToLatLng(t)));case"MultiPolygon":return t.coordinates.map(t=>t.map(t=>t.map(t=>this.coordinateToLatLng(t))))}}getPerpendicularPoints({from:t,to:n,offset:e=100}){const i=t.lat*this.DEG_TO_RAD,s=t.lng*this.DEG_TO_RAD,a=n.lat*this.DEG_TO_RAD,r=s-n.lng*this.DEG_TO_RAD,o=Math.sin(r)*Math.cos(i),h=Math.cos(a)*Math.sin(i)-Math.sin(a)*Math.cos(i)*Math.cos(r),l=this.normalizeBearing(Math.atan2(o,h)*this.RAD_TO_DEG),c=this.normalizeBearing(l+90),E=this.normalizeBearing(l+270),_=this.EARTH_RADIUS_M*Math.PI/180,D=_*Math.cos(a),g=t=>{const i=t*this.DEG_TO_RAD;return{lat:n.lat+e*Math.cos(i)/_,lng:n.lng+e*Math.sin(i)/D}};return{left:g(c),right:g(E)}}};export{n as mapService};
@@ -0,0 +1,2 @@
1
+ export * from './set.service';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/set/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * SetService<T>
3
+ *
4
+ * Небольшой обёрткой над observable Set из MobX, которая:
5
+ * - хранит уникальные значения типа T;
6
+ * - предоставляет реактивные геттеры items / list;
7
+ * - даёт удобные методы add / delete / toggle / clear;
8
+ * - поддерживает batch‑операции addMany / deleteMany.
9
+ *
10
+ * Типичный сценарий использования:
11
+ * - хранение множества выбранных id;
12
+ * - хранение множества активных фильтров;
13
+ * - хранение множества "выделенных" элементов в UI.
14
+ *
15
+ * Пример:
16
+ * const selection = new SetService<string>();
17
+ * selection.add('id-1');
18
+ * selection.toggle('id-2');
19
+ * selection.isContain('id-1'); // true
20
+ */
21
+ export declare class SetService<T> {
22
+ /**
23
+ * Внутренний набор значений.
24
+ *
25
+ * Используется observable.set, чтобы:
26
+ * - изменения были реактивны для MobX;
27
+ * - операции add/delete были O(1) по времени.
28
+ */
29
+ private readonly _items;
30
+ /**
31
+ * Возвращает observable Set со всеми значениями.
32
+ *
33
+ * Подходит, если нужно работать с Set напрямую:
34
+ * setService.items.has(value)
35
+ */
36
+ get items(): import("mobx").ObservableSet<T>;
37
+ /**
38
+ * Возвращает значения набора в виде обычного массива.
39
+ *
40
+ * Удобно использовать в React-компонентах:
41
+ * setService.list.map(...)
42
+ */
43
+ get list(): T[];
44
+ /**
45
+ * Проверяет, содержится ли значение в наборе.
46
+ *
47
+ * @param value Значение для проверки.
48
+ * @returns true, если value есть в наборе; иначе false.
49
+ */
50
+ has(value: T): boolean;
51
+ /**
52
+ * Возвращает значение, пустой ли список
53
+ * @returns true, если в списке нет ни одного элемента; иначе false.
54
+ */
55
+ get isEmpty(): boolean;
56
+ /**
57
+ * Добавляет значение в набор.
58
+ *
59
+ * @param value Значение для добавления.
60
+ */
61
+ add(value: T): void;
62
+ /**
63
+ * Добавляет в набор несколько значений подряд.
64
+ *
65
+ * @param values Массив значений для добавления.
66
+ */
67
+ addMany(values: T[]): void;
68
+ /**
69
+ * Удаляет значение из набора.
70
+ *
71
+ * @param value Значение для удаления.
72
+ */
73
+ delete(value: T): void;
74
+ /**
75
+ * Удаляет из набора несколько значений подряд.
76
+ *
77
+ * @param values Массив значений для удаления.
78
+ */
79
+ deleteMany(values: T[]): void;
80
+ /**
81
+ * Переключает присутствие значения в наборе.
82
+ *
83
+ * Поведение:
84
+ * - если значение уже есть, оно будет удалено;
85
+ * - если значения нет, оно будет добавлено.
86
+ *
87
+ * @param value Значение для переключения.
88
+ */
89
+ toggle(value: T): void;
90
+ /**
91
+ * Полностью очищает набор.
92
+ */
93
+ clear(): void;
94
+ }
95
+ //# sourceMappingURL=set.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"set.service.d.ts","sourceRoot":"","sources":["../../../src/services/set/set.service.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,UAAU,CAAC,CAAC;IACvB;;;;;;OAMG;IACH,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuB;IAE9C;;;;;OAKG;IACH,IAAW,KAAK,oCAEf;IAED;;;;;OAKG;IACH,IAAW,IAAI,QAEd;IAED;;;;;OAKG;IACI,GAAG,CAAC,KAAK,EAAE,CAAC;IAInB;;;OAGG;IACH,IAAW,OAAO,YAEjB;IAED;;;;OAIG;IACI,GAAG,CAAC,KAAK,EAAE,CAAC;IAInB;;;;OAIG;IACI,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE;IAM1B;;;;OAIG;IACI,MAAM,CAAC,KAAK,EAAE,CAAC;IAItB;;;;OAIG;IACI,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE;IAM7B;;;;;;;;OAQG;IACI,MAAM,CAAC,KAAK,EAAE,CAAC;IAQtB;;OAEG;IACI,KAAK;CAGb"}
@@ -0,0 +1 @@
1
+ import{observable as e}from"../../node_modules/mobx/dist/mobx.esm.esm.js";class t{_items=e.set();get items(){return this._items}get list(){return Array.from(this.items.values())}has(e){return this.items.has(e)}get isEmpty(){return 0===this.items.size}add(e){this._items.add(e)}addMany(e){e.forEach(e=>{this.add(e)})}delete(e){this._items.delete(e)}deleteMany(e){e.forEach(e=>{this.delete(e)})}toggle(e){this.has(e)?this.delete(e):this.add(e)}clear(){this._items.clear()}}export{t as SetService};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dartcom/ui-kit",
3
- "version": "10.5.24",
3
+ "version": "10.6.1",
4
4
  "description": "Кастомная библиотека компонентов Dartcom",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",