datastake-daf 0.6.837 → 0.6.838

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.
@@ -2307,6 +2307,8 @@ const useWidgetFetch = ({
2307
2307
  } = config;
2308
2308
  const [data, setData] = React.useState(defaultData || {});
2309
2309
  const [loading, setLoading] = React.useState(false);
2310
+ const [initFetchDone, setInitFetchDone] = React.useState(false);
2311
+ const isMounted = React.useRef(true);
2310
2312
  const fetchData = async () => {
2311
2313
  if (stop) {
2312
2314
  return;
@@ -2316,6 +2318,7 @@ const useWidgetFetch = ({
2316
2318
  const {
2317
2319
  data
2318
2320
  } = await getData(rest);
2321
+ if (!isMounted.current) return;
2319
2322
  setData(data || defaultData);
2320
2323
  if (isErrorResponse(data)) {
2321
2324
  const errorMessage = getErrorMessage(data);
@@ -2323,18 +2326,28 @@ const useWidgetFetch = ({
2323
2326
  return;
2324
2327
  }
2325
2328
  onFetch();
2329
+ setInitFetchDone(true);
2326
2330
  } catch (err) {
2327
2331
  console.log(err);
2328
2332
  }
2329
- setLoading(false);
2333
+ if (isMounted.current) {
2334
+ setLoading(false);
2335
+ }
2330
2336
  };
2337
+ React.useEffect(() => {
2338
+ isMounted.current = true;
2339
+ return () => {
2340
+ isMounted.current = false;
2341
+ };
2342
+ }, []);
2331
2343
  React.useEffect(() => {
2332
2344
  fetchData();
2333
- }, [JSON.stringify(rest?.filters)]);
2345
+ }, [JSON.stringify(config)]);
2334
2346
  return {
2335
2347
  data,
2336
2348
  loading,
2337
- setData
2349
+ setData,
2350
+ initFetchDone
2338
2351
  };
2339
2352
  };
2340
2353
 
@@ -7506,6 +7506,8 @@ const useWidgetFetch = ({
7506
7506
  } = config;
7507
7507
  const [data, setData] = React.useState(defaultData || {});
7508
7508
  const [loading, setLoading] = React.useState(false);
7509
+ const [initFetchDone, setInitFetchDone] = React.useState(false);
7510
+ const isMounted = React.useRef(true);
7509
7511
  const fetchData = async () => {
7510
7512
  if (stop) {
7511
7513
  return;
@@ -7515,6 +7517,7 @@ const useWidgetFetch = ({
7515
7517
  const {
7516
7518
  data
7517
7519
  } = await getData(rest);
7520
+ if (!isMounted.current) return;
7518
7521
  setData(data || defaultData);
7519
7522
  if (isErrorResponse(data)) {
7520
7523
  const errorMessage = getErrorMessage(data);
@@ -7522,18 +7525,28 @@ const useWidgetFetch = ({
7522
7525
  return;
7523
7526
  }
7524
7527
  onFetch();
7528
+ setInitFetchDone(true);
7525
7529
  } catch (err) {
7526
7530
  console.log(err);
7527
7531
  }
7528
- setLoading(false);
7532
+ if (isMounted.current) {
7533
+ setLoading(false);
7534
+ }
7529
7535
  };
7536
+ React.useEffect(() => {
7537
+ isMounted.current = true;
7538
+ return () => {
7539
+ isMounted.current = false;
7540
+ };
7541
+ }, []);
7530
7542
  React.useEffect(() => {
7531
7543
  fetchData();
7532
- }, [JSON.stringify(rest?.filters)]);
7544
+ }, [JSON.stringify(config)]);
7533
7545
  return {
7534
7546
  data,
7535
7547
  loading,
7536
- setData
7548
+ setData,
7549
+ initFetchDone
7537
7550
  };
7538
7551
  };
7539
7552
 
@@ -55561,7 +55574,7 @@ const PlantingLocations = ({
55561
55574
  return eventsWithGPS.map((event, index) => {
55562
55575
  const locationCheckArrival = event.locationCheckArrival;
55563
55576
  const matchingLocation = locations.find(location => locationCheckArrival.name === location.name || locationCheckArrival._id === location.id || location.id === locationCheckArrival._id) || locations[0];
55564
- const area = matchingLocation?.perimeter ? matchingLocation.perimeter.map(coord => Array.isArray(coord) && coord.length >= 2 ? [coord[1], coord[0]] : coord) : null;
55577
+ const area = matchingLocation?.perimeter ? matchingLocation.perimeter.map(coord => Array.isArray(coord) && coord.length >= 2 ? [coord[0], coord[1]] : coord) : null;
55565
55578
 
55566
55579
  // Only include area if it has at least 3 valid coordinates
55567
55580
  const validArea = area && Array.isArray(area) && area.length >= 3 ? area : null;
@@ -0,0 +1,330 @@
1
+ /* Isolated Mapbox GL CSS - Scoped to prevent Leaflet conflicts */
2
+
3
+ /* Mapbox GL Core Styles - Scoped with .mapbox-gl-scope */
4
+ .mapbox-gl-scope .mapboxgl-map {
5
+ font: 12px/20px Helvetica Neue, Arial, Helvetica, sans-serif;
6
+ overflow: hidden;
7
+ position: relative;
8
+ -webkit-tap-highlight-color: rgb(0 0 0/0);
9
+ }
10
+
11
+ .mapbox-gl-scope .mapboxgl-canvas {
12
+ left: 0;
13
+ position: absolute;
14
+ top: 0;
15
+ }
16
+
17
+ .mapbox-gl-scope .mapboxgl-map:-webkit-full-screen {
18
+ height: 100%;
19
+ width: 100%;
20
+ }
21
+
22
+ .mapbox-gl-scope .mapboxgl-canary {
23
+ background-color: salmon;
24
+ }
25
+
26
+ .mapbox-gl-scope .mapboxgl-canvas-container.mapboxgl-interactive,
27
+ .mapbox-gl-scope .mapboxgl-ctrl-group button.mapboxgl-ctrl-compass {
28
+ cursor: grab;
29
+ -webkit-user-select: none;
30
+ user-select: none;
31
+ }
32
+
33
+ .mapbox-gl-scope .mapboxgl-canvas-container.mapboxgl-interactive.mapboxgl-track-pointer {
34
+ cursor: pointer;
35
+ }
36
+
37
+ .mapbox-gl-scope .mapboxgl-canvas-container.mapboxgl-interactive:active,
38
+ .mapbox-gl-scope .mapboxgl-ctrl-group button.mapboxgl-ctrl-compass:active {
39
+ cursor: grabbing;
40
+ }
41
+
42
+ .mapbox-gl-scope .mapboxgl-canvas-container.mapboxgl-touch-zoom-rotate,
43
+ .mapbox-gl-scope .mapboxgl-canvas-container.mapboxgl-touch-zoom-rotate .mapboxgl-canvas {
44
+ touch-action: pan-x pan-y;
45
+ }
46
+
47
+ .mapbox-gl-scope .mapboxgl-canvas-container.mapboxgl-touch-drag-pan,
48
+ .mapbox-gl-scope .mapboxgl-canvas-container.mapboxgl-touch-drag-pan .mapboxgl-canvas {
49
+ touch-action: pinch-zoom;
50
+ }
51
+
52
+ .mapbox-gl-scope .mapboxgl-canvas-container.mapboxgl-touch-zoom-rotate.mapboxgl-touch-drag-pan,
53
+ .mapbox-gl-scope .mapboxgl-canvas-container.mapboxgl-touch-zoom-rotate.mapboxgl-touch-drag-pan .mapboxgl-canvas {
54
+ touch-action: none;
55
+ }
56
+
57
+ /* Control positioning */
58
+ .mapbox-gl-scope .mapboxgl-ctrl-bottom,
59
+ .mapbox-gl-scope .mapboxgl-ctrl-bottom-left,
60
+ .mapbox-gl-scope .mapboxgl-ctrl-bottom-right,
61
+ .mapbox-gl-scope .mapboxgl-ctrl-left,
62
+ .mapbox-gl-scope .mapboxgl-ctrl-right,
63
+ .mapbox-gl-scope .mapboxgl-ctrl-top,
64
+ .mapbox-gl-scope .mapboxgl-ctrl-top-left,
65
+ .mapbox-gl-scope .mapboxgl-ctrl-top-right {
66
+ pointer-events: none;
67
+ position: absolute;
68
+ z-index: 2;
69
+ }
70
+
71
+ .mapbox-gl-scope .mapboxgl-ctrl-top-left {
72
+ left: 0;
73
+ top: 0;
74
+ }
75
+
76
+ .mapbox-gl-scope .mapboxgl-ctrl-top {
77
+ left: 50%;
78
+ top: 0;
79
+ transform: translateX(-50%);
80
+ }
81
+
82
+ .mapbox-gl-scope .mapboxgl-ctrl-top-right {
83
+ right: 0;
84
+ top: 0;
85
+ }
86
+
87
+ .mapbox-gl-scope .mapboxgl-ctrl-right {
88
+ right: 0;
89
+ top: 50%;
90
+ transform: translateY(-50%);
91
+ }
92
+
93
+ .mapbox-gl-scope .mapboxgl-ctrl-bottom-right {
94
+ bottom: 0;
95
+ right: 0;
96
+ }
97
+
98
+ .mapbox-gl-scope .mapboxgl-ctrl-bottom {
99
+ bottom: 0;
100
+ left: 50%;
101
+ transform: translateX(-50%);
102
+ }
103
+
104
+ .mapbox-gl-scope .mapboxgl-ctrl-bottom-left {
105
+ bottom: 0;
106
+ left: 0;
107
+ }
108
+
109
+ .mapbox-gl-scope .mapboxgl-ctrl-left {
110
+ left: 0;
111
+ top: 50%;
112
+ transform: translateY(-50%);
113
+ }
114
+
115
+ .mapbox-gl-scope .mapboxgl-ctrl {
116
+ clear: both;
117
+ pointer-events: auto;
118
+ transform: translate(0);
119
+ }
120
+
121
+ .mapbox-gl-scope .mapboxgl-ctrl-top-left .mapboxgl-ctrl {
122
+ float: left;
123
+ margin: 10px 0 0 10px;
124
+ }
125
+
126
+ .mapbox-gl-scope .mapboxgl-ctrl-top .mapboxgl-ctrl {
127
+ float: left;
128
+ margin: 10px 0;
129
+ }
130
+
131
+ .mapbox-gl-scope .mapboxgl-ctrl-top-right .mapboxgl-ctrl {
132
+ float: right;
133
+ margin: 10px 10px 0 0;
134
+ }
135
+
136
+ .mapbox-gl-scope .mapboxgl-ctrl-bottom-right .mapboxgl-ctrl,
137
+ .mapbox-gl-scope .mapboxgl-ctrl-right .mapboxgl-ctrl {
138
+ float: right;
139
+ margin: 0 10px 10px 0;
140
+ }
141
+
142
+ .mapbox-gl-scope .mapboxgl-ctrl-bottom .mapboxgl-ctrl {
143
+ float: left;
144
+ margin: 10px 0;
145
+ }
146
+
147
+ .mapbox-gl-scope .mapboxgl-ctrl-bottom-left .mapboxgl-ctrl,
148
+ .mapbox-gl-scope .mapboxgl-ctrl-left .mapboxgl-ctrl {
149
+ float: left;
150
+ margin: 0 0 10px 10px;
151
+ }
152
+
153
+ /* Control group styling */
154
+ .mapbox-gl-scope .mapboxgl-ctrl-group {
155
+ background: #fff;
156
+ border-radius: 4px;
157
+ }
158
+
159
+ .mapbox-gl-scope .mapboxgl-ctrl-group:not(:empty) {
160
+ box-shadow: 0 0 0 2px #0000001a;
161
+ }
162
+
163
+ .mapbox-gl-scope .mapboxgl-ctrl-group button {
164
+ background-color: initial;
165
+ border: 0;
166
+ box-sizing: border-box;
167
+ cursor: pointer;
168
+ display: block;
169
+ height: 29px;
170
+ outline: none;
171
+ overflow: hidden;
172
+ padding: 0;
173
+ width: 29px;
174
+ }
175
+
176
+ .mapbox-gl-scope .mapboxgl-ctrl-group button+button {
177
+ border-top: 1px solid #ddd;
178
+ }
179
+
180
+ .mapbox-gl-scope .mapboxgl-ctrl button .mapboxgl-ctrl-icon {
181
+ background-position: 50%;
182
+ background-repeat: no-repeat;
183
+ display: block;
184
+ height: 100%;
185
+ width: 100%;
186
+ }
187
+
188
+ .mapbox-gl-scope .mapboxgl-ctrl-attrib-button:focus,
189
+ .mapbox-gl-scope .mapboxgl-ctrl-group button:focus {
190
+ box-shadow: 0 0 2px 2px #0096ff;
191
+ }
192
+
193
+ .mapbox-gl-scope .mapboxgl-ctrl button:disabled {
194
+ cursor: not-allowed;
195
+ }
196
+
197
+ .mapbox-gl-scope .mapboxgl-ctrl button:disabled .mapboxgl-ctrl-icon {
198
+ opacity: .25;
199
+ }
200
+
201
+ .mapbox-gl-scope .mapboxgl-ctrl-group button:first-child {
202
+ border-radius: 4px 4px 0 0;
203
+ }
204
+
205
+ .mapbox-gl-scope .mapboxgl-ctrl-group button:last-child {
206
+ border-radius: 0 0 4px 4px;
207
+ }
208
+
209
+ .mapbox-gl-scope .mapboxgl-ctrl-group button:only-child {
210
+ border-radius: inherit;
211
+ }
212
+
213
+ .mapbox-gl-scope .mapboxgl-ctrl button:not(:disabled):hover {
214
+ background-color: #0000000d;
215
+ }
216
+
217
+ /* Marker styles */
218
+ .mapbox-gl-scope .mapboxgl-marker {
219
+ position: absolute;
220
+ z-index: 1;
221
+ }
222
+
223
+ .mapbox-gl-scope .mapboxgl-marker svg {
224
+ display: block;
225
+ }
226
+
227
+ /* Popup styles */
228
+ .mapbox-gl-scope .mapboxgl-popup {
229
+ position: absolute;
230
+ text-align: center;
231
+ margin-bottom: 20px;
232
+ }
233
+
234
+ .mapbox-gl-scope .mapboxgl-popup-content-wrapper {
235
+ padding: 1px;
236
+ text-align: left;
237
+ border-radius: 12px;
238
+ }
239
+
240
+ .mapbox-gl-scope .mapboxgl-popup-content {
241
+ margin: 13px 24px 13px 20px;
242
+ line-height: 1.3;
243
+ font-size: 13px;
244
+ min-height: 1px;
245
+ }
246
+
247
+ .mapbox-gl-scope .mapboxgl-popup-content p {
248
+ margin: 17px 0;
249
+ }
250
+
251
+ .mapbox-gl-scope .mapboxgl-popup-tip-container {
252
+ width: 40px;
253
+ height: 20px;
254
+ position: absolute;
255
+ left: 50%;
256
+ margin-top: -1px;
257
+ margin-left: -20px;
258
+ overflow: hidden;
259
+ pointer-events: none;
260
+ }
261
+
262
+ .mapbox-gl-scope .mapboxgl-popup-tip {
263
+ width: 17px;
264
+ height: 17px;
265
+ padding: 1px;
266
+ margin: -10px auto 0;
267
+ pointer-events: auto;
268
+ -webkit-transform: rotate(45deg);
269
+ -moz-transform: rotate(45deg);
270
+ -ms-transform: rotate(45deg);
271
+ transform: rotate(45deg);
272
+ }
273
+
274
+ .mapbox-gl-scope .mapboxgl-popup-content-wrapper,
275
+ .mapbox-gl-scope .mapboxgl-popup-tip {
276
+ background: white;
277
+ color: #333;
278
+ box-shadow: 0 3px 14px rgba(0, 0, 0, 0.4);
279
+ }
280
+
281
+ .mapbox-gl-scope .mapboxgl-popup-close-button {
282
+ position: absolute;
283
+ top: 0;
284
+ right: 0;
285
+ border: none;
286
+ text-align: center;
287
+ width: 24px;
288
+ height: 24px;
289
+ font: 16px/24px Tahoma, Verdana, sans-serif;
290
+ color: #757575;
291
+ text-decoration: none;
292
+ background: transparent;
293
+ }
294
+
295
+ .mapbox-gl-scope .mapboxgl-popup-close-button:hover,
296
+ .mapbox-gl-scope .mapboxgl-popup-close-button:focus {
297
+ color: #585858;
298
+ }
299
+
300
+ /* Attribution */
301
+ .mapbox-gl-scope .mapboxgl-ctrl-attribution {
302
+ background: #fff;
303
+ background: rgba(255, 255, 255, 0.8);
304
+ margin: 0;
305
+ }
306
+
307
+ .mapbox-gl-scope .mapboxgl-ctrl-attribution,
308
+ .mapbox-gl-scope .mapboxgl-ctrl-scale-line {
309
+ padding: 0 5px;
310
+ color: #333;
311
+ line-height: 1.4;
312
+ }
313
+
314
+ .mapbox-gl-scope .mapboxgl-ctrl-attribution a {
315
+ text-decoration: none;
316
+ }
317
+
318
+ .mapbox-gl-scope .mapboxgl-ctrl-attribution a:hover,
319
+ .mapbox-gl-scope .mapboxgl-ctrl-attribution a:focus {
320
+ text-decoration: underline;
321
+ }
322
+
323
+ /* Hide attribution by default */
324
+ .mapbox-gl-scope .mapboxgl-ctrl-attribution {
325
+ display: none !important;
326
+ }
327
+
328
+ .mapbox-gl-scope .mapboxgl-ctrl-logo {
329
+ display: none !important;
330
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "datastake-daf",
3
- "version": "0.6.837",
3
+ "version": "0.6.838",
4
4
  "dependencies": {
5
5
  "@ant-design/icons": "^5.2.5",
6
6
  "@antv/g2": "^5.1.1",
@@ -1,4 +1,4 @@
1
- import { useState, useEffect } from "react";
1
+ import { useState, useEffect, useRef } from "react";
2
2
  import DashboardService from "../services/DashboardService.js";
3
3
  import { isErrorResponse, getErrorMessage } from "../../helpers/errorHandling.js";
4
4
  import { message } from "antd";
@@ -15,7 +15,8 @@ export const useWidgetFetch = ({config, getData = DashboardService.getWidget, on
15
15
  const { stop, defaultData, ...rest} = config;
16
16
  const [ data, setData ] = useState(defaultData || {});
17
17
  const [ loading, setLoading ] = useState(false);
18
-
18
+ const [ initFetchDone, setInitFetchDone ] = useState(false);
19
+ const isMounted = useRef(true);
19
20
 
20
21
  const fetchData = async () => {
21
22
  if (stop) {
@@ -26,27 +27,39 @@ export const useWidgetFetch = ({config, getData = DashboardService.getWidget, on
26
27
 
27
28
  try {
28
29
  const { data } = await getData(rest);
30
+ if (!isMounted.current) return;
29
31
  setData(data || defaultData);
30
32
  if (isErrorResponse(data)) {
31
33
  const errorMessage = getErrorMessage(data);
32
34
  message.error(errorMessage);
33
35
  return;
34
36
  }
35
- onFetch()
37
+ onFetch();
38
+ setInitFetchDone(true);
36
39
  } catch (err) {
37
40
  console.log(err);
38
41
  }
39
42
 
40
- setLoading(false);
43
+ if (isMounted.current) {
44
+ setLoading(false);
45
+ }
41
46
  };
42
47
 
43
48
  useEffect(() => {
44
- fetchData();
45
- }, [JSON.stringify(rest?.filters)]);
49
+ isMounted.current = true;
50
+ return () => {
51
+ isMounted.current = false;
52
+ };
53
+ }, []);
54
+
55
+ useEffect(() => {
56
+ fetchData();
57
+ }, [JSON.stringify(config)]);
46
58
 
47
59
  return {
48
60
  data,
49
61
  loading,
50
- setData
62
+ setData,
63
+ initFetchDone
51
64
  }
52
65
  }
@@ -64,11 +64,11 @@ const PlantingLocations = ({
64
64
  ) || locations[0];
65
65
 
66
66
 
67
- const area = matchingLocation?.perimeter ? matchingLocation.perimeter.map(coord =>
68
- Array.isArray(coord) && coord.length >= 2
69
- ? [coord[1], coord[0]]
70
- : coord
71
- ) : null;
67
+ const area = matchingLocation?.perimeter ? matchingLocation.perimeter.map(coord =>
68
+ Array.isArray(coord) && coord.length >= 2
69
+ ? [coord[0], coord[1]]
70
+ : coord
71
+ ) : null;
72
72
 
73
73
  // Only include area if it has at least 3 valid coordinates
74
74
  const validArea = area && Array.isArray(area) && area.length >= 3 ? area : null;