@dartcom/ui-kit 10.5.13 → 10.5.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/configs/global/global.esm.js +1 -1
- package/dist/index.cjs +236 -2
- package/dist/index.esm.js +1 -1
- package/dist/services/api/api.service.d.ts +20 -0
- package/dist/services/api/api.service.d.ts.map +1 -0
- package/dist/services/api/api.service.esm.js +1 -0
- package/dist/services/api/api.types.d.ts +30 -0
- package/dist/services/api/api.types.d.ts.map +1 -0
- package/dist/services/api/index.d.ts +2 -2
- package/dist/services/api/index.d.ts.map +1 -1
- package/dist/services/collection/collection.service.d.ts +99 -0
- package/dist/services/collection/collection.service.d.ts.map +1 -0
- package/dist/services/collection/collection.service.esm.js +1 -0
- package/dist/services/collection/index.d.ts +1 -1
- package/dist/services/collection/index.d.ts.map +1 -1
- package/dist/services/geometry-history/geometry-history.service.d.ts +136 -0
- package/dist/services/geometry-history/geometry-history.service.d.ts.map +1 -0
- package/dist/services/geometry-history/geometry-history.service.esm.js +1 -0
- package/dist/services/geometry-history/index.d.ts +2 -0
- package/dist/services/geometry-history/index.d.ts.map +1 -0
- package/dist/services/index.d.ts +1 -0
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/map/index.d.ts +1 -1
- package/dist/services/map/index.d.ts.map +1 -1
- package/dist/services/map/map.service.d.ts +142 -0
- package/dist/services/map/map.service.d.ts.map +1 -0
- package/dist/services/map/map.service.esm.js +1 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import"../../lib/types.esm.js";import"@mui/material";import{ApiService as e}from"../../services/api/api.esm.js";import{localStateService as i}from"../../services/local-state/local-state.esm.js";import"../../_virtual/leaflet-src.esm.js";import"../../services/query/query.esm.js";import"../../node_modules/notistack/notistack.esm.esm.js";import{showSnackbar as t}from"../../lib/utils.esm.js";class s{configOptions;_private_key;_apiService;static _instance=null;static isUnauthorized=!1;static get instance(){if(!s._instance)throw new Error("Dartcom Config не инициализирован с приватным ключом. Вызовите Config.initialize(...) первым, чтобы иметь возможность пользоваться компонентами нашей библиотеки");return s._instance}static initialize(e){s._instance||(s._instance=new s(e))}static deactivate(){this._instance=null}constructor(a){this.configOptions=a;const{private_key:r,apiConfig:n}=a;this._private_key=r;const o=new e(n,{onRequestStart:()=>{s.isUnauthorized=!1},onUnauthorized:()=>{s.isUnauthorized=!0,i.remove("access_token"),i.remove("token_type")},onError:e=>{t({message:e,variant:"error"})}});this._apiService=o,this._getCheckKeyData().then(e=>{if(e){const{valid:i}=e;a.onCheck?.(e),this._isValidApiKey=i}})}get apiService(){return this._apiService}_isValidApiKey=!1;get isValidApiKey(){return this._isValidApiKey}async _getCheckKeyData(){return await this.apiService.get({url:"check_tile_token",config:{params:{tile_token:this._private_key}}}).then(e=>e).catch(e=>{const{response:i,message:t}=e;if(this.configOptions.onError?.(e),i){const{data:{detail:e}}=i;return e}return{reason:t,valid:!1}})}}export{s as GlobalConfig};
|
|
1
|
+
import"../../lib/types.esm.js";import"@mui/material";import{ApiService as e}from"../../services/api/api.service.esm.js";import{localStateService as i}from"../../services/local-state/local-state.esm.js";import"../../_virtual/leaflet-src.esm.js";import"../../services/query/query.esm.js";import"../../node_modules/notistack/notistack.esm.esm.js";import{showSnackbar as t}from"../../lib/utils.esm.js";class s{configOptions;_private_key;_apiService;static _instance=null;static isUnauthorized=!1;static get instance(){if(!s._instance)throw new Error("Dartcom Config не инициализирован с приватным ключом. Вызовите Config.initialize(...) первым, чтобы иметь возможность пользоваться компонентами нашей библиотеки");return s._instance}static initialize(e){s._instance||(s._instance=new s(e))}static deactivate(){this._instance=null}constructor(a){this.configOptions=a;const{private_key:r,apiConfig:n}=a;this._private_key=r;const o=new e(n,{onRequestStart:()=>{s.isUnauthorized=!1},onUnauthorized:()=>{s.isUnauthorized=!0,i.remove("access_token"),i.remove("token_type")},onError:e=>{t({message:e,variant:"error"})}});this._apiService=o,this._getCheckKeyData().then(e=>{if(e){const{valid:i}=e;a.onCheck?.(e),this._isValidApiKey=i}})}get apiService(){return this._apiService}_isValidApiKey=!1;get isValidApiKey(){return this._isValidApiKey}async _getCheckKeyData(){return await this.apiService.get({url:"check_tile_token",config:{params:{tile_token:this._private_key}}}).then(e=>e).catch(e=>{const{response:i,message:t}=e;if(this.configOptions.onError?.(e),i){const{data:{detail:e}}=i;return e}return{reason:t,valid:!1}})}}export{s as GlobalConfig};
|
package/dist/index.cjs
CHANGED
|
@@ -5820,6 +5820,236 @@ class CollectionService {
|
|
|
5820
5820
|
}
|
|
5821
5821
|
}
|
|
5822
5822
|
|
|
5823
|
+
// ========= Утилиты сравнения =========
|
|
5824
|
+
const isSameCoordinate = (a, b) => a.lat === b.lat && a.lon === b.lon;
|
|
5825
|
+
const isSameLine = (a, b) => {
|
|
5826
|
+
if (a.length !== b.length) {
|
|
5827
|
+
return false;
|
|
5828
|
+
}
|
|
5829
|
+
return a.every((coord, i) => isSameCoordinate(coord, b[i]));
|
|
5830
|
+
};
|
|
5831
|
+
const isSamePolygon = (a, b) => {
|
|
5832
|
+
if (a.length !== b.length) {
|
|
5833
|
+
return false;
|
|
5834
|
+
}
|
|
5835
|
+
return a.every((ring, i) => isSameLine(ring, b[i]));
|
|
5836
|
+
};
|
|
5837
|
+
/**
|
|
5838
|
+
* Готовые компараторы для каждого типа геометрии.
|
|
5839
|
+
*/
|
|
5840
|
+
const GeometryComparators = {
|
|
5841
|
+
point: isSameCoordinate,
|
|
5842
|
+
line: isSameLine,
|
|
5843
|
+
polygon: isSamePolygon,
|
|
5844
|
+
};
|
|
5845
|
+
/**
|
|
5846
|
+
* GeometryHistoryService (back-only, single geometry type)
|
|
5847
|
+
*/
|
|
5848
|
+
class GeometryHistoryService {
|
|
5849
|
+
options;
|
|
5850
|
+
/**
|
|
5851
|
+
* Прошлые шаги истории.
|
|
5852
|
+
*/
|
|
5853
|
+
_past = observable.array();
|
|
5854
|
+
/**
|
|
5855
|
+
* Текущий шаг истории.
|
|
5856
|
+
*/
|
|
5857
|
+
_present = null;
|
|
5858
|
+
/**
|
|
5859
|
+
* Флаг, что текущее состояние истории было инициализировано.
|
|
5860
|
+
*/
|
|
5861
|
+
_hasPresent = false;
|
|
5862
|
+
/**
|
|
5863
|
+
* Индекс по id для быстрого поиска последнего изменения.
|
|
5864
|
+
*/
|
|
5865
|
+
_indexById = observable.map();
|
|
5866
|
+
constructor(options) {
|
|
5867
|
+
this.options = options;
|
|
5868
|
+
makeAutoObservable(this, {}, { autoBind: true });
|
|
5869
|
+
}
|
|
5870
|
+
// ========= Служебные методы =========
|
|
5871
|
+
/**
|
|
5872
|
+
* Сравнивает два набора изменений через options.compare.
|
|
5873
|
+
* - длина должна совпадать;
|
|
5874
|
+
* - для каждой позиции id и geometry должны совпадать.
|
|
5875
|
+
*/
|
|
5876
|
+
_isSameChangeSet(a, b) {
|
|
5877
|
+
if (a.length !== b.length) {
|
|
5878
|
+
return false;
|
|
5879
|
+
}
|
|
5880
|
+
return a.every((change, index) => {
|
|
5881
|
+
const other = b[index];
|
|
5882
|
+
if (change.id !== other.id) {
|
|
5883
|
+
return false;
|
|
5884
|
+
}
|
|
5885
|
+
return this.options.compare(change.geometry, other.geometry);
|
|
5886
|
+
});
|
|
5887
|
+
}
|
|
5888
|
+
/**
|
|
5889
|
+
* Полностью пересчитывает индекс по id из текущих past и present.
|
|
5890
|
+
* Этот метод относительно дорогой (`O(N * K)`), но используется только:
|
|
5891
|
+
* - при init;
|
|
5892
|
+
* - при clear (через resetIndex);
|
|
5893
|
+
* - при undo (редко относительно частоты findLastChangeById).
|
|
5894
|
+
*/
|
|
5895
|
+
_rebuildIndex() {
|
|
5896
|
+
this._indexById.clear();
|
|
5897
|
+
// Сначала past (в порядке от 0 до конца),
|
|
5898
|
+
// чтобы более новые шаги перекрывали старые.
|
|
5899
|
+
this._past.forEach((changeSet, stepIndex) => {
|
|
5900
|
+
changeSet.forEach((change, changeIndex) => {
|
|
5901
|
+
this._indexById.set(change.id, {
|
|
5902
|
+
isPresent: false,
|
|
5903
|
+
stepIndex,
|
|
5904
|
+
changeIndex,
|
|
5905
|
+
id: change.id,
|
|
5906
|
+
});
|
|
5907
|
+
});
|
|
5908
|
+
});
|
|
5909
|
+
// Затем present — он всегда самый новый.
|
|
5910
|
+
if (this._present) {
|
|
5911
|
+
this._present.forEach((change, changeIndex) => {
|
|
5912
|
+
this._indexById.set(change.id, {
|
|
5913
|
+
isPresent: true,
|
|
5914
|
+
stepIndex: -1,
|
|
5915
|
+
changeIndex,
|
|
5916
|
+
id: change.id,
|
|
5917
|
+
});
|
|
5918
|
+
});
|
|
5919
|
+
}
|
|
5920
|
+
}
|
|
5921
|
+
/**
|
|
5922
|
+
* Сбрасывает индекс.
|
|
5923
|
+
*/
|
|
5924
|
+
_resetIndex() {
|
|
5925
|
+
this._indexById.clear();
|
|
5926
|
+
}
|
|
5927
|
+
// ========= Геттеры =========
|
|
5928
|
+
get past() {
|
|
5929
|
+
return this._past;
|
|
5930
|
+
}
|
|
5931
|
+
get present() {
|
|
5932
|
+
return this._present;
|
|
5933
|
+
}
|
|
5934
|
+
get hasPresent() {
|
|
5935
|
+
return this._hasPresent;
|
|
5936
|
+
}
|
|
5937
|
+
get canUndo() {
|
|
5938
|
+
return this._past.length > 0;
|
|
5939
|
+
}
|
|
5940
|
+
get size() {
|
|
5941
|
+
return this._past.length + (this._hasPresent ? 1 : 0);
|
|
5942
|
+
}
|
|
5943
|
+
// ========= Основные методы =========
|
|
5944
|
+
/**
|
|
5945
|
+
* Инициализирует историю стартовым набором изменений.
|
|
5946
|
+
* Полностью очищает past, задаёт новый present и пересчитывает индекс.
|
|
5947
|
+
*/
|
|
5948
|
+
init(value) {
|
|
5949
|
+
this._past.clear();
|
|
5950
|
+
this._present = value;
|
|
5951
|
+
this._hasPresent = true;
|
|
5952
|
+
this._rebuildIndex();
|
|
5953
|
+
this.emit();
|
|
5954
|
+
}
|
|
5955
|
+
/**
|
|
5956
|
+
* Добавляет новый шаг истории.
|
|
5957
|
+
*
|
|
5958
|
+
* Поведение:
|
|
5959
|
+
* - если история не была инициализирована, value становится текущим шагом;
|
|
5960
|
+
* - если новый набор изменений совпадает с текущим, запись не создаётся;
|
|
5961
|
+
* - текущий шаг переносится в past;
|
|
5962
|
+
* - индекс обновляется минимально.
|
|
5963
|
+
*/
|
|
5964
|
+
push(value) {
|
|
5965
|
+
if (!this._hasPresent || this._present == null) {
|
|
5966
|
+
this._present = value;
|
|
5967
|
+
this._hasPresent = true;
|
|
5968
|
+
// только present, past пустой
|
|
5969
|
+
this._rebuildIndex();
|
|
5970
|
+
this.emit();
|
|
5971
|
+
return;
|
|
5972
|
+
}
|
|
5973
|
+
if (this._isSameChangeSet(this._present, value)) {
|
|
5974
|
+
return;
|
|
5975
|
+
}
|
|
5976
|
+
// переносим текущий шаг в past
|
|
5977
|
+
this._past.push(this._present);
|
|
5978
|
+
this._present = value;
|
|
5979
|
+
// обновляем индекс:
|
|
5980
|
+
// прибавляем новую позицию past и свежий present.
|
|
5981
|
+
this._rebuildIndex();
|
|
5982
|
+
this.emit();
|
|
5983
|
+
}
|
|
5984
|
+
/**
|
|
5985
|
+
* Заменяет текущий шаг без создания новой записи в истории.
|
|
5986
|
+
* Подходит для промежуточных изменений во время drag/edit-сессии.
|
|
5987
|
+
*/
|
|
5988
|
+
replace(value) {
|
|
5989
|
+
this._present = value;
|
|
5990
|
+
this._hasPresent = true;
|
|
5991
|
+
this._rebuildIndex();
|
|
5992
|
+
this.emit();
|
|
5993
|
+
}
|
|
5994
|
+
/**
|
|
5995
|
+
* Откатывает историю на предыдущий шаг.
|
|
5996
|
+
* Последний past становится present.
|
|
5997
|
+
*/
|
|
5998
|
+
undo() {
|
|
5999
|
+
if (!this.canUndo || !this._hasPresent || this._present == null) {
|
|
6000
|
+
return this._present;
|
|
6001
|
+
}
|
|
6002
|
+
const previous = this._past.pop() ?? null;
|
|
6003
|
+
this._present = previous;
|
|
6004
|
+
this._rebuildIndex();
|
|
6005
|
+
this.emit();
|
|
6006
|
+
return this._present;
|
|
6007
|
+
}
|
|
6008
|
+
/**
|
|
6009
|
+
* Полностью очищает историю.
|
|
6010
|
+
*/
|
|
6011
|
+
clear() {
|
|
6012
|
+
this._past.clear();
|
|
6013
|
+
this._present = null;
|
|
6014
|
+
this._hasPresent = false;
|
|
6015
|
+
this._resetIndex();
|
|
6016
|
+
this.emit();
|
|
6017
|
+
}
|
|
6018
|
+
/**
|
|
6019
|
+
* Возвращает безопасный снимок текущего состояния истории.
|
|
6020
|
+
*/
|
|
6021
|
+
getState() {
|
|
6022
|
+
return {
|
|
6023
|
+
past: [...this._past],
|
|
6024
|
+
present: this._present,
|
|
6025
|
+
};
|
|
6026
|
+
}
|
|
6027
|
+
/**
|
|
6028
|
+
* Находит последний по времени шаг, в котором изменялась геометрия заданного id.
|
|
6029
|
+
*/
|
|
6030
|
+
findLastChangeById(id) {
|
|
6031
|
+
const entry = this._indexById.get(id);
|
|
6032
|
+
if (!entry) {
|
|
6033
|
+
return null;
|
|
6034
|
+
}
|
|
6035
|
+
if (entry.isPresent) {
|
|
6036
|
+
const present = this._present;
|
|
6037
|
+
if (!present) {
|
|
6038
|
+
return null;
|
|
6039
|
+
}
|
|
6040
|
+
return present[entry.changeIndex] ?? null;
|
|
6041
|
+
}
|
|
6042
|
+
const changeSet = this._past[entry.stepIndex];
|
|
6043
|
+
if (!changeSet) {
|
|
6044
|
+
return null;
|
|
6045
|
+
}
|
|
6046
|
+
return changeSet[entry.changeIndex] ?? null;
|
|
6047
|
+
}
|
|
6048
|
+
emit() {
|
|
6049
|
+
this.options.onChange?.(this.getState());
|
|
6050
|
+
}
|
|
6051
|
+
}
|
|
6052
|
+
|
|
5823
6053
|
/**
|
|
5824
6054
|
* @module constants
|
|
5825
6055
|
* @summary Useful constants
|
|
@@ -23355,7 +23585,8 @@ class MapService {
|
|
|
23355
23585
|
const h = Math.sin(Δφ / 2) ** 2 +
|
|
23356
23586
|
Math.cos(φ1) * Math.cos(φ2) * Math.sin(Δλ / 2) ** 2;
|
|
23357
23587
|
const c = 2 * Math.atan2(Math.sqrt(h), Math.sqrt(1 - h));
|
|
23358
|
-
|
|
23588
|
+
const distance = this.EARTH_RADIUS_M * c;
|
|
23589
|
+
return distance;
|
|
23359
23590
|
}
|
|
23360
23591
|
/**
|
|
23361
23592
|
* Вычисляет начальный азимут из точки `a` в точку `b`.
|
|
@@ -23375,7 +23606,8 @@ class MapService {
|
|
|
23375
23606
|
const y = Math.sin(λ2 - λ1) * Math.cos(φ2);
|
|
23376
23607
|
const x = Math.cos(φ1) * Math.sin(φ2) -
|
|
23377
23608
|
Math.sin(φ1) * Math.cos(φ2) * Math.cos(λ2 - λ1);
|
|
23378
|
-
|
|
23609
|
+
const initialBearing = this.normalizeBearing(Math.atan2(y, x) * this.RAD_TO_DEG);
|
|
23610
|
+
return initialBearing;
|
|
23379
23611
|
}
|
|
23380
23612
|
}
|
|
23381
23613
|
/**
|
|
@@ -47716,6 +47948,8 @@ exports.ErrorBoundary = CustomErrorBoundary;
|
|
|
47716
47948
|
exports.ExcelUploader = ExcelUploader;
|
|
47717
47949
|
exports.Form = CustomForm;
|
|
47718
47950
|
exports.FormErrorMessage = FormErrorMessage;
|
|
47951
|
+
exports.GeometryComparators = GeometryComparators;
|
|
47952
|
+
exports.GeometryHistoryService = GeometryHistoryService;
|
|
47719
47953
|
exports.GlobalConfig = GlobalConfig;
|
|
47720
47954
|
exports.IconButton = IconButton;
|
|
47721
47955
|
exports.Input = CustomInput;
|
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.esm.js";export{CollectionService}from"./services/collection/collection.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.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{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{GeometryComparators,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";
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { ApiConfig, DeleteProps, GetProps, PatchProps, PostProps, PutProps } from './api.types';
|
|
2
|
+
export type ApiServiceDeps = {
|
|
3
|
+
getHeaders?: () => Record<string, string>;
|
|
4
|
+
onRequestStart?: () => void;
|
|
5
|
+
onUnauthorized?: () => void;
|
|
6
|
+
onError?: (message: string) => void;
|
|
7
|
+
};
|
|
8
|
+
export declare class ApiService {
|
|
9
|
+
private readonly config;
|
|
10
|
+
private readonly deps?;
|
|
11
|
+
private readonly client;
|
|
12
|
+
constructor(config: ApiConfig, deps?: ApiServiceDeps | undefined);
|
|
13
|
+
private setupInterceptors;
|
|
14
|
+
get<T>({ url, config }: GetProps): Promise<T>;
|
|
15
|
+
post<R, B>({ url, body, config }: PostProps<B>): Promise<R>;
|
|
16
|
+
put<R, B>({ url, body, config }: PutProps<B>): Promise<R>;
|
|
17
|
+
patch<R, B>({ url, body, config }: PatchProps<B>): Promise<R>;
|
|
18
|
+
delete<R>({ url, config }: DeleteProps): Promise<R>;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=api.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.service.d.ts","sourceRoot":"","sources":["../../../src/services/api/api.service.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,SAAS,EACT,WAAW,EACX,QAAQ,EACR,UAAU,EACV,SAAS,EACT,QAAQ,EACT,MAAM,aAAa,CAAC;AAIrB,MAAM,MAAM,cAAc,GAAG;IAC3B,UAAU,CAAC,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;IAC5B,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;IAC5B,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACrC,CAAC;AAEF,qBAAa,UAAU;IAInB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;IAJxB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;gBAGpB,MAAM,EAAE,SAAS,EACjB,IAAI,CAAC,EAAE,cAAc,YAAA;IAcxC,OAAO,CAAC,iBAAiB;IA2CnB,GAAG,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,QAAQ;IAMhC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC;IAM9C,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC;IAM5C,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC;IAMhD,MAAM,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,WAAW;CAK7C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{localStateService as t}from"../local-state/local-state.esm.js";import e from"axios";class s{config;deps;client;constructor(t,s){this.config=t,this.deps=s,this.client=e.create({baseURL:t?.baseURL,withCredentials:t?.withCredentials,timeout:1e4,headers:{"Content-Type":"application/json"}}),this.setupInterceptors()}setupInterceptors(){this.client.interceptors.request.use(e=>{this.deps?.onRequestStart?.();const s=this.config?.getHeaders?.()??this.deps?.getHeaders?.(),r=t.load("access_token"),i=t.load("token_type");return r&&i&&(e.headers.Authorization=`${i} ${r}`),s&&Object.entries(s).forEach(([t,s])=>{e.headers[t]=s}),e},t=>(this.deps?.onError?.(t.message),Promise.reject(t))),this.client.interceptors.response.use(t=>t,t=>(this.deps?.onError?.(t.message),401===t.response?.status&&this.deps?.onUnauthorized?.(),Promise.reject(t)))}async get({url:t,config:e}){return(await this.client.get(t,e)).data}async post({url:t,body:e,config:s}){return(await this.client.post(t,e,s)).data}async put({url:t,body:e,config:s}){return(await this.client.put(t,e,s)).data}async patch({url:t,body:e,config:s}){return(await this.client.patch(t,e,s)).data}async delete({url:t,config:e}){return(await this.client.delete(t,e)).data}}export{s as ApiService};
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { AxiosRequestConfig } from 'axios';
|
|
2
|
+
export type ApiConfig = {
|
|
3
|
+
baseURL: string;
|
|
4
|
+
withCredentials?: boolean;
|
|
5
|
+
getHeaders?: () => AxiosRequestConfig['headers'];
|
|
6
|
+
};
|
|
7
|
+
export type GetProps = {
|
|
8
|
+
url: string;
|
|
9
|
+
config?: AxiosRequestConfig;
|
|
10
|
+
};
|
|
11
|
+
export type PostProps<B> = {
|
|
12
|
+
url: string;
|
|
13
|
+
body?: B;
|
|
14
|
+
config?: AxiosRequestConfig<B>;
|
|
15
|
+
};
|
|
16
|
+
export type PutProps<B> = {
|
|
17
|
+
url: string;
|
|
18
|
+
body?: B;
|
|
19
|
+
config?: AxiosRequestConfig<B>;
|
|
20
|
+
};
|
|
21
|
+
export type PatchProps<B> = {
|
|
22
|
+
url: string;
|
|
23
|
+
body?: B;
|
|
24
|
+
config?: AxiosRequestConfig<B>;
|
|
25
|
+
};
|
|
26
|
+
export type DeleteProps = {
|
|
27
|
+
url: string;
|
|
28
|
+
config?: AxiosRequestConfig;
|
|
29
|
+
};
|
|
30
|
+
//# sourceMappingURL=api.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.types.d.ts","sourceRoot":"","sources":["../../../src/services/api/api.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,OAAO,CAAC;AAEhD,MAAM,MAAM,SAAS,GAAG;IACtB,OAAO,EAAE,MAAM,CAAC;IAEhB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,kBAAkB,CAAC,SAAS,CAAC,CAAC;CAClD,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,kBAAkB,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,SAAS,CAAC,CAAC,IAAI;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,MAAM,CAAC,EAAE,kBAAkB,CAAC,CAAC,CAAC,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,QAAQ,CAAC,CAAC,IAAI;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,MAAM,CAAC,EAAE,kBAAkB,CAAC,CAAC,CAAC,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,MAAM,CAAC,EAAE,kBAAkB,CAAC,CAAC,CAAC,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,kBAAkB,CAAC;CAC7B,CAAC"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export * from './types';
|
|
2
|
-
export * from './api';
|
|
1
|
+
export * from './api.types';
|
|
2
|
+
export * from './api.service';
|
|
3
3
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/api/index.ts"],"names":[],"mappings":"AAAA,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/api/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAE5B,cAAc,eAAe,CAAC"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { Nullable, StringOrNumber } from '../../lib';
|
|
2
|
+
export declare class CollectionService<T, Id extends StringOrNumber> {
|
|
3
|
+
private readonly props;
|
|
4
|
+
private _items;
|
|
5
|
+
constructor(props: {
|
|
6
|
+
getId: (item: T) => Id;
|
|
7
|
+
});
|
|
8
|
+
/**
|
|
9
|
+
* Возаращает id по самому элементу коллекции
|
|
10
|
+
*/
|
|
11
|
+
getIdByItem(item: T): Id;
|
|
12
|
+
/**
|
|
13
|
+
* Возвращает observable-коллекцию элементов в виде Map.
|
|
14
|
+
*/
|
|
15
|
+
get items(): import("mobx").ObservableMap<StringOrNumber, T>;
|
|
16
|
+
/**
|
|
17
|
+
* Возвращает все элементы коллекции в виде обычного массива.
|
|
18
|
+
*/
|
|
19
|
+
get list(): T[];
|
|
20
|
+
/**
|
|
21
|
+
* Возвращает все элементы, у которых значение указанного поля
|
|
22
|
+
* строго равно переданному значению.
|
|
23
|
+
*
|
|
24
|
+
* @typeParam K Ключ поля элемента.
|
|
25
|
+
* @param key Поле, по которому выполняется поиск.
|
|
26
|
+
* @param value Значение, с которым сравнивается поле.
|
|
27
|
+
* @returns Массив всех найденных элементов. Если совпадений нет, вернётся пустой массив.
|
|
28
|
+
*/
|
|
29
|
+
findAllBy<K extends keyof T>(key: K, value: T[K]): T[];
|
|
30
|
+
/**
|
|
31
|
+
* Возвращает все элементы, у которых значение указанного поля
|
|
32
|
+
* входит в список переданных значений.
|
|
33
|
+
*
|
|
34
|
+
* @typeParam K Ключ поля элемента.
|
|
35
|
+
* @param key Поле, по которому выполняется поиск.
|
|
36
|
+
* @param values Набор допустимых значений поля.
|
|
37
|
+
* @returns Массив всех найденных элементов. Если совпадений нет, вернётся пустой массив.
|
|
38
|
+
*/
|
|
39
|
+
findAllIn<K extends keyof T>(key: K, values: readonly T[K][]): T[];
|
|
40
|
+
/**
|
|
41
|
+
* Возвращает все элементы, которые одновременно соответствуют
|
|
42
|
+
* всем переданным критериям.
|
|
43
|
+
*
|
|
44
|
+
* Метод выполняет точное сравнение по каждому полю.
|
|
45
|
+
* Если передан пустой объект критериев, будут возвращены все элементы коллекции.
|
|
46
|
+
*
|
|
47
|
+
* @param criteria Объект с набором полей и значений для поиска.
|
|
48
|
+
* @returns Массив всех элементов, удовлетворяющих всем условиям сразу.
|
|
49
|
+
*/
|
|
50
|
+
findAllWhere(criteria: Partial<T>): T[];
|
|
51
|
+
/**
|
|
52
|
+
* Возвращает элемент по его идентификатору.
|
|
53
|
+
*
|
|
54
|
+
* @param id Идентификатор элемента.
|
|
55
|
+
* @returns Найденный элемент или undefined, если элемента с таким id нет.
|
|
56
|
+
*/
|
|
57
|
+
getById(id: Id): T | undefined;
|
|
58
|
+
/**
|
|
59
|
+
* Добавляет элемент в коллекцию.
|
|
60
|
+
*
|
|
61
|
+
* @param item Элемент для добавления или замены.
|
|
62
|
+
*/
|
|
63
|
+
add(item: T): void;
|
|
64
|
+
/**
|
|
65
|
+
* Добавляет в коллекцию несколько элементов подряд.
|
|
66
|
+
*
|
|
67
|
+
* @param items Массив элементов для добавления.
|
|
68
|
+
*/
|
|
69
|
+
addMany(items: T[]): void;
|
|
70
|
+
/**
|
|
71
|
+
* Удаляет элемент из коллекции по id.
|
|
72
|
+
*
|
|
73
|
+
* @param id Идентификатор удаляемого элемента.
|
|
74
|
+
*/
|
|
75
|
+
delete(id: Id): void;
|
|
76
|
+
/**
|
|
77
|
+
* Удаляет из коллекции несколько элементов по списку id.
|
|
78
|
+
*
|
|
79
|
+
* @param ids Массив идентификаторов для удаления.
|
|
80
|
+
*/
|
|
81
|
+
deleteMany(ids: Id[]): void;
|
|
82
|
+
/**
|
|
83
|
+
* Полностью очищает коллекцию и сбрасывает служебные состояния выбора.
|
|
84
|
+
*/
|
|
85
|
+
clear(): void;
|
|
86
|
+
private _updatedId;
|
|
87
|
+
get updatedId(): Nullable<Id>;
|
|
88
|
+
set updatedId(value: Nullable<Id>);
|
|
89
|
+
get updatedItem(): T | undefined;
|
|
90
|
+
private _selectedId;
|
|
91
|
+
get selectedId(): Nullable<Id>;
|
|
92
|
+
set selectedId(value: Nullable<Id>);
|
|
93
|
+
get selectedItem(): T | undefined;
|
|
94
|
+
private _deletedId;
|
|
95
|
+
get deletedId(): Nullable<Id>;
|
|
96
|
+
set deletedId(value: Nullable<Id>);
|
|
97
|
+
get deletedItem(): T | undefined;
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=collection.service.d.ts.map
|
|
@@ -0,0 +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;KACxB;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;IAIlB;;;;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"}
|
|
@@ -0,0 +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){this._items.set(this.props.getId(e),e)}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,2 +1,2 @@
|
|
|
1
|
-
export * from './collection';
|
|
1
|
+
export * from './collection.service';
|
|
2
2
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/collection/index.ts"],"names":[],"mappings":"AAAA,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/collection/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { Coordinate, Nullable, StringOrNumber } from '../../lib';
|
|
2
|
+
export type PointSnapshot = Coordinate;
|
|
3
|
+
export type LineSnapshot = Coordinate[];
|
|
4
|
+
export type PolygonSnapshot = Coordinate[][];
|
|
5
|
+
/**
|
|
6
|
+
* Базовые типы геометрий.
|
|
7
|
+
* Для конкретного экземпляра сервиса выбирается один тип:
|
|
8
|
+
* - PointSnapshot (Coordinate)
|
|
9
|
+
* - LineSnapshot (Coordinate[])
|
|
10
|
+
* - PolygonSnapshot (Coordinate[][])
|
|
11
|
+
*/
|
|
12
|
+
export type GeometrySnapshot = PointSnapshot | LineSnapshot | PolygonSnapshot;
|
|
13
|
+
/**
|
|
14
|
+
* Описание одного изменения геометрии для элемента коллекции.
|
|
15
|
+
*/
|
|
16
|
+
export type GeometryChange<TGeometry extends GeometrySnapshot, Id extends StringOrNumber> = {
|
|
17
|
+
id: Id;
|
|
18
|
+
geometry: TGeometry;
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Набор изменений, произошедших в рамках одного шага истории.
|
|
22
|
+
* Например, один drag, который сдвинул несколько примыкающих сегментов.
|
|
23
|
+
*/
|
|
24
|
+
export type GeometryChangeSet<TGeometry extends GeometrySnapshot, Id extends StringOrNumber> = GeometryChange<TGeometry, Id>[];
|
|
25
|
+
/**
|
|
26
|
+
* Состояние history-сервиса: прошлые и текущий шаг.
|
|
27
|
+
*/
|
|
28
|
+
export type GeometryHistoryState<TGeometry extends GeometrySnapshot, Id extends StringOrNumber> = {
|
|
29
|
+
past: readonly GeometryChangeSet<TGeometry, Id>[];
|
|
30
|
+
present: Nullable<GeometryChangeSet<TGeometry, Id>>;
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Опции history-сервиса.
|
|
34
|
+
*
|
|
35
|
+
* compare — обязательная стратегия сравнения двух геометрий одного типа.
|
|
36
|
+
*/
|
|
37
|
+
export type GeometryHistoryOptions<TGeometry extends GeometrySnapshot, Id extends StringOrNumber> = {
|
|
38
|
+
compare: (a: TGeometry, b: TGeometry) => boolean;
|
|
39
|
+
onChange?: (state: GeometryHistoryState<TGeometry, Id>) => void;
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* Готовые компараторы для каждого типа геометрии.
|
|
43
|
+
*/
|
|
44
|
+
export declare const GeometryComparators: {
|
|
45
|
+
point: (a: Coordinate, b: Coordinate) => boolean;
|
|
46
|
+
line: (a: LineSnapshot, b: LineSnapshot) => boolean;
|
|
47
|
+
polygon: (a: PolygonSnapshot, b: PolygonSnapshot) => boolean;
|
|
48
|
+
};
|
|
49
|
+
/**
|
|
50
|
+
* GeometryHistoryService (back-only, single geometry type)
|
|
51
|
+
*/
|
|
52
|
+
export declare class GeometryHistoryService<TGeometry extends GeometrySnapshot, Id extends StringOrNumber> {
|
|
53
|
+
private readonly options;
|
|
54
|
+
/**
|
|
55
|
+
* Прошлые шаги истории.
|
|
56
|
+
*/
|
|
57
|
+
private readonly _past;
|
|
58
|
+
/**
|
|
59
|
+
* Текущий шаг истории.
|
|
60
|
+
*/
|
|
61
|
+
private _present;
|
|
62
|
+
/**
|
|
63
|
+
* Флаг, что текущее состояние истории было инициализировано.
|
|
64
|
+
*/
|
|
65
|
+
private _hasPresent;
|
|
66
|
+
/**
|
|
67
|
+
* Индекс по id для быстрого поиска последнего изменения.
|
|
68
|
+
*/
|
|
69
|
+
private readonly _indexById;
|
|
70
|
+
constructor(options: GeometryHistoryOptions<TGeometry, Id>);
|
|
71
|
+
/**
|
|
72
|
+
* Сравнивает два набора изменений через options.compare.
|
|
73
|
+
* - длина должна совпадать;
|
|
74
|
+
* - для каждой позиции id и geometry должны совпадать.
|
|
75
|
+
*/
|
|
76
|
+
private _isSameChangeSet;
|
|
77
|
+
/**
|
|
78
|
+
* Полностью пересчитывает индекс по id из текущих past и present.
|
|
79
|
+
* Этот метод относительно дорогой (`O(N * K)`), но используется только:
|
|
80
|
+
* - при init;
|
|
81
|
+
* - при clear (через resetIndex);
|
|
82
|
+
* - при undo (редко относительно частоты findLastChangeById).
|
|
83
|
+
*/
|
|
84
|
+
private _rebuildIndex;
|
|
85
|
+
/**
|
|
86
|
+
* Сбрасывает индекс.
|
|
87
|
+
*/
|
|
88
|
+
private _resetIndex;
|
|
89
|
+
get past(): import("mobx").IObservableArray<GeometryChangeSet<TGeometry, Id>>;
|
|
90
|
+
get present(): Nullable<GeometryChangeSet<TGeometry, Id>>;
|
|
91
|
+
get hasPresent(): boolean;
|
|
92
|
+
get canUndo(): boolean;
|
|
93
|
+
get size(): number;
|
|
94
|
+
/**
|
|
95
|
+
* Инициализирует историю стартовым набором изменений.
|
|
96
|
+
* Полностью очищает past, задаёт новый present и пересчитывает индекс.
|
|
97
|
+
*/
|
|
98
|
+
init(value: GeometryChangeSet<TGeometry, Id>): void;
|
|
99
|
+
/**
|
|
100
|
+
* Добавляет новый шаг истории.
|
|
101
|
+
*
|
|
102
|
+
* Поведение:
|
|
103
|
+
* - если история не была инициализирована, value становится текущим шагом;
|
|
104
|
+
* - если новый набор изменений совпадает с текущим, запись не создаётся;
|
|
105
|
+
* - текущий шаг переносится в past;
|
|
106
|
+
* - индекс обновляется минимально.
|
|
107
|
+
*/
|
|
108
|
+
push(value: GeometryChangeSet<TGeometry, Id>): void;
|
|
109
|
+
/**
|
|
110
|
+
* Заменяет текущий шаг без создания новой записи в истории.
|
|
111
|
+
* Подходит для промежуточных изменений во время drag/edit-сессии.
|
|
112
|
+
*/
|
|
113
|
+
replace(value: GeometryChangeSet<TGeometry, Id>): void;
|
|
114
|
+
/**
|
|
115
|
+
* Откатывает историю на предыдущий шаг.
|
|
116
|
+
* Последний past становится present.
|
|
117
|
+
*/
|
|
118
|
+
undo(): Nullable<GeometryChangeSet<TGeometry, Id>>;
|
|
119
|
+
/**
|
|
120
|
+
* Полностью очищает историю.
|
|
121
|
+
*/
|
|
122
|
+
clear(): void;
|
|
123
|
+
/**
|
|
124
|
+
* Возвращает безопасный снимок текущего состояния истории.
|
|
125
|
+
*/
|
|
126
|
+
getState(): {
|
|
127
|
+
past: GeometryChangeSet<TGeometry, Id>[];
|
|
128
|
+
present: Nullable<GeometryChangeSet<TGeometry, Id>>;
|
|
129
|
+
};
|
|
130
|
+
/**
|
|
131
|
+
* Находит последний по времени шаг, в котором изменялась геометрия заданного id.
|
|
132
|
+
*/
|
|
133
|
+
findLastChangeById(id: Id): GeometryChange<TGeometry, Id> | null;
|
|
134
|
+
private emit;
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=geometry-history.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"geometry-history.service.d.ts","sourceRoot":"","sources":["../../../src/services/geometry-history/geometry-history.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAI7D,MAAM,MAAM,aAAa,GAAG,UAAU,CAAC;AAEvC,MAAM,MAAM,YAAY,GAAG,UAAU,EAAE,CAAC;AAExC,MAAM,MAAM,eAAe,GAAG,UAAU,EAAE,EAAE,CAAC;AAE7C;;;;;;GAMG;AACH,MAAM,MAAM,gBAAgB,GAAG,aAAa,GAAG,YAAY,GAAG,eAAe,CAAC;AAE9E;;GAEG;AACH,MAAM,MAAM,cAAc,CACxB,SAAS,SAAS,gBAAgB,EAClC,EAAE,SAAS,cAAc,IACvB;IACF,EAAE,EAAE,EAAE,CAAC;IACP,QAAQ,EAAE,SAAS,CAAC;CACrB,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,iBAAiB,CAC3B,SAAS,SAAS,gBAAgB,EAClC,EAAE,SAAS,cAAc,IACvB,cAAc,CAAC,SAAS,EAAE,EAAE,CAAC,EAAE,CAAC;AAEpC;;GAEG;AACH,MAAM,MAAM,oBAAoB,CAC9B,SAAS,SAAS,gBAAgB,EAClC,EAAE,SAAS,cAAc,IACvB;IACF,IAAI,EAAE,SAAS,iBAAiB,CAAC,SAAS,EAAE,EAAE,CAAC,EAAE,CAAC;IAClD,OAAO,EAAE,QAAQ,CAAC,iBAAiB,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC;CACrD,CAAC;AAEF;;;;GAIG;AACH,MAAM,MAAM,sBAAsB,CAChC,SAAS,SAAS,gBAAgB,EAClC,EAAE,SAAS,cAAc,IACvB;IACF,OAAO,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,KAAK,OAAO,CAAC;IACjD,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,oBAAoB,CAAC,SAAS,EAAE,EAAE,CAAC,KAAK,IAAI,CAAC;CACjE,CAAC;AAuBF;;GAEG;AACH,eAAO,MAAM,mBAAmB;eAtBH,UAAU,KAAK,UAAU;cAG/B,YAAY,KAAK,YAAY,KAAG,OAAO;iBAQpC,eAAe,KAAK,eAAe,KAAG,OAAO;CAetE,CAAC;AAcF;;GAEG;AACH,qBAAa,sBAAsB,CACjC,SAAS,SAAS,gBAAgB,EAClC,EAAE,SAAS,cAAc;IAsBb,OAAO,CAAC,QAAQ,CAAC,OAAO;IApBpC;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAwD;IAE9E;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAoD;IAEpE;;OAEG;IACH,OAAO,CAAC,WAAW,CAAS;IAE5B;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAwC;gBAEtC,OAAO,EAAE,sBAAsB,CAAC,SAAS,EAAE,EAAE,CAAC;IAM3E;;;;OAIG;IACH,OAAO,CAAC,gBAAgB;IAmBxB;;;;;;OAMG;IACH,OAAO,CAAC,aAAa;IA6BrB;;OAEG;IACH,OAAO,CAAC,WAAW;IAMnB,IAAW,IAAI,sEAEd;IAED,IAAW,OAAO,+CAEjB;IAED,IAAW,UAAU,YAEpB;IAED,IAAW,OAAO,YAEjB;IAED,IAAW,IAAI,WAEd;IAID;;;OAGG;IACI,IAAI,CAAC,KAAK,EAAE,iBAAiB,CAAC,SAAS,EAAE,EAAE,CAAC;IAYnD;;;;;;;;OAQG;IACI,IAAI,CAAC,KAAK,EAAE,iBAAiB,CAAC,SAAS,EAAE,EAAE,CAAC;IA8BnD;;;OAGG;IACI,OAAO,CAAC,KAAK,EAAE,iBAAiB,CAAC,SAAS,EAAE,EAAE,CAAC;IAUtD;;;OAGG;IACI,IAAI;IAgBX;;OAEG;IACI,KAAK;IAYZ;;OAEG;IACI,QAAQ;;;;IAQf;;OAEG;IACI,kBAAkB,CAAC,EAAE,EAAE,EAAE;IA0BhC,OAAO,CAAC,IAAI;CAGb"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{observable as e,makeAutoObservable as t}from"../../node_modules/mobx/dist/mobx.esm.esm.js";const s=(e,t)=>e.lat===t.lat&&e.lon===t.lon,n=(e,t)=>e.length===t.length&&e.every((e,n)=>s(e,t[n])),i={point:s,line:n,polygon:(e,t)=>e.length===t.length&&e.every((e,s)=>n(e,t[s]))};class r{options;_past=e.array();_present=null;_hasPresent=!1;_indexById=e.map();constructor(e){this.options=e,t(this,{},{autoBind:!0})}_isSameChangeSet(e,t){return e.length===t.length&&e.every((e,s)=>{const n=t[s];return e.id===n.id&&this.options.compare(e.geometry,n.geometry)})}_rebuildIndex(){this._indexById.clear(),this._past.forEach((e,t)=>{e.forEach((e,s)=>{this._indexById.set(e.id,{isPresent:!1,stepIndex:t,changeIndex:s,id:e.id})})}),this._present&&this._present.forEach((e,t)=>{this._indexById.set(e.id,{isPresent:!0,stepIndex:-1,changeIndex:t,id:e.id})})}_resetIndex(){this._indexById.clear()}get past(){return this._past}get present(){return this._present}get hasPresent(){return this._hasPresent}get canUndo(){return this._past.length>0}get size(){return this._past.length+(this._hasPresent?1:0)}init(e){this._past.clear(),this._present=e,this._hasPresent=!0,this._rebuildIndex(),this.emit()}push(e){if(!this._hasPresent||null==this._present)return this._present=e,this._hasPresent=!0,this._rebuildIndex(),void this.emit();this._isSameChangeSet(this._present,e)||(this._past.push(this._present),this._present=e,this._rebuildIndex(),this.emit())}replace(e){this._present=e,this._hasPresent=!0,this._rebuildIndex(),this.emit()}undo(){if(!this.canUndo||!this._hasPresent||null==this._present)return this._present;const e=this._past.pop()??null;return this._present=e,this._rebuildIndex(),this.emit(),this._present}clear(){this._past.clear(),this._present=null,this._hasPresent=!1,this._resetIndex(),this.emit()}getState(){return{past:[...this._past],present:this._present}}findLastChangeById(e){const t=this._indexById.get(e);if(!t)return null;if(t.isPresent){const e=this._present;return e?e[t.changeIndex]??null:null}const s=this._past[t.stepIndex];return s?s[t.changeIndex]??null:null}emit(){this.options.onChange?.(this.getState())}}export{i as GeometryComparators,r as GeometryHistoryService};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/geometry-history/index.ts"],"names":[],"mappings":"AAAA,cAAc,4BAA4B,CAAC"}
|
package/dist/services/index.d.ts
CHANGED
|
@@ -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,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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export * from './map';
|
|
1
|
+
export * from './map.service';
|
|
2
2
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/map/index.ts"],"names":[],"mappings":"AAAA,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/map/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import { Coordinate } from '../../lib';
|
|
2
|
+
import { LatLng } from 'leaflet';
|
|
3
|
+
declare class MapService {
|
|
4
|
+
/**
|
|
5
|
+
* Средний радиус Земли в метрах.
|
|
6
|
+
*/
|
|
7
|
+
readonly EARTH_RADIUS_M = 6371000;
|
|
8
|
+
/**
|
|
9
|
+
* Полный угол окружности в градусах.
|
|
10
|
+
*/
|
|
11
|
+
readonly FULL_CIRCLE_DEGREES = 360;
|
|
12
|
+
/**
|
|
13
|
+
* Половина окружности в градусах.
|
|
14
|
+
*
|
|
15
|
+
* Используется для перевода между градусами и радианами,
|
|
16
|
+
* а также для нормализации долготы.
|
|
17
|
+
*
|
|
18
|
+
* @returns Половина полного угла окружности, то есть `180`.
|
|
19
|
+
*/
|
|
20
|
+
get HALF_CIRCLE_DEGREES(): number;
|
|
21
|
+
/**
|
|
22
|
+
* Коэффициент перевода градусов в радианы.
|
|
23
|
+
*
|
|
24
|
+
* Формула: `Math.PI / 180`.
|
|
25
|
+
*
|
|
26
|
+
* @returns Значение коэффициента перевода градусов в радианы.
|
|
27
|
+
*/
|
|
28
|
+
get DEG_TO_RAD(): number;
|
|
29
|
+
/**
|
|
30
|
+
* Коэффициент перевода радиан в градусы.
|
|
31
|
+
*
|
|
32
|
+
* Формула: `180 / Math.PI`.
|
|
33
|
+
*
|
|
34
|
+
* @returns Значение коэффициента перевода радиан в градусы.
|
|
35
|
+
*/
|
|
36
|
+
get RAD_TO_DEG(): number;
|
|
37
|
+
constructor();
|
|
38
|
+
/**
|
|
39
|
+
* Преобразует объект Leaflet `LatLng` в внутренний формат координат `Coordinate`.
|
|
40
|
+
*
|
|
41
|
+
* @param latLng - Координаты в формате Leaflet.
|
|
42
|
+
* @returns Координаты в формате `{ lat, lon }`.
|
|
43
|
+
*/
|
|
44
|
+
getCoordinateByLatLng(latLng: LatLng): Coordinate;
|
|
45
|
+
/**
|
|
46
|
+
* Преобразует внутренний формат `Coordinate` в объект Leaflet `LatLng`.
|
|
47
|
+
*
|
|
48
|
+
* @param coordinate - Координаты в формате `{ lat, lon }`.
|
|
49
|
+
* @returns Экземпляр `LatLng` для использования в Leaflet.
|
|
50
|
+
*/
|
|
51
|
+
getLatLngByCoordinate(coordinate: Coordinate): LatLng;
|
|
52
|
+
/**
|
|
53
|
+
* Нормализует азимут в диапазон от `0` до `360` градусов, не включая `360`.
|
|
54
|
+
*
|
|
55
|
+
* Полезно для приведения отрицательных или выходящих за пределы окружности
|
|
56
|
+
* значений к стандартному диапазону.
|
|
57
|
+
*
|
|
58
|
+
* @param bearing - Азимут в градусах.
|
|
59
|
+
* @returns Нормализованный азимут в диапазоне `[0, 360)`.
|
|
60
|
+
*
|
|
61
|
+
* @example
|
|
62
|
+
* mapService.normalizeBearing(-90); // 270
|
|
63
|
+
* mapService.normalizeBearing(450); // 90
|
|
64
|
+
*/
|
|
65
|
+
normalizeBearing(bearing: number): number;
|
|
66
|
+
/**
|
|
67
|
+
* Нормализует долготу в диапазон от `-180` до `180` градусов.
|
|
68
|
+
*
|
|
69
|
+
* @param lon - Долгота в градусах.
|
|
70
|
+
* @returns Нормализованная долгота в диапазоне `[-180, 180)`.
|
|
71
|
+
*
|
|
72
|
+
* @example
|
|
73
|
+
* mapService.normalizeLongitude(190); // -170
|
|
74
|
+
* mapService.normalizeLongitude(-190); // 170
|
|
75
|
+
*/
|
|
76
|
+
normalizeLongitude(lon: number): number;
|
|
77
|
+
/**
|
|
78
|
+
* Вычисляет координату точки назначения по исходной точке,
|
|
79
|
+
* расстоянию и азимуту.
|
|
80
|
+
*
|
|
81
|
+
* Расчет выполняется по формулам сферической геометрии,
|
|
82
|
+
* где Земля рассматривается как сфера с радиусом `EARTH_RADIUS_M`.
|
|
83
|
+
*
|
|
84
|
+
* @param params - Параметры расчета.
|
|
85
|
+
* @param params.coordinate - Исходная координата.
|
|
86
|
+
* @param params.distance - Расстояние до точки назначения в метрах.
|
|
87
|
+
* @param params.azimuth - Азимут движения в градусах.
|
|
88
|
+
* @returns Координата точки назначения в формате `{ lat, lon }`.
|
|
89
|
+
*
|
|
90
|
+
* @example
|
|
91
|
+
* mapService.calculateDestination({
|
|
92
|
+
* coordinate: { lat: 55.75, lon: 37.61 },
|
|
93
|
+
* distance: 1000,
|
|
94
|
+
* azimuth: 90,
|
|
95
|
+
* });
|
|
96
|
+
*/
|
|
97
|
+
calculateDestination: ({ coordinate, distance, azimuth, }: {
|
|
98
|
+
coordinate: Coordinate;
|
|
99
|
+
distance: number;
|
|
100
|
+
azimuth: number;
|
|
101
|
+
}) => {
|
|
102
|
+
lat: number;
|
|
103
|
+
lon: number;
|
|
104
|
+
};
|
|
105
|
+
/**
|
|
106
|
+
* Вычисляет расстояние между двумя географическими точками
|
|
107
|
+
* по формуле гаверсинуса.
|
|
108
|
+
*
|
|
109
|
+
* Метод подходит для расчета кратчайшего расстояния по поверхности Земли
|
|
110
|
+
* между двумя координатами.
|
|
111
|
+
*
|
|
112
|
+
* @param a - Первая координата.
|
|
113
|
+
* @param b - Вторая координата.
|
|
114
|
+
* @returns Расстояние между точками в метрах.
|
|
115
|
+
*/
|
|
116
|
+
haversineDistance(a: Coordinate, b: Coordinate): number;
|
|
117
|
+
/**
|
|
118
|
+
* Вычисляет начальный азимут из точки `a` в точку `b`.
|
|
119
|
+
*
|
|
120
|
+
* Возвращаемое значение — это направление движения в градусах
|
|
121
|
+
* относительно севера по часовой стрелке, нормализованное в диапазон `[0, 360)`.
|
|
122
|
+
*
|
|
123
|
+
* @param a - Начальная координата.
|
|
124
|
+
* @param b - Конечная координата.
|
|
125
|
+
* @returns Начальный азимут в градусах.
|
|
126
|
+
*/
|
|
127
|
+
initialBearing(a: Coordinate, b: Coordinate): number;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Сервис для работы с географическими координатами и базовыми
|
|
131
|
+
* геодезическими вычислениями на сфере Земли.
|
|
132
|
+
*
|
|
133
|
+
* Предоставляет методы для:
|
|
134
|
+
* - преобразования между `Coordinate` и `LatLng`;
|
|
135
|
+
* - нормализации азимута и долготы;
|
|
136
|
+
* - вычисления точки назначения по расстоянию и азимуту;
|
|
137
|
+
* - расчета расстояния между двумя точками по формуле гаверсинуса;
|
|
138
|
+
* - расчета начального азимута между двумя координатами.
|
|
139
|
+
*/
|
|
140
|
+
export declare const mapService: MapService;
|
|
141
|
+
export {};
|
|
142
|
+
//# sourceMappingURL=map.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"map.service.d.ts","sourceRoot":"","sources":["../../../src/services/map/map.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAEnC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEjC,cAAM,UAAU;IACd;;OAEG;IACH,SAAgB,cAAc,WAAa;IAE3C;;OAEG;IACH,SAAgB,mBAAmB,OAAO;IAE1C;;;;;;;OAOG;IACH,IAAW,mBAAmB,WAE7B;IAED;;;;;;OAMG;IACH,IAAW,UAAU,WAEpB;IAED;;;;;;OAMG;IACH,IAAW,UAAU,WAEpB;;IAID;;;;;OAKG;IACI,qBAAqB,CAAC,MAAM,EAAE,MAAM;IAW3C;;;;;OAKG;IACI,qBAAqB,CAAC,UAAU,EAAE,UAAU;IAQnD;;;;;;;;;;;;OAYG;IACI,gBAAgB,CAAC,OAAO,EAAE,MAAM;IAOvC;;;;;;;;;OASG;IACI,kBAAkB,CAAC,GAAG,EAAE,MAAM;IAQrC;;;;;;;;;;;;;;;;;;;OAmBG;IACI,oBAAoB,GAAI,oCAI5B;QACD,UAAU,EAAE,UAAU,CAAC;QACvB,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC;KACjB;;;MAsBC;IAEF;;;;;;;;;;OAUG;IACI,iBAAiB,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU;IAiBrD;;;;;;;;;OASG;IACI,cAAc,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU;CAiBnD;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,UAAU,YAAmB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a as t}from"../../_virtual/leaflet-src.esm.js";const a=new class{EARTH_RADIUS_M=6371e3;FULL_CIRCLE_DEGREES=360;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}constructor(){}getCoordinateByLatLng(t){const{lat:a,lng:s}=t;return{lat:a,lon:s}}getLatLngByCoordinate(a){const{lat:s,lon:E}=a;return new t.LatLng(s,E)}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:a,azimuth:s})=>{const E=t.lat*this.DEG_TO_RAD,i=t.lon*this.DEG_TO_RAD,n=this.normalizeBearing(s)*this.DEG_TO_RAD,_=a/this.EARTH_RADIUS_M,h=Math.sin(E),D=Math.cos(E),R=Math.sin(_),e=Math.cos(_),o=Math.sin(n),r=Math.cos(n),L=Math.asin(h*e+D*R*r),l=i+Math.atan2(o*R*D,e-h*Math.sin(L));return{lat:L*this.RAD_TO_DEG,lon:this.normalizeLongitude(l*this.RAD_TO_DEG)}};haversineDistance(t,a){const s=t.lat*this.DEG_TO_RAD,E=a.lat*this.DEG_TO_RAD,i=(a.lat-t.lat)*this.DEG_TO_RAD,n=(a.lon-t.lon)*this.DEG_TO_RAD,_=Math.sin(i/2)**2+Math.cos(s)*Math.cos(E)*Math.sin(n/2)**2,h=2*Math.atan2(Math.sqrt(_),Math.sqrt(1-_));return this.EARTH_RADIUS_M*h}initialBearing(t,a){const s=t.lat*this.DEG_TO_RAD,E=a.lat*this.DEG_TO_RAD,i=t.lon*this.DEG_TO_RAD,n=a.lon*this.DEG_TO_RAD,_=Math.sin(n-i)*Math.cos(E),h=Math.cos(s)*Math.sin(E)-Math.sin(s)*Math.cos(E)*Math.cos(n-i);return this.normalizeBearing(Math.atan2(_,h)*this.RAD_TO_DEG)}};export{a as mapService};
|