@opengeoweb/taf 1.2.5 → 2.1.2

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,
@@ -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
 
@@ -395,14 +395,14 @@
395
395
 
396
396
 
397
397
  if (trimmedValueChange === 'BECMG') {
398
- var tafStartMoment = moment__default['default'].utc(tafStart);
399
- var tafEndMoment = moment__default['default'].utc(tafEnd);
398
+ var tafStartMoment = moment__default["default"].utc(tafStart);
399
+ var tafEndMoment = moment__default["default"].utc(tafEnd);
400
400
  var startEnd = trimmedValue.split('/');
401
- var format = trimmedValue.indexOf('/') === -1 ? 'DDHHmm' : 'DDHH'; // Validate start time
401
+ var format = trimmedValue.indexOf('/') === -1 ? FORMAT_DAYS_HOURS_MINUTS : FORMAT_DAYS_HOURS; // Validate start time
402
402
 
403
403
  var startSections = getSections(startEnd[0], format);
404
404
  var startTimestamp = getValidityTimeStamp('start', startSections, tafStartMoment, tafEndMoment);
405
- var endSections = getSections(startEnd[1], 'DDHH');
405
+ var endSections = getSections(startEnd[1], FORMAT_DAYS_HOURS);
406
406
  var endTimestamp = getValidityTimeStamp('end', endSections, tafStartMoment, tafEndMoment);
407
407
  var timeDifference = endTimestamp.diff(startTimestamp, 'hours');
408
408
 
@@ -411,6 +411,57 @@
411
411
  }
412
412
  }
413
413
 
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
+
414
465
  return true;
415
466
  };
416
467
 
@@ -1344,8 +1395,11 @@
1344
1395
  var invalidWindDirectionStepMessage = 'Invalid wind direction, the direction must be rounded to the nearest step of 10 degrees';
1345
1396
  var invalidWindSpeedMessage = 'Invalid wind speed, expected a speed equal to 2 digits or P99';
1346
1397
  var invalidWindGustsMessage = 'Invalid wind gusts, expected gusts equal to 2 digits or P99';
1347
- var invalidWindGustSpeedCombinationMessage = 'Invalid wind, wind gusts must at least be 10 knots greater than the wind speed';
1348
- var invalidGustForWindP99Message = 'Invalid wind speed and gust combination, if wind is P99, gusts can only be empty or P99'; // validations
1398
+ var invalidWindGustSpeedCombinationMessage = 'Invalid wind gusts, gusts must at least be 10 knots greater than the wind speed';
1399
+ var invalidWindGustSpeedBelow15Message = 'Invalid wind gusts, gusts are only allowed for a minimum wind speed of 15 knots';
1400
+ var invalidGustForWindP99Message = 'Invalid wind speed and gust combination, if wind is P99, gusts can only be empty or P99';
1401
+ var invalidWindSpeedForDirectionZeroMessage = 'Invalid wind speed, if direction is 000, speed can only be 00';
1402
+ var invalidWindSpeedForDirectionNonZeroMessage = 'Invalid wind speed, if direction is not 000, speed can not be 00'; // validations
1349
1403
 
1350
1404
  var validateDirection = function validateDirection(value) {
1351
1405
  // if not a number
@@ -1393,8 +1447,16 @@
1393
1447
  return value === 'KT' || value === '' || invalidWindMessage;
1394
1448
  };
1395
1449
 
1396
- var validateWindInterSection = function validateWindInterSection(speed, gust) {
1397
- if (gust === '' || gust === 'P99') {
1450
+ var validateWindInterSection = function validateWindInterSection(speed, gust, direction) {
1451
+ if (direction === '000' && speed !== '00') {
1452
+ return invalidWindSpeedForDirectionZeroMessage;
1453
+ }
1454
+
1455
+ if (direction !== '000' && speed === '00') {
1456
+ return invalidWindSpeedForDirectionNonZeroMessage;
1457
+ }
1458
+
1459
+ if (gust === '') {
1398
1460
  return true;
1399
1461
  }
1400
1462
 
@@ -1402,7 +1464,15 @@
1402
1464
  return invalidGustForWindP99Message;
1403
1465
  }
1404
1466
 
1405
- return parseInt(gust, 10) - parseInt(speed, 10) >= 10 || invalidWindGustSpeedCombinationMessage;
1467
+ if (parseInt(speed, 10) < 15) {
1468
+ return invalidWindGustSpeedBelow15Message;
1469
+ }
1470
+
1471
+ if (gust !== 'P99' && parseInt(gust, 10) - parseInt(speed, 10) < 10) {
1472
+ return invalidWindGustSpeedCombinationMessage;
1473
+ }
1474
+
1475
+ return true;
1406
1476
  }; // Main validation function
1407
1477
 
1408
1478
 
@@ -1428,7 +1498,7 @@
1428
1498
  } // Then do any intersection validation
1429
1499
 
1430
1500
 
1431
- return validateWindInterSection(windValidationIndv.speed, windValidationIndv.gust);
1501
+ return validateWindInterSection(windValidationIndv.speed, windValidationIndv.gust, windValidationIndv.direction);
1432
1502
  };
1433
1503
 
1434
1504
  var formatSingleCloud = function formatSingleCloud(value) {
@@ -1899,7 +1969,7 @@
1899
1969
  };
1900
1970
 
1901
1971
  var formatIssueTime = function formatIssueTime(issueDate) {
1902
- return issueDate ? moment__default['default'](issueDate).utc().format('DDHHmm') + "Z" : 'Not issued';
1972
+ return issueDate ? moment__default["default"](issueDate).utc().format('DDHHmm') + "Z" : 'Not issued';
1903
1973
  };
1904
1974
  function formatFormValues(row) {
1905
1975
  return Object.keys(row).reduce(function (list, key) {
@@ -1953,6 +2023,8 @@
1953
2023
  return Object.keys(row).reduce(function (list, key) {
1954
2024
  var _a;
1955
2025
 
2026
+ var _b;
2027
+
1956
2028
  switch (key) {
1957
2029
  case 'valid':
1958
2030
  {
@@ -1991,7 +2063,7 @@
1991
2063
  case 'change':
1992
2064
  case 'probability':
1993
2065
  {
1994
- return __assign(__assign({}, list), (_a = {}, _a[key] = list[key].trim(), _a));
2066
+ return __assign(__assign({}, list), (_a = {}, _a[key] = (_b = list[key]) === null || _b === void 0 ? void 0 : _b.trim(), _a));
1995
2067
  }
1996
2068
 
1997
2069
  default:
@@ -2165,8 +2237,7 @@
2165
2237
  }
2166
2238
  }
2167
2239
  }, parsedFormValues);
2168
- };
2169
- 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
2240
+ }; // 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
2170
2241
 
2171
2242
  var shouldRetrieveTAC = function shouldRetrieveTAC(product) {
2172
2243
  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)) {
@@ -2197,54 +2268,55 @@
2197
2268
  cloud4: namePrefix + ".cloud.cloud4"
2198
2269
  });
2199
2270
  };
2271
+ var TAC_MISSING_DATA = 'Missing data: no TAC can be generated';
2272
+ var TAC_NOT_AVAILABLE = 'No TAC available';
2273
+ var TAC_RETRIEVING_DATA = 'Retrieving TAC';
2200
2274
  var useTACGenerator = function useTACGenerator(taf, requestTAC, standardTAC) {
2201
2275
  if (standardTAC === void 0) {
2202
2276
  standardTAC = '';
2203
2277
  }
2204
2278
 
2205
- var _a = __read(React__default['default'].useState(taf.status === 'NEW' ? 'No TAC available' : 'Retrieving TAC'), 2),
2279
+ var _a = __read(React__default["default"].useState(taf.status === 'NEW' ? TAC_NOT_AVAILABLE : TAC_RETRIEVING_DATA), 2),
2206
2280
  TAC = _a[0],
2207
2281
  setTAC = _a[1];
2208
2282
 
2283
+ var isMounted = shared.useIsMounted().isMounted;
2284
+
2209
2285
  var retrieveTAC = function retrieveTAC(tafToPost) {
2210
2286
  if (shouldRetrieveTAC(tafToPost)) {
2211
2287
  requestTAC(tafToPost).then(function (result) {
2212
- setTAC(result.data);
2288
+ if (isMounted.current) {
2289
+ setTAC(result.data);
2290
+ }
2213
2291
  })["catch"](function () {
2214
- setTAC('Failed to retrieve TAC');
2292
+ if (isMounted.current) {
2293
+ setTAC('Failed to retrieve TAC');
2294
+ }
2215
2295
  });
2296
+ } else {
2297
+ setTAC(TAC_MISSING_DATA);
2216
2298
  }
2217
-
2218
- setTAC(noTAC);
2219
2299
  };
2220
2300
 
2221
- React__default['default'].useEffect(function () {
2301
+ React__default["default"].useEffect(function () {
2222
2302
  if (taf.status !== 'NEW' && !standardTAC) {
2223
2303
  retrieveTAC(taf);
2224
2304
  } // eslint-disable-next-line react-hooks/exhaustive-deps
2225
2305
 
2226
2306
  }, []);
2227
- React__default['default'].useEffect(function () {
2307
+ React__default["default"].useEffect(function () {
2228
2308
  if (standardTAC !== '') {
2229
2309
  setTAC(standardTAC);
2230
2310
  }
2231
2311
  }, [standardTAC]);
2232
2312
  return [TAC, retrieveTAC];
2233
2313
  };
2234
- var getRange = function getRange(min, max) {
2235
- return Array.from({
2236
- length: max - min + 1
2237
- }, function (_, i) {
2238
- return min + i;
2239
- });
2240
- };
2241
- var useDragOrder = function useDragOrder(trigger, move, fields, onFormBlur) {
2242
- // create simple ordered list with hover (chosen) state
2243
- var _a = __read(React__default['default'].useState([]), 2),
2244
- sortedFields = _a[0],
2245
- setSortedFields = _a[1];
2314
+ var useDragOrder = function useDragOrder(trigger, move, onFormBlur) {
2315
+ var _a = __read(React__default["default"].useState(null), 2),
2316
+ activeDraggingIndex = _a[0],
2317
+ setIsDragging = _a[1];
2246
2318
 
2247
- var _b = __read(React__default['default'].useState([null, null]), 2),
2319
+ var _b = __read(React__default["default"].useState([null, null]), 2),
2248
2320
  lastDragOrder = _b[0],
2249
2321
  onUpdatelastDragOrder = _b[1];
2250
2322
 
@@ -2254,44 +2326,27 @@
2254
2326
  if (oldIndex === undefined || newIndex === undefined) return;
2255
2327
  move(oldIndex, newIndex);
2256
2328
  onUpdatelastDragOrder([oldIndex, newIndex]);
2329
+ setIsDragging(false);
2257
2330
  };
2258
2331
 
2259
- React__default['default'].useEffect(function () {
2260
- setSortedFields(fields.map(function (_a) {
2261
- var id = _a.id;
2262
- return {
2263
- id: id,
2264
- chosen: false
2265
- };
2266
- }));
2267
- }, [fields]); // triggers validation AFTER render of new sorted elements
2332
+ var onStartDrag = function onStartDrag(_a) {
2333
+ var oldIndex = _a.oldIndex;
2334
+ return setIsDragging(oldIndex);
2335
+ }; // triggers validation AFTER render of new sorted elements
2336
+
2268
2337
 
2269
- React__default['default'].useEffect(function () {
2338
+ React__default["default"].useEffect(function () {
2270
2339
  var _a = __read(lastDragOrder, 2),
2271
2340
  oldIndex = _a[0],
2272
2341
  newIndex = _a[1];
2273
2342
 
2274
2343
  if (oldIndex !== null && newIndex !== null) {
2275
- // trigger validation of moved rows
2276
- var _b = __read([oldIndex, newIndex].sort(function (a, b) {
2277
- return a - b;
2278
- }), 2),
2279
- start = _b[0],
2280
- end = _b[1];
2281
-
2282
- var changedRows = getRange(start, end);
2283
- var fieldsToValidate = changedRows.reduce(function (list, rowIndex) {
2284
- var fieldsDict = getFieldNames(true, rowIndex);
2285
- var fields = Object.keys(fieldsDict).map(function (key) {
2286
- return fieldsDict[key];
2287
- });
2288
- return list.concat(fields);
2289
- }, []);
2290
- trigger(fieldsToValidate);
2344
+ // trigger validation of all fields
2345
+ trigger();
2291
2346
  }
2292
2347
  }, [lastDragOrder, trigger]); // trigger onFormBlur AFTER render of new sorted elements so the TAC gets updated
2293
2348
 
2294
- React__default['default'].useEffect(function () {
2349
+ React__default["default"].useEffect(function () {
2295
2350
  var _a = __read(lastDragOrder, 2),
2296
2351
  oldIndex = _a[0],
2297
2352
  newIndex = _a[1];
@@ -2303,8 +2358,8 @@
2303
2358
  }, [lastDragOrder]);
2304
2359
  return {
2305
2360
  onChangeOrder: onChangeOrder,
2306
- sortedFields: sortedFields,
2307
- setSortedFields: setSortedFields
2361
+ activeDraggingIndex: activeDraggingIndex,
2362
+ onStartDrag: onStartDrag
2308
2363
  };
2309
2364
  }; // dialog utils
2310
2365
 
@@ -2315,12 +2370,25 @@
2315
2370
  if (action === 'CORRECT') return 'This TAF is a correction';
2316
2371
  return 'Cancel TAF';
2317
2372
  };
2318
- var getConfirmationDialogContent = function getConfirmationDialogContent(action) {
2319
- if (action === 'DISCARD') return 'Are you sure you would like to discard this TAF? Any changes made will be lost';
2320
- if (action === 'PUBLISH') return 'Are you sure you want to publish this TAF?';
2321
- if (action === 'AMEND') return 'Do you want to publish it?';
2322
- if (action === 'CORRECT') return 'Do you want to publish it?';
2323
- return 'Are you sure you want to cancel this TAF?';
2373
+ var getConfirmationDialogContent = function getConfirmationDialogContent(action, isFormDirty) {
2374
+ if (isFormDirty === void 0) {
2375
+ isFormDirty = true;
2376
+ }
2377
+
2378
+ switch (action) {
2379
+ case 'DISCARD':
2380
+ return 'Are you sure you would like to discard this TAF? Any changes made will be lost';
2381
+
2382
+ case 'PUBLISH':
2383
+ return 'Are you sure you want to publish this TAF?';
2384
+
2385
+ case 'AMEND':
2386
+ case 'CORRECT':
2387
+ return isFormDirty ? 'Do you want to publish it?' : 'Are you sure you want to publish the TAF? You did not make any changes!';
2388
+
2389
+ default:
2390
+ return 'Are you sure you want to cancel this TAF?';
2391
+ }
2324
2392
  };
2325
2393
  var getConfirmationDialogButtonLabel = function getConfirmationDialogButtonLabel(action) {
2326
2394
  switch (action) {
@@ -2397,7 +2465,7 @@
2397
2465
  borderRadius: '3px'
2398
2466
  },
2399
2467
  addButton: {
2400
- marginRight: '38px'
2468
+ marginRight: '48px'
2401
2469
  },
2402
2470
  lifecycleButtons: {
2403
2471
  marginTop: '40px',
@@ -2412,6 +2480,9 @@
2412
2480
  backdrop: {
2413
2481
  zIndex: 1500,
2414
2482
  color: '#fff'
2483
+ },
2484
+ emptyButtonContainer: {
2485
+ minWidth: 96
2415
2486
  }
2416
2487
  };
2417
2488
  });
@@ -2436,9 +2507,9 @@
2436
2507
  var getDisplayValue = function getDisplayValue(value, disabled) {
2437
2508
  return disabled && !value ? '-' : value;
2438
2509
  };
2439
- var BaseTextField = /*#__PURE__*/React__default['default'].memo(function (props) {
2510
+ var BaseTextField = /*#__PURE__*/React__default["default"].memo(function (props) {
2440
2511
  var classes = useStyles$9();
2441
- return /*#__PURE__*/React__default['default'].createElement(core.TextField, __assign({
2512
+ return /*#__PURE__*/React__default["default"].createElement(core.TextField, __assign({
2442
2513
  type: "text",
2443
2514
  variant: "filled",
2444
2515
  InputProps: {
@@ -2484,14 +2555,14 @@
2484
2555
  setValue = _k.setValue,
2485
2556
  errors = _k.errors;
2486
2557
 
2487
- var inputRef = React__default['default'].useRef(null);
2558
+ var inputRef = React__default["default"].useRef(null);
2488
2559
  var fieldErrors = getTafErrors(name, errors);
2489
2560
 
2490
- var _l = __read(React__default['default'].useState(null), 2),
2561
+ var _l = __read(React__default["default"].useState(null), 2),
2491
2562
  maxLength = _l[0],
2492
2563
  setMaxLength = _l[1];
2493
2564
 
2494
- var onKeyDown = React__default['default'].useCallback(function (event) {
2565
+ var onKeyDown = React__default["default"].useCallback(function (event) {
2495
2566
  var currentValue = getValues(name).toString();
2496
2567
  var textSelection = currentValue.substring(inputRef.current.selectionStart, inputRef.current.selectionEnd);
2497
2568
 
@@ -2508,7 +2579,7 @@
2508
2579
  }
2509
2580
  }
2510
2581
  }, [name, autoComplete, setValue, getValues]);
2511
- var onChangeField = React__default['default'].useCallback(function (event, callback) {
2582
+ var onChangeField = React__default["default"].useCallback(function (event, callback) {
2512
2583
  var valueUppercase = event.currentTarget.value.toUpperCase();
2513
2584
 
2514
2585
  if (autoComplete) {
@@ -2522,24 +2593,24 @@
2522
2593
  callback(valueUppercase);
2523
2594
  onChange(valueUppercase);
2524
2595
  }, [onChange, autoComplete]);
2525
- var onBlurField = React__default['default'].useCallback(function (callback) {
2596
+ var onBlurField = React__default["default"].useCallback(function (callback) {
2526
2597
  callback();
2527
2598
  onBlur();
2528
2599
  }, [onBlur]);
2529
- var onFocusField = React__default['default'].useCallback(function () {
2600
+ var onFocusField = React__default["default"].useCallback(function () {
2530
2601
  var _a;
2531
2602
 
2532
2603
  inputRef.current.disabled = false;
2533
2604
  (_a = inputRef.current) === null || _a === void 0 ? void 0 : _a.focus();
2534
2605
  }, []);
2535
- return /*#__PURE__*/React__default['default'].createElement(core.Grid, {
2606
+ return /*#__PURE__*/React__default["default"].createElement(core.Grid, {
2536
2607
  item: true,
2537
2608
  xs: true,
2538
2609
  className: classes.textFieldGridItem
2539
- }, /*#__PURE__*/React__default['default'].createElement(reactHookForm.Controller, {
2610
+ }, /*#__PURE__*/React__default["default"].createElement(reactHookForm.Controller, {
2540
2611
  render: function render(_props) {
2541
2612
  var displayValue = formatter ? formatter(_props.value) : getDisplayValue(_props.value, disabled);
2542
- return /*#__PURE__*/React__default['default'].createElement(BaseTextField, {
2613
+ return /*#__PURE__*/React__default["default"].createElement(BaseTextField, {
2543
2614
  label: label,
2544
2615
  disabled: disabled,
2545
2616
  name: name,
@@ -2641,7 +2712,7 @@
2641
2712
  ];
2642
2713
  };
2643
2714
 
2644
- var TafFormRow = /*#__PURE__*/React__default['default'].forwardRef(function (_a, ref) {
2715
+ var TafFormRow = /*#__PURE__*/React__default["default"].forwardRef(function (_a, ref) {
2645
2716
  var _b = _a.isChangeGroup,
2646
2717
  isChangeGroup = _b === void 0 ? false : _b,
2647
2718
  _c = _a.disabled,
@@ -2655,8 +2726,10 @@
2655
2726
  field = _f === void 0 ? null : _f,
2656
2727
  _g = _a.dragHandle,
2657
2728
  dragHandle = _g === void 0 ? null : _g,
2658
- props = __rest(_a, ["isChangeGroup", "disabled", "index", "lastRow", "onRemoveChangeGroup", "field", "dragHandle"]);
2729
+ onAddChangeGroup = _a.onAddChangeGroup,
2730
+ props = __rest(_a, ["isChangeGroup", "disabled", "index", "lastRow", "onRemoveChangeGroup", "field", "dragHandle", "onAddChangeGroup"]);
2659
2731
 
2732
+ var classes = useStyles$9();
2660
2733
  var namePrefix = !isChangeGroup ? 'baseForecast' : "changeGroups[" + index + "]";
2661
2734
  var fieldNames = getFieldNames(isChangeGroup, index);
2662
2735
 
@@ -2718,30 +2791,58 @@
2718
2791
  return true;
2719
2792
  };
2720
2793
 
2721
- return /*#__PURE__*/React__default['default'].createElement(core.Grid, __assign({
2794
+ var validatePreviousRow = React__default["default"].useCallback(function () {
2795
+ if (isChangeGroup && index > 0) {
2796
+ var _a = getValues(),
2797
+ validDateEnd = _a.validDateEnd,
2798
+ validDateStart = _a.validDateStart,
2799
+ changeGroups = _a.changeGroups;
2800
+
2801
+ var currentChangeGroup = changeGroups[index];
2802
+ var previousChangeGroup = changeGroups[index - 1];
2803
+ return validatePreviousChangeGroup(currentChangeGroup, previousChangeGroup, validDateStart, validDateEnd);
2804
+ }
2805
+
2806
+ return true;
2807
+ }, [index, isChangeGroup, getValues]);
2808
+
2809
+ var getFieldFromNextRow = function getFieldFromNextRow(fieldname) {
2810
+ if (fieldname === void 0) {
2811
+ fieldname = 'valid';
2812
+ }
2813
+
2814
+ var nextValidFieldName = "changeGroups[" + (index + 1) + "]." + fieldname;
2815
+ var nextRowValidValue = getValues(nextValidFieldName);
2816
+ return nextRowValidValue ? [nextValidFieldName] : [];
2817
+ };
2818
+
2819
+ var addChangeGroup = React__default["default"].useCallback(function () {
2820
+ onAddChangeGroup(index);
2821
+ }, [onAddChangeGroup, index]);
2822
+ return /*#__PURE__*/React__default["default"].createElement(core.Grid, __assign({
2722
2823
  "data-testid": "row-" + namePrefix,
2723
2824
  container: true,
2724
2825
  ref: ref
2725
- }, props), !isChangeGroup && /*#__PURE__*/React__default['default'].createElement(React__default['default'].Fragment, null, /*#__PURE__*/React__default['default'].createElement(TafFormTextField, {
2826
+ }, props), !isChangeGroup && /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, /*#__PURE__*/React__default["default"].createElement(TafFormTextField, {
2726
2827
  label: "Type",
2727
2828
  name: fieldNames.messageType,
2728
2829
  disabled: true
2729
- }), /*#__PURE__*/React__default['default'].createElement(TafFormTextField, {
2830
+ }), /*#__PURE__*/React__default["default"].createElement(TafFormTextField, {
2730
2831
  label: "Location",
2731
2832
  name: "location",
2732
2833
  disabled: true
2733
- }), /*#__PURE__*/React__default['default'].createElement(TafFormTextField, {
2834
+ }), /*#__PURE__*/React__default["default"].createElement(TafFormTextField, {
2734
2835
  formatter: formatIssueTime,
2735
2836
  label: "Issue time",
2736
2837
  name: "issueDate",
2737
2838
  disabled: true
2738
- })), isChangeGroup && /*#__PURE__*/React__default['default'].createElement(React__default['default'].Fragment, null, /*#__PURE__*/React__default['default'].createElement(core.Grid, {
2839
+ })), isChangeGroup && /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, /*#__PURE__*/React__default["default"].createElement(core.Grid, {
2739
2840
  item: true,
2740
2841
  xs: true,
2741
2842
  style: {
2742
2843
  display: 'flex'
2743
2844
  }
2744
- }, dragHandle), /*#__PURE__*/React__default['default'].createElement(TafFormTextField, {
2845
+ }, dragHandle), /*#__PURE__*/React__default["default"].createElement(TafFormTextField, {
2745
2846
  label: "Prob",
2746
2847
  name: fieldNames.probability,
2747
2848
  disabled: disabled,
@@ -2761,10 +2862,11 @@
2761
2862
  }],
2762
2863
  onBlur: function onBlur() {
2763
2864
  if (isChangeGroup) {
2764
- trigger(__spreadArray(__spreadArray(__spreadArray([], __read(subFields)), __read(mainOptionalFields)), __read(mainFields)));
2865
+ var nextValidFieldName = getFieldFromNextRow();
2866
+ trigger(__spreadArray(__spreadArray(__spreadArray(__spreadArray([], __read(subFields)), __read(mainOptionalFields)), __read(mainFields)), __read(nextValidFieldName)));
2765
2867
  }
2766
2868
  }
2767
- }), /*#__PURE__*/React__default['default'].createElement(TafFormTextField, {
2869
+ }), /*#__PURE__*/React__default["default"].createElement(TafFormTextField, {
2768
2870
  label: "Change",
2769
2871
  name: fieldNames.change,
2770
2872
  disabled: disabled,
@@ -2790,10 +2892,11 @@
2790
2892
  }],
2791
2893
  onBlur: function onBlur() {
2792
2894
  if (isChangeGroup) {
2793
- trigger(__spreadArray(__spreadArray(__spreadArray([], __read(subFields)), __read(mainOptionalFields)), __read(mainFields)));
2895
+ var nextValidFieldName = getFieldFromNextRow();
2896
+ trigger(__spreadArray(__spreadArray(__spreadArray(__spreadArray([], __read(subFields)), __read(mainOptionalFields)), __read(mainFields)), __read(nextValidFieldName)));
2794
2897
  }
2795
2898
  }
2796
- })), /*#__PURE__*/React__default['default'].createElement(TafFormTextField, {
2899
+ })), /*#__PURE__*/React__default["default"].createElement(TafFormTextField, {
2797
2900
  label: "Valid",
2798
2901
  name: fieldNames.valid,
2799
2902
  // always disabled for baseforecast row
@@ -2807,15 +2910,17 @@
2807
2910
  },
2808
2911
  validateValidChangeGroupInterField: function validateValidChangeGroupInterField$1(value) {
2809
2912
  return isChangeGroup ? validateValidChangeGroupInterField(value, getValues(fieldNames.change), getValues('validDateStart'), getValues('validDateEnd')) : true;
2810
- }
2913
+ },
2914
+ validatePreviousRow: validatePreviousRow
2811
2915
  }
2812
2916
  },
2813
2917
  onBlur: function onBlur() {
2814
2918
  if (isChangeGroup) {
2815
- trigger(__spreadArray(__spreadArray(__spreadArray([], __read(subFields)), __read(mainOptionalFields)), __read(mainFields)));
2919
+ var nextValidFieldName = getFieldFromNextRow();
2920
+ trigger(__spreadArray(__spreadArray(__spreadArray(__spreadArray([], __read(subFields)), __read(mainOptionalFields)), __read(mainFields)), __read(nextValidFieldName)));
2816
2921
  }
2817
2922
  }
2818
- }), /*#__PURE__*/React__default['default'].createElement(TafFormTextField, {
2923
+ }), /*#__PURE__*/React__default["default"].createElement(TafFormTextField, {
2819
2924
  label: "Wind",
2820
2925
  name: fieldNames.wind,
2821
2926
  disabled: disabled,
@@ -2835,7 +2940,7 @@
2835
2940
  }
2836
2941
  },
2837
2942
  autoFocus: !isChangeGroup
2838
- }), /*#__PURE__*/React__default['default'].createElement(TafFormTextField, {
2943
+ }), /*#__PURE__*/React__default["default"].createElement(TafFormTextField, {
2839
2944
  label: "Visibility",
2840
2945
  name: fieldNames.visibility,
2841
2946
  disabled: disabled,
@@ -2857,7 +2962,7 @@
2857
2962
  var fields = isChangeGroup ? __spreadArray(__spreadArray([], __read(subFields)), __read(mainFields)) : subFields;
2858
2963
  trigger(__spreadArray(__spreadArray([], __read(fields)), [fieldNames.weather1, fieldNames.weather2, fieldNames.weather3]));
2859
2964
  }
2860
- }), /*#__PURE__*/React__default['default'].createElement(TafFormTextField, {
2965
+ }), /*#__PURE__*/React__default["default"].createElement(TafFormTextField, {
2861
2966
  label: "Weather",
2862
2967
  name: fieldNames.weather1,
2863
2968
  disabled: disabled,
@@ -2877,7 +2982,7 @@
2877
2982
  var fields = isChangeGroup ? __spreadArray(__spreadArray([], __read(subFields)), __read(mainFields)) : [];
2878
2983
  return trigger(__spreadArray(__spreadArray([], __read(fields)), [fieldNames.weather2, fieldNames.weather3]));
2879
2984
  }
2880
- }), /*#__PURE__*/React__default['default'].createElement(TafFormTextField, {
2985
+ }), /*#__PURE__*/React__default["default"].createElement(TafFormTextField, {
2881
2986
  label: "Weather",
2882
2987
  name: fieldNames.weather2,
2883
2988
  disabled: disabled,
@@ -2893,7 +2998,7 @@
2893
2998
  var fields = isChangeGroup ? __spreadArray(__spreadArray([], __read(subFields)), __read(mainFields)) : [];
2894
2999
  return trigger(__spreadArray(__spreadArray([], __read(fields)), [fieldNames.weather3]));
2895
3000
  }
2896
- }), /*#__PURE__*/React__default['default'].createElement(TafFormTextField, {
3001
+ }), /*#__PURE__*/React__default["default"].createElement(TafFormTextField, {
2897
3002
  label: "Weather",
2898
3003
  name: fieldNames.weather3,
2899
3004
  disabled: disabled,
@@ -2905,7 +3010,7 @@
2905
3010
  }
2906
3011
  }
2907
3012
  }
2908
- }), /*#__PURE__*/React__default['default'].createElement(TafFormTextField, {
3013
+ }), /*#__PURE__*/React__default["default"].createElement(TafFormTextField, {
2909
3014
  label: "Cloud",
2910
3015
  name: fieldNames.cloud1,
2911
3016
  disabled: disabled,
@@ -2925,7 +3030,7 @@
2925
3030
  var fields = isChangeGroup ? __spreadArray(__spreadArray([], __read(subFields)), __read(mainFields)) : [];
2926
3031
  return trigger(__spreadArray(__spreadArray([], __read(fields)), [fieldNames.cloud2, fieldNames.cloud3, fieldNames.cloud4]));
2927
3032
  }
2928
- }), /*#__PURE__*/React__default['default'].createElement(TafFormTextField, {
3033
+ }), /*#__PURE__*/React__default["default"].createElement(TafFormTextField, {
2929
3034
  label: "Cloud",
2930
3035
  name: fieldNames.cloud2,
2931
3036
  disabled: disabled,
@@ -2940,7 +3045,7 @@
2940
3045
  onBlur: function onBlur() {
2941
3046
  return trigger([fieldNames.cloud3, fieldNames.cloud4]);
2942
3047
  }
2943
- }), /*#__PURE__*/React__default['default'].createElement(TafFormTextField, {
3048
+ }), /*#__PURE__*/React__default["default"].createElement(TafFormTextField, {
2944
3049
  label: "Cloud",
2945
3050
  name: fieldNames.cloud3,
2946
3051
  disabled: disabled,
@@ -2955,7 +3060,7 @@
2955
3060
  onBlur: function onBlur() {
2956
3061
  return trigger(fieldNames.cloud4);
2957
3062
  }
2958
- }), /*#__PURE__*/React__default['default'].createElement(TafFormTextField, {
3063
+ }), /*#__PURE__*/React__default["default"].createElement(TafFormTextField, {
2959
3064
  label: "Cloud",
2960
3065
  name: fieldNames.cloud4,
2961
3066
  disabled: disabled,
@@ -2967,13 +3072,21 @@
2967
3072
  }
2968
3073
  }
2969
3074
  }
2970
- }), (!isChangeGroup || disabled) && /*#__PURE__*/React__default['default'].createElement(core.Grid, {
3075
+ }), (!isChangeGroup || disabled) && /*#__PURE__*/React__default["default"].createElement(core.Grid, {
3076
+ className: classes.emptyButtonContainer,
2971
3077
  item: true,
2972
3078
  xs: true
2973
- }), isChangeGroup && !disabled && /*#__PURE__*/React__default['default'].createElement(core.Grid, {
2974
- item: true,
2975
- xs: true
2976
- }, /*#__PURE__*/React__default['default'].createElement(core.IconButton, __assign({
3079
+ }, !disabled && /*#__PURE__*/React__default["default"].createElement(core.IconButton, {
3080
+ "aria-label": "add",
3081
+ "data-testid": "add-changeGroup",
3082
+ onClick: addChangeGroup
3083
+ }, /*#__PURE__*/React__default["default"].createElement(icons.Add, null))), isChangeGroup && !disabled && /*#__PURE__*/React__default["default"].createElement(core.Grid, {
3084
+ item: true
3085
+ }, /*#__PURE__*/React__default["default"].createElement(core.IconButton, {
3086
+ "aria-label": "add",
3087
+ "data-testid": "add-changeGroup",
3088
+ onClick: addChangeGroup
3089
+ }, /*#__PURE__*/React__default["default"].createElement(icons.Add, null)), /*#__PURE__*/React__default["default"].createElement(core.IconButton, __assign({
2977
3090
  "aria-label": "delete",
2978
3091
  "data-testid": "remove-changeGroup",
2979
3092
  onClick: function onClick() {
@@ -2981,7 +3094,7 @@
2981
3094
  }
2982
3095
  }, lastRow ? {
2983
3096
  tabIndex: '-1'
2984
- } : {}), /*#__PURE__*/React__default['default'].createElement(icons.Delete, null))));
3097
+ } : {}), /*#__PURE__*/React__default["default"].createElement(icons.Delete, null))));
2985
3098
  });
2986
3099
 
2987
3100
  var getIssuesLabel = function getIssuesLabel(sumOfErrors) {
@@ -3033,20 +3146,20 @@
3033
3146
  };
3034
3147
 
3035
3148
  var ThumbsUp = function ThumbsUp(props) {
3036
- return /*#__PURE__*/React__default['default'].createElement(core.SvgIcon, __assign({
3149
+ return /*#__PURE__*/React__default["default"].createElement(core.SvgIcon, __assign({
3037
3150
  fontSize: "inherit",
3038
3151
  viewBox: "0 0 58 69"
3039
- }, props), /*#__PURE__*/React__default['default'].createElement("title", null, "Thumbs up"), /*#__PURE__*/React__default['default'].createElement("g", {
3152
+ }, props), /*#__PURE__*/React__default["default"].createElement("title", null, "Thumbs up"), /*#__PURE__*/React__default["default"].createElement("g", {
3040
3153
  id: "Thumbs-up",
3041
3154
  stroke: "none",
3042
3155
  strokeWidth: "1",
3043
3156
  fill: "none",
3044
3157
  fillRule: "evenodd"
3045
- }, /*#__PURE__*/React__default['default'].createElement("path", {
3158
+ }, /*#__PURE__*/React__default["default"].createElement("path", {
3046
3159
  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",
3047
3160
  id: "Path-2",
3048
3161
  fill: "#FFBF00"
3049
- }), /*#__PURE__*/React__default['default'].createElement("path", {
3162
+ }), /*#__PURE__*/React__default["default"].createElement("path", {
3050
3163
  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",
3051
3164
  id: "Path",
3052
3165
  fill: "#F28700"
@@ -3250,7 +3363,7 @@
3250
3363
  var errors = reactHookForm.useFormContext().errors;
3251
3364
  var errorList = filterDuplicateErrors(getErrors(errors));
3252
3365
 
3253
- var _b = __read(React__default['default'].useState(false), 2),
3366
+ var _b = __read(React__default["default"].useState(false), 2),
3254
3367
  isIssuesPaneOpen = _b[0],
3255
3368
  setIsIssuesPaneOpen = _b[1];
3256
3369
 
@@ -3258,19 +3371,19 @@
3258
3371
  return setIsIssuesPaneOpen(!isIssuesPaneOpen);
3259
3372
  };
3260
3373
 
3261
- return /*#__PURE__*/React__default['default'].createElement(React__default['default'].Fragment, null, /*#__PURE__*/React__default['default'].createElement(core.Grid, {
3374
+ return /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, /*#__PURE__*/React__default["default"].createElement(core.Grid, {
3262
3375
  container: true,
3263
3376
  justify: "space-between",
3264
3377
  alignItems: "center",
3265
3378
  className: classes.lifecycleButtons
3266
- }, /*#__PURE__*/React__default['default'].createElement(core.Grid, {
3379
+ }, /*#__PURE__*/React__default["default"].createElement(core.Grid, {
3267
3380
  item: true
3268
- }, /*#__PURE__*/React__default['default'].createElement(IssuesButton, {
3381
+ }, /*#__PURE__*/React__default["default"].createElement(IssuesButton, {
3269
3382
  sumOfErrors: errorList.length,
3270
3383
  togglePane: toggleIssuesPane
3271
- })), /*#__PURE__*/React__default['default'].createElement(core.Grid, {
3384
+ })), /*#__PURE__*/React__default["default"].createElement(core.Grid, {
3272
3385
  item: true
3273
- }, /*#__PURE__*/React__default['default'].createElement(core.Button, {
3386
+ }, /*#__PURE__*/React__default["default"].createElement(core.Button, {
3274
3387
  "data-testid": "discardtaf",
3275
3388
  variant: "outlined",
3276
3389
  color: "secondary",
@@ -3280,7 +3393,7 @@
3280
3393
  // Simply discard the changes and close the dialog.
3281
3394
  onTafFormButtonPress('DISCARD');
3282
3395
  }
3283
- }, "Discard"), /*#__PURE__*/React__default['default'].createElement(core.Button, {
3396
+ }, "Discard"), /*#__PURE__*/React__default["default"].createElement(core.Button, {
3284
3397
  "data-testid": "savedrafttaf",
3285
3398
  variant: "outlined",
3286
3399
  color: "secondary",
@@ -3310,7 +3423,7 @@
3310
3423
  break;
3311
3424
  }
3312
3425
  }
3313
- }, "Save"), /*#__PURE__*/React__default['default'].createElement(core.Button, {
3426
+ }, "Save"), /*#__PURE__*/React__default["default"].createElement(core.Button, {
3314
3427
  "data-testid": "publishtaf",
3315
3428
  variant: "outlined",
3316
3429
  color: "secondary",
@@ -3340,7 +3453,7 @@
3340
3453
  break;
3341
3454
  }
3342
3455
  }
3343
- }, "Publish"))), /*#__PURE__*/React__default['default'].createElement(IssuesPane, {
3456
+ }, "Publish"))), /*#__PURE__*/React__default["default"].createElement(IssuesPane, {
3344
3457
  errorList: errorList,
3345
3458
  handleClose: toggleIssuesPane,
3346
3459
  isOpen: isIssuesPaneOpen
@@ -3384,15 +3497,17 @@
3384
3497
  isDisabled = _c === void 0 ? false : _c,
3385
3498
  index = _a.index;
3386
3499
  var classes = useStyles$7(isSorting);
3387
- return /*#__PURE__*/React__default['default'].createElement(core.IconButton, {
3500
+ return /*#__PURE__*/React__default["default"].createElement(core.IconButton, {
3388
3501
  className: classes.dragHandle + " handle",
3389
3502
  "data-testid": "dragHandle-" + index,
3390
3503
  disableRipple: true,
3391
3504
  disabled: isDisabled
3392
- }, /*#__PURE__*/React__default['default'].createElement(icons.DragIndicator, null));
3505
+ }, /*#__PURE__*/React__default["default"].createElement(icons.DragIndicator, null));
3393
3506
  };
3394
3507
 
3395
- var emptyRow = {
3508
+ var noop = function noop() {};
3509
+
3510
+ var emptyChangegroup = {
3396
3511
  valid: '',
3397
3512
  wind: '',
3398
3513
  visibility: '',
@@ -3412,8 +3527,7 @@
3412
3527
  };
3413
3528
 
3414
3529
  var TafForm = function TafForm(_a) {
3415
- var mode = _a.mode,
3416
- changeGroups = _a.changeGroups,
3530
+ var isDisabled = _a.isDisabled,
3417
3531
  tafAction = _a.tafAction,
3418
3532
  _b = _a.staticTAC,
3419
3533
  staticTAC = _b === void 0 ? '' : _b,
@@ -3430,19 +3544,21 @@
3430
3544
 
3431
3545
  var api$1 = api.useApiContext().api;
3432
3546
  var isMounted = shared.useIsMounted().isMounted;
3433
- var isDisabled = mode === 'view';
3434
3547
 
3435
3548
  var _e = reactHookForm.useFormContext(),
3436
3549
  control = _e.control,
3437
3550
  handleSubmit = _e.handleSubmit,
3438
3551
  watch = _e.watch,
3439
- getValues = _e.getValues,
3440
- errors = _e.errors,
3441
- trigger = _e.trigger;
3552
+ trigger = _e.trigger,
3553
+ formState = _e.formState,
3554
+ getValues = _e.getValues;
3442
3555
 
3556
+ var isFormDirty = formState.isDirty,
3557
+ errors = formState.errors;
3558
+ shared.usePreventBrowserClose(isFormDirty && !isDisabled);
3443
3559
  var hiddenInputFields = ['baseTime', 'issueDate', 'type', 'uuid', 'validDateStart', 'validDateEnd', 'status', 'previousId', 'previousValidDateStart', 'previousValidDateEnd'];
3444
3560
 
3445
- var _f = __read(React__default['default'].useState(watch()), 2),
3561
+ var _f = __read(React__default["default"].useState(watch()), 2),
3446
3562
  delayedFormValues = _f[0],
3447
3563
  setDelayedFormValues = _f[1];
3448
3564
 
@@ -3450,35 +3566,26 @@
3450
3566
  TAC = _g[0],
3451
3567
  updateTAC = _g[1];
3452
3568
 
3453
- React__default['default'].useEffect(function () {
3454
- if (!Object.keys(errors).length && staticTAC === '' && isMounted.current) {
3455
- updateTAC(convertTafValuesToObject(delayedFormValues));
3456
- } // eslint-disable-next-line react-hooks/exhaustive-deps
3457
-
3458
- }, [delayedFormValues]);
3569
+ var hasErrors = Object.keys(errors).length;
3459
3570
 
3460
3571
  var onFormBlur = function onFormBlur() {
3461
3572
  setDelayedFormValues(getValues());
3462
3573
  };
3463
3574
 
3464
- var _h = __read(React__default['default'].useState(false), 2),
3465
- isFormDirty = _h[0],
3466
- setFormDirty = _h[1];
3467
-
3468
- var onFormChange = function onFormChange() {
3469
- return !isFormDirty ? setFormDirty(true) : null;
3470
- };
3575
+ React__default["default"].useEffect(function () {
3576
+ if (staticTAC === '' && isMounted.current && isFormDirty) {
3577
+ var newTAC = hasErrors ? null : convertTafValuesToObject(delayedFormValues);
3578
+ updateTAC(newTAC);
3579
+ } // eslint-disable-next-line react-hooks/exhaustive-deps
3471
3580
 
3472
- shared.usePreventBrowserClose(isFormDirty && !isDisabled);
3581
+ }, [delayedFormValues]);
3582
+ React__default["default"].useEffect(function () {
3583
+ // prevent updating an error while typing
3584
+ if (!hasErrors && isFormDirty && document.activeElement.tagName !== 'INPUT') {
3585
+ updateTAC(convertTafValuesToObject(delayedFormValues));
3586
+ } // eslint-disable-next-line react-hooks/exhaustive-deps
3473
3587
 
3474
- var _j = reactHookForm.useFieldArray({
3475
- control: control,
3476
- name: 'changeGroups'
3477
- }),
3478
- fields = _j.fields,
3479
- append = _j.append,
3480
- remove = _j.remove,
3481
- move = _j.move;
3588
+ }, [hasErrors]);
3482
3589
 
3483
3590
  var onSubmit = function onSubmit(data) {
3484
3591
  // eslint-disable-next-line no-console
@@ -3488,7 +3595,7 @@
3488
3595
  var showConfirmDialog = function showConfirmDialog(action) {
3489
3596
  return confirmDialog({
3490
3597
  title: getConfirmationDialogTitle(action),
3491
- description: getConfirmationDialogContent(action),
3598
+ description: getConfirmationDialogContent(action, isFormDirty),
3492
3599
  confirmLabel: getConfirmationDialogButtonLabel(action)
3493
3600
  });
3494
3601
  };
@@ -3532,69 +3639,99 @@
3532
3639
  }
3533
3640
  };
3534
3641
 
3535
- var onAddRow = function onAddRow() {
3536
- append(emptyRow);
3537
- };
3642
+ var _h = reactHookForm.useFieldArray({
3643
+ control: control,
3644
+ name: 'changeGroups'
3645
+ }),
3646
+ fields = _h.fields,
3647
+ insert = _h.insert,
3648
+ remove = _h.remove,
3649
+ move = _h.move;
3538
3650
 
3539
- React__default['default'].useEffect(function () {
3540
- // set changegroups on mount (if no changegroups - add empty one by default)
3541
- if (changeGroups.length > 0) {
3542
- changeGroups.forEach(function (group) {
3543
- append(group, false);
3544
- });
3545
- } else if (!isDisabled) {
3546
- append(emptyRow, false);
3547
- } // eslint-disable-next-line react-hooks/exhaustive-deps
3651
+ var _j = useDragOrder(trigger, move, onFormBlur),
3652
+ onChangeOrder = _j.onChangeOrder,
3653
+ onStartDrag = _j.onStartDrag,
3654
+ activeDraggingIndex = _j.activeDraggingIndex;
3548
3655
 
3549
- }, []);
3656
+ var onRemoverow = function onRemoverow(index) {
3657
+ confirmDialog({
3658
+ title: 'Delete row',
3659
+ description: 'Are you sure you want to delete this row?',
3660
+ confirmLabel: 'Yes'
3661
+ }).then(function () {
3662
+ remove(index);
3663
+ trigger(); // trigger all fields validation
3664
+
3665
+ onFormBlur();
3666
+ });
3667
+ }; // TODO: https://gitlab.com/opengeoweb/opengeoweb/-/issues/726 insert (react-hook-form) does not work well with focus (only last row will get focus), so added this dirty solution. This can be fixed in a better way in react-hook-form v7
3550
3668
 
3551
- var _k = useDragOrder(trigger, move, fields, onFormBlur),
3552
- onChangeOrder = _k.onChangeOrder,
3553
- sortedFields = _k.sortedFields,
3554
- setSortedFields = _k.setSortedFields;
3555
3669
 
3556
- var onRemoverow = function onRemoverow(index) {
3557
- remove(index);
3558
- var newList = fields.length > 1 ? fields.filter(function (_, fieldIndex) {
3559
- return fieldIndex === index;
3560
- }) : [];
3561
- setSortedFields(newList);
3670
+ var focusFirstInput = function focusFirstInput(rowIndex) {
3671
+ var nextRowFirstInput = document.querySelector("[name=\"changeGroups[" + rowIndex + "].probability\"]");
3672
+
3673
+ if (nextRowFirstInput) {
3674
+ nextRowFirstInput.focus();
3675
+ }
3562
3676
  };
3563
3677
 
3564
- return /*#__PURE__*/React__default['default'].createElement("form", {
3678
+ var onAddRow = function onAddRow(rowIndex) {
3679
+ if (rowIndex === void 0) {
3680
+ rowIndex = -1;
3681
+ }
3682
+
3683
+ var newRowIndex = rowIndex + 1;
3684
+ insert(newRowIndex, emptyChangegroup, false); // adding rows and validation don't work well combined, with always skipping validation of fields of rows above the one the inserted row. A setTimeout prevents this issue
3685
+
3686
+ setTimeout(function () {
3687
+ focusFirstInput(newRowIndex);
3688
+ trigger(); // trigger all fields validation
3689
+ }, 0);
3690
+ };
3691
+
3692
+ React__default["default"].useEffect(function () {
3693
+ if (!isDisabled) {
3694
+ // trigger validation on all changegroup validity times after initial load since they could be outside the new validity period
3695
+ var validFields = fields.map(function (_field, index) {
3696
+ return "changeGroups[" + index + "].valid";
3697
+ });
3698
+ trigger(validFields);
3699
+ } // eslint-disable-next-line react-hooks/exhaustive-deps
3700
+
3701
+ }, []);
3702
+ return /*#__PURE__*/React__default["default"].createElement("form", {
3565
3703
  onSubmit: handleSubmit(onSubmit),
3566
- onChange: onFormChange,
3567
3704
  onBlur: onFormBlur
3568
- }, /*#__PURE__*/React__default['default'].createElement(core.Typography, {
3705
+ }, /*#__PURE__*/React__default["default"].createElement(core.Typography, {
3569
3706
  className: classes.tacTitle
3570
- }, "TAC"), /*#__PURE__*/React__default['default'].createElement(core.Typography, {
3707
+ }, "TAC"), /*#__PURE__*/React__default["default"].createElement(core.Typography, {
3571
3708
  "data-testid": "form-tac-message",
3572
3709
  className: classes.tacText
3573
3710
  }, TAC.split('\n').map(function (line) {
3574
- return /*#__PURE__*/React__default['default'].createElement("span", {
3711
+ return /*#__PURE__*/React__default["default"].createElement("span", {
3575
3712
  key: line,
3576
3713
  className: classes.tacLine,
3577
3714
  "data-testid": "tafform-tac-message-line"
3578
3715
  }, line);
3579
- })), /*#__PURE__*/React__default['default'].createElement(TafFormRow, {
3580
- disabled: isDisabled
3581
- }), /*#__PURE__*/React__default['default'].createElement(reactSortablejs.ReactSortable, {
3716
+ })), /*#__PURE__*/React__default["default"].createElement(TafFormRow, {
3717
+ disabled: isDisabled,
3718
+ onAddChangeGroup: onAddRow
3719
+ }), /*#__PURE__*/React__default["default"].createElement(reactSortablejs.ReactSortable, {
3582
3720
  tag: "div",
3583
- list: sortedFields,
3584
- setList: setSortedFields,
3721
+ list: fields,
3722
+ setList: noop,
3585
3723
  animation: 200,
3586
3724
  onSort: onChangeOrder,
3587
3725
  handle: ".handle",
3588
3726
  direction: "vertical",
3589
3727
  // hover props
3590
3728
  forceFallback: true,
3591
- onStart: function onStart() {
3729
+ onStart: function onStart(event) {
3730
+ onStartDrag(event);
3592
3731
  reactSortablejs.Sortable.ghost.style.opacity = '1';
3593
3732
  }
3594
- }, sortedFields.map(function (_a, index) {
3595
- var chosen = _a.chosen;
3596
- var item = fields[index];
3597
- return /*#__PURE__*/React__default['default'].createElement(TafFormRow, {
3733
+ }, fields.map(function (item, index) {
3734
+ return /*#__PURE__*/React__default["default"].createElement(TafFormRow, {
3598
3735
  field: item,
3599
3736
  className: classes.formRow,
3600
3737
  key: item.id,
@@ -3602,32 +3739,23 @@
3602
3739
  lastRow: fields.length === index + 1,
3603
3740
  disabled: isDisabled,
3604
3741
  onRemoveChangeGroup: onRemoverow,
3742
+ onAddChangeGroup: onAddRow,
3605
3743
  isChangeGroup: true,
3606
- dragHandle: /*#__PURE__*/React__default['default'].createElement(DragHandle, {
3607
- isDisabled: sortedFields.length === 1 || isDisabled,
3608
- isSorting: chosen,
3744
+ dragHandle: /*#__PURE__*/React__default["default"].createElement(DragHandle, {
3745
+ isDisabled: fields.length === 1 || isDisabled,
3746
+ isSorting: activeDraggingIndex === index,
3609
3747
  index: index
3610
3748
  })
3611
3749
  });
3612
- })), !isDisabled && /*#__PURE__*/React__default['default'].createElement(React__default['default'].Fragment, null, /*#__PURE__*/React__default['default'].createElement(core.Grid, {
3613
- container: true,
3614
- item: true,
3615
- xs: 12,
3616
- justify: "flex-end"
3617
- }, /*#__PURE__*/React__default['default'].createElement(core.IconButton, {
3618
- "aria-label": "add",
3619
- "data-testid": "add-changeGroup",
3620
- onClick: onAddRow,
3621
- className: classes.addButton
3622
- }, /*#__PURE__*/React__default['default'].createElement(icons.Add, null))), /*#__PURE__*/React__default['default'].createElement(TafFormButtons, {
3750
+ })), !isDisabled && /*#__PURE__*/React__default["default"].createElement(TafFormButtons, {
3623
3751
  tafAction: tafAction,
3624
3752
  onTafFormButtonPress: onTafButtonPress
3625
- })), hiddenInputFields.map(function (field) {
3626
- return /*#__PURE__*/React__default['default'].createElement(formFields.ReactHookFormHiddenInput, {
3753
+ }), hiddenInputFields.map(function (field) {
3754
+ return /*#__PURE__*/React__default["default"].createElement(formFields.ReactHookFormHiddenInput, {
3627
3755
  name: field,
3628
3756
  key: field
3629
3757
  });
3630
- }), /*#__PURE__*/React__default['default'].createElement(DraftFieldHelper, null));
3758
+ }), /*#__PURE__*/React__default["default"].createElement(DraftFieldHelper, null));
3631
3759
  };
3632
3760
 
3633
3761
  var getMessageType = function getMessageType(taf, tafAction) {
@@ -3647,8 +3775,8 @@
3647
3775
  var previousValidDateEnd = taf.previousValidDateEnd && tafAction !== 'AMEND' ? taf.previousValidDateEnd : taf.validDateEnd; // For amendment change valid start time to current time
3648
3776
  // only do this if we're already within the validity period
3649
3777
 
3650
- if ((tafAction === 'AMEND' || tafAction === 'DRAFT_AMEND') && moment__default['default'].utc() >= moment__default['default'].utc(taf.validDateStart)) {
3651
- var now = moment__default['default'].utc().format('YYYY-MM-DDTHH:mm:ss[Z]');
3778
+ if ((tafAction === 'AMEND' || tafAction === 'DRAFT_AMEND') && moment__default["default"].utc() >= moment__default["default"].utc(taf.validDateStart)) {
3779
+ var now = moment__default["default"].utc().format('YYYY-MM-DDTHH:mm:ss[Z]');
3652
3780
  var validObj = {
3653
3781
  start: now,
3654
3782
  end: taf.baseForecast.valid.end
@@ -3668,15 +3796,21 @@
3668
3796
  previousValidDateEnd: previousValidDateEnd
3669
3797
  });
3670
3798
  };
3671
- var prepareTafValues = function prepareTafValues(_taf, tafAction) {
3672
- // If action is AMEND/CORRECT/DRAFT_AMEND/DRAFT_CORRECTION - add previous valid start and end
3799
+ var prepareTafValues = function prepareTafValues(_taf, tafAction, addEmptyChangeGroup) {
3800
+ if (addEmptyChangeGroup === void 0) {
3801
+ addEmptyChangeGroup = false;
3802
+ } // If action is AMEND/CORRECT/DRAFT_AMEND/DRAFT_CORRECTION - add previous valid start and end
3673
3803
  // If action is AMEND/DRAFT_AMEND - update validity start time to current time
3804
+
3805
+
3674
3806
  var taf = tafAction === 'AMEND' || tafAction === 'DRAFT_AMEND' || tafAction === 'CORRECT' || tafAction === 'DRAFT_CORRECT' ? getAmendedCorrectedTafTimes(_taf, tafAction) : _taf;
3675
- return __assign(__assign(__assign({}, taf), {
3807
+ return __assign(__assign(__assign(__assign({}, taf), {
3676
3808
  messageType: getMessageType(taf, tafAction),
3677
3809
  baseForecast: formatFormValues(taf.baseForecast)
3678
3810
  }), taf.changeGroups && {
3679
3811
  changeGroups: taf.changeGroups.map(formatFormValues)
3812
+ }), addEmptyChangeGroup && {
3813
+ changeGroups: [emptyChangegroup]
3680
3814
  });
3681
3815
  };
3682
3816
 
@@ -3687,24 +3821,19 @@
3687
3821
  _b = _a.TAC,
3688
3822
  TAC = _b === void 0 ? '' : _b,
3689
3823
  onFormAction = _a.onFormAction;
3690
- 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
3691
-
3692
- var _c = prepareTafValues(taf, tafAction),
3693
- _d = _c.changeGroups,
3694
- changeGroups = _d === void 0 ? [] : _d,
3695
- defaultValues = __rest(_c, ["changeGroups"]);
3696
-
3824
+ var taf = tafFromBackend.taf;
3825
+ var isDisabled = mode === 'view';
3826
+ var defaultValues = prepareTafValues(taf, tafAction, !isDisabled && !taf.changeGroups);
3697
3827
  var options = {
3698
3828
  defaultValues: defaultValues,
3699
3829
  mode: 'onTouched',
3700
3830
  reValidateMode: 'onChange',
3701
3831
  criteriaMode: 'all'
3702
3832
  };
3703
- return /*#__PURE__*/React__default['default'].createElement(formFields.ReactHookFormProvider, {
3833
+ return /*#__PURE__*/React__default["default"].createElement(formFields.ReactHookFormProvider, {
3704
3834
  options: options
3705
- }, /*#__PURE__*/React__default['default'].createElement(TafForm, {
3706
- mode: mode,
3707
- changeGroups: changeGroups,
3835
+ }, /*#__PURE__*/React__default["default"].createElement(TafForm, {
3836
+ isDisabled: isDisabled,
3708
3837
  tafAction: tafAction,
3709
3838
  staticTAC: TAC,
3710
3839
  onFormAction: onFormAction
@@ -3802,11 +3931,11 @@
3802
3931
  * */
3803
3932
 
3804
3933
  var getActiveStatus = function getActiveStatus(listType, className) {
3805
- return listType === 'ACTIVE' ? /*#__PURE__*/React__default['default'].createElement(icons.CheckCircle, {
3934
+ return listType === 'ACTIVE' ? /*#__PURE__*/React__default["default"].createElement(icons.CheckCircle, {
3806
3935
  "data-testid": "status-active",
3807
3936
  className: className,
3808
3937
  fontSize: "small"
3809
- }) : /*#__PURE__*/React__default['default'].createElement(icons.Schedule, {
3938
+ }) : /*#__PURE__*/React__default["default"].createElement(icons.Schedule, {
3810
3939
  "data-testid": "status-upcoming",
3811
3940
  className: className,
3812
3941
  fontSize: "small"
@@ -3818,13 +3947,13 @@
3818
3947
  if (taf.status === 'NEW') return null;
3819
3948
 
3820
3949
  if (taf.status === 'CANCELLED') {
3821
- return /*#__PURE__*/React__default['default'].createElement(shared.StatusTag, {
3950
+ return /*#__PURE__*/React__default["default"].createElement(shared.StatusTag, {
3822
3951
  content: "cancelled",
3823
3952
  color: "red"
3824
3953
  });
3825
3954
  }
3826
3955
 
3827
- return /*#__PURE__*/React__default['default'].createElement(shared.StatusTag, {
3956
+ return /*#__PURE__*/React__default["default"].createElement(shared.StatusTag, {
3828
3957
  content: taf.status.toLowerCase(),
3829
3958
  color: taf.status === 'EXPIRED' ? 'grey' : 'green'
3830
3959
  });
@@ -3868,101 +3997,101 @@
3868
3997
  _c = _a.showTac,
3869
3998
  showTac = _c === void 0 ? false : _c;
3870
3999
  var classes = useStyles$5();
3871
- var validTimeDate = moment__default['default'].utc(taf.validDateStart).format('DD MMM');
3872
- var baseTime = moment__default['default'].utc(taf.baseTime).format('HH:mm');
3873
- return /*#__PURE__*/React__default['default'].createElement(core.Card, {
4000
+ var validTimeDate = moment__default["default"].utc(taf.validDateStart).format('DD MMM');
4001
+ var baseTime = moment__default["default"].utc(taf.baseTime).format('HH:mm');
4002
+ return /*#__PURE__*/React__default["default"].createElement(core.Card, {
3874
4003
  elevation: 0,
3875
4004
  className: classes.cardWrapper
3876
- }, /*#__PURE__*/React__default['default'].createElement(core.Grid, {
4005
+ }, /*#__PURE__*/React__default["default"].createElement(core.Grid, {
3877
4006
  container: true,
3878
4007
  alignItems: "center",
3879
4008
  spacing: 1
3880
- }, /*#__PURE__*/React__default['default'].createElement(core.Grid, {
4009
+ }, /*#__PURE__*/React__default["default"].createElement(core.Grid, {
3881
4010
  item: true,
3882
4011
  xs: 3,
3883
4012
  sm: 2,
3884
4013
  md: 1
3885
- }, /*#__PURE__*/React__default['default'].createElement(core.Typography, {
4014
+ }, /*#__PURE__*/React__default["default"].createElement(core.Typography, {
3886
4015
  variant: "subtitle2",
3887
4016
  noWrap: true,
3888
4017
  className: classes.font
3889
- }, taf.location)), /*#__PURE__*/React__default['default'].createElement(core.Grid, {
4018
+ }, taf.location)), /*#__PURE__*/React__default["default"].createElement(core.Grid, {
3890
4019
  item: true,
3891
4020
  xs: 3,
3892
4021
  sm: 3,
3893
4022
  md: 1,
3894
4023
  container: true
3895
- }, /*#__PURE__*/React__default['default'].createElement(core.Grid, {
4024
+ }, /*#__PURE__*/React__default["default"].createElement(core.Grid, {
3896
4025
  item: true,
3897
4026
  xs: 3,
3898
4027
  sm: 3,
3899
4028
  md: 3,
3900
4029
  className: classes.alignIcon
3901
- }, showTac && /*#__PURE__*/React__default['default'].createElement(core.Tooltip, {
4030
+ }, showTac && /*#__PURE__*/React__default["default"].createElement(core.Tooltip, {
3902
4031
  "data-testid": "taflistrow-tactooltip",
3903
- title: /*#__PURE__*/React__default['default'].createElement("div", {
4032
+ title: /*#__PURE__*/React__default["default"].createElement("div", {
3904
4033
  style: {
3905
4034
  whiteSpace: 'pre-line'
3906
4035
  }
3907
4036
  }, TAC),
3908
4037
  placement: "bottom-start"
3909
- }, /*#__PURE__*/React__default['default'].createElement(icons.InfoOutlined, {
4038
+ }, /*#__PURE__*/React__default["default"].createElement(icons.InfoOutlined, {
3910
4039
  "data-testid": "taflistrow-tacicon",
3911
4040
  color: "secondary",
3912
4041
  fontSize: "small"
3913
- }))), /*#__PURE__*/React__default['default'].createElement(core.Grid, {
4042
+ }))), /*#__PURE__*/React__default["default"].createElement(core.Grid, {
3914
4043
  item: true,
3915
4044
  xs: 9,
3916
4045
  sm: 9,
3917
4046
  md: 9
3918
- }, /*#__PURE__*/React__default['default'].createElement(core.Typography, {
4047
+ }, /*#__PURE__*/React__default["default"].createElement(core.Typography, {
3919
4048
  variant: "subtitle2",
3920
4049
  className: classes.font,
3921
4050
  "data-testid": "baseTime"
3922
- }, baseTime))), /*#__PURE__*/React__default['default'].createElement(core.Grid, {
4051
+ }, baseTime))), /*#__PURE__*/React__default["default"].createElement(core.Grid, {
3923
4052
  item: true,
3924
4053
  xs: 3,
3925
4054
  sm: 2,
3926
4055
  md: 1
3927
- }, /*#__PURE__*/React__default['default'].createElement(core.Typography, {
4056
+ }, /*#__PURE__*/React__default["default"].createElement(core.Typography, {
3928
4057
  variant: "subtitle2",
3929
4058
  className: classes.font,
3930
4059
  "data-testid": "validTimeDate"
3931
- }, validTimeDate)), /*#__PURE__*/React__default['default'].createElement(core.Grid, {
4060
+ }, validTimeDate)), /*#__PURE__*/React__default["default"].createElement(core.Grid, {
3932
4061
  item: true,
3933
4062
  xs: 3,
3934
4063
  sm: 3,
3935
4064
  md: 6
3936
- }, /*#__PURE__*/React__default['default'].createElement(core.Typography, {
4065
+ }, /*#__PURE__*/React__default["default"].createElement(core.Typography, {
3937
4066
  variant: "subtitle2",
3938
4067
  className: classes.font,
3939
4068
  "data-testid": "validTimeSlot"
3940
4069
  }, formatValidToString({
3941
4070
  start: taf.validDateStart,
3942
4071
  end: taf.validDateEnd
3943
- }))), /*#__PURE__*/React__default['default'].createElement(core.Grid, {
4072
+ }))), /*#__PURE__*/React__default["default"].createElement(core.Grid, {
3944
4073
  item: true,
3945
4074
  xs: 12,
3946
4075
  sm: 4,
3947
4076
  md: 3
3948
- }, /*#__PURE__*/React__default['default'].createElement(core.Grid, {
4077
+ }, /*#__PURE__*/React__default["default"].createElement(core.Grid, {
3949
4078
  container: true,
3950
4079
  justify: "flex-start",
3951
4080
  spacing: 2
3952
- }, /*#__PURE__*/React__default['default'].createElement(core.Grid, {
4081
+ }, /*#__PURE__*/React__default["default"].createElement(core.Grid, {
3953
4082
  item: true,
3954
4083
  xs: 8,
3955
4084
  container: true,
3956
4085
  justify: "flex-end"
3957
- }, taf.status === 'DRAFT' || taf.status === 'DRAFT_CORRECTED' || taf.status === 'DRAFT_AMENDED' ? /*#__PURE__*/React__default['default'].createElement(core.Button, {
4086
+ }, taf.status === 'DRAFT' || taf.status === 'DRAFT_CORRECTED' || taf.status === 'DRAFT_AMENDED' ? /*#__PURE__*/React__default["default"].createElement(core.Button, {
3958
4087
  color: "secondary",
3959
4088
  size: "small",
3960
4089
  "data-testid": "tafRow-draft",
3961
- startIcon: /*#__PURE__*/React__default['default'].createElement(icons.Create, {
4090
+ startIcon: /*#__PURE__*/React__default["default"].createElement(icons.Create, {
3962
4091
  fontSize: "small",
3963
4092
  color: "secondary"
3964
4093
  })
3965
- }, getDraftTitle(taf.status)) : getStatusTagList(taf)), /*#__PURE__*/React__default['default'].createElement(core.Grid, {
4094
+ }, getDraftTitle(taf.status)) : getStatusTagList(taf)), /*#__PURE__*/React__default["default"].createElement(core.Grid, {
3966
4095
  item: true,
3967
4096
  className: classes.alignIcon
3968
4097
  }, taf.status !== 'NEW' && taf.status !== 'DRAFT' && taf.status !== 'DRAFT_CORRECTED' && taf.status !== 'DRAFT_AMENDED' && taf.status !== 'CANCELLED' && listType !== 'EXPIRED' && getActiveStatus(listType, classes.activeStatus))))));
@@ -3986,10 +4115,10 @@
3986
4115
  * */
3987
4116
  var getListType = function getListType(taf, locationSettings) {
3988
4117
  if (!taf) return null;
3989
- var now = moment__default['default'].utc();
3990
- var baseTime = moment__default['default'].utc(taf.baseTime);
4118
+ var now = moment__default["default"].utc();
4119
+ var baseTime = moment__default["default"].utc(taf.baseTime);
3991
4120
  var activityPeriod = locationSettings[taf.location].activity_period;
3992
- var nextBaseTime = moment__default['default'].utc(taf.baseTime).add(activityPeriod, 'hours');
4121
+ var nextBaseTime = moment__default["default"].utc(taf.baseTime).add(activityPeriod, 'hours');
3993
4122
 
3994
4123
  if (taf.status === 'EXPIRED') {
3995
4124
  return 'EXPIRED';
@@ -4029,10 +4158,10 @@
4029
4158
  onFormAction = _a.onFormAction;
4030
4159
  var taf = tafFromBackend ? tafFromBackend.taf : null;
4031
4160
  var locationSettings = useTafSettings(tafConfig).locations;
4032
- return /*#__PURE__*/React__default['default'].createElement(ContentDialog, {
4161
+ return /*#__PURE__*/React__default["default"].createElement(ContentDialog, {
4033
4162
  open: open,
4034
4163
  toggleDialogStatus: toggleFormDialog,
4035
- titleComponent: /*#__PURE__*/React__default['default'].createElement(TafListRow, {
4164
+ titleComponent: /*#__PURE__*/React__default["default"].createElement(TafListRow, {
4036
4165
  taf: taf,
4037
4166
  listType: getListType(taf, locationSettings)
4038
4167
  }),
@@ -4070,34 +4199,34 @@
4070
4199
  canBe = _a.canBe,
4071
4200
  onClickTafActionButton = _a.onClickTafActionButton;
4072
4201
  var classes = useStyles$4();
4073
- return !canBe.includes('CANCELLED') && !canBe.includes('CORRECTED') && !canBe.includes('AMENDED') ? null : /*#__PURE__*/React__default['default'].createElement(core.Grid, {
4202
+ return !canBe.includes('CANCELLED') && !canBe.includes('CORRECTED') && !canBe.includes('AMENDED') ? null : /*#__PURE__*/React__default["default"].createElement(core.Grid, {
4074
4203
  container: true,
4075
4204
  alignItems: "center",
4076
4205
  justify: "flex-end",
4077
4206
  "data-testid": "taflist-canbebuttons",
4078
4207
  spacing: 1,
4079
4208
  className: classes.actionButtons
4080
- }, /*#__PURE__*/React__default['default'].createElement(core.Grid, {
4209
+ }, /*#__PURE__*/React__default["default"].createElement(core.Grid, {
4081
4210
  item: true
4082
- }, canBe.includes('CANCELLED') && /*#__PURE__*/React__default['default'].createElement(core.Button, {
4211
+ }, canBe.includes('CANCELLED') && /*#__PURE__*/React__default["default"].createElement(core.Button, {
4083
4212
  "data-testid": "canceltaf",
4084
4213
  variant: "outlined",
4085
4214
  color: "secondary",
4086
4215
  onClick: function onClick() {
4087
4216
  return onClickTafActionButton(uuid, 'CANCEL');
4088
4217
  }
4089
- }, "Cancel")), /*#__PURE__*/React__default['default'].createElement(core.Grid, {
4218
+ }, "Cancel")), /*#__PURE__*/React__default["default"].createElement(core.Grid, {
4090
4219
  item: true
4091
- }, canBe.includes('CORRECTED') && /*#__PURE__*/React__default['default'].createElement(core.Button, {
4220
+ }, canBe.includes('CORRECTED') && /*#__PURE__*/React__default["default"].createElement(core.Button, {
4092
4221
  "data-testid": "correctaf",
4093
4222
  variant: "outlined",
4094
4223
  color: "secondary",
4095
4224
  onClick: function onClick() {
4096
4225
  return onClickTafActionButton(uuid, 'CORRECT');
4097
4226
  }
4098
- }, "Correct")), /*#__PURE__*/React__default['default'].createElement(core.Grid, {
4227
+ }, "Correct")), /*#__PURE__*/React__default["default"].createElement(core.Grid, {
4099
4228
  item: true
4100
- }, canBe.includes('AMENDED') && /*#__PURE__*/React__default['default'].createElement(core.Button, {
4229
+ }, canBe.includes('AMENDED') && /*#__PURE__*/React__default["default"].createElement(core.Button, {
4101
4230
  "data-testid": "amendtaf",
4102
4231
  variant: "outlined",
4103
4232
  color: "secondary",
@@ -4146,7 +4275,7 @@
4146
4275
  TAC = _c[0],
4147
4276
  requestTAC = _c[1];
4148
4277
 
4149
- React__default['default'].useEffect(function () {
4278
+ React__default["default"].useEffect(function () {
4150
4279
  // only re-retrieve TAC if draft state
4151
4280
  if (tafListItem.taf.status === 'DRAFT' || tafListItem.taf.status === 'DRAFT_AMENDED' || tafListItem.taf.status === 'DRAFT_CORRECTED') {
4152
4281
  requestTAC(tafListItem.taf);
@@ -4154,7 +4283,7 @@
4154
4283
 
4155
4284
  }, [tafListItem.taf]);
4156
4285
  var popOut = status === 'NEW' || status === 'DRAFT' || status === 'DRAFT_AMENDED' || status === 'DRAFT_CORRECTED';
4157
- return /*#__PURE__*/React__default['default'].createElement(core.Accordion, __assign({
4286
+ return /*#__PURE__*/React__default["default"].createElement(core.Accordion, __assign({
4158
4287
  "data-testid": "tafListItem",
4159
4288
  className: classes.accordion
4160
4289
  }, popOut ? {
@@ -4168,41 +4297,41 @@
4168
4297
  TransitionProps: {
4169
4298
  unmountOnExit: true
4170
4299
  }
4171
- }), /*#__PURE__*/React__default['default'].createElement(core.AccordionSummary, {
4300
+ }), /*#__PURE__*/React__default["default"].createElement(core.AccordionSummary, {
4172
4301
  "data-testid": "tafListSectionAccordionSummary",
4173
- expandIcon: popOut ? /*#__PURE__*/React__default['default'].createElement(core.Tooltip, {
4302
+ expandIcon: popOut ? /*#__PURE__*/React__default["default"].createElement(core.Tooltip, {
4174
4303
  title: "Popout to edit"
4175
- }, /*#__PURE__*/React__default['default'].createElement(icons.OpenInNew, {
4304
+ }, /*#__PURE__*/React__default["default"].createElement(icons.OpenInNew, {
4176
4305
  "data-testid": "popOutIcon",
4177
4306
  fontSize: "small"
4178
- })) : /*#__PURE__*/React__default['default'].createElement(icons.ExpandMore, {
4307
+ })) : /*#__PURE__*/React__default["default"].createElement(icons.ExpandMore, {
4179
4308
  "data-testid": "expandIcon"
4180
4309
  })
4181
- }, /*#__PURE__*/React__default['default'].createElement(TafListRow, {
4310
+ }, /*#__PURE__*/React__default["default"].createElement(TafListRow, {
4182
4311
  taf: tafListItem.taf,
4183
4312
  listType: listType,
4184
4313
  TAC: TAC,
4185
4314
  showTac: true
4186
- })), /*#__PURE__*/React__default['default'].createElement(core.AccordionDetails, null, /*#__PURE__*/React__default['default'].createElement(core.Grid, {
4315
+ })), /*#__PURE__*/React__default["default"].createElement(core.AccordionDetails, null, /*#__PURE__*/React__default["default"].createElement(core.Grid, {
4187
4316
  container: true,
4188
4317
  direction: "column"
4189
4318
  }, errorCancelTaf.length > 0 && errorCancelTaf.find(function (uuid) {
4190
4319
  return uuid === tafListItem.taf.uuid;
4191
- }) && /*#__PURE__*/React__default['default'].createElement(shared.AlertBanner, {
4320
+ }) && /*#__PURE__*/React__default["default"].createElement(shared.AlertBanner, {
4192
4321
  severity: "error",
4193
4322
  title: "Cancelling this TAF failed, please try again",
4194
4323
  dataTestId: "tafList-cancelAlert"
4195
- }), /*#__PURE__*/React__default['default'].createElement("div", {
4324
+ }), /*#__PURE__*/React__default["default"].createElement("div", {
4196
4325
  className: classes.formPadding
4197
- }, /*#__PURE__*/React__default['default'].createElement(core.Grid, {
4326
+ }, /*#__PURE__*/React__default["default"].createElement(core.Grid, {
4198
4327
  item: true
4199
- }, /*#__PURE__*/React__default['default'].createElement(TafFormWrapper, {
4328
+ }, /*#__PURE__*/React__default["default"].createElement(TafFormWrapper, {
4200
4329
  tafFromBackend: tafListItem,
4201
4330
  mode: "view",
4202
4331
  TAC: TAC
4203
- })), /*#__PURE__*/React__default['default'].createElement(core.Grid, {
4332
+ })), /*#__PURE__*/React__default["default"].createElement(core.Grid, {
4204
4333
  item: true
4205
- }, /*#__PURE__*/React__default['default'].createElement(TafListButtons, {
4334
+ }, /*#__PURE__*/React__default["default"].createElement(TafListButtons, {
4206
4335
  canBe: tafListItem.canbe,
4207
4336
  uuid: tafListItem.taf.uuid,
4208
4337
  onClickTafActionButton: onClickTafActionButton
@@ -4245,13 +4374,13 @@
4245
4374
  errorCancelTaf = _b === void 0 ? [] : _b,
4246
4375
  onClickTafActionButton = _a.onClickTafActionButton;
4247
4376
  var classes = useStyles$2();
4248
- return /*#__PURE__*/React__default['default'].createElement(React__default['default'].Fragment, null, /*#__PURE__*/React__default['default'].createElement(core.Typography, {
4377
+ return /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, /*#__PURE__*/React__default["default"].createElement(core.Typography, {
4249
4378
  variant: "subtitle2",
4250
4379
  className: classes.listHeaders
4251
- }, title), /*#__PURE__*/React__default['default'].createElement("div", {
4380
+ }, title), /*#__PURE__*/React__default["default"].createElement("div", {
4252
4381
  "data-testid": "tafList" + listType
4253
4382
  }, tafList.map(function (tafListItem) {
4254
- return /*#__PURE__*/React__default['default'].createElement(TafListAccordion, {
4383
+ return /*#__PURE__*/React__default["default"].createElement(TafListAccordion, {
4255
4384
  key: tafListItem.taf.uuid + "-" + tafListItem.taf.status,
4256
4385
  tafListItem: tafListItem,
4257
4386
  listType: listType,
@@ -4293,10 +4422,10 @@
4293
4422
  try {
4294
4423
  for (var tafList_1 = __values(tafList), tafList_1_1 = tafList_1.next(); !tafList_1_1.done; tafList_1_1 = tafList_1.next()) {
4295
4424
  var taf = tafList_1_1.value;
4296
- var now = moment__default['default'].utc();
4297
- var baseTime = moment__default['default'].utc(taf.taf.baseTime);
4425
+ var now = moment__default["default"].utc();
4426
+ var baseTime = moment__default["default"].utc(taf.taf.baseTime);
4298
4427
  var activityPeriod = locationSettings[taf.taf.location].activity_period;
4299
- var nextBaseTime = moment__default['default'].utc(taf.taf.baseTime).add(activityPeriod, 'hours');
4428
+ var nextBaseTime = moment__default["default"].utc(taf.taf.baseTime).add(activityPeriod, 'hours');
4300
4429
 
4301
4430
  if (taf.taf.status === 'EXPIRED') {
4302
4431
  expiredTafs.push(taf);
@@ -4319,37 +4448,37 @@
4319
4448
  }
4320
4449
  }
4321
4450
 
4322
- return /*#__PURE__*/React__default['default'].createElement(core.Grid, {
4451
+ return /*#__PURE__*/React__default["default"].createElement(core.Grid, {
4323
4452
  container: true,
4324
4453
  direction: "column",
4325
4454
  alignItems: "stretch"
4326
- }, /*#__PURE__*/React__default['default'].createElement(core.Grid, {
4455
+ }, /*#__PURE__*/React__default["default"].createElement(core.Grid, {
4327
4456
  item: true,
4328
4457
  className: classes.listBody
4329
- }, error && /*#__PURE__*/React__default['default'].createElement(shared.AlertBanner, {
4458
+ }, error && /*#__PURE__*/React__default["default"].createElement(shared.AlertBanner, {
4330
4459
  severity: "error",
4331
4460
  title: "An error has occurred while retrieving the list, please try again",
4332
4461
  info: error.message ? error.message : '',
4333
4462
  dataTestId: "tafList-alert"
4334
- }), tafList && /*#__PURE__*/React__default['default'].createElement(React__default['default'].Fragment, null, /*#__PURE__*/React__default['default'].createElement(TafListSection, {
4463
+ }), tafList && /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, /*#__PURE__*/React__default["default"].createElement(TafListSection, {
4335
4464
  title: "Upcoming",
4336
4465
  listType: "UPCOMING",
4337
4466
  tafList: upcomingTafs,
4338
4467
  errorCancelTaf: errorCancelTaf,
4339
4468
  onClickTafActionButton: onClickTafActionButton
4340
- }), /*#__PURE__*/React__default['default'].createElement(TafListSection, {
4469
+ }), /*#__PURE__*/React__default["default"].createElement(TafListSection, {
4341
4470
  title: "Current time slot",
4342
4471
  listType: "ACTIVE",
4343
4472
  tafList: currentTafs,
4344
4473
  errorCancelTaf: errorCancelTaf,
4345
4474
  onClickTafActionButton: onClickTafActionButton
4346
- }), /*#__PURE__*/React__default['default'].createElement(TafListSection, {
4475
+ }), /*#__PURE__*/React__default["default"].createElement(TafListSection, {
4347
4476
  title: "Expired",
4348
4477
  listType: "EXPIRED",
4349
4478
  tafList: expiredTafs,
4350
4479
  errorCancelTaf: errorCancelTaf,
4351
4480
  onClickTafActionButton: onClickTafActionButton
4352
- })), isLoading && /*#__PURE__*/React__default['default'].createElement(lab.Skeleton, {
4481
+ })), isLoading && /*#__PURE__*/React__default["default"].createElement(lab.Skeleton, {
4353
4482
  "data-testid": "tafList-skeleton",
4354
4483
  variant: "rect",
4355
4484
  height: "660px"
@@ -4381,10 +4510,10 @@
4381
4510
 
4382
4511
  var Spinner = function Spinner() {
4383
4512
  var classes = useStyles();
4384
- return /*#__PURE__*/React__default['default'].createElement(core.Backdrop, {
4513
+ return /*#__PURE__*/React__default["default"].createElement(core.Backdrop, {
4385
4514
  open: true,
4386
4515
  className: classes.backdrop
4387
- }, /*#__PURE__*/React__default['default'].createElement(core.CircularProgress, {
4516
+ }, /*#__PURE__*/React__default["default"].createElement(core.CircularProgress, {
4388
4517
  "data-testid": "spinner",
4389
4518
  color: "inherit"
4390
4519
  }));
@@ -4395,11 +4524,11 @@
4395
4524
  pollingInterval = 10000;
4396
4525
  }
4397
4526
 
4398
- var _a = __read(React__default['default'].useState([]), 2),
4527
+ var _a = __read(React__default["default"].useState([]), 2),
4399
4528
  errorCancelTaf = _a[0],
4400
4529
  setErrorCancelTaf = _a[1];
4401
4530
 
4402
- React__default['default'].useEffect(function () {
4531
+ React__default["default"].useEffect(function () {
4403
4532
  var cancelErrorMessageHandler = errorCancelTaf.length > 0 ? setTimeout(function () {
4404
4533
  if (errorCancelTaf.length > 0) {
4405
4534
  setErrorCancelTaf(errorCancelTaf.slice(1));
@@ -4424,27 +4553,27 @@
4424
4553
  var api$1 = api.useApiContext().api;
4425
4554
  var confirmDialog = shared.useConfirmationDialog();
4426
4555
 
4427
- var _a = __read(React__default['default'].useState(false), 2),
4556
+ var _a = __read(React__default["default"].useState(false), 2),
4428
4557
  isTafDialogOpen = _a[0],
4429
4558
  setTafDialogOpen = _a[1];
4430
4559
 
4431
- var _b = __read(React__default['default'].useState(null), 2),
4560
+ var _b = __read(React__default["default"].useState(null), 2),
4432
4561
  selectedTafId = _b[0],
4433
4562
  setselectedTafId = _b[1];
4434
4563
 
4435
- var _c = __read(React__default['default'].useState(null), 2),
4564
+ var _c = __read(React__default["default"].useState(null), 2),
4436
4565
  tafDialogAction = _c[0],
4437
4566
  setTafDialogAction = _c[1];
4438
4567
 
4439
- var _d = __read(React__default['default'].useState(false), 2),
4568
+ var _d = __read(React__default["default"].useState(false), 2),
4440
4569
  errorPostMessage = _d[0],
4441
4570
  setErrorPostMessage = _d[1];
4442
4571
 
4443
- var _e = __read(React__default['default'].useState(''), 2),
4572
+ var _e = __read(React__default["default"].useState(''), 2),
4444
4573
  errorPostMessageText = _e[0],
4445
4574
  setErrorPostMessageText = _e[1];
4446
4575
 
4447
- var _f = __read(React__default['default'].useState(false), 2),
4576
+ var _f = __read(React__default["default"].useState(false), 2),
4448
4577
  showSpinner = _f[0],
4449
4578
  setSpinner = _f[1]; // clear error message for cancel after 10 seconds
4450
4579
 
@@ -4475,7 +4604,7 @@
4475
4604
  setTafDialogOpen(!isTafDialogOpen);
4476
4605
  };
4477
4606
 
4478
- React__default['default'].useEffect(function () {
4607
+ React__default["default"].useEffect(function () {
4479
4608
  if (selectedTafId) {
4480
4609
  toggleTafDialog();
4481
4610
  } // eslint-disable-next-line react-hooks/exhaustive-deps
@@ -4617,28 +4746,28 @@
4617
4746
  };
4618
4747
 
4619
4748
  var selectedTaf = getSelectedTaf(selectedTafId, tafList);
4620
- return /*#__PURE__*/React__default['default'].createElement(React__default['default'].Fragment, null, /*#__PURE__*/React__default['default'].createElement(TafList, {
4749
+ return /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, /*#__PURE__*/React__default["default"].createElement(TafList, {
4621
4750
  tafList: tafList,
4622
4751
  isLoading: isLoadingList,
4623
4752
  error: errorList,
4624
4753
  onClickTafActionButton: onClickTafActionButton,
4625
4754
  errorCancelTaf: errorCancelTaf
4626
- }), showSpinner && /*#__PURE__*/React__default['default'].createElement(Spinner, null), selectedTaf !== undefined && /*#__PURE__*/React__default['default'].createElement(TafFormDialog, {
4755
+ }), showSpinner && /*#__PURE__*/React__default["default"].createElement(Spinner, null), selectedTaf !== undefined && /*#__PURE__*/React__default["default"].createElement(TafFormDialog, {
4627
4756
  open: isTafDialogOpen,
4628
4757
  toggleFormDialog: toggleTafDialog,
4629
4758
  tafFromBackend: selectedTaf,
4630
- alertBanner: errorPostMessage ? /*#__PURE__*/React__default['default'].createElement(shared.AlertBanner, {
4759
+ alertBanner: errorPostMessage ? /*#__PURE__*/React__default["default"].createElement(shared.AlertBanner, {
4631
4760
  severity: "error",
4632
4761
  title: "An error has occurred while saving, please try again",
4633
4762
  info: errorPostMessageText
4634
4763
  }) : null,
4635
4764
  onFormAction: onFormAction
4636
- }, /*#__PURE__*/React__default['default'].createElement(TafFormWrapper, {
4765
+ }, /*#__PURE__*/React__default["default"].createElement(TafFormWrapper, {
4637
4766
  mode: "edit",
4638
4767
  tafFromBackend: selectedTaf,
4639
4768
  tafAction: tafDialogAction,
4640
4769
  onFormAction: onFormAction
4641
- }), showSpinner && /*#__PURE__*/React__default['default'].createElement(Spinner, null)));
4770
+ }), showSpinner && /*#__PURE__*/React__default["default"].createElement(Spinner, null)));
4642
4771
  };
4643
4772
  /**
4644
4773
  * Shows the list of Tafs and allows to create, edit and view Tafs.
@@ -4650,11 +4779,11 @@
4650
4779
 
4651
4780
 
4652
4781
  var ConfirmationWrapper = function ConfirmationWrapper() {
4653
- return /*#__PURE__*/React__default['default'].createElement(shared.ConfirmationServiceProvider, null, /*#__PURE__*/React__default['default'].createElement(TafWrapper, null));
4782
+ return /*#__PURE__*/React__default["default"].createElement(shared.ConfirmationServiceProvider, null, /*#__PURE__*/React__default["default"].createElement(TafWrapper, null));
4654
4783
  };
4655
4784
 
4656
- var createApi = function createApi(url, appUrl, auth, setAuth, authTokenUrl) {
4657
- var axiosInstance = api.createApiInstance(url, appUrl, auth, setAuth, authTokenUrl);
4785
+ var createApi = function createApi(url, appUrl, auth, setAuth, authTokenUrl, authClientId) {
4786
+ var axiosInstance = api.createApiInstance(url, appUrl, auth, setAuth, authTokenUrl, authClientId);
4658
4787
  return {
4659
4788
  // api data
4660
4789
  getTafList: function getTafList() {
@@ -4680,4 +4809,4 @@
4680
4809
 
4681
4810
  Object.defineProperty(exports, '__esModule', { value: true });
4682
4811
 
4683
- })));
4812
+ }));