@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.umd.js CHANGED
@@ -1,8 +1,8 @@
1
1
  (function (global, factory) {
2
- typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('react'), require('@mui/material'), require('react-hook-form'), require('react-redux'), require('react-sortablejs'), require('sortablejs'), require('lodash'), require('@opengeoweb/authentication'), require('@opengeoweb/form-fields'), require('@opengeoweb/shared'), require('@opengeoweb/core'), require('moment'), require('@opengeoweb/theme'), require('react-dom'), require('@opengeoweb/api'), require('@mui/material/LinearProgress'), require('@mui/material/Box')) :
3
- typeof define === 'function' && define.amd ? define(['exports', 'react', '@mui/material', 'react-hook-form', 'react-redux', 'react-sortablejs', 'sortablejs', 'lodash', '@opengeoweb/authentication', '@opengeoweb/form-fields', '@opengeoweb/shared', '@opengeoweb/core', 'moment', '@opengeoweb/theme', 'react-dom', '@opengeoweb/api', '@mui/material/LinearProgress', '@mui/material/Box'], factory) :
4
- (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.Taf = {}, global.React, global.material, global.reactHookForm, global.reactRedux, global.reactSortablejs, global.Sortable, global.lodash, global.authentication, global.formFields, global.shared, global.core, global.moment, global.theme, global.ReactDOM, global.api, global.LinearProgress, global.Box));
5
- })(this, (function (exports, React, material, reactHookForm, reactRedux, reactSortablejs, Sortable, lodash, authentication, formFields, shared, core, moment, theme, ReactDOM, api, LinearProgress, Box) { 'use strict';
2
+ typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('react'), require('@mui/material'), require('react-hook-form'), require('react-redux'), require('react-sortablejs'), require('sortablejs'), require('@opengeoweb/authentication'), require('@opengeoweb/form-fields'), require('@opengeoweb/shared'), require('@opengeoweb/core'), require('moment'), require('lodash'), require('@opengeoweb/theme'), require('react-dom'), require('@opengeoweb/api'), require('@mui/material/LinearProgress'), require('@mui/material/Box')) :
3
+ typeof define === 'function' && define.amd ? define(['exports', 'react', '@mui/material', 'react-hook-form', 'react-redux', 'react-sortablejs', 'sortablejs', '@opengeoweb/authentication', '@opengeoweb/form-fields', '@opengeoweb/shared', '@opengeoweb/core', 'moment', 'lodash', '@opengeoweb/theme', 'react-dom', '@opengeoweb/api', '@mui/material/LinearProgress', '@mui/material/Box'], factory) :
4
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.Taf = {}, global.React, global.material, global.reactHookForm, global.reactRedux, global.reactSortablejs, global.Sortable, global.authentication, global.formFields, global.shared, global.core, global.moment, global.lodash, global.theme, global.ReactDOM, global.api, global.LinearProgress, global.Box));
5
+ })(this, (function (exports, React, material, reactHookForm, reactRedux, reactSortablejs, Sortable, authentication, formFields, shared, core, moment, lodash, theme, ReactDOM, api, LinearProgress, Box) { 'use strict';
6
6
 
7
7
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
8
8
 
@@ -235,7 +235,7 @@
235
235
  var invalidValidityStartTimeMessage = 'Invalid validity start time, change group validity must lie within the TAF validity period';
236
236
  var invalidValidityPeriodMessage = 'Invalid validity period, validity end time has to be after validity start time';
237
237
  var invalidValidityEndTimeMessage = 'Invalid validity end time, change group validity must lie within the TAF validity period';
238
- var invalidChangeValidInterFieldMessage = 'Invalid validity period, expected DDHH/DDHH for BECMG and TEMPO or DDHHmm for FM';
238
+ var invalidChangeValidInterFieldMessage = 'Invalid validity period, expected DDHH/DDHH for PROB, BECMG and TEMPO or DDHHmm for FM';
239
239
  var invalidBECMGDurationValidInterFieldMessage = 'Invalid validity period, for BECMG only validity periods with a duration of 1, 2, 3 or 4 hours are allowed';
240
240
  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
241
241
  // Ensure all individual sections are correct (DD HH mm etc)
@@ -321,16 +321,29 @@
321
321
 
322
322
  return true;
323
323
  };
324
- var validateValidChangeGroupInterField = function validateValidChangeGroupInterField(value, valueChange, tafStart, tafEnd) {
324
+ var validateValidChangeGroupInterField = function validateValidChangeGroupInterField(value, valueChange, valueProb, tafStart, tafEnd) {
325
325
  var trimmedValue = value.trim();
326
326
  var trimmedValueChange = valueChange.trim();
327
+ var trimmedValueProb = valueProb.trim();
327
328
 
328
329
  if (!trimmedValue.length) {
329
330
  return true;
330
- } // Ensure format for FM changegroups is correct DDHHmm
331
+ }
332
+
333
+ if (!trimmedValueChange.length && !trimmedValueProb.length) {
334
+ return true;
335
+ }
331
336
 
337
+ if (!trimmedValueChange.length && trimmedValueProb.length) {
338
+ if ( // Ensure format for probability without change is correct DDHH/DDHH
339
+ trimmedValue.length < 9) {
340
+ return invalidChangeValidInterFieldMessage;
341
+ }
342
+ }
332
343
 
333
- if (trimmedValue.length > 6 && trimmedValueChange === 'FM' || trimmedValue.length < 9 && trimmedValueChange !== 'FM') {
344
+ if ( // Ensure format for FM changegroups is correct DDHHmm
345
+ trimmedValue.length > 6 && trimmedValueChange === 'FM' || // Ensure format for BECMG and TEMPO changegroups is correct DDHH/DDHH
346
+ trimmedValue.length < 9 && trimmedValueChange !== 'FM') {
334
347
  return invalidChangeValidInterFieldMessage;
335
348
  } // Ensure BECMG changegroup has duration of 1,2,3,4 hours
336
349
 
@@ -2361,7 +2374,7 @@
2361
2374
  }, []);
2362
2375
  return [TAC, retrieveTAC, onSetTac];
2363
2376
  };
2364
- var useDragOrder = function useDragOrder(trigger, move, onFormBlur) {
2377
+ var useDragOrder = function useDragOrder(trigger, move) {
2365
2378
  var _a = __read(React__default["default"].useState(null), 2),
2366
2379
  activeDraggingIndex = _a[0],
2367
2380
  setIsDragging = _a[1];
@@ -2394,18 +2407,7 @@
2394
2407
  // trigger validation of all fields
2395
2408
  trigger();
2396
2409
  }
2397
- }, [lastDragOrder, trigger]); // trigger onFormBlur AFTER render of new sorted elements so the TAC gets updated
2398
-
2399
- React__default["default"].useEffect(function () {
2400
- var _a = __read(lastDragOrder, 2),
2401
- oldIndex = _a[0],
2402
- newIndex = _a[1];
2403
-
2404
- if (oldIndex !== null && newIndex !== null) {
2405
- onFormBlur();
2406
- } // eslint-disable-next-line react-hooks/exhaustive-deps
2407
-
2408
- }, [lastDragOrder]);
2410
+ }, [lastDragOrder, trigger]);
2409
2411
  return {
2410
2412
  onChangeOrder: onChangeOrder,
2411
2413
  activeDraggingIndex: activeDraggingIndex,
@@ -2474,18 +2476,18 @@
2474
2476
  wind: '',
2475
2477
  visibility: '',
2476
2478
  weather: {
2477
- weather1: null,
2478
- weather2: null,
2479
- weather3: null
2479
+ weather1: '',
2480
+ weather2: '',
2481
+ weather3: ''
2480
2482
  },
2481
2483
  cloud: {
2482
- cloud1: null,
2483
- cloud2: null,
2484
- cloud3: null,
2485
- cloud4: null
2484
+ cloud1: '',
2485
+ cloud2: '',
2486
+ cloud3: '',
2487
+ cloud4: ''
2486
2488
  },
2487
- change: null,
2488
- probability: null
2489
+ change: '',
2490
+ probability: ''
2489
2491
  };
2490
2492
  var getTafStatusLabel = function getTafStatusLabel(status) {
2491
2493
  switch (status) {
@@ -2541,7 +2543,17 @@
2541
2543
  previousValidDateEnd: previousValidDateEnd
2542
2544
  });
2543
2545
  };
2546
+ var createChangeGroup = function createChangeGroup(changeGroup) {
2547
+ return __assign(__assign(__assign({}, emptyChangegroup), changeGroup), {
2548
+ weather: __assign(__assign({}, emptyChangegroup.weather), changeGroup.weather),
2549
+ cloud: __assign(__assign({}, emptyChangegroup.cloud), changeGroup.cloud)
2550
+ });
2551
+ };
2544
2552
  var prepareTafValues = function prepareTafValues(_taf, tafAction, addEmptyChangeGroup) {
2553
+ var _a;
2554
+
2555
+ var _b;
2556
+
2545
2557
  if (addEmptyChangeGroup === void 0) {
2546
2558
  addEmptyChangeGroup = false;
2547
2559
  } // If action is AMEND/CORRECT/DRAFT_AMEND/DRAFT_CORRECTION - add previous valid start and end
@@ -2556,14 +2568,16 @@
2556
2568
  cloud: __assign(__assign({}, emptyBaseForecast.cloud), formattedBaseForecast.cloud)
2557
2569
  });
2558
2570
 
2559
- return __assign(__assign(__assign(__assign({}, taf), {
2571
+ var formattedChangeGroups = ((_b = taf.changeGroups) === null || _b === void 0 ? void 0 : _b.map(formatFormValues)) || [];
2572
+ var changeGroups = formattedChangeGroups.map(createChangeGroup);
2573
+ return __assign(__assign(__assign(__assign(__assign({}, taf), {
2560
2574
  messageType: getMessageType(taf, tafAction),
2561
2575
  baseForecast: baseForecast
2562
- }), taf.changeGroups && {
2563
- changeGroups: taf.changeGroups.map(formatFormValues)
2576
+ }), changeGroups.length && {
2577
+ changeGroups: changeGroups
2564
2578
  }), addEmptyChangeGroup && {
2565
2579
  changeGroups: [emptyChangegroup]
2566
- });
2580
+ }), (_a = {}, _a[shared.HIDDEN_INPUT_HELPER_IS_DRAFT] = true, _a));
2567
2581
  };
2568
2582
  var getIsFormDefaultDisabled = function getIsFormDefaultDisabled(status) {
2569
2583
  return !(status === 'NEW' || status === 'DRAFT' || status === 'DRAFT_AMENDED' || status === 'DRAFT_CORRECTED');
@@ -2912,7 +2926,8 @@
2912
2926
  };
2913
2927
 
2914
2928
  var TafFormRow = /*#__PURE__*/React__default["default"].forwardRef(function (_a, ref) {
2915
- var _b = _a.isChangeGroup,
2929
+ var isNotRequiredForAction = _a.isNotRequiredForAction,
2930
+ _b = _a.isChangeGroup,
2916
2931
  isChangeGroup = _b === void 0 ? false : _b,
2917
2932
  _c = _a.disabled,
2918
2933
  disabled = _c === void 0 ? false : _c,
@@ -2926,16 +2941,15 @@
2926
2941
  onAddChangeGroupBelow = _a.onAddChangeGroupBelow,
2927
2942
  onAddChangeGroupAbove = _a.onAddChangeGroupAbove,
2928
2943
  onClearRow = _a.onClearRow,
2929
- props = __rest(_a, ["isChangeGroup", "disabled", "index", "onRemoveChangeGroup", "field", "dragHandle", "onAddChangeGroupBelow", "onAddChangeGroupAbove", "onClearRow"]);
2944
+ props = __rest(_a, ["isNotRequiredForAction", "isChangeGroup", "disabled", "index", "onRemoveChangeGroup", "field", "dragHandle", "onAddChangeGroupBelow", "onAddChangeGroupAbove", "onClearRow"]);
2930
2945
 
2931
2946
  var namePrefix = !isChangeGroup ? 'baseForecast' : "changeGroups[" + index + "]";
2932
2947
  var fieldNames = getFieldNames(isChangeGroup, index);
2933
2948
 
2934
2949
  var _g = reactHookForm.useFormContext(),
2935
2950
  getValues = _g.getValues,
2936
- trigger = _g.trigger;
2951
+ trigger = _g.trigger; // cross-field required validation
2937
2952
 
2938
- var isNotRequiredForAction = shared.useDraftFormHelpers(true).isRequired; // cross-field required validation
2939
2953
 
2940
2954
  var _h = __read(getRequiredCrossFields(fieldNames), 3),
2941
2955
  mainFields = _h[0],
@@ -3156,7 +3170,7 @@
3156
3170
  return isChangeGroup ? validateValidField(value, getValues('validDateStart'), getValues('validDateEnd')) : true;
3157
3171
  },
3158
3172
  validateValidChangeGroupInterField: function validateValidChangeGroupInterField$1(value) {
3159
- return isChangeGroup ? validateValidChangeGroupInterField(value, getValues(fieldNames.change), getValues('validDateStart'), getValues('validDateEnd')) : true;
3173
+ return isChangeGroup ? validateValidChangeGroupInterField(value, getValues(fieldNames.change), getValues(fieldNames.probability), getValues('validDateStart'), getValues('validDateEnd')) : true;
3160
3174
  },
3161
3175
  validatePreviousRow: validatePreviousRow,
3162
3176
  validateNextRows: validateNextRows
@@ -3818,20 +3832,34 @@
3818
3832
  }))), rootElement);
3819
3833
  };
3820
3834
 
3835
+ /* *
3836
+ * Licensed under the Apache License, Version 2.0 (the "License");
3837
+ * you may not use this file except in compliance with the License.
3838
+ * You may obtain a copy of the License at
3839
+ *
3840
+ * http://www.apache.org/licenses/LICENSE-2.0
3841
+ *
3842
+ * Unless required by applicable law or agreed to in writing, software
3843
+ * distributed under the License is distributed on an "AS IS" BASIS,
3844
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
3845
+ * See the License for the specific language governing permissions and
3846
+ * limitations under the License.
3847
+ *
3848
+ * Copyright 2022 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
3849
+ * Copyright 2022 - Finnish Meteorological Institute (FMI)
3850
+ * */
3821
3851
  var TafModuleContext = /*#__PURE__*/React__namespace.createContext({
3822
3852
  onValidateForm: null,
3823
3853
  registerValidateForm: null,
3824
3854
  tafAction: null,
3825
3855
  setTafAction: null,
3826
- isFormDirty: null,
3827
- setIsFormDirty: null
3856
+ onPreventCloseView: null
3828
3857
  });
3829
3858
  var useTafModuleContext = function useTafModuleContext() {
3830
3859
  return React__namespace.useContext(TafModuleContext);
3831
3860
  };
3832
3861
  var useTafModuleState = function useTafModuleState(_a) {
3833
3862
  var onPreventCloseView = _a.onPreventCloseView;
3834
- var api$1 = api.useApiContext().api;
3835
3863
 
3836
3864
  var _b = __read(React__namespace.useState(function () {
3837
3865
  return new Promise(function () {
@@ -3845,38 +3873,18 @@
3845
3873
  tafAction = _c[0],
3846
3874
  setTafAction = _c[1];
3847
3875
 
3848
- var _d = __read(React__namespace.useState(false), 2),
3849
- isFormDirty = _d[0],
3850
- setIsFormDirty = _d[1];
3851
-
3852
- var _e = __read(useTACGenerator(undefined, api$1.getTAC), 3),
3853
- TAC = _e[0],
3854
- updateTAC = _e[1],
3855
- setTAC = _e[2];
3856
-
3857
3876
  var onRegisterValidateForm = function onRegisterValidateForm(promiseToRegister) {
3858
3877
  registerValidateForm(function () {
3859
3878
  return promiseToRegister;
3860
3879
  });
3861
3880
  };
3862
3881
 
3863
- var onChangeFormDirty = function onChangeFormDirty(isDirty) {
3864
- if (isDirty !== isFormDirty) {
3865
- setIsFormDirty(isDirty);
3866
- onPreventCloseView(isDirty);
3867
- }
3868
- };
3869
-
3870
3882
  return {
3871
3883
  onValidateForm: onValidateForm,
3872
3884
  registerValidateForm: onRegisterValidateForm,
3873
3885
  tafAction: tafAction,
3874
3886
  setTafAction: setTafAction,
3875
- TAC: TAC,
3876
- updateTAC: updateTAC,
3877
- setTAC: setTAC,
3878
- isFormDirty: isFormDirty,
3879
- setIsFormDirty: onChangeFormDirty
3887
+ onPreventCloseView: onPreventCloseView
3880
3888
  };
3881
3889
  };
3882
3890
  var TafModuleProvider = function TafModuleProvider(_a) {
@@ -3963,20 +3971,15 @@
3963
3971
  var isDefaultDisabled = getIsFormDefaultDisabled(originalTaf.status);
3964
3972
  var confirmDialog = shared.useConfirmationDialog();
3965
3973
 
3966
- var _j = shared.useDraftFormHelpers(true),
3974
+ var _j = shared.useDraftFormHelpers(),
3967
3975
  toggleIsDraft = _j.toggleIsDraft,
3968
- DraftFieldHelper = _j.DraftFieldHelper;
3976
+ isNotRequiredForAction = _j.isRequired;
3969
3977
 
3970
3978
  var _k = useTafModuleContext(),
3971
3979
  registerValidateForm = _k.registerValidateForm,
3972
3980
  tafAction = _k.tafAction,
3973
- setIsFormDirty = _k.setIsFormDirty,
3974
3981
  setTafAction = _k.setTafAction,
3975
- TAC = _k.TAC,
3976
- updateTAC = _k.updateTAC,
3977
- setTAC = _k.setTAC;
3978
-
3979
- var isMounted = shared.useIsMounted().isMounted;
3982
+ onPreventCloseView = _k.onPreventCloseView;
3980
3983
 
3981
3984
  var _l = reactHookForm.useFormContext(),
3982
3985
  control = _l.control,
@@ -3989,47 +3992,12 @@
3989
3992
 
3990
3993
  var isFormDirty = formState.isDirty,
3991
3994
  errors = formState.errors;
3992
- shared.usePreventBrowserClose(isFormDirty && !isDisabled);
3993
- var hiddenInputFields = ['baseTime', 'issueDate', 'uuid', 'validDateStart', 'validDateEnd', 'status', 'previousId', 'previousValidDateStart', 'previousValidDateEnd'];
3994
-
3995
- var _m = __read(React__default["default"].useState(getValues()), 2),
3996
- delayedFormValues = _m[0],
3997
- setDelayedFormValues = _m[1];
3998
-
3999
- var hasErrors = Object.keys(errors).length;
4000
-
4001
- var onFormBlur = function onFormBlur() {
4002
- if (!lodash.isEqual(getValues(), delayedFormValues)) {
4003
- setDelayedFormValues(getValues());
4004
- }
4005
- };
4006
-
4007
- var resetTAC = function resetTAC() {
4008
- if (originalTaf.status !== 'NEW') {
4009
- updateTAC(originalTaf);
4010
- } else {
4011
- setTAC(TAC_NOT_AVAILABLE);
4012
- }
4013
- };
4014
-
4015
- React__default["default"].useEffect(function () {
4016
- if (isMounted.current && isFormDirty) {
4017
- var newTAC = hasErrors ? null : convertTafValuesToObject(delayedFormValues);
4018
- updateTAC(newTAC);
4019
- } // eslint-disable-next-line react-hooks/exhaustive-deps
4020
-
4021
- }, [delayedFormValues]);
4022
- React__default["default"].useEffect(function () {
4023
- // prevent updating an error while typing
4024
- if (!hasErrors && isFormDirty && document.activeElement.tagName !== 'INPUT') {
4025
- updateTAC(convertTafValuesToObject(delayedFormValues));
4026
- } // eslint-disable-next-line react-hooks/exhaustive-deps
4027
-
4028
- }, [hasErrors]); // Needed to be able to show a confirmation dialog on switching tabs when form is edited and not saved
3995
+ shared.usePreventBrowserClose(isFormDirty && !isDisabled); // Needed to be able to show a confirmation dialog on closing parent view
4029
3996
 
4030
3997
  React__default["default"].useEffect(function () {
4031
- setIsFormDirty(isFormDirty);
4032
- }, [isFormDirty, setIsFormDirty]);
3998
+ onPreventCloseView(isFormDirty); // eslint-disable-next-line react-hooks/exhaustive-deps
3999
+ }, [isFormDirty]);
4000
+ var hiddenInputFields = ['baseTime', 'issueDate', 'uuid', 'validDateStart', 'validDateEnd', 'status', 'previousId', 'previousValidDateStart', 'previousValidDateEnd', shared.HIDDEN_INPUT_HELPER_IS_DRAFT];
4033
4001
 
4034
4002
  var onSubmit = function onSubmit(data) {
4035
4003
  // eslint-disable-next-line no-console
@@ -4046,22 +4014,22 @@
4046
4014
  });
4047
4015
  };
4048
4016
 
4049
- var resetFormValues = function resetFormValues(action, shouldAddEmptyChangGroup) {
4050
- if (action === void 0) {
4051
- action = undefined;
4052
- }
4053
-
4054
- var newTaf = prepareTafValues(originalTaf, action, shouldAddEmptyChangGroup);
4055
- reset(newTaf);
4017
+ var resetFormValues = function resetFormValues(formData) {
4018
+ return reset(formData);
4056
4019
  };
4057
4020
 
4058
- var resetForm = function resetForm(action, resetDisabled) {
4021
+ var resetFormState = function resetFormState(action, resetDisabled, tafToReset) {
4059
4022
  if (action === void 0) {
4060
4023
  action = undefined;
4061
4024
  }
4062
4025
 
4063
- var shouldAddEmptyChangGroup = !(originalTaf && originalTaf.changeGroups) && !resetDisabled;
4064
- resetFormValues(action, shouldAddEmptyChangGroup);
4026
+ if (tafToReset === void 0) {
4027
+ tafToReset = originalTaf;
4028
+ }
4029
+
4030
+ var shouldAddEmptyChangGroup = !(tafToReset && tafToReset.changeGroups) && !resetDisabled;
4031
+ var newTaf = prepareTafValues(tafToReset, action, shouldAddEmptyChangGroup);
4032
+ resetFormValues(newTaf);
4065
4033
  setIsDisabled(resetDisabled);
4066
4034
  setTafAction(action);
4067
4035
  };
@@ -4167,8 +4135,7 @@
4167
4135
  didSucceed = _a.sent();
4168
4136
 
4169
4137
  if (didSucceed) {
4170
- resetForm(undefined, isDefaultDisabled);
4171
- resetTAC();
4138
+ resetFormState(undefined, isDefaultDisabled);
4172
4139
  }
4173
4140
 
4174
4141
  return [2
@@ -4191,18 +4158,17 @@
4191
4158
  toggleIsDraft(true);
4192
4159
  handleSubmit(function (data) {
4193
4160
  onFormAction(action, convertTafValuesToObject(data));
4194
- reset(getValues());
4161
+ resetFormValues(getValues());
4195
4162
  })();
4196
4163
  break;
4197
4164
 
4198
4165
  case 'DISCARD':
4199
4166
  if (isFormDirty) {
4200
4167
  showConfirmDialog(action).then(function () {
4201
- resetForm(undefined, isDefaultDisabled);
4202
- resetTAC();
4168
+ resetFormState(undefined, isDefaultDisabled);
4203
4169
  });
4204
4170
  } else {
4205
- resetForm(undefined, isDefaultDisabled);
4171
+ resetFormState(undefined, isDefaultDisabled);
4206
4172
  }
4207
4173
 
4208
4174
  break;
@@ -4232,9 +4198,7 @@
4232
4198
  didSucceed = _a.sent();
4233
4199
 
4234
4200
  if (didSucceed) {
4235
- setIsDisabled(true);
4236
- reset(prepareTafValues(convertTafValuesToObject(data), action, false));
4237
- setTafAction(null);
4201
+ resetFormState(null, true, convertTafValuesToObject(data));
4238
4202
  }
4239
4203
 
4240
4204
  return [2
@@ -4277,24 +4241,24 @@
4277
4241
  break;
4278
4242
 
4279
4243
  default:
4280
- resetForm(action, false);
4244
+ resetFormState(action, false);
4281
4245
  break;
4282
4246
  }
4283
4247
  };
4284
4248
 
4285
- var _o = reactHookForm.useFieldArray({
4249
+ var _m = reactHookForm.useFieldArray({
4286
4250
  control: control,
4287
4251
  name: 'changeGroups'
4288
4252
  }),
4289
- fields = _o.fields,
4290
- insert = _o.insert,
4291
- remove = _o.remove,
4292
- move = _o.move;
4253
+ fields = _m.fields,
4254
+ insert = _m.insert,
4255
+ remove = _m.remove,
4256
+ move = _m.move;
4293
4257
 
4294
- var _p = useDragOrder(trigger, move, onFormBlur),
4295
- onChangeOrder = _p.onChangeOrder,
4296
- onStartDrag = _p.onStartDrag,
4297
- activeDraggingIndex = _p.activeDraggingIndex;
4258
+ var _o = useDragOrder(trigger, move),
4259
+ onChangeOrder = _o.onChangeOrder,
4260
+ onStartDrag = _o.onStartDrag,
4261
+ activeDraggingIndex = _o.activeDraggingIndex;
4298
4262
 
4299
4263
  var onRemoverow = function onRemoverow(index) {
4300
4264
  confirmDialog({
@@ -4304,8 +4268,6 @@
4304
4268
  }).then(function () {
4305
4269
  remove(index);
4306
4270
  trigger(); // trigger all fields validation
4307
-
4308
- onFormBlur();
4309
4271
  });
4310
4272
  }; // 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
4311
4273
 
@@ -4375,15 +4337,12 @@
4375
4337
  });
4376
4338
  };
4377
4339
 
4378
- var _q = __read(React__default["default"].useState(false), 2),
4379
- shouldValidate = _q[0],
4380
- setShouldValidate = _q[1];
4340
+ var _p = __read(React__default["default"].useState(false), 2),
4341
+ shouldValidate = _p[0],
4342
+ setShouldValidate = _p[1];
4381
4343
 
4382
4344
  React__default["default"].useEffect(function () {
4383
- setIsDisabled(!isEditor || isDefaultDisabled);
4384
- var defaultValues = prepareTafValues(originalTaf, undefined, !isDefaultDisabled && !originalTaf.changeGroups); // set initial form values
4385
-
4386
- reset(defaultValues); // set validate flag to validate after the values have been set
4345
+ setIsDisabled(!isEditor || isDefaultDisabled); // set validate flag to validate after the values have been set
4387
4346
 
4388
4347
  setShouldValidate(true); // register validate method to use in parent components
4389
4348
 
@@ -4405,17 +4364,14 @@
4405
4364
  registerValidateForm(onValidateFormPromise); // set default taf action
4406
4365
 
4407
4366
  setTafAction(fromStatusToAction(originalTaf.status));
4408
- resetTAC();
4409
4367
  return function () {
4410
- reset({});
4368
+ resetFormValues({});
4411
4369
  }; // eslint-disable-next-line react-hooks/exhaustive-deps
4412
4370
  }, []);
4413
4371
  React__default["default"].useEffect(function () {
4414
4372
  var newValues = prepareTafValues(originalTaf, undefined, !isDefaultDisabled && !originalTaf.changeGroups); // set new form values when taf values changed
4415
4373
 
4416
- reset(newValues); // reset TAC when taf values changed
4417
-
4418
- resetTAC(); // eslint-disable-next-line react-hooks/exhaustive-deps
4374
+ resetFormValues(newValues); // eslint-disable-next-line react-hooks/exhaustive-deps
4419
4375
  }, [originalTaf]);
4420
4376
  React__default["default"].useEffect(function () {
4421
4377
  // update disabled state when editor changed
@@ -4460,39 +4416,12 @@
4460
4416
  editor: editor
4461
4417
  }))), /*#__PURE__*/React__default["default"].createElement("form", {
4462
4418
  "data-testid": "taf-form",
4463
- onSubmit: handleSubmit(onSubmit),
4464
- onBlur: onFormBlur
4465
- }, /*#__PURE__*/React__default["default"].createElement(material.Typography, {
4466
- sx: {
4467
- fontSize: '20px',
4468
- fontWeight: 500,
4469
- height: '24px',
4470
- display: 'flex',
4471
- alignItems: 'center'
4472
- }
4473
- }, "TAC"), /*#__PURE__*/React__default["default"].createElement(material.Typography, {
4474
- sx: {
4475
- fontSize: '12px',
4476
- lineHeight: 1.67,
4477
- letterSpacing: '0.21px',
4478
- margin: '8px 0px'
4479
- },
4480
- "data-testid": "form-tac-message"
4481
- }, TAC.split('\n').map(function (line) {
4482
- return /*#__PURE__*/React__default["default"].createElement(material.Box, {
4483
- component: "span",
4484
- key: line,
4485
- "data-testid": "tafform-tac-message-line",
4486
- sx: {
4487
- textIndent: '-0.7em',
4488
- borderRadius: '3px',
4489
- paddingRight: '0.7em'
4490
- }
4491
- }, line);
4492
- })), /*#__PURE__*/React__default["default"].createElement(TafFormRow, {
4419
+ onSubmit: handleSubmit(onSubmit)
4420
+ }, /*#__PURE__*/React__default["default"].createElement(TafFormRow, {
4493
4421
  disabled: isDisabled,
4494
4422
  onAddChangeGroupBelow: onAddRow,
4495
- onClearRow: _onClearRow
4423
+ onClearRow: _onClearRow,
4424
+ isNotRequiredForAction: isNotRequiredForAction
4496
4425
  }), /*#__PURE__*/React__default["default"].createElement(reactSortablejs.ReactSortable, {
4497
4426
  tag: "div",
4498
4427
  list: fields,
@@ -4526,7 +4455,8 @@
4526
4455
  isDisabled: fields.length === 1 || isDisabled,
4527
4456
  isSorting: activeDraggingIndex === index,
4528
4457
  index: index
4529
- })
4458
+ }),
4459
+ isNotRequiredForAction: isNotRequiredForAction
4530
4460
  });
4531
4461
  })), !isDisabled && isEditor && /*#__PURE__*/React__default["default"].createElement(material.Grid, {
4532
4462
  container: true,
@@ -4553,7 +4483,7 @@
4553
4483
  name: field,
4554
4484
  key: field
4555
4485
  });
4556
- }), /*#__PURE__*/React__default["default"].createElement(DraftFieldHelper, null)));
4486
+ })));
4557
4487
  }, function (prevProps, nextProps) {
4558
4488
  // prevent re-render
4559
4489
  return !nextProps.isDisabled && prevProps.tafFromBackend !== nextProps.tafFromBackend && // if editor changed it should rerender
@@ -4997,7 +4927,6 @@
4997
4927
  trigger = _e.trigger,
4998
4928
  setValue = _e.setValue;
4999
4929
 
5000
- var updateTAC = useTafModuleContext().updateTAC;
5001
4930
  var showSnackbar = React__default["default"].useCallback(function (message) {
5002
4931
  dispatch(core.snackbarActions.openSnackbar({
5003
4932
  message: message
@@ -5016,7 +4945,6 @@
5016
4945
  setTimeout(function () {
5017
4946
  trigger(); // trigger all fields validation
5018
4947
  }, 0);
5019
- updateTAC(convertTafValuesToObject(newTaf));
5020
4948
  showSnackbar(getSnackbarMessage$1(location, locationLabel));
5021
4949
  };
5022
4950
 
@@ -5246,7 +5174,7 @@
5246
5174
  },
5247
5175
  position: 'absolute',
5248
5176
  right: '4px',
5249
- top: '82px'
5177
+ top: '42px'
5250
5178
  }
5251
5179
  }, /*#__PURE__*/React__namespace.createElement(theme.ListItem, null)), /*#__PURE__*/React__namespace.createElement(material.Dialog, {
5252
5180
  open: isOpen,
@@ -5288,6 +5216,7 @@
5288
5216
  location: 'EHAM'
5289
5217
  }
5290
5218
  } : _c;
5219
+ var isDirty = reactHookForm.useFormContext().formState.isDirty;
5291
5220
 
5292
5221
  if (!tafFromBackend) {
5293
5222
  return null;
@@ -5308,7 +5237,7 @@
5308
5237
  }];
5309
5238
 
5310
5239
  var onChangeTab = function onChangeTab(_event, newValue) {
5311
- onChangeTimeSlot(tabs[newValue].timeSlot);
5240
+ onChangeTimeSlot(tabs[newValue].timeSlot, isDirty);
5312
5241
  };
5313
5242
 
5314
5243
  return /*#__PURE__*/React__default["default"].createElement(material.Tabs, {
@@ -5353,6 +5282,7 @@
5353
5282
  _c = _a.onChangeTab,
5354
5283
  onChangeTab = _c === void 0 ? function () {} : _c,
5355
5284
  timeSlot = _a.timeSlot;
5285
+ var isDirty = reactHookForm.useFormContext().formState.isDirty;
5356
5286
  return /*#__PURE__*/React__namespace.createElement(material.MenuList, {
5357
5287
  "data-testid": "location-tabs",
5358
5288
  sx: {
@@ -5383,7 +5313,7 @@
5383
5313
  }
5384
5314
  },
5385
5315
  onClick: function onClick() {
5386
- return onChangeTab(index);
5316
+ return onChangeTab(index, isDirty);
5387
5317
  }
5388
5318
  }, editor && /*#__PURE__*/React__namespace.createElement(Box__default["default"], {
5389
5319
  sx: {
@@ -5861,8 +5791,7 @@
5861
5791
 
5862
5792
  var _g = useTafModuleContext(),
5863
5793
  onValidateForm = _g.onValidateForm,
5864
- tafAction = _g.tafAction,
5865
- isFormDirty = _g.isFormDirty;
5794
+ tafAction = _g.tafAction;
5866
5795
 
5867
5796
  var _h = __read(React__default["default"].useState(sortTafTimeSlots(tafList)), 2),
5868
5797
  _j = _h[0],
@@ -5981,7 +5910,7 @@
5981
5910
  });
5982
5911
  };
5983
5912
 
5984
- function onChangeTab(action, value) {
5913
+ function onChangeTab(action, value, isFormDirty) {
5985
5914
  return __awaiter(this, void 0, void 0, function () {
5986
5915
  var taf;
5987
5916
  return __generator(this, function (_a) {
@@ -6045,12 +5974,12 @@
6045
5974
  });
6046
5975
  }
6047
5976
 
6048
- var onChangeLocationTab = function onChangeLocationTab(index) {
6049
- onChangeTab(setActiveTafIndex, index);
5977
+ var onChangeLocationTab = function onChangeLocationTab(index, isFormDirty) {
5978
+ onChangeTab(setActiveTafIndex, index, isFormDirty);
6050
5979
  };
6051
5980
 
6052
- var onChangeTimeSlot = function onChangeTimeSlot(newTimeSlot) {
6053
- onChangeTab(changeTimeSlot, newTimeSlot);
5981
+ var onChangeTimeSlot = function onChangeTimeSlot(newTimeSlot, isFormDirty) {
5982
+ onChangeTab(changeTimeSlot, newTimeSlot, isFormDirty);
6054
5983
  };
6055
5984
 
6056
5985
  var changeTimeSlot = function changeTimeSlot(newTimeSlot) {
@@ -2,6 +2,7 @@
2
2
  import { GridProps } from '@mui/material';
3
3
  import { ArrayField } from 'react-hook-form';
4
4
  export interface TafFormRowProps extends GridProps {
5
+ isNotRequiredForAction: (value: string) => boolean | string;
5
6
  isChangeGroup?: boolean;
6
7
  disabled?: boolean;
7
8
  index?: number;