@opengeoweb/taf 1.2.2 → 2.1.0

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.umd.js CHANGED
@@ -2,7 +2,7 @@
2
2
  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('react'), require('@material-ui/core'), require('@material-ui/lab'), require('moment'), require('@opengeoweb/shared'), require('@material-ui/icons'), require('@opengeoweb/api'), require('@opengeoweb/form-fields'), require('react-hook-form'), require('react-sortablejs')) :
3
3
  typeof define === 'function' && define.amd ? define(['exports', 'react', '@material-ui/core', '@material-ui/lab', 'moment', '@opengeoweb/shared', '@material-ui/icons', '@opengeoweb/api', '@opengeoweb/form-fields', 'react-hook-form', 'react-sortablejs'], factory) :
4
4
  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.Taf = {}, global.React, global.core, global.lab, global.moment, global.shared, global.icons, global.api, global.formFields, global.reactHookForm, global.reactSortablejs));
5
- }(this, (function (exports, React, core, lab, moment, shared, icons, api, formFields, reactHookForm, reactSortablejs) { 'use strict';
5
+ })(this, (function (exports, React, core, lab, moment, shared, icons, api, formFields, reactHookForm, reactSortablejs) { 'use strict';
6
6
 
7
7
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
8
8
 
@@ -15,14 +15,12 @@
15
15
  var d = Object.getOwnPropertyDescriptor(e, k);
16
16
  Object.defineProperty(n, k, d.get ? d : {
17
17
  enumerable: true,
18
- get: function () {
19
- return e[k];
20
- }
18
+ get: function () { return e[k]; }
21
19
  });
22
20
  }
23
21
  });
24
22
  }
25
- n['default'] = e;
23
+ n["default"] = e;
26
24
  return Object.freeze(n);
27
25
  }
28
26
 
@@ -229,19 +227,21 @@
229
227
  * Copyright 2021 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
230
228
  * Copyright 2021 - Finnish Meteorological Institute (FMI)
231
229
  * */
230
+ var FORMAT_DAYS_HOURS = 'DDHH';
231
+ var FORMAT_DAYS_HOURS_MINUTS = 'DDHHmm'; // formatters
232
232
 
233
233
  var formatValidToString = function formatValidToString(valid) {
234
234
  // Ensure end of valid period if midnight is shown as 24 and not 00
235
- var endHours = moment__default['default'].utc(valid.end).format('kk');
236
- var endDate = endHours === '24' ? moment__default['default'].utc(valid.end).add(-1, 'day').format('DD') : moment__default['default'].utc(valid.end).format('DD');
237
- return valid.end ? moment__default['default'].utc(valid.start).format('DDHH') + "/" + endDate + endHours : moment__default['default'].utc(valid.start).format('DDHHmm');
235
+ var endHours = moment__default["default"].utc(valid.end).format('kk');
236
+ var endDate = endHours === '24' ? moment__default["default"].utc(valid.end).add(-1, 'day').format('DD') : moment__default["default"].utc(valid.end).format('DD');
237
+ return valid.end ? moment__default["default"].utc(valid.start).format(FORMAT_DAYS_HOURS) + "/" + endDate + endHours : moment__default["default"].utc(valid.start).format(FORMAT_DAYS_HOURS_MINUTS);
238
238
  };
239
239
 
240
240
  var getSections = function getSections(value, format) {
241
241
  return {
242
242
  day: parseInt(value.substring(0, 2), 10),
243
243
  hour: parseInt(value.substring(2, 4), 10),
244
- min: format === 'DDHHmm' ? parseInt(value.substring(4), 10) : 0
244
+ min: format === FORMAT_DAYS_HOURS_MINUTS ? parseInt(value.substring(4), 10) : 0
245
245
  };
246
246
  };
247
247
 
@@ -268,10 +268,10 @@
268
268
  if (!value) return null; // Create valid object from passed string
269
269
 
270
270
  var trimmedValue = value.trim();
271
- var tafStartMoment = moment__default['default'].utc(tafStart);
272
- var tafEndMoment = moment__default['default'].utc(tafEnd);
271
+ var tafStartMoment = moment__default["default"].utc(tafStart);
272
+ var tafEndMoment = moment__default["default"].utc(tafEnd);
273
273
  var startEnd = trimmedValue.split('/');
274
- var format = trimmedValue.indexOf('/') === -1 ? 'DDHHmm' : 'DDHH';
274
+ var format = trimmedValue.indexOf('/') === -1 ? FORMAT_DAYS_HOURS_MINUTS : FORMAT_DAYS_HOURS;
275
275
  var startSections = getSections(startEnd[0], format);
276
276
  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
277
277
 
@@ -281,7 +281,7 @@
281
281
  };
282
282
  }
283
283
 
284
- var endSections = getSections(startEnd[1], 'DDHH');
284
+ var endSections = getSections(startEnd[1], FORMAT_DAYS_HOURS);
285
285
  var end = getValidityTimeStamp('end', endSections, tafStartMoment, tafEndMoment).format('YYYY-MM-DDTHH:mm:ss[Z]');
286
286
  return {
287
287
  start: start,
@@ -295,8 +295,8 @@
295
295
  var invalidValidityStartTimeMessage = 'Invalid validity start time, change group validity must lie within the TAF validity period';
296
296
  var invalidValidityPeriodMessage = 'Invalid validity period, validity end time has to be after validity start time';
297
297
  var invalidValidityEndTimeMessage = 'Invalid validity end time, change group validity must lie within the TAF validity period';
298
- var invalidValidityLengthMessage = 'Invalid validity period, expected either DDHH/DDHH or DDHHmm';
299
- var invalidChangeValidInterFieldMessage = 'Invalid validity period, expected DDHH/DDHH for BECMG and TEMPO or DDHHmm for FM'; // Validations
298
+ var invalidChangeValidInterFieldMessage = 'Invalid validity period, expected DDHH/DDHH for BECMG and TEMPO or DDHHmm for FM';
299
+ var invalidBECMGDurationValidInterFieldMessage = 'Invalid validity period, for BECMG only validity periods with a duration of 1, 2, 3 or 4 hours are allowed'; // Validations
300
300
  // Ensure all individual sections are correct (DD HH mm etc)
301
301
 
302
302
  var validateValidSections = function validateValidSections(sections, isStartEnd) {
@@ -317,10 +317,10 @@
317
317
 
318
318
 
319
319
  var validateIsValidDates = function validateIsValidDates(value, tafStart, tafEnd) {
320
- var tafStartMoment = moment__default['default'].utc(tafStart);
321
- var tafEndMoment = moment__default['default'].utc(tafEnd);
320
+ var tafStartMoment = moment__default["default"].utc(tafStart);
321
+ var tafEndMoment = moment__default["default"].utc(tafEnd);
322
322
  var startEnd = value.split('/');
323
- var format = value.indexOf('/') === -1 ? 'DDHHmm' : 'DDHH';
323
+ var format = value.indexOf('/') === -1 ? FORMAT_DAYS_HOURS_MINUTS : FORMAT_DAYS_HOURS;
324
324
  var validateMsg = []; // Validate start time
325
325
 
326
326
  var startSections = getSections(startEnd[0], format); // Validate individual sections for start
@@ -336,7 +336,7 @@
336
336
 
337
337
 
338
338
  if (startEnd.length > 1) {
339
- var endSections = getSections(startEnd[1], 'DDHH'); // Validate individual sections for end
339
+ var endSections = getSections(startEnd[1], FORMAT_DAYS_HOURS); // Validate individual sections for end
340
340
 
341
341
  var sectionValidationEnd = validateValidSections(endSections, 'end'); // If invalid end - return with errors
342
342
 
@@ -366,7 +366,7 @@
366
366
 
367
367
 
368
368
  if (trimmedValue.length < 6 || trimmedValue.length > 9 || !(trimmedValue.match(/^[0-9]{4}\/[0-9]{4}$/) || trimmedValue.match(/^[0-9]{6}$/))) {
369
- return invalidValidityLengthMessage;
369
+ return invalidChangeValidInterFieldMessage;
370
370
  } // Ensure valid date(s) can be made
371
371
 
372
372
 
@@ -380,16 +380,89 @@
380
380
 
381
381
  return true;
382
382
  };
383
- var validateValidChangeGroupInterField = function validateValidChangeGroupInterField(value, valueChange) {
383
+ var validateValidChangeGroupInterField = function validateValidChangeGroupInterField(value, valueChange, tafStart, tafEnd) {
384
384
  var trimmedValue = value.trim();
385
385
  var trimmedValueChange = valueChange.trim();
386
386
 
387
387
  if (!trimmedValue.length) {
388
388
  return true;
389
+ } // Ensure format for FM changegroups is correct DDHHmm
390
+
391
+
392
+ if (trimmedValue.length > 6 && trimmedValueChange === 'FM' || trimmedValue.length < 9 && trimmedValueChange !== 'FM') {
393
+ return invalidChangeValidInterFieldMessage;
394
+ } // Ensure BECMG changegroup has duration of 1,2,3,4 hours
395
+
396
+
397
+ if (trimmedValueChange === 'BECMG') {
398
+ var tafStartMoment = moment__default["default"].utc(tafStart);
399
+ var tafEndMoment = moment__default["default"].utc(tafEnd);
400
+ var startEnd = trimmedValue.split('/');
401
+ var format = trimmedValue.indexOf('/') === -1 ? FORMAT_DAYS_HOURS_MINUTS : FORMAT_DAYS_HOURS; // Validate start time
402
+
403
+ var startSections = getSections(startEnd[0], format);
404
+ var startTimestamp = getValidityTimeStamp('start', startSections, tafStartMoment, tafEndMoment);
405
+ var endSections = getSections(startEnd[1], FORMAT_DAYS_HOURS);
406
+ var endTimestamp = getValidityTimeStamp('end', endSections, tafStartMoment, tafEndMoment);
407
+ var timeDifference = endTimestamp.diff(startTimestamp, 'hours');
408
+
409
+ if (![1, 2, 3, 4].includes(timeDifference)) {
410
+ return invalidBECMGDurationValidInterFieldMessage;
411
+ }
389
412
  }
390
413
 
391
- var isValid = trimmedValue.length < 9 && trimmedValueChange === 'FM' || trimmedValue.length > 6 && trimmedValueChange !== 'FM';
392
- return isValid ? true : invalidChangeValidInterFieldMessage;
414
+ return true;
415
+ }; // validate previous changeGroup
416
+
417
+ var validProbChangeOrder = ['FM', 'BECMG', 'TEMPO', 'PROB40', 'PROB30', 'PROB40 TEMPO', 'PROB30 TEMPO'];
418
+ var invalidPreviousChangeGroupIsBeforeMessage = 'Valid time should be after previous valid time';
419
+ var invalidPreviousChangeGroupOrderMessage = "When valid times are equal, the change/probability order should be: " + validProbChangeOrder.join(', ');
420
+ var invalidPreviousChangeGroupHasSameValue = "When valid times are equal, probability/change can't have the same value as previous row value";
421
+ var validatePreviousChangeGroup = function validatePreviousChangeGroup(currentChangeGroup, nextChangeGroup, tafStart, tafEnd) {
422
+ // extract the needed values from changeGroups
423
+ var valid = currentChangeGroup.valid,
424
+ _a = currentChangeGroup.change,
425
+ change = _a === void 0 ? '' : _a,
426
+ _b = currentChangeGroup.probability,
427
+ probability = _b === void 0 ? '' : _b;
428
+ var previousValid = nextChangeGroup.valid,
429
+ _c = nextChangeGroup.change,
430
+ previousChange = _c === void 0 ? '' : _c,
431
+ _d = nextChangeGroup.probability,
432
+ previousProbability = _d === void 0 ? '' : _d; // get the parsed values
433
+
434
+ var validValue = parseValidToObject(valid, tafStart, tafEnd);
435
+ var previousValidValue = parseValidToObject(previousValid, tafStart, tafEnd);
436
+
437
+ if (!validValue || !previousValidValue || !change.length && !probability.length) {
438
+ return true;
439
+ } // validate is valid time before
440
+
441
+
442
+ var currentStartTime = moment__default["default"](validValue.start);
443
+ var previousRowStartTime = moment__default["default"](previousValidValue.start);
444
+
445
+ if (currentStartTime.isBefore(previousRowStartTime)) {
446
+ return invalidPreviousChangeGroupIsBeforeMessage;
447
+ } // validate same valid time
448
+
449
+
450
+ if (currentStartTime.isSame(previousRowStartTime)) {
451
+ // validate change/probability order
452
+ var currentProbChangeValue = (probability + " " + change).trim();
453
+ var previousProbChangeValue = (previousProbability + " " + previousChange).trim();
454
+
455
+ if (validProbChangeOrder.indexOf(currentProbChangeValue) < validProbChangeOrder.indexOf(previousProbChangeValue)) {
456
+ return invalidPreviousChangeGroupOrderMessage;
457
+ } // validate same valid + change/probability value
458
+
459
+
460
+ if (currentProbChangeValue === previousProbChangeValue) {
461
+ return invalidPreviousChangeGroupHasSameValue;
462
+ }
463
+ }
464
+
465
+ return true;
393
466
  };
394
467
 
395
468
  /* *
@@ -963,22 +1036,62 @@
963
1036
  })(WeatherPhenomena || (WeatherPhenomena = {}));
964
1037
 
965
1038
  var invalidWeatherMessage = 'Invalid weather input, expected NSW or a valid weather code';
1039
+ var invalidWeatherCodeMessage = 'Invalid weather input, invalid weather code';
966
1040
  var invalidWeatherNSWMessage = 'Invalid weather input, NSW is not allowed in the baseforecast and can only be used in the first weather group';
967
1041
  var invalidWeatherWithPreviousEmptyWeather = 'Invalid weather input, value is not allowed when previous weather group(s) are empty';
968
1042
  var invalidWeatherNonUniqueValue = 'Invalid weather input, weather groups must be unique';
969
- var invalidWeatherNonEmptyNSWGroups = 'Invalid weather input, when NSW is used, other weather groups must be empty'; // validations
970
-
971
- var validateWeatherField = function validateWeatherField(value, NSWAllowed) {
1043
+ var invalidWeatherNonEmptyNSWGroups = 'Invalid weather input, when NSW is used, other weather groups must be empty';
1044
+ var invalidWeatherCAVOKMessage = 'Invalid weather input, when CAVOK is used, weather groups must be empty';
1045
+ var invalidWeatherVisibilityBelow5000 = 'Invalid weather input, weather codes FU, DU, HZ, DRDU and BLDU need to be combined with a visibility of 5000m or less';
1046
+ var invalidWeatherBRVisibility = 'Invalid weather input, weather code BR needs to be combined with a visibility between 1000 and 5000m';
1047
+ var invalidWeatherFGVisibility = 'Invalid weather input, weather code FG needs to be combined with a visibility below 1000m'; // validations
1048
+
1049
+ var WeatherVisibilityBelow5000 = [WeatherPhenomena.FU, WeatherPhenomena.DU, WeatherPhenomena.HZ, WeatherPhenomena.DRDU, WeatherPhenomena.BLDU];
1050
+ var validateWeatherField = function validateWeatherField(value, visibilityValue, NSWAllowed) {
972
1051
  if (NSWAllowed === void 0) {
973
1052
  NSWAllowed = true;
974
1053
  }
975
1054
 
976
- var trimmedValue = value.trim();
977
- var isValid = trimmedValue === '' || trimmedValue in WeatherPhenomena || NSWAllowed && trimmedValue === 'NSW';
978
- var errorMessage = NSWAllowed ? invalidWeatherMessage : invalidWeatherNSWMessage;
979
- return isValid ? true : errorMessage;
1055
+ var trimmedValue = value.trim(); // if empty, validate as true
1056
+
1057
+ if (trimmedValue === '') {
1058
+ return true;
1059
+ } // In case of NSW - validate if allowed
1060
+
1061
+
1062
+ if (trimmedValue === 'NSW' && !NSWAllowed) {
1063
+ return invalidWeatherNSWMessage;
1064
+ } // Check if cavOK - then weather group should be empty
1065
+
1066
+
1067
+ if (trimmedValue && visibilityValue === 'CAVOK') {
1068
+ return invalidWeatherCAVOKMessage;
1069
+ } // Validate if entered weather is one of the allowed weather phenomena
1070
+
1071
+
1072
+ if (!(trimmedValue in WeatherPhenomena) && trimmedValue !== 'NSW') {
1073
+ return NSWAllowed ? invalidWeatherMessage : invalidWeatherCodeMessage;
1074
+ } // Validate the weather code in combination with the visibility range
1075
+
1076
+
1077
+ var visibilityRange = parseInt(visibilityValue, 10);
1078
+
1079
+ if (WeatherVisibilityBelow5000.includes(trimmedValue) && visibilityRange > 5000) {
1080
+ return invalidWeatherVisibilityBelow5000;
1081
+ }
1082
+
1083
+ if (trimmedValue === WeatherPhenomena.BR && (visibilityRange < 1000 || visibilityRange > 5000)) {
1084
+ return invalidWeatherBRVisibility;
1085
+ }
1086
+
1087
+ if (trimmedValue === WeatherPhenomena.FG && visibilityRange >= 1000) {
1088
+ return invalidWeatherFGVisibility;
1089
+ } // Everything validated ok - return true
1090
+
1091
+
1092
+ return true;
980
1093
  };
981
- var validateSecondWeatherField = function validateSecondWeatherField(weather1Value, weather2Value) {
1094
+ var validateSecondWeatherField = function validateSecondWeatherField(weather1Value, weather2Value, visibilityValue) {
982
1095
  var trimmedWeather2Value = weather2Value.trim(); // Field can be left empty
983
1096
 
984
1097
  if (!trimmedWeather2Value.length) {
@@ -1001,9 +1114,9 @@
1001
1114
  return invalidWeatherNonUniqueValue;
1002
1115
  }
1003
1116
 
1004
- return validateWeatherField(weather2Value, false);
1117
+ return validateWeatherField(weather2Value, visibilityValue, false);
1005
1118
  };
1006
- var validateThirdWeatherField = function validateThirdWeatherField(weather1Value, weather2Value, weather3Value) {
1119
+ var validateThirdWeatherField = function validateThirdWeatherField(weather1Value, weather2Value, weather3Value, visibilityValue) {
1007
1120
  var trimmedWeather3Value = weather3Value.trim(); // Field can be left empty
1008
1121
 
1009
1122
  if (!trimmedWeather3Value.length) {
@@ -1027,7 +1140,7 @@
1027
1140
  return invalidWeatherNonUniqueValue;
1028
1141
  }
1029
1142
 
1030
- return validateWeatherField(weather3Value, false);
1143
+ return validateWeatherField(weather3Value, visibilityValue, false);
1031
1144
  }; // parser
1032
1145
  // TODO: value type = Weather, but couldn't get it to work properly https://gitlab.com/opengeoweb/opengeoweb/-/issues/119
1033
1146
  // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
@@ -1485,7 +1598,8 @@
1485
1598
  var invalidCloudWithVerticalVisibilityMessage = 'Invalid cloud input, third or fourth cloud group is not allowed when Vertical Visibility is given';
1486
1599
  var invalidCloudWithPreviousEmptyCloud = 'Invalid cloud input, value is not allowed when previous cloud group is empty';
1487
1600
  var invalidCloudWithNSCMessage = 'Invalid cloud input, other cloud groups are not allowed when No Significant Clouds is given';
1488
- var invalidCloud4WithPreviousType = 'Invalid cloud input, value is not allowed when previous cloud group has a type'; // validations
1601
+ var invalidCloud4WithPreviousType = 'Invalid cloud input, value is not allowed when previous cloud group has a type';
1602
+ var invalidCloudCAVOKMessage = 'Invalid cloud input, when CAVOK is used, cloud groups must be empty'; // validations
1489
1603
 
1490
1604
  var isLengthValid = function isLengthValid(value) {
1491
1605
  var onlyDigitsOrSpecificLetters = RegExp(/^[0-9FEWSCTBKNOVU]+$/);
@@ -1602,11 +1716,15 @@
1602
1716
  };
1603
1717
  };
1604
1718
 
1605
- var validateFirstCloud = function validateFirstCloud(value) {
1719
+ var validateFirstCloud = function validateFirstCloud(value, visibilityValue) {
1606
1720
  var trimmedValue = value.trim(); // Field can be left empty
1607
1721
 
1608
1722
  if (!trimmedValue.length) {
1609
1723
  return true;
1724
+ }
1725
+
1726
+ if (trimmedValue && visibilityValue === 'CAVOK') {
1727
+ return invalidCloudCAVOKMessage;
1610
1728
  } // Check for No Signicant Clouds
1611
1729
 
1612
1730
 
@@ -1638,7 +1756,7 @@
1638
1756
 
1639
1757
  return errorMessages.length ? errorMessages[0] : true;
1640
1758
  };
1641
- var validateSecondCloud = function validateSecondCloud(firstCloudValue, secondCloudValue) {
1759
+ var validateSecondCloud = function validateSecondCloud(firstCloudValue, secondCloudValue, visibilityValue) {
1642
1760
  var trimmedValue = secondCloudValue.trim(); // Field can be left empty
1643
1761
 
1644
1762
  if (!trimmedValue.length) {
@@ -1666,7 +1784,7 @@
1666
1784
  } // If Cloud1 is not valid, skip further validation of Cloud2
1667
1785
 
1668
1786
 
1669
- if (validateFirstCloud(firstCloudValue) !== true) {
1787
+ if (validateFirstCloud(firstCloudValue, visibilityValue) !== true) {
1670
1788
  return true;
1671
1789
  } // If Cloud1 is NSC, Cloud2 has to be empty
1672
1790
 
@@ -1696,7 +1814,7 @@
1696
1814
 
1697
1815
  return true;
1698
1816
  };
1699
- var validateThirdCloud = function validateThirdCloud(firstCloudValue, secondCloudValue, thirdCloudValue) {
1817
+ var validateThirdCloud = function validateThirdCloud(firstCloudValue, secondCloudValue, thirdCloudValue, visibilityValue) {
1700
1818
  var trimmedValue = thirdCloudValue.trim(); // Field can be left empty
1701
1819
 
1702
1820
  if (!trimmedValue.length) {
@@ -1724,7 +1842,7 @@
1724
1842
  } // If Cloud1 is not valid, skip further validation of Cloud3
1725
1843
 
1726
1844
 
1727
- if (validateFirstCloud(firstCloudValue) !== true) {
1845
+ if (validateFirstCloud(firstCloudValue, visibilityValue) !== true) {
1728
1846
  return true;
1729
1847
  } // If Cloud1 is empty Cloud3 should be empty
1730
1848
 
@@ -1744,7 +1862,7 @@
1744
1862
  } // If Cloud2 is not valid, skip further validation of Cloud3
1745
1863
 
1746
1864
 
1747
- if (validateSecondCloud(firstCloudValue, secondCloudValue) !== true) {
1865
+ if (validateSecondCloud(firstCloudValue, secondCloudValue, visibilityValue) !== true) {
1748
1866
  return true;
1749
1867
  } // If Cloud2 is empty Cloud3 should be empty
1750
1868
 
@@ -1762,7 +1880,7 @@
1762
1880
 
1763
1881
  return true;
1764
1882
  };
1765
- var validateFourthCloud = function validateFourthCloud(firstCloudValue, secondCloudValue, thirdCloudValue, fourthCloudValue) {
1883
+ var validateFourthCloud = function validateFourthCloud(firstCloudValue, secondCloudValue, thirdCloudValue, fourthCloudValue, visibilityValue) {
1766
1884
  var trimmedValue = fourthCloudValue.trim(); // Field can be left empty
1767
1885
 
1768
1886
  if (!trimmedValue.length) {
@@ -1789,7 +1907,7 @@
1789
1907
  } // If Cloud1 is not valid, skip further validation of Cloud4
1790
1908
 
1791
1909
 
1792
- if (validateFirstCloud(firstCloudValue) !== true) {
1910
+ if (validateFirstCloud(firstCloudValue, visibilityValue) !== true) {
1793
1911
  return true;
1794
1912
  } // If Cloud1 contains Vertical Visibility then Cloud4 should be empty
1795
1913
 
@@ -1809,7 +1927,7 @@
1809
1927
  } // If Cloud3 is not valid, skip further validation of Cloud4
1810
1928
 
1811
1929
 
1812
- if (validateThirdCloud(firstCloudValue, secondCloudValue, thirdCloudValue) !== true) {
1930
+ if (validateThirdCloud(firstCloudValue, secondCloudValue, thirdCloudValue, visibilityValue) !== true) {
1813
1931
  return true;
1814
1932
  } // If Cloud3 contains a type, Cloud4 should be empty
1815
1933
 
@@ -1832,7 +1950,7 @@
1832
1950
  };
1833
1951
 
1834
1952
  var formatIssueTime = function formatIssueTime(issueDate) {
1835
- return issueDate ? moment__default['default'](issueDate).utc().format('DDHHmm') + "Z" : 'Not issued';
1953
+ return issueDate ? moment__default["default"](issueDate).utc().format('DDHHmm') + "Z" : 'Not issued';
1836
1954
  };
1837
1955
  function formatFormValues(row) {
1838
1956
  return Object.keys(row).reduce(function (list, key) {
@@ -1886,6 +2004,8 @@
1886
2004
  return Object.keys(row).reduce(function (list, key) {
1887
2005
  var _a;
1888
2006
 
2007
+ var _b;
2008
+
1889
2009
  switch (key) {
1890
2010
  case 'valid':
1891
2011
  {
@@ -1924,7 +2044,7 @@
1924
2044
  case 'change':
1925
2045
  case 'probability':
1926
2046
  {
1927
- return __assign(__assign({}, list), (_a = {}, _a[key] = list[key].trim(), _a));
2047
+ return __assign(__assign({}, list), (_a = {}, _a[key] = (_b = list[key]) === null || _b === void 0 ? void 0 : _b.trim(), _a));
1928
2048
  }
1929
2049
 
1930
2050
  default:
@@ -1935,9 +2055,7 @@
1935
2055
  }, row);
1936
2056
  }
1937
2057
 
1938
- var parseFormValues = function parseFormValues( // TODO: remove next line - couldn't get the typing to work! https://gitlab.com/opengeoweb/geoweb-assets/-/issues/1119
1939
- // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
1940
- row, tafStart, tafEnd) {
2058
+ function parseFormValues(row, tafStart, tafEnd) {
1941
2059
  var reducedRow = reduceRowValues(row, tafStart, tafEnd);
1942
2060
  return Object.keys(reducedRow).reduce(function (list, key) {
1943
2061
  switch (key) {
@@ -1983,7 +2101,7 @@
1983
2101
  case 'wind':
1984
2102
  {
1985
2103
  // If empty, remove it from the list
1986
- if (!reducedRow.wind.direction && isNaN(reducedRow.wind.direction)) {
2104
+ if (!reducedRow.wind.direction && isNaN(Number(reducedRow.wind.direction))) {
1987
2105
  list.wind;
1988
2106
  var rest = __rest(list, ["wind"]);
1989
2107
 
@@ -2008,14 +2126,26 @@
2008
2126
 
2009
2127
  case 'change':
2010
2128
  case 'probability':
2129
+ // If empty, remove it from the list
2130
+ if (!reducedRow[key]) {
2131
+ var _a = list,
2132
+ _b = key;
2133
+ _a[_b];
2134
+ var rest = __rest(_a, [_typeof(_b) === "symbol" ? _b : _b + ""]);
2135
+
2136
+ return rest;
2137
+ }
2138
+
2139
+ return list;
2140
+
2011
2141
  case 'valid':
2012
2142
  {
2013
2143
  // If empty, remove it from the list
2014
2144
  if (!reducedRow[key]) {
2015
- var _a = list,
2016
- _b = key;
2017
- _a[_b];
2018
- var rest = __rest(_a, [_typeof(_b) === "symbol" ? _b : _b + ""]);
2145
+ var _c = list,
2146
+ _d = key;
2147
+ _c[_d];
2148
+ var rest = __rest(_c, [_typeof(_d) === "symbol" ? _d : _d + ""]);
2019
2149
 
2020
2150
  return rest;
2021
2151
  }
@@ -2029,9 +2159,7 @@
2029
2159
  }
2030
2160
  }
2031
2161
  }, reducedRow);
2032
- }; // TODO: create a type for formData https://gitlab.com/opengeoweb/opengeoweb/-/issues/137
2033
- // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
2034
-
2162
+ }
2035
2163
  var convertTafValuesToObject = function convertTafValuesToObject(formData) {
2036
2164
  formData.IS_DRAFT;
2037
2165
  var productToPost = __rest(formData, ["IS_DRAFT"]);
@@ -2090,17 +2218,15 @@
2090
2218
  }
2091
2219
  }
2092
2220
  }, parsedFormValues);
2093
- };
2094
- 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
2221
+ }; // 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
2095
2222
 
2096
2223
  var shouldRetrieveTAC = function shouldRetrieveTAC(product) {
2097
- if (product && product.baseForecast && product.baseForecast.wind && product.baseForecast.wind.speed && product.baseForecast.wind.speed !== '' && (product.baseForecast.visibility && product.baseForecast.visibility.range && product.baseForecast.visibility.range !== '' || product.baseForecast.cavOK)) {
2224
+ 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)) {
2098
2225
  return true;
2099
2226
  }
2100
2227
 
2101
2228
  return false;
2102
2229
  };
2103
-
2104
2230
  var getFieldNames = function getFieldNames(isChangeGroup, index) {
2105
2231
  var namePrefix = !isChangeGroup ? 'baseForecast' : "changeGroups[" + index + "]";
2106
2232
  return __assign(__assign(__assign({}, !isChangeGroup && {
@@ -2123,54 +2249,55 @@
2123
2249
  cloud4: namePrefix + ".cloud.cloud4"
2124
2250
  });
2125
2251
  };
2252
+ var TAC_MISSING_DATA = 'Missing data: no TAC can be generated';
2253
+ var TAC_NOT_AVAILABLE = 'No TAC available';
2254
+ var TAC_RETRIEVING_DATA = 'Retrieving TAC';
2126
2255
  var useTACGenerator = function useTACGenerator(taf, requestTAC, standardTAC) {
2127
2256
  if (standardTAC === void 0) {
2128
2257
  standardTAC = '';
2129
2258
  }
2130
2259
 
2131
- var _a = __read(React__default['default'].useState(taf.status === 'NEW' ? 'No TAC available' : 'Retrieving TAC'), 2),
2260
+ var _a = __read(React__default["default"].useState(taf.status === 'NEW' ? TAC_NOT_AVAILABLE : TAC_RETRIEVING_DATA), 2),
2132
2261
  TAC = _a[0],
2133
2262
  setTAC = _a[1];
2134
2263
 
2264
+ var isMounted = shared.useIsMounted().isMounted;
2265
+
2135
2266
  var retrieveTAC = function retrieveTAC(tafToPost) {
2136
2267
  if (shouldRetrieveTAC(tafToPost)) {
2137
2268
  requestTAC(tafToPost).then(function (result) {
2138
- setTAC(result.data);
2269
+ if (isMounted.current) {
2270
+ setTAC(result.data);
2271
+ }
2139
2272
  })["catch"](function () {
2140
- setTAC('Failed to retrieve TAC');
2273
+ if (isMounted.current) {
2274
+ setTAC('Failed to retrieve TAC');
2275
+ }
2141
2276
  });
2277
+ } else {
2278
+ setTAC(TAC_MISSING_DATA);
2142
2279
  }
2143
-
2144
- setTAC(noTAC);
2145
2280
  };
2146
2281
 
2147
- React__default['default'].useEffect(function () {
2282
+ React__default["default"].useEffect(function () {
2148
2283
  if (taf.status !== 'NEW' && !standardTAC) {
2149
2284
  retrieveTAC(taf);
2150
2285
  } // eslint-disable-next-line react-hooks/exhaustive-deps
2151
2286
 
2152
2287
  }, []);
2153
- React__default['default'].useEffect(function () {
2288
+ React__default["default"].useEffect(function () {
2154
2289
  if (standardTAC !== '') {
2155
2290
  setTAC(standardTAC);
2156
2291
  }
2157
2292
  }, [standardTAC]);
2158
2293
  return [TAC, retrieveTAC];
2159
2294
  };
2160
- var getRange = function getRange(min, max) {
2161
- return Array.from({
2162
- length: max - min + 1
2163
- }, function (_, i) {
2164
- return min + i;
2165
- });
2166
- };
2167
- var useDragOrder = function useDragOrder(trigger, move, fields) {
2168
- // create simple ordered list with hover (chosen) state
2169
- var _a = __read(React__default['default'].useState([]), 2),
2170
- sortedFields = _a[0],
2171
- setSortedFields = _a[1];
2295
+ var useDragOrder = function useDragOrder(trigger, move, onFormBlur) {
2296
+ var _a = __read(React__default["default"].useState(null), 2),
2297
+ activeDraggingIndex = _a[0],
2298
+ setIsDragging = _a[1];
2172
2299
 
2173
- var _b = __read(React__default['default'].useState([null, null]), 2),
2300
+ var _b = __read(React__default["default"].useState([null, null]), 2),
2174
2301
  lastDragOrder = _b[0],
2175
2302
  onUpdatelastDragOrder = _b[1];
2176
2303
 
@@ -2180,46 +2307,40 @@
2180
2307
  if (oldIndex === undefined || newIndex === undefined) return;
2181
2308
  move(oldIndex, newIndex);
2182
2309
  onUpdatelastDragOrder([oldIndex, newIndex]);
2310
+ setIsDragging(false);
2183
2311
  };
2184
2312
 
2185
- React__default['default'].useEffect(function () {
2186
- setSortedFields(fields.map(function (_a) {
2187
- var id = _a.id;
2188
- return {
2189
- id: id,
2190
- chosen: false
2191
- };
2192
- }));
2193
- }, [fields]); // triggers validation AFTER render of new sorted elements
2313
+ var onStartDrag = function onStartDrag(_a) {
2314
+ var oldIndex = _a.oldIndex;
2315
+ return setIsDragging(oldIndex);
2316
+ }; // triggers validation AFTER render of new sorted elements
2317
+
2194
2318
 
2195
- React__default['default'].useEffect(function () {
2319
+ React__default["default"].useEffect(function () {
2196
2320
  var _a = __read(lastDragOrder, 2),
2197
2321
  oldIndex = _a[0],
2198
2322
  newIndex = _a[1];
2199
2323
 
2200
2324
  if (oldIndex !== null && newIndex !== null) {
2201
- // trigger validation of moved rows
2202
- var _b = __read([oldIndex, newIndex].sort(function (a, b) {
2203
- return a - b;
2204
- }), 2),
2205
- start = _b[0],
2206
- end = _b[1];
2207
-
2208
- var changedRows = getRange(start, end);
2209
- var fieldsToValidate = changedRows.reduce(function (list, rowIndex) {
2210
- var fieldsDict = getFieldNames(true, rowIndex);
2211
- var fields = Object.keys(fieldsDict).map(function (key) {
2212
- return fieldsDict[key];
2213
- });
2214
- return list.concat(fields);
2215
- }, []);
2216
- trigger(fieldsToValidate);
2325
+ // trigger validation of all fields
2326
+ trigger();
2217
2327
  }
2218
- }, [lastDragOrder, trigger]);
2328
+ }, [lastDragOrder, trigger]); // trigger onFormBlur AFTER render of new sorted elements so the TAC gets updated
2329
+
2330
+ React__default["default"].useEffect(function () {
2331
+ var _a = __read(lastDragOrder, 2),
2332
+ oldIndex = _a[0],
2333
+ newIndex = _a[1];
2334
+
2335
+ if (oldIndex !== null && newIndex !== null) {
2336
+ onFormBlur();
2337
+ } // eslint-disable-next-line react-hooks/exhaustive-deps
2338
+
2339
+ }, [lastDragOrder]);
2219
2340
  return {
2220
2341
  onChangeOrder: onChangeOrder,
2221
- sortedFields: sortedFields,
2222
- setSortedFields: setSortedFields
2342
+ activeDraggingIndex: activeDraggingIndex,
2343
+ onStartDrag: onStartDrag
2223
2344
  };
2224
2345
  }; // dialog utils
2225
2346
 
@@ -2351,9 +2472,9 @@
2351
2472
  var getDisplayValue = function getDisplayValue(value, disabled) {
2352
2473
  return disabled && !value ? '-' : value;
2353
2474
  };
2354
- var BaseTextField = /*#__PURE__*/React__default['default'].memo(function (props) {
2475
+ var BaseTextField = /*#__PURE__*/React__default["default"].memo(function (props) {
2355
2476
  var classes = useStyles$9();
2356
- return /*#__PURE__*/React__default['default'].createElement(core.TextField, __assign({
2477
+ return /*#__PURE__*/React__default["default"].createElement(core.TextField, __assign({
2357
2478
  type: "text",
2358
2479
  variant: "filled",
2359
2480
  InputProps: {
@@ -2399,14 +2520,14 @@
2399
2520
  setValue = _k.setValue,
2400
2521
  errors = _k.errors;
2401
2522
 
2402
- var inputRef = React__default['default'].useRef(null);
2523
+ var inputRef = React__default["default"].useRef(null);
2403
2524
  var fieldErrors = getTafErrors(name, errors);
2404
2525
 
2405
- var _l = __read(React__default['default'].useState(null), 2),
2526
+ var _l = __read(React__default["default"].useState(null), 2),
2406
2527
  maxLength = _l[0],
2407
2528
  setMaxLength = _l[1];
2408
2529
 
2409
- var onKeyDown = React__default['default'].useCallback(function (event) {
2530
+ var onKeyDown = React__default["default"].useCallback(function (event) {
2410
2531
  var currentValue = getValues(name).toString();
2411
2532
  var textSelection = currentValue.substring(inputRef.current.selectionStart, inputRef.current.selectionEnd);
2412
2533
 
@@ -2423,7 +2544,7 @@
2423
2544
  }
2424
2545
  }
2425
2546
  }, [name, autoComplete, setValue, getValues]);
2426
- var onChangeField = React__default['default'].useCallback(function (event, callback) {
2547
+ var onChangeField = React__default["default"].useCallback(function (event, callback) {
2427
2548
  var valueUppercase = event.currentTarget.value.toUpperCase();
2428
2549
 
2429
2550
  if (autoComplete) {
@@ -2437,24 +2558,24 @@
2437
2558
  callback(valueUppercase);
2438
2559
  onChange(valueUppercase);
2439
2560
  }, [onChange, autoComplete]);
2440
- var onBlurField = React__default['default'].useCallback(function (callback) {
2561
+ var onBlurField = React__default["default"].useCallback(function (callback) {
2441
2562
  callback();
2442
2563
  onBlur();
2443
2564
  }, [onBlur]);
2444
- var onFocusField = React__default['default'].useCallback(function () {
2565
+ var onFocusField = React__default["default"].useCallback(function () {
2445
2566
  var _a;
2446
2567
 
2447
2568
  inputRef.current.disabled = false;
2448
2569
  (_a = inputRef.current) === null || _a === void 0 ? void 0 : _a.focus();
2449
2570
  }, []);
2450
- return /*#__PURE__*/React__default['default'].createElement(core.Grid, {
2571
+ return /*#__PURE__*/React__default["default"].createElement(core.Grid, {
2451
2572
  item: true,
2452
2573
  xs: true,
2453
2574
  className: classes.textFieldGridItem
2454
- }, /*#__PURE__*/React__default['default'].createElement(reactHookForm.Controller, {
2575
+ }, /*#__PURE__*/React__default["default"].createElement(reactHookForm.Controller, {
2455
2576
  render: function render(_props) {
2456
2577
  var displayValue = formatter ? formatter(_props.value) : getDisplayValue(_props.value, disabled);
2457
- return /*#__PURE__*/React__default['default'].createElement(BaseTextField, {
2578
+ return /*#__PURE__*/React__default["default"].createElement(BaseTextField, {
2458
2579
  label: label,
2459
2580
  disabled: disabled,
2460
2581
  name: name,
@@ -2500,7 +2621,7 @@
2500
2621
  * */
2501
2622
  // messages
2502
2623
  var invalidChangeMessage = 'Invalid Change input, only BECMG, TEMPO or FM are allowed';
2503
- var invalidChangeProbCombinationMessage = 'A probability is only allowed in combination with TEMPO'; // validations
2624
+ var invalidChangeProbCombinationMessage = 'A probability is only allowed in combination with TEMPO or an empty Change input'; // validations
2504
2625
 
2505
2626
  var validateChangeField = function validateChangeField(value) {
2506
2627
  var trimmedValue = value.trim();
@@ -2552,10 +2673,11 @@
2552
2673
  };
2553
2674
 
2554
2675
  var getRequiredCrossFields = function getRequiredCrossFields(fieldNames) {
2555
- return [[fieldNames.valid, fieldNames.change], [fieldNames.probability], [fieldNames.wind, fieldNames.visibility, fieldNames.weather1, fieldNames.cloud1]];
2676
+ return [[fieldNames.valid], [fieldNames.change, fieldNames.probability], [fieldNames.wind, fieldNames.visibility, fieldNames.weather1, fieldNames.cloud1] // sub fields
2677
+ ];
2556
2678
  };
2557
2679
 
2558
- var TafFormRow = /*#__PURE__*/React__default['default'].forwardRef(function (_a, ref) {
2680
+ var TafFormRow = /*#__PURE__*/React__default["default"].forwardRef(function (_a, ref) {
2559
2681
  var _b = _a.isChangeGroup,
2560
2682
  isChangeGroup = _b === void 0 ? false : _b,
2561
2683
  _c = _a.disabled,
@@ -2589,11 +2711,16 @@
2589
2711
  return fields.map(getValues).find(function (field) {
2590
2712
  return !!field;
2591
2713
  });
2592
- }; // Used to validate the two required fields for change groups: Change and Valid
2714
+ }; // Used to validate the required field for change groups: Valid
2715
+
2716
+
2717
+ var validateRequiredMain = function validateRequiredMain(value) {
2718
+ return isNotRequiredForAction(value) !== true && isChangeGroup && !value.length && (hasFieldsValue(subFields) || hasFieldsValue(mainFields) || hasFieldsValue(mainOptionalFields)) ? 'Valid is required' : true;
2719
+ }; // Used to ensure either probability or change is entered, or both
2593
2720
 
2594
2721
 
2595
- var _validateRequiredMain = function validateRequiredMain(value, fieldName) {
2596
- return isNotRequiredForAction(value) !== true && isChangeGroup && !value.length && (hasFieldsValue(subFields) || hasFieldsValue(mainFields) || hasFieldsValue(mainOptionalFields)) ? fieldName + " is required" : true;
2722
+ var validateRequiredMainOptional = function validateRequiredMainOptional(value) {
2723
+ return isNotRequiredForAction(value) !== true && isChangeGroup && (hasFieldsValue(mainFields) || hasFieldsValue(subFields)) && !hasFieldsValue(mainOptionalFields) ? 'Probability or change is required' : true;
2597
2724
  }; // Used to ensure one wind, visibility, weather or cloud is entered when start editing a changegroup and all of these are empty
2598
2725
 
2599
2726
 
@@ -2627,36 +2754,62 @@
2627
2754
  return true;
2628
2755
  };
2629
2756
 
2630
- return /*#__PURE__*/React__default['default'].createElement(core.Grid, __assign({
2757
+ var validatePreviousRow = React__default["default"].useCallback(function () {
2758
+ if (isChangeGroup && index > 0) {
2759
+ var _a = getValues(),
2760
+ validDateEnd = _a.validDateEnd,
2761
+ validDateStart = _a.validDateStart,
2762
+ changeGroups = _a.changeGroups;
2763
+
2764
+ var currentChangeGroup = changeGroups[index];
2765
+ var previousChangeGroup = changeGroups[index - 1];
2766
+ return validatePreviousChangeGroup(currentChangeGroup, previousChangeGroup, validDateStart, validDateEnd);
2767
+ }
2768
+
2769
+ return true;
2770
+ }, [index, isChangeGroup, getValues]);
2771
+
2772
+ var getFieldFromNextRow = function getFieldFromNextRow(fieldname) {
2773
+ if (fieldname === void 0) {
2774
+ fieldname = 'valid';
2775
+ }
2776
+
2777
+ var nextValidFieldName = "changeGroups[" + (index + 1) + "]." + fieldname;
2778
+ var nextRowValidValue = getValues(nextValidFieldName);
2779
+ return nextRowValidValue ? [nextValidFieldName] : [];
2780
+ };
2781
+
2782
+ return /*#__PURE__*/React__default["default"].createElement(core.Grid, __assign({
2631
2783
  "data-testid": "row-" + namePrefix,
2632
2784
  container: true,
2633
2785
  ref: ref
2634
- }, props), !isChangeGroup && /*#__PURE__*/React__default['default'].createElement(React__default['default'].Fragment, null, /*#__PURE__*/React__default['default'].createElement(TafFormTextField, {
2786
+ }, props), !isChangeGroup && /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, /*#__PURE__*/React__default["default"].createElement(TafFormTextField, {
2635
2787
  label: "Type",
2636
2788
  name: fieldNames.messageType,
2637
2789
  disabled: true
2638
- }), /*#__PURE__*/React__default['default'].createElement(TafFormTextField, {
2790
+ }), /*#__PURE__*/React__default["default"].createElement(TafFormTextField, {
2639
2791
  label: "Location",
2640
2792
  name: "location",
2641
2793
  disabled: true
2642
- }), /*#__PURE__*/React__default['default'].createElement(TafFormTextField, {
2794
+ }), /*#__PURE__*/React__default["default"].createElement(TafFormTextField, {
2643
2795
  formatter: formatIssueTime,
2644
2796
  label: "Issue time",
2645
2797
  name: "issueDate",
2646
2798
  disabled: true
2647
- })), isChangeGroup && /*#__PURE__*/React__default['default'].createElement(React__default['default'].Fragment, null, /*#__PURE__*/React__default['default'].createElement(core.Grid, {
2799
+ })), isChangeGroup && /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, /*#__PURE__*/React__default["default"].createElement(core.Grid, {
2648
2800
  item: true,
2649
2801
  xs: true,
2650
2802
  style: {
2651
2803
  display: 'flex'
2652
2804
  }
2653
- }, dragHandle), /*#__PURE__*/React__default['default'].createElement(TafFormTextField, {
2805
+ }, dragHandle), /*#__PURE__*/React__default["default"].createElement(TafFormTextField, {
2654
2806
  label: "Prob",
2655
2807
  name: fieldNames.probability,
2656
2808
  disabled: disabled,
2657
2809
  defaultValue: getDefaultValue('probability', field),
2658
2810
  rules: {
2659
2811
  validate: {
2812
+ validateRequiredMainOptional: validateRequiredMainOptional,
2660
2813
  validateProbabilityField: validateProbabilityField
2661
2814
  }
2662
2815
  },
@@ -2669,19 +2822,18 @@
2669
2822
  }],
2670
2823
  onBlur: function onBlur() {
2671
2824
  if (isChangeGroup) {
2672
- trigger(__spreadArray(__spreadArray(__spreadArray([], __read(subFields)), __read(mainOptionalFields)), __read(mainFields)));
2825
+ var nextValidFieldName = getFieldFromNextRow();
2826
+ trigger(__spreadArray(__spreadArray(__spreadArray(__spreadArray([], __read(subFields)), __read(mainOptionalFields)), __read(mainFields)), __read(nextValidFieldName)));
2673
2827
  }
2674
2828
  }
2675
- }), /*#__PURE__*/React__default['default'].createElement(TafFormTextField, {
2829
+ }), /*#__PURE__*/React__default["default"].createElement(TafFormTextField, {
2676
2830
  label: "Change",
2677
2831
  name: fieldNames.change,
2678
2832
  disabled: disabled,
2679
2833
  defaultValue: getDefaultValue('change', field),
2680
2834
  rules: {
2681
2835
  validate: {
2682
- validateRequiredMain: function validateRequiredMain(value) {
2683
- return _validateRequiredMain(value, 'Change');
2684
- },
2836
+ validateRequiredMainOptional: validateRequiredMainOptional,
2685
2837
  validateChangeField: validateChangeField,
2686
2838
  validateChangeFieldInterField: function validateChangeFieldInterField$1(value) {
2687
2839
  return validateChangeFieldInterField(value, getValues(fieldNames.probability));
@@ -2700,10 +2852,11 @@
2700
2852
  }],
2701
2853
  onBlur: function onBlur() {
2702
2854
  if (isChangeGroup) {
2703
- trigger(__spreadArray(__spreadArray(__spreadArray([], __read(subFields)), __read(mainOptionalFields)), __read(mainFields)));
2855
+ var nextValidFieldName = getFieldFromNextRow();
2856
+ trigger(__spreadArray(__spreadArray(__spreadArray(__spreadArray([], __read(subFields)), __read(mainOptionalFields)), __read(mainFields)), __read(nextValidFieldName)));
2704
2857
  }
2705
2858
  }
2706
- })), /*#__PURE__*/React__default['default'].createElement(TafFormTextField, {
2859
+ })), /*#__PURE__*/React__default["default"].createElement(TafFormTextField, {
2707
2860
  label: "Valid",
2708
2861
  name: fieldNames.valid,
2709
2862
  // always disabled for baseforecast row
@@ -2711,23 +2864,23 @@
2711
2864
  defaultValue: getDefaultValue('valid', field),
2712
2865
  rules: {
2713
2866
  validate: {
2714
- validateRequiredMain: function validateRequiredMain(value) {
2715
- return _validateRequiredMain(value, 'Valid');
2716
- },
2867
+ validateRequiredMain: validateRequiredMain,
2717
2868
  validateValidField: function validateValidField$1(value) {
2718
2869
  return isChangeGroup ? validateValidField(value, getValues('validDateStart'), getValues('validDateEnd')) : true;
2719
2870
  },
2720
2871
  validateValidChangeGroupInterField: function validateValidChangeGroupInterField$1(value) {
2721
- return isChangeGroup ? validateValidChangeGroupInterField(value, getValues(fieldNames.change)) : true;
2722
- }
2872
+ return isChangeGroup ? validateValidChangeGroupInterField(value, getValues(fieldNames.change), getValues('validDateStart'), getValues('validDateEnd')) : true;
2873
+ },
2874
+ validatePreviousRow: validatePreviousRow
2723
2875
  }
2724
2876
  },
2725
2877
  onBlur: function onBlur() {
2726
2878
  if (isChangeGroup) {
2727
- trigger(__spreadArray(__spreadArray(__spreadArray([], __read(subFields)), __read(mainOptionalFields)), __read(mainFields)));
2879
+ var nextValidFieldName = getFieldFromNextRow();
2880
+ trigger(__spreadArray(__spreadArray(__spreadArray(__spreadArray([], __read(subFields)), __read(mainOptionalFields)), __read(mainFields)), __read(nextValidFieldName)));
2728
2881
  }
2729
2882
  }
2730
- }), /*#__PURE__*/React__default['default'].createElement(TafFormTextField, {
2883
+ }), /*#__PURE__*/React__default["default"].createElement(TafFormTextField, {
2731
2884
  label: "Wind",
2732
2885
  name: fieldNames.wind,
2733
2886
  disabled: disabled,
@@ -2747,7 +2900,7 @@
2747
2900
  }
2748
2901
  },
2749
2902
  autoFocus: !isChangeGroup
2750
- }), /*#__PURE__*/React__default['default'].createElement(TafFormTextField, {
2903
+ }), /*#__PURE__*/React__default["default"].createElement(TafFormTextField, {
2751
2904
  label: "Visibility",
2752
2905
  name: fieldNames.visibility,
2753
2906
  disabled: disabled,
@@ -2766,9 +2919,10 @@
2766
2919
  value: 'CAVOK'
2767
2920
  }],
2768
2921
  onBlur: function onBlur() {
2769
- trigger(isChangeGroup ? __spreadArray(__spreadArray([], __read(subFields)), __read(mainFields)) : subFields);
2922
+ var fields = isChangeGroup ? __spreadArray(__spreadArray([], __read(subFields)), __read(mainFields)) : subFields;
2923
+ trigger(__spreadArray(__spreadArray([], __read(fields)), [fieldNames.weather1, fieldNames.weather2, fieldNames.weather3]));
2770
2924
  }
2771
- }), /*#__PURE__*/React__default['default'].createElement(TafFormTextField, {
2925
+ }), /*#__PURE__*/React__default["default"].createElement(TafFormTextField, {
2772
2926
  label: "Weather",
2773
2927
  name: fieldNames.weather1,
2774
2928
  disabled: disabled,
@@ -2780,7 +2934,7 @@
2780
2934
  },
2781
2935
  validateRequiredSub: validateRequiredSub,
2782
2936
  validateWeatherField: function validateWeatherField$1(value) {
2783
- return validateWeatherField(value, !!isChangeGroup);
2937
+ return validateWeatherField(value, getValues(fieldNames.visibility), !!isChangeGroup);
2784
2938
  }
2785
2939
  }
2786
2940
  },
@@ -2788,7 +2942,7 @@
2788
2942
  var fields = isChangeGroup ? __spreadArray(__spreadArray([], __read(subFields)), __read(mainFields)) : [];
2789
2943
  return trigger(__spreadArray(__spreadArray([], __read(fields)), [fieldNames.weather2, fieldNames.weather3]));
2790
2944
  }
2791
- }), /*#__PURE__*/React__default['default'].createElement(TafFormTextField, {
2945
+ }), /*#__PURE__*/React__default["default"].createElement(TafFormTextField, {
2792
2946
  label: "Weather",
2793
2947
  name: fieldNames.weather2,
2794
2948
  disabled: disabled,
@@ -2796,7 +2950,7 @@
2796
2950
  rules: {
2797
2951
  validate: {
2798
2952
  validateSecondWeatherField: function validateSecondWeatherField$1(value) {
2799
- return validateSecondWeatherField(getValues(fieldNames.weather1), value);
2953
+ return validateSecondWeatherField(getValues(fieldNames.weather1), value, getValues(fieldNames.visibility));
2800
2954
  }
2801
2955
  }
2802
2956
  },
@@ -2804,7 +2958,7 @@
2804
2958
  var fields = isChangeGroup ? __spreadArray(__spreadArray([], __read(subFields)), __read(mainFields)) : [];
2805
2959
  return trigger(__spreadArray(__spreadArray([], __read(fields)), [fieldNames.weather3]));
2806
2960
  }
2807
- }), /*#__PURE__*/React__default['default'].createElement(TafFormTextField, {
2961
+ }), /*#__PURE__*/React__default["default"].createElement(TafFormTextField, {
2808
2962
  label: "Weather",
2809
2963
  name: fieldNames.weather3,
2810
2964
  disabled: disabled,
@@ -2812,11 +2966,11 @@
2812
2966
  rules: {
2813
2967
  validate: {
2814
2968
  validateThirdWeatherField: function validateThirdWeatherField$1(value) {
2815
- return validateThirdWeatherField(getValues(fieldNames.weather1), getValues(fieldNames.weather2), value);
2969
+ return validateThirdWeatherField(getValues(fieldNames.weather1), getValues(fieldNames.weather2), value, getValues(fieldNames.visibility));
2816
2970
  }
2817
2971
  }
2818
2972
  }
2819
- }), /*#__PURE__*/React__default['default'].createElement(TafFormTextField, {
2973
+ }), /*#__PURE__*/React__default["default"].createElement(TafFormTextField, {
2820
2974
  label: "Cloud",
2821
2975
  name: fieldNames.cloud1,
2822
2976
  disabled: disabled,
@@ -2827,14 +2981,16 @@
2827
2981
  return _validateRequiredMainFields(value, 'Clouds');
2828
2982
  },
2829
2983
  validateRequiredSub: validateRequiredSub,
2830
- validateFirstCloud: validateFirstCloud
2984
+ validateFirstCloud: function validateFirstCloud$1(value) {
2985
+ return validateFirstCloud(value, getValues(fieldNames.visibility));
2986
+ }
2831
2987
  }
2832
2988
  },
2833
2989
  onBlur: function onBlur() {
2834
2990
  var fields = isChangeGroup ? __spreadArray(__spreadArray([], __read(subFields)), __read(mainFields)) : [];
2835
2991
  return trigger(__spreadArray(__spreadArray([], __read(fields)), [fieldNames.cloud2, fieldNames.cloud3, fieldNames.cloud4]));
2836
2992
  }
2837
- }), /*#__PURE__*/React__default['default'].createElement(TafFormTextField, {
2993
+ }), /*#__PURE__*/React__default["default"].createElement(TafFormTextField, {
2838
2994
  label: "Cloud",
2839
2995
  name: fieldNames.cloud2,
2840
2996
  disabled: disabled,
@@ -2842,14 +2998,14 @@
2842
2998
  rules: {
2843
2999
  validate: {
2844
3000
  validateSecondCloud: function validateSecondCloud$1(value) {
2845
- return validateSecondCloud(getValues(fieldNames.cloud1), value);
3001
+ return validateSecondCloud(getValues(fieldNames.cloud1), value, getValues(fieldNames.visibility));
2846
3002
  }
2847
3003
  }
2848
3004
  },
2849
3005
  onBlur: function onBlur() {
2850
3006
  return trigger([fieldNames.cloud3, fieldNames.cloud4]);
2851
3007
  }
2852
- }), /*#__PURE__*/React__default['default'].createElement(TafFormTextField, {
3008
+ }), /*#__PURE__*/React__default["default"].createElement(TafFormTextField, {
2853
3009
  label: "Cloud",
2854
3010
  name: fieldNames.cloud3,
2855
3011
  disabled: disabled,
@@ -2857,14 +3013,14 @@
2857
3013
  rules: {
2858
3014
  validate: {
2859
3015
  validateThirdCloud: function validateThirdCloud$1(value) {
2860
- return validateThirdCloud(getValues(fieldNames.cloud1), getValues(fieldNames.cloud2), value);
3016
+ return validateThirdCloud(getValues(fieldNames.cloud1), getValues(fieldNames.cloud2), value, getValues(fieldNames.visibility));
2861
3017
  }
2862
3018
  }
2863
3019
  },
2864
3020
  onBlur: function onBlur() {
2865
3021
  return trigger(fieldNames.cloud4);
2866
3022
  }
2867
- }), /*#__PURE__*/React__default['default'].createElement(TafFormTextField, {
3023
+ }), /*#__PURE__*/React__default["default"].createElement(TafFormTextField, {
2868
3024
  label: "Cloud",
2869
3025
  name: fieldNames.cloud4,
2870
3026
  disabled: disabled,
@@ -2872,17 +3028,17 @@
2872
3028
  rules: {
2873
3029
  validate: {
2874
3030
  validateFourthCloud: function validateFourthCloud$1(value) {
2875
- return validateFourthCloud(getValues(fieldNames.cloud1), getValues(fieldNames.cloud2), getValues(fieldNames.cloud3), value);
3031
+ return validateFourthCloud(getValues(fieldNames.cloud1), getValues(fieldNames.cloud2), getValues(fieldNames.cloud3), value, getValues(fieldNames.visibility));
2876
3032
  }
2877
3033
  }
2878
3034
  }
2879
- }), (!isChangeGroup || disabled) && /*#__PURE__*/React__default['default'].createElement(core.Grid, {
3035
+ }), (!isChangeGroup || disabled) && /*#__PURE__*/React__default["default"].createElement(core.Grid, {
2880
3036
  item: true,
2881
3037
  xs: true
2882
- }), isChangeGroup && !disabled && /*#__PURE__*/React__default['default'].createElement(core.Grid, {
3038
+ }), isChangeGroup && !disabled && /*#__PURE__*/React__default["default"].createElement(core.Grid, {
2883
3039
  item: true,
2884
3040
  xs: true
2885
- }, /*#__PURE__*/React__default['default'].createElement(core.IconButton, __assign({
3041
+ }, /*#__PURE__*/React__default["default"].createElement(core.IconButton, __assign({
2886
3042
  "aria-label": "delete",
2887
3043
  "data-testid": "remove-changeGroup",
2888
3044
  onClick: function onClick() {
@@ -2890,7 +3046,7 @@
2890
3046
  }
2891
3047
  }, lastRow ? {
2892
3048
  tabIndex: '-1'
2893
- } : {}), /*#__PURE__*/React__default['default'].createElement(icons.Delete, null))));
3049
+ } : {}), /*#__PURE__*/React__default["default"].createElement(icons.Delete, null))));
2894
3050
  });
2895
3051
 
2896
3052
  var getIssuesLabel = function getIssuesLabel(sumOfErrors) {
@@ -2933,6 +3089,7 @@
2933
3089
  return /*#__PURE__*/React__namespace.createElement(core.Tooltip, {
2934
3090
  title: "View details"
2935
3091
  }, /*#__PURE__*/React__namespace.createElement(core.Chip, {
3092
+ "data-testid": "issuesButton",
2936
3093
  size: "small",
2937
3094
  label: getIssuesLabel(sumOfErrors),
2938
3095
  style: __assign({}, buttonStyle(color)),
@@ -2941,20 +3098,20 @@
2941
3098
  };
2942
3099
 
2943
3100
  var ThumbsUp = function ThumbsUp(props) {
2944
- return /*#__PURE__*/React__default['default'].createElement(core.SvgIcon, __assign({
3101
+ return /*#__PURE__*/React__default["default"].createElement(core.SvgIcon, __assign({
2945
3102
  fontSize: "inherit",
2946
3103
  viewBox: "0 0 58 69"
2947
- }, props), /*#__PURE__*/React__default['default'].createElement("title", null, "Thumbs up"), /*#__PURE__*/React__default['default'].createElement("g", {
3104
+ }, props), /*#__PURE__*/React__default["default"].createElement("title", null, "Thumbs up"), /*#__PURE__*/React__default["default"].createElement("g", {
2948
3105
  id: "Thumbs-up",
2949
3106
  stroke: "none",
2950
3107
  strokeWidth: "1",
2951
3108
  fill: "none",
2952
3109
  fillRule: "evenodd"
2953
- }, /*#__PURE__*/React__default['default'].createElement("path", {
3110
+ }, /*#__PURE__*/React__default["default"].createElement("path", {
2954
3111
  d: "M3.99883665,31.7843145 C7.41834232,30.0745617 7.39773108,30.3805485 10.9988366,28.8843145 C14.5999422,27.3880805 16.06167,27.0500418 18.1988366,25.8843145 C19.0904815,25.3979628 19.820202,24.8243341 20.5488366,24.1634286 C20.9845024,23.7682595 22.8819728,21.7794437 23.5488366,20.8277879 C24.2586546,19.8148341 25.1756722,18.5003429 25.9988366,16.8843145 C28.3936103,12.1829184 28.889513,9.4076237 29.8988366,6.88431453 C30.4506375,5.50481234 31.0206747,4.13576029 31.6089482,2.77715837 C31.8562473,2.20602771 32.1648239,1.47549588 32.9988366,0.88431453 C33.2365758,0.715795602 34.0556054,0.253858312 35.0144255,0.0843145301 C36.0262338,-0.0945989315 37.1937102,0.0296108539 37.9980376,0.28431453 C38.7449403,0.520833719 39.4692925,0.860990256 40.1710941,1.30478414 C40.2879689,1.37869154 41.2393256,2.13799569 41.8988366,3.58269657 C42.290748,4.4412034 42.5040976,4.92788584 42.7988366,6.88431453 C42.9953293,8.18860032 43.0453293,9.52193365 42.9488366,10.8843145 C42.947848,11.8251839 42.6645146,13.1585172 42.0988366,14.8843145 C41.9160014,15.4421169 41.6403041,16.2990156 41.2988366,17.1941099 C40.9325633,18.1542284 40.4965053,19.1582935 40.1988366,19.8843145 C39.1594737,22.4193462 37.7498356,25.6900566 37.4561402,26.5124038 C37.2603433,27.0606352 37.1745754,27.6512721 37.1988366,28.2843145 C37.21217,28.4109812 37.2455033,28.5187344 37.2988366,28.6075742 C37.35217,28.6964139 37.45217,28.821994 37.5988366,28.9843145 C38.7401033,28.7100145 39.6802034,28.5266812 40.4191367,28.4343145 C41.6262088,28.2834305 44.7342553,28.0975232 47.4943878,28.1962584 C50.2545202,28.2949937 51.7465936,28.4428269 52.9988366,28.8843145 C53.8336653,29.1786396 54.540332,29.8453063 55.1188366,30.8843145 C55.3507184,31.5616882 55.477385,32.2303996 55.4988366,32.8904489 C55.5202882,33.5504981 55.4369549,34.21512 55.2488366,34.8843145 C54.956044,35.585751 54.5393773,36.1190843 53.9988366,36.4843145 C53.4582959,36.8495447 52.6416293,37.1495447 51.5488366,37.3843145 C51.46217,37.6709812 51.4455033,37.9376479 51.4988366,38.1843145 C51.55217,38.4309812 51.7188366,38.5976479 51.9988366,38.6843145 C53.0027645,38.7154727 53.6750204,38.7821393 54.0156044,38.8843145 C54.7031375,39.0905745 55.3642149,39.4239078 55.9988366,39.8843145 C56.4980387,40.3674862 56.831372,40.7202741 56.9988366,40.9426784 C57.2459451,41.2708552 57.8988366,42.3863253 57.8988366,43.8843145 C57.8988366,44.882974 57.53217,45.882974 56.7988366,46.8843145 C56.4100652,47.2645006 55.9767318,47.5818962 55.4988366,47.8365013 C55.0209415,48.0911064 54.5157721,48.2737108 53.9833285,48.3843145 L52.6988366,48.3843145 C52.2988366,48.6576479 52.0988366,48.9643145 52.0988366,49.3043145 C52.0988366,49.6443145 52.1655033,49.9376479 52.2988366,50.1843145 L53.4440689,50.6343145 C54.0486381,50.9097065 54.566894,51.3263732 54.9988366,51.8843145 C55.2403033,52.1962176 55.7126861,53.1830494 55.7488366,53.8843145 C55.7849872,54.5855797 55.7892838,54.8412841 55.675362,55.3021772 C55.5409724,55.8458769 55.3321306,56.373256 54.9488366,56.8843145 C54.6880408,57.2320423 54.3421972,57.542124 54.0113058,57.8145598 C53.720974,58.0536013 53.0623839,58.3923099 52.0355354,58.6843145 C51.8426264,58.739172 51.4970601,58.8058387 50.9988366,58.8843145 L49.2488366,58.9843145 C48.96217,59.1509812 48.7955033,59.3509812 48.7488366,59.5843145 C48.70217,59.8176479 48.7855033,60.0643145 48.9988366,60.3243145 L50.0168579,60.6843145 C51.0110333,61.2176479 51.5216929,61.9496429 51.5488366,62.8802998 C51.5895523,64.276285 51.475285,65.4556464 50.0016466,66.7843145 C49.4876586,67.2477386 48.8545536,67.4912052 48.1023318,67.7343145 C47.6452927,67.8820242 46.8607943,68.0486909 45.7488366,68.2343145 L40.0010327,68.6843145 C38.1462353,68.7443145 36.81217,68.7776479 35.9988366,68.7843145 C34.7788366,68.7943145 28.6377735,68.7414839 25.3910307,68.5132824 C22.1442879,68.2850808 21.4236621,68.1168902 18.9258088,67.5843145 C16.4279556,67.0517389 16.0894589,66.9976619 13.9988366,66.0843145 C12.6050885,65.4754163 11.2717551,64.6754163 9.99883665,63.6843145 L5.99912679,59.8445931 C5.6005732,59.505994 5.13964906,59.1744645 4.61635438,58.8500046 C3.83141237,58.3633147 3.44878136,58.2942773 2.99883665,57.9843145 C2.44718062,57.6042838 2.05635486,57.1737105 1.71932092,56.7662516 C1.30382099,56.2639309 0.723401214,54.7703696 0.498836646,53.8721113 C0.239479861,52.8346842 0.182966814,51.4491222 0.134208514,50.425802 C0.00166588165,47.644049 0.0975252306,47.2982714 0.0687602378,44.8458357 C0.0452570713,42.8420109 -0.0277106081,40.4082829 0.0112302522,39.9409643 C0.224109489,37.3862585 0.450803729,36.3915418 0.898836646,34.8843145 C1.09883665,34.2114947 1.78104521,33.1945675 2.17275045,32.889441 C2.5644557,32.5843145 3.13875358,32.2143561 3.99883665,31.7843145 Z",
2955
3112
  id: "Path-2",
2956
3113
  fill: "#FFBF00"
2957
- }), /*#__PURE__*/React__default['default'].createElement("path", {
3114
+ }), /*#__PURE__*/React__default["default"].createElement("path", {
2958
3115
  d: "M37.1988366,28.2843145 C36.6491114,28.3570112 36.2566531,28.4236779 36.0214618,28.4843145 C35.0603746,28.7321005 34.3937143,29.0314706 34.021481,29.207818 C33.777778,29.3232735 32.5285093,30.04554 31.6988366,30.8956082 C31.0356177,31.5751308 30.7670551,32.3363186 30.5620165,32.9344937 C29.9561734,34.7019667 30.4904911,36.5989836 30.5988366,36.8981554 C30.8174274,37.5017447 31.0945063,37.9694877 31.2988366,38.4843145 C31.4064264,38.7553957 31.4498365,39.7521385 31.3985954,40.9130014 C31.388536,41.1408948 31.3995111,42.8738523 30.5816296,45.1307691 C30.125032,46.3907349 29.4940749,47.743868 28.6988366,48.906031 C27.6082165,50.4998658 26.3589437,51.7345157 26.1988366,51.8770596 C25.2520649,52.7199732 23.8988366,53.516454 23.3777374,54.1031009 C22.8566381,54.6897478 22.8988366,54.7174426 22.8988366,54.8843145 C22.8988366,55.0643438 22.9342857,55.2139882 23.0063234,55.32641 C23.2544011,55.7135594 23.9363916,55.6592779 25.0988366,54.8843145 C25.8683088,54.3713331 26.8213311,53.5952018 27.5988366,52.8259025 C28.3369913,52.0955388 28.9092218,51.3713331 29.2988366,50.8843145 C29.6096134,50.4958436 30.1890589,49.8244169 30.7488366,48.8700346 C31.0160857,48.4143934 31.4327524,47.5858201 31.9988366,46.3843145 C31.9988366,46.7176479 32.33217,47.2176479 32.9988366,47.8843145 C33.1686748,48.0541527 33.5020081,48.3041527 33.9988366,48.6343145 C33.535822,48.6343145 33.2024887,48.6676479 32.9988366,48.7343145 C31.9774176,49.1343145 31.4345654,49.3440777 30.8488366,49.8843145 C30.1709576,50.5095446 29.6310297,51.1756019 29.3988366,52.3843145 C29.1722814,53.5636787 29.3142136,54.632966 29.6488366,55.5921767 C29.928312,56.3933044 30.3156141,57.1176481 30.9865396,57.7652076 C31.1856402,57.9573742 31.5230725,58.2304098 31.9988366,58.5843145 C30.2988366,59.4509812 29.4488366,60.8843145 29.4488366,62.8843145 C29.4488366,65.8843145 31.4988366,68.7843145 35.9988366,68.7843145 C37.2162866,68.7843145 38.5382158,68.7607397 39.9988366,68.6843145 C41.1579568,68.623665 43.0746234,68.473665 45.7488366,68.2343145 C42.81999,68.0652276 40.9033233,67.948561 39.9988366,67.8843145 C38.4397862,67.7735739 34.9576244,67.4218793 34.5109642,67.2843145 C33.8898949,67.0930342 33.3876529,66.66767 32.9988366,66.3843145 C31.7988366,65.509797 31.6488366,63.8668327 31.6488366,63.3843145 C31.6488366,62.6767971 32.115551,61.4820497 32.7124803,60.9291427 C33.2967248,60.387985 34.101504,59.9827037 34.9988366,59.8343145 C36.8129843,59.5343145 37.8279851,59.6343145 38.9968712,59.6343145 C41.8836014,59.6343145 46.4559662,59.9063364 47.0327603,59.9503801 C47.6352731,59.9963876 48.2906319,60.1194654 48.9988366,60.3196132 C48.7881139,60.0647262 48.7047806,59.8196266 48.7488366,59.5843145 C48.7928927,59.3490025 48.9595594,59.1490025 49.2488366,58.9843145 C41.7042463,58.5910176 37.2875796,58.2576842 35.9988366,57.9843145 C34.0657222,57.57426 33.0783849,56.5232188 32.4988366,55.3843145 C32.1808463,54.7594131 31.9988366,54.0680377 32.1988366,52.8843145 C32.4054546,51.661422 33.0758788,51.154421 33.9988366,50.7343145 C35.0343809,50.2629616 36.2160776,50.213626 38.0168693,50.1343145 C41.4226671,49.9843145 41.9988366,49.8715355 44.9988366,49.8843145 C47.4322993,49.8928339 49.8656327,49.9928339 52.2988366,50.1843145 C52.1655033,49.9452767 52.0988366,49.6535253 52.0988366,49.3090604 C52.0988366,48.9645954 52.2988366,48.6563468 52.6988366,48.3843145 C49.4970675,48.4374708 47.2644784,48.4840975 46.0010696,48.5241946 C42.8267531,48.6249387 40.1650305,48.7843145 38.0159019,48.6090596 C36.5073153,48.3843145 35.5349602,47.7454709 35.0988366,47.3586886 C33.5267511,45.9644623 33.6909724,44.1458838 33.6988366,43.902953 C33.7490538,42.3517256 34.2594453,41.6540102 34.9988366,41.2843145 C36.9988366,40.2843145 38.521019,40.3843145 40.9988366,39.8843145 L51.9988366,38.6843145 C51.7847588,38.5992008 51.6347588,38.4325341 51.5488366,38.1843145 C51.4629145,37.9360949 51.4629145,37.6694283 51.5488366,37.3843145 C48.6830402,37.6590904 46.693269,37.8590904 45.579523,37.9843145 C44.2653604,38.1320725 42.7384649,38.3154059 40.9988366,38.5343145 C38.9988366,38.6009812 37.6749072,38.5733169 37.0270482,38.4513217 C35.0988366,38.2216852 33.4888366,37.4843145 33.4388366,34.8545872 C33.3888366,32.7744565 33.7430954,32.2207578 33.8988366,31.9295788 C34.3117653,31.1575537 34.9128559,30.575799 35.3988366,30.1843145 C36.0681111,29.6451768 36.8014444,29.2451768 37.5988366,28.9843145 C37.4503711,28.8228789 37.3503711,28.6970685 37.2988366,28.6068833 C37.2473022,28.516698 37.2139689,28.4091751 37.1988366,28.2843145 Z",
2959
3116
  id: "Path",
2960
3117
  fill: "#F28700"
@@ -2978,32 +3135,9 @@
2978
3135
  * Copyright 2021 - Finnish Meteorological Institute (FMI)
2979
3136
  * */
2980
3137
  var useStyles$8 = core.makeStyles({
2981
- issuesPane: {
2982
- display: 'flex',
2983
- flexDirection: 'column',
2984
- overflow: 'hidden',
2985
- width: '577px',
2986
- height: '164px',
2987
- marginTop: '16px'
2988
- },
2989
- paneHeader: {
2990
- display: 'flex',
2991
- justifyContent: 'space-between',
2992
- alignItems: 'center',
2993
- height: '24px'
2994
- },
2995
- paneTitle: {
2996
- display: 'flex',
2997
- justifyContent: 'space-between',
2998
- alignItems: 'center',
2999
- marginLeft: '32px',
3000
- fontSize: '10px',
3001
- fontWeight: 'bold'
3002
- },
3003
3138
  paneContent: {
3004
3139
  marginTop: '16px',
3005
- marginLeft: '32px',
3006
- overflowY: 'scroll'
3140
+ marginLeft: '24px'
3007
3141
  },
3008
3142
  image: {
3009
3143
  fontSize: '4rem'
@@ -3076,23 +3210,28 @@
3076
3210
  };
3077
3211
 
3078
3212
  var IssuesPane = function IssuesPane(_a) {
3079
- var handleClose = _a.handleClose,
3213
+ var isOpen = _a.isOpen,
3214
+ handleClose = _a.handleClose,
3080
3215
  _b = _a.errorList,
3081
3216
  errorList = _b === void 0 ? [] : _b;
3082
3217
  var classes = useStyles$8();
3083
- return /*#__PURE__*/React__namespace.createElement(core.Paper, {
3084
- elevation: 3,
3085
- className: classes.issuesPane
3218
+ return /*#__PURE__*/React__namespace.createElement(shared.ToolContainerDraggable, {
3219
+ startSize: {
3220
+ width: '577px',
3221
+ height: '200px'
3222
+ },
3223
+ startPosition: {
3224
+ left: 370,
3225
+ top: 570
3226
+ },
3227
+ minWidth: 300,
3228
+ onClose: handleClose,
3229
+ title: getPaneTitle(errorList.length),
3230
+ headerSize: "xs",
3231
+ isOpen: isOpen,
3232
+ "data-testid": "moveable-issues-pane",
3233
+ bounds: "body"
3086
3234
  }, /*#__PURE__*/React__namespace.createElement("div", {
3087
- className: classes.paneHeader
3088
- }, /*#__PURE__*/React__namespace.createElement(core.Typography, {
3089
- "data-testid": "issuesPaneTitle",
3090
- className: classes.paneTitle
3091
- }, getPaneTitle(errorList.length)), /*#__PURE__*/React__namespace.createElement(core.IconButton, {
3092
- "data-testid": "closeIssuesPane",
3093
- size: "small",
3094
- onClick: handleClose
3095
- }, /*#__PURE__*/React__namespace.createElement(icons.Close, null))), /*#__PURE__*/React__namespace.createElement("div", {
3096
3235
  className: classes.paneContent
3097
3236
  }, errorList.length === 0 && /*#__PURE__*/React__namespace.createElement("div", {
3098
3237
  className: classes.image,
@@ -3150,7 +3289,7 @@
3150
3289
 
3151
3290
  var filterDuplicateErrors = function filterDuplicateErrors(errors) {
3152
3291
  return errors.reduce(function (list, error) {
3153
- // only check on type validateRequiredSub since this is giving 'duplicates'
3292
+ // check on type validateRequiredSub and validateRequiredMainOptional since these are giving 'duplicates'
3154
3293
  if (error.type === 'validateRequiredSub') {
3155
3294
  var exist = list.find(function (e) {
3156
3295
  return e.type === 'validateRequiredSub' && e.row === error.row;
@@ -3158,6 +3297,13 @@
3158
3297
  return exist ? list : list.concat(error);
3159
3298
  }
3160
3299
 
3300
+ if (error.type === 'validateRequiredMainOptional') {
3301
+ var exist = list.find(function (e) {
3302
+ return e.type === 'validateRequiredMainOptional' && e.row === error.row;
3303
+ });
3304
+ return exist ? list : list.concat(error);
3305
+ }
3306
+
3161
3307
  return list.concat(error);
3162
3308
  }, []);
3163
3309
  };
@@ -3169,7 +3315,7 @@
3169
3315
  var errors = reactHookForm.useFormContext().errors;
3170
3316
  var errorList = filterDuplicateErrors(getErrors(errors));
3171
3317
 
3172
- var _b = __read(React__default['default'].useState(false), 2),
3318
+ var _b = __read(React__default["default"].useState(false), 2),
3173
3319
  isIssuesPaneOpen = _b[0],
3174
3320
  setIsIssuesPaneOpen = _b[1];
3175
3321
 
@@ -3177,19 +3323,19 @@
3177
3323
  return setIsIssuesPaneOpen(!isIssuesPaneOpen);
3178
3324
  };
3179
3325
 
3180
- return /*#__PURE__*/React__default['default'].createElement(React__default['default'].Fragment, null, /*#__PURE__*/React__default['default'].createElement(core.Grid, {
3326
+ return /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, /*#__PURE__*/React__default["default"].createElement(core.Grid, {
3181
3327
  container: true,
3182
3328
  justify: "space-between",
3183
3329
  alignItems: "center",
3184
3330
  className: classes.lifecycleButtons
3185
- }, /*#__PURE__*/React__default['default'].createElement(core.Grid, {
3331
+ }, /*#__PURE__*/React__default["default"].createElement(core.Grid, {
3186
3332
  item: true
3187
- }, /*#__PURE__*/React__default['default'].createElement(IssuesButton, {
3333
+ }, /*#__PURE__*/React__default["default"].createElement(IssuesButton, {
3188
3334
  sumOfErrors: errorList.length,
3189
3335
  togglePane: toggleIssuesPane
3190
- })), /*#__PURE__*/React__default['default'].createElement(core.Grid, {
3336
+ })), /*#__PURE__*/React__default["default"].createElement(core.Grid, {
3191
3337
  item: true
3192
- }, /*#__PURE__*/React__default['default'].createElement(core.Button, {
3338
+ }, /*#__PURE__*/React__default["default"].createElement(core.Button, {
3193
3339
  "data-testid": "discardtaf",
3194
3340
  variant: "outlined",
3195
3341
  color: "secondary",
@@ -3199,7 +3345,7 @@
3199
3345
  // Simply discard the changes and close the dialog.
3200
3346
  onTafFormButtonPress('DISCARD');
3201
3347
  }
3202
- }, "Discard"), /*#__PURE__*/React__default['default'].createElement(core.Button, {
3348
+ }, "Discard"), /*#__PURE__*/React__default["default"].createElement(core.Button, {
3203
3349
  "data-testid": "savedrafttaf",
3204
3350
  variant: "outlined",
3205
3351
  color: "secondary",
@@ -3229,7 +3375,7 @@
3229
3375
  break;
3230
3376
  }
3231
3377
  }
3232
- }, "Save"), /*#__PURE__*/React__default['default'].createElement(core.Button, {
3378
+ }, "Save"), /*#__PURE__*/React__default["default"].createElement(core.Button, {
3233
3379
  "data-testid": "publishtaf",
3234
3380
  variant: "outlined",
3235
3381
  color: "secondary",
@@ -3259,9 +3405,10 @@
3259
3405
  break;
3260
3406
  }
3261
3407
  }
3262
- }, "Publish"))), isIssuesPaneOpen && /*#__PURE__*/React__default['default'].createElement(IssuesPane, {
3408
+ }, "Publish"))), /*#__PURE__*/React__default["default"].createElement(IssuesPane, {
3263
3409
  errorList: errorList,
3264
- handleClose: toggleIssuesPane
3410
+ handleClose: toggleIssuesPane,
3411
+ isOpen: isIssuesPaneOpen
3265
3412
  }));
3266
3413
  };
3267
3414
 
@@ -3299,17 +3446,20 @@
3299
3446
  var _b = _a.isSorting,
3300
3447
  isSorting = _b === void 0 ? false : _b,
3301
3448
  _c = _a.isDisabled,
3302
- isDisabled = _c === void 0 ? false : _c;
3449
+ isDisabled = _c === void 0 ? false : _c,
3450
+ index = _a.index;
3303
3451
  var classes = useStyles$7(isSorting);
3304
- return /*#__PURE__*/React__default['default'].createElement(core.IconButton, {
3452
+ return /*#__PURE__*/React__default["default"].createElement(core.IconButton, {
3305
3453
  className: classes.dragHandle + " handle",
3306
- "data-testid": "dragHandle",
3454
+ "data-testid": "dragHandle-" + index,
3307
3455
  disableRipple: true,
3308
3456
  disabled: isDisabled
3309
- }, /*#__PURE__*/React__default['default'].createElement(icons.DragIndicator, null));
3457
+ }, /*#__PURE__*/React__default["default"].createElement(icons.DragIndicator, null));
3310
3458
  };
3311
3459
 
3312
- var emptyRow = {
3460
+ var noop = function noop() {};
3461
+
3462
+ var emptyChangegroup = {
3313
3463
  valid: '',
3314
3464
  wind: '',
3315
3465
  visibility: '',
@@ -3329,8 +3479,7 @@
3329
3479
  };
3330
3480
 
3331
3481
  var TafForm = function TafForm(_a) {
3332
- var mode = _a.mode,
3333
- changeGroups = _a.changeGroups,
3482
+ var isDisabled = _a.isDisabled,
3334
3483
  tafAction = _a.tafAction,
3335
3484
  _b = _a.staticTAC,
3336
3485
  staticTAC = _b === void 0 ? '' : _b,
@@ -3346,19 +3495,22 @@
3346
3495
  DraftFieldHelper = _d.DraftFieldHelper;
3347
3496
 
3348
3497
  var api$1 = api.useApiContext().api;
3349
- var isDisabled = mode === 'view';
3498
+ var isMounted = shared.useIsMounted().isMounted;
3350
3499
 
3351
3500
  var _e = reactHookForm.useFormContext(),
3352
3501
  control = _e.control,
3353
3502
  handleSubmit = _e.handleSubmit,
3354
3503
  watch = _e.watch,
3355
- getValues = _e.getValues,
3356
- errors = _e.errors,
3357
- trigger = _e.trigger;
3504
+ trigger = _e.trigger,
3505
+ formState = _e.formState,
3506
+ getValues = _e.getValues;
3358
3507
 
3508
+ var isFormDirty = formState.isDirty,
3509
+ errors = formState.errors;
3510
+ shared.usePreventBrowserClose(isFormDirty && !isDisabled);
3359
3511
  var hiddenInputFields = ['baseTime', 'issueDate', 'type', 'uuid', 'validDateStart', 'validDateEnd', 'status', 'previousId', 'previousValidDateStart', 'previousValidDateEnd'];
3360
3512
 
3361
- var _f = __read(React__default['default'].useState(watch()), 2),
3513
+ var _f = __read(React__default["default"].useState(watch()), 2),
3362
3514
  delayedFormValues = _f[0],
3363
3515
  setDelayedFormValues = _f[1];
3364
3516
 
@@ -3366,35 +3518,26 @@
3366
3518
  TAC = _g[0],
3367
3519
  updateTAC = _g[1];
3368
3520
 
3369
- React__default['default'].useEffect(function () {
3370
- if (!Object.keys(errors).length && staticTAC === '') {
3371
- updateTAC(convertTafValuesToObject(delayedFormValues));
3372
- } // eslint-disable-next-line react-hooks/exhaustive-deps
3373
-
3374
- }, [delayedFormValues]);
3521
+ var hasErrors = Object.keys(errors).length;
3375
3522
 
3376
3523
  var onFormBlur = function onFormBlur() {
3377
3524
  setDelayedFormValues(getValues());
3378
3525
  };
3379
3526
 
3380
- var _h = __read(React__default['default'].useState(false), 2),
3381
- isFormDirty = _h[0],
3382
- setFormDirty = _h[1];
3383
-
3384
- var onFormChange = function onFormChange() {
3385
- return !isFormDirty ? setFormDirty(true) : null;
3386
- };
3527
+ React__default["default"].useEffect(function () {
3528
+ if (staticTAC === '' && isMounted.current && isFormDirty) {
3529
+ var newTAC = hasErrors ? null : convertTafValuesToObject(delayedFormValues);
3530
+ updateTAC(newTAC);
3531
+ } // eslint-disable-next-line react-hooks/exhaustive-deps
3387
3532
 
3388
- shared.usePreventBrowserClose(isFormDirty && !isDisabled);
3533
+ }, [delayedFormValues]);
3534
+ React__default["default"].useEffect(function () {
3535
+ // prevent updating an error while typing
3536
+ if (!hasErrors && isFormDirty && document.activeElement.tagName !== 'INPUT') {
3537
+ updateTAC(convertTafValuesToObject(delayedFormValues));
3538
+ } // eslint-disable-next-line react-hooks/exhaustive-deps
3389
3539
 
3390
- var _j = reactHookForm.useFieldArray({
3391
- control: control,
3392
- name: 'changeGroups'
3393
- }),
3394
- fields = _j.fields,
3395
- append = _j.append,
3396
- remove = _j.remove,
3397
- move = _j.move;
3540
+ }, [hasErrors]);
3398
3541
 
3399
3542
  var onSubmit = function onSubmit(data) {
3400
3543
  // eslint-disable-next-line no-console
@@ -3448,69 +3591,69 @@
3448
3591
  }
3449
3592
  };
3450
3593
 
3451
- var onAddRow = function onAddRow() {
3452
- append(emptyRow);
3453
- };
3454
-
3455
- React__default['default'].useEffect(function () {
3456
- // set changegroups on mount (if no changegroups - add empty one by default)
3457
- if (changeGroups.length > 0) {
3458
- changeGroups.forEach(function (group) {
3459
- append(group, false);
3460
- });
3461
- } else if (!isDisabled) {
3462
- append(emptyRow, false);
3463
- } // eslint-disable-next-line react-hooks/exhaustive-deps
3594
+ var _h = reactHookForm.useFieldArray({
3595
+ control: control,
3596
+ name: 'changeGroups'
3597
+ }),
3598
+ fields = _h.fields,
3599
+ append = _h.append,
3600
+ remove = _h.remove,
3601
+ move = _h.move;
3464
3602
 
3465
- }, []);
3603
+ var lastTotalFields = shared.usePrevious(fields.length);
3466
3604
 
3467
- var _k = useDragOrder(trigger, move, fields),
3468
- onChangeOrder = _k.onChangeOrder,
3469
- sortedFields = _k.sortedFields,
3470
- setSortedFields = _k.setSortedFields;
3605
+ var _j = useDragOrder(trigger, move, onFormBlur),
3606
+ onChangeOrder = _j.onChangeOrder,
3607
+ onStartDrag = _j.onStartDrag,
3608
+ activeDraggingIndex = _j.activeDraggingIndex;
3471
3609
 
3472
3610
  var onRemoverow = function onRemoverow(index) {
3473
3611
  remove(index);
3474
- var newList = fields.length > 1 ? fields.filter(function (_, fieldIndex) {
3475
- return fieldIndex === index;
3476
- }) : [];
3477
- setSortedFields(newList);
3478
3612
  };
3479
3613
 
3480
- return /*#__PURE__*/React__default['default'].createElement("form", {
3614
+ var onAddRow = function onAddRow() {
3615
+ append(emptyChangegroup, true);
3616
+ };
3617
+
3618
+ React__default["default"].useEffect(function () {
3619
+ if (isFormDirty && fields.length !== lastTotalFields) {
3620
+ onFormBlur();
3621
+ trigger(); // trigger all field validation,
3622
+ } // eslint-disable-next-line react-hooks/exhaustive-deps
3623
+
3624
+ }, [fields.length, isFormDirty]);
3625
+ return /*#__PURE__*/React__default["default"].createElement("form", {
3481
3626
  onSubmit: handleSubmit(onSubmit),
3482
- onChange: onFormChange,
3483
3627
  onBlur: onFormBlur
3484
- }, /*#__PURE__*/React__default['default'].createElement(core.Typography, {
3628
+ }, /*#__PURE__*/React__default["default"].createElement(core.Typography, {
3485
3629
  className: classes.tacTitle
3486
- }, "TAC"), /*#__PURE__*/React__default['default'].createElement(core.Typography, {
3630
+ }, "TAC"), /*#__PURE__*/React__default["default"].createElement(core.Typography, {
3487
3631
  "data-testid": "form-tac-message",
3488
3632
  className: classes.tacText
3489
3633
  }, TAC.split('\n').map(function (line) {
3490
- return /*#__PURE__*/React__default['default'].createElement("span", {
3634
+ return /*#__PURE__*/React__default["default"].createElement("span", {
3491
3635
  key: line,
3492
3636
  className: classes.tacLine,
3493
3637
  "data-testid": "tafform-tac-message-line"
3494
3638
  }, line);
3495
- })), /*#__PURE__*/React__default['default'].createElement(TafFormRow, {
3639
+ })), /*#__PURE__*/React__default["default"].createElement(TafFormRow, {
3496
3640
  disabled: isDisabled
3497
- }), /*#__PURE__*/React__default['default'].createElement(reactSortablejs.ReactSortable, {
3641
+ }), /*#__PURE__*/React__default["default"].createElement(reactSortablejs.ReactSortable, {
3498
3642
  tag: "div",
3499
- list: sortedFields,
3500
- setList: setSortedFields,
3643
+ list: fields,
3644
+ setList: noop,
3501
3645
  animation: 200,
3502
3646
  onSort: onChangeOrder,
3503
3647
  handle: ".handle",
3504
3648
  direction: "vertical",
3505
3649
  // hover props
3506
3650
  forceFallback: true,
3507
- onStart: function onStart() {
3651
+ onStart: function onStart(event) {
3652
+ onStartDrag(event);
3508
3653
  reactSortablejs.Sortable.ghost.style.opacity = '1';
3509
3654
  }
3510
- }, sortedFields.map(function (_a, index) {
3511
- var chosen = _a.chosen;
3512
- var item = fields[index];
3513
- return /*#__PURE__*/React__default['default'].createElement(TafFormRow, {
3655
+ }, fields.map(function (item, index) {
3656
+ return /*#__PURE__*/React__default["default"].createElement(TafFormRow, {
3514
3657
  field: item,
3515
3658
  className: classes.formRow,
3516
3659
  key: item.id,
@@ -3519,30 +3662,31 @@
3519
3662
  disabled: isDisabled,
3520
3663
  onRemoveChangeGroup: onRemoverow,
3521
3664
  isChangeGroup: true,
3522
- dragHandle: /*#__PURE__*/React__default['default'].createElement(DragHandle, {
3523
- isDisabled: sortedFields.length === 1 || isDisabled,
3524
- isSorting: chosen
3665
+ dragHandle: /*#__PURE__*/React__default["default"].createElement(DragHandle, {
3666
+ isDisabled: fields.length === 1 || isDisabled,
3667
+ isSorting: activeDraggingIndex === index,
3668
+ index: index
3525
3669
  })
3526
3670
  });
3527
- })), !isDisabled && /*#__PURE__*/React__default['default'].createElement(React__default['default'].Fragment, null, /*#__PURE__*/React__default['default'].createElement(core.Grid, {
3671
+ })), !isDisabled && /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, /*#__PURE__*/React__default["default"].createElement(core.Grid, {
3528
3672
  container: true,
3529
3673
  item: true,
3530
3674
  xs: 12,
3531
3675
  justify: "flex-end"
3532
- }, /*#__PURE__*/React__default['default'].createElement(core.IconButton, {
3676
+ }, /*#__PURE__*/React__default["default"].createElement(core.IconButton, {
3533
3677
  "aria-label": "add",
3534
3678
  "data-testid": "add-changeGroup",
3535
3679
  onClick: onAddRow,
3536
3680
  className: classes.addButton
3537
- }, /*#__PURE__*/React__default['default'].createElement(icons.Add, null))), /*#__PURE__*/React__default['default'].createElement(TafFormButtons, {
3681
+ }, /*#__PURE__*/React__default["default"].createElement(icons.Add, null))), /*#__PURE__*/React__default["default"].createElement(TafFormButtons, {
3538
3682
  tafAction: tafAction,
3539
3683
  onTafFormButtonPress: onTafButtonPress
3540
3684
  })), hiddenInputFields.map(function (field) {
3541
- return /*#__PURE__*/React__default['default'].createElement(formFields.ReactHookFormHiddenInput, {
3685
+ return /*#__PURE__*/React__default["default"].createElement(formFields.ReactHookFormHiddenInput, {
3542
3686
  name: field,
3543
3687
  key: field
3544
3688
  });
3545
- }), /*#__PURE__*/React__default['default'].createElement(DraftFieldHelper, null));
3689
+ }), /*#__PURE__*/React__default["default"].createElement(DraftFieldHelper, null));
3546
3690
  };
3547
3691
 
3548
3692
  var getMessageType = function getMessageType(taf, tafAction) {
@@ -3562,8 +3706,8 @@
3562
3706
  var previousValidDateEnd = taf.previousValidDateEnd && tafAction !== 'AMEND' ? taf.previousValidDateEnd : taf.validDateEnd; // For amendment change valid start time to current time
3563
3707
  // only do this if we're already within the validity period
3564
3708
 
3565
- if ((tafAction === 'AMEND' || tafAction === 'DRAFT_AMEND') && moment__default['default'].utc() >= moment__default['default'].utc(taf.validDateStart)) {
3566
- var now = moment__default['default'].utc().format('YYYY-MM-DDTHH:mm:ss[Z]');
3709
+ if ((tafAction === 'AMEND' || tafAction === 'DRAFT_AMEND') && moment__default["default"].utc() >= moment__default["default"].utc(taf.validDateStart)) {
3710
+ var now = moment__default["default"].utc().format('YYYY-MM-DDTHH:mm:ss[Z]');
3567
3711
  var validObj = {
3568
3712
  start: now,
3569
3713
  end: taf.baseForecast.valid.end
@@ -3583,15 +3727,21 @@
3583
3727
  previousValidDateEnd: previousValidDateEnd
3584
3728
  });
3585
3729
  };
3586
- var prepareTafValues = function prepareTafValues(_taf, tafAction) {
3587
- // If action is AMEND/CORRECT/DRAFT_AMEND/DRAFT_CORRECTION - add previous valid start and end
3730
+ var prepareTafValues = function prepareTafValues(_taf, tafAction, addEmptyChangeGroup) {
3731
+ if (addEmptyChangeGroup === void 0) {
3732
+ addEmptyChangeGroup = false;
3733
+ } // If action is AMEND/CORRECT/DRAFT_AMEND/DRAFT_CORRECTION - add previous valid start and end
3588
3734
  // If action is AMEND/DRAFT_AMEND - update validity start time to current time
3735
+
3736
+
3589
3737
  var taf = tafAction === 'AMEND' || tafAction === 'DRAFT_AMEND' || tafAction === 'CORRECT' || tafAction === 'DRAFT_CORRECT' ? getAmendedCorrectedTafTimes(_taf, tafAction) : _taf;
3590
- return __assign(__assign(__assign({}, taf), {
3738
+ return __assign(__assign(__assign(__assign({}, taf), {
3591
3739
  messageType: getMessageType(taf, tafAction),
3592
3740
  baseForecast: formatFormValues(taf.baseForecast)
3593
3741
  }), taf.changeGroups && {
3594
3742
  changeGroups: taf.changeGroups.map(formatFormValues)
3743
+ }), addEmptyChangeGroup && {
3744
+ changeGroups: [emptyChangegroup]
3595
3745
  });
3596
3746
  };
3597
3747
 
@@ -3602,24 +3752,19 @@
3602
3752
  _b = _a.TAC,
3603
3753
  TAC = _b === void 0 ? '' : _b,
3604
3754
  onFormAction = _a.onFormAction;
3605
- 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
3606
-
3607
- var _c = prepareTafValues(taf, tafAction),
3608
- _d = _c.changeGroups,
3609
- changeGroups = _d === void 0 ? [] : _d,
3610
- defaultValues = __rest(_c, ["changeGroups"]);
3611
-
3755
+ var taf = tafFromBackend.taf;
3756
+ var isDisabled = mode === 'view';
3757
+ var defaultValues = prepareTafValues(taf, tafAction, !isDisabled && !taf.changeGroups);
3612
3758
  var options = {
3613
3759
  defaultValues: defaultValues,
3614
3760
  mode: 'onTouched',
3615
3761
  reValidateMode: 'onChange',
3616
3762
  criteriaMode: 'all'
3617
3763
  };
3618
- return /*#__PURE__*/React__default['default'].createElement(formFields.ReactHookFormProvider, {
3764
+ return /*#__PURE__*/React__default["default"].createElement(formFields.ReactHookFormProvider, {
3619
3765
  options: options
3620
- }, /*#__PURE__*/React__default['default'].createElement(TafForm, {
3621
- mode: mode,
3622
- changeGroups: changeGroups,
3766
+ }, /*#__PURE__*/React__default["default"].createElement(TafForm, {
3767
+ isDisabled: isDisabled,
3623
3768
  tafAction: tafAction,
3624
3769
  staticTAC: TAC,
3625
3770
  onFormAction: onFormAction
@@ -3669,7 +3814,12 @@
3669
3814
  return onFormAction('CLOSE');
3670
3815
  },
3671
3816
  maxWidth: other.maxWidth ? other.maxWidth : 'lg',
3672
- disableBackdropClick: true
3817
+ disableBackdropClick: true,
3818
+ PaperProps: {
3819
+ style: {
3820
+ position: 'inherit'
3821
+ }
3822
+ }
3673
3823
  }, other), /*#__PURE__*/React__namespace.createElement(core.DialogTitle, {
3674
3824
  disableTypography: true,
3675
3825
  className: classes.dialogHeader
@@ -3712,11 +3862,11 @@
3712
3862
  * */
3713
3863
 
3714
3864
  var getActiveStatus = function getActiveStatus(listType, className) {
3715
- return listType === 'ACTIVE' ? /*#__PURE__*/React__default['default'].createElement(icons.CheckCircle, {
3865
+ return listType === 'ACTIVE' ? /*#__PURE__*/React__default["default"].createElement(icons.CheckCircle, {
3716
3866
  "data-testid": "status-active",
3717
3867
  className: className,
3718
3868
  fontSize: "small"
3719
- }) : /*#__PURE__*/React__default['default'].createElement(icons.Schedule, {
3869
+ }) : /*#__PURE__*/React__default["default"].createElement(icons.Schedule, {
3720
3870
  "data-testid": "status-upcoming",
3721
3871
  className: className,
3722
3872
  fontSize: "small"
@@ -3728,13 +3878,13 @@
3728
3878
  if (taf.status === 'NEW') return null;
3729
3879
 
3730
3880
  if (taf.status === 'CANCELLED') {
3731
- return /*#__PURE__*/React__default['default'].createElement(shared.StatusTag, {
3881
+ return /*#__PURE__*/React__default["default"].createElement(shared.StatusTag, {
3732
3882
  content: "cancelled",
3733
3883
  color: "red"
3734
3884
  });
3735
3885
  }
3736
3886
 
3737
- return /*#__PURE__*/React__default['default'].createElement(shared.StatusTag, {
3887
+ return /*#__PURE__*/React__default["default"].createElement(shared.StatusTag, {
3738
3888
  content: taf.status.toLowerCase(),
3739
3889
  color: taf.status === 'EXPIRED' ? 'grey' : 'green'
3740
3890
  });
@@ -3778,101 +3928,101 @@
3778
3928
  _c = _a.showTac,
3779
3929
  showTac = _c === void 0 ? false : _c;
3780
3930
  var classes = useStyles$5();
3781
- var validTimeDate = moment__default['default'].utc(taf.validDateStart).format('DD MMM');
3782
- var baseTime = moment__default['default'].utc(taf.baseTime).format('HH:mm');
3783
- return /*#__PURE__*/React__default['default'].createElement(core.Card, {
3931
+ var validTimeDate = moment__default["default"].utc(taf.validDateStart).format('DD MMM');
3932
+ var baseTime = moment__default["default"].utc(taf.baseTime).format('HH:mm');
3933
+ return /*#__PURE__*/React__default["default"].createElement(core.Card, {
3784
3934
  elevation: 0,
3785
3935
  className: classes.cardWrapper
3786
- }, /*#__PURE__*/React__default['default'].createElement(core.Grid, {
3936
+ }, /*#__PURE__*/React__default["default"].createElement(core.Grid, {
3787
3937
  container: true,
3788
3938
  alignItems: "center",
3789
3939
  spacing: 1
3790
- }, /*#__PURE__*/React__default['default'].createElement(core.Grid, {
3940
+ }, /*#__PURE__*/React__default["default"].createElement(core.Grid, {
3791
3941
  item: true,
3792
3942
  xs: 3,
3793
3943
  sm: 2,
3794
3944
  md: 1
3795
- }, /*#__PURE__*/React__default['default'].createElement(core.Typography, {
3945
+ }, /*#__PURE__*/React__default["default"].createElement(core.Typography, {
3796
3946
  variant: "subtitle2",
3797
3947
  noWrap: true,
3798
3948
  className: classes.font
3799
- }, taf.location)), /*#__PURE__*/React__default['default'].createElement(core.Grid, {
3949
+ }, taf.location)), /*#__PURE__*/React__default["default"].createElement(core.Grid, {
3800
3950
  item: true,
3801
3951
  xs: 3,
3802
3952
  sm: 3,
3803
3953
  md: 1,
3804
3954
  container: true
3805
- }, /*#__PURE__*/React__default['default'].createElement(core.Grid, {
3955
+ }, /*#__PURE__*/React__default["default"].createElement(core.Grid, {
3806
3956
  item: true,
3807
3957
  xs: 3,
3808
3958
  sm: 3,
3809
3959
  md: 3,
3810
3960
  className: classes.alignIcon
3811
- }, showTac && /*#__PURE__*/React__default['default'].createElement(core.Tooltip, {
3961
+ }, showTac && /*#__PURE__*/React__default["default"].createElement(core.Tooltip, {
3812
3962
  "data-testid": "taflistrow-tactooltip",
3813
- title: /*#__PURE__*/React__default['default'].createElement("div", {
3963
+ title: /*#__PURE__*/React__default["default"].createElement("div", {
3814
3964
  style: {
3815
3965
  whiteSpace: 'pre-line'
3816
3966
  }
3817
3967
  }, TAC),
3818
3968
  placement: "bottom-start"
3819
- }, /*#__PURE__*/React__default['default'].createElement(icons.InfoOutlined, {
3969
+ }, /*#__PURE__*/React__default["default"].createElement(icons.InfoOutlined, {
3820
3970
  "data-testid": "taflistrow-tacicon",
3821
3971
  color: "secondary",
3822
3972
  fontSize: "small"
3823
- }))), /*#__PURE__*/React__default['default'].createElement(core.Grid, {
3973
+ }))), /*#__PURE__*/React__default["default"].createElement(core.Grid, {
3824
3974
  item: true,
3825
3975
  xs: 9,
3826
3976
  sm: 9,
3827
3977
  md: 9
3828
- }, /*#__PURE__*/React__default['default'].createElement(core.Typography, {
3978
+ }, /*#__PURE__*/React__default["default"].createElement(core.Typography, {
3829
3979
  variant: "subtitle2",
3830
3980
  className: classes.font,
3831
3981
  "data-testid": "baseTime"
3832
- }, baseTime))), /*#__PURE__*/React__default['default'].createElement(core.Grid, {
3982
+ }, baseTime))), /*#__PURE__*/React__default["default"].createElement(core.Grid, {
3833
3983
  item: true,
3834
3984
  xs: 3,
3835
3985
  sm: 2,
3836
3986
  md: 1
3837
- }, /*#__PURE__*/React__default['default'].createElement(core.Typography, {
3987
+ }, /*#__PURE__*/React__default["default"].createElement(core.Typography, {
3838
3988
  variant: "subtitle2",
3839
3989
  className: classes.font,
3840
3990
  "data-testid": "validTimeDate"
3841
- }, validTimeDate)), /*#__PURE__*/React__default['default'].createElement(core.Grid, {
3991
+ }, validTimeDate)), /*#__PURE__*/React__default["default"].createElement(core.Grid, {
3842
3992
  item: true,
3843
3993
  xs: 3,
3844
3994
  sm: 3,
3845
3995
  md: 6
3846
- }, /*#__PURE__*/React__default['default'].createElement(core.Typography, {
3996
+ }, /*#__PURE__*/React__default["default"].createElement(core.Typography, {
3847
3997
  variant: "subtitle2",
3848
3998
  className: classes.font,
3849
3999
  "data-testid": "validTimeSlot"
3850
4000
  }, formatValidToString({
3851
4001
  start: taf.validDateStart,
3852
4002
  end: taf.validDateEnd
3853
- }))), /*#__PURE__*/React__default['default'].createElement(core.Grid, {
4003
+ }))), /*#__PURE__*/React__default["default"].createElement(core.Grid, {
3854
4004
  item: true,
3855
4005
  xs: 12,
3856
4006
  sm: 4,
3857
4007
  md: 3
3858
- }, /*#__PURE__*/React__default['default'].createElement(core.Grid, {
4008
+ }, /*#__PURE__*/React__default["default"].createElement(core.Grid, {
3859
4009
  container: true,
3860
4010
  justify: "flex-start",
3861
4011
  spacing: 2
3862
- }, /*#__PURE__*/React__default['default'].createElement(core.Grid, {
4012
+ }, /*#__PURE__*/React__default["default"].createElement(core.Grid, {
3863
4013
  item: true,
3864
4014
  xs: 8,
3865
4015
  container: true,
3866
4016
  justify: "flex-end"
3867
- }, taf.status === 'DRAFT' || taf.status === 'DRAFT_CORRECTED' || taf.status === 'DRAFT_AMENDED' ? /*#__PURE__*/React__default['default'].createElement(core.Button, {
4017
+ }, taf.status === 'DRAFT' || taf.status === 'DRAFT_CORRECTED' || taf.status === 'DRAFT_AMENDED' ? /*#__PURE__*/React__default["default"].createElement(core.Button, {
3868
4018
  color: "secondary",
3869
4019
  size: "small",
3870
4020
  "data-testid": "tafRow-draft",
3871
- startIcon: /*#__PURE__*/React__default['default'].createElement(icons.Create, {
4021
+ startIcon: /*#__PURE__*/React__default["default"].createElement(icons.Create, {
3872
4022
  fontSize: "small",
3873
4023
  color: "secondary"
3874
4024
  })
3875
- }, getDraftTitle(taf.status)) : getStatusTagList(taf)), /*#__PURE__*/React__default['default'].createElement(core.Grid, {
4025
+ }, getDraftTitle(taf.status)) : getStatusTagList(taf)), /*#__PURE__*/React__default["default"].createElement(core.Grid, {
3876
4026
  item: true,
3877
4027
  className: classes.alignIcon
3878
4028
  }, taf.status !== 'NEW' && taf.status !== 'DRAFT' && taf.status !== 'DRAFT_CORRECTED' && taf.status !== 'DRAFT_AMENDED' && taf.status !== 'CANCELLED' && listType !== 'EXPIRED' && getActiveStatus(listType, classes.activeStatus))))));
@@ -3896,10 +4046,10 @@
3896
4046
  * */
3897
4047
  var getListType = function getListType(taf, locationSettings) {
3898
4048
  if (!taf) return null;
3899
- var now = moment__default['default'].utc();
3900
- var baseTime = moment__default['default'].utc(taf.baseTime);
4049
+ var now = moment__default["default"].utc();
4050
+ var baseTime = moment__default["default"].utc(taf.baseTime);
3901
4051
  var activityPeriod = locationSettings[taf.location].activity_period;
3902
- var nextBaseTime = moment__default['default'].utc(taf.baseTime).add(activityPeriod, 'hours');
4052
+ var nextBaseTime = moment__default["default"].utc(taf.baseTime).add(activityPeriod, 'hours');
3903
4053
 
3904
4054
  if (taf.status === 'EXPIRED') {
3905
4055
  return 'EXPIRED';
@@ -3939,10 +4089,10 @@
3939
4089
  onFormAction = _a.onFormAction;
3940
4090
  var taf = tafFromBackend ? tafFromBackend.taf : null;
3941
4091
  var locationSettings = useTafSettings(tafConfig).locations;
3942
- return /*#__PURE__*/React__default['default'].createElement(ContentDialog, {
4092
+ return /*#__PURE__*/React__default["default"].createElement(ContentDialog, {
3943
4093
  open: open,
3944
4094
  toggleDialogStatus: toggleFormDialog,
3945
- titleComponent: /*#__PURE__*/React__default['default'].createElement(TafListRow, {
4095
+ titleComponent: /*#__PURE__*/React__default["default"].createElement(TafListRow, {
3946
4096
  taf: taf,
3947
4097
  listType: getListType(taf, locationSettings)
3948
4098
  }),
@@ -3980,34 +4130,34 @@
3980
4130
  canBe = _a.canBe,
3981
4131
  onClickTafActionButton = _a.onClickTafActionButton;
3982
4132
  var classes = useStyles$4();
3983
- return !canBe.includes('CANCELLED') && !canBe.includes('CORRECTED') && !canBe.includes('AMENDED') ? null : /*#__PURE__*/React__default['default'].createElement(core.Grid, {
4133
+ return !canBe.includes('CANCELLED') && !canBe.includes('CORRECTED') && !canBe.includes('AMENDED') ? null : /*#__PURE__*/React__default["default"].createElement(core.Grid, {
3984
4134
  container: true,
3985
4135
  alignItems: "center",
3986
4136
  justify: "flex-end",
3987
4137
  "data-testid": "taflist-canbebuttons",
3988
4138
  spacing: 1,
3989
4139
  className: classes.actionButtons
3990
- }, /*#__PURE__*/React__default['default'].createElement(core.Grid, {
4140
+ }, /*#__PURE__*/React__default["default"].createElement(core.Grid, {
3991
4141
  item: true
3992
- }, canBe.includes('CANCELLED') && /*#__PURE__*/React__default['default'].createElement(core.Button, {
4142
+ }, canBe.includes('CANCELLED') && /*#__PURE__*/React__default["default"].createElement(core.Button, {
3993
4143
  "data-testid": "canceltaf",
3994
4144
  variant: "outlined",
3995
4145
  color: "secondary",
3996
4146
  onClick: function onClick() {
3997
4147
  return onClickTafActionButton(uuid, 'CANCEL');
3998
4148
  }
3999
- }, "Cancel")), /*#__PURE__*/React__default['default'].createElement(core.Grid, {
4149
+ }, "Cancel")), /*#__PURE__*/React__default["default"].createElement(core.Grid, {
4000
4150
  item: true
4001
- }, canBe.includes('CORRECTED') && /*#__PURE__*/React__default['default'].createElement(core.Button, {
4151
+ }, canBe.includes('CORRECTED') && /*#__PURE__*/React__default["default"].createElement(core.Button, {
4002
4152
  "data-testid": "correctaf",
4003
4153
  variant: "outlined",
4004
4154
  color: "secondary",
4005
4155
  onClick: function onClick() {
4006
4156
  return onClickTafActionButton(uuid, 'CORRECT');
4007
4157
  }
4008
- }, "Correct")), /*#__PURE__*/React__default['default'].createElement(core.Grid, {
4158
+ }, "Correct")), /*#__PURE__*/React__default["default"].createElement(core.Grid, {
4009
4159
  item: true
4010
- }, canBe.includes('AMENDED') && /*#__PURE__*/React__default['default'].createElement(core.Button, {
4160
+ }, canBe.includes('AMENDED') && /*#__PURE__*/React__default["default"].createElement(core.Button, {
4011
4161
  "data-testid": "amendtaf",
4012
4162
  variant: "outlined",
4013
4163
  color: "secondary",
@@ -4056,7 +4206,7 @@
4056
4206
  TAC = _c[0],
4057
4207
  requestTAC = _c[1];
4058
4208
 
4059
- React__default['default'].useEffect(function () {
4209
+ React__default["default"].useEffect(function () {
4060
4210
  // only re-retrieve TAC if draft state
4061
4211
  if (tafListItem.taf.status === 'DRAFT' || tafListItem.taf.status === 'DRAFT_AMENDED' || tafListItem.taf.status === 'DRAFT_CORRECTED') {
4062
4212
  requestTAC(tafListItem.taf);
@@ -4064,7 +4214,7 @@
4064
4214
 
4065
4215
  }, [tafListItem.taf]);
4066
4216
  var popOut = status === 'NEW' || status === 'DRAFT' || status === 'DRAFT_AMENDED' || status === 'DRAFT_CORRECTED';
4067
- return /*#__PURE__*/React__default['default'].createElement(core.Accordion, __assign({
4217
+ return /*#__PURE__*/React__default["default"].createElement(core.Accordion, __assign({
4068
4218
  "data-testid": "tafListItem",
4069
4219
  className: classes.accordion
4070
4220
  }, popOut ? {
@@ -4078,41 +4228,41 @@
4078
4228
  TransitionProps: {
4079
4229
  unmountOnExit: true
4080
4230
  }
4081
- }), /*#__PURE__*/React__default['default'].createElement(core.AccordionSummary, {
4231
+ }), /*#__PURE__*/React__default["default"].createElement(core.AccordionSummary, {
4082
4232
  "data-testid": "tafListSectionAccordionSummary",
4083
- expandIcon: popOut ? /*#__PURE__*/React__default['default'].createElement(core.Tooltip, {
4233
+ expandIcon: popOut ? /*#__PURE__*/React__default["default"].createElement(core.Tooltip, {
4084
4234
  title: "Popout to edit"
4085
- }, /*#__PURE__*/React__default['default'].createElement(icons.OpenInNew, {
4235
+ }, /*#__PURE__*/React__default["default"].createElement(icons.OpenInNew, {
4086
4236
  "data-testid": "popOutIcon",
4087
4237
  fontSize: "small"
4088
- })) : /*#__PURE__*/React__default['default'].createElement(icons.ExpandMore, {
4238
+ })) : /*#__PURE__*/React__default["default"].createElement(icons.ExpandMore, {
4089
4239
  "data-testid": "expandIcon"
4090
4240
  })
4091
- }, /*#__PURE__*/React__default['default'].createElement(TafListRow, {
4241
+ }, /*#__PURE__*/React__default["default"].createElement(TafListRow, {
4092
4242
  taf: tafListItem.taf,
4093
4243
  listType: listType,
4094
4244
  TAC: TAC,
4095
4245
  showTac: true
4096
- })), /*#__PURE__*/React__default['default'].createElement(core.AccordionDetails, null, /*#__PURE__*/React__default['default'].createElement(core.Grid, {
4246
+ })), /*#__PURE__*/React__default["default"].createElement(core.AccordionDetails, null, /*#__PURE__*/React__default["default"].createElement(core.Grid, {
4097
4247
  container: true,
4098
4248
  direction: "column"
4099
4249
  }, errorCancelTaf.length > 0 && errorCancelTaf.find(function (uuid) {
4100
4250
  return uuid === tafListItem.taf.uuid;
4101
- }) && /*#__PURE__*/React__default['default'].createElement(shared.AlertBanner, {
4251
+ }) && /*#__PURE__*/React__default["default"].createElement(shared.AlertBanner, {
4102
4252
  severity: "error",
4103
4253
  title: "Cancelling this TAF failed, please try again",
4104
4254
  dataTestId: "tafList-cancelAlert"
4105
- }), /*#__PURE__*/React__default['default'].createElement("div", {
4255
+ }), /*#__PURE__*/React__default["default"].createElement("div", {
4106
4256
  className: classes.formPadding
4107
- }, /*#__PURE__*/React__default['default'].createElement(core.Grid, {
4257
+ }, /*#__PURE__*/React__default["default"].createElement(core.Grid, {
4108
4258
  item: true
4109
- }, /*#__PURE__*/React__default['default'].createElement(TafFormWrapper, {
4259
+ }, /*#__PURE__*/React__default["default"].createElement(TafFormWrapper, {
4110
4260
  tafFromBackend: tafListItem,
4111
4261
  mode: "view",
4112
4262
  TAC: TAC
4113
- })), /*#__PURE__*/React__default['default'].createElement(core.Grid, {
4263
+ })), /*#__PURE__*/React__default["default"].createElement(core.Grid, {
4114
4264
  item: true
4115
- }, /*#__PURE__*/React__default['default'].createElement(TafListButtons, {
4265
+ }, /*#__PURE__*/React__default["default"].createElement(TafListButtons, {
4116
4266
  canBe: tafListItem.canbe,
4117
4267
  uuid: tafListItem.taf.uuid,
4118
4268
  onClickTafActionButton: onClickTafActionButton
@@ -4155,13 +4305,13 @@
4155
4305
  errorCancelTaf = _b === void 0 ? [] : _b,
4156
4306
  onClickTafActionButton = _a.onClickTafActionButton;
4157
4307
  var classes = useStyles$2();
4158
- return /*#__PURE__*/React__default['default'].createElement(React__default['default'].Fragment, null, /*#__PURE__*/React__default['default'].createElement(core.Typography, {
4308
+ return /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, /*#__PURE__*/React__default["default"].createElement(core.Typography, {
4159
4309
  variant: "subtitle2",
4160
4310
  className: classes.listHeaders
4161
- }, title), /*#__PURE__*/React__default['default'].createElement("div", {
4311
+ }, title), /*#__PURE__*/React__default["default"].createElement("div", {
4162
4312
  "data-testid": "tafList" + listType
4163
4313
  }, tafList.map(function (tafListItem) {
4164
- return /*#__PURE__*/React__default['default'].createElement(TafListAccordion, {
4314
+ return /*#__PURE__*/React__default["default"].createElement(TafListAccordion, {
4165
4315
  key: tafListItem.taf.uuid + "-" + tafListItem.taf.status,
4166
4316
  tafListItem: tafListItem,
4167
4317
  listType: listType,
@@ -4203,10 +4353,10 @@
4203
4353
  try {
4204
4354
  for (var tafList_1 = __values(tafList), tafList_1_1 = tafList_1.next(); !tafList_1_1.done; tafList_1_1 = tafList_1.next()) {
4205
4355
  var taf = tafList_1_1.value;
4206
- var now = moment__default['default'].utc();
4207
- var baseTime = moment__default['default'].utc(taf.taf.baseTime);
4356
+ var now = moment__default["default"].utc();
4357
+ var baseTime = moment__default["default"].utc(taf.taf.baseTime);
4208
4358
  var activityPeriod = locationSettings[taf.taf.location].activity_period;
4209
- var nextBaseTime = moment__default['default'].utc(taf.taf.baseTime).add(activityPeriod, 'hours');
4359
+ var nextBaseTime = moment__default["default"].utc(taf.taf.baseTime).add(activityPeriod, 'hours');
4210
4360
 
4211
4361
  if (taf.taf.status === 'EXPIRED') {
4212
4362
  expiredTafs.push(taf);
@@ -4229,37 +4379,37 @@
4229
4379
  }
4230
4380
  }
4231
4381
 
4232
- return /*#__PURE__*/React__default['default'].createElement(core.Grid, {
4382
+ return /*#__PURE__*/React__default["default"].createElement(core.Grid, {
4233
4383
  container: true,
4234
4384
  direction: "column",
4235
4385
  alignItems: "stretch"
4236
- }, /*#__PURE__*/React__default['default'].createElement(core.Grid, {
4386
+ }, /*#__PURE__*/React__default["default"].createElement(core.Grid, {
4237
4387
  item: true,
4238
4388
  className: classes.listBody
4239
- }, error && /*#__PURE__*/React__default['default'].createElement(shared.AlertBanner, {
4389
+ }, error && /*#__PURE__*/React__default["default"].createElement(shared.AlertBanner, {
4240
4390
  severity: "error",
4241
4391
  title: "An error has occurred while retrieving the list, please try again",
4242
4392
  info: error.message ? error.message : '',
4243
4393
  dataTestId: "tafList-alert"
4244
- }), tafList && /*#__PURE__*/React__default['default'].createElement(React__default['default'].Fragment, null, /*#__PURE__*/React__default['default'].createElement(TafListSection, {
4394
+ }), tafList && /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, /*#__PURE__*/React__default["default"].createElement(TafListSection, {
4245
4395
  title: "Upcoming",
4246
4396
  listType: "UPCOMING",
4247
4397
  tafList: upcomingTafs,
4248
4398
  errorCancelTaf: errorCancelTaf,
4249
4399
  onClickTafActionButton: onClickTafActionButton
4250
- }), /*#__PURE__*/React__default['default'].createElement(TafListSection, {
4400
+ }), /*#__PURE__*/React__default["default"].createElement(TafListSection, {
4251
4401
  title: "Current time slot",
4252
4402
  listType: "ACTIVE",
4253
4403
  tafList: currentTafs,
4254
4404
  errorCancelTaf: errorCancelTaf,
4255
4405
  onClickTafActionButton: onClickTafActionButton
4256
- }), /*#__PURE__*/React__default['default'].createElement(TafListSection, {
4406
+ }), /*#__PURE__*/React__default["default"].createElement(TafListSection, {
4257
4407
  title: "Expired",
4258
4408
  listType: "EXPIRED",
4259
4409
  tafList: expiredTafs,
4260
4410
  errorCancelTaf: errorCancelTaf,
4261
4411
  onClickTafActionButton: onClickTafActionButton
4262
- })), isLoading && /*#__PURE__*/React__default['default'].createElement(lab.Skeleton, {
4412
+ })), isLoading && /*#__PURE__*/React__default["default"].createElement(lab.Skeleton, {
4263
4413
  "data-testid": "tafList-skeleton",
4264
4414
  variant: "rect",
4265
4415
  height: "660px"
@@ -4291,10 +4441,10 @@
4291
4441
 
4292
4442
  var Spinner = function Spinner() {
4293
4443
  var classes = useStyles();
4294
- return /*#__PURE__*/React__default['default'].createElement(core.Backdrop, {
4444
+ return /*#__PURE__*/React__default["default"].createElement(core.Backdrop, {
4295
4445
  open: true,
4296
4446
  className: classes.backdrop
4297
- }, /*#__PURE__*/React__default['default'].createElement(core.CircularProgress, {
4447
+ }, /*#__PURE__*/React__default["default"].createElement(core.CircularProgress, {
4298
4448
  "data-testid": "spinner",
4299
4449
  color: "inherit"
4300
4450
  }));
@@ -4305,11 +4455,11 @@
4305
4455
  pollingInterval = 10000;
4306
4456
  }
4307
4457
 
4308
- var _a = __read(React__default['default'].useState([]), 2),
4458
+ var _a = __read(React__default["default"].useState([]), 2),
4309
4459
  errorCancelTaf = _a[0],
4310
4460
  setErrorCancelTaf = _a[1];
4311
4461
 
4312
- React__default['default'].useEffect(function () {
4462
+ React__default["default"].useEffect(function () {
4313
4463
  var cancelErrorMessageHandler = errorCancelTaf.length > 0 ? setTimeout(function () {
4314
4464
  if (errorCancelTaf.length > 0) {
4315
4465
  setErrorCancelTaf(errorCancelTaf.slice(1));
@@ -4334,27 +4484,27 @@
4334
4484
  var api$1 = api.useApiContext().api;
4335
4485
  var confirmDialog = shared.useConfirmationDialog();
4336
4486
 
4337
- var _a = __read(React__default['default'].useState(false), 2),
4487
+ var _a = __read(React__default["default"].useState(false), 2),
4338
4488
  isTafDialogOpen = _a[0],
4339
4489
  setTafDialogOpen = _a[1];
4340
4490
 
4341
- var _b = __read(React__default['default'].useState(null), 2),
4491
+ var _b = __read(React__default["default"].useState(null), 2),
4342
4492
  selectedTafId = _b[0],
4343
4493
  setselectedTafId = _b[1];
4344
4494
 
4345
- var _c = __read(React__default['default'].useState(null), 2),
4495
+ var _c = __read(React__default["default"].useState(null), 2),
4346
4496
  tafDialogAction = _c[0],
4347
4497
  setTafDialogAction = _c[1];
4348
4498
 
4349
- var _d = __read(React__default['default'].useState(false), 2),
4499
+ var _d = __read(React__default["default"].useState(false), 2),
4350
4500
  errorPostMessage = _d[0],
4351
4501
  setErrorPostMessage = _d[1];
4352
4502
 
4353
- var _e = __read(React__default['default'].useState(''), 2),
4503
+ var _e = __read(React__default["default"].useState(''), 2),
4354
4504
  errorPostMessageText = _e[0],
4355
4505
  setErrorPostMessageText = _e[1];
4356
4506
 
4357
- var _f = __read(React__default['default'].useState(false), 2),
4507
+ var _f = __read(React__default["default"].useState(false), 2),
4358
4508
  showSpinner = _f[0],
4359
4509
  setSpinner = _f[1]; // clear error message for cancel after 10 seconds
4360
4510
 
@@ -4385,7 +4535,7 @@
4385
4535
  setTafDialogOpen(!isTafDialogOpen);
4386
4536
  };
4387
4537
 
4388
- React__default['default'].useEffect(function () {
4538
+ React__default["default"].useEffect(function () {
4389
4539
  if (selectedTafId) {
4390
4540
  toggleTafDialog();
4391
4541
  } // eslint-disable-next-line react-hooks/exhaustive-deps
@@ -4527,28 +4677,28 @@
4527
4677
  };
4528
4678
 
4529
4679
  var selectedTaf = getSelectedTaf(selectedTafId, tafList);
4530
- return /*#__PURE__*/React__default['default'].createElement(React__default['default'].Fragment, null, /*#__PURE__*/React__default['default'].createElement(TafList, {
4680
+ return /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, /*#__PURE__*/React__default["default"].createElement(TafList, {
4531
4681
  tafList: tafList,
4532
4682
  isLoading: isLoadingList,
4533
4683
  error: errorList,
4534
4684
  onClickTafActionButton: onClickTafActionButton,
4535
4685
  errorCancelTaf: errorCancelTaf
4536
- }), showSpinner && /*#__PURE__*/React__default['default'].createElement(Spinner, null), selectedTaf !== undefined && /*#__PURE__*/React__default['default'].createElement(TafFormDialog, {
4686
+ }), showSpinner && /*#__PURE__*/React__default["default"].createElement(Spinner, null), selectedTaf !== undefined && /*#__PURE__*/React__default["default"].createElement(TafFormDialog, {
4537
4687
  open: isTafDialogOpen,
4538
4688
  toggleFormDialog: toggleTafDialog,
4539
4689
  tafFromBackend: selectedTaf,
4540
- alertBanner: errorPostMessage ? /*#__PURE__*/React__default['default'].createElement(shared.AlertBanner, {
4690
+ alertBanner: errorPostMessage ? /*#__PURE__*/React__default["default"].createElement(shared.AlertBanner, {
4541
4691
  severity: "error",
4542
4692
  title: "An error has occurred while saving, please try again",
4543
4693
  info: errorPostMessageText
4544
4694
  }) : null,
4545
4695
  onFormAction: onFormAction
4546
- }, /*#__PURE__*/React__default['default'].createElement(TafFormWrapper, {
4696
+ }, /*#__PURE__*/React__default["default"].createElement(TafFormWrapper, {
4547
4697
  mode: "edit",
4548
4698
  tafFromBackend: selectedTaf,
4549
4699
  tafAction: tafDialogAction,
4550
4700
  onFormAction: onFormAction
4551
- }), showSpinner && /*#__PURE__*/React__default['default'].createElement(Spinner, null)));
4701
+ }), showSpinner && /*#__PURE__*/React__default["default"].createElement(Spinner, null)));
4552
4702
  };
4553
4703
  /**
4554
4704
  * Shows the list of Tafs and allows to create, edit and view Tafs.
@@ -4560,11 +4710,11 @@
4560
4710
 
4561
4711
 
4562
4712
  var ConfirmationWrapper = function ConfirmationWrapper() {
4563
- return /*#__PURE__*/React__default['default'].createElement(shared.ConfirmationServiceProvider, null, /*#__PURE__*/React__default['default'].createElement(TafWrapper, null));
4713
+ return /*#__PURE__*/React__default["default"].createElement(shared.ConfirmationServiceProvider, null, /*#__PURE__*/React__default["default"].createElement(TafWrapper, null));
4564
4714
  };
4565
4715
 
4566
- var createApi = function createApi(url, appUrl, auth, setAuth, authTokenUrl) {
4567
- var axiosInstance = api.createApiInstance(url, appUrl, auth, setAuth, authTokenUrl);
4716
+ var createApi = function createApi(url, appUrl, auth, setAuth, authTokenUrl, authClientId) {
4717
+ var axiosInstance = api.createApiInstance(url, appUrl, auth, setAuth, authTokenUrl, authClientId);
4568
4718
  return {
4569
4719
  // api data
4570
4720
  getTafList: function getTafList() {
@@ -4590,4 +4740,4 @@
4590
4740
 
4591
4741
  Object.defineProperty(exports, '__esModule', { value: true });
4592
4742
 
4593
- })));
4743
+ }));