@opengeoweb/taf 2.4.1 → 2.5.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
@@ -2298,6 +2298,10 @@
2298
2298
  var TAC_MISSING_DATA = 'Missing data: no TAC can be generated';
2299
2299
  var TAC_NOT_AVAILABLE = 'No TAC available';
2300
2300
  var TAC_RETRIEVING_DATA = 'Retrieving TAC';
2301
+ var TAC_FAILED = 'Failed to retrieve TAC';
2302
+ var tacHasError = function tacHasError(tac) {
2303
+ return tac === TAC_MISSING_DATA || tac === TAC_NOT_AVAILABLE || tac === TAC_RETRIEVING_DATA || tac === TAC_FAILED;
2304
+ };
2301
2305
  var useTACGenerator = function useTACGenerator(taf, requestTAC, standardTAC) {
2302
2306
  if (standardTAC === void 0) {
2303
2307
  standardTAC = '';
@@ -2308,8 +2312,7 @@
2308
2312
  setTAC = _a[1];
2309
2313
 
2310
2314
  var isMounted = shared.useIsMounted().isMounted;
2311
-
2312
- var retrieveTAC = function retrieveTAC(tafToPost) {
2315
+ var retrieveTAC = React__default["default"].useCallback(function (tafToPost) {
2313
2316
  if (shouldRetrieveTAC(tafToPost)) {
2314
2317
  requestTAC(tafToPost).then(function (result) {
2315
2318
  if (isMounted.current) {
@@ -2317,14 +2320,13 @@
2317
2320
  }
2318
2321
  })["catch"](function () {
2319
2322
  if (isMounted.current) {
2320
- setTAC('Failed to retrieve TAC');
2323
+ setTAC(TAC_FAILED);
2321
2324
  }
2322
2325
  });
2323
2326
  } else {
2324
2327
  setTAC(TAC_MISSING_DATA);
2325
2328
  }
2326
- };
2327
-
2329
+ }, [isMounted, requestTAC]);
2328
2330
  React__default["default"].useEffect(function () {
2329
2331
  if (taf.status !== 'NEW' && !standardTAC) {
2330
2332
  retrieveTAC(taf);
@@ -2485,6 +2487,10 @@
2485
2487
  return 'AMD';
2486
2488
  }
2487
2489
 
2490
+ if (tafAction === 'CANCEL') {
2491
+ return 'CNL';
2492
+ }
2493
+
2488
2494
  return taf.messageType;
2489
2495
  }; // For corrections and amendment we need to add the previousValidStart and End for the TAC converter
2490
2496
 
@@ -2531,6 +2537,36 @@
2531
2537
  changeGroups: [emptyChangegroup]
2532
2538
  });
2533
2539
  };
2540
+ var getIsFormDefaultDisabled = function getIsFormDefaultDisabled(status) {
2541
+ return !(status === 'NEW' || status === 'DRAFT' || status === 'DRAFT_AMENDED' || status === 'DRAFT_CORRECTED');
2542
+ };
2543
+ var fromStatusToAction = function fromStatusToAction(tafStatus) {
2544
+ switch (tafStatus) {
2545
+ case 'DRAFT':
2546
+ return 'DRAFT';
2547
+
2548
+ case 'DRAFT_AMENDED':
2549
+ return 'DRAFT_AMEND';
2550
+
2551
+ case 'DRAFT_CORRECTED':
2552
+ return 'DRAFT_CORRECT';
2553
+
2554
+ case 'PUBLISHED':
2555
+ return 'PUBLISH';
2556
+
2557
+ case 'AMENDED':
2558
+ return 'AMEND';
2559
+
2560
+ case 'CORRECTED':
2561
+ return 'CORRECT';
2562
+
2563
+ case 'CANCELLED':
2564
+ return 'CANCEL';
2565
+
2566
+ default:
2567
+ return 'NEW';
2568
+ }
2569
+ };
2534
2570
 
2535
2571
  var textFieldStyle = function textFieldStyle(theme) {
2536
2572
  return {
@@ -3309,6 +3345,36 @@
3309
3345
  * Copyright 2021 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
3310
3346
  * Copyright 2021 - Finnish Meteorological Institute (FMI)
3311
3347
  * */
3348
+ var tafActionToDraftAction = function tafActionToDraftAction(tafAction) {
3349
+ switch (tafAction) {
3350
+ case 'AMEND':
3351
+ case 'DRAFT_AMEND':
3352
+ return 'DRAFT_AMEND';
3353
+
3354
+ case 'CORRECT':
3355
+ case 'DRAFT_CORRECT':
3356
+ return 'DRAFT_CORRECT';
3357
+
3358
+ default:
3359
+ return 'DRAFT';
3360
+ }
3361
+ };
3362
+
3363
+ var tafActionToPublishAction = function tafActionToPublishAction(tafAction) {
3364
+ switch (tafAction) {
3365
+ case 'AMEND':
3366
+ case 'DRAFT_AMEND':
3367
+ return 'AMEND';
3368
+
3369
+ case 'CORRECT':
3370
+ case 'DRAFT_CORRECT':
3371
+ return 'CORRECT';
3372
+
3373
+ default:
3374
+ return 'PUBLISH';
3375
+ }
3376
+ };
3377
+
3312
3378
  var buttonsStyle = {
3313
3379
  button: {
3314
3380
  minWidth: {
@@ -3338,7 +3404,7 @@
3338
3404
  return onTafViewModeButtonPress('CANCEL');
3339
3405
  }
3340
3406
  }, "Cancel"), canBe.includes('CORRECTED') && /*#__PURE__*/React__default["default"].createElement(material.Button, {
3341
- "data-testid": "correctaf",
3407
+ "data-testid": "correcttaf",
3342
3408
  variant: "tertiary",
3343
3409
  onClick: function onClick() {
3344
3410
  return onTafViewModeButtonPress('CORRECT');
@@ -3392,21 +3458,7 @@
3392
3458
  if action DRAFT_AMEND - new status will be DRAFT_AMENDED
3393
3459
  if action DRAFT_CORRECT - new status will be DRAFT_CORRECTED
3394
3460
  */
3395
- switch (tafAction) {
3396
- case 'AMEND':
3397
- case 'DRAFT_AMEND':
3398
- onTafEditModeButtonPress('DRAFT_AMEND');
3399
- break;
3400
-
3401
- case 'CORRECT':
3402
- case 'DRAFT_CORRECT':
3403
- onTafEditModeButtonPress('DRAFT_CORRECT');
3404
- break;
3405
-
3406
- default:
3407
- onTafEditModeButtonPress('DRAFT');
3408
- break;
3409
- }
3461
+ onTafEditModeButtonPress(tafActionToDraftAction(tafAction));
3410
3462
  }
3411
3463
  }, "Save"), /*#__PURE__*/React__default["default"].createElement(material.Button, {
3412
3464
  "data-testid": "publishtaf",
@@ -3419,21 +3471,7 @@
3419
3471
  if action DRAFT_AMEND - new status will be AMENDED
3420
3472
  if action DRAFT_CORRECT - new status will be CORRECTED
3421
3473
  */
3422
- switch (tafAction) {
3423
- case 'AMEND':
3424
- case 'DRAFT_AMEND':
3425
- onTafEditModeButtonPress('AMEND');
3426
- break;
3427
-
3428
- case 'CORRECT':
3429
- case 'DRAFT_CORRECT':
3430
- onTafEditModeButtonPress('CORRECT');
3431
- break;
3432
-
3433
- default:
3434
- onTafEditModeButtonPress('PUBLISH');
3435
- break;
3436
- }
3474
+ onTafEditModeButtonPress(tafActionToPublishAction(tafAction));
3437
3475
  }
3438
3476
  }, "Publish"))), /*#__PURE__*/React__default["default"].createElement(material.Grid, {
3439
3477
  item: true,
@@ -3813,71 +3851,85 @@
3813
3851
  }))), rootElement);
3814
3852
  };
3815
3853
 
3816
- var fromStatusToAction = function fromStatusToAction(tafStatus) {
3817
- switch (tafStatus) {
3818
- case 'DRAFT':
3819
- return 'DRAFT';
3820
-
3821
- case 'DRAFT_AMENDED':
3822
- return 'DRAFT_AMEND';
3823
-
3824
- case 'DRAFT_CORRECTED':
3825
- return 'DRAFT_CORRECT';
3826
-
3827
- case 'PUBLISHED':
3828
- return 'PUBLISH';
3829
-
3830
- case 'AMENDED':
3831
- return 'AMEND';
3854
+ var TafModuleContext = /*#__PURE__*/React__namespace.createContext({
3855
+ onValidateForm: null,
3856
+ registerValidateForm: null,
3857
+ tafAction: null,
3858
+ setTafAction: null
3859
+ });
3860
+ var useTafModuleContext = function useTafModuleContext() {
3861
+ return React__namespace.useContext(TafModuleContext);
3862
+ };
3863
+ var useTafModuleState = function useTafModuleState() {
3864
+ var _a = __read(React__namespace.useState(function () {
3865
+ return new Promise(function () {
3866
+ return true;
3867
+ });
3868
+ }), 2),
3869
+ onValidateForm = _a[0],
3870
+ registerValidateForm = _a[1];
3832
3871
 
3833
- case 'CORRECTED':
3834
- return 'CORRECT';
3872
+ var _b = __read(React__namespace.useState(), 2),
3873
+ tafAction = _b[0],
3874
+ setTafAction = _b[1];
3835
3875
 
3836
- case 'CANCELLED':
3837
- return 'CANCEL';
3838
-
3839
- default:
3840
- return 'NEW';
3841
- }
3842
- }; // prevents default functionality
3876
+ var onRegisterValidateForm = function onRegisterValidateForm(promiseToRegister) {
3877
+ registerValidateForm(function () {
3878
+ return promiseToRegister;
3879
+ });
3880
+ };
3843
3881
 
3882
+ return {
3883
+ onValidateForm: onValidateForm,
3884
+ registerValidateForm: onRegisterValidateForm,
3885
+ tafAction: tafAction,
3886
+ setTafAction: setTafAction
3887
+ };
3888
+ };
3889
+ var TafModuleProvider = function TafModuleProvider(_a) {
3890
+ var children = _a.children;
3891
+ var contextState = useTafModuleState();
3892
+ return /*#__PURE__*/React__namespace.createElement(TafModuleContext.Provider, {
3893
+ value: contextState
3894
+ }, children);
3895
+ };
3844
3896
 
3845
3897
  var noop = function noop() {};
3846
3898
 
3847
3899
  var TafForm = function TafForm(_a) {
3848
- var _b = _a.isDisabled,
3849
- isDefaultDisabled = _b === void 0 ? false : _b,
3850
- tafFromBackend = _a.tafFromBackend,
3851
- _c = _a.onFormAction,
3852
- onFormAction = _c === void 0 ? function () {
3900
+ var tafFromBackend = _a.tafFromBackend,
3901
+ _b = _a.onFormAction,
3902
+ onFormAction = _b === void 0 ? function () {
3903
+ return null;
3904
+ } : _b,
3905
+ _c = _a.onFormDirty,
3906
+ onFormDirty = _c === void 0 ? function () {
3853
3907
  return null;
3854
3908
  } : _c,
3855
- _d = _a.onFormDirty,
3856
- onFormDirty = _d === void 0 ? function () {
3909
+ _d = _a.isIssuesPaneOpen,
3910
+ isIssuesPaneOpen = _d === void 0 ? false : _d,
3911
+ _e = _a.setIsIssuesPaneOpen,
3912
+ setIsIssuesPaneOpen = _e === void 0 ? function () {
3857
3913
  return null;
3858
- } : _d,
3859
- _e = _a.isIssuesPaneOpen,
3860
- isIssuesPaneOpen = _e === void 0 ? false : _e,
3861
- _f = _a.setIsIssuesPaneOpen,
3862
- setIsIssuesPaneOpen = _f === void 0 ? function () {
3914
+ } : _e,
3915
+ _f = _a.isDisabled,
3916
+ isDisabled = _f === void 0 ? false : _f,
3917
+ _g = _a.setIsDisabled,
3918
+ setIsDisabled = _g === void 0 ? function () {
3863
3919
  return null;
3864
- } : _f;
3920
+ } : _g;
3865
3921
  var originalTaf = tafFromBackend.taf;
3866
- var defaultTafAction = fromStatusToAction(originalTaf.status);
3867
-
3868
- var _g = __read(React__default["default"].useState(defaultTafAction), 2),
3869
- tafAction = _g[0],
3870
- setTafAction = _g[1];
3871
-
3872
- var _h = __read(React__default["default"].useState(isDefaultDisabled), 2),
3873
- isDisabled = _h[0],
3874
- setIsDisabled = _h[1];
3875
-
3922
+ var isDefaultDisabled = getIsFormDefaultDisabled(tafFromBackend.taf.status);
3876
3923
  var confirmDialog = shared.useConfirmationDialog();
3877
3924
 
3878
- var _j = shared.useDraftFormHelpers(),
3879
- toggleIsDraft = _j.toggleIsDraft,
3880
- DraftFieldHelper = _j.DraftFieldHelper;
3925
+ var _h = shared.useDraftFormHelpers(),
3926
+ toggleIsDraft = _h.toggleIsDraft,
3927
+ DraftFieldHelper = _h.DraftFieldHelper;
3928
+
3929
+ var _j = useTafModuleContext(),
3930
+ registerValidateForm = _j.registerValidateForm,
3931
+ tafAction = _j.tafAction,
3932
+ setTafAction = _j.setTafAction;
3881
3933
 
3882
3934
  var api$1 = api.useApiContext().api;
3883
3935
  var isMounted = shared.useIsMounted().isMounted;
@@ -3972,6 +4024,7 @@
3972
4024
  toggleIsDraft(true);
3973
4025
  handleSubmit(function (data) {
3974
4026
  onFormAction(action, convertTafValuesToObject(data));
4027
+ reset(getValues());
3975
4028
  })();
3976
4029
  break;
3977
4030
 
@@ -4035,7 +4088,7 @@
4035
4088
  switch (action) {
4036
4089
  case 'CANCEL':
4037
4090
  showConfirmDialog(action).then(function () {
4038
- onFormAction(action, tafFromBackend.taf);
4091
+ onFormAction(action, convertTafValuesToObject(prepareTafValues(tafFromBackend.taf, action)));
4039
4092
  });
4040
4093
  break;
4041
4094
 
@@ -4143,13 +4196,33 @@
4143
4196
  setShouldValidate = _q[1];
4144
4197
 
4145
4198
  React__default["default"].useEffect(function () {
4146
- var defaultValues = prepareTafValues(tafFromBackend.taf, undefined, !isDisabled && !tafFromBackend.taf.changeGroups); // set initial form values
4199
+ setIsDisabled(isDefaultDisabled);
4200
+ var defaultValues = prepareTafValues(tafFromBackend.taf, undefined, !isDefaultDisabled && !tafFromBackend.taf.changeGroups); // set initial form values
4147
4201
 
4148
4202
  reset(defaultValues); // set validate flag to validate after the values have been set
4149
4203
 
4150
- setShouldValidate(true);
4204
+ setShouldValidate(true); // register validate method to use in parent components
4205
+
4206
+ var onValidateFormPromise = function onValidateFormPromise() {
4207
+ return new Promise(function (resolve, reject) {
4208
+ toggleIsDraft(true);
4209
+ handleSubmit(function (formData) {
4210
+ resolve(convertTafValuesToObject(formData));
4211
+ })().then(function (formData) {
4212
+ if (formData === undefined) {
4213
+ reject();
4214
+ }
4215
+
4216
+ resolve(formData);
4217
+ });
4218
+ });
4219
+ };
4220
+
4221
+ registerValidateForm(onValidateFormPromise); // set default taf action
4222
+
4223
+ setTafAction(fromStatusToAction(originalTaf.status));
4151
4224
  return function () {
4152
- reset();
4225
+ reset({});
4153
4226
  }; // eslint-disable-next-line react-hooks/exhaustive-deps
4154
4227
  }, []);
4155
4228
  React__default["default"].useEffect(function () {
@@ -4443,6 +4516,35 @@
4443
4516
  'aria-controls': "simple-tabpanel-" + index
4444
4517
  };
4445
4518
  };
4519
+ var emptyBaseForecast = {
4520
+ wind: '',
4521
+ visibility: '',
4522
+ weather: {
4523
+ weather1: '',
4524
+ weather2: '',
4525
+ weather3: ''
4526
+ },
4527
+ cloud: {
4528
+ cloud1: '',
4529
+ cloud2: '',
4530
+ cloud3: '',
4531
+ cloud4: ''
4532
+ }
4533
+ };
4534
+ var prepareTafExportValues = function prepareTafExportValues(tafToCopy, currentTaf) {
4535
+ var _a;
4536
+
4537
+ var convertedCopy = prepareTafValues(tafToCopy, undefined, false);
4538
+ var baseForecast = convertedCopy.baseForecast,
4539
+ _b = convertedCopy.changeGroups,
4540
+ changeGroups = _b === void 0 ? [] : _b;
4541
+ return __assign(__assign({}, currentTaf), {
4542
+ baseForecast: __assign(__assign(__assign({}, emptyBaseForecast), baseForecast), {
4543
+ valid: (_a = currentTaf === null || currentTaf === void 0 ? void 0 : currentTaf.baseForecast) === null || _a === void 0 ? void 0 : _a.valid
4544
+ }),
4545
+ changeGroups: changeGroups
4546
+ });
4547
+ };
4446
4548
 
4447
4549
  /* *
4448
4550
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -4533,6 +4635,38 @@
4533
4635
  }));
4534
4636
  };
4535
4637
 
4638
+ /* *
4639
+ * Licensed under the Apache License, Version 2.0 (the "License");
4640
+ * you may not use this file except in compliance with the License.
4641
+ * You may obtain a copy of the License at
4642
+ *
4643
+ * http://www.apache.org/licenses/LICENSE-2.0
4644
+ *
4645
+ * Unless required by applicable law or agreed to in writing, software
4646
+ * distributed under the License is distributed on an "AS IS" BASIS,
4647
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
4648
+ * See the License for the specific language governing permissions and
4649
+ * limitations under the License.
4650
+ *
4651
+ * Copyright 2022 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
4652
+ * Copyright 2022 - Finnish Meteorological Institute (FMI)
4653
+ * */
4654
+ var ExportIcon = /*#__PURE__*/React__default["default"].createElement(material.SvgIcon, null, /*#__PURE__*/React__default["default"].createElement("path", {
4655
+ d: "M14.744 5.476a1.252 1.252 0 1 0 0 2.504h2.752v9.516H6.48v-1.753a1.251 1.251 0 1 0-2.504 0v3.004c0 .693.561 1.253 1.252 1.253h13.52C19.44 20 20 19.44 20 18.747V6.727c0-.69-.56-1.251-1.252-1.251zM9.133 2.385a1.252 1.252 0 0 0-1.77 0L1.773 7.974l5.54 5.54c.49.49 1.281.49 1.77 0l.022-.026a1.25 1.25 0 0 0-.021-1.745L6.568 9.225h1.371c.914 0 2.756.618 4.045 2.763 1.29 2.145.352 2.526.653 2.526.301 0 1.943-1.798.721-4.295-1.71-3.498-4.6-3.498-5.346-3.498H6.568l2.565-2.565a1.253 1.253 0 0 0 0-1.771z"
4656
+ }));
4657
+
4658
+ var ExportButton = function ExportButton(_a) {
4659
+ var onClick = _a.onClick,
4660
+ isHidden = _a.isHidden;
4661
+ return isHidden ? null : /*#__PURE__*/React__default["default"].createElement(material.Tooltip, {
4662
+ title: "Import TAC",
4663
+ placement: "left"
4664
+ }, /*#__PURE__*/React__default["default"].createElement("span", null, /*#__PURE__*/React__default["default"].createElement(shared.ToolButton, {
4665
+ onClick: onClick,
4666
+ "data-testid": "export-tac-button"
4667
+ }, ExportIcon)));
4668
+ };
4669
+
4536
4670
  /* *
4537
4671
  * Licensed under the Apache License, Version 2.0 (the "License");
4538
4672
  * you may not use this file except in compliance with the License.
@@ -4553,18 +4687,40 @@
4553
4687
  var TacContainer = function TacContainer(_a) {
4554
4688
  var taf = _a.taf,
4555
4689
  _b = _a.isActive,
4556
- isActive = _b === void 0 ? false : _b;
4690
+ isActive = _b === void 0 ? false : _b,
4691
+ _c = _a.isFormDisabled,
4692
+ isFormDisabled = _c === void 0 ? false : _c;
4557
4693
  var api$1 = api.useApiContext().api;
4558
4694
 
4559
- var _c = __read(useTACGenerator(taf, api$1.getTAC), 2),
4560
- TAC = _c[0],
4561
- retrieveTAC = _c[1];
4695
+ var _d = __read(useTACGenerator(taf, api$1.getTAC), 2),
4696
+ TAC = _d[0],
4697
+ retrieveTAC = _d[1];
4562
4698
 
4563
4699
  var status = taf.status,
4564
4700
  location = taf.location,
4565
4701
  baseTime = taf.baseTime;
4566
4702
  var locationLabel = getLocationSetting(location).label;
4567
4703
  var timeSlot = getTafTimeSlot(baseTime, location, status);
4704
+
4705
+ var _e = reactHookForm.useFormContext(),
4706
+ getValues = _e.getValues,
4707
+ trigger = _e.trigger,
4708
+ setValue = _e.setValue;
4709
+
4710
+ var handleExport = function handleExport() {
4711
+ var currentTaf = getValues();
4712
+ var newTaf = prepareTafExportValues(taf, currentTaf);
4713
+ setValue('baseForecast', newTaf.baseForecast, {
4714
+ shouldDirty: true
4715
+ });
4716
+ setValue('changeGroups', newTaf.changeGroups, {
4717
+ shouldDirty: true
4718
+ });
4719
+ setTimeout(function () {
4720
+ trigger(); // trigger all fields validation
4721
+ }, 0);
4722
+ };
4723
+
4568
4724
  React__default["default"].useEffect(function () {
4569
4725
  if (isActive) {
4570
4726
  retrieveTAC(taf);
@@ -4580,14 +4736,22 @@
4580
4736
  sx: {
4581
4737
  display: 'flex',
4582
4738
  alignItems: 'center',
4583
- marginBottom: '2px'
4739
+ justifyContent: 'space-between',
4740
+ height: 24
4584
4741
  }
4585
4742
  }, /*#__PURE__*/React__default["default"].createElement(material.Box, {
4586
4743
  sx: {
4587
- width: 20,
4588
- height: 20,
4589
4744
  display: 'flex',
4590
- marginRight: '6px'
4745
+ alignItems: 'center'
4746
+ }
4747
+ }, /*#__PURE__*/React__default["default"].createElement(material.Box, {
4748
+ sx: {
4749
+ width: 24,
4750
+ height: 24,
4751
+ display: 'flex',
4752
+ marginRight: '2px',
4753
+ alignItems: 'center',
4754
+ justifyContent: 'center'
4591
4755
  }
4592
4756
  }, /*#__PURE__*/React__default["default"].createElement(StatusIcon, {
4593
4757
  timeSlot: timeSlot,
@@ -4614,7 +4778,10 @@
4614
4778
  },
4615
4779
  "data-testid": "tafLocationLabel",
4616
4780
  component: "span"
4617
- }, locationLabel))), /*#__PURE__*/React__default["default"].createElement(material.Box, {
4781
+ }, locationLabel))), /*#__PURE__*/React__default["default"].createElement(ExportButton, {
4782
+ onClick: handleExport,
4783
+ isHidden: isFormDisabled || tacHasError(TAC)
4784
+ })), /*#__PURE__*/React__default["default"].createElement(material.Box, {
4618
4785
  sx: {
4619
4786
  fontSize: '12px',
4620
4787
  letterSpacing: '0.4px',
@@ -4650,11 +4817,13 @@
4650
4817
  _e = _a.hideTitle,
4651
4818
  hideTitle = _e === void 0 ? false : _e,
4652
4819
  _f = _a.activeTaf,
4653
- activeTaf = _f === void 0 ? null : _f;
4820
+ activeTaf = _f === void 0 ? null : _f,
4821
+ _g = _a.isFormDisabled,
4822
+ isFormDisabled = _g === void 0 ? false : _g;
4654
4823
 
4655
- var _g = __read(React__default["default"].useState(0), 2),
4656
- activeTab = _g[0],
4657
- setActiveTab = _g[1];
4824
+ var _h = __read(React__default["default"].useState(0), 2),
4825
+ activeTab = _h[0],
4826
+ setActiveTab = _h[1];
4658
4827
 
4659
4828
  var scrollRef = React__default["default"].useRef(null);
4660
4829
  var tabs = [{
@@ -4746,7 +4915,8 @@
4746
4915
  return /*#__PURE__*/React__default["default"].createElement(TacContainer, {
4747
4916
  key: taf.uuid,
4748
4917
  taf: taf,
4749
- isActive: isActiveLocation(taf.location)
4918
+ isActive: isActiveLocation(taf.location),
4919
+ isFormDisabled: isFormDisabled
4750
4920
  });
4751
4921
  }));
4752
4922
  })));
@@ -4980,84 +5150,71 @@
4980
5150
  }
4981
5151
  };
4982
5152
 
4983
- var TafPanel = function TafPanel(_a) {
4984
- var tafFromBackend = _a.tafFromBackend,
4985
- activeTafIndex = _a.activeTafIndex,
4986
- index = _a.index,
4987
- _b = _a.onPostTaf,
4988
- onPostTaf = _b === void 0 ? function () {} : _b,
4989
- _c = _a.onFormDirty,
4990
- onFormDirty = _c === void 0 ? function () {
4991
- return null;
4992
- } : _c,
4993
- _d = _a.isIssuesPaneOpen,
4994
- isIssuesPaneOpen = _d === void 0 ? false : _d,
4995
- _e = _a.setIsIssuesPaneOpen,
4996
- setIsIssuesPaneOpen = _e === void 0 ? function () {
4997
- return null;
4998
- } : _e;
4999
- var api$1 = api.useApiContext().api;
5153
+ var parseErrorMessage = function parseErrorMessage(error, params) {
5154
+ return params.changeStatusTo === 'CANCELLED' ? {
5155
+ type: 'CANCELLED',
5156
+ title: 'Cancelling this TAF failed, please try again'
5157
+ } : {
5158
+ type: 'SERVER',
5159
+ title: 'An error has occurred while saving, please try again',
5160
+ message: shared.getAxiosErrorMessage(error)
5161
+ };
5162
+ };
5000
5163
 
5001
- var _f = __read(React__default["default"].useState(false), 2),
5002
- isLoading = _f[0],
5003
- setLoading = _f[1];
5164
+ var usePostTafRequest = function usePostTafRequest(request, errorParser) {
5165
+ if (errorParser === void 0) {
5166
+ errorParser = parseErrorMessage;
5167
+ }
5004
5168
 
5005
- var _g = __read(React__default["default"].useState(null), 2),
5006
- error = _g[0],
5007
- setError = _g[1]; // removes cancelled error message
5169
+ var isMounted = shared.useIsMounted().isMounted;
5008
5170
 
5171
+ var _a = __read(React__default["default"].useState(false), 2),
5172
+ isLoading = _a[0],
5173
+ setLoading = _a[1];
5009
5174
 
5010
- React__default["default"].useEffect(function () {
5011
- var cancelErrorTimeout = error && error.type === 'CANCELLED' ? setTimeout(function () {
5012
- setError(null);
5013
- }, 10000) : null;
5014
- return function () {
5015
- if (cancelErrorTimeout !== null) {
5016
- clearTimeout(cancelErrorTimeout);
5017
- }
5018
- };
5019
- }, [error]);
5175
+ var _b = __read(React__default["default"].useState(null), 2),
5176
+ error = _b[0],
5177
+ setError = _b[1];
5020
5178
 
5021
- var postTaf = function postTaf(data) {
5179
+ var doRequest = function doRequest(params) {
5022
5180
  return __awaiter(void 0, void 0, void 0, function () {
5023
- var error_1, newError;
5181
+ var error_1, newErrorr;
5024
5182
  return __generator(this, function (_a) {
5025
5183
  switch (_a.label) {
5026
5184
  case 0:
5027
- _a.trys.push([0, 2,, 3]);
5028
-
5029
5185
  setLoading(true);
5186
+ _a.label = 1;
5187
+
5188
+ case 1:
5189
+ _a.trys.push([1, 3,, 4]);
5190
+
5030
5191
  return [4
5031
5192
  /*yield*/
5032
- , api$1.postTaf(data)];
5193
+ , request(params)];
5033
5194
 
5034
- case 1:
5195
+ case 2:
5035
5196
  _a.sent();
5036
5197
 
5198
+ if (!isMounted.current) return [2
5199
+ /*return*/
5200
+ ];
5037
5201
  setLoading(false);
5038
5202
  setError(null);
5039
- onFormDirty(false); // callback
5040
-
5041
- onPostTaf();
5042
5203
  return [3
5043
5204
  /*break*/
5044
- , 3];
5205
+ , 4];
5045
5206
 
5046
- case 2:
5207
+ case 3:
5047
5208
  error_1 = _a.sent();
5048
- newError = data.changeStatusTo === 'CANCELLED' ? {
5049
- type: 'CANCELLED',
5050
- title: 'Cancelling this TAF failed, please try again'
5051
- } : {
5052
- type: 'SERVER',
5053
- title: 'An error has occurred while saving, please try again',
5054
- message: shared.getAxiosErrorMessage(error_1)
5055
- };
5056
- setError(newError);
5209
+ if (!isMounted.current) return [2
5210
+ /*return*/
5211
+ ];
5212
+ newErrorr = errorParser ? errorParser(error_1, params) : error_1;
5057
5213
  setLoading(false);
5058
- throw error_1;
5214
+ setError(newErrorr);
5215
+ throw newErrorr;
5059
5216
 
5060
- case 3:
5217
+ case 4:
5061
5218
  return [2
5062
5219
  /*return*/
5063
5220
  ];
@@ -5066,9 +5223,41 @@
5066
5223
  });
5067
5224
  };
5068
5225
 
5069
- var getViewMode = function getViewMode(status) {
5070
- return status === 'NEW' || status === 'DRAFT' || status === 'DRAFT_AMENDED' || status === 'DRAFT_CORRECTED' ? 'edit' : 'view';
5226
+ return {
5227
+ isLoading: isLoading,
5228
+ error: error,
5229
+ setError: setError,
5230
+ doRequest: doRequest
5071
5231
  };
5232
+ };
5233
+
5234
+ var TafPanel = function TafPanel(_a) {
5235
+ var tafFromBackend = _a.tafFromBackend,
5236
+ activeTafIndex = _a.activeTafIndex,
5237
+ index = _a.index,
5238
+ _b = _a.isLoading,
5239
+ isLoading = _b === void 0 ? false : _b,
5240
+ _c = _a.postTaf,
5241
+ postTaf = _c === void 0 ? function () {
5242
+ return null;
5243
+ } : _c,
5244
+ _d = _a.onFormDirty,
5245
+ onFormDirty = _d === void 0 ? function () {
5246
+ return null;
5247
+ } : _d,
5248
+ _e = _a.isIssuesPaneOpen,
5249
+ isIssuesPaneOpen = _e === void 0 ? false : _e,
5250
+ _f = _a.setIsIssuesPaneOpen,
5251
+ setIsIssuesPaneOpen = _f === void 0 ? function () {
5252
+ return null;
5253
+ } : _f,
5254
+ _g = _a.isFormDisabled,
5255
+ isFormDisabled = _g === void 0 ? false : _g,
5256
+ _h = _a.setIsFormDisabled,
5257
+ setIsFormDisabled = _h === void 0 ? function () {
5258
+ return null;
5259
+ } : _h,
5260
+ error = _a.error;
5072
5261
 
5073
5262
  var onTafAction = function onTafAction(action, taf) {
5074
5263
  return __awaiter(void 0, void 0, void 0, function () {
@@ -5183,12 +5372,13 @@
5183
5372
  info: error.message,
5184
5373
  dataTestId: "taf-error"
5185
5374
  }), /*#__PURE__*/React__default["default"].createElement(TafForm, {
5186
- isDisabled: getViewMode(tafFromBackend.taf.status) === 'view',
5187
5375
  tafFromBackend: tafFromBackend,
5188
5376
  onFormAction: onTafAction,
5189
5377
  onFormDirty: onFormDirty,
5190
5378
  isIssuesPaneOpen: isIssuesPaneOpen,
5191
- setIsIssuesPaneOpen: setIsIssuesPaneOpen
5379
+ setIsIssuesPaneOpen: setIsIssuesPaneOpen,
5380
+ isDisabled: isFormDisabled,
5381
+ setIsDisabled: setIsFormDisabled
5192
5382
  }));
5193
5383
  };
5194
5384
 
@@ -5200,11 +5390,18 @@
5200
5390
  }, props));
5201
5391
  };
5202
5392
 
5393
+ var CONFIRM_DIALOG_OPTIONS = {
5394
+ title: 'Whoops',
5395
+ description: "It's not possible to autosave this TAF due to the presence of issue(s). Are you sure you want to close this TAF? Any changes made will be lost.",
5396
+ confirmLabel: 'Exit without saving'
5397
+ };
5398
+
5203
5399
  var TafLayout = function TafLayout(_a) {
5204
5400
  var _b = _a.tafList,
5205
5401
  tafList = _b === void 0 ? [] : _b,
5206
5402
  _c = _a.onPostTaf,
5207
5403
  onPostTaf = _c === void 0 ? function () {} : _c;
5404
+ var api$1 = api.useApiContext().api;
5208
5405
  var confirmDialog = shared.useConfirmationDialog();
5209
5406
 
5210
5407
  var _d = useIssuesPane(),
@@ -5213,44 +5410,128 @@
5213
5410
  onCloseIssuesPane = _d.onCloseIssuesPane,
5214
5411
  startPosition = _d.startPosition;
5215
5412
 
5216
- var _e = __read(React__default["default"].useState(sortTafTimeSlots(tafList)), 2),
5217
- _f = _e[0],
5218
- upcoming = _f.upcoming,
5219
- current = _f.current,
5220
- expired = _f.expired,
5221
- updateSortedTafs = _e[1];
5413
+ var _e = usePostTafRequest(api$1.postTaf),
5414
+ isLoading = _e.isLoading,
5415
+ postTafRequest = _e.doRequest,
5416
+ error = _e.error,
5417
+ setError = _e.setError;
5418
+
5419
+ var _f = useTafModuleContext(),
5420
+ onValidateForm = _f.onValidateForm,
5421
+ tafAction = _f.tafAction;
5422
+
5423
+ var _g = __read(React__default["default"].useState(sortTafTimeSlots(tafList)), 2),
5424
+ _h = _g[0],
5425
+ upcoming = _h.upcoming,
5426
+ current = _h.current,
5427
+ expired = _h.expired,
5428
+ updateSortedTafs = _g[1];
5222
5429
 
5223
- var _g = __read(current.slice(-1), 1),
5224
- lastCurrentTaf = _g[0];
5430
+ var _j = __read(current.slice(-1), 1),
5431
+ lastCurrentTaf = _j[0];
5225
5432
 
5226
- var _h = __read(React__default["default"].useState('UPCOMING'), 2),
5227
- timeSlot = _h[0],
5228
- setTimeSlot = _h[1];
5433
+ var _k = __read(React__default["default"].useState('UPCOMING'), 2),
5434
+ timeSlot = _k[0],
5435
+ setTimeSlot = _k[1];
5229
5436
 
5230
- var _j = __read(React__default["default"].useState(upcoming), 2),
5231
- locations = _j[0],
5232
- setLocations = _j[1];
5437
+ var _l = __read(React__default["default"].useState(upcoming), 2),
5438
+ locations = _l[0],
5439
+ setLocations = _l[1];
5233
5440
 
5234
- var _k = __read(React__default["default"].useState(0), 2),
5235
- activeTafIndex = _k[0],
5236
- setActiveTafIndex = _k[1];
5441
+ var _m = __read(React__default["default"].useState(0), 2),
5442
+ activeTafIndex = _m[0],
5443
+ setActiveTafIndex = _m[1];
5237
5444
 
5238
- var _l = __read(React__default["default"].useState(false), 2),
5239
- isFormDirty = _l[0],
5240
- setIsFormDirty = _l[1];
5445
+ var _o = __read(React__default["default"].useState(false), 2),
5446
+ isFormDirty = _o[0],
5447
+ setIsFormDirty = _o[1];
5448
+
5449
+ var _p = __read(React__default["default"].useState(false), 2),
5450
+ isFormDisabled = _p[0],
5451
+ setIsFormDisabled = _p[1];
5452
+
5453
+ var postTaf = function postTaf(data) {
5454
+ return __awaiter(void 0, void 0, void 0, function () {
5455
+ return __generator(this, function (_a) {
5456
+ switch (_a.label) {
5457
+ case 0:
5458
+ return [4
5459
+ /*yield*/
5460
+ , postTafRequest(data)];
5461
+
5462
+ case 1:
5463
+ _a.sent(); // callback
5464
+
5465
+
5466
+ onPostTaf();
5467
+ return [2
5468
+ /*return*/
5469
+ ];
5470
+ }
5471
+ });
5472
+ });
5473
+ };
5241
5474
 
5242
5475
  function onChangeTab(action, value) {
5243
- if (isFormDirty) {
5244
- confirmDialog({
5245
- title: 'Whoops',
5246
- description: 'Do you want to leave this open TAF without saving it? All changes will be lost.',
5247
- confirmLabel: 'Exit without saving'
5248
- }).then(function () {
5249
- action(value);
5476
+ return __awaiter(this, void 0, void 0, function () {
5477
+ var taf;
5478
+ return __generator(this, function (_a) {
5479
+ switch (_a.label) {
5480
+ case 0:
5481
+ if (!isFormDirty) return [3
5482
+ /*break*/
5483
+ , 6];
5484
+ _a.label = 1;
5485
+
5486
+ case 1:
5487
+ _a.trys.push([1, 4,, 5]);
5488
+
5489
+ return [4
5490
+ /*yield*/
5491
+ , onValidateForm()];
5492
+
5493
+ case 2:
5494
+ taf = _a.sent();
5495
+ return [4
5496
+ /*yield*/
5497
+ , postTaf({
5498
+ taf: taf,
5499
+ changeStatusTo: fromActionToStatus(tafActionToDraftAction(tafAction))
5500
+ })];
5501
+
5502
+ case 3:
5503
+ _a.sent();
5504
+
5505
+ action(value);
5506
+ return [3
5507
+ /*break*/
5508
+ , 5];
5509
+
5510
+ case 4:
5511
+ _a.sent();
5512
+ confirmDialog(CONFIRM_DIALOG_OPTIONS).then(function () {
5513
+ action(value);
5514
+ });
5515
+ return [3
5516
+ /*break*/
5517
+ , 5];
5518
+
5519
+ case 5:
5520
+ return [3
5521
+ /*break*/
5522
+ , 7];
5523
+
5524
+ case 6:
5525
+ action(value);
5526
+ _a.label = 7;
5527
+
5528
+ case 7:
5529
+ return [2
5530
+ /*return*/
5531
+ ];
5532
+ }
5250
5533
  });
5251
- } else {
5252
- action(value);
5253
- }
5534
+ });
5254
5535
  }
5255
5536
 
5256
5537
  var onChangeLocationTab = function onChangeLocationTab(index) {
@@ -5279,6 +5560,16 @@
5279
5560
  var newIndex = newActiveIndex !== -1 ? newActiveIndex : activeTafIndex;
5280
5561
  setActiveTafIndex(newIndex); // eslint-disable-next-line react-hooks/exhaustive-deps
5281
5562
  }, [tafList, setLocations]);
5563
+ React__default["default"].useEffect(function () {
5564
+ var cancelErrorTimeout = error && error.type === 'CANCELLED' ? setTimeout(function () {
5565
+ setError(null);
5566
+ }, 10000) : null;
5567
+ return function () {
5568
+ if (cancelErrorTimeout !== null) {
5569
+ clearTimeout(cancelErrorTimeout);
5570
+ }
5571
+ };
5572
+ }, [error, setError]);
5282
5573
 
5283
5574
  if (!tafList) {
5284
5575
  return null;
@@ -5369,10 +5660,14 @@
5369
5660
  activeTafIndex: activeTafIndex,
5370
5661
  index: index,
5371
5662
  tafFromBackend: tafFromBackend,
5372
- onPostTaf: onPostTaf,
5373
5663
  onFormDirty: setIsFormDirty,
5374
5664
  isIssuesPaneOpen: isIssuesPaneOpen,
5375
- setIsIssuesPaneOpen: onToggleIssuesPane
5665
+ setIsIssuesPaneOpen: onToggleIssuesPane,
5666
+ isFormDisabled: isFormDisabled,
5667
+ setIsFormDisabled: setIsFormDisabled,
5668
+ postTaf: postTaf,
5669
+ isLoading: isLoading,
5670
+ error: error
5376
5671
  });
5377
5672
  }))), /*#__PURE__*/React__default["default"].createElement(material.Grid, {
5378
5673
  item: true,
@@ -5388,7 +5683,8 @@
5388
5683
  upcomingTafs: upcoming,
5389
5684
  currentTafs: current,
5390
5685
  expiredTafs: expired,
5391
- activeTaf: activeTaf
5686
+ activeTaf: activeTaf,
5687
+ isFormDisabled: isFormDisabled
5392
5688
  })))))), /*#__PURE__*/React__default["default"].createElement(IssuesPaneWrapper, {
5393
5689
  handleClose: onCloseIssuesPane,
5394
5690
  isOpen: isIssuesPaneOpen,
@@ -5415,13 +5711,13 @@
5415
5711
 
5416
5712
  var TafWrapper = function TafWrapper(_a) {
5417
5713
  var children = _a.children;
5418
- return /*#__PURE__*/React__namespace.createElement(shared.ConfirmationServiceProvider, null, /*#__PURE__*/React__namespace.createElement(formFields.ReactHookFormProvider, {
5714
+ return /*#__PURE__*/React__namespace.createElement(TafModuleProvider, null, /*#__PURE__*/React__namespace.createElement(shared.ConfirmationServiceProvider, null, /*#__PURE__*/React__namespace.createElement(formFields.ReactHookFormProvider, {
5419
5715
  options: {
5420
5716
  mode: 'onTouched',
5421
5717
  reValidateMode: 'onChange',
5422
5718
  criteriaMode: 'all'
5423
5719
  }
5424
- }, children));
5720
+ }, children)));
5425
5721
  };
5426
5722
 
5427
5723
  var TafModule = function TafModule() {
@@ -6163,7 +6459,7 @@
6163
6459
  change: 'BECMG',
6164
6460
  valid: {
6165
6461
  start: currentDate + "T23:00:00Z",
6166
- end: tomorrowDate + "T00:00:00Z"
6462
+ end: tomorrowDate + "T01:00:00Z"
6167
6463
  },
6168
6464
  wind: {
6169
6465
  direction: 150,
@@ -6419,7 +6715,7 @@
6419
6715
  }
6420
6716
  }
6421
6717
  }
6422
- }; // Only use for display purposes in the list!
6718
+ };
6423
6719
 
6424
6720
  ({
6425
6721
  creationDate: "2022-01-06T14:00:00Z",