@opengeoweb/taf 1.2.3 → 2.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/taf.esm.js CHANGED
@@ -3,122 +3,175 @@ import React__default from 'react';
3
3
  import { makeStyles, Grid, TextField, IconButton, Tooltip, Chip, SvgIcon, Typography, Button, Dialog, DialogTitle, DialogContent, Card, Accordion, AccordionSummary, AccordionDetails, Backdrop, CircularProgress } from '@material-ui/core';
4
4
  import { Skeleton } from '@material-ui/lab';
5
5
  import moment from 'moment';
6
- import { useDraftFormHelpers, ToolContainerDraggable, useConfirmationDialog, useIsMounted, usePreventBrowserClose, StatusTag, AlertBanner, ConfirmationServiceProvider, usePoller, isAxiosError, getAxiosErrorMessage } from '@opengeoweb/shared';
6
+ import { useIsMounted, useDraftFormHelpers, ToolContainerDraggable, useConfirmationDialog, usePreventBrowserClose, usePrevious, StatusTag, AlertBanner, ConfirmationServiceProvider, usePoller, isAxiosError, getAxiosErrorMessage } from '@opengeoweb/shared';
7
7
  import { Delete, DragIndicator, Add, Close, InfoOutlined, Create, CheckCircle, Schedule, OpenInNew, ExpandMore } from '@material-ui/icons';
8
8
  import { useApiContext, useApi, createApiInstance } from '@opengeoweb/api';
9
9
  import { getDeepProperty, ReactHookFormHiddenInput, ReactHookFormProvider } from '@opengeoweb/form-fields';
10
10
  import { useFormContext, Controller, useFieldArray } from 'react-hook-form';
11
11
  import { ReactSortable, Sortable } from 'react-sortablejs';
12
12
 
13
- /*! *****************************************************************************
14
- Copyright (c) Microsoft Corporation.
15
-
16
- Permission to use, copy, modify, and/or distribute this software for any
17
- purpose with or without fee is hereby granted.
18
-
19
- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
20
- REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
21
- AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
22
- INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
23
- LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
24
- OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
25
- PERFORMANCE OF THIS SOFTWARE.
26
- ***************************************************************************** */
27
-
28
- var __assign = function() {
29
- __assign = Object.assign || function __assign(t) {
30
- for (var s, i = 1, n = arguments.length; i < n; i++) {
31
- s = arguments[i];
32
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
33
- }
34
- return t;
35
- };
36
- return __assign.apply(this, arguments);
37
- };
38
-
39
- function __rest(s, e) {
40
- var t = {};
41
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
42
- t[p] = s[p];
43
- if (s != null && typeof Object.getOwnPropertySymbols === "function")
44
- for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
45
- if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
46
- t[p[i]] = s[p[i]];
47
- }
48
- return t;
49
- }
50
-
51
- function __awaiter(thisArg, _arguments, P, generator) {
52
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
53
- return new (P || (P = Promise))(function (resolve, reject) {
54
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
55
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
56
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
57
- step((generator = generator.apply(thisArg, _arguments || [])).next());
58
- });
59
- }
60
-
61
- function __generator(thisArg, body) {
62
- var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
63
- return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
64
- function verb(n) { return function (v) { return step([n, v]); }; }
65
- function step(op) {
66
- if (f) throw new TypeError("Generator is already executing.");
67
- while (_) try {
68
- if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
69
- if (y = 0, t) op = [op[0] & 2, t.value];
70
- switch (op[0]) {
71
- case 0: case 1: t = op; break;
72
- case 4: _.label++; return { value: op[1], done: false };
73
- case 5: _.label++; y = op[1]; op = [0]; continue;
74
- case 7: op = _.ops.pop(); _.trys.pop(); continue;
75
- default:
76
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
77
- if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
78
- if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
79
- if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
80
- if (t[2]) _.ops.pop();
81
- _.trys.pop(); continue;
82
- }
83
- op = body.call(thisArg, _);
84
- } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
85
- if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
86
- }
87
- }
88
-
89
- function __values(o) {
90
- var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
91
- if (m) return m.call(o);
92
- if (o && typeof o.length === "number") return {
93
- next: function () {
94
- if (o && i >= o.length) o = void 0;
95
- return { value: o && o[i++], done: !o };
96
- }
97
- };
98
- throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
99
- }
100
-
101
- function __read(o, n) {
102
- var m = typeof Symbol === "function" && o[Symbol.iterator];
103
- if (!m) return o;
104
- var i = m.call(o), r, ar = [], e;
105
- try {
106
- while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
107
- }
108
- catch (error) { e = { error: error }; }
109
- finally {
110
- try {
111
- if (r && !r.done && (m = i["return"])) m.call(i);
112
- }
113
- finally { if (e) throw e.error; }
114
- }
115
- return ar;
116
- }
117
-
118
- function __spreadArray(to, from) {
119
- for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)
120
- to[j] = from[i];
121
- return to;
13
+ function _typeof(obj) {
14
+ "@babel/helpers - typeof";
15
+
16
+ if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") {
17
+ _typeof = function (obj) {
18
+ return typeof obj;
19
+ };
20
+ } else {
21
+ _typeof = function (obj) {
22
+ return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
23
+ };
24
+ }
25
+
26
+ return _typeof(obj);
27
+ }
28
+
29
+ function _defineProperty(obj, key, value) {
30
+ if (key in obj) {
31
+ Object.defineProperty(obj, key, {
32
+ value: value,
33
+ enumerable: true,
34
+ configurable: true,
35
+ writable: true
36
+ });
37
+ } else {
38
+ obj[key] = value;
39
+ }
40
+
41
+ return obj;
42
+ }
43
+
44
+ function _slicedToArray(arr, i) {
45
+ return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();
46
+ }
47
+
48
+ function _toArray(arr) {
49
+ return _arrayWithHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableRest();
50
+ }
51
+
52
+ function _toConsumableArray(arr) {
53
+ return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();
54
+ }
55
+
56
+ function _arrayWithoutHoles(arr) {
57
+ if (Array.isArray(arr)) return _arrayLikeToArray(arr);
58
+ }
59
+
60
+ function _arrayWithHoles(arr) {
61
+ if (Array.isArray(arr)) return arr;
62
+ }
63
+
64
+ function _iterableToArray(iter) {
65
+ if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter);
66
+ }
67
+
68
+ function _iterableToArrayLimit(arr, i) {
69
+ if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return;
70
+ var _arr = [];
71
+ var _n = true;
72
+ var _d = false;
73
+ var _e = undefined;
74
+
75
+ try {
76
+ for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {
77
+ _arr.push(_s.value);
78
+
79
+ if (i && _arr.length === i) break;
80
+ }
81
+ } catch (err) {
82
+ _d = true;
83
+ _e = err;
84
+ } finally {
85
+ try {
86
+ if (!_n && _i["return"] != null) _i["return"]();
87
+ } finally {
88
+ if (_d) throw _e;
89
+ }
90
+ }
91
+
92
+ return _arr;
93
+ }
94
+
95
+ function _unsupportedIterableToArray(o, minLen) {
96
+ if (!o) return;
97
+ if (typeof o === "string") return _arrayLikeToArray(o, minLen);
98
+ var n = Object.prototype.toString.call(o).slice(8, -1);
99
+ if (n === "Object" && o.constructor) n = o.constructor.name;
100
+ if (n === "Map" || n === "Set") return Array.from(o);
101
+ if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
102
+ }
103
+
104
+ function _arrayLikeToArray(arr, len) {
105
+ if (len == null || len > arr.length) len = arr.length;
106
+
107
+ for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];
108
+
109
+ return arr2;
110
+ }
111
+
112
+ function _nonIterableSpread() {
113
+ throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
114
+ }
115
+
116
+ function _nonIterableRest() {
117
+ throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
118
+ }
119
+
120
+ function _createForOfIteratorHelper(o, allowArrayLike) {
121
+ var it;
122
+
123
+ if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) {
124
+ if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") {
125
+ if (it) o = it;
126
+ var i = 0;
127
+
128
+ var F = function () {};
129
+
130
+ return {
131
+ s: F,
132
+ n: function () {
133
+ if (i >= o.length) return {
134
+ done: true
135
+ };
136
+ return {
137
+ done: false,
138
+ value: o[i++]
139
+ };
140
+ },
141
+ e: function (e) {
142
+ throw e;
143
+ },
144
+ f: F
145
+ };
146
+ }
147
+
148
+ throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
149
+ }
150
+
151
+ var normalCompletion = true,
152
+ didErr = false,
153
+ err;
154
+ return {
155
+ s: function () {
156
+ it = o[Symbol.iterator]();
157
+ },
158
+ n: function () {
159
+ var step = it.next();
160
+ normalCompletion = step.done;
161
+ return step;
162
+ },
163
+ e: function (e) {
164
+ didErr = true;
165
+ err = e;
166
+ },
167
+ f: function () {
168
+ try {
169
+ if (!normalCompletion && it.return != null) it.return();
170
+ } finally {
171
+ if (didErr) throw err;
172
+ }
173
+ }
174
+ };
122
175
  }
123
176
 
124
177
  /* *
@@ -177,20 +230,41 @@ var tafConfig = {
177
230
  locations: locations
178
231
  };
179
232
 
180
- function _typeof(obj) {
181
- "@babel/helpers - typeof";
182
-
183
- if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") {
184
- _typeof = function (obj) {
185
- return typeof obj;
186
- };
187
- } else {
188
- _typeof = function (obj) {
189
- return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
190
- };
191
- }
192
-
193
- return _typeof(obj);
233
+ /*! *****************************************************************************
234
+ Copyright (c) Microsoft Corporation.
235
+
236
+ Permission to use, copy, modify, and/or distribute this software for any
237
+ purpose with or without fee is hereby granted.
238
+
239
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
240
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
241
+ AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
242
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
243
+ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
244
+ OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
245
+ PERFORMANCE OF THIS SOFTWARE.
246
+ ***************************************************************************** */
247
+
248
+ function __rest(s, e) {
249
+ var t = {};
250
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
251
+ t[p] = s[p];
252
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
253
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
254
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
255
+ t[p[i]] = s[p[i]];
256
+ }
257
+ return t;
258
+ }
259
+
260
+ function __awaiter(thisArg, _arguments, P, generator) {
261
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
262
+ return new (P || (P = Promise))(function (resolve, reject) {
263
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
264
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
265
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
266
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
267
+ });
194
268
  }
195
269
 
196
270
  /* *
@@ -209,19 +283,21 @@ function _typeof(obj) {
209
283
  * Copyright 2021 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
210
284
  * Copyright 2021 - Finnish Meteorological Institute (FMI)
211
285
  * */
286
+ var FORMAT_DAYS_HOURS = 'DDHH';
287
+ var FORMAT_DAYS_HOURS_MINUTS = 'DDHHmm'; // formatters
212
288
 
213
289
  var formatValidToString = function formatValidToString(valid) {
214
290
  // Ensure end of valid period if midnight is shown as 24 and not 00
215
291
  var endHours = moment.utc(valid.end).format('kk');
216
292
  var endDate = endHours === '24' ? moment.utc(valid.end).add(-1, 'day').format('DD') : moment.utc(valid.end).format('DD');
217
- return valid.end ? moment.utc(valid.start).format('DDHH') + "/" + endDate + endHours : moment.utc(valid.start).format('DDHHmm');
293
+ return valid.end ? "".concat(moment.utc(valid.start).format(FORMAT_DAYS_HOURS), "/").concat(endDate).concat(endHours) : moment.utc(valid.start).format(FORMAT_DAYS_HOURS_MINUTS);
218
294
  };
219
295
 
220
296
  var getSections = function getSections(value, format) {
221
297
  return {
222
298
  day: parseInt(value.substring(0, 2), 10),
223
299
  hour: parseInt(value.substring(2, 4), 10),
224
- min: format === 'DDHHmm' ? parseInt(value.substring(4), 10) : 0
300
+ min: format === FORMAT_DAYS_HOURS_MINUTS ? parseInt(value.substring(4), 10) : 0
225
301
  };
226
302
  };
227
303
 
@@ -251,7 +327,7 @@ var parseValidToObject = function parseValidToObject(value, tafStart, tafEnd) {
251
327
  var tafStartMoment = moment.utc(tafStart);
252
328
  var tafEndMoment = moment.utc(tafEnd);
253
329
  var startEnd = trimmedValue.split('/');
254
- var format = trimmedValue.indexOf('/') === -1 ? 'DDHHmm' : 'DDHH';
330
+ var format = trimmedValue.indexOf('/') === -1 ? FORMAT_DAYS_HOURS_MINUTS : FORMAT_DAYS_HOURS;
255
331
  var startSections = getSections(startEnd[0], format);
256
332
  var start = getValidityTimeStamp('start', startSections, tafStartMoment, tafEndMoment).format('YYYY-MM-DDTHH:mm:ss[Z]'); // If we only have start value - return that otherwise, also get end time
257
333
 
@@ -261,7 +337,7 @@ var parseValidToObject = function parseValidToObject(value, tafStart, tafEnd) {
261
337
  };
262
338
  }
263
339
 
264
- var endSections = getSections(startEnd[1], 'DDHH');
340
+ var endSections = getSections(startEnd[1], FORMAT_DAYS_HOURS);
265
341
  var end = getValidityTimeStamp('end', endSections, tafStartMoment, tafEndMoment).format('YYYY-MM-DDTHH:mm:ss[Z]');
266
342
  return {
267
343
  start: start,
@@ -275,7 +351,6 @@ var invalidValidityMinutesMessage = 'Invalid validity period, specified minutes
275
351
  var invalidValidityStartTimeMessage = 'Invalid validity start time, change group validity must lie within the TAF validity period';
276
352
  var invalidValidityPeriodMessage = 'Invalid validity period, validity end time has to be after validity start time';
277
353
  var invalidValidityEndTimeMessage = 'Invalid validity end time, change group validity must lie within the TAF validity period';
278
- var invalidValidityLengthMessage = 'Invalid validity period, expected either DDHH/DDHH or DDHHmm';
279
354
  var invalidChangeValidInterFieldMessage = 'Invalid validity period, expected DDHH/DDHH for BECMG and TEMPO or DDHHmm for FM';
280
355
  var invalidBECMGDurationValidInterFieldMessage = 'Invalid validity period, for BECMG only validity periods with a duration of 1, 2, 3 or 4 hours are allowed'; // Validations
281
356
  // Ensure all individual sections are correct (DD HH mm etc)
@@ -301,7 +376,7 @@ var validateIsValidDates = function validateIsValidDates(value, tafStart, tafEnd
301
376
  var tafStartMoment = moment.utc(tafStart);
302
377
  var tafEndMoment = moment.utc(tafEnd);
303
378
  var startEnd = value.split('/');
304
- var format = value.indexOf('/') === -1 ? 'DDHHmm' : 'DDHH';
379
+ var format = value.indexOf('/') === -1 ? FORMAT_DAYS_HOURS_MINUTS : FORMAT_DAYS_HOURS;
305
380
  var validateMsg = []; // Validate start time
306
381
 
307
382
  var startSections = getSections(startEnd[0], format); // Validate individual sections for start
@@ -317,7 +392,7 @@ var validateIsValidDates = function validateIsValidDates(value, tafStart, tafEnd
317
392
 
318
393
 
319
394
  if (startEnd.length > 1) {
320
- var endSections = getSections(startEnd[1], 'DDHH'); // Validate individual sections for end
395
+ var endSections = getSections(startEnd[1], FORMAT_DAYS_HOURS); // Validate individual sections for end
321
396
 
322
397
  var sectionValidationEnd = validateValidSections(endSections, 'end'); // If invalid end - return with errors
323
398
 
@@ -347,7 +422,7 @@ var validateValidField = function validateValidField(value, tafStart, tafEnd) {
347
422
 
348
423
 
349
424
  if (trimmedValue.length < 6 || trimmedValue.length > 9 || !(trimmedValue.match(/^[0-9]{4}\/[0-9]{4}$/) || trimmedValue.match(/^[0-9]{6}$/))) {
350
- return invalidValidityLengthMessage;
425
+ return invalidChangeValidInterFieldMessage;
351
426
  } // Ensure valid date(s) can be made
352
427
 
353
428
 
@@ -379,11 +454,11 @@ var validateValidChangeGroupInterField = function validateValidChangeGroupInterF
379
454
  var tafStartMoment = moment.utc(tafStart);
380
455
  var tafEndMoment = moment.utc(tafEnd);
381
456
  var startEnd = trimmedValue.split('/');
382
- var format = trimmedValue.indexOf('/') === -1 ? 'DDHHmm' : 'DDHH'; // Validate start time
457
+ var format = trimmedValue.indexOf('/') === -1 ? FORMAT_DAYS_HOURS_MINUTS : FORMAT_DAYS_HOURS; // Validate start time
383
458
 
384
459
  var startSections = getSections(startEnd[0], format);
385
460
  var startTimestamp = getValidityTimeStamp('start', startSections, tafStartMoment, tafEndMoment);
386
- var endSections = getSections(startEnd[1], 'DDHH');
461
+ var endSections = getSections(startEnd[1], FORMAT_DAYS_HOURS);
387
462
  var endTimestamp = getValidityTimeStamp('end', endSections, tafStartMoment, tafEndMoment);
388
463
  var timeDifference = endTimestamp.diff(startTimestamp, 'hours');
389
464
 
@@ -392,6 +467,57 @@ var validateValidChangeGroupInterField = function validateValidChangeGroupInterF
392
467
  }
393
468
  }
394
469
 
470
+ return true;
471
+ }; // validate previous changeGroup
472
+
473
+ var validProbChangeOrder = ['FM', 'BECMG', 'TEMPO', 'PROB40', 'PROB30', 'PROB40 TEMPO', 'PROB30 TEMPO'];
474
+ var invalidPreviousChangeGroupIsBeforeMessage = 'Valid time should be after previous valid time';
475
+ var invalidPreviousChangeGroupOrderMessage = "When valid times are equal, the change/probability order should be: ".concat(validProbChangeOrder.join(', '));
476
+ var invalidPreviousChangeGroupHasSameValue = "When valid times are equal, probability/change can't have the same value as previous row value";
477
+ var validatePreviousChangeGroup = function validatePreviousChangeGroup(currentChangeGroup, nextChangeGroup, tafStart, tafEnd) {
478
+ // extract the needed values from changeGroups
479
+ var valid = currentChangeGroup.valid,
480
+ _currentChangeGroup$c = currentChangeGroup.change,
481
+ change = _currentChangeGroup$c === void 0 ? '' : _currentChangeGroup$c,
482
+ _currentChangeGroup$p = currentChangeGroup.probability,
483
+ probability = _currentChangeGroup$p === void 0 ? '' : _currentChangeGroup$p;
484
+ var previousValid = nextChangeGroup.valid,
485
+ _nextChangeGroup$chan = nextChangeGroup.change,
486
+ previousChange = _nextChangeGroup$chan === void 0 ? '' : _nextChangeGroup$chan,
487
+ _nextChangeGroup$prob = nextChangeGroup.probability,
488
+ previousProbability = _nextChangeGroup$prob === void 0 ? '' : _nextChangeGroup$prob; // get the parsed values
489
+
490
+ var validValue = parseValidToObject(valid, tafStart, tafEnd);
491
+ var previousValidValue = parseValidToObject(previousValid, tafStart, tafEnd);
492
+
493
+ if (!validValue || !previousValidValue || !change.length && !probability.length) {
494
+ return true;
495
+ } // validate is valid time before
496
+
497
+
498
+ var currentStartTime = moment(validValue.start);
499
+ var previousRowStartTime = moment(previousValidValue.start);
500
+
501
+ if (currentStartTime.isBefore(previousRowStartTime)) {
502
+ return invalidPreviousChangeGroupIsBeforeMessage;
503
+ } // validate same valid time
504
+
505
+
506
+ if (currentStartTime.isSame(previousRowStartTime)) {
507
+ // validate change/probability order
508
+ var currentProbChangeValue = "".concat(probability, " ").concat(change).trim();
509
+ var previousProbChangeValue = "".concat(previousProbability, " ").concat(previousChange).trim();
510
+
511
+ if (validProbChangeOrder.indexOf(currentProbChangeValue) < validProbChangeOrder.indexOf(previousProbChangeValue)) {
512
+ return invalidPreviousChangeGroupOrderMessage;
513
+ } // validate same valid + change/probability value
514
+
515
+
516
+ if (currentProbChangeValue === previousProbChangeValue) {
517
+ return invalidPreviousChangeGroupHasSameValue;
518
+ }
519
+ }
520
+
395
521
  return true;
396
522
  };
397
523
 
@@ -411,11 +537,10 @@ var validateValidChangeGroupInterField = function validateValidChangeGroupInterF
411
537
  * Copyright 2021 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
412
538
  * Copyright 2021 - Finnish Meteorological Institute (FMI)
413
539
  * */
414
-
415
540
  var prependZeroes = function prependZeroes(value, totalDigits) {
416
541
  var valueAsString = value.toString();
417
- return __spreadArray([], __read(Array(totalDigits - valueAsString.length))).reduce(function (newVal) {
418
- return "0" + newVal;
542
+ return _toConsumableArray(Array(totalDigits - valueAsString.length)).reduce(function (newVal) {
543
+ return "0".concat(newVal);
419
544
  }, valueAsString);
420
545
  };
421
546
 
@@ -427,9 +552,7 @@ var config$1 = [{
427
552
  size: 1
428
553
  }];
429
554
  var configAsObject$1 = Object.assign(config$1).reduce(function (list, item) {
430
- var _a;
431
-
432
- return __assign(__assign({}, list), (_a = {}, _a[item.key] = item, _a));
555
+ return Object.assign(Object.assign({}, list), _defineProperty({}, item.key, item));
433
556
  }, {}); // formatters
434
557
  // if passed true - visibility is CAVOK, if passed a number - prepend zeroes to size 4
435
558
 
@@ -966,22 +1089,57 @@ var WeatherPhenomena;
966
1089
  })(WeatherPhenomena || (WeatherPhenomena = {}));
967
1090
 
968
1091
  var invalidWeatherMessage = 'Invalid weather input, expected NSW or a valid weather code';
1092
+ var invalidWeatherCodeMessage = 'Invalid weather input, invalid weather code';
969
1093
  var invalidWeatherNSWMessage = 'Invalid weather input, NSW is not allowed in the baseforecast and can only be used in the first weather group';
970
1094
  var invalidWeatherWithPreviousEmptyWeather = 'Invalid weather input, value is not allowed when previous weather group(s) are empty';
971
1095
  var invalidWeatherNonUniqueValue = 'Invalid weather input, weather groups must be unique';
972
1096
  var invalidWeatherNonEmptyNSWGroups = 'Invalid weather input, when NSW is used, other weather groups must be empty';
973
- var invalidWeatherCAVOKMessage = 'Invalid weather input, when CAVOK is used, weather groups must be empty'; // validations
1097
+ var invalidWeatherCAVOKMessage = 'Invalid weather input, when CAVOK is used, weather groups must be empty';
1098
+ var invalidWeatherVisibilityBelow5000 = 'Invalid weather input, weather codes FU, DU, HZ, DRDU and BLDU need to be combined with a visibility of 5000m or less';
1099
+ var invalidWeatherBRVisibility = 'Invalid weather input, weather code BR needs to be combined with a visibility between 1000 and 5000m';
1100
+ var invalidWeatherFGVisibility = 'Invalid weather input, weather code FG needs to be combined with a visibility below 1000m'; // validations
1101
+
1102
+ var WeatherVisibilityBelow5000 = [WeatherPhenomena.FU, WeatherPhenomena.DU, WeatherPhenomena.HZ, WeatherPhenomena.DRDU, WeatherPhenomena.BLDU];
1103
+ var validateWeatherField = function validateWeatherField(value, visibilityValue) {
1104
+ var NSWAllowed = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
1105
+ var trimmedValue = value.trim(); // if empty, validate as true
1106
+
1107
+ if (trimmedValue === '') {
1108
+ return true;
1109
+ } // In case of NSW - validate if allowed
1110
+
1111
+
1112
+ if (trimmedValue === 'NSW' && !NSWAllowed) {
1113
+ return invalidWeatherNSWMessage;
1114
+ } // Check if cavOK - then weather group should be empty
1115
+
1116
+
1117
+ if (trimmedValue && visibilityValue === 'CAVOK') {
1118
+ return invalidWeatherCAVOKMessage;
1119
+ } // Validate if entered weather is one of the allowed weather phenomena
1120
+
974
1121
 
975
- var validateWeatherField = function validateWeatherField(value, visibilityValue, NSWAllowed) {
976
- if (NSWAllowed === void 0) {
977
- NSWAllowed = true;
1122
+ if (!(trimmedValue in WeatherPhenomena) && trimmedValue !== 'NSW') {
1123
+ return NSWAllowed ? invalidWeatherMessage : invalidWeatherCodeMessage;
1124
+ } // Validate the weather code in combination with the visibility range
1125
+
1126
+
1127
+ var visibilityRange = parseInt(visibilityValue, 10);
1128
+
1129
+ if (WeatherVisibilityBelow5000.includes(trimmedValue) && visibilityRange > 5000) {
1130
+ return invalidWeatherVisibilityBelow5000;
978
1131
  }
979
1132
 
980
- var trimmedValue = value.trim();
981
- var isValid = trimmedValue === '' || trimmedValue in WeatherPhenomena || NSWAllowed && trimmedValue === 'NSW';
982
- var errorMessage = NSWAllowed ? invalidWeatherMessage : invalidWeatherNSWMessage;
983
- if (trimmedValue && visibilityValue === 'CAVOK') return invalidWeatherCAVOKMessage;
984
- return isValid ? true : errorMessage;
1133
+ if (trimmedValue === WeatherPhenomena.BR && (visibilityRange < 1000 || visibilityRange > 5000)) {
1134
+ return invalidWeatherBRVisibility;
1135
+ }
1136
+
1137
+ if (trimmedValue === WeatherPhenomena.FG && visibilityRange >= 1000) {
1138
+ return invalidWeatherFGVisibility;
1139
+ } // Everything validated ok - return true
1140
+
1141
+
1142
+ return true;
985
1143
  };
986
1144
  var validateSecondWeatherField = function validateSecondWeatherField(weather1Value, weather2Value, visibilityValue) {
987
1145
  var trimmedWeather2Value = weather2Value.trim(); // Field can be left empty
@@ -1039,18 +1197,16 @@ var validateThirdWeatherField = function validateThirdWeatherField(weather1Value
1039
1197
 
1040
1198
  function parseWeatherToObject(value) {
1041
1199
  var trimmedWeather = Object.keys(value).reduce(function (obj, key) {
1042
- var _a; // only parse it if it has a value
1043
-
1044
-
1200
+ // only parse it if it has a value
1045
1201
  if (value[key] && value[key].trim()) {
1046
- return __assign(__assign({}, obj), (_a = {}, _a[key] = obj[key].trim(), _a));
1202
+ return Object.assign(Object.assign({}, obj), _defineProperty({}, key, obj[key].trim()));
1047
1203
  } // if it doesn't have a value, remove it from the list
1048
1204
 
1049
1205
 
1050
- var _b = obj,
1051
- _c = key;
1052
- _b[_c];
1053
- var rest = __rest(_b, [_typeof(_c) === "symbol" ? _c : _c + ""]);
1206
+ var _a = obj,
1207
+ _b = key;
1208
+ _a[_b];
1209
+ var rest = __rest(_a, [_typeof(_b) === "symbol" ? _b : _b + ""]);
1054
1210
 
1055
1211
  return rest;
1056
1212
  }, value);
@@ -1075,9 +1231,7 @@ var config = [{
1075
1231
  size: 2
1076
1232
  }];
1077
1233
  var configAsObject = Object.assign(config).reduce(function (list, item) {
1078
- var _a;
1079
-
1080
- return __assign(__assign({}, list), (_a = {}, _a[item.key] = item, _a));
1234
+ return Object.assign(Object.assign({}, list), _defineProperty({}, item.key, item));
1081
1235
  }, {}); // wind formatters:
1082
1236
 
1083
1237
  var formatWindValues = function formatWindValues(key, value) {
@@ -1098,22 +1252,22 @@ var formatWindValues = function formatWindValues(key, value) {
1098
1252
  return 'P99';
1099
1253
  }
1100
1254
 
1101
- var size = configAsObject[key].size;
1102
- return prependZeroes(value, size);
1255
+ var _size = configAsObject[key].size;
1256
+ return prependZeroes(value, _size);
1103
1257
  }
1104
1258
 
1105
1259
  case 'gust':
1106
1260
  {
1107
1261
  // if there is a P as first character - return P99
1108
- var valueAsString = value.toString();
1262
+ var _valueAsString = value.toString();
1109
1263
 
1110
- if (valueAsString.length && valueAsString[0] === 'P') {
1264
+ if (_valueAsString.length && _valueAsString[0] === 'P') {
1111
1265
  return 'GP99';
1112
1266
  }
1113
1267
 
1114
- var size = configAsObject[key].size;
1115
- var newValue = prependZeroes(value, size);
1116
- return "G" + newValue.toString();
1268
+ var _size2 = configAsObject[key].size;
1269
+ var newValue = prependZeroes(value, _size2);
1270
+ return "G".concat(newValue.toString());
1117
1271
  }
1118
1272
 
1119
1273
  case 'unit':
@@ -1140,11 +1294,8 @@ var formatWindToString = function formatWindToString(value) {
1140
1294
  }, '');
1141
1295
  };
1142
1296
 
1143
- var extractValidateWindSections = function extractValidateWindSections(value, validation) {
1144
- if (validation === void 0) {
1145
- validation = false;
1146
- }
1147
-
1297
+ var extractValidateWindSections = function extractValidateWindSections(value) {
1298
+ var validation = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
1148
1299
  return config.reduce(function (obj, item) {
1149
1300
  var key = item.key,
1150
1301
  size = item.size;
@@ -1161,14 +1312,14 @@ var extractValidateWindSections = function extractValidateWindSections(value, va
1161
1312
  var valDirection = validateDirection(direction); // If validated not ok - add validation feedback
1162
1313
 
1163
1314
  var validations = valDirection !== true ? obj.validations.concat(valDirection) : obj.validations;
1164
- return __assign(__assign({}, obj), {
1315
+ return Object.assign(Object.assign({}, obj), {
1165
1316
  direction: direction,
1166
1317
  remainder: remainder,
1167
1318
  validations: validations
1168
1319
  });
1169
1320
  }
1170
1321
 
1171
- return __assign(__assign({}, obj), {
1322
+ return Object.assign(Object.assign({}, obj), {
1172
1323
  direction: direction,
1173
1324
  remainder: remainder
1174
1325
  });
@@ -1181,22 +1332,25 @@ var extractValidateWindSections = function extractValidateWindSections(value, va
1181
1332
 
1182
1333
  var dirLength = obj.remainder.length && obj.remainder[0] === 'P' ? maxSize : minSize;
1183
1334
  var speed = obj.remainder.slice(0, dirLength);
1184
- var remainder = obj.remainder.substring(dirLength); // Validate speed
1335
+
1336
+ var _remainder = obj.remainder.substring(dirLength); // Validate speed
1337
+
1185
1338
 
1186
1339
  if (validation) {
1187
1340
  var valSpeed = validateSpeed(speed); // If validated not ok - add validation feedback
1188
1341
 
1189
- var validations = valSpeed !== true ? obj.validations.concat(valSpeed) : obj.validations;
1190
- return __assign(__assign({}, obj), {
1342
+ var _validations = valSpeed !== true ? obj.validations.concat(valSpeed) : obj.validations;
1343
+
1344
+ return Object.assign(Object.assign({}, obj), {
1191
1345
  speed: speed,
1192
- remainder: remainder,
1193
- validations: validations
1346
+ remainder: _remainder,
1347
+ validations: _validations
1194
1348
  });
1195
1349
  }
1196
1350
 
1197
- return __assign(__assign({}, obj), {
1351
+ return Object.assign(Object.assign({}, obj), {
1198
1352
  speed: speed,
1199
- remainder: remainder
1353
+ remainder: _remainder
1200
1354
  });
1201
1355
  }
1202
1356
 
@@ -1204,30 +1358,35 @@ var extractValidateWindSections = function extractValidateWindSections(value, va
1204
1358
  {
1205
1359
  // Only parse gust if still chars left and these start with G
1206
1360
  if (obj.remainder.length && obj.remainder !== 'KT' && obj.remainder[0] === 'G') {
1207
- var maxSize = item.maxSize,
1208
- minSize = item.minSize; // Remove G
1361
+ var _maxSize = item.maxSize,
1362
+ _minSize = item.minSize; // Remove G
1209
1363
 
1210
1364
  var rest = obj.remainder.substring(1); // In case the first char of the gust is a P - it's 3 chars long, otherwise 2
1211
1365
 
1212
- var dirLength = rest[0] === 'P' ? maxSize : minSize;
1213
- var gust = rest.slice(0, dirLength);
1214
- var remainder = rest.substring(dirLength); // Validate gusts
1366
+ var _dirLength = rest[0] === 'P' ? _maxSize : _minSize;
1367
+
1368
+ var gust = rest.slice(0, _dirLength);
1369
+
1370
+ var _remainder2 = rest.substring(_dirLength); // Validate gusts
1371
+
1215
1372
 
1216
1373
  if (validation) {
1217
1374
  var valGust = validateGust(gust); // If validated not ok - add validation feedback
1218
1375
 
1219
1376
  valGust !== true && returnObj.validations.push(valGust);
1220
- var validations = valGust !== true ? obj.validations.concat(valGust) : obj.validations;
1221
- return __assign(__assign({}, obj), {
1377
+
1378
+ var _validations2 = valGust !== true ? obj.validations.concat(valGust) : obj.validations;
1379
+
1380
+ return Object.assign(Object.assign({}, obj), {
1222
1381
  gust: gust,
1223
- remainder: remainder,
1224
- validations: validations
1382
+ remainder: _remainder2,
1383
+ validations: _validations2
1225
1384
  });
1226
1385
  }
1227
1386
 
1228
- return __assign(__assign({}, obj), {
1387
+ return Object.assign(Object.assign({}, obj), {
1229
1388
  gust: gust,
1230
- remainder: remainder
1389
+ remainder: _remainder2
1231
1390
  });
1232
1391
  }
1233
1392
 
@@ -1239,9 +1398,11 @@ var extractValidateWindSections = function extractValidateWindSections(value, va
1239
1398
  if (obj.remainder.length) {
1240
1399
  // Validate units
1241
1400
  var valUnits = validateUnit(returnObj.remainder);
1242
- var validations = valUnits !== true ? obj.validations.concat(valUnits) : obj.validations;
1243
- return __assign(__assign({}, obj), {
1244
- validations: validations
1401
+
1402
+ var _validations3 = valUnits !== true ? obj.validations.concat(valUnits) : obj.validations;
1403
+
1404
+ return Object.assign(Object.assign({}, obj), {
1405
+ validations: _validations3
1245
1406
  });
1246
1407
  }
1247
1408
 
@@ -1268,8 +1429,7 @@ var parseWindToObject = function parseWindToObject(value) {
1268
1429
 
1269
1430
  var windSections = extractValidateWindSections(trimmedValue, false);
1270
1431
  var gust = windSections.gust === 'P99' || windSections.gust === '' ? windSections.gust : parseInt(windSections.gust, 10);
1271
-
1272
- var windObject = __assign(__assign({
1432
+ var windObject = Object.assign(Object.assign({
1273
1433
  direction: windSections.direction === 'VRB' ? windSections.direction : parseInt(windSections.direction, 10),
1274
1434
  speed: windSections.speed === 'P99' ? windSections.speed : parseInt(windSections.speed, 10)
1275
1435
  }, gust !== '' ? {
@@ -1277,7 +1437,6 @@ var parseWindToObject = function parseWindToObject(value) {
1277
1437
  } : {}), {
1278
1438
  unit: windSections.unit
1279
1439
  });
1280
-
1281
1440
  return windObject;
1282
1441
  }; // messages
1283
1442
 
@@ -1376,7 +1535,7 @@ var validateWindField = function validateWindField(value) {
1376
1535
 
1377
1536
  var formatSingleCloud = function formatSingleCloud(value) {
1378
1537
  if (!value) return null;
1379
- return value.type ? "" + value.coverage + prependZeroes(value.height, 3) + value.type : "" + value.coverage + prependZeroes(value.height, 3);
1538
+ return value.type ? "".concat(value.coverage).concat(prependZeroes(value.height, 3)).concat(value.type) : "".concat(value.coverage).concat(prependZeroes(value.height, 3));
1380
1539
  }; // TODO: clouds type = Clouds, but couldn't get it to work properly https://gitlab.com/opengeoweb/opengeoweb/-/issues/119
1381
1540
  // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
1382
1541
 
@@ -1385,30 +1544,28 @@ var formatCloudsToString = function formatCloudsToString(clouds) {
1385
1544
  if (!clouds) return null;
1386
1545
  return Object.keys(clouds).reduce(function (list, key) {
1387
1546
  // only format it if it has a value
1388
- var _a, _b, _c, _d;
1389
-
1390
1547
  if (clouds[key]) {
1391
1548
  switch (key) {
1392
1549
  case 'cloud1':
1393
1550
  {
1394
1551
  if (clouds[key].verticalVisibility !== undefined) {
1395
1552
  // Format Vertical Visibility
1396
- return __assign(__assign({}, list), (_a = {}, _a[key] = "VV" + prependZeroes(clouds[key].verticalVisibility, 3), _a));
1553
+ return Object.assign(Object.assign({}, list), _defineProperty({}, key, "VV".concat(prependZeroes(clouds[key].verticalVisibility, 3))));
1397
1554
  }
1398
1555
 
1399
1556
  if (clouds[key].coverage) {
1400
1557
  // Format Cloud
1401
- return __assign(__assign({}, list), (_b = {}, _b[key] = formatSingleCloud(clouds[key]), _b));
1558
+ return Object.assign(Object.assign({}, list), _defineProperty({}, key, formatSingleCloud(clouds[key])));
1402
1559
  } // Format No Significant Clouds
1403
1560
 
1404
1561
 
1405
- return __assign(__assign({}, list), (_c = {}, _c[key] = clouds[key], _c));
1562
+ return Object.assign(Object.assign({}, list), _defineProperty({}, key, clouds[key]));
1406
1563
  }
1407
1564
 
1408
1565
  default:
1409
1566
  {
1410
1567
  // Other cloud keys can only contain a cloud
1411
- return __assign(__assign({}, list), (_d = {}, _d[key] = formatSingleCloud(clouds[key]), _d));
1568
+ return Object.assign(Object.assign({}, list), _defineProperty({}, key, formatSingleCloud(clouds[key])));
1412
1569
  }
1413
1570
  }
1414
1571
  }
@@ -1421,7 +1578,7 @@ var parseSingleCloud = function parseSingleCloud(value) {
1421
1578
  if (!value) return null;
1422
1579
  var trimmedCloud = value.trim();
1423
1580
  var cloudType = trimmedCloud.substr(6, 3);
1424
- return __assign({
1581
+ return Object.assign({
1425
1582
  coverage: trimmedCloud.substr(0, 3),
1426
1583
  height: parseInt(trimmedCloud.substr(3, 3), 10)
1427
1584
  }, cloudType && {
@@ -1434,42 +1591,40 @@ var parseSingleCloud = function parseSingleCloud(value) {
1434
1591
  var parseCloudsToObject = function parseCloudsToObject(clouds) {
1435
1592
  if (!clouds) return null;
1436
1593
  return Object.keys(clouds).reduce(function (list, key) {
1437
- var _a, _b, _c, _d; // only parse it if it has a value
1438
-
1439
-
1594
+ // only parse it if it has a value
1440
1595
  if (clouds[key] && clouds[key].trim()) {
1441
1596
  switch (key) {
1442
1597
  case 'cloud1':
1443
1598
  {
1444
1599
  if (isVerticalVisibility(clouds[key])) {
1445
1600
  // Parse Vertical Visibility
1446
- return __assign(__assign({}, list), (_a = {}, _a[key] = {
1601
+ return Object.assign(Object.assign({}, list), _defineProperty({}, key, {
1447
1602
  verticalVisibility: parseInt(clouds[key].substr(2, 3), 10)
1448
- }, _a));
1603
+ }));
1449
1604
  }
1450
1605
 
1451
1606
  if (clouds[key] === 'NSC') {
1452
1607
  // Parse No Significant Clouds
1453
- return __assign(__assign({}, list), (_b = {}, _b[key] = clouds[key], _b));
1608
+ return Object.assign(Object.assign({}, list), _defineProperty({}, key, clouds[key]));
1454
1609
  } // Parse Cloud
1455
1610
 
1456
1611
 
1457
- return __assign(__assign({}, list), (_c = {}, _c[key] = parseSingleCloud(clouds[key]), _c));
1612
+ return Object.assign(Object.assign({}, list), _defineProperty({}, key, parseSingleCloud(clouds[key])));
1458
1613
  }
1459
1614
 
1460
1615
  default:
1461
1616
  {
1462
1617
  // Other cloud keys can only contain a cloud
1463
- return __assign(__assign({}, list), (_d = {}, _d[key] = parseSingleCloud(clouds[key]), _d));
1618
+ return Object.assign(Object.assign({}, list), _defineProperty({}, key, parseSingleCloud(clouds[key])));
1464
1619
  }
1465
1620
  }
1466
1621
  } // if it doesn't have a value, remove it from the list
1467
1622
 
1468
1623
 
1469
- var _e = list,
1470
- _f = key;
1471
- _e[_f];
1472
- var rest = __rest(_e, [_typeof(_f) === "symbol" ? _f : _f + ""]);
1624
+ var _a = list,
1625
+ _b = key;
1626
+ _a[_b];
1627
+ var rest = __rest(_a, [_typeof(_b) === "symbol" ? _b : _b + ""]);
1473
1628
 
1474
1629
  return rest;
1475
1630
  }, clouds);
@@ -1562,10 +1717,10 @@ var isVerticalVisibilityValid = function isVerticalVisibilityValid(value) {
1562
1717
  return true;
1563
1718
  };
1564
1719
 
1565
- var sharedCloudValidations = function sharedCloudValidations(_a) {
1566
- var value = _a.value,
1567
- _b = _a.canBeNSC,
1568
- canBeNSC = _b === void 0 ? false : _b;
1720
+ var sharedCloudValidations = function sharedCloudValidations(_ref) {
1721
+ var value = _ref.value,
1722
+ _ref$canBeNSC = _ref.canBeNSC,
1723
+ canBeNSC = _ref$canBeNSC === void 0 ? false : _ref$canBeNSC;
1569
1724
  var errorMessages = []; // Validate length and ensure it doesn't contain any invalid characters
1570
1725
 
1571
1726
  if (!isLengthValid(value)) {
@@ -1641,10 +1796,12 @@ var validateFirstCloud = function validateFirstCloud(value, visibilityValue) {
1641
1796
  return true;
1642
1797
  }
1643
1798
 
1644
- var errorMessages = sharedCloudValidations({
1799
+ var _sharedCloudValidatio = sharedCloudValidations({
1645
1800
  value: trimmedValue,
1646
1801
  canBeNSC: true
1647
- }).errorMessages; // Return first error if any
1802
+ }),
1803
+ errorMessages = _sharedCloudValidatio.errorMessages; // Return first error if any
1804
+
1648
1805
 
1649
1806
  return errorMessages.length ? errorMessages[0] : true;
1650
1807
  };
@@ -1656,13 +1813,13 @@ var validateSecondCloud = function validateSecondCloud(firstCloudValue, secondCl
1656
1813
  } // Generic validations
1657
1814
 
1658
1815
 
1659
- var _a = sharedCloudValidations({
1816
+ var _sharedCloudValidatio2 = sharedCloudValidations({
1660
1817
  value: trimmedValue
1661
1818
  }),
1662
- coverage = _a.coverage,
1663
- height = _a.height,
1664
- type = _a.type,
1665
- errorMessages = _a.errorMessages; // Return first error if any
1819
+ coverage = _sharedCloudValidatio2.coverage,
1820
+ height = _sharedCloudValidatio2.height,
1821
+ type = _sharedCloudValidatio2.type,
1822
+ errorMessages = _sharedCloudValidatio2.errorMessages; // Return first error if any
1666
1823
 
1667
1824
 
1668
1825
  if (errorMessages.length) {
@@ -1714,13 +1871,13 @@ var validateThirdCloud = function validateThirdCloud(firstCloudValue, secondClou
1714
1871
  } // Generic validations
1715
1872
 
1716
1873
 
1717
- var _a = sharedCloudValidations({
1874
+ var _sharedCloudValidatio3 = sharedCloudValidations({
1718
1875
  value: trimmedValue
1719
1876
  }),
1720
- coverage = _a.coverage,
1721
- height = _a.height,
1722
- type = _a.type,
1723
- errorMessages = _a.errorMessages; // Return generic errors if any
1877
+ coverage = _sharedCloudValidatio3.coverage,
1878
+ height = _sharedCloudValidatio3.height,
1879
+ type = _sharedCloudValidatio3.type,
1880
+ errorMessages = _sharedCloudValidatio3.errorMessages; // Return generic errors if any
1724
1881
 
1725
1882
 
1726
1883
  if (errorMessages.length) {
@@ -1780,12 +1937,12 @@ var validateFourthCloud = function validateFourthCloud(firstCloudValue, secondCl
1780
1937
  } // Generic validations
1781
1938
 
1782
1939
 
1783
- var _a = sharedCloudValidations({
1940
+ var _sharedCloudValidatio4 = sharedCloudValidations({
1784
1941
  value: trimmedValue
1785
1942
  }),
1786
- height = _a.height,
1787
- type = _a.type,
1788
- errorMessages = _a.errorMessages; // Return generic errors if any
1943
+ height = _sharedCloudValidatio4.height,
1944
+ type = _sharedCloudValidatio4.type,
1945
+ errorMessages = _sharedCloudValidatio4.errorMessages; // Return generic errors if any
1789
1946
 
1790
1947
 
1791
1948
  if (errorMessages.length) {
@@ -1842,21 +1999,21 @@ var validateFourthCloud = function validateFourthCloud(firstCloudValue, secondCl
1842
1999
  };
1843
2000
 
1844
2001
  var formatIssueTime = function formatIssueTime(issueDate) {
1845
- return issueDate ? moment(issueDate).utc().format('DDHHmm') + "Z" : 'Not issued';
2002
+ return issueDate ? "".concat(moment(issueDate).utc().format('DDHHmm'), "Z") : 'Not issued';
1846
2003
  };
1847
2004
  function formatFormValues(row) {
1848
2005
  return Object.keys(row).reduce(function (list, key) {
1849
2006
  switch (key) {
1850
2007
  case 'valid':
1851
2008
  {
1852
- return __assign(__assign({}, list), {
2009
+ return Object.assign(Object.assign({}, list), {
1853
2010
  valid: formatValidToString(list[key])
1854
2011
  });
1855
2012
  }
1856
2013
 
1857
2014
  case 'wind':
1858
2015
  {
1859
- return __assign(__assign({}, list), {
2016
+ return Object.assign(Object.assign({}, list), {
1860
2017
  wind: formatWindToString(list[key])
1861
2018
  });
1862
2019
  }
@@ -1864,7 +2021,7 @@ function formatFormValues(row) {
1864
2021
  case 'visibility':
1865
2022
  {
1866
2023
  // Assume if visibility field set - no cavOK
1867
- return __assign(__assign({}, list), {
2024
+ return Object.assign(Object.assign({}, list), {
1868
2025
  visibility: formatVisibilityToString(list[key])
1869
2026
  });
1870
2027
  }
@@ -1872,14 +2029,14 @@ function formatFormValues(row) {
1872
2029
  case 'cavOK':
1873
2030
  {
1874
2031
  // Assume if cavOK field set to true - no visibility field, otherwise return the original list containing the visibility
1875
- return list[key] ? __assign(__assign({}, list), {
2032
+ return list[key] ? Object.assign(Object.assign({}, list), {
1876
2033
  visibility: formatVisibilityToString(list[key])
1877
2034
  }) : list;
1878
2035
  }
1879
2036
 
1880
2037
  case 'cloud':
1881
2038
  {
1882
- return __assign(__assign({}, list), {
2039
+ return Object.assign(Object.assign({}, list), {
1883
2040
  cloud: formatCloudsToString(list[key])
1884
2041
  });
1885
2042
  }
@@ -1899,33 +2056,33 @@ function reduceRowValues(row, tafStart, tafEnd) {
1899
2056
  switch (key) {
1900
2057
  case 'valid':
1901
2058
  {
1902
- return __assign(__assign({}, list), {
2059
+ return Object.assign(Object.assign({}, list), {
1903
2060
  valid: parseValidToObject(list[key], tafStart, tafEnd)
1904
2061
  });
1905
2062
  }
1906
2063
 
1907
2064
  case 'wind':
1908
2065
  {
1909
- return __assign(__assign({}, list), {
2066
+ return Object.assign(Object.assign({}, list), {
1910
2067
  wind: parseWindToObject(list[key])
1911
2068
  });
1912
2069
  }
1913
2070
 
1914
2071
  case 'visibility':
1915
2072
  {
1916
- return __assign(__assign({}, list), parseVisibilityToObject(list[key]));
2073
+ return Object.assign(Object.assign({}, list), parseVisibilityToObject(list[key]));
1917
2074
  }
1918
2075
 
1919
2076
  case 'weather':
1920
2077
  {
1921
- return __assign(__assign({}, list), {
2078
+ return Object.assign(Object.assign({}, list), {
1922
2079
  weather: parseWeatherToObject(list[key])
1923
2080
  });
1924
2081
  }
1925
2082
 
1926
2083
  case 'cloud':
1927
2084
  {
1928
- return __assign(__assign({}, list), {
2085
+ return Object.assign(Object.assign({}, list), {
1929
2086
  cloud: parseCloudsToObject(list[key])
1930
2087
  });
1931
2088
  }
@@ -1934,7 +2091,7 @@ function reduceRowValues(row, tafStart, tafEnd) {
1934
2091
  case 'change':
1935
2092
  case 'probability':
1936
2093
  {
1937
- return __assign(__assign({}, list), (_a = {}, _a[key] = list[key].trim(), _a));
2094
+ return Object.assign(Object.assign({}, list), _defineProperty({}, key, (_a = list[key]) === null || _a === void 0 ? void 0 : _a.trim()));
1938
2095
  }
1939
2096
 
1940
2097
  default:
@@ -1967,9 +2124,9 @@ function parseFormValues(row, tafStart, tafEnd) {
1967
2124
  // If cloud is undefined or empty, remove it from the list
1968
2125
  if (!reducedRow.cloud || Object.keys(reducedRow.cloud).length === 0) {
1969
2126
  list.cloud;
1970
- var rest = __rest(list, ["cloud"]);
2127
+ var _rest = __rest(list, ["cloud"]);
1971
2128
 
1972
- return rest;
2129
+ return _rest;
1973
2130
  }
1974
2131
 
1975
2132
  return list;
@@ -1980,9 +2137,9 @@ function parseFormValues(row, tafStart, tafEnd) {
1980
2137
  // If empty, remove it from the list
1981
2138
  if (!reducedRow.weather.weather1) {
1982
2139
  list.weather;
1983
- var rest = __rest(list, ["weather"]);
2140
+ var _rest2 = __rest(list, ["weather"]);
1984
2141
 
1985
- return rest;
2142
+ return _rest2;
1986
2143
  }
1987
2144
 
1988
2145
  return list;
@@ -1993,9 +2150,9 @@ function parseFormValues(row, tafStart, tafEnd) {
1993
2150
  // If empty, remove it from the list
1994
2151
  if (!reducedRow.wind.direction && isNaN(Number(reducedRow.wind.direction))) {
1995
2152
  list.wind;
1996
- var rest = __rest(list, ["wind"]);
2153
+ var _rest3 = __rest(list, ["wind"]);
1997
2154
 
1998
- return rest;
2155
+ return _rest3;
1999
2156
  }
2000
2157
 
2001
2158
  return list;
@@ -2006,9 +2163,9 @@ function parseFormValues(row, tafStart, tafEnd) {
2006
2163
  // If empty, remove it from the list
2007
2164
  if (!reducedRow.visibility.range && isNaN(reducedRow.visibility.range)) {
2008
2165
  list.visibility;
2009
- var rest = __rest(list, ["visibility"]);
2166
+ var _rest4 = __rest(list, ["visibility"]);
2010
2167
 
2011
- return rest;
2168
+ return _rest4;
2012
2169
  }
2013
2170
 
2014
2171
  return list;
@@ -2021,9 +2178,9 @@ function parseFormValues(row, tafStart, tafEnd) {
2021
2178
  var _a = list,
2022
2179
  _b = key;
2023
2180
  _a[_b];
2024
- var rest = __rest(_a, [_typeof(_b) === "symbol" ? _b : _b + ""]);
2181
+ var _rest5 = __rest(_a, [_typeof(_b) === "symbol" ? _b : _b + ""]);
2025
2182
 
2026
- return rest;
2183
+ return _rest5;
2027
2184
  }
2028
2185
 
2029
2186
  return list;
@@ -2035,9 +2192,9 @@ function parseFormValues(row, tafStart, tafEnd) {
2035
2192
  var _c = list,
2036
2193
  _d = key;
2037
2194
  _c[_d];
2038
- var rest = __rest(_c, [_typeof(_d) === "symbol" ? _d : _d + ""]);
2195
+ var _rest6 = __rest(_c, [_typeof(_d) === "symbol" ? _d : _d + ""]);
2039
2196
 
2040
- return rest;
2197
+ return _rest6;
2041
2198
  }
2042
2199
 
2043
2200
  return list;
@@ -2063,12 +2220,10 @@ var convertTafValuesToObject = function convertTafValuesToObject(formData) {
2063
2220
  .filter(function (value) {
2064
2221
  return Object.keys(value).length;
2065
2222
  });
2066
-
2067
- var parsedFormValues = __assign(__assign({}, productToPost), {
2223
+ var parsedFormValues = Object.assign(Object.assign({}, productToPost), {
2068
2224
  baseForecast: parseFormValues(productToPost.baseForecast, tafStart, tafEnd),
2069
2225
  changeGroups: parsedChangeGroups
2070
2226
  });
2071
-
2072
2227
  return Object.keys(parsedFormValues).reduce(function (list, key) {
2073
2228
  switch (key) {
2074
2229
  case 'changeGroups':
@@ -2094,9 +2249,9 @@ var convertTafValuesToObject = function convertTafValuesToObject(formData) {
2094
2249
  var _a = list,
2095
2250
  _b = key;
2096
2251
  _a[_b];
2097
- var rest = __rest(_a, [_typeof(_b) === "symbol" ? _b : _b + ""]);
2252
+ var _rest7 = __rest(_a, [_typeof(_b) === "symbol" ? _b : _b + ""]);
2098
2253
 
2099
- return rest;
2254
+ return _rest7;
2100
2255
  }
2101
2256
 
2102
2257
  return list;
@@ -2108,8 +2263,7 @@ var convertTafValuesToObject = function convertTafValuesToObject(formData) {
2108
2263
  }
2109
2264
  }
2110
2265
  }, parsedFormValues);
2111
- };
2112
- var noTAC = 'Missing data: no TAC can be generated'; // Ensure we have enough data to retrieve a TAC - we only need to check for wind and visibility/ cavok as those are the only ones required in all cases
2266
+ }; // Ensure we have enough data to retrieve a TAC - we only need to check for wind and visibility/ cavok as those are the only ones required in all cases
2113
2267
 
2114
2268
  var shouldRetrieveTAC = function shouldRetrieveTAC(product) {
2115
2269
  if (product && product.baseForecast && product.baseForecast.wind && 'speed' in product.baseForecast.wind && product.baseForecast.wind.speed !== '' && (product.baseForecast.visibility && 'range' in product.baseForecast.visibility && product.baseForecast.visibility.range !== '' || product.baseForecast.cavOK)) {
@@ -2119,46 +2273,55 @@ var shouldRetrieveTAC = function shouldRetrieveTAC(product) {
2119
2273
  return false;
2120
2274
  };
2121
2275
  var getFieldNames = function getFieldNames(isChangeGroup, index) {
2122
- var namePrefix = !isChangeGroup ? 'baseForecast' : "changeGroups[" + index + "]";
2123
- return __assign(__assign(__assign({}, !isChangeGroup && {
2276
+ var namePrefix = !isChangeGroup ? 'baseForecast' : "changeGroups[".concat(index, "]");
2277
+ return Object.assign(Object.assign(Object.assign({}, !isChangeGroup && {
2124
2278
  messageType: 'messageType',
2125
2279
  location: 'location',
2126
2280
  issueDate: 'issueDate'
2127
2281
  }), isChangeGroup && {
2128
- probability: namePrefix + ".probability",
2129
- change: namePrefix + ".change"
2282
+ probability: "".concat(namePrefix, ".probability"),
2283
+ change: "".concat(namePrefix, ".change")
2130
2284
  }), {
2131
- valid: namePrefix + ".valid",
2132
- wind: namePrefix + ".wind",
2133
- visibility: namePrefix + ".visibility",
2134
- weather1: namePrefix + ".weather.weather1",
2135
- weather2: namePrefix + ".weather.weather2",
2136
- weather3: namePrefix + ".weather.weather3",
2137
- cloud1: namePrefix + ".cloud.cloud1",
2138
- cloud2: namePrefix + ".cloud.cloud2",
2139
- cloud3: namePrefix + ".cloud.cloud3",
2140
- cloud4: namePrefix + ".cloud.cloud4"
2285
+ valid: "".concat(namePrefix, ".valid"),
2286
+ wind: "".concat(namePrefix, ".wind"),
2287
+ visibility: "".concat(namePrefix, ".visibility"),
2288
+ weather1: "".concat(namePrefix, ".weather.weather1"),
2289
+ weather2: "".concat(namePrefix, ".weather.weather2"),
2290
+ weather3: "".concat(namePrefix, ".weather.weather3"),
2291
+ cloud1: "".concat(namePrefix, ".cloud.cloud1"),
2292
+ cloud2: "".concat(namePrefix, ".cloud.cloud2"),
2293
+ cloud3: "".concat(namePrefix, ".cloud.cloud3"),
2294
+ cloud4: "".concat(namePrefix, ".cloud.cloud4")
2141
2295
  });
2142
2296
  };
2143
- var useTACGenerator = function useTACGenerator(taf, requestTAC, standardTAC) {
2144
- if (standardTAC === void 0) {
2145
- standardTAC = '';
2146
- }
2297
+ var TAC_MISSING_DATA = 'Missing data: no TAC can be generated';
2298
+ var TAC_NOT_AVAILABLE = 'No TAC available';
2299
+ var TAC_RETRIEVING_DATA = 'Retrieving TAC';
2300
+ var useTACGenerator = function useTACGenerator(taf, requestTAC) {
2301
+ var standardTAC = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';
2302
+
2303
+ var _React$useState = React__default.useState(taf.status === 'NEW' ? TAC_NOT_AVAILABLE : TAC_RETRIEVING_DATA),
2304
+ _React$useState2 = _slicedToArray(_React$useState, 2),
2305
+ TAC = _React$useState2[0],
2306
+ setTAC = _React$useState2[1];
2147
2307
 
2148
- var _a = __read(React__default.useState(taf.status === 'NEW' ? 'No TAC available' : 'Retrieving TAC'), 2),
2149
- TAC = _a[0],
2150
- setTAC = _a[1];
2308
+ var _useIsMounted = useIsMounted(),
2309
+ isMounted = _useIsMounted.isMounted;
2151
2310
 
2152
2311
  var retrieveTAC = function retrieveTAC(tafToPost) {
2153
2312
  if (shouldRetrieveTAC(tafToPost)) {
2154
2313
  requestTAC(tafToPost).then(function (result) {
2155
- setTAC(result.data);
2314
+ if (isMounted.current) {
2315
+ setTAC(result.data);
2316
+ }
2156
2317
  })["catch"](function () {
2157
- setTAC('Failed to retrieve TAC');
2318
+ if (isMounted.current) {
2319
+ setTAC('Failed to retrieve TAC');
2320
+ }
2158
2321
  });
2322
+ } else {
2323
+ setTAC(TAC_MISSING_DATA);
2159
2324
  }
2160
-
2161
- setTAC(noTAC);
2162
2325
  };
2163
2326
 
2164
2327
  React__default.useEffect(function () {
@@ -2174,69 +2337,57 @@ var useTACGenerator = function useTACGenerator(taf, requestTAC, standardTAC) {
2174
2337
  }, [standardTAC]);
2175
2338
  return [TAC, retrieveTAC];
2176
2339
  };
2177
- var getRange = function getRange(min, max) {
2178
- return Array.from({
2179
- length: max - min + 1
2180
- }, function (_, i) {
2181
- return min + i;
2182
- });
2183
- };
2184
- var useDragOrder = function useDragOrder(trigger, move, fields) {
2185
- // create simple ordered list with hover (chosen) state
2186
- var _a = __read(React__default.useState([]), 2),
2187
- sortedFields = _a[0],
2188
- setSortedFields = _a[1];
2189
-
2190
- var _b = __read(React__default.useState([null, null]), 2),
2191
- lastDragOrder = _b[0],
2192
- onUpdatelastDragOrder = _b[1];
2193
-
2194
- var onChangeOrder = function onChangeOrder(_a) {
2195
- var oldIndex = _a.oldIndex,
2196
- newIndex = _a.newIndex;
2340
+ var useDragOrder = function useDragOrder(trigger, move, onFormBlur) {
2341
+ var _React$useState3 = React__default.useState(null),
2342
+ _React$useState4 = _slicedToArray(_React$useState3, 2),
2343
+ activeDraggingIndex = _React$useState4[0],
2344
+ setIsDragging = _React$useState4[1];
2345
+
2346
+ var _React$useState5 = React__default.useState([null, null]),
2347
+ _React$useState6 = _slicedToArray(_React$useState5, 2),
2348
+ lastDragOrder = _React$useState6[0],
2349
+ onUpdatelastDragOrder = _React$useState6[1];
2350
+
2351
+ var onChangeOrder = function onChangeOrder(_ref) {
2352
+ var oldIndex = _ref.oldIndex,
2353
+ newIndex = _ref.newIndex;
2197
2354
  if (oldIndex === undefined || newIndex === undefined) return;
2198
2355
  move(oldIndex, newIndex);
2199
2356
  onUpdatelastDragOrder([oldIndex, newIndex]);
2357
+ setIsDragging(false);
2200
2358
  };
2201
2359
 
2202
- React__default.useEffect(function () {
2203
- setSortedFields(fields.map(function (_a) {
2204
- var id = _a.id;
2205
- return {
2206
- id: id,
2207
- chosen: false
2208
- };
2209
- }));
2210
- }, [fields]); // triggers validation AFTER render of new sorted elements
2360
+ var onStartDrag = function onStartDrag(_ref2) {
2361
+ var oldIndex = _ref2.oldIndex;
2362
+ return setIsDragging(oldIndex);
2363
+ }; // triggers validation AFTER render of new sorted elements
2364
+
2211
2365
 
2212
2366
  React__default.useEffect(function () {
2213
- var _a = __read(lastDragOrder, 2),
2214
- oldIndex = _a[0],
2215
- newIndex = _a[1];
2367
+ var _lastDragOrder = _slicedToArray(lastDragOrder, 2),
2368
+ oldIndex = _lastDragOrder[0],
2369
+ newIndex = _lastDragOrder[1];
2216
2370
 
2217
2371
  if (oldIndex !== null && newIndex !== null) {
2218
- // trigger validation of moved rows
2219
- var _b = __read([oldIndex, newIndex].sort(function (a, b) {
2220
- return a - b;
2221
- }), 2),
2222
- start = _b[0],
2223
- end = _b[1];
2224
-
2225
- var changedRows = getRange(start, end);
2226
- var fieldsToValidate = changedRows.reduce(function (list, rowIndex) {
2227
- var fieldsDict = getFieldNames(true, rowIndex);
2228
- var fields = Object.keys(fieldsDict).map(function (key) {
2229
- return fieldsDict[key];
2230
- });
2231
- return list.concat(fields);
2232
- }, []);
2233
- trigger(fieldsToValidate);
2372
+ // trigger validation of all fields
2373
+ trigger();
2234
2374
  }
2235
- }, [lastDragOrder, trigger]);
2375
+ }, [lastDragOrder, trigger]); // trigger onFormBlur AFTER render of new sorted elements so the TAC gets updated
2376
+
2377
+ React__default.useEffect(function () {
2378
+ var _lastDragOrder2 = _slicedToArray(lastDragOrder, 2),
2379
+ oldIndex = _lastDragOrder2[0],
2380
+ newIndex = _lastDragOrder2[1];
2381
+
2382
+ if (oldIndex !== null && newIndex !== null) {
2383
+ onFormBlur();
2384
+ } // eslint-disable-next-line react-hooks/exhaustive-deps
2385
+
2386
+ }, [lastDragOrder]);
2236
2387
  return {
2237
2388
  onChangeOrder: onChangeOrder,
2238
- sortedFields: sortedFields,
2239
- setSortedFields: setSortedFields
2389
+ activeDraggingIndex: activeDraggingIndex,
2390
+ onStartDrag: onStartDrag
2240
2391
  };
2241
2392
  }; // dialog utils
2242
2393
 
@@ -2370,7 +2521,7 @@ var getDisplayValue = function getDisplayValue(value, disabled) {
2370
2521
  };
2371
2522
  var BaseTextField = /*#__PURE__*/React__default.memo(function (props) {
2372
2523
  var classes = useStyles$9();
2373
- return /*#__PURE__*/React__default.createElement(TextField, __assign({
2524
+ return /*#__PURE__*/React__default.createElement(TextField, Object.assign({
2374
2525
  type: "text",
2375
2526
  variant: "filled",
2376
2527
  InputProps: {
@@ -2389,48 +2540,49 @@ var BaseTextField = /*#__PURE__*/React__default.memo(function (props) {
2389
2540
  return prevProps.value === nextProps.value && prevProps.error === nextProps.error && prevProps.name === nextProps.name;
2390
2541
  });
2391
2542
 
2392
- var TafFormTextField = function TafFormTextField(_a) {
2393
- var label = _a.label,
2394
- _b = _a.disabled,
2395
- disabled = _b === void 0 ? false : _b,
2396
- _c = _a.name,
2397
- name = _c === void 0 ? '' : _c,
2398
- _d = _a.onChange,
2399
- onChange = _d === void 0 ? function () {} : _d,
2400
- _e = _a.onBlur,
2401
- onBlur = _e === void 0 ? function () {} : _e,
2402
- _f = _a.defaultValue,
2403
- defaultValue = _f === void 0 ? '' : _f,
2404
- _g = _a.formatter,
2405
- formatter = _g === void 0 ? null : _g,
2406
- rules = _a.rules,
2407
- _h = _a.autoComplete,
2408
- autoComplete = _h === void 0 ? [] : _h,
2409
- _j = _a.autoFocus,
2410
- autoFocus = _j === void 0 ? false : _j;
2543
+ var TafFormTextField = function TafFormTextField(_ref) {
2544
+ var label = _ref.label,
2545
+ _ref$disabled = _ref.disabled,
2546
+ disabled = _ref$disabled === void 0 ? false : _ref$disabled,
2547
+ _ref$name = _ref.name,
2548
+ name = _ref$name === void 0 ? '' : _ref$name,
2549
+ _ref$onChange = _ref.onChange,
2550
+ onChange = _ref$onChange === void 0 ? function () {} : _ref$onChange,
2551
+ _ref$onBlur = _ref.onBlur,
2552
+ onBlur = _ref$onBlur === void 0 ? function () {} : _ref$onBlur,
2553
+ _ref$defaultValue = _ref.defaultValue,
2554
+ defaultValue = _ref$defaultValue === void 0 ? '' : _ref$defaultValue,
2555
+ _ref$formatter = _ref.formatter,
2556
+ formatter = _ref$formatter === void 0 ? null : _ref$formatter,
2557
+ rules = _ref.rules,
2558
+ _ref$autoComplete = _ref.autoComplete,
2559
+ autoComplete = _ref$autoComplete === void 0 ? [] : _ref$autoComplete,
2560
+ _ref$autoFocus = _ref.autoFocus,
2561
+ autoFocus = _ref$autoFocus === void 0 ? false : _ref$autoFocus;
2411
2562
  var classes = useStyles$9();
2412
2563
 
2413
- var _k = useFormContext(),
2414
- control = _k.control,
2415
- getValues = _k.getValues,
2416
- setValue = _k.setValue,
2417
- errors = _k.errors;
2564
+ var _useFormContext = useFormContext(),
2565
+ control = _useFormContext.control,
2566
+ getValues = _useFormContext.getValues,
2567
+ setValue = _useFormContext.setValue,
2568
+ errors = _useFormContext.errors;
2418
2569
 
2419
2570
  var inputRef = React__default.useRef(null);
2420
2571
  var fieldErrors = getTafErrors(name, errors);
2421
2572
 
2422
- var _l = __read(React__default.useState(null), 2),
2423
- maxLength = _l[0],
2424
- setMaxLength = _l[1];
2573
+ var _React$useState = React__default.useState(null),
2574
+ _React$useState2 = _slicedToArray(_React$useState, 2),
2575
+ maxLength = _React$useState2[0],
2576
+ setMaxLength = _React$useState2[1];
2425
2577
 
2426
2578
  var onKeyDown = React__default.useCallback(function (event) {
2427
2579
  var currentValue = getValues(name).toString();
2428
2580
  var textSelection = currentValue.substring(inputRef.current.selectionStart, inputRef.current.selectionEnd);
2429
2581
 
2430
2582
  if (autoComplete && !currentValue.length || textSelection.length && currentValue.length && textSelection === currentValue) {
2431
- var pressedKey_1 = event.key.toString().toUpperCase();
2583
+ var pressedKey = event.key.toString().toUpperCase();
2432
2584
  var foundValue = autoComplete.find(function (el) {
2433
- return el.key === pressedKey_1;
2585
+ return el.key === pressedKey;
2434
2586
  }) || null;
2435
2587
 
2436
2588
  if (foundValue) {
@@ -2574,34 +2726,37 @@ var getRequiredCrossFields = function getRequiredCrossFields(fieldNames) {
2574
2726
  };
2575
2727
 
2576
2728
  var TafFormRow = /*#__PURE__*/React__default.forwardRef(function (_a, ref) {
2577
- var _b = _a.isChangeGroup,
2578
- isChangeGroup = _b === void 0 ? false : _b,
2579
- _c = _a.disabled,
2580
- disabled = _c === void 0 ? false : _c,
2581
- _d = _a.index,
2582
- index = _d === void 0 ? -1 : _d,
2583
- _e = _a.lastRow,
2584
- lastRow = _e === void 0 ? false : _e,
2729
+ var _a$isChangeGroup = _a.isChangeGroup,
2730
+ isChangeGroup = _a$isChangeGroup === void 0 ? false : _a$isChangeGroup,
2731
+ _a$disabled = _a.disabled,
2732
+ disabled = _a$disabled === void 0 ? false : _a$disabled,
2733
+ _a$index = _a.index,
2734
+ index = _a$index === void 0 ? -1 : _a$index,
2735
+ _a$lastRow = _a.lastRow,
2736
+ lastRow = _a$lastRow === void 0 ? false : _a$lastRow,
2585
2737
  onRemoveChangeGroup = _a.onRemoveChangeGroup,
2586
- _f = _a.field,
2587
- field = _f === void 0 ? null : _f,
2588
- _g = _a.dragHandle,
2589
- dragHandle = _g === void 0 ? null : _g,
2738
+ _a$field = _a.field,
2739
+ field = _a$field === void 0 ? null : _a$field,
2740
+ _a$dragHandle = _a.dragHandle,
2741
+ dragHandle = _a$dragHandle === void 0 ? null : _a$dragHandle,
2590
2742
  props = __rest(_a, ["isChangeGroup", "disabled", "index", "lastRow", "onRemoveChangeGroup", "field", "dragHandle"]);
2591
2743
 
2592
- var namePrefix = !isChangeGroup ? 'baseForecast' : "changeGroups[" + index + "]";
2744
+ var namePrefix = !isChangeGroup ? 'baseForecast' : "changeGroups[".concat(index, "]");
2593
2745
  var fieldNames = getFieldNames(isChangeGroup, index);
2594
2746
 
2595
- var _h = useFormContext(),
2596
- getValues = _h.getValues,
2597
- trigger = _h.trigger;
2747
+ var _useFormContext = useFormContext(),
2748
+ getValues = _useFormContext.getValues,
2749
+ trigger = _useFormContext.trigger;
2750
+
2751
+ var _useDraftFormHelpers = useDraftFormHelpers(),
2752
+ isNotRequiredForAction = _useDraftFormHelpers.isRequired; // cross-field required validation
2598
2753
 
2599
- var isNotRequiredForAction = useDraftFormHelpers().isRequired; // cross-field required validation
2600
2754
 
2601
- var _j = __read(getRequiredCrossFields(fieldNames), 3),
2602
- mainFields = _j[0],
2603
- mainOptionalFields = _j[1],
2604
- subFields = _j[2];
2755
+ var _getRequiredCrossFiel = getRequiredCrossFields(fieldNames),
2756
+ _getRequiredCrossFiel2 = _slicedToArray(_getRequiredCrossFiel, 3),
2757
+ mainFields = _getRequiredCrossFiel2[0],
2758
+ mainOptionalFields = _getRequiredCrossFiel2[1],
2759
+ subFields = _getRequiredCrossFiel2[2];
2605
2760
 
2606
2761
  var hasFieldsValue = function hasFieldsValue(fields) {
2607
2762
  return fields.map(getValues).find(function (field) {
@@ -2626,8 +2781,8 @@ var TafFormRow = /*#__PURE__*/React__default.forwardRef(function (_a, ref) {
2626
2781
 
2627
2782
 
2628
2783
  var _validateRequiredMainFields = function validateRequiredMainFields(value, fieldName) {
2629
- var changeField = getValues(namePrefix + ".change");
2630
- var visibilityField = getValues(namePrefix + ".visibility");
2784
+ var changeField = getValues("".concat(namePrefix, ".change"));
2785
+ var visibilityField = getValues("".concat(namePrefix, ".visibility"));
2631
2786
  var isFM = changeField && changeField.trim() === 'FM';
2632
2787
  var isCAVOK = visibilityField && visibilityField.trim() === 'CAVOK';
2633
2788
 
@@ -2643,15 +2798,37 @@ var TafFormRow = /*#__PURE__*/React__default.forwardRef(function (_a, ref) {
2643
2798
  return true;
2644
2799
  }
2645
2800
 
2646
- return fieldName + " is required";
2801
+ return "".concat(fieldName, " is required");
2647
2802
  }
2648
2803
  }
2649
2804
 
2650
2805
  return true;
2651
2806
  };
2652
2807
 
2653
- return /*#__PURE__*/React__default.createElement(Grid, __assign({
2654
- "data-testid": "row-" + namePrefix,
2808
+ var validatePreviousRow = React__default.useCallback(function () {
2809
+ if (isChangeGroup && index > 0) {
2810
+ var _getValues = getValues(),
2811
+ validDateEnd = _getValues.validDateEnd,
2812
+ validDateStart = _getValues.validDateStart,
2813
+ changeGroups = _getValues.changeGroups;
2814
+
2815
+ var currentChangeGroup = changeGroups[index];
2816
+ var previousChangeGroup = changeGroups[index - 1];
2817
+ return validatePreviousChangeGroup(currentChangeGroup, previousChangeGroup, validDateStart, validDateEnd);
2818
+ }
2819
+
2820
+ return true;
2821
+ }, [index, isChangeGroup, getValues]);
2822
+
2823
+ var getFieldFromNextRow = function getFieldFromNextRow() {
2824
+ var fieldname = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'valid';
2825
+ var nextValidFieldName = "changeGroups[".concat(index + 1, "].").concat(fieldname);
2826
+ var nextRowValidValue = getValues(nextValidFieldName);
2827
+ return nextRowValidValue ? [nextValidFieldName] : [];
2828
+ };
2829
+
2830
+ return /*#__PURE__*/React__default.createElement(Grid, Object.assign({
2831
+ "data-testid": "row-".concat(namePrefix),
2655
2832
  container: true,
2656
2833
  ref: ref
2657
2834
  }, props), !isChangeGroup && /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement(TafFormTextField, {
@@ -2693,7 +2870,8 @@ var TafFormRow = /*#__PURE__*/React__default.forwardRef(function (_a, ref) {
2693
2870
  }],
2694
2871
  onBlur: function onBlur() {
2695
2872
  if (isChangeGroup) {
2696
- trigger(__spreadArray(__spreadArray(__spreadArray([], __read(subFields)), __read(mainOptionalFields)), __read(mainFields)));
2873
+ var nextValidFieldName = getFieldFromNextRow();
2874
+ trigger([].concat(_toConsumableArray(subFields), _toConsumableArray(mainOptionalFields), _toConsumableArray(mainFields), _toConsumableArray(nextValidFieldName)));
2697
2875
  }
2698
2876
  }
2699
2877
  }), /*#__PURE__*/React__default.createElement(TafFormTextField, {
@@ -2722,7 +2900,8 @@ var TafFormRow = /*#__PURE__*/React__default.forwardRef(function (_a, ref) {
2722
2900
  }],
2723
2901
  onBlur: function onBlur() {
2724
2902
  if (isChangeGroup) {
2725
- trigger(__spreadArray(__spreadArray(__spreadArray([], __read(subFields)), __read(mainOptionalFields)), __read(mainFields)));
2903
+ var nextValidFieldName = getFieldFromNextRow();
2904
+ trigger([].concat(_toConsumableArray(subFields), _toConsumableArray(mainOptionalFields), _toConsumableArray(mainFields), _toConsumableArray(nextValidFieldName)));
2726
2905
  }
2727
2906
  }
2728
2907
  })), /*#__PURE__*/React__default.createElement(TafFormTextField, {
@@ -2739,12 +2918,14 @@ var TafFormRow = /*#__PURE__*/React__default.forwardRef(function (_a, ref) {
2739
2918
  },
2740
2919
  validateValidChangeGroupInterField: function validateValidChangeGroupInterField$1(value) {
2741
2920
  return isChangeGroup ? validateValidChangeGroupInterField(value, getValues(fieldNames.change), getValues('validDateStart'), getValues('validDateEnd')) : true;
2742
- }
2921
+ },
2922
+ validatePreviousRow: validatePreviousRow
2743
2923
  }
2744
2924
  },
2745
2925
  onBlur: function onBlur() {
2746
2926
  if (isChangeGroup) {
2747
- trigger(__spreadArray(__spreadArray(__spreadArray([], __read(subFields)), __read(mainOptionalFields)), __read(mainFields)));
2927
+ var nextValidFieldName = getFieldFromNextRow();
2928
+ trigger([].concat(_toConsumableArray(subFields), _toConsumableArray(mainOptionalFields), _toConsumableArray(mainFields), _toConsumableArray(nextValidFieldName)));
2748
2929
  }
2749
2930
  }
2750
2931
  }), /*#__PURE__*/React__default.createElement(TafFormTextField, {
@@ -2763,7 +2944,7 @@ var TafFormRow = /*#__PURE__*/React__default.forwardRef(function (_a, ref) {
2763
2944
  },
2764
2945
  onBlur: function onBlur() {
2765
2946
  if (isChangeGroup) {
2766
- trigger(__spreadArray(__spreadArray([], __read(subFields)), __read(mainFields)));
2947
+ trigger([].concat(_toConsumableArray(subFields), _toConsumableArray(mainFields)));
2767
2948
  }
2768
2949
  },
2769
2950
  autoFocus: !isChangeGroup
@@ -2786,7 +2967,8 @@ var TafFormRow = /*#__PURE__*/React__default.forwardRef(function (_a, ref) {
2786
2967
  value: 'CAVOK'
2787
2968
  }],
2788
2969
  onBlur: function onBlur() {
2789
- trigger(isChangeGroup ? __spreadArray(__spreadArray([], __read(subFields)), __read(mainFields)) : subFields);
2970
+ var fields = isChangeGroup ? [].concat(_toConsumableArray(subFields), _toConsumableArray(mainFields)) : subFields;
2971
+ trigger([].concat(_toConsumableArray(fields), [fieldNames.weather1, fieldNames.weather2, fieldNames.weather3]));
2790
2972
  }
2791
2973
  }), /*#__PURE__*/React__default.createElement(TafFormTextField, {
2792
2974
  label: "Weather",
@@ -2805,8 +2987,8 @@ var TafFormRow = /*#__PURE__*/React__default.forwardRef(function (_a, ref) {
2805
2987
  }
2806
2988
  },
2807
2989
  onBlur: function onBlur() {
2808
- var fields = isChangeGroup ? __spreadArray(__spreadArray([], __read(subFields)), __read(mainFields)) : [];
2809
- return trigger(__spreadArray(__spreadArray([], __read(fields)), [fieldNames.weather2, fieldNames.weather3]));
2990
+ var fields = isChangeGroup ? [].concat(_toConsumableArray(subFields), _toConsumableArray(mainFields)) : [];
2991
+ return trigger([].concat(_toConsumableArray(fields), [fieldNames.weather2, fieldNames.weather3]));
2810
2992
  }
2811
2993
  }), /*#__PURE__*/React__default.createElement(TafFormTextField, {
2812
2994
  label: "Weather",
@@ -2821,8 +3003,8 @@ var TafFormRow = /*#__PURE__*/React__default.forwardRef(function (_a, ref) {
2821
3003
  }
2822
3004
  },
2823
3005
  onBlur: function onBlur() {
2824
- var fields = isChangeGroup ? __spreadArray(__spreadArray([], __read(subFields)), __read(mainFields)) : [];
2825
- return trigger(__spreadArray(__spreadArray([], __read(fields)), [fieldNames.weather3]));
3006
+ var fields = isChangeGroup ? [].concat(_toConsumableArray(subFields), _toConsumableArray(mainFields)) : [];
3007
+ return trigger([].concat(_toConsumableArray(fields), [fieldNames.weather3]));
2826
3008
  }
2827
3009
  }), /*#__PURE__*/React__default.createElement(TafFormTextField, {
2828
3010
  label: "Weather",
@@ -2853,8 +3035,8 @@ var TafFormRow = /*#__PURE__*/React__default.forwardRef(function (_a, ref) {
2853
3035
  }
2854
3036
  },
2855
3037
  onBlur: function onBlur() {
2856
- var fields = isChangeGroup ? __spreadArray(__spreadArray([], __read(subFields)), __read(mainFields)) : [];
2857
- return trigger(__spreadArray(__spreadArray([], __read(fields)), [fieldNames.cloud2, fieldNames.cloud3, fieldNames.cloud4]));
3038
+ var fields = isChangeGroup ? [].concat(_toConsumableArray(subFields), _toConsumableArray(mainFields)) : [];
3039
+ return trigger([].concat(_toConsumableArray(fields), [fieldNames.cloud2, fieldNames.cloud3, fieldNames.cloud4]));
2858
3040
  }
2859
3041
  }), /*#__PURE__*/React__default.createElement(TafFormTextField, {
2860
3042
  label: "Cloud",
@@ -2904,7 +3086,7 @@ var TafFormRow = /*#__PURE__*/React__default.forwardRef(function (_a, ref) {
2904
3086
  }), isChangeGroup && !disabled && /*#__PURE__*/React__default.createElement(Grid, {
2905
3087
  item: true,
2906
3088
  xs: true
2907
- }, /*#__PURE__*/React__default.createElement(IconButton, __assign({
3089
+ }, /*#__PURE__*/React__default.createElement(IconButton, Object.assign({
2908
3090
  "aria-label": "delete",
2909
3091
  "data-testid": "remove-changeGroup",
2910
3092
  onClick: function onClick() {
@@ -2915,6 +3097,23 @@ var TafFormRow = /*#__PURE__*/React__default.forwardRef(function (_a, ref) {
2915
3097
  } : {}), /*#__PURE__*/React__default.createElement(Delete, null))));
2916
3098
  });
2917
3099
 
3100
+ /* *
3101
+ * Licensed under the Apache License, Version 2.0 (the "License");
3102
+ * you may not use this file except in compliance with the License.
3103
+ * You may obtain a copy of the License at
3104
+ *
3105
+ * http://www.apache.org/licenses/LICENSE-2.0
3106
+ *
3107
+ * Unless required by applicable law or agreed to in writing, software
3108
+ * distributed under the License is distributed on an "AS IS" BASIS,
3109
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
3110
+ * See the License for the specific language governing permissions and
3111
+ * limitations under the License.
3112
+ *
3113
+ * Copyright 2021 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
3114
+ * Copyright 2021 - Finnish Meteorological Institute (FMI)
3115
+ * */
3116
+
2918
3117
  var getIssuesLabel = function getIssuesLabel(sumOfErrors) {
2919
3118
  switch (sumOfErrors) {
2920
3119
  case 0:
@@ -2924,7 +3123,7 @@ var getIssuesLabel = function getIssuesLabel(sumOfErrors) {
2924
3123
  return '1 issue';
2925
3124
 
2926
3125
  default:
2927
- return sumOfErrors + " issues";
3126
+ return "".concat(sumOfErrors, " issues");
2928
3127
  }
2929
3128
  };
2930
3129
 
@@ -2948,9 +3147,9 @@ var buttonStyle = function buttonStyle(color) {
2948
3147
  };
2949
3148
  };
2950
3149
 
2951
- var IssuesButton = function IssuesButton(_a) {
2952
- var togglePane = _a.togglePane,
2953
- sumOfErrors = _a.sumOfErrors;
3150
+ var IssuesButton = function IssuesButton(_ref) {
3151
+ var togglePane = _ref.togglePane,
3152
+ sumOfErrors = _ref.sumOfErrors;
2954
3153
  var color = sumOfErrors > 0 ? 'red' : 'green';
2955
3154
  return /*#__PURE__*/React.createElement(Tooltip, {
2956
3155
  title: "View details"
@@ -2958,13 +3157,29 @@ var IssuesButton = function IssuesButton(_a) {
2958
3157
  "data-testid": "issuesButton",
2959
3158
  size: "small",
2960
3159
  label: getIssuesLabel(sumOfErrors),
2961
- style: __assign({}, buttonStyle(color)),
3160
+ style: Object.assign({}, buttonStyle(color)),
2962
3161
  onClick: togglePane
2963
3162
  }));
2964
3163
  };
2965
3164
 
3165
+ /* *
3166
+ * Licensed under the Apache License, Version 2.0 (the "License");
3167
+ * you may not use this file except in compliance with the License.
3168
+ * You may obtain a copy of the License at
3169
+ *
3170
+ * http://www.apache.org/licenses/LICENSE-2.0
3171
+ *
3172
+ * Unless required by applicable law or agreed to in writing, software
3173
+ * distributed under the License is distributed on an "AS IS" BASIS,
3174
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
3175
+ * See the License for the specific language governing permissions and
3176
+ * limitations under the License.
3177
+ *
3178
+ * Copyright 2021 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
3179
+ * Copyright 2021 - Finnish Meteorological Institute (FMI)
3180
+ * */
2966
3181
  var ThumbsUp = function ThumbsUp(props) {
2967
- return /*#__PURE__*/React__default.createElement(SvgIcon, __assign({
3182
+ return /*#__PURE__*/React__default.createElement(SvgIcon, Object.assign({
2968
3183
  fontSize: "inherit",
2969
3184
  viewBox: "0 0 58 69"
2970
3185
  }, props), /*#__PURE__*/React__default.createElement("title", null, "Thumbs up"), /*#__PURE__*/React__default.createElement("g", {
@@ -3037,10 +3252,10 @@ var getErrorDefaultMessage = function getErrorDefaultMessage(error) {
3037
3252
  }
3038
3253
  };
3039
3254
 
3040
- var capitalizeWord = function capitalizeWord(_a) {
3041
- var _b = __read(_a),
3042
- firstLetter = _b[0],
3043
- restOfWord = _b.slice(1);
3255
+ var capitalizeWord = function capitalizeWord(_ref) {
3256
+ var _ref2 = _toArray(_ref),
3257
+ firstLetter = _ref2[0],
3258
+ restOfWord = _ref2.slice(1);
3044
3259
 
3045
3260
  return firstLetter.toUpperCase() + restOfWord.join('');
3046
3261
  };
@@ -3048,19 +3263,20 @@ var humanizeErrorMessage = function humanizeErrorMessage(nameAsString) {
3048
3263
  var nameWithoutBrackets = nameAsString.replace(/[[\]']+/g, '');
3049
3264
  var nameLowerCase = nameWithoutBrackets.toLowerCase();
3050
3265
 
3051
- var _a = __read(nameLowerCase.split(/([0-9]+)/) // split numbers from field and build array
3266
+ var _nameLowerCase$split$ = nameLowerCase.split(/([0-9]+)/) // split numbers from field and build array
3052
3267
  .filter(function (s) {
3053
3268
  return s.length;
3054
- }), 2),
3055
- fieldName = _a[0],
3056
- fieldNumberedValue = _a[1];
3269
+ }),
3270
+ _nameLowerCase$split$2 = _slicedToArray(_nameLowerCase$split$, 2),
3271
+ fieldName = _nameLowerCase$split$2[0],
3272
+ fieldNumberedValue = _nameLowerCase$split$2[1];
3057
3273
 
3058
3274
  var nameCapitalized = capitalizeWord(fieldName);
3059
3275
 
3060
3276
  if (fieldNumberedValue) {
3061
3277
  // when name contains a number we assume it's a formgroup and we add a index +1 for human readability
3062
3278
  var fieldNumber = parseInt(fieldNumberedValue, 10) + 1;
3063
- return nameCapitalized + " " + fieldNumber;
3279
+ return "".concat(nameCapitalized, " ").concat(fieldNumber);
3064
3280
  }
3065
3281
 
3066
3282
  return nameCapitalized;
@@ -3068,18 +3284,19 @@ var humanizeErrorMessage = function humanizeErrorMessage(nameAsString) {
3068
3284
  var getErrorMessage = function getErrorMessage(error, index) {
3069
3285
  var name = error.ref.name;
3070
3286
 
3071
- var _a = __read(name.split('.'), 1),
3072
- firstNamePart = _a[0];
3287
+ var _name$split = name.split('.'),
3288
+ _name$split2 = _slicedToArray(_name$split, 1),
3289
+ firstNamePart = _name$split2[0];
3073
3290
 
3074
3291
  var fieldErrorTitle = humanizeErrorMessage(firstNamePart);
3075
- return index + 1 + ". " + fieldErrorTitle + ": " + getErrorDefaultMessage(error);
3292
+ return "".concat(index + 1, ". ").concat(fieldErrorTitle, ": ").concat(getErrorDefaultMessage(error));
3076
3293
  };
3077
3294
 
3078
- var IssuesPane = function IssuesPane(_a) {
3079
- var isOpen = _a.isOpen,
3080
- handleClose = _a.handleClose,
3081
- _b = _a.errorList,
3082
- errorList = _b === void 0 ? [] : _b;
3295
+ var IssuesPane = function IssuesPane(_ref3) {
3296
+ var isOpen = _ref3.isOpen,
3297
+ handleClose = _ref3.handleClose,
3298
+ _ref3$errorList = _ref3.errorList,
3299
+ errorList = _ref3$errorList === void 0 ? [] : _ref3$errorList;
3083
3300
  var classes = useStyles$8();
3084
3301
  return /*#__PURE__*/React.createElement(ToolContainerDraggable, {
3085
3302
  startSize: {
@@ -3106,7 +3323,7 @@ var IssuesPane = function IssuesPane(_a) {
3106
3323
  return /*#__PURE__*/React.createElement(Typography // eslint-disable-next-line react/no-array-index-key
3107
3324
  , {
3108
3325
  // eslint-disable-next-line react/no-array-index-key
3109
- key: "message-" + index,
3326
+ key: "message-".concat(index),
3110
3327
  variant: "body1",
3111
3328
  "data-testid": "errorMessage"
3112
3329
  }, getErrorMessage(error, index));
@@ -3118,7 +3335,7 @@ var getCustomError = function getCustomError(error) {
3118
3335
  var isChangeGroup = name.includes('changeGroups');
3119
3336
  var matchRowNumber = name.match(/\[(.*?)\]/);
3120
3337
  var row = matchRowNumber ? parseInt(matchRowNumber[1], 10) : null;
3121
- return __assign(__assign({}, error), {
3338
+ return Object.assign(Object.assign({}, error), {
3122
3339
  isChangeGroup: isChangeGroup,
3123
3340
  row: row
3124
3341
  });
@@ -3127,7 +3344,7 @@ var getCustomError = function getCustomError(error) {
3127
3344
  var getErrorValues = function getErrorValues(fieldErrors) {
3128
3345
  if (!fieldErrors) return [];
3129
3346
  return Object.keys(fieldErrors).reduce(function (list, key) {
3130
- var error = __assign({}, fieldErrors[key]);
3347
+ var error = Object.assign({}, fieldErrors[key]);
3131
3348
 
3132
3349
  if (error.ref) {
3133
3350
  return list.concat(getCustomError(error));
@@ -3145,7 +3362,7 @@ var getErrors = function getErrors(errors) {
3145
3362
  var errorValues = errorValue.reduce(function (l, i) {
3146
3363
  return l.concat(getErrorValues(i));
3147
3364
  }, []);
3148
- return list.concat.apply(list, __spreadArray([], __read(errorValues)));
3365
+ return list.concat.apply(list, _toConsumableArray(errorValues));
3149
3366
  }
3150
3367
 
3151
3368
  return list.concat(getErrorValues(errorValue));
@@ -3164,26 +3381,31 @@ var filterDuplicateErrors = function filterDuplicateErrors(errors) {
3164
3381
  }
3165
3382
 
3166
3383
  if (error.type === 'validateRequiredMainOptional') {
3167
- var exist = list.find(function (e) {
3384
+ var _exist = list.find(function (e) {
3168
3385
  return e.type === 'validateRequiredMainOptional' && e.row === error.row;
3169
3386
  });
3170
- return exist ? list : list.concat(error);
3387
+
3388
+ return _exist ? list : list.concat(error);
3171
3389
  }
3172
3390
 
3173
3391
  return list.concat(error);
3174
3392
  }, []);
3175
3393
  };
3176
3394
 
3177
- var TafFormButtons = function TafFormButtons(_a) {
3178
- var tafAction = _a.tafAction,
3179
- onTafFormButtonPress = _a.onTafFormButtonPress;
3395
+ var TafFormButtons = function TafFormButtons(_ref) {
3396
+ var tafAction = _ref.tafAction,
3397
+ onTafFormButtonPress = _ref.onTafFormButtonPress;
3180
3398
  var classes = useStyles$9();
3181
- var errors = useFormContext().errors;
3399
+
3400
+ var _useFormContext = useFormContext(),
3401
+ errors = _useFormContext.errors;
3402
+
3182
3403
  var errorList = filterDuplicateErrors(getErrors(errors));
3183
3404
 
3184
- var _b = __read(React__default.useState(false), 2),
3185
- isIssuesPaneOpen = _b[0],
3186
- setIsIssuesPaneOpen = _b[1];
3405
+ var _React$useState = React__default.useState(false),
3406
+ _React$useState2 = _slicedToArray(_React$useState, 2),
3407
+ isIssuesPaneOpen = _React$useState2[0],
3408
+ setIsIssuesPaneOpen = _React$useState2[1];
3187
3409
 
3188
3410
  var toggleIssuesPane = function toggleIssuesPane() {
3189
3411
  return setIsIssuesPaneOpen(!isIssuesPaneOpen);
@@ -3308,22 +3530,24 @@ var useStyles$7 = makeStyles(function () {
3308
3530
  };
3309
3531
  });
3310
3532
 
3311
- var DragHandle = function DragHandle(_a) {
3312
- var _b = _a.isSorting,
3313
- isSorting = _b === void 0 ? false : _b,
3314
- _c = _a.isDisabled,
3315
- isDisabled = _c === void 0 ? false : _c,
3316
- index = _a.index;
3533
+ var DragHandle = function DragHandle(_ref) {
3534
+ var _ref$isSorting = _ref.isSorting,
3535
+ isSorting = _ref$isSorting === void 0 ? false : _ref$isSorting,
3536
+ _ref$isDisabled = _ref.isDisabled,
3537
+ isDisabled = _ref$isDisabled === void 0 ? false : _ref$isDisabled,
3538
+ index = _ref.index;
3317
3539
  var classes = useStyles$7(isSorting);
3318
3540
  return /*#__PURE__*/React__default.createElement(IconButton, {
3319
- className: classes.dragHandle + " handle",
3320
- "data-testid": "dragHandle-" + index,
3541
+ className: "".concat(classes.dragHandle, " handle"),
3542
+ "data-testid": "dragHandle-".concat(index),
3321
3543
  disableRipple: true,
3322
3544
  disabled: isDisabled
3323
3545
  }, /*#__PURE__*/React__default.createElement(DragIndicator, null));
3324
3546
  };
3325
3547
 
3326
- var emptyRow = {
3548
+ var noop = function noop() {};
3549
+
3550
+ var emptyChangegroup = {
3327
3551
  valid: '',
3328
3552
  wind: '',
3329
3553
  visibility: '',
@@ -3342,74 +3566,71 @@ var emptyRow = {
3342
3566
  probability: null
3343
3567
  };
3344
3568
 
3345
- var TafForm = function TafForm(_a) {
3346
- var mode = _a.mode,
3347
- changeGroups = _a.changeGroups,
3348
- tafAction = _a.tafAction,
3349
- _b = _a.staticTAC,
3350
- staticTAC = _b === void 0 ? '' : _b,
3351
- _c = _a.onFormAction,
3352
- onFormAction = _c === void 0 ? function () {
3569
+ var TafForm = function TafForm(_ref) {
3570
+ var isDisabled = _ref.isDisabled,
3571
+ tafAction = _ref.tafAction,
3572
+ _ref$staticTAC = _ref.staticTAC,
3573
+ staticTAC = _ref$staticTAC === void 0 ? '' : _ref$staticTAC,
3574
+ _ref$onFormAction = _ref.onFormAction,
3575
+ onFormAction = _ref$onFormAction === void 0 ? function () {
3353
3576
  return null;
3354
- } : _c;
3577
+ } : _ref$onFormAction;
3355
3578
  var classes = useStyles$9();
3356
3579
  var confirmDialog = useConfirmationDialog();
3357
3580
 
3358
- var _d = useDraftFormHelpers(),
3359
- toggleIsDraft = _d.toggleIsDraft,
3360
- DraftFieldHelper = _d.DraftFieldHelper;
3581
+ var _useDraftFormHelpers = useDraftFormHelpers(),
3582
+ toggleIsDraft = _useDraftFormHelpers.toggleIsDraft,
3583
+ DraftFieldHelper = _useDraftFormHelpers.DraftFieldHelper;
3361
3584
 
3362
- var api = useApiContext().api;
3363
- var isMounted = useIsMounted().isMounted;
3364
- var isDisabled = mode === 'view';
3585
+ var _useApiContext = useApiContext(),
3586
+ api = _useApiContext.api;
3365
3587
 
3366
- var _e = useFormContext(),
3367
- control = _e.control,
3368
- handleSubmit = _e.handleSubmit,
3369
- watch = _e.watch,
3370
- getValues = _e.getValues,
3371
- errors = _e.errors,
3372
- trigger = _e.trigger;
3588
+ var _useIsMounted = useIsMounted(),
3589
+ isMounted = _useIsMounted.isMounted;
3373
3590
 
3374
- var hiddenInputFields = ['baseTime', 'issueDate', 'type', 'uuid', 'validDateStart', 'validDateEnd', 'status', 'previousId', 'previousValidDateStart', 'previousValidDateEnd'];
3591
+ var _useFormContext = useFormContext(),
3592
+ control = _useFormContext.control,
3593
+ handleSubmit = _useFormContext.handleSubmit,
3594
+ watch = _useFormContext.watch,
3595
+ trigger = _useFormContext.trigger,
3596
+ formState = _useFormContext.formState,
3597
+ getValues = _useFormContext.getValues;
3375
3598
 
3376
- var _f = __read(React__default.useState(watch()), 2),
3377
- delayedFormValues = _f[0],
3378
- setDelayedFormValues = _f[1];
3599
+ var isFormDirty = formState.isDirty,
3600
+ errors = formState.errors;
3601
+ usePreventBrowserClose(isFormDirty && !isDisabled);
3602
+ var hiddenInputFields = ['baseTime', 'issueDate', 'type', 'uuid', 'validDateStart', 'validDateEnd', 'status', 'previousId', 'previousValidDateStart', 'previousValidDateEnd'];
3379
3603
 
3380
- var _g = __read(useTACGenerator(convertTafValuesToObject(delayedFormValues), api.getTAC, staticTAC), 2),
3381
- TAC = _g[0],
3382
- updateTAC = _g[1];
3604
+ var _React$useState = React__default.useState(watch()),
3605
+ _React$useState2 = _slicedToArray(_React$useState, 2),
3606
+ delayedFormValues = _React$useState2[0],
3607
+ setDelayedFormValues = _React$useState2[1];
3383
3608
 
3384
- React__default.useEffect(function () {
3385
- if (!Object.keys(errors).length && staticTAC === '' && isMounted.current) {
3386
- updateTAC(convertTafValuesToObject(delayedFormValues));
3387
- } // eslint-disable-next-line react-hooks/exhaustive-deps
3609
+ var _useTACGenerator = useTACGenerator(convertTafValuesToObject(delayedFormValues), api.getTAC, staticTAC),
3610
+ _useTACGenerator2 = _slicedToArray(_useTACGenerator, 2),
3611
+ TAC = _useTACGenerator2[0],
3612
+ updateTAC = _useTACGenerator2[1];
3388
3613
 
3389
- }, [delayedFormValues]);
3614
+ var hasErrors = Object.keys(errors).length;
3390
3615
 
3391
3616
  var onFormBlur = function onFormBlur() {
3392
3617
  setDelayedFormValues(getValues());
3393
3618
  };
3394
3619
 
3395
- var _h = __read(React__default.useState(false), 2),
3396
- isFormDirty = _h[0],
3397
- setFormDirty = _h[1];
3398
-
3399
- var onFormChange = function onFormChange() {
3400
- return !isFormDirty ? setFormDirty(true) : null;
3401
- };
3620
+ React__default.useEffect(function () {
3621
+ if (staticTAC === '' && isMounted.current && isFormDirty) {
3622
+ var newTAC = hasErrors ? null : convertTafValuesToObject(delayedFormValues);
3623
+ updateTAC(newTAC);
3624
+ } // eslint-disable-next-line react-hooks/exhaustive-deps
3402
3625
 
3403
- usePreventBrowserClose(isFormDirty && !isDisabled);
3626
+ }, [delayedFormValues]);
3627
+ React__default.useEffect(function () {
3628
+ // prevent updating an error while typing
3629
+ if (!hasErrors && isFormDirty && document.activeElement.tagName !== 'INPUT') {
3630
+ updateTAC(convertTafValuesToObject(delayedFormValues));
3631
+ } // eslint-disable-next-line react-hooks/exhaustive-deps
3404
3632
 
3405
- var _j = useFieldArray({
3406
- control: control,
3407
- name: 'changeGroups'
3408
- }),
3409
- fields = _j.fields,
3410
- append = _j.append,
3411
- remove = _j.remove,
3412
- move = _j.move;
3633
+ }, [hasErrors]);
3413
3634
 
3414
3635
  var onSubmit = function onSubmit(data) {
3415
3636
  // eslint-disable-next-line no-console
@@ -3463,38 +3684,39 @@ var TafForm = function TafForm(_a) {
3463
3684
  }
3464
3685
  };
3465
3686
 
3466
- var onAddRow = function onAddRow() {
3467
- append(emptyRow);
3468
- };
3469
-
3470
- React__default.useEffect(function () {
3471
- // set changegroups on mount (if no changegroups - add empty one by default)
3472
- if (changeGroups.length > 0) {
3473
- changeGroups.forEach(function (group) {
3474
- append(group, false);
3475
- });
3476
- } else if (!isDisabled) {
3477
- append(emptyRow, false);
3478
- } // eslint-disable-next-line react-hooks/exhaustive-deps
3687
+ var _useFieldArray = useFieldArray({
3688
+ control: control,
3689
+ name: 'changeGroups'
3690
+ }),
3691
+ fields = _useFieldArray.fields,
3692
+ append = _useFieldArray.append,
3693
+ remove = _useFieldArray.remove,
3694
+ move = _useFieldArray.move;
3479
3695
 
3480
- }, []);
3696
+ var lastTotalFields = usePrevious(fields.length);
3481
3697
 
3482
- var _k = useDragOrder(trigger, move, fields),
3483
- onChangeOrder = _k.onChangeOrder,
3484
- sortedFields = _k.sortedFields,
3485
- setSortedFields = _k.setSortedFields;
3698
+ var _useDragOrder = useDragOrder(trigger, move, onFormBlur),
3699
+ onChangeOrder = _useDragOrder.onChangeOrder,
3700
+ onStartDrag = _useDragOrder.onStartDrag,
3701
+ activeDraggingIndex = _useDragOrder.activeDraggingIndex;
3486
3702
 
3487
3703
  var onRemoverow = function onRemoverow(index) {
3488
3704
  remove(index);
3489
- var newList = fields.length > 1 ? fields.filter(function (_, fieldIndex) {
3490
- return fieldIndex === index;
3491
- }) : [];
3492
- setSortedFields(newList);
3493
3705
  };
3494
3706
 
3707
+ var onAddRow = function onAddRow() {
3708
+ append(emptyChangegroup, true);
3709
+ };
3710
+
3711
+ React__default.useEffect(function () {
3712
+ if (isFormDirty && fields.length !== lastTotalFields) {
3713
+ onFormBlur();
3714
+ trigger(); // trigger all field validation,
3715
+ } // eslint-disable-next-line react-hooks/exhaustive-deps
3716
+
3717
+ }, [fields.length, isFormDirty]);
3495
3718
  return /*#__PURE__*/React__default.createElement("form", {
3496
3719
  onSubmit: handleSubmit(onSubmit),
3497
- onChange: onFormChange,
3498
3720
  onBlur: onFormBlur
3499
3721
  }, /*#__PURE__*/React__default.createElement(Typography, {
3500
3722
  className: classes.tacTitle
@@ -3511,20 +3733,19 @@ var TafForm = function TafForm(_a) {
3511
3733
  disabled: isDisabled
3512
3734
  }), /*#__PURE__*/React__default.createElement(ReactSortable, {
3513
3735
  tag: "div",
3514
- list: sortedFields,
3515
- setList: setSortedFields,
3736
+ list: fields,
3737
+ setList: noop,
3516
3738
  animation: 200,
3517
3739
  onSort: onChangeOrder,
3518
3740
  handle: ".handle",
3519
3741
  direction: "vertical",
3520
3742
  // hover props
3521
3743
  forceFallback: true,
3522
- onStart: function onStart() {
3744
+ onStart: function onStart(event) {
3745
+ onStartDrag(event);
3523
3746
  Sortable.ghost.style.opacity = '1';
3524
3747
  }
3525
- }, sortedFields.map(function (_a, index) {
3526
- var chosen = _a.chosen;
3527
- var item = fields[index];
3748
+ }, fields.map(function (item, index) {
3528
3749
  return /*#__PURE__*/React__default.createElement(TafFormRow, {
3529
3750
  field: item,
3530
3751
  className: classes.formRow,
@@ -3535,8 +3756,8 @@ var TafForm = function TafForm(_a) {
3535
3756
  onRemoveChangeGroup: onRemoverow,
3536
3757
  isChangeGroup: true,
3537
3758
  dragHandle: /*#__PURE__*/React__default.createElement(DragHandle, {
3538
- isDisabled: sortedFields.length === 1 || isDisabled,
3539
- isSorting: chosen,
3759
+ isDisabled: fields.length === 1 || isDisabled,
3760
+ isSorting: activeDraggingIndex === index,
3540
3761
  index: index
3541
3762
  })
3542
3763
  });
@@ -3561,6 +3782,22 @@ var TafForm = function TafForm(_a) {
3561
3782
  }), /*#__PURE__*/React__default.createElement(DraftFieldHelper, null));
3562
3783
  };
3563
3784
 
3785
+ /* *
3786
+ * Licensed under the Apache License, Version 2.0 (the "License");
3787
+ * you may not use this file except in compliance with the License.
3788
+ * You may obtain a copy of the License at
3789
+ *
3790
+ * http://www.apache.org/licenses/LICENSE-2.0
3791
+ *
3792
+ * Unless required by applicable law or agreed to in writing, software
3793
+ * distributed under the License is distributed on an "AS IS" BASIS,
3794
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
3795
+ * See the License for the specific language governing permissions and
3796
+ * limitations under the License.
3797
+ *
3798
+ * Copyright 2021 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
3799
+ * Copyright 2021 - Finnish Meteorological Institute (FMI)
3800
+ * */
3564
3801
  var getMessageType = function getMessageType(taf, tafAction) {
3565
3802
  if (tafAction === 'CORRECT') {
3566
3803
  return 'COR';
@@ -3584,47 +3821,46 @@ var getAmendedCorrectedTafTimes = function getAmendedCorrectedTafTimes(taf, tafA
3584
3821
  start: now,
3585
3822
  end: taf.baseForecast.valid.end
3586
3823
  };
3587
- return __assign(__assign({}, taf), {
3824
+ return Object.assign(Object.assign({}, taf), {
3588
3825
  previousValidDateStart: previousValidDateStart,
3589
3826
  previousValidDateEnd: previousValidDateEnd,
3590
3827
  validDateStart: now,
3591
- baseForecast: __assign(__assign({}, taf.baseForecast), {
3828
+ baseForecast: Object.assign(Object.assign({}, taf.baseForecast), {
3592
3829
  valid: validObj
3593
3830
  })
3594
3831
  });
3595
3832
  }
3596
3833
 
3597
- return __assign(__assign({}, taf), {
3834
+ return Object.assign(Object.assign({}, taf), {
3598
3835
  previousValidDateStart: previousValidDateStart,
3599
3836
  previousValidDateEnd: previousValidDateEnd
3600
3837
  });
3601
3838
  };
3602
3839
  var prepareTafValues = function prepareTafValues(_taf, tafAction) {
3840
+ var addEmptyChangeGroup = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
3603
3841
  // If action is AMEND/CORRECT/DRAFT_AMEND/DRAFT_CORRECTION - add previous valid start and end
3604
3842
  // If action is AMEND/DRAFT_AMEND - update validity start time to current time
3605
3843
  var taf = tafAction === 'AMEND' || tafAction === 'DRAFT_AMEND' || tafAction === 'CORRECT' || tafAction === 'DRAFT_CORRECT' ? getAmendedCorrectedTafTimes(_taf, tafAction) : _taf;
3606
- return __assign(__assign(__assign({}, taf), {
3844
+ return Object.assign(Object.assign(Object.assign(Object.assign({}, taf), {
3607
3845
  messageType: getMessageType(taf, tafAction),
3608
3846
  baseForecast: formatFormValues(taf.baseForecast)
3609
3847
  }), taf.changeGroups && {
3610
3848
  changeGroups: taf.changeGroups.map(formatFormValues)
3849
+ }), addEmptyChangeGroup && {
3850
+ changeGroups: [emptyChangegroup]
3611
3851
  });
3612
3852
  };
3613
3853
 
3614
- var TafFormWrapper = function TafFormWrapper(_a) {
3615
- var tafFromBackend = _a.tafFromBackend,
3616
- mode = _a.mode,
3617
- tafAction = _a.tafAction,
3618
- _b = _a.TAC,
3619
- TAC = _b === void 0 ? '' : _b,
3620
- onFormAction = _a.onFormAction;
3621
- var taf = tafFromBackend.taf; // react-hook-form doesn't work well when setting defaultValues on dynamic list, that's why it's send seperate, and build up in the mount effect
3622
-
3623
- var _c = prepareTafValues(taf, tafAction),
3624
- _d = _c.changeGroups,
3625
- changeGroups = _d === void 0 ? [] : _d,
3626
- defaultValues = __rest(_c, ["changeGroups"]);
3627
-
3854
+ var TafFormWrapper = function TafFormWrapper(_ref) {
3855
+ var tafFromBackend = _ref.tafFromBackend,
3856
+ mode = _ref.mode,
3857
+ tafAction = _ref.tafAction,
3858
+ _ref$TAC = _ref.TAC,
3859
+ TAC = _ref$TAC === void 0 ? '' : _ref$TAC,
3860
+ onFormAction = _ref.onFormAction;
3861
+ var taf = tafFromBackend.taf;
3862
+ var isDisabled = mode === 'view';
3863
+ var defaultValues = prepareTafValues(taf, tafAction, !isDisabled && !taf.changeGroups);
3628
3864
  var options = {
3629
3865
  defaultValues: defaultValues,
3630
3866
  mode: 'onTouched',
@@ -3634,8 +3870,7 @@ var TafFormWrapper = function TafFormWrapper(_a) {
3634
3870
  return /*#__PURE__*/React__default.createElement(ReactHookFormProvider, {
3635
3871
  options: options
3636
3872
  }, /*#__PURE__*/React__default.createElement(TafForm, {
3637
- mode: mode,
3638
- changeGroups: changeGroups,
3873
+ isDisabled: isDisabled,
3639
3874
  tafAction: tafAction,
3640
3875
  staticTAC: TAC,
3641
3876
  onFormAction: onFormAction
@@ -3672,13 +3907,13 @@ var ContentDialog = function ContentDialog(_a) {
3672
3907
  var titleComponent = _a.titleComponent,
3673
3908
  children = _a.children;
3674
3909
  _a.onClose;
3675
- var _b = _a.alertBanner,
3676
- alertBanner = _b === void 0 ? null : _b,
3910
+ var _a$alertBanner = _a.alertBanner,
3911
+ alertBanner = _a$alertBanner === void 0 ? null : _a$alertBanner,
3677
3912
  onFormAction = _a.onFormAction,
3678
3913
  other = __rest(_a, ["open", "toggleDialogStatus", "titleComponent", "children", "onClose", "alertBanner", "onFormAction"]);
3679
3914
 
3680
3915
  var classes = useStyles$6();
3681
- return /*#__PURE__*/React.createElement(Dialog, __assign({
3916
+ return /*#__PURE__*/React.createElement(Dialog, Object.assign({
3682
3917
  "data-testid": "contentDialog",
3683
3918
  open: open,
3684
3919
  onClose: function onClose() {
@@ -3791,13 +4026,13 @@ var useStyles$5 = makeStyles({
3791
4026
  }
3792
4027
  });
3793
4028
 
3794
- var TafListRow = function TafListRow(_a) {
3795
- var taf = _a.taf,
3796
- listType = _a.listType,
3797
- _b = _a.TAC,
3798
- TAC = _b === void 0 ? '' : _b,
3799
- _c = _a.showTac,
3800
- showTac = _c === void 0 ? false : _c;
4029
+ var TafListRow = function TafListRow(_ref) {
4030
+ var taf = _ref.taf,
4031
+ listType = _ref.listType,
4032
+ _ref$TAC = _ref.TAC,
4033
+ TAC = _ref$TAC === void 0 ? '' : _ref$TAC,
4034
+ _ref$showTac = _ref.showTac,
4035
+ showTac = _ref$showTac === void 0 ? false : _ref$showTac;
3801
4036
  var classes = useStyles$5();
3802
4037
  var validTimeDate = moment.utc(taf.validDateStart).format('DD MMM');
3803
4038
  var baseTime = moment.utc(taf.baseTime).format('HH:mm');
@@ -3950,16 +4185,19 @@ var getListType = function getListType(taf, locationSettings) {
3950
4185
  * Copyright 2021 - Finnish Meteorological Institute (FMI)
3951
4186
  * */
3952
4187
 
3953
- var TafFormDialog = function TafFormDialog(_a) {
3954
- var open = _a.open,
3955
- toggleFormDialog = _a.toggleFormDialog,
3956
- tafFromBackend = _a.tafFromBackend,
3957
- children = _a.children,
3958
- _b = _a.alertBanner,
3959
- alertBanner = _b === void 0 ? null : _b,
3960
- onFormAction = _a.onFormAction;
4188
+ var TafFormDialog = function TafFormDialog(_ref) {
4189
+ var open = _ref.open,
4190
+ toggleFormDialog = _ref.toggleFormDialog,
4191
+ tafFromBackend = _ref.tafFromBackend,
4192
+ children = _ref.children,
4193
+ _ref$alertBanner = _ref.alertBanner,
4194
+ alertBanner = _ref$alertBanner === void 0 ? null : _ref$alertBanner,
4195
+ onFormAction = _ref.onFormAction;
3961
4196
  var taf = tafFromBackend ? tafFromBackend.taf : null;
3962
- var locationSettings = useTafSettings(tafConfig).locations;
4197
+
4198
+ var _useTafSettings = useTafSettings(tafConfig),
4199
+ locationSettings = _useTafSettings.locations;
4200
+
3963
4201
  return /*#__PURE__*/React__default.createElement(ContentDialog, {
3964
4202
  open: open,
3965
4203
  toggleDialogStatus: toggleFormDialog,
@@ -3996,10 +4234,10 @@ var useStyles$4 = makeStyles({
3996
4234
  }
3997
4235
  });
3998
4236
 
3999
- var TafListButtons = function TafListButtons(_a) {
4000
- var uuid = _a.uuid,
4001
- canBe = _a.canBe,
4002
- onClickTafActionButton = _a.onClickTafActionButton;
4237
+ var TafListButtons = function TafListButtons(_ref) {
4238
+ var uuid = _ref.uuid,
4239
+ canBe = _ref.canBe,
4240
+ onClickTafActionButton = _ref.onClickTafActionButton;
4003
4241
  var classes = useStyles$4();
4004
4242
  return !canBe.includes('CANCELLED') && !canBe.includes('CORRECTED') && !canBe.includes('AMENDED') ? null : /*#__PURE__*/React__default.createElement(Grid, {
4005
4243
  container: true,
@@ -4063,19 +4301,22 @@ var fromStatusToAction = function fromStatusToAction(tafStatus) {
4063
4301
  }
4064
4302
  };
4065
4303
 
4066
- var TafListAccordion = function TafListAccordion(_a) {
4067
- var tafListItem = _a.tafListItem,
4068
- listType = _a.listType,
4069
- _b = _a.errorCancelTaf,
4070
- errorCancelTaf = _b === void 0 ? [] : _b,
4071
- onClickTafActionButton = _a.onClickTafActionButton;
4304
+ var TafListAccordion = function TafListAccordion(_ref) {
4305
+ var tafListItem = _ref.tafListItem,
4306
+ listType = _ref.listType,
4307
+ _ref$errorCancelTaf = _ref.errorCancelTaf,
4308
+ errorCancelTaf = _ref$errorCancelTaf === void 0 ? [] : _ref$errorCancelTaf,
4309
+ onClickTafActionButton = _ref.onClickTafActionButton;
4072
4310
  var classes = useStyles$3();
4073
4311
  var status = tafListItem.taf.status;
4074
- var api = useApiContext().api;
4075
4312
 
4076
- var _c = __read(useTACGenerator(tafListItem.taf, api.getTAC), 2),
4077
- TAC = _c[0],
4078
- requestTAC = _c[1];
4313
+ var _useApiContext = useApiContext(),
4314
+ api = _useApiContext.api;
4315
+
4316
+ var _useTACGenerator = useTACGenerator(tafListItem.taf, api.getTAC),
4317
+ _useTACGenerator2 = _slicedToArray(_useTACGenerator, 2),
4318
+ TAC = _useTACGenerator2[0],
4319
+ requestTAC = _useTACGenerator2[1];
4079
4320
 
4080
4321
  React__default.useEffect(function () {
4081
4322
  // only re-retrieve TAC if draft state
@@ -4085,7 +4326,7 @@ var TafListAccordion = function TafListAccordion(_a) {
4085
4326
 
4086
4327
  }, [tafListItem.taf]);
4087
4328
  var popOut = status === 'NEW' || status === 'DRAFT' || status === 'DRAFT_AMENDED' || status === 'DRAFT_CORRECTED';
4088
- return /*#__PURE__*/React__default.createElement(Accordion, __assign({
4329
+ return /*#__PURE__*/React__default.createElement(Accordion, Object.assign({
4089
4330
  "data-testid": "tafListItem",
4090
4331
  className: classes.accordion
4091
4332
  }, popOut ? {
@@ -4168,22 +4409,22 @@ var useStyles$2 = makeStyles({
4168
4409
  }
4169
4410
  });
4170
4411
 
4171
- var TafListSection = function TafListSection(_a) {
4172
- var tafList = _a.tafList,
4173
- title = _a.title,
4174
- listType = _a.listType,
4175
- _b = _a.errorCancelTaf,
4176
- errorCancelTaf = _b === void 0 ? [] : _b,
4177
- onClickTafActionButton = _a.onClickTafActionButton;
4412
+ var TafListSection = function TafListSection(_ref) {
4413
+ var tafList = _ref.tafList,
4414
+ title = _ref.title,
4415
+ listType = _ref.listType,
4416
+ _ref$errorCancelTaf = _ref.errorCancelTaf,
4417
+ errorCancelTaf = _ref$errorCancelTaf === void 0 ? [] : _ref$errorCancelTaf,
4418
+ onClickTafActionButton = _ref.onClickTafActionButton;
4178
4419
  var classes = useStyles$2();
4179
4420
  return /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement(Typography, {
4180
4421
  variant: "subtitle2",
4181
4422
  className: classes.listHeaders
4182
4423
  }, title), /*#__PURE__*/React__default.createElement("div", {
4183
- "data-testid": "tafList" + listType
4424
+ "data-testid": "tafList".concat(listType)
4184
4425
  }, tafList.map(function (tafListItem) {
4185
4426
  return /*#__PURE__*/React__default.createElement(TafListAccordion, {
4186
- key: tafListItem.taf.uuid + "-" + tafListItem.taf.status,
4427
+ key: "".concat(tafListItem.taf.uuid, "-").concat(tafListItem.taf.status),
4187
4428
  tafListItem: tafListItem,
4188
4429
  listType: listType,
4189
4430
  errorCancelTaf: errorCancelTaf,
@@ -4205,25 +4446,29 @@ var useStyles$1 = makeStyles({
4205
4446
  }
4206
4447
  });
4207
4448
 
4208
- var TafList = function TafList(_a) {
4209
- var e_1, _b;
4210
-
4211
- var tafList = _a.tafList,
4212
- isLoading = _a.isLoading,
4213
- error = _a.error,
4214
- _c = _a.errorCancelTaf,
4215
- errorCancelTaf = _c === void 0 ? [] : _c,
4216
- onClickTafActionButton = _a.onClickTafActionButton;
4449
+ var TafList = function TafList(_ref) {
4450
+ var tafList = _ref.tafList,
4451
+ isLoading = _ref.isLoading,
4452
+ error = _ref.error,
4453
+ _ref$errorCancelTaf = _ref.errorCancelTaf,
4454
+ errorCancelTaf = _ref$errorCancelTaf === void 0 ? [] : _ref$errorCancelTaf,
4455
+ onClickTafActionButton = _ref.onClickTafActionButton;
4217
4456
  var classes = useStyles$1();
4218
- var locationSettings = useTafSettings(tafConfig).locations;
4457
+
4458
+ var _useTafSettings = useTafSettings(tafConfig),
4459
+ locationSettings = _useTafSettings.locations;
4460
+
4219
4461
  var upcomingTafs = [];
4220
4462
  var currentTafs = [];
4221
4463
  var expiredTafs = [];
4222
4464
 
4223
4465
  if (tafList) {
4466
+ var _iterator = _createForOfIteratorHelper(tafList),
4467
+ _step;
4468
+
4224
4469
  try {
4225
- for (var tafList_1 = __values(tafList), tafList_1_1 = tafList_1.next(); !tafList_1_1.done; tafList_1_1 = tafList_1.next()) {
4226
- var taf = tafList_1_1.value;
4470
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
4471
+ var taf = _step.value;
4227
4472
  var now = moment.utc();
4228
4473
  var baseTime = moment.utc(taf.taf.baseTime);
4229
4474
  var activityPeriod = locationSettings[taf.taf.location].activity_period;
@@ -4237,16 +4482,10 @@ var TafList = function TafList(_a) {
4237
4482
  upcomingTafs.push(taf);
4238
4483
  }
4239
4484
  }
4240
- } catch (e_1_1) {
4241
- e_1 = {
4242
- error: e_1_1
4243
- };
4485
+ } catch (err) {
4486
+ _iterator.e(err);
4244
4487
  } finally {
4245
- try {
4246
- if (tafList_1_1 && !tafList_1_1.done && (_b = tafList_1["return"])) _b.call(tafList_1);
4247
- } finally {
4248
- if (e_1) throw e_1.error;
4249
- }
4488
+ _iterator.f();
4250
4489
  }
4251
4490
  }
4252
4491
 
@@ -4321,14 +4560,13 @@ var Spinner = function Spinner() {
4321
4560
  }));
4322
4561
  };
4323
4562
 
4324
- var useTimeoutCancelError = function useTimeoutCancelError(pollingInterval) {
4325
- if (pollingInterval === void 0) {
4326
- pollingInterval = 10000;
4327
- }
4563
+ var useTimeoutCancelError = function useTimeoutCancelError() {
4564
+ var pollingInterval = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 10000;
4328
4565
 
4329
- var _a = __read(React__default.useState([]), 2),
4330
- errorCancelTaf = _a[0],
4331
- setErrorCancelTaf = _a[1];
4566
+ var _React$useState = React__default.useState([]),
4567
+ _React$useState2 = _slicedToArray(_React$useState, 2),
4568
+ errorCancelTaf = _React$useState2[0],
4569
+ setErrorCancelTaf = _React$useState2[1];
4332
4570
 
4333
4571
  React__default.useEffect(function () {
4334
4572
  var cancelErrorMessageHandler = errorCancelTaf.length > 0 ? setTimeout(function () {
@@ -4352,44 +4590,53 @@ var getSelectedTaf = function getSelectedTaf(selectedTafId, tafList) {
4352
4590
  };
4353
4591
 
4354
4592
  var TafWrapper = function TafWrapper() {
4355
- var api = useApiContext().api;
4593
+ var _useApiContext = useApiContext(),
4594
+ api = _useApiContext.api;
4595
+
4356
4596
  var confirmDialog = useConfirmationDialog();
4357
4597
 
4358
- var _a = __read(React__default.useState(false), 2),
4359
- isTafDialogOpen = _a[0],
4360
- setTafDialogOpen = _a[1];
4598
+ var _React$useState3 = React__default.useState(false),
4599
+ _React$useState4 = _slicedToArray(_React$useState3, 2),
4600
+ isTafDialogOpen = _React$useState4[0],
4601
+ setTafDialogOpen = _React$useState4[1];
4361
4602
 
4362
- var _b = __read(React__default.useState(null), 2),
4363
- selectedTafId = _b[0],
4364
- setselectedTafId = _b[1];
4603
+ var _React$useState5 = React__default.useState(null),
4604
+ _React$useState6 = _slicedToArray(_React$useState5, 2),
4605
+ selectedTafId = _React$useState6[0],
4606
+ setselectedTafId = _React$useState6[1];
4365
4607
 
4366
- var _c = __read(React__default.useState(null), 2),
4367
- tafDialogAction = _c[0],
4368
- setTafDialogAction = _c[1];
4608
+ var _React$useState7 = React__default.useState(null),
4609
+ _React$useState8 = _slicedToArray(_React$useState7, 2),
4610
+ tafDialogAction = _React$useState8[0],
4611
+ setTafDialogAction = _React$useState8[1];
4369
4612
 
4370
- var _d = __read(React__default.useState(false), 2),
4371
- errorPostMessage = _d[0],
4372
- setErrorPostMessage = _d[1];
4613
+ var _React$useState9 = React__default.useState(false),
4614
+ _React$useState10 = _slicedToArray(_React$useState9, 2),
4615
+ errorPostMessage = _React$useState10[0],
4616
+ setErrorPostMessage = _React$useState10[1];
4373
4617
 
4374
- var _e = __read(React__default.useState(''), 2),
4375
- errorPostMessageText = _e[0],
4376
- setErrorPostMessageText = _e[1];
4618
+ var _React$useState11 = React__default.useState(''),
4619
+ _React$useState12 = _slicedToArray(_React$useState11, 2),
4620
+ errorPostMessageText = _React$useState12[0],
4621
+ setErrorPostMessageText = _React$useState12[1];
4377
4622
 
4378
- var _f = __read(React__default.useState(false), 2),
4379
- showSpinner = _f[0],
4380
- setSpinner = _f[1]; // clear error message for cancel after 10 seconds
4623
+ var _React$useState13 = React__default.useState(false),
4624
+ _React$useState14 = _slicedToArray(_React$useState13, 2),
4625
+ showSpinner = _React$useState14[0],
4626
+ setSpinner = _React$useState14[1]; // clear error message for cancel after 10 seconds
4381
4627
 
4382
4628
 
4383
- var _g = __read(useTimeoutCancelError(), 2),
4384
- errorCancelTaf = _g[0],
4385
- setErrorCancelTaf = _g[1]; // Retrieve list of tafs
4629
+ var _useTimeoutCancelErro = useTimeoutCancelError(),
4630
+ _useTimeoutCancelErro2 = _slicedToArray(_useTimeoutCancelErro, 2),
4631
+ errorCancelTaf = _useTimeoutCancelErro2[0],
4632
+ setErrorCancelTaf = _useTimeoutCancelErro2[1]; // Retrieve list of tafs
4386
4633
 
4387
4634
 
4388
- var _h = useApi(api.getTafList),
4389
- errorList = _h.error,
4390
- isLoadingList = _h.isLoading,
4391
- tafList = _h.result,
4392
- fetchNewTafList = _h.fetchApiData;
4635
+ var _useApi = useApi(api.getTafList),
4636
+ errorList = _useApi.error,
4637
+ isLoadingList = _useApi.isLoading,
4638
+ tafList = _useApi.result,
4639
+ fetchNewTafList = _useApi.fetchApiData;
4393
4640
 
4394
4641
  var getNewTafList = function getNewTafList() {
4395
4642
  fetchNewTafList({});
@@ -4420,7 +4667,9 @@ var TafWrapper = function TafWrapper() {
4420
4667
  description: 'Are you sure you want to cancel this TAF?',
4421
4668
  confirmLabel: 'Cancel'
4422
4669
  }).then(function () {
4423
- var taf = getSelectedTaf(tafUuid, tafList).taf;
4670
+ var _getSelectedTaf = getSelectedTaf(tafUuid, tafList),
4671
+ taf = _getSelectedTaf.taf;
4672
+
4424
4673
  postTaf({
4425
4674
  taf: taf,
4426
4675
  changeStatusTo: 'CANCELLED'
@@ -4436,59 +4685,49 @@ var TafWrapper = function TafWrapper() {
4436
4685
  };
4437
4686
 
4438
4687
  var postTaf = function postTaf(data) {
4439
- return __awaiter(void 0, void 0, void 0, function () {
4440
- var error_1;
4441
- return __generator(this, function (_a) {
4442
- switch (_a.label) {
4443
- case 0:
4444
- setSpinner(true);
4445
- _a.label = 1;
4446
-
4447
- case 1:
4448
- _a.trys.push([1, 3,, 4]);
4449
-
4450
- return [4
4451
- /*yield*/
4452
- , api.postTaf(data)];
4453
-
4454
- case 2:
4455
- _a.sent();
4456
-
4457
- if (isTafDialogOpen) toggleTafDialog();
4458
- setSpinner(false); // fetch new taflist
4459
-
4460
- getNewTafList(); // If a post has succeeded remove error message
4461
-
4462
- setErrorCancelTaf([]);
4463
- return [3
4464
- /*break*/
4465
- , 4];
4466
-
4467
- case 3:
4468
- error_1 = _a.sent();
4469
-
4470
- if (data.changeStatusTo === 'CANCELLED') {
4471
- setErrorCancelTaf(__spreadArray(__spreadArray([], __read(errorCancelTaf)), [data.taf.uuid]));
4472
- } else {
4473
- setErrorPostMessage(true);
4474
-
4475
- if (isAxiosError(error_1)) {
4476
- setErrorPostMessageText(getAxiosErrorMessage(error_1));
4688
+ return __awaiter(void 0, void 0, void 0, /*#__PURE__*/regeneratorRuntime.mark(function _callee() {
4689
+ return regeneratorRuntime.wrap(function _callee$(_context) {
4690
+ while (1) {
4691
+ switch (_context.prev = _context.next) {
4692
+ case 0:
4693
+ setSpinner(true);
4694
+ _context.prev = 1;
4695
+ _context.next = 4;
4696
+ return api.postTaf(data);
4697
+
4698
+ case 4:
4699
+ if (isTafDialogOpen) toggleTafDialog();
4700
+ setSpinner(false); // fetch new taflist
4701
+
4702
+ getNewTafList(); // If a post has succeeded remove error message
4703
+
4704
+ setErrorCancelTaf([]);
4705
+ _context.next = 14;
4706
+ break;
4707
+
4708
+ case 10:
4709
+ _context.prev = 10;
4710
+ _context.t0 = _context["catch"](1);
4711
+
4712
+ if (data.changeStatusTo === 'CANCELLED') {
4713
+ setErrorCancelTaf([].concat(_toConsumableArray(errorCancelTaf), [data.taf.uuid]));
4714
+ } else {
4715
+ setErrorPostMessage(true);
4716
+
4717
+ if (isAxiosError(_context.t0)) {
4718
+ setErrorPostMessageText(getAxiosErrorMessage(_context.t0));
4719
+ }
4477
4720
  }
4478
- }
4479
4721
 
4480
- setSpinner(false);
4481
- return [3
4482
- /*break*/
4483
- , 4];
4722
+ setSpinner(false);
4484
4723
 
4485
- case 4:
4486
- return [2
4487
- /*return*/
4488
- ];
4724
+ case 14:
4725
+ case "end":
4726
+ return _context.stop();
4727
+ }
4489
4728
  }
4490
- });
4491
- });
4729
+ }, _callee, null, [[1, 10]]);
4730
+ }));
4492
4731
  };
4493
4732
 
4494
4733
  var fromActionToStatus = function fromActionToStatus(tafAction) {
@@ -4584,18 +4823,34 @@ var ConfirmationWrapper = function ConfirmationWrapper() {
4584
4823
  return /*#__PURE__*/React__default.createElement(ConfirmationServiceProvider, null, /*#__PURE__*/React__default.createElement(TafWrapper, null));
4585
4824
  };
4586
4825
 
4587
- var createApi = function createApi(url, appUrl, auth, setAuth, authTokenUrl) {
4588
- var axiosInstance = createApiInstance(url, appUrl, auth, setAuth, authTokenUrl);
4826
+ /* *
4827
+ * Licensed under the Apache License, Version 2.0 (the "License");
4828
+ * you may not use this file except in compliance with the License.
4829
+ * You may obtain a copy of the License at
4830
+ *
4831
+ * http://www.apache.org/licenses/LICENSE-2.0
4832
+ *
4833
+ * Unless required by applicable law or agreed to in writing, software
4834
+ * distributed under the License is distributed on an "AS IS" BASIS,
4835
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
4836
+ * See the License for the specific language governing permissions and
4837
+ * limitations under the License.
4838
+ *
4839
+ * Copyright 2021 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
4840
+ * Copyright 2021 - Finnish Meteorological Institute (FMI)
4841
+ * */
4842
+ var createApi = function createApi(url, appUrl, auth, setAuth, authTokenUrl, authClientId) {
4843
+ var axiosInstance = createApiInstance(url, appUrl, auth, setAuth, authTokenUrl, authClientId);
4589
4844
  return {
4590
4845
  // api data
4591
4846
  getTafList: function getTafList() {
4592
4847
  return axiosInstance.get('/taflist');
4593
4848
  },
4594
4849
  postTaf: function postTaf(formData) {
4595
- return axiosInstance.post('/taf', __assign({}, formData));
4850
+ return axiosInstance.post('/taf', Object.assign({}, formData));
4596
4851
  },
4597
4852
  getTAC: function getTAC(tafData) {
4598
- return axiosInstance.post('/taf2tac', __assign({}, tafData));
4853
+ return axiosInstance.post('/taf2tac', Object.assign({}, tafData));
4599
4854
  }
4600
4855
  };
4601
4856
  };