@opengeoweb/taf 4.6.0 → 4.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.esm.js CHANGED
@@ -5,12 +5,12 @@ import { useFormContext, Controller, useFieldArray } from 'react-hook-form';
5
5
  import { useDispatch } from 'react-redux';
6
6
  import { ReactSortable } from 'react-sortablejs';
7
7
  import Sortable from 'sortablejs';
8
- import { isEqual } from 'lodash';
9
8
  import { useAuthenticationContext } from '@opengeoweb/authentication';
10
9
  import { getDeepProperty, ReactHookFormHiddenInput, ReactHookFormProvider } from '@opengeoweb/form-fields';
11
- import { useIsMounted, ToggleMenu, useDraftFormHelpers, CustomTooltip, ToolContainerDraggable, Avatar, getInitials, useConfirmationDialog, usePreventBrowserClose, ToolButton, ToolHeader, AlertBanner, getErrorMessage as getErrorMessage$1, getWarningMessage, ConfirmationServiceProvider, usePoller, ErrorBoundary } from '@opengeoweb/shared';
10
+ import { HIDDEN_INPUT_HELPER_IS_DRAFT, useIsMounted, ToggleMenu, CustomTooltip, ToolContainerDraggable, Avatar, getInitials, useConfirmationDialog, useDraftFormHelpers, usePreventBrowserClose, ToolButton, ToolHeader, AlertBanner, getErrorMessage as getErrorMessage$1, getWarningMessage, ConfirmationServiceProvider, usePoller, ErrorBoundary } from '@opengeoweb/shared';
12
11
  import { snackbarActions } from '@opengeoweb/core';
13
12
  import moment from 'moment';
13
+ import { isEqual } from 'lodash';
14
14
  import { Add, Delete, Close, DragHandle as DragHandle$1, ThumbsUp, Clock, Cancel, Edit, Success, Export, ListItem, Cached } from '@opengeoweb/theme';
15
15
  import ReactDOM from 'react-dom';
16
16
  import { useApiContext, createApiInstance, createFakeApiInstance, ApiProvider } from '@opengeoweb/api';
@@ -241,7 +241,7 @@ var invalidValidityMinutesMessage = 'Invalid validity period, specified minutes
241
241
  var invalidValidityStartTimeMessage = 'Invalid validity start time, change group validity must lie within the TAF validity period';
242
242
  var invalidValidityPeriodMessage = 'Invalid validity period, validity end time has to be after validity start time';
243
243
  var invalidValidityEndTimeMessage = 'Invalid validity end time, change group validity must lie within the TAF validity period';
244
- var invalidChangeValidInterFieldMessage = 'Invalid validity period, expected DDHH/DDHH for BECMG and TEMPO or DDHHmm for FM';
244
+ var invalidChangeValidInterFieldMessage = 'Invalid validity period, expected DDHH/DDHH for PROB, BECMG and TEMPO or DDHHmm for FM';
245
245
  var invalidBECMGDurationValidInterFieldMessage = 'Invalid validity period, for BECMG only validity periods with a duration of 1, 2, 3 or 4 hours are allowed';
246
246
  var invalidChangeGroupOverlapsWithFM = 'The valid time of a change group cannot overlap with the valid time of a following FM group. This change group should end before or at the hour of the start of the FM group'; // Validations
247
247
  // Ensure all individual sections are correct (DD HH mm etc)
@@ -327,16 +327,29 @@ var validateValidField = function validateValidField(value, tafStart, tafEnd) {
327
327
 
328
328
  return true;
329
329
  };
330
- var validateValidChangeGroupInterField = function validateValidChangeGroupInterField(value, valueChange, tafStart, tafEnd) {
330
+ var validateValidChangeGroupInterField = function validateValidChangeGroupInterField(value, valueChange, valueProb, tafStart, tafEnd) {
331
331
  var trimmedValue = value.trim();
332
332
  var trimmedValueChange = valueChange.trim();
333
+ var trimmedValueProb = valueProb.trim();
333
334
 
334
335
  if (!trimmedValue.length) {
335
336
  return true;
336
- } // Ensure format for FM changegroups is correct DDHHmm
337
+ }
338
+
339
+ if (!trimmedValueChange.length && !trimmedValueProb.length) {
340
+ return true;
341
+ }
337
342
 
343
+ if (!trimmedValueChange.length && trimmedValueProb.length) {
344
+ if ( // Ensure format for probability without change is correct DDHH/DDHH
345
+ trimmedValue.length < 9) {
346
+ return invalidChangeValidInterFieldMessage;
347
+ }
348
+ }
338
349
 
339
- if (trimmedValue.length > 6 && trimmedValueChange === 'FM' || trimmedValue.length < 9 && trimmedValueChange !== 'FM') {
350
+ if ( // Ensure format for FM changegroups is correct DDHHmm
351
+ trimmedValue.length > 6 && trimmedValueChange === 'FM' || // Ensure format for BECMG and TEMPO changegroups is correct DDHH/DDHH
352
+ trimmedValue.length < 9 && trimmedValueChange !== 'FM') {
340
353
  return invalidChangeValidInterFieldMessage;
341
354
  } // Ensure BECMG changegroup has duration of 1,2,3,4 hours
342
355
 
@@ -2357,7 +2370,7 @@ var useTACGenerator = function useTACGenerator(taf, requestTAC) {
2357
2370
  }, []);
2358
2371
  return [TAC, retrieveTAC, onSetTac];
2359
2372
  };
2360
- var useDragOrder = function useDragOrder(trigger, move, onFormBlur) {
2373
+ var useDragOrder = function useDragOrder(trigger, move) {
2361
2374
  var _React$useState3 = React__default.useState(null),
2362
2375
  _React$useState4 = _slicedToArray(_React$useState3, 2),
2363
2376
  activeDraggingIndex = _React$useState4[0],
@@ -2392,18 +2405,7 @@ var useDragOrder = function useDragOrder(trigger, move, onFormBlur) {
2392
2405
  // trigger validation of all fields
2393
2406
  trigger();
2394
2407
  }
2395
- }, [lastDragOrder, trigger]); // trigger onFormBlur AFTER render of new sorted elements so the TAC gets updated
2396
-
2397
- React__default.useEffect(function () {
2398
- var _lastDragOrder2 = _slicedToArray(lastDragOrder, 2),
2399
- oldIndex = _lastDragOrder2[0],
2400
- newIndex = _lastDragOrder2[1];
2401
-
2402
- if (oldIndex !== null && newIndex !== null) {
2403
- onFormBlur();
2404
- } // eslint-disable-next-line react-hooks/exhaustive-deps
2405
-
2406
- }, [lastDragOrder]);
2408
+ }, [lastDragOrder, trigger]);
2407
2409
  return {
2408
2410
  onChangeOrder: onChangeOrder,
2409
2411
  activeDraggingIndex: activeDraggingIndex,
@@ -2472,18 +2474,18 @@ var emptyChangegroup = {
2472
2474
  wind: '',
2473
2475
  visibility: '',
2474
2476
  weather: {
2475
- weather1: null,
2476
- weather2: null,
2477
- weather3: null
2477
+ weather1: '',
2478
+ weather2: '',
2479
+ weather3: ''
2478
2480
  },
2479
2481
  cloud: {
2480
- cloud1: null,
2481
- cloud2: null,
2482
- cloud3: null,
2483
- cloud4: null
2482
+ cloud1: '',
2483
+ cloud2: '',
2484
+ cloud3: '',
2485
+ cloud4: ''
2484
2486
  },
2485
- change: null,
2486
- probability: null
2487
+ change: '',
2488
+ probability: ''
2487
2489
  };
2488
2490
  var getTafStatusLabel = function getTafStatusLabel(status) {
2489
2491
  switch (status) {
@@ -2539,24 +2541,35 @@ var getAmendedCorrectedTafTimes = function getAmendedCorrectedTafTimes(taf, tafA
2539
2541
  previousValidDateEnd: previousValidDateEnd
2540
2542
  });
2541
2543
  };
2544
+ var createChangeGroup = function createChangeGroup(changeGroup) {
2545
+ return Object.assign(Object.assign(Object.assign({}, emptyChangegroup), changeGroup), {
2546
+ weather: Object.assign(Object.assign({}, emptyChangegroup.weather), changeGroup.weather),
2547
+ cloud: Object.assign(Object.assign({}, emptyChangegroup.cloud), changeGroup.cloud)
2548
+ });
2549
+ };
2542
2550
  var prepareTafValues = function prepareTafValues(_taf, tafAction) {
2543
2551
  var addEmptyChangeGroup = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
2544
- // If action is AMEND/CORRECT/DRAFT_AMEND/DRAFT_CORRECTION - add previous valid start and end
2552
+
2553
+ var _a; // If action is AMEND/CORRECT/DRAFT_AMEND/DRAFT_CORRECTION - add previous valid start and end
2545
2554
  // If action is AMEND/DRAFT_AMEND - update validity start time to current time
2555
+
2556
+
2546
2557
  var taf = tafAction === 'AMEND' || tafAction === 'DRAFT_AMEND' || tafAction === 'CORRECT' || tafAction === 'DRAFT_CORRECT' ? getAmendedCorrectedTafTimes(_taf, tafAction) : _taf;
2547
2558
  var formattedBaseForecast = formatFormValues(taf.baseForecast);
2548
2559
  var baseForecast = Object.assign(Object.assign(Object.assign({}, emptyBaseForecast), formattedBaseForecast), {
2549
2560
  weather: Object.assign(Object.assign({}, emptyBaseForecast.weather), formattedBaseForecast.weather),
2550
2561
  cloud: Object.assign(Object.assign({}, emptyBaseForecast.cloud), formattedBaseForecast.cloud)
2551
2562
  });
2552
- return Object.assign(Object.assign(Object.assign(Object.assign({}, taf), {
2563
+ var formattedChangeGroups = ((_a = taf.changeGroups) === null || _a === void 0 ? void 0 : _a.map(formatFormValues)) || [];
2564
+ var changeGroups = formattedChangeGroups.map(createChangeGroup);
2565
+ return Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, taf), {
2553
2566
  messageType: getMessageType(taf, tafAction),
2554
2567
  baseForecast: baseForecast
2555
- }), taf.changeGroups && {
2556
- changeGroups: taf.changeGroups.map(formatFormValues)
2568
+ }), changeGroups.length && {
2569
+ changeGroups: changeGroups
2557
2570
  }), addEmptyChangeGroup && {
2558
2571
  changeGroups: [emptyChangegroup]
2559
- });
2572
+ }), _defineProperty({}, HIDDEN_INPUT_HELPER_IS_DRAFT, true));
2560
2573
  };
2561
2574
  var getIsFormDefaultDisabled = function getIsFormDefaultDisabled(status) {
2562
2575
  return !(status === 'NEW' || status === 'DRAFT' || status === 'DRAFT_AMENDED' || status === 'DRAFT_CORRECTED');
@@ -2906,7 +2919,8 @@ var getRequiredCrossFields = function getRequiredCrossFields(fieldNames) {
2906
2919
  };
2907
2920
 
2908
2921
  var TafFormRow = /*#__PURE__*/React__default.forwardRef(function (_a, ref) {
2909
- var _a$isChangeGroup = _a.isChangeGroup,
2922
+ var isNotRequiredForAction = _a.isNotRequiredForAction,
2923
+ _a$isChangeGroup = _a.isChangeGroup,
2910
2924
  isChangeGroup = _a$isChangeGroup === void 0 ? false : _a$isChangeGroup,
2911
2925
  _a$disabled = _a.disabled,
2912
2926
  disabled = _a$disabled === void 0 ? false : _a$disabled,
@@ -2920,17 +2934,14 @@ var TafFormRow = /*#__PURE__*/React__default.forwardRef(function (_a, ref) {
2920
2934
  onAddChangeGroupBelow = _a.onAddChangeGroupBelow,
2921
2935
  onAddChangeGroupAbove = _a.onAddChangeGroupAbove,
2922
2936
  onClearRow = _a.onClearRow,
2923
- props = __rest(_a, ["isChangeGroup", "disabled", "index", "onRemoveChangeGroup", "field", "dragHandle", "onAddChangeGroupBelow", "onAddChangeGroupAbove", "onClearRow"]);
2937
+ props = __rest(_a, ["isNotRequiredForAction", "isChangeGroup", "disabled", "index", "onRemoveChangeGroup", "field", "dragHandle", "onAddChangeGroupBelow", "onAddChangeGroupAbove", "onClearRow"]);
2924
2938
 
2925
2939
  var namePrefix = !isChangeGroup ? 'baseForecast' : "changeGroups[".concat(index, "]");
2926
2940
  var fieldNames = getFieldNames(isChangeGroup, index);
2927
2941
 
2928
2942
  var _useFormContext = useFormContext(),
2929
2943
  getValues = _useFormContext.getValues,
2930
- trigger = _useFormContext.trigger;
2931
-
2932
- var _useDraftFormHelpers = useDraftFormHelpers(true),
2933
- isNotRequiredForAction = _useDraftFormHelpers.isRequired; // cross-field required validation
2944
+ trigger = _useFormContext.trigger; // cross-field required validation
2934
2945
 
2935
2946
 
2936
2947
  var _getRequiredCrossFiel = getRequiredCrossFields(fieldNames),
@@ -3155,7 +3166,7 @@ var TafFormRow = /*#__PURE__*/React__default.forwardRef(function (_a, ref) {
3155
3166
  return isChangeGroup ? validateValidField(value, getValues('validDateStart'), getValues('validDateEnd')) : true;
3156
3167
  },
3157
3168
  validateValidChangeGroupInterField: function validateValidChangeGroupInterField$1(value) {
3158
- return isChangeGroup ? validateValidChangeGroupInterField(value, getValues(fieldNames.change), getValues('validDateStart'), getValues('validDateEnd')) : true;
3169
+ return isChangeGroup ? validateValidChangeGroupInterField(value, getValues(fieldNames.change), getValues(fieldNames.probability), getValues('validDateStart'), getValues('validDateEnd')) : true;
3159
3170
  },
3160
3171
  validatePreviousRow: validatePreviousRow,
3161
3172
  validateNextRows: validateNextRows
@@ -3819,8 +3830,7 @@ var TafModuleContext = /*#__PURE__*/React.createContext({
3819
3830
  registerValidateForm: null,
3820
3831
  tafAction: null,
3821
3832
  setTafAction: null,
3822
- isFormDirty: null,
3823
- setIsFormDirty: null
3833
+ onPreventCloseView: null
3824
3834
  });
3825
3835
  var useTafModuleContext = function useTafModuleContext() {
3826
3836
  return React.useContext(TafModuleContext);
@@ -3828,9 +3838,6 @@ var useTafModuleContext = function useTafModuleContext() {
3828
3838
  var useTafModuleState = function useTafModuleState(_ref) {
3829
3839
  var onPreventCloseView = _ref.onPreventCloseView;
3830
3840
 
3831
- var _useApiContext = useApiContext(),
3832
- api = _useApiContext.api;
3833
-
3834
3841
  var _React$useState = React.useState(function () {
3835
3842
  return new Promise(function () {
3836
3843
  return true;
@@ -3845,40 +3852,18 @@ var useTafModuleState = function useTafModuleState(_ref) {
3845
3852
  tafAction = _React$useState4[0],
3846
3853
  setTafAction = _React$useState4[1];
3847
3854
 
3848
- var _React$useState5 = React.useState(false),
3849
- _React$useState6 = _slicedToArray(_React$useState5, 2),
3850
- isFormDirty = _React$useState6[0],
3851
- setIsFormDirty = _React$useState6[1];
3852
-
3853
- var _useTACGenerator = useTACGenerator(undefined, api.getTAC),
3854
- _useTACGenerator2 = _slicedToArray(_useTACGenerator, 3),
3855
- TAC = _useTACGenerator2[0],
3856
- updateTAC = _useTACGenerator2[1],
3857
- setTAC = _useTACGenerator2[2];
3858
-
3859
3855
  var onRegisterValidateForm = function onRegisterValidateForm(promiseToRegister) {
3860
3856
  registerValidateForm(function () {
3861
3857
  return promiseToRegister;
3862
3858
  });
3863
3859
  };
3864
3860
 
3865
- var onChangeFormDirty = function onChangeFormDirty(isDirty) {
3866
- if (isDirty !== isFormDirty) {
3867
- setIsFormDirty(isDirty);
3868
- onPreventCloseView(isDirty);
3869
- }
3870
- };
3871
-
3872
3861
  return {
3873
3862
  onValidateForm: onValidateForm,
3874
3863
  registerValidateForm: onRegisterValidateForm,
3875
3864
  tafAction: tafAction,
3876
3865
  setTafAction: setTafAction,
3877
- TAC: TAC,
3878
- updateTAC: updateTAC,
3879
- setTAC: setTAC,
3880
- isFormDirty: isFormDirty,
3881
- setIsFormDirty: onChangeFormDirty
3866
+ onPreventCloseView: onPreventCloseView
3882
3867
  };
3883
3868
  };
3884
3869
  var TafModuleProvider = function TafModuleProvider(_ref2) {
@@ -3984,21 +3969,15 @@ var TafForm = /*#__PURE__*/React__default.memo(function (_ref) {
3984
3969
  var isDefaultDisabled = getIsFormDefaultDisabled(originalTaf.status);
3985
3970
  var confirmDialog = useConfirmationDialog();
3986
3971
 
3987
- var _useDraftFormHelpers = useDraftFormHelpers(true),
3972
+ var _useDraftFormHelpers = useDraftFormHelpers(),
3988
3973
  toggleIsDraft = _useDraftFormHelpers.toggleIsDraft,
3989
- DraftFieldHelper = _useDraftFormHelpers.DraftFieldHelper;
3974
+ isNotRequiredForAction = _useDraftFormHelpers.isRequired;
3990
3975
 
3991
3976
  var _useTafModuleContext = useTafModuleContext(),
3992
3977
  registerValidateForm = _useTafModuleContext.registerValidateForm,
3993
3978
  tafAction = _useTafModuleContext.tafAction,
3994
- setIsFormDirty = _useTafModuleContext.setIsFormDirty,
3995
3979
  setTafAction = _useTafModuleContext.setTafAction,
3996
- TAC = _useTafModuleContext.TAC,
3997
- updateTAC = _useTafModuleContext.updateTAC,
3998
- setTAC = _useTafModuleContext.setTAC;
3999
-
4000
- var _useIsMounted = useIsMounted(),
4001
- isMounted = _useIsMounted.isMounted;
3980
+ onPreventCloseView = _useTafModuleContext.onPreventCloseView;
4002
3981
 
4003
3982
  var _useFormContext = useFormContext(),
4004
3983
  control = _useFormContext.control,
@@ -4011,48 +3990,12 @@ var TafForm = /*#__PURE__*/React__default.memo(function (_ref) {
4011
3990
 
4012
3991
  var isFormDirty = formState.isDirty,
4013
3992
  errors = formState.errors;
4014
- usePreventBrowserClose(isFormDirty && !isDisabled);
4015
- var hiddenInputFields = ['baseTime', 'issueDate', 'uuid', 'validDateStart', 'validDateEnd', 'status', 'previousId', 'previousValidDateStart', 'previousValidDateEnd'];
4016
-
4017
- var _React$useState = React__default.useState(getValues()),
4018
- _React$useState2 = _slicedToArray(_React$useState, 2),
4019
- delayedFormValues = _React$useState2[0],
4020
- setDelayedFormValues = _React$useState2[1];
3993
+ usePreventBrowserClose(isFormDirty && !isDisabled); // Needed to be able to show a confirmation dialog on closing parent view
4021
3994
 
4022
- var hasErrors = Object.keys(errors).length;
4023
-
4024
- var onFormBlur = function onFormBlur() {
4025
- if (!isEqual(getValues(), delayedFormValues)) {
4026
- setDelayedFormValues(getValues());
4027
- }
4028
- };
4029
-
4030
- var resetTAC = function resetTAC() {
4031
- if (originalTaf.status !== 'NEW') {
4032
- updateTAC(originalTaf);
4033
- } else {
4034
- setTAC(TAC_NOT_AVAILABLE);
4035
- }
4036
- };
4037
-
4038
- React__default.useEffect(function () {
4039
- if (isMounted.current && isFormDirty) {
4040
- var newTAC = hasErrors ? null : convertTafValuesToObject(delayedFormValues);
4041
- updateTAC(newTAC);
4042
- } // eslint-disable-next-line react-hooks/exhaustive-deps
4043
-
4044
- }, [delayedFormValues]);
4045
3995
  React__default.useEffect(function () {
4046
- // prevent updating an error while typing
4047
- if (!hasErrors && isFormDirty && document.activeElement.tagName !== 'INPUT') {
4048
- updateTAC(convertTafValuesToObject(delayedFormValues));
4049
- } // eslint-disable-next-line react-hooks/exhaustive-deps
4050
-
4051
- }, [hasErrors]); // Needed to be able to show a confirmation dialog on switching tabs when form is edited and not saved
4052
-
4053
- React__default.useEffect(function () {
4054
- setIsFormDirty(isFormDirty);
4055
- }, [isFormDirty, setIsFormDirty]);
3996
+ onPreventCloseView(isFormDirty); // eslint-disable-next-line react-hooks/exhaustive-deps
3997
+ }, [isFormDirty]);
3998
+ var hiddenInputFields = ['baseTime', 'issueDate', 'uuid', 'validDateStart', 'validDateEnd', 'status', 'previousId', 'previousValidDateStart', 'previousValidDateEnd', HIDDEN_INPUT_HELPER_IS_DRAFT];
4056
3999
 
4057
4000
  var onSubmit = function onSubmit(data) {
4058
4001
  // eslint-disable-next-line no-console
@@ -4069,18 +4012,17 @@ var TafForm = /*#__PURE__*/React__default.memo(function (_ref) {
4069
4012
  });
4070
4013
  };
4071
4014
 
4072
- var resetFormValues = function resetFormValues() {
4073
- var action = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : undefined;
4074
- var shouldAddEmptyChangGroup = arguments.length > 1 ? arguments[1] : undefined;
4075
- var newTaf = prepareTafValues(originalTaf, action, shouldAddEmptyChangGroup);
4076
- reset(newTaf);
4015
+ var resetFormValues = function resetFormValues(formData) {
4016
+ return reset(formData);
4077
4017
  };
4078
4018
 
4079
- var resetForm = function resetForm() {
4019
+ var resetFormState = function resetFormState() {
4080
4020
  var action = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : undefined;
4081
4021
  var resetDisabled = arguments.length > 1 ? arguments[1] : undefined;
4082
- var shouldAddEmptyChangGroup = !(originalTaf && originalTaf.changeGroups) && !resetDisabled;
4083
- resetFormValues(action, shouldAddEmptyChangGroup);
4022
+ var tafToReset = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : originalTaf;
4023
+ var shouldAddEmptyChangGroup = !(tafToReset && tafToReset.changeGroups) && !resetDisabled;
4024
+ var newTaf = prepareTafValues(tafToReset, action, shouldAddEmptyChangGroup);
4025
+ resetFormValues(newTaf);
4084
4026
  setIsDisabled(resetDisabled);
4085
4027
  setTafAction(action);
4086
4028
  };
@@ -4188,8 +4130,7 @@ var TafForm = /*#__PURE__*/React__default.memo(function (_ref) {
4188
4130
  didSucceed = _context2.sent;
4189
4131
 
4190
4132
  if (didSucceed) {
4191
- resetForm(undefined, isDefaultDisabled);
4192
- resetTAC();
4133
+ resetFormState(undefined, isDefaultDisabled);
4193
4134
  }
4194
4135
 
4195
4136
  case 4:
@@ -4213,18 +4154,17 @@ var TafForm = /*#__PURE__*/React__default.memo(function (_ref) {
4213
4154
  toggleIsDraft(true);
4214
4155
  handleSubmit(function (data) {
4215
4156
  onFormAction(action, convertTafValuesToObject(data));
4216
- reset(getValues());
4157
+ resetFormValues(getValues());
4217
4158
  })();
4218
4159
  break;
4219
4160
 
4220
4161
  case 'DISCARD':
4221
4162
  if (isFormDirty) {
4222
4163
  showConfirmDialog(action).then(function () {
4223
- resetForm(undefined, isDefaultDisabled);
4224
- resetTAC();
4164
+ resetFormState(undefined, isDefaultDisabled);
4225
4165
  });
4226
4166
  } else {
4227
- resetForm(undefined, isDefaultDisabled);
4167
+ resetFormState(undefined, isDefaultDisabled);
4228
4168
  }
4229
4169
 
4230
4170
  break;
@@ -4251,9 +4191,7 @@ var TafForm = /*#__PURE__*/React__default.memo(function (_ref) {
4251
4191
  didSucceed = _context3.sent;
4252
4192
 
4253
4193
  if (didSucceed) {
4254
- setIsDisabled(true);
4255
- reset(prepareTafValues(convertTafValuesToObject(data), action, false));
4256
- setTafAction(null);
4194
+ resetFormState(null, true, convertTafValuesToObject(data));
4257
4195
  }
4258
4196
 
4259
4197
  case 6:
@@ -4295,7 +4233,7 @@ var TafForm = /*#__PURE__*/React__default.memo(function (_ref) {
4295
4233
  break;
4296
4234
 
4297
4235
  default:
4298
- resetForm(action, false);
4236
+ resetFormState(action, false);
4299
4237
  break;
4300
4238
  }
4301
4239
  };
@@ -4309,7 +4247,7 @@ var TafForm = /*#__PURE__*/React__default.memo(function (_ref) {
4309
4247
  remove = _useFieldArray.remove,
4310
4248
  move = _useFieldArray.move;
4311
4249
 
4312
- var _useDragOrder = useDragOrder(trigger, move, onFormBlur),
4250
+ var _useDragOrder = useDragOrder(trigger, move),
4313
4251
  onChangeOrder = _useDragOrder.onChangeOrder,
4314
4252
  onStartDrag = _useDragOrder.onStartDrag,
4315
4253
  activeDraggingIndex = _useDragOrder.activeDraggingIndex;
@@ -4322,8 +4260,6 @@ var TafForm = /*#__PURE__*/React__default.memo(function (_ref) {
4322
4260
  }).then(function () {
4323
4261
  remove(index);
4324
4262
  trigger(); // trigger all fields validation
4325
-
4326
- onFormBlur();
4327
4263
  });
4328
4264
  }; // 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
4329
4265
 
@@ -4381,16 +4317,13 @@ var TafForm = /*#__PURE__*/React__default.memo(function (_ref) {
4381
4317
  });
4382
4318
  };
4383
4319
 
4384
- var _React$useState3 = React__default.useState(false),
4385
- _React$useState4 = _slicedToArray(_React$useState3, 2),
4386
- shouldValidate = _React$useState4[0],
4387
- setShouldValidate = _React$useState4[1];
4320
+ var _React$useState = React__default.useState(false),
4321
+ _React$useState2 = _slicedToArray(_React$useState, 2),
4322
+ shouldValidate = _React$useState2[0],
4323
+ setShouldValidate = _React$useState2[1];
4388
4324
 
4389
4325
  React__default.useEffect(function () {
4390
- setIsDisabled(!isEditor || isDefaultDisabled);
4391
- var defaultValues = prepareTafValues(originalTaf, undefined, !isDefaultDisabled && !originalTaf.changeGroups); // set initial form values
4392
-
4393
- reset(defaultValues); // set validate flag to validate after the values have been set
4326
+ setIsDisabled(!isEditor || isDefaultDisabled); // set validate flag to validate after the values have been set
4394
4327
 
4395
4328
  setShouldValidate(true); // register validate method to use in parent components
4396
4329
 
@@ -4412,17 +4345,14 @@ var TafForm = /*#__PURE__*/React__default.memo(function (_ref) {
4412
4345
  registerValidateForm(onValidateFormPromise); // set default taf action
4413
4346
 
4414
4347
  setTafAction(fromStatusToAction(originalTaf.status));
4415
- resetTAC();
4416
4348
  return function () {
4417
- reset({});
4349
+ resetFormValues({});
4418
4350
  }; // eslint-disable-next-line react-hooks/exhaustive-deps
4419
4351
  }, []);
4420
4352
  React__default.useEffect(function () {
4421
4353
  var newValues = prepareTafValues(originalTaf, undefined, !isDefaultDisabled && !originalTaf.changeGroups); // set new form values when taf values changed
4422
4354
 
4423
- reset(newValues); // reset TAC when taf values changed
4424
-
4425
- resetTAC(); // eslint-disable-next-line react-hooks/exhaustive-deps
4355
+ resetFormValues(newValues); // eslint-disable-next-line react-hooks/exhaustive-deps
4426
4356
  }, [originalTaf]);
4427
4357
  React__default.useEffect(function () {
4428
4358
  // update disabled state when editor changed
@@ -4467,39 +4397,12 @@ var TafForm = /*#__PURE__*/React__default.memo(function (_ref) {
4467
4397
  editor: editor
4468
4398
  }))), /*#__PURE__*/React__default.createElement("form", {
4469
4399
  "data-testid": "taf-form",
4470
- onSubmit: handleSubmit(onSubmit),
4471
- onBlur: onFormBlur
4472
- }, /*#__PURE__*/React__default.createElement(Typography, {
4473
- sx: {
4474
- fontSize: '20px',
4475
- fontWeight: 500,
4476
- height: '24px',
4477
- display: 'flex',
4478
- alignItems: 'center'
4479
- }
4480
- }, "TAC"), /*#__PURE__*/React__default.createElement(Typography, {
4481
- sx: {
4482
- fontSize: '12px',
4483
- lineHeight: 1.67,
4484
- letterSpacing: '0.21px',
4485
- margin: '8px 0px'
4486
- },
4487
- "data-testid": "form-tac-message"
4488
- }, TAC.split('\n').map(function (line) {
4489
- return /*#__PURE__*/React__default.createElement(Box, {
4490
- component: "span",
4491
- key: line,
4492
- "data-testid": "tafform-tac-message-line",
4493
- sx: {
4494
- textIndent: '-0.7em',
4495
- borderRadius: '3px',
4496
- paddingRight: '0.7em'
4497
- }
4498
- }, line);
4499
- })), /*#__PURE__*/React__default.createElement(TafFormRow, {
4400
+ onSubmit: handleSubmit(onSubmit)
4401
+ }, /*#__PURE__*/React__default.createElement(TafFormRow, {
4500
4402
  disabled: isDisabled,
4501
4403
  onAddChangeGroupBelow: onAddRow,
4502
- onClearRow: _onClearRow
4404
+ onClearRow: _onClearRow,
4405
+ isNotRequiredForAction: isNotRequiredForAction
4503
4406
  }), /*#__PURE__*/React__default.createElement(ReactSortable, {
4504
4407
  tag: "div",
4505
4408
  list: fields,
@@ -4533,7 +4436,8 @@ var TafForm = /*#__PURE__*/React__default.memo(function (_ref) {
4533
4436
  isDisabled: fields.length === 1 || isDisabled,
4534
4437
  isSorting: activeDraggingIndex === index,
4535
4438
  index: index
4536
- })
4439
+ }),
4440
+ isNotRequiredForAction: isNotRequiredForAction
4537
4441
  });
4538
4442
  })), !isDisabled && isEditor && /*#__PURE__*/React__default.createElement(Grid, {
4539
4443
  container: true,
@@ -4560,7 +4464,7 @@ var TafForm = /*#__PURE__*/React__default.memo(function (_ref) {
4560
4464
  name: field,
4561
4465
  key: field
4562
4466
  });
4563
- }), /*#__PURE__*/React__default.createElement(DraftFieldHelper, null)));
4467
+ })));
4564
4468
  }, function (prevProps, nextProps) {
4565
4469
  // prevent re-render
4566
4470
  return !nextProps.isDisabled && prevProps.tafFromBackend !== nextProps.tafFromBackend && // if editor changed it should rerender
@@ -4997,9 +4901,6 @@ var TacContainer = function TacContainer(_ref) {
4997
4901
  trigger = _useFormContext.trigger,
4998
4902
  setValue = _useFormContext.setValue;
4999
4903
 
5000
- var _useTafModuleContext = useTafModuleContext(),
5001
- updateTAC = _useTafModuleContext.updateTAC;
5002
-
5003
4904
  var showSnackbar = React__default.useCallback(function (message) {
5004
4905
  dispatch(snackbarActions.openSnackbar({
5005
4906
  message: message
@@ -5018,7 +4919,6 @@ var TacContainer = function TacContainer(_ref) {
5018
4919
  setTimeout(function () {
5019
4920
  trigger(); // trigger all fields validation
5020
4921
  }, 0);
5021
- updateTAC(convertTafValuesToObject(newTaf));
5022
4922
  showSnackbar(getSnackbarMessage$1(location, locationLabel));
5023
4923
  };
5024
4924
 
@@ -5250,7 +5150,7 @@ var TacOverviewMobile = function TacOverviewMobile(_ref) {
5250
5150
  },
5251
5151
  position: 'absolute',
5252
5152
  right: '4px',
5253
- top: '82px'
5153
+ top: '42px'
5254
5154
  }
5255
5155
  }, /*#__PURE__*/React.createElement(ListItem, null)), /*#__PURE__*/React.createElement(Dialog, {
5256
5156
  open: isOpen,
@@ -5309,6 +5209,9 @@ var TopTabs = function TopTabs(_ref) {
5309
5209
  }
5310
5210
  } : _ref$tafFromBackend;
5311
5211
 
5212
+ var _useFormContext = useFormContext(),
5213
+ isDirty = _useFormContext.formState.isDirty;
5214
+
5312
5215
  if (!tafFromBackend) {
5313
5216
  return null;
5314
5217
  }
@@ -5328,7 +5231,7 @@ var TopTabs = function TopTabs(_ref) {
5328
5231
  }];
5329
5232
 
5330
5233
  var onChangeTab = function onChangeTab(_event, newValue) {
5331
- onChangeTimeSlot(tabs[newValue].timeSlot);
5234
+ onChangeTimeSlot(tabs[newValue].timeSlot, isDirty);
5332
5235
  };
5333
5236
 
5334
5237
  return /*#__PURE__*/React__default.createElement(Tabs, {
@@ -5373,6 +5276,10 @@ var LocationTabs = function LocationTabs(_ref) {
5373
5276
  _ref$onChangeTab = _ref.onChangeTab,
5374
5277
  onChangeTab = _ref$onChangeTab === void 0 ? function () {} : _ref$onChangeTab,
5375
5278
  timeSlot = _ref.timeSlot;
5279
+
5280
+ var _useFormContext = useFormContext(),
5281
+ isDirty = _useFormContext.formState.isDirty;
5282
+
5376
5283
  return /*#__PURE__*/React.createElement(MenuList, {
5377
5284
  "data-testid": "location-tabs",
5378
5285
  sx: {
@@ -5403,7 +5310,7 @@ var LocationTabs = function LocationTabs(_ref) {
5403
5310
  }
5404
5311
  },
5405
5312
  onClick: function onClick() {
5406
- return onChangeTab(index);
5313
+ return onChangeTab(index, isDirty);
5407
5314
  }
5408
5315
  }, editor && /*#__PURE__*/React.createElement(Box$1, {
5409
5316
  sx: {
@@ -5871,8 +5778,7 @@ var TafLayout = function TafLayout(_ref2) {
5871
5778
 
5872
5779
  var _useTafModuleContext = useTafModuleContext(),
5873
5780
  onValidateForm = _useTafModuleContext.onValidateForm,
5874
- tafAction = _useTafModuleContext.tafAction,
5875
- isFormDirty = _useTafModuleContext.isFormDirty;
5781
+ tafAction = _useTafModuleContext.tafAction;
5876
5782
 
5877
5783
  var _React$useState = React__default.useState(sortTafTimeSlots(tafList)),
5878
5784
  _React$useState2 = _slicedToArray(_React$useState, 2),
@@ -5985,7 +5891,7 @@ var TafLayout = function TafLayout(_ref2) {
5985
5891
  }));
5986
5892
  };
5987
5893
 
5988
- function onChangeTab(action, value) {
5894
+ function onChangeTab(action, value, isFormDirty) {
5989
5895
  return __awaiter(this, void 0, void 0, /*#__PURE__*/regeneratorRuntime.mark(function _callee3() {
5990
5896
  var taf;
5991
5897
  return regeneratorRuntime.wrap(function _callee3$(_context3) {
@@ -6039,12 +5945,12 @@ var TafLayout = function TafLayout(_ref2) {
6039
5945
  }));
6040
5946
  }
6041
5947
 
6042
- var onChangeLocationTab = function onChangeLocationTab(index) {
6043
- onChangeTab(setActiveTafIndex, index);
5948
+ var onChangeLocationTab = function onChangeLocationTab(index, isFormDirty) {
5949
+ onChangeTab(setActiveTafIndex, index, isFormDirty);
6044
5950
  };
6045
5951
 
6046
- var onChangeTimeSlot = function onChangeTimeSlot(newTimeSlot) {
6047
- onChangeTab(changeTimeSlot, newTimeSlot);
5952
+ var onChangeTimeSlot = function onChangeTimeSlot(newTimeSlot, isFormDirty) {
5953
+ onChangeTab(changeTimeSlot, newTimeSlot, isFormDirty);
6048
5954
  };
6049
5955
 
6050
5956
  var changeTimeSlot = function changeTimeSlot(newTimeSlot) {