@aggdirect/coolmap-services 0.0.5 → 0.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/esm2020/aggdirect-coolmap-services.mjs +5 -0
  2. package/esm2020/lib/coolmap-services.component.mjs +22 -0
  3. package/esm2020/lib/coolmap-services.module.mjs +21 -0
  4. package/esm2020/lib/coolmap-services.service.mjs +14 -0
  5. package/esm2020/lib/service/coolmap.service.mjs +438 -0
  6. package/esm2020/lib/service/data-model.mjs +35 -0
  7. package/esm2020/lib/service/utils.service.mjs +210 -0
  8. package/esm2020/public-api.mjs +10 -0
  9. package/fesm2015/aggdirect-coolmap-services.mjs +758 -0
  10. package/fesm2015/aggdirect-coolmap-services.mjs.map +1 -0
  11. package/fesm2020/aggdirect-coolmap-services.mjs +740 -0
  12. package/fesm2020/aggdirect-coolmap-services.mjs.map +1 -0
  13. package/index.d.ts +5 -0
  14. package/lib/coolmap-services.component.d.ts +8 -0
  15. package/lib/coolmap-services.module.d.ts +7 -0
  16. package/lib/coolmap-services.service.d.ts +6 -0
  17. package/lib/service/coolmap.service.d.ts +45 -0
  18. package/lib/service/data-model.d.ts +73 -0
  19. package/lib/service/utils.service.d.ts +49 -0
  20. package/package.json +28 -5
  21. package/{src/public-api.ts → public-api.d.ts} +0 -7
  22. package/karma.conf.js +0 -44
  23. package/ng-package.json +0 -7
  24. package/src/lib/coolmap-services.component.spec.ts +0 -23
  25. package/src/lib/coolmap-services.component.ts +0 -20
  26. package/src/lib/coolmap-services.module.ts +0 -16
  27. package/src/lib/coolmap-services.service.spec.ts +0 -16
  28. package/src/lib/coolmap-services.service.ts +0 -9
  29. package/src/lib/service/coolmap.service.ts +0 -445
  30. package/src/lib/service/data-model.ts +0 -80
  31. package/src/lib/service/utils.service.ts +0 -198
  32. package/src/test.ts +0 -27
  33. package/tsconfig.lib.json +0 -15
  34. package/tsconfig.lib.prod.json +0 -10
  35. package/tsconfig.spec.json +0 -17
@@ -0,0 +1,758 @@
1
+ import * as i0 from '@angular/core';
2
+ import { Injectable, Component, NgModule } from '@angular/core';
3
+ import { __awaiter } from 'tslib';
4
+ import * as mapboxgl from 'mapbox-gl';
5
+ import * as turf from '@turf/turf';
6
+ import { BehaviorSubject } from 'rxjs';
7
+ import { MapboxLayer } from '@deck.gl/mapbox';
8
+ import { ArcLayer } from '@deck.gl/layers';
9
+ import * as i1 from '@angular/common/http';
10
+ import * as i2 from '@angular/material/snack-bar';
11
+ import * as i2$1 from '@angular/platform-browser';
12
+
13
+ class CoolmapServicesService {
14
+ constructor() { }
15
+ }
16
+ CoolmapServicesService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: CoolmapServicesService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
17
+ CoolmapServicesService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: CoolmapServicesService, providedIn: 'root' });
18
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: CoolmapServicesService, decorators: [{
19
+ type: Injectable,
20
+ args: [{
21
+ providedIn: 'root'
22
+ }]
23
+ }], ctorParameters: function () { return []; } });
24
+
25
+ class CoolmapServicesComponent {
26
+ constructor() { }
27
+ ngOnInit() {
28
+ }
29
+ }
30
+ CoolmapServicesComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: CoolmapServicesComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
31
+ CoolmapServicesComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: CoolmapServicesComponent, selector: "lib-coolmap-services", ngImport: i0, template: `
32
+ <p>
33
+ coolmap-services works!
34
+ </p>
35
+ `, isInline: true });
36
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: CoolmapServicesComponent, decorators: [{
37
+ type: Component,
38
+ args: [{ selector: 'lib-coolmap-services', template: `
39
+ <p>
40
+ coolmap-services works!
41
+ </p>
42
+ ` }]
43
+ }], ctorParameters: function () { return []; } });
44
+
45
+ class CoolmapServicesModule {
46
+ }
47
+ CoolmapServicesModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: CoolmapServicesModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
48
+ CoolmapServicesModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.2.12", ngImport: i0, type: CoolmapServicesModule, declarations: [CoolmapServicesComponent], exports: [CoolmapServicesComponent] });
49
+ CoolmapServicesModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: CoolmapServicesModule });
50
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: CoolmapServicesModule, decorators: [{
51
+ type: NgModule,
52
+ args: [{
53
+ declarations: [
54
+ CoolmapServicesComponent
55
+ ],
56
+ imports: [],
57
+ exports: [
58
+ CoolmapServicesComponent
59
+ ]
60
+ }]
61
+ }] });
62
+
63
+ class UtilsService {
64
+ constructor(http, snackBar) {
65
+ this.http = http;
66
+ this.snackBar = snackBar;
67
+ this.analyticsRESTURL = '';
68
+ this.RESTURLPrefix = '';
69
+ this.pickupOptions = [];
70
+ this.destOptions = [];
71
+ this.ownerOptions = [];
72
+ this.customerOptions = [];
73
+ this.unitOptions = [];
74
+ this.materialOptions = [];
75
+ this.jcodeOptions = [];
76
+ this.driverOption = [];
77
+ this.truckingCompanayOption = [];
78
+ this.routeNameOptions = [];
79
+ this.preventnavChange = new BehaviorSubject(false);
80
+ this.navChangeObserve = this.preventnavChange.asObservable();
81
+ this.clearViewRouteforJobCode = new BehaviorSubject(false);
82
+ this.clearViewRouteforJobCodeObserve = this.clearViewRouteforJobCode.asObservable();
83
+ this.preVentJobdetailclose = new BehaviorSubject(false);
84
+ this.getpreVentJobdetailclose = this.preVentJobdetailclose.asObservable();
85
+ this.routeDetailsUtility = new BehaviorSubject({});
86
+ this.getrouteDetailsUtility = this.routeDetailsUtility.asObservable();
87
+ this.removeMapEntity = new BehaviorSubject({});
88
+ this.removeMapEntityUtility = this.removeMapEntity.asObservable();
89
+ this.dict = new Map();
90
+ this.analyticsRESTURL = 'https://test-analytics.aggdirect.com/REST/';
91
+ this.RESTURLPrefix = 'https://test-server.aggdirect.com/REST/';
92
+ }
93
+ getDateFormat(strVal, seprater) {
94
+ seprater = seprater ? seprater : '-';
95
+ const mydate = strVal;
96
+ return (mydate === null || mydate === void 0 ? void 0 : mydate.getFullYear()) + seprater + ((mydate ? mydate.getMonth() : 0) + 1) + seprater + (mydate === null || mydate === void 0 ? void 0 : mydate.getDate());
97
+ }
98
+ getData(path) { return this.http.get(`${this.analyticsRESTURL}${path}`); }
99
+ postdata(path, data) { return this.http.post(`${this.analyticsRESTURL}${path}`, data); }
100
+ postDataWithRestUrl(path, data) { return this.http.post(`${this.RESTURLPrefix}${path}`, data); }
101
+ fetchAutoCompleteLocations(keyword) {
102
+ return this.http.get(`https://api.mapbox.com/geocoding/v5/mapbox.places/${keyword}.json?access_token=pk.eyJ1Ijoic2FudGFudS1vZ21hIiwiYSI6ImNsOGQ0cDVrNjAweTMzb3RmdG9ieTU5ZDkifQ.I6ZS7mViZYSvBo4zz-mGQQ&country=US`);
103
+ }
104
+ openSnackBar(message, className) {
105
+ this.snackBar.open(message, '', {
106
+ duration: 5000, verticalPosition: 'top', horizontalPosition: 'center', panelClass: [className ? className : 'default']
107
+ });
108
+ }
109
+ makeOptions(item) {
110
+ var _a;
111
+ if (item.order_number) {
112
+ (this.jcodeOptions.findIndex((elem) => elem.job_id === item.job_id) === -1) ? this.jcodeOptions.push({ job_code: item.order_number, job_id: item.job_id }) : null;
113
+ if (item.driver_list && ((_a = item.driver_list) === null || _a === void 0 ? void 0 : _a.length) > 0) {
114
+ item.driver_list.forEach((driver) => {
115
+ this.driverOption.findIndex(elem => elem === driver['driver_name']) === -1 ? this.driverOption.push(driver['driver_name']) : null;
116
+ this.truckingCompanayOption.findIndex(elem => elem === driver['trucking_company']) === -1 ? this.truckingCompanayOption.push(driver['trucking_company']) : null;
117
+ });
118
+ }
119
+ }
120
+ ((this.pickupOptions.findIndex((elem) => elem === item.pickup_location)) === -1) ? this.pickupOptions.push(item.pickup_location) : null;
121
+ ((this.destOptions.findIndex((elem) => elem === item.delivery_location)) === -1) ? this.destOptions.push(item.delivery_location) : null;
122
+ (this.customerOptions.findIndex((customer) => customer === item.customer_name) === -1) ? this.customerOptions.push(item.customer_name) : null;
123
+ (this.unitOptions.findIndex((elem) => elem === item.unit) === -1) ? this.unitOptions.push(item.unit) : null;
124
+ (this.materialOptions.findIndex((elem) => elem === item.material) === -1) ? this.materialOptions.push(item.material) : null;
125
+ if (item.route_name)
126
+ this.routeNameOptions.findIndex(elem => elem === item.route_name) === -1 ? this.routeNameOptions.push(item.route_name) : null;
127
+ }
128
+ filter(value, filters) {
129
+ if (typeof value !== 'string') {
130
+ return [];
131
+ }
132
+ const filterValue = value.toLowerCase();
133
+ if (filterValue === '') {
134
+ return [];
135
+ }
136
+ const searchResults = [];
137
+ this.unitOptions.map(unit => {
138
+ if (unit.toLowerCase().includes(filterValue)) {
139
+ searchResults.push({ "type": "unit", "label": unit, "value": unit });
140
+ }
141
+ });
142
+ this.customerOptions.map(unit => {
143
+ if (unit.toLowerCase().includes(filterValue)) {
144
+ searchResults.push({ "type": "customer", "label": unit, "value": unit });
145
+ }
146
+ });
147
+ this.materialOptions.map(unit => {
148
+ if (unit.toLowerCase().includes(filterValue)) {
149
+ searchResults.push({ "type": "material", "label": unit, "value": unit });
150
+ }
151
+ });
152
+ this.pickupOptions.map(unit => {
153
+ if (unit.toLowerCase().includes(filterValue)) {
154
+ searchResults.push({ "type": "pickup location", "label": unit, "value": unit });
155
+ }
156
+ });
157
+ this.destOptions.map(unit => {
158
+ if (unit.toLowerCase().includes(filterValue)) {
159
+ searchResults.push({ "type": "destination location", "label": unit, "value": unit });
160
+ }
161
+ });
162
+ this.jcodeOptions.map(unit => {
163
+ if (unit.job_code.toLowerCase().includes(filterValue)) {
164
+ searchResults.push({ "type": "job", "label": unit['job_code'], "value": unit });
165
+ }
166
+ });
167
+ this.driverOption.map(unit => {
168
+ if (unit.toLowerCase().includes(filterValue)) {
169
+ searchResults.push({ "type": "Driver", "label": unit, "value": unit });
170
+ }
171
+ });
172
+ this.truckingCompanayOption.map(unit => {
173
+ if (unit.toLowerCase().includes(filterValue)) {
174
+ searchResults.push({ "type": "Trucking Company", "label": unit, "value": unit });
175
+ }
176
+ });
177
+ this.routeNameOptions.map(unit => {
178
+ if (unit.toLowerCase().includes(filterValue)) {
179
+ searchResults.push({ "type": "Route name", "label": unit, "value": unit });
180
+ }
181
+ });
182
+ const searchDict = {};
183
+ filters.map((filter) => {
184
+ searchDict[filter['name'] + filter['type']] = filter;
185
+ });
186
+ const furtherFilter = [];
187
+ searchResults.map(search => {
188
+ if ((search['label'] + search['type']) in searchDict) { }
189
+ else {
190
+ furtherFilter.push(search);
191
+ }
192
+ });
193
+ return furtherFilter;
194
+ }
195
+ getSearchResults(list, filterval) {
196
+ return list.filter(element => {
197
+ var _a, _b;
198
+ const result_list_boolean = [];
199
+ if (filterval.length > 0) {
200
+ if (filterval[0]['type'] === 'unit') {
201
+ result_list_boolean.push(filterval[0]['name'] === element[filterval[0]['type']]);
202
+ }
203
+ if (filterval[0]['type'] === 'customer') {
204
+ result_list_boolean.push(filterval[0]['name'] === element['customer_name']);
205
+ }
206
+ if (filterval[0]['type'] === 'material') {
207
+ result_list_boolean.push(filterval[0]['name'] === element[filterval[0]['type']]);
208
+ }
209
+ if (filterval[0]['type'] === 'pickup location') {
210
+ result_list_boolean.push(filterval[0]['name'] === element['pickup_location']);
211
+ }
212
+ if (filterval[0]['type'] === 'destination location') {
213
+ result_list_boolean.push(filterval[0]['name'] === element['delivery_location']);
214
+ }
215
+ if (filterval[0]['type'] === 'job') {
216
+ result_list_boolean.push(filterval[0]['name'] === element['order_number']);
217
+ }
218
+ if (filterval[0]['type'] === 'Route name') {
219
+ result_list_boolean.push(filterval[0]['name'] === element['route_name']);
220
+ }
221
+ if (filterval[0]['type'] === 'Driver') {
222
+ const index = (_a = element.driver_list) === null || _a === void 0 ? void 0 : _a.findIndex(ele => { return filterval[0]['name'] === ele['driver_name']; });
223
+ if (index !== -1)
224
+ result_list_boolean.push(true);
225
+ }
226
+ if (filterval[0]['type'] === 'Trucking Company') {
227
+ const index = (_b = element.driver_list) === null || _b === void 0 ? void 0 : _b.findIndex(ele => { return filterval[0]['name'] === ele['trucking_company']; });
228
+ if (index !== -1)
229
+ result_list_boolean.push(true);
230
+ }
231
+ }
232
+ if (result_list_boolean.length > 0) {
233
+ return result_list_boolean.reduce((prev, curr) => prev && curr);
234
+ }
235
+ return false;
236
+ });
237
+ }
238
+ clearOptions() {
239
+ this.pickupOptions = [];
240
+ this.destOptions = [];
241
+ this.ownerOptions = [];
242
+ this.customerOptions = [];
243
+ this.unitOptions = [];
244
+ this.materialOptions = [];
245
+ this.jcodeOptions = [];
246
+ this.routeNameOptions = [];
247
+ }
248
+ setdictValue(key, value) {
249
+ this.dict.set(key, value);
250
+ }
251
+ getdictValue(key) {
252
+ return JSON.parse(this.dict.get(key));
253
+ }
254
+ removedictValue(key) {
255
+ this.dict.delete(key);
256
+ }
257
+ conveySearchIcon(value) {
258
+ if (value && typeof (value) !== 'object')
259
+ return true;
260
+ return false;
261
+ }
262
+ }
263
+ UtilsService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: UtilsService, deps: [{ token: i1.HttpClient }, { token: i2.MatSnackBar }], target: i0.ɵɵFactoryTarget.Injectable });
264
+ UtilsService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: UtilsService, providedIn: 'root' });
265
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: UtilsService, decorators: [{
266
+ type: Injectable,
267
+ args: [{ providedIn: 'root' }]
268
+ }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i2.MatSnackBar }]; } });
269
+
270
+ class CoolmapService {
271
+ constructor(utils, eventManager) {
272
+ this.utils = utils;
273
+ this.eventManager = eventManager;
274
+ this.markerOriginList = [];
275
+ this.markerDestinationList = [];
276
+ this.initiatecoolmap = new BehaviorSubject(true);
277
+ this.reintiatecoolmap = this.initiatecoolmap.asObservable();
278
+ this.bounds = new mapboxgl.LngLatBounds();
279
+ this.originDestinationCordinates = [];
280
+ this.eventManager.addGlobalEventListener('window', 'resize', this.onResize.bind(this));
281
+ this.windowActualHeightWidth = { availHeight: 0 };
282
+ }
283
+ initiateMapForAddRoute(el) {
284
+ return new Promise((resolve, reject) => {
285
+ this.map = new mapboxgl.Map({
286
+ accessToken: 'pk.eyJ1Ijoic2FudGFudS1vZ21hIiwiYSI6ImNsOGQ0cDVrNjAweTMzb3RmdG9ieTU5ZDkifQ.I6ZS7mViZYSvBo4zz-mGQQ',
287
+ container: el,
288
+ style: 'mapbox://styles/santanu-ogma/cl8ep33uz003414n1twlosz9d',
289
+ center: [-77.036873, 38.907192],
290
+ zoom: 10, bearing: 0, pitch: 65, interactive: true,
291
+ });
292
+ this.map.once('load', (res) => {
293
+ resolve(res);
294
+ });
295
+ });
296
+ }
297
+ // Below method Load route with animation
298
+ loadMapProperty(pinRouteGeojson, index, unit, route, bottom) {
299
+ return new Promise((resolve, reject) => {
300
+ let origin = pinRouteGeojson.features[0].geometry.coordinates[0];
301
+ const linecolor = (unit === 'Ton') ? '#ff7272' : (unit === 'Load') ? '#a3c52e' : '#ae23d1';
302
+ let destination = pinRouteGeojson.features[0].geometry.coordinates[pinRouteGeojson.features[0].geometry.coordinates.length - 1];
303
+ this.extendBound(pinRouteGeojson.features[0].geometry.coordinates, true).then((res) => {
304
+ const point = {
305
+ 'type': 'FeatureCollection',
306
+ 'features': [
307
+ { 'type': 'Feature', 'properties': {}, 'geometry': { 'type': 'Point', 'coordinates': origin } }
308
+ ]
309
+ };
310
+ const lineDistance = turf.length(pinRouteGeojson.features[0]);
311
+ const arc = [];
312
+ const steps = 10 * pinRouteGeojson.features[0].geometry.coordinates.length;
313
+ for (let i = 0; i < lineDistance; i += lineDistance / steps) {
314
+ const segment = turf.along(pinRouteGeojson.features[0], i);
315
+ arc.push(segment.geometry.coordinates);
316
+ }
317
+ pinRouteGeojson.features[0].geometry.coordinates = arc;
318
+ const pinRoute = pinRouteGeojson.features[0].geometry.coordinates;
319
+ const marker = new mapboxgl.Marker(document.createElement('div'))
320
+ .setLngLat(pinRoute[0]).addTo(this.map).togglePopup();
321
+ if (this.map.getSource(`line${index}`)) {
322
+ this.removeRouteAndMarker(index).then(() => { });
323
+ }
324
+ this.map.addSource(`line${index}`, { type: 'geojson', lineMetrics: true, data: pinRouteGeojson });
325
+ this.map.addLayer({
326
+ type: 'line',
327
+ source: `line${index}`,
328
+ id: `line${index}`,
329
+ paint: {
330
+ 'line-width': 2,
331
+ 'line-gradient': [
332
+ 'interpolate',
333
+ ['linear'],
334
+ ['line-progress'],
335
+ 0, unit === 'Ton' ? '#d7f7e4' : unit === 'Load' ? '#c9d8f5' : '#f5dcc1',
336
+ 1, unit === 'Ton' ? '#ff7272' : unit === 'Load' ? '#a3c52e' : '#ae23d1',
337
+ ]
338
+ },
339
+ layout: { 'line-cap': 'round', 'line-join': 'round' }
340
+ });
341
+ const dataSetForMap = {
342
+ counter: 0, pinRouteGeojson, steps,
343
+ point, pointId: `point${index}`,
344
+ marker, pinRoute, lineId: `line${index}`, index,
345
+ origin, destination, lineDistance,
346
+ linecolor, route, isViewRoute: true
347
+ };
348
+ this.createMarker(dataSetForMap);
349
+ this.map.on('mouseenter', `line${index}`, (e) => {
350
+ this.map.setPaintProperty(`line${index}`, 'line-width', 5);
351
+ this.map.setPaintProperty(`line${index}`, 'line-opacity', 1);
352
+ const datasetForPopup = {
353
+ coordinate: [e.lngLat.lng, e.lngLat.lat],
354
+ pickup: route.pickup_location ? route.pickup_location : '',
355
+ drop: route.delivery_location ? route.delivery_location : '',
356
+ routeType: route.project ? 'Project' : 'Route',
357
+ title: route.project ? route.project : route.route_name ? route.route_name : '',
358
+ material: route.material ? route.material : '',
359
+ type: route.unit ? route.unit : ''
360
+ };
361
+ this.createPopup(datasetForPopup);
362
+ });
363
+ this.map.on('mouseleave', `line${index}`, (e) => {
364
+ this.map.setPaintProperty(`line${index}`, 'line-width', 2);
365
+ if (this.popup) {
366
+ this.popup.remove();
367
+ }
368
+ });
369
+ });
370
+ this.map.once('idle', (res) => {
371
+ resolve(true);
372
+ });
373
+ });
374
+ }
375
+ // Below method Load route without animation
376
+ drawLine(cordinates, index, route, enablefitbound, routeType) {
377
+ let linecolor;
378
+ let origin = cordinates[0];
379
+ let destination = cordinates[cordinates.length - 1];
380
+ if (origin[0] && origin[1] && destination && destination[0] && destination[1]) {
381
+ linecolor = this.provideLineColor(route['unit'], routeType);
382
+ if (enablefitbound) {
383
+ const padding = {
384
+ top: this.padding.top, bottom: this.padding.bottom + (this.windowActualHeightWidth.availHeight - (window.innerHeight - 65)),
385
+ left: this.padding.left, right: this.padding.right
386
+ };
387
+ this.map.fitBounds([origin, destination], { padding }, { fitboundCompleteJob: true });
388
+ }
389
+ if (this.map.getSource(`route-source-for-job-code${index}`)) {
390
+ this.removeRouteAndMarker(index).then(() => { });
391
+ }
392
+ this.map.addSource(`route-source-for-job-code${index}`, {
393
+ 'type': 'geojson',
394
+ 'data': { 'type': 'Feature', 'properties': {}, 'geometry': { 'type': 'LineString', 'coordinates': cordinates } }
395
+ });
396
+ this.map.addLayer({
397
+ 'id': `route-for-job-code${index}`, 'type': 'line', 'source': `route-source-for-job-code${index}`,
398
+ paint: { 'line-color': linecolor, 'line-width': 2 },
399
+ layout: { 'line-cap': 'round', 'line-join': 'round' }
400
+ });
401
+ const dataSetForMap = {
402
+ origin, destination, index, linecolor, route
403
+ };
404
+ this.createMarker(dataSetForMap);
405
+ this.map.on('mouseenter', `route-for-job-code${index}`, (e) => {
406
+ if (this.popup) {
407
+ this.popup.remove();
408
+ }
409
+ this.map.setPaintProperty(`route-for-job-code${index}`, 'line-width', 5);
410
+ this.map.setPaintProperty(`route-for-job-code${index}`, 'line-opacity', 1);
411
+ const datasetForPopup = {
412
+ coordinate: [e.lngLat.lng, e.lngLat.lat],
413
+ pickup: route.pickup_location ? route.pickup_location : '',
414
+ drop: route.delivery_location ? route.delivery_location : '',
415
+ jobCode: route.project ? route.order_number : null,
416
+ customer: route.project ? route.customer_name : null,
417
+ routeType: route.project ? 'Project' : 'Route',
418
+ title: route.project ? route.project : route.route_name ? route.route_name : '',
419
+ material: route.material ? route.material : '',
420
+ type: route.unit ? route.unit : ''
421
+ };
422
+ this.createPopup(datasetForPopup);
423
+ });
424
+ this.map.on('mouseleave', `route-for-job-code${index}`, (e) => {
425
+ this.map.setPaintProperty(`route-for-job-code${index}`, 'line-width', 2);
426
+ if (this.popup) {
427
+ this.popup.remove();
428
+ }
429
+ });
430
+ }
431
+ }
432
+ provideLineColor(unitType, type) {
433
+ let checkType = (type && !['jobrouteList', 'addroute'].includes(type)) ? true : false;
434
+ let color;
435
+ switch (unitType) {
436
+ case "Ton":
437
+ color = checkType ? '#39c471' : '#ff7272';
438
+ break;
439
+ case "Load":
440
+ color = checkType ? '#326ad3' : '#a3c52e';
441
+ break;
442
+ case "Hourly":
443
+ color = checkType ? '#ffad56' : '#ae23d1';
444
+ break;
445
+ }
446
+ return color;
447
+ }
448
+ showRoutePopup(arcDetails, event, isViewRoute) {
449
+ if (this.popup) {
450
+ this.popup.remove();
451
+ this.map.setPaintProperty(`${isViewRoute ? 'line' : 'route-for-job-code'}${arcDetails.layer.props.data.index}`, 'line-width', 2);
452
+ }
453
+ if (arcDetails.color && this.map.getLayoutProperty(arcDetails.layer.id, 'visibility') !== 'none') {
454
+ this.map.setPaintProperty(`${isViewRoute ? 'line' : 'route-for-job-code'}${arcDetails.layer.props.data.index}`, 'line-width', 5);
455
+ this.map.setPaintProperty(`${isViewRoute ? 'line' : 'route-for-job-code'}${arcDetails.layer.props.data.index}`, 'line-opacity', 1);
456
+ const datasetForPopup = {
457
+ coordinate: arcDetails.coordinate,
458
+ pickup: arcDetails.layer.props.data.route.pickup_location ? arcDetails.layer.props.data.route.pickup_location : '',
459
+ drop: arcDetails.layer.props.data.route.delivery_location ? arcDetails.layer.props.data.route.delivery_location : '',
460
+ jobCode: arcDetails.layer.props.data.route.project ? arcDetails.layer.props.data.route.order_number : '',
461
+ customer: arcDetails.layer.props.data.route.project ? arcDetails.layer.props.data.route.customer_name : '',
462
+ routeType: arcDetails.layer.props.data.route.project ? 'Project' : 'Route',
463
+ title: arcDetails.layer.props.data.route.project ? arcDetails.layer.props.data.route.project : arcDetails.layer.props.data.route.route_name ? arcDetails.layer.props.data.route.route_name : '',
464
+ material: arcDetails.layer.props.data.route.material ? arcDetails.layer.props.data.route.material : '',
465
+ type: arcDetails.layer.props.data.route.unit ? arcDetails.layer.props.data.route.unit : ''
466
+ };
467
+ this.createPopup(datasetForPopup);
468
+ }
469
+ }
470
+ createPopup(datasetForPopup) {
471
+ this.popup = new mapboxgl.Popup({
472
+ closeButton: false,
473
+ closeOnClick: false,
474
+ closeOnMove: true,
475
+ anchor: 'bottom-left'
476
+ });
477
+ this.popup.setLngLat(datasetForPopup.coordinate)
478
+ .setHTML(`
479
+ <div class="destination">
480
+ <div class="duration">
481
+ <p class="pickprt"><b>Pickup Location:</b> ${datasetForPopup.pickup}</p>
482
+ <p class="dropprt"><b>Drop Location:</b> ${datasetForPopup.drop}</p>
483
+ </div>
484
+ ${datasetForPopup.jobCode ? '<span><b>Job Code:</b> ' + datasetForPopup.jobCode + '</span>' : ''}
485
+ ${datasetForPopup.customer ? '<span><b>Customer:</b> ' + datasetForPopup.customer + '</span>' : ''}
486
+ <span><b>${datasetForPopup.routeType} Name:</b> ${datasetForPopup.title}</span>
487
+ <span><b>Material:</b> ${datasetForPopup.material}</span>
488
+ <span><b>Type:</b> ${datasetForPopup.type}</span>
489
+ </div>
490
+ `)
491
+ .addTo(this.map);
492
+ }
493
+ hexToRGB(hex) {
494
+ return hex.replace(/^#?([a-f\d])([a-f\d])([a-f\d])$/i, (m, r, g, b) => '#' + r + r + g + g + b + b)
495
+ .substring(1).match(/.{2}/g)
496
+ .map(x => parseInt(x, 16));
497
+ }
498
+ createMarker(routeDetails) {
499
+ var _a, _b;
500
+ if (routeDetails.origin[0] && routeDetails.origin[1] && routeDetails.destination[0] && routeDetails.destination[1]) {
501
+ const popup = new mapboxgl.Popup({ closeButton: false }).setHTML('<b>Pickup: </b>' + ((_a = routeDetails.route) === null || _a === void 0 ? void 0 : _a.pickup_location));
502
+ const popupForDestination = new mapboxgl.Popup({ closeButton: false })
503
+ .setHTML('<b>Delivery: </b>' + ((_b = routeDetails.route) === null || _b === void 0 ? void 0 : _b.delivery_location));
504
+ const el = document.createElement('div');
505
+ el.className = 'marker';
506
+ el.innerHTML = `<span class='markerPointer' style='background:${routeDetails.linecolor}'><b>P</b><span class='markerSpan' style='border-top: 10px solid ${routeDetails.linecolor}'></span></span>`;
507
+ const originMarker = new mapboxgl.Marker(el)
508
+ .setPopup(popup).setLngLat(routeDetails.origin).addTo(this.map);
509
+ originMarker.getElement().addEventListener('mouseenter', () => originMarker.togglePopup());
510
+ originMarker.getElement().addEventListener('mouseleave', () => originMarker.togglePopup());
511
+ const elementForDestination = document.createElement('div');
512
+ elementForDestination.className = 'marker';
513
+ elementForDestination.innerHTML = `<span class='markerPointer' style='background:${routeDetails.linecolor}'><b>D</b><span class='markerSpan' style='border-top: 10px solid ${routeDetails.linecolor}'></span></span>`;
514
+ const destinationMarker = new mapboxgl.Marker(elementForDestination).setPopup(popupForDestination).setLngLat(routeDetails.destination).addTo(this.map);
515
+ destinationMarker.getElement().addEventListener('mouseenter', () => destinationMarker.togglePopup());
516
+ destinationMarker.getElement().addEventListener('mouseleave', () => destinationMarker.togglePopup());
517
+ this.markerOriginList[routeDetails.index] = originMarker;
518
+ this.markerDestinationList[routeDetails.index] = destinationMarker;
519
+ const colorArray = this.hexToRGB(routeDetails.linecolor);
520
+ const arcLayer = new MapboxLayer({
521
+ id: 'arc-layer' + routeDetails.index,
522
+ type: ArcLayer,
523
+ pickable: true,
524
+ data: { route: routeDetails.route, index: routeDetails.index },
525
+ getWidth: 1,
526
+ getSourcePosition: routeDetails.origin,
527
+ getTargetPosition: routeDetails.destination,
528
+ getTargetColor: [255, 255, 255],
529
+ getSourceColor: [colorArray[0], colorArray[1], colorArray[2]],
530
+ onHover: (info, event) => this.showRoutePopup(info, event, routeDetails.isViewRoute),
531
+ });
532
+ this.map.addLayer(arcLayer);
533
+ }
534
+ }
535
+ removeRouteAndMarker(index) {
536
+ return __awaiter(this, void 0, void 0, function* () {
537
+ if (this.map) {
538
+ this.map.getLayer(`arc-layer${index}`) ? this.map.removeLayer(`arc-layer${index}`) : '';
539
+ this.map.getLayer(`line${index}`) ? this.map.removeLayer(`line${index}`) : '';
540
+ this.map.getLayer(`custom_layer${index}`) ? this.map.removeLayer(`custom_layer${index}`) : '';
541
+ this.map.getSource(`line${index}`) ? this.map.removeSource(`line${index}`) : '';
542
+ this.map.getLayer(`route-for-job-code${index}`) ? this.map.removeLayer(`route-for-job-code${index}`) : '';
543
+ this.map.getSource(`route-source-for-job-code${index}`) ? this.map.removeSource(`route-source-for-job-code${index}`) : '';
544
+ this.findMarkerBound(index);
545
+ this.markerOriginList[index] ? this.markerOriginList[index].remove() : '';
546
+ this.markerDestinationList[index] ? this.markerDestinationList[index].remove() : '';
547
+ yield true;
548
+ }
549
+ });
550
+ }
551
+ findMarkerBound(index) {
552
+ const indexOfCordinates = this.originDestinationCordinates.findIndex((x) => { var _a, _b, _c, _d; return (x[0][0].toFixed(6) == ((_b = (_a = this.markerOriginList[index]) === null || _a === void 0 ? void 0 : _a.getLngLat()) === null || _b === void 0 ? void 0 : _b.lng.toFixed(6))) && (x[0][1].toFixed(6) == ((_d = (_c = this.markerOriginList[index]) === null || _c === void 0 ? void 0 : _c.getLngLat()) === null || _d === void 0 ? void 0 : _d.lat.toFixed(6))); });
553
+ if (indexOfCordinates >= 0) {
554
+ this.originDestinationCordinates.splice(indexOfCordinates, 1);
555
+ }
556
+ }
557
+ filterRoute(ID, visibility, showAllFitbound) {
558
+ return __awaiter(this, void 0, void 0, function* () {
559
+ if (ID) {
560
+ if (this.map.getLayer(`route-for-job-code${ID}`)) {
561
+ this.map.setLayoutProperty(`route-for-job-code${ID}`, 'visibility', visibility);
562
+ const originM = this.markerOriginList[ID].getElement();
563
+ originM.style.display = ((visibility === 'visible') ? 'block' : visibility);
564
+ const destinationM = this.markerDestinationList[ID].getElement();
565
+ destinationM.style.display = ((visibility === 'visible') ? 'block' : visibility);
566
+ if (visibility === 'none' && showAllFitbound) {
567
+ this.findMarkerBound(ID);
568
+ this.extendReBound();
569
+ }
570
+ }
571
+ if (this.map.getLayer(`arc-layer${ID}`)) {
572
+ this.map.setLayoutProperty(`arc-layer${ID}`, 'visibility', visibility);
573
+ }
574
+ }
575
+ yield true;
576
+ });
577
+ }
578
+ extendBound(route, showAllFitbound) {
579
+ return new Promise((resolve, reject) => {
580
+ if (route) {
581
+ if (typeof route === 'string') {
582
+ let path = route.split(';');
583
+ path = path.map((ele) => { return ele = this.formateLatLong(ele); });
584
+ path.forEach((ele, index) => {
585
+ if (ele.length === 1)
586
+ path.splice(index, 1);
587
+ });
588
+ route = path;
589
+ }
590
+ if (route[0][0] && route[0][1] && route[route.length - 1][0] && route[route.length - 1][1]) {
591
+ this.originDestinationCordinates.push(route);
592
+ route.map((item) => {
593
+ this.bounds.extend(item);
594
+ });
595
+ }
596
+ }
597
+ if (showAllFitbound) {
598
+ const padding = { top: this.padding.top, bottom: (this.padding.bottom + (this.windowActualHeightWidth.availHeight - (window.innerHeight - 65))), left: this.padding.left, right: this.padding.right };
599
+ setTimeout(() => {
600
+ if (showAllFitbound && (Object.keys(this.bounds).length > 0))
601
+ this.map.fitBounds(this.bounds, { padding }, { fitboundComplete: true });
602
+ }, 100);
603
+ this.map.once('moveend', (event) => {
604
+ if (event.fitboundComplete) {
605
+ resolve(true);
606
+ }
607
+ });
608
+ }
609
+ });
610
+ }
611
+ extendReBound(bottom) {
612
+ return new Promise((resolve, reject) => {
613
+ this.bounds = new mapboxgl.LngLatBounds();
614
+ if (this.originDestinationCordinates.length >= 0) {
615
+ this.originDestinationCordinates.map((item, index) => {
616
+ item.map((route) => {
617
+ this.bounds.extend(route);
618
+ });
619
+ if (index === (this.originDestinationCordinates.length - 1)) {
620
+ const padding = { top: this.padding.top, bottom: (this.padding.bottom + (this.windowActualHeightWidth.availHeight - (window.innerHeight - 65))), left: this.padding.left, right: this.padding.right };
621
+ setTimeout(() => {
622
+ if (this.originDestinationCordinates.length > 0)
623
+ this.map.fitBounds(this.bounds, { padding });
624
+ }, 500);
625
+ resolve(true);
626
+ }
627
+ });
628
+ }
629
+ else {
630
+ resolve(true);
631
+ }
632
+ });
633
+ }
634
+ plotRoute(route, i, type, enablefitbound, showAllFitbound) {
635
+ return new Promise((resolve, reject) => {
636
+ let param = {};
637
+ if (['jobcode'].includes(type)) {
638
+ param['job'] = route['job_id'];
639
+ this.utils.postDataWithRestUrl('schedule/job/path', param).subscribe((res) => {
640
+ if (res['data']['route']) {
641
+ let path = res['data']['route'].split(';');
642
+ path = path.map((ele) => { return ele = this.formateLatLong(ele); });
643
+ path.forEach((ele, index) => {
644
+ if (ele.length === 1)
645
+ path.splice(index, 1);
646
+ });
647
+ route['path'] = path;
648
+ this.extendBound(route['path'], showAllFitbound);
649
+ if (route['path'] && route['path'].length > 0)
650
+ this.drawLine(route['path'], i, route, enablefitbound, type);
651
+ route['index'] = i;
652
+ }
653
+ else {
654
+ this.extendBound(null, showAllFitbound);
655
+ }
656
+ resolve(true);
657
+ }, (err) => {
658
+ if (err) {
659
+ reject(false);
660
+ }
661
+ });
662
+ }
663
+ else if (['jobrouteList', 'addroute'].includes(type)) {
664
+ if (route['path'] && route['path'].length > 0) {
665
+ let path = route['path'].split(';');
666
+ path = path.map((ele) => { return ele = this.formateLatLong(ele); });
667
+ path.forEach((ele, index) => {
668
+ if (ele.length === 1)
669
+ path.splice(index, 1);
670
+ });
671
+ this.extendBound(path, showAllFitbound);
672
+ this.drawLine(path, i, route, enablefitbound, type);
673
+ }
674
+ ;
675
+ }
676
+ });
677
+ }
678
+ clearBound() { this.bounds = new mapboxgl.LngLatBounds(); this.originDestinationCordinates = []; this.clearPadding(); }
679
+ formateLatLong(latlong) { return latlong ? latlong.split(',').map(x => +x).reverse() : null; }
680
+ clearBoundWithCordinates() {
681
+ this.bounds = new mapboxgl.LngLatBounds();
682
+ this.originDestinationCordinates = [];
683
+ }
684
+ onResize(event) {
685
+ if (!this.bounds.isEmpty()) {
686
+ this.windowActualHeightWidth.availHeight = (window.innerHeight > window.screen.availHeight) ? window.innerHeight : window.screen.availHeight;
687
+ setTimeout(() => {
688
+ this.map.fitBounds(this.bounds, { padding: { top: this.padding.top, bottom: this.padding.bottom + (this.windowActualHeightWidth.availHeight - (event.target.innerHeight - 65)), left: this.padding.left, right: this.padding.right } });
689
+ }, 500);
690
+ }
691
+ }
692
+ setWindowHeight(screen) {
693
+ this.windowActualHeightWidth.availHeight = screen;
694
+ }
695
+ setPadding(padding) { this.padding = padding; }
696
+ clearPadding() { this.padding = null; }
697
+ removeJobFromMap(data) {
698
+ data.map((ele, index) => {
699
+ const id = (ele['job_id'] ? ele['job_id'] : ele['route_id']);
700
+ this.removeRouteAndMarker(id);
701
+ if (index === (data.length - 1)) {
702
+ this.extendReBound();
703
+ }
704
+ });
705
+ }
706
+ }
707
+ CoolmapService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: CoolmapService, deps: [{ token: UtilsService }, { token: i2$1.EventManager }], target: i0.ɵɵFactoryTarget.Injectable });
708
+ CoolmapService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: CoolmapService, providedIn: 'root' });
709
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: CoolmapService, decorators: [{
710
+ type: Injectable,
711
+ args: [{ providedIn: 'root' }]
712
+ }], ctorParameters: function () { return [{ type: UtilsService }, { type: i2$1.EventManager }]; } });
713
+
714
+ class Route {
715
+ constructor() {
716
+ this.index = 0;
717
+ }
718
+ }
719
+ const EstinationData = ['estimated_distance', 'estimated_time'];
720
+ var EstinationEnum;
721
+ (function (EstinationEnum) {
722
+ EstinationEnum["estimated_distance"] = "miles";
723
+ EstinationEnum["estimated_time"] = "time";
724
+ })(EstinationEnum || (EstinationEnum = {}));
725
+ const JobCodeOverviewData = ['customer_contact', 'delivery_contact', 'pickup_location', 'delivery_location', 'project', 'unit'];
726
+ var JobCodeOverviewEnum;
727
+ (function (JobCodeOverviewEnum) {
728
+ JobCodeOverviewEnum["customer_contact"] = "Customer Contact";
729
+ JobCodeOverviewEnum["delivery_contact"] = "Delivery Contact";
730
+ JobCodeOverviewEnum["pickup_location"] = "Pickup";
731
+ JobCodeOverviewEnum["delivery_location"] = "Delivery";
732
+ JobCodeOverviewEnum["project"] = "Project Name";
733
+ JobCodeOverviewEnum["unit"] = "Job Type";
734
+ })(JobCodeOverviewEnum || (JobCodeOverviewEnum = {}));
735
+ const DriversmsCardKey = ['order_number', 'date', 'values', 'material', 'unit', 'pickup_location', 'delivery_location'];
736
+ var DriverSmsCardEnum;
737
+ (function (DriverSmsCardEnum) {
738
+ DriverSmsCardEnum["order_number"] = "Jobcode";
739
+ DriverSmsCardEnum["date"] = "Date";
740
+ DriverSmsCardEnum["values"] = "Total tasks";
741
+ DriverSmsCardEnum["material"] = "Material";
742
+ DriverSmsCardEnum["unit"] = "Unit";
743
+ DriverSmsCardEnum["pickup_location"] = "Pickup Address";
744
+ DriverSmsCardEnum["delivery_location"] = "Delivery Address";
745
+ })(DriverSmsCardEnum || (DriverSmsCardEnum = {}));
746
+ class PopupData {
747
+ }
748
+
749
+ /*
750
+ * Public API Surface of coolmap-services
751
+ */
752
+
753
+ /**
754
+ * Generated bundle index. Do not edit.
755
+ */
756
+
757
+ export { CoolmapService, CoolmapServicesComponent, CoolmapServicesModule, CoolmapServicesService, DriverSmsCardEnum, DriversmsCardKey, EstinationData, EstinationEnum, JobCodeOverviewData, JobCodeOverviewEnum, PopupData, Route, UtilsService };
758
+ //# sourceMappingURL=aggdirect-coolmap-services.mjs.map