@opengeoweb/taf 2.14.0 → 4.0.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-sortablejs'), require('@opengeoweb/form-fields'), require('@opengeoweb/shared'), require('lodash'), require('moment'), require('@opengeoweb/theme'), require('@mui/styles/makeStyles'), 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-sortablejs', '@opengeoweb/form-fields', '@opengeoweb/shared', 'lodash', 'moment', '@opengeoweb/theme', '@mui/styles/makeStyles', '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.reactSortablejs, global.formFields, global.shared, global.lodash, global.moment, global.theme, global.makeStyles, global.ReactDOM, global.api, global.LinearProgress, global.Box));
5
- })(this, (function (exports, React, material, reactHookForm, reactSortablejs, formFields, shared, lodash, moment, theme, makeStyles, 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-sortablejs'), require('lodash'), require('@opengeoweb/authentication'), require('@opengeoweb/form-fields'), require('@opengeoweb/shared'), 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-sortablejs', 'lodash', '@opengeoweb/authentication', '@opengeoweb/form-fields', '@opengeoweb/shared', '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.reactSortablejs, global.lodash, global.authentication, global.formFields, global.shared, global.moment, global.theme, global.ReactDOM, global.api, global.LinearProgress, global.Box));
5
+ })(this, (function (exports, React, material, reactHookForm, reactSortablejs, lodash, authentication, formFields, shared, moment, 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
 
@@ -27,7 +27,6 @@
27
27
  var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
28
28
  var React__namespace = /*#__PURE__*/_interopNamespace(React);
29
29
  var moment__default = /*#__PURE__*/_interopDefaultLegacy(moment);
30
- var makeStyles__default = /*#__PURE__*/_interopDefaultLegacy(makeStyles);
31
30
  var ReactDOM__default = /*#__PURE__*/_interopDefaultLegacy(ReactDOM);
32
31
  var LinearProgress__default = /*#__PURE__*/_interopDefaultLegacy(LinearProgress);
33
32
  var Box__default = /*#__PURE__*/_interopDefaultLegacy(Box);
@@ -3515,19 +3514,6 @@
3515
3514
  * Copyright 2021 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
3516
3515
  * Copyright 2021 - Finnish Meteorological Institute (FMI)
3517
3516
  * */
3518
- var useStyles = makeStyles__default["default"](function () {
3519
- return {
3520
- dragHandle: {
3521
- backgroundColor: 'transparent',
3522
- '&:hover': {
3523
- backgroundColor: 'transparent'
3524
- },
3525
- cursor: function cursor(isSorting) {
3526
- return isSorting ? 'grabbing' : 'grab';
3527
- }
3528
- }
3529
- };
3530
- });
3531
3517
 
3532
3518
  var DragHandle = function DragHandle(_a) {
3533
3519
  var _b = _a.isSorting,
@@ -3535,13 +3521,21 @@
3535
3521
  _c = _a.isDisabled,
3536
3522
  isDisabled = _c === void 0 ? false : _c,
3537
3523
  index = _a.index;
3538
- var classes = useStyles(isSorting);
3539
3524
  return /*#__PURE__*/React__default["default"].createElement(material.IconButton, {
3540
- className: classes.dragHandle + " handle",
3525
+ className: "handle",
3541
3526
  "data-testid": "dragHandle-" + index,
3542
3527
  disableRipple: true,
3543
3528
  disabled: isDisabled,
3544
- size: "large"
3529
+ size: "large",
3530
+ sx: {
3531
+ backgroundColor: 'transparent',
3532
+ '&:hover': {
3533
+ backgroundColor: 'transparent'
3534
+ },
3535
+ cursor: function cursor() {
3536
+ return isSorting ? 'grabbing' : 'grab';
3537
+ }
3538
+ }
3545
3539
  }, /*#__PURE__*/React__default["default"].createElement(theme.DragHandle, null));
3546
3540
  };
3547
3541
 
@@ -3825,7 +3819,12 @@
3825
3819
  fontSize: '4rem'
3826
3820
  },
3827
3821
  "data-testid": "zeroIssuesImage"
3828
- }, /*#__PURE__*/React__namespace.createElement(theme.ThumbsUp, null)), errorList.length > 0 && errorList.map(function (error, index) {
3822
+ }, /*#__PURE__*/React__namespace.createElement(theme.ThumbsUp, {
3823
+ sx: {
3824
+ height: '69px',
3825
+ width: '58px'
3826
+ }
3827
+ })), errorList.length > 0 && errorList.map(function (error, index) {
3829
3828
  return /*#__PURE__*/React__namespace.createElement(material.Typography // eslint-disable-next-line react/no-array-index-key
3830
3829
  , {
3831
3830
  // eslint-disable-next-line react/no-array-index-key
@@ -3909,9 +3908,59 @@
3909
3908
  }, children);
3910
3909
  };
3911
3910
 
3911
+ var styles = {
3912
+ label: {
3913
+ color: 'geowebColors.buttons.tertiary.default.color',
3914
+ opacity: 1,
3915
+ fontSize: '12px',
3916
+ fontWeight: 500
3917
+ }
3918
+ };
3919
+
3920
+ var SwitchButton = function SwitchButton(props) {
3921
+ return /*#__PURE__*/React__namespace.createElement(material.Tooltip, {
3922
+ title: "Switch mode"
3923
+ }, /*#__PURE__*/React__namespace.createElement("span", null, /*#__PURE__*/React__namespace.createElement(material.FormLabel, {
3924
+ sx: styles.label
3925
+ }, "Viewer"), /*#__PURE__*/React__namespace.createElement(material.Switch, __assign({
3926
+ "data-testid": "switchMode"
3927
+ }, props)), /*#__PURE__*/React__namespace.createElement(material.FormLabel, {
3928
+ sx: styles.label
3929
+ }, "Editor")));
3930
+ };
3931
+
3932
+ /* *
3933
+ * Licensed under the Apache License, Version 2.0 (the "License");
3934
+ * you may not use this file except in compliance with the License.
3935
+ * You may obtain a copy of the License at
3936
+ *
3937
+ * http://www.apache.org/licenses/LICENSE-2.0
3938
+ *
3939
+ * Unless required by applicable law or agreed to in writing, software
3940
+ * distributed under the License is distributed on an "AS IS" BASIS,
3941
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
3942
+ * See the License for the specific language governing permissions and
3943
+ * limitations under the License.
3944
+ *
3945
+ * Copyright 2022 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
3946
+ * Copyright 2022 - Finnish Meteorological Institute (FMI)
3947
+ * */
3948
+
3949
+ var TafAvatar = function TafAvatar(_a) {
3950
+ var editor = _a.editor,
3951
+ _b = _a.tooltipPlacement,
3952
+ tooltipPlacement = _b === void 0 ? 'bottom' : _b;
3953
+ return /*#__PURE__*/React__namespace.createElement(material.Tooltip, {
3954
+ title: "Editor: " + editor,
3955
+ placement: tooltipPlacement
3956
+ }, /*#__PURE__*/React__namespace.createElement("span", null, /*#__PURE__*/React__namespace.createElement(shared.Avatar, {
3957
+ size: "small"
3958
+ }, shared.getInitials(editor))));
3959
+ };
3960
+
3912
3961
  var noop = function noop() {};
3913
3962
 
3914
- var TafForm = function TafForm(_a) {
3963
+ var TafForm = /*#__PURE__*/React__default["default"].memo(function (_a) {
3915
3964
  var tafFromBackend = _a.tafFromBackend,
3916
3965
  _b = _a.onFormAction,
3917
3966
  onFormAction = _b === void 0 ? function () {
@@ -3928,43 +3977,50 @@
3928
3977
  _f = _a.setIsDisabled,
3929
3978
  setIsDisabled = _f === void 0 ? function () {
3930
3979
  return null;
3931
- } : _f;
3932
- var originalTaf = tafFromBackend.taf;
3933
- var isDefaultDisabled = getIsFormDefaultDisabled(tafFromBackend.taf.status);
3980
+ } : _f,
3981
+ _g = _a.onSwitchEditor,
3982
+ onSwitchEditor = _g === void 0 ? function () {
3983
+ return null;
3984
+ } : _g;
3985
+ var originalTaf = tafFromBackend.taf,
3986
+ editor = tafFromBackend.editor;
3987
+ var auth = authentication.useAuthenticationContext().auth;
3988
+ var isEditor = editor === (auth === null || auth === void 0 ? void 0 : auth.username) || false;
3989
+ var isDefaultDisabled = getIsFormDefaultDisabled(originalTaf.status);
3934
3990
  var confirmDialog = shared.useConfirmationDialog();
3935
3991
 
3936
- var _g = shared.useDraftFormHelpers(true),
3937
- toggleIsDraft = _g.toggleIsDraft,
3938
- DraftFieldHelper = _g.DraftFieldHelper;
3992
+ var _h = shared.useDraftFormHelpers(true),
3993
+ toggleIsDraft = _h.toggleIsDraft,
3994
+ DraftFieldHelper = _h.DraftFieldHelper;
3939
3995
 
3940
- var _h = useTafModuleContext(),
3941
- registerValidateForm = _h.registerValidateForm,
3942
- tafAction = _h.tafAction,
3943
- setIsFormDirty = _h.setIsFormDirty,
3944
- setTafAction = _h.setTafAction,
3945
- TAC = _h.TAC,
3946
- updateTAC = _h.updateTAC,
3947
- setTAC = _h.setTAC;
3996
+ var _j = useTafModuleContext(),
3997
+ registerValidateForm = _j.registerValidateForm,
3998
+ tafAction = _j.tafAction,
3999
+ setIsFormDirty = _j.setIsFormDirty,
4000
+ setTafAction = _j.setTafAction,
4001
+ TAC = _j.TAC,
4002
+ updateTAC = _j.updateTAC,
4003
+ setTAC = _j.setTAC;
3948
4004
 
3949
4005
  var isMounted = shared.useIsMounted().isMounted;
3950
4006
 
3951
- var _j = reactHookForm.useFormContext(),
3952
- control = _j.control,
3953
- handleSubmit = _j.handleSubmit,
3954
- trigger = _j.trigger,
3955
- formState = _j.formState,
3956
- getValues = _j.getValues,
3957
- setValue = _j.setValue,
3958
- reset = _j.reset;
4007
+ var _k = reactHookForm.useFormContext(),
4008
+ control = _k.control,
4009
+ handleSubmit = _k.handleSubmit,
4010
+ trigger = _k.trigger,
4011
+ formState = _k.formState,
4012
+ getValues = _k.getValues,
4013
+ setValue = _k.setValue,
4014
+ reset = _k.reset;
3959
4015
 
3960
4016
  var isFormDirty = formState.isDirty,
3961
4017
  errors = formState.errors;
3962
4018
  shared.usePreventBrowserClose(isFormDirty && !isDisabled);
3963
4019
  var hiddenInputFields = ['baseTime', 'issueDate', 'type', 'uuid', 'validDateStart', 'validDateEnd', 'status', 'previousId', 'previousValidDateStart', 'previousValidDateEnd'];
3964
4020
 
3965
- var _k = __read(React__default["default"].useState(getValues()), 2),
3966
- delayedFormValues = _k[0],
3967
- setDelayedFormValues = _k[1];
4021
+ var _l = __read(React__default["default"].useState(getValues()), 2),
4022
+ delayedFormValues = _l[0],
4023
+ setDelayedFormValues = _l[1];
3968
4024
 
3969
4025
  var hasErrors = Object.keys(errors).length;
3970
4026
 
@@ -4021,7 +4077,7 @@
4021
4077
  action = undefined;
4022
4078
  }
4023
4079
 
4024
- var newTaf = prepareTafValues(tafFromBackend.taf, action, shouldAddEmptyChangGroup);
4080
+ var newTaf = prepareTafValues(originalTaf, action, shouldAddEmptyChangGroup);
4025
4081
  reset(newTaf);
4026
4082
  };
4027
4083
 
@@ -4030,12 +4086,98 @@
4030
4086
  action = undefined;
4031
4087
  }
4032
4088
 
4033
- var shouldAddEmptyChangGroup = !(tafFromBackend.taf && tafFromBackend.taf.changeGroups) && !resetDisabled;
4089
+ var shouldAddEmptyChangGroup = !(originalTaf && originalTaf.changeGroups) && !resetDisabled;
4034
4090
  resetFormValues(action, shouldAddEmptyChangGroup);
4035
4091
  setIsDisabled(resetDisabled);
4036
4092
  setTafAction(action);
4037
4093
  };
4038
4094
 
4095
+ var setIsEditor = function setIsEditor(checked) {
4096
+ return __awaiter(void 0, void 0, void 0, function () {
4097
+ var editor, didSucceed;
4098
+ return __generator(this, function (_a) {
4099
+ switch (_a.label) {
4100
+ case 0:
4101
+ editor = checked ? auth === null || auth === void 0 ? void 0 : auth.username : '';
4102
+
4103
+ if (editor === tafFromBackend.editor) {
4104
+ // do nothing, correct editor is already set
4105
+ return [2
4106
+ /*return*/
4107
+ , true];
4108
+ }
4109
+
4110
+ if (!(tafFromBackend.editor !== '' && tafFromBackend.editor !== null && tafFromBackend.editor !== (auth === null || auth === void 0 ? void 0 : auth.username))) return [3
4111
+ /*break*/
4112
+ , 2];
4113
+ return [4
4114
+ /*yield*/
4115
+ , confirmDialog({
4116
+ title: 'Switch to editor mode',
4117
+ description: 'This TAF is already in edit mode and important information could get lost in the switching process.',
4118
+ confirmLabel: 'Edit mode'
4119
+ })];
4120
+
4121
+ case 1:
4122
+ _a.sent();
4123
+
4124
+ _a.label = 2;
4125
+
4126
+ case 2:
4127
+ return [4
4128
+ /*yield*/
4129
+ , onSwitchEditor(__assign(__assign({}, tafFromBackend), {
4130
+ editor: editor
4131
+ }))];
4132
+
4133
+ case 3:
4134
+ didSucceed = _a.sent();
4135
+ return [2
4136
+ /*return*/
4137
+ , didSucceed];
4138
+ }
4139
+ });
4140
+ });
4141
+ };
4142
+
4143
+ var onSwitchMode = function onSwitchMode(event) {
4144
+ var checked = event.target.checked;
4145
+
4146
+ if (!checked && isFormDirty) {
4147
+ confirmDialog({
4148
+ title: 'Whoops',
4149
+ description: 'Are you sure you want to switch to viewer mode? Your unsaved changes will be lost.',
4150
+ confirmLabel: 'Switch mode'
4151
+ }).then(function () {
4152
+ return __awaiter(void 0, void 0, void 0, function () {
4153
+ var didSucceed;
4154
+ return __generator(this, function (_a) {
4155
+ switch (_a.label) {
4156
+ case 0:
4157
+ return [4
4158
+ /*yield*/
4159
+ , setIsEditor(checked)];
4160
+
4161
+ case 1:
4162
+ didSucceed = _a.sent();
4163
+
4164
+ if (didSucceed) {
4165
+ resetForm(undefined, isDefaultDisabled);
4166
+ resetTAC();
4167
+ }
4168
+
4169
+ return [2
4170
+ /*return*/
4171
+ ];
4172
+ }
4173
+ });
4174
+ });
4175
+ });
4176
+ } else {
4177
+ setIsEditor(checked);
4178
+ }
4179
+ };
4180
+
4039
4181
  var onTafEditModeButtonPress = function onTafEditModeButtonPress(action) {
4040
4182
  switch (action) {
4041
4183
  case 'DRAFT':
@@ -4109,7 +4251,23 @@
4109
4251
  switch (action) {
4110
4252
  case 'CANCEL':
4111
4253
  showConfirmDialog(action).then(function () {
4112
- onFormAction(action, convertTafValuesToObject(prepareTafValues(tafFromBackend.taf, action)));
4254
+ return __awaiter(void 0, void 0, void 0, function () {
4255
+ return __generator(this, function (_a) {
4256
+ switch (_a.label) {
4257
+ case 0:
4258
+ return [4
4259
+ /*yield*/
4260
+ , onFormAction(action, convertTafValuesToObject(prepareTafValues(originalTaf, action)))];
4261
+
4262
+ case 1:
4263
+ _a.sent();
4264
+
4265
+ return [2
4266
+ /*return*/
4267
+ ];
4268
+ }
4269
+ });
4270
+ });
4113
4271
  });
4114
4272
  break;
4115
4273
 
@@ -4119,19 +4277,19 @@
4119
4277
  }
4120
4278
  };
4121
4279
 
4122
- var _l = reactHookForm.useFieldArray({
4280
+ var _m = reactHookForm.useFieldArray({
4123
4281
  control: control,
4124
4282
  name: 'changeGroups'
4125
4283
  }),
4126
- fields = _l.fields,
4127
- insert = _l.insert,
4128
- remove = _l.remove,
4129
- move = _l.move;
4284
+ fields = _m.fields,
4285
+ insert = _m.insert,
4286
+ remove = _m.remove,
4287
+ move = _m.move;
4130
4288
 
4131
- var _m = useDragOrder(trigger, move, onFormBlur),
4132
- onChangeOrder = _m.onChangeOrder,
4133
- onStartDrag = _m.onStartDrag,
4134
- activeDraggingIndex = _m.activeDraggingIndex;
4289
+ var _o = useDragOrder(trigger, move, onFormBlur),
4290
+ onChangeOrder = _o.onChangeOrder,
4291
+ onStartDrag = _o.onStartDrag,
4292
+ activeDraggingIndex = _o.activeDraggingIndex;
4135
4293
 
4136
4294
  var onRemoverow = function onRemoverow(index) {
4137
4295
  confirmDialog({
@@ -4212,13 +4370,13 @@
4212
4370
  });
4213
4371
  };
4214
4372
 
4215
- var _o = __read(React__default["default"].useState(false), 2),
4216
- shouldValidate = _o[0],
4217
- setShouldValidate = _o[1];
4373
+ var _p = __read(React__default["default"].useState(false), 2),
4374
+ shouldValidate = _p[0],
4375
+ setShouldValidate = _p[1];
4218
4376
 
4219
4377
  React__default["default"].useEffect(function () {
4220
- setIsDisabled(isDefaultDisabled);
4221
- var defaultValues = prepareTafValues(tafFromBackend.taf, undefined, !isDefaultDisabled && !tafFromBackend.taf.changeGroups); // set initial form values
4378
+ setIsDisabled(!isEditor || isDefaultDisabled);
4379
+ var defaultValues = prepareTafValues(originalTaf, undefined, !isDefaultDisabled && !originalTaf.changeGroups); // set initial form values
4222
4380
 
4223
4381
  reset(defaultValues); // set validate flag to validate after the values have been set
4224
4382
 
@@ -4248,14 +4406,20 @@
4248
4406
  }; // eslint-disable-next-line react-hooks/exhaustive-deps
4249
4407
  }, []);
4250
4408
  React__default["default"].useEffect(function () {
4251
- var newValues = prepareTafValues(tafFromBackend.taf, undefined, !isDefaultDisabled && !tafFromBackend.taf.changeGroups); // set new form values when tafFromBackend changed
4409
+ var newValues = prepareTafValues(originalTaf, undefined, !isDefaultDisabled && !originalTaf.changeGroups); // set new form values when taf values changed
4410
+
4411
+ reset(newValues); // reset TAC when taf values changed
4252
4412
 
4253
- reset(newValues); // eslint-disable-next-line react-hooks/exhaustive-deps
4254
- }, [tafFromBackend]);
4413
+ resetTAC(); // eslint-disable-next-line react-hooks/exhaustive-deps
4414
+ }, [originalTaf]);
4415
+ React__default["default"].useEffect(function () {
4416
+ // update disabled state when editor changed
4417
+ setIsDisabled(!isEditor || isDefaultDisabled); // eslint-disable-next-line react-hooks/exhaustive-deps
4418
+ }, [editor]);
4255
4419
  React__default["default"].useEffect(function () {
4256
4420
  if (shouldValidate && !isDisabled) {
4257
- // trigger validation on all changegroup validity times after initial load since they could be outside the new validity period
4258
- var _a = tafFromBackend.taf.changeGroups,
4421
+ // trigger validation on all changegroup validity times after form is enabled since they could be outside the new validity period
4422
+ var _a = originalTaf.changeGroups,
4259
4423
  changeGroups = _a === void 0 ? [] : _a;
4260
4424
  var validFields = changeGroups.map(function (_field, index) {
4261
4425
  return "changeGroups[" + index + "].valid";
@@ -4263,8 +4427,33 @@
4263
4427
  trigger(validFields);
4264
4428
  } // eslint-disable-next-line react-hooks/exhaustive-deps
4265
4429
 
4266
- }, [shouldValidate]);
4267
- return /*#__PURE__*/React__default["default"].createElement("form", {
4430
+ }, [shouldValidate, isDisabled]);
4431
+ return /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, /*#__PURE__*/React__default["default"].createElement(material.Box, {
4432
+ sx: {
4433
+ display: 'flex',
4434
+ flexDirection: 'row',
4435
+ alignItems: 'center',
4436
+ position: 'absolute',
4437
+ top: {
4438
+ xs: '20px',
4439
+ sm: '0px'
4440
+ },
4441
+ right: {
4442
+ xs: 'calc(50% - 70px)',
4443
+ sm: '8px'
4444
+ }
4445
+ }
4446
+ }, /*#__PURE__*/React__default["default"].createElement(SwitchButton, {
4447
+ checked: isEditor,
4448
+ onChange: onSwitchMode
4449
+ }), /*#__PURE__*/React__default["default"].createElement(material.Box, {
4450
+ sx: {
4451
+ width: '16px',
4452
+ marginLeft: 1
4453
+ }
4454
+ }, editor && /*#__PURE__*/React__default["default"].createElement(TafAvatar, {
4455
+ editor: editor
4456
+ }))), /*#__PURE__*/React__default["default"].createElement("form", {
4268
4457
  "data-testid": "taf-form",
4269
4458
  onSubmit: handleSubmit(onSubmit),
4270
4459
  onBlur: onFormBlur
@@ -4330,7 +4519,7 @@
4330
4519
  index: index
4331
4520
  })
4332
4521
  });
4333
- })), !isDisabled && /*#__PURE__*/React__default["default"].createElement(material.Grid, {
4522
+ })), !isDisabled && isEditor && /*#__PURE__*/React__default["default"].createElement(material.Grid, {
4334
4523
  container: true,
4335
4524
  justifyContent: "space-between",
4336
4525
  alignItems: "center",
@@ -4344,7 +4533,7 @@
4344
4533
  errors: errors,
4345
4534
  isIssuesPaneOpen: isIssuesPaneOpen,
4346
4535
  setIsIssuesPaneOpen: setIsIssuesPaneOpen
4347
- }))), /*#__PURE__*/React__default["default"].createElement(TafFormButtons, {
4536
+ }))), isEditor && /*#__PURE__*/React__default["default"].createElement(TafFormButtons, {
4348
4537
  isFormDisabled: isDisabled,
4349
4538
  tafAction: tafAction,
4350
4539
  canBe: tafFromBackend.canbe,
@@ -4355,8 +4544,12 @@
4355
4544
  name: field,
4356
4545
  key: field
4357
4546
  });
4358
- }), /*#__PURE__*/React__default["default"].createElement(DraftFieldHelper, null));
4359
- };
4547
+ }), /*#__PURE__*/React__default["default"].createElement(DraftFieldHelper, null)));
4548
+ }, function (prevProps, nextProps) {
4549
+ // prevent re-render
4550
+ return !nextProps.isDisabled && prevProps.tafFromBackend !== nextProps.tafFromBackend && // if editor changed it should rerender
4551
+ prevProps.tafFromBackend.editor === nextProps.tafFromBackend.editor;
4552
+ });
4360
4553
 
4361
4554
  /* *
4362
4555
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -4390,32 +4583,17 @@
4390
4583
  }, other), value === index && children);
4391
4584
  };
4392
4585
 
4393
- /* *
4394
- * Licensed under the Apache License, Version 2.0 (the "License");
4395
- * you may not use this file except in compliance with the License.
4396
- * You may obtain a copy of the License at
4397
- *
4398
- * http://www.apache.org/licenses/LICENSE-2.0
4399
- *
4400
- * Unless required by applicable law or agreed to in writing, software
4401
- * distributed under the License is distributed on an "AS IS" BASIS,
4402
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
4403
- * See the License for the specific language governing permissions and
4404
- * limitations under the License.
4405
- *
4406
- * Copyright 2022 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
4407
- * Copyright 2022 - Finnish Meteorological Institute (FMI)
4408
- * */
4409
-
4410
4586
  var TafHeader = function TafHeader(_a) {
4411
- var title = _a.title;
4587
+ var title = _a.title,
4588
+ _b = _a.sx,
4589
+ sx = _b === void 0 ? {} : _b;
4412
4590
  return /*#__PURE__*/React__default["default"].createElement(material.Typography, {
4413
- sx: {
4591
+ sx: __assign({
4414
4592
  textAlign: 'center',
4415
4593
  fontWeight: 500,
4416
4594
  paddingTop: '6px',
4417
4595
  textTransform: 'capitalize'
4418
- }
4596
+ }, sx)
4419
4597
  }, title);
4420
4598
  };
4421
4599
 
@@ -4661,17 +4839,18 @@
4661
4839
  * Copyright 2022 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
4662
4840
  * Copyright 2022 - Finnish Meteorological Institute (FMI)
4663
4841
  * */
4842
+ var TOOLTIP_TITLE = 'Import TAC';
4664
4843
 
4665
4844
  var ExportButton = function ExportButton(_a) {
4666
4845
  var onClick = _a.onClick,
4667
4846
  isHidden = _a.isHidden;
4668
4847
  return isHidden ? null : /*#__PURE__*/React__default["default"].createElement(material.Tooltip, {
4669
- title: "Import TAC",
4848
+ title: TOOLTIP_TITLE,
4670
4849
  placement: "left"
4671
- }, /*#__PURE__*/React__default["default"].createElement("span", null, /*#__PURE__*/React__default["default"].createElement(shared.ToolButton, {
4850
+ }, /*#__PURE__*/React__default["default"].createElement(shared.ToolButton, {
4672
4851
  onClick: onClick,
4673
4852
  "data-testid": "export-tac-button"
4674
- }, /*#__PURE__*/React__default["default"].createElement(theme.Export, null))));
4853
+ }, /*#__PURE__*/React__default["default"].createElement(theme.Export, null)));
4675
4854
  };
4676
4855
 
4677
4856
  /* *
@@ -4962,7 +5141,7 @@
4962
5141
  },
4963
5142
  position: 'absolute',
4964
5143
  right: '8px',
4965
- top: '30px'
5144
+ top: '48px'
4966
5145
  }
4967
5146
  }, /*#__PURE__*/React__namespace.createElement(theme.ListItem, null)), /*#__PURE__*/React__namespace.createElement(material.Dialog, {
4968
5147
  open: isOpen,
@@ -5075,7 +5254,8 @@
5075
5254
  paddingTop: '32px'
5076
5255
  }
5077
5256
  }, tafList.map(function (_a, index) {
5078
- var taf = _a.taf;
5257
+ var taf = _a.taf,
5258
+ editor = _a.editor;
5079
5259
  return /*#__PURE__*/React__namespace.createElement(material.MenuItem, {
5080
5260
  key: taf.uuid,
5081
5261
  selected: index === activeIndex,
@@ -5100,8 +5280,18 @@
5100
5280
  onClick: function onClick() {
5101
5281
  return onChangeTab(index);
5102
5282
  }
5103
- }, /*#__PURE__*/React__namespace.createElement(Box__default["default"], {
5283
+ }, editor && /*#__PURE__*/React__namespace.createElement(Box__default["default"], {
5284
+ sx: {
5285
+ position: 'absolute',
5286
+ top: '4px',
5287
+ left: '8px'
5288
+ }
5289
+ }, /*#__PURE__*/React__namespace.createElement(TafAvatar, {
5290
+ editor: editor,
5291
+ tooltipPlacement: "right"
5292
+ })), /*#__PURE__*/React__namespace.createElement(Box__default["default"], {
5104
5293
  component: "span",
5294
+ "data-testid": "taf-location",
5105
5295
  sx: {
5106
5296
  fontSize: '12px',
5107
5297
  fontWeight: '500',
@@ -5158,15 +5348,29 @@
5158
5348
  return 'NEW';
5159
5349
  }
5160
5350
  };
5351
+ var isWarning = function isWarning(error) {
5352
+ return (error === null || error === void 0 ? void 0 : error.type) === 'WARNING';
5353
+ };
5161
5354
 
5162
5355
  var parseErrorMessage = function parseErrorMessage(error, params) {
5356
+ var message = shared.getErrorMessage(error);
5357
+ var warningMessage = shared.getWarningMessage(error);
5358
+
5359
+ if (warningMessage) {
5360
+ return {
5361
+ type: 'WARNING',
5362
+ title: warningMessage
5363
+ };
5364
+ }
5365
+
5163
5366
  return params.changeStatusTo === 'CANCELLED' ? {
5164
5367
  type: 'CANCELLED',
5165
- title: 'Cancelling this TAF failed, please try again'
5368
+ title: 'Cancelling this TAF failed, please try again',
5369
+ message: message
5166
5370
  } : {
5167
5371
  type: 'SERVER',
5168
5372
  title: 'An error has occurred while saving, please try again',
5169
- message: shared.isAxiosError(error) ? shared.getAxiosErrorMessage(error) : error.message
5373
+ message: message
5170
5374
  };
5171
5375
  };
5172
5376
 
@@ -5251,19 +5455,24 @@
5251
5455
  postTaf = _c === void 0 ? function () {
5252
5456
  return null;
5253
5457
  } : _c,
5254
- _d = _a.isIssuesPaneOpen,
5255
- isIssuesPaneOpen = _d === void 0 ? false : _d,
5256
- _e = _a.setIsIssuesPaneOpen,
5257
- setIsIssuesPaneOpen = _e === void 0 ? function () {
5458
+ _d = _a.patchTaf,
5459
+ patchTaf = _d === void 0 ? function () {
5460
+ return null;
5461
+ } : _d,
5462
+ _e = _a.isIssuesPaneOpen,
5463
+ isIssuesPaneOpen = _e === void 0 ? false : _e,
5464
+ _f = _a.setIsIssuesPaneOpen,
5465
+ setIsIssuesPaneOpen = _f === void 0 ? function () {
5258
5466
  return null;
5259
- } : _e,
5260
- _f = _a.isFormDisabled,
5261
- isFormDisabled = _f === void 0 ? false : _f,
5262
- _g = _a.setIsFormDisabled,
5263
- setIsFormDisabled = _g === void 0 ? function () {
5467
+ } : _f,
5468
+ _g = _a.isFormDisabled,
5469
+ isFormDisabled = _g === void 0 ? false : _g,
5470
+ _h = _a.setIsFormDisabled,
5471
+ setIsFormDisabled = _h === void 0 ? function () {
5264
5472
  return null;
5265
- } : _g,
5473
+ } : _h,
5266
5474
  error = _a.error;
5475
+ var severity = isWarning(error) ? 'warning' : 'error';
5267
5476
 
5268
5477
  var onTafAction = function onTafAction(action, taf) {
5269
5478
  return __awaiter(void 0, void 0, void 0, function () {
@@ -5364,7 +5573,10 @@
5364
5573
  index: index,
5365
5574
  "data-testid": "taf-panel" + (activeTafIndex === index ? '-active' : '')
5366
5575
  }, /*#__PURE__*/React__default["default"].createElement(TafHeader, {
5367
- title: getTafStatusLabel(tafFromBackend.taf.status)
5576
+ title: getTafStatusLabel(tafFromBackend.taf.status),
5577
+ sx: {
5578
+ marginBottom: '4px'
5579
+ }
5368
5580
  }), isLoading && /*#__PURE__*/React__default["default"].createElement(Spinner, {
5369
5581
  "data-testid": "taf-loading",
5370
5582
  sx: {
@@ -5373,7 +5585,7 @@
5373
5585
  color: 'geowebColors.backdrops.white.fill'
5374
5586
  }
5375
5587
  }), error && /*#__PURE__*/React__default["default"].createElement(shared.AlertBanner, {
5376
- severity: "error",
5588
+ severity: severity,
5377
5589
  title: error.title,
5378
5590
  info: error.message,
5379
5591
  dataTestId: "taf-error",
@@ -5389,7 +5601,8 @@
5389
5601
  isIssuesPaneOpen: isIssuesPaneOpen,
5390
5602
  setIsIssuesPaneOpen: setIsIssuesPaneOpen,
5391
5603
  isDisabled: isFormDisabled,
5392
- setIsDisabled: setIsFormDisabled
5604
+ setIsDisabled: setIsFormDisabled,
5605
+ onSwitchEditor: patchTaf
5393
5606
  })));
5394
5607
  };
5395
5608
 
@@ -5401,6 +5614,57 @@
5401
5614
  }, props));
5402
5615
  };
5403
5616
 
5617
+ /* *
5618
+ * Licensed under the Apache License, Version 2.0 (the "License");
5619
+ * you may not use this file except in compliance with the License.
5620
+ * You may obtain a copy of the License at
5621
+ *
5622
+ * http://www.apache.org/licenses/LICENSE-2.0
5623
+ *
5624
+ * Unless required by applicable law or agreed to in writing, software
5625
+ * distributed under the License is distributed on an "AS IS" BASIS,
5626
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
5627
+ * See the License for the specific language governing permissions and
5628
+ * limitations under the License.
5629
+ *
5630
+ * Copyright 2022 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
5631
+ * Copyright 2022 - Finnish Meteorological Institute (FMI)
5632
+ * */
5633
+ var getLastUpdateTitle = function getLastUpdateTitle(time) {
5634
+ return "Last updated " + time;
5635
+ };
5636
+
5637
+ var LastUpdateTime = function LastUpdateTime(_a) {
5638
+ var _b = _a.onUpdateTaf,
5639
+ onUpdateTaf = _b === void 0 ? function () {} : _b,
5640
+ lastUpdateTime = _a.lastUpdateTime;
5641
+ return /*#__PURE__*/React__default["default"].createElement(material.Box, {
5642
+ sx: {
5643
+ display: 'flex',
5644
+ alignItems: 'center',
5645
+ height: '100%',
5646
+ justifyContent: 'flex-end'
5647
+ }
5648
+ }, /*#__PURE__*/React__default["default"].createElement(material.Typography, {
5649
+ sx: {
5650
+ color: 'geowebColors.captions.captionStatus.rgba',
5651
+ fontSize: '10px',
5652
+ lineHeight: '1.6',
5653
+ letterSpacing: '0.33px'
5654
+ },
5655
+ "data-testid": "lastupdated-time"
5656
+ }, getLastUpdateTitle(lastUpdateTime)), /*#__PURE__*/React__default["default"].createElement(material.Tooltip, {
5657
+ title: "Click to refresh"
5658
+ }, /*#__PURE__*/React__default["default"].createElement(shared.ToolButton, {
5659
+ "data-testid": "updateTafBtn",
5660
+ onClick: onUpdateTaf,
5661
+ sx: {
5662
+ marginRight: 1,
5663
+ marginLeft: 1
5664
+ }
5665
+ }, /*#__PURE__*/React__default["default"].createElement(theme.Cached, null))));
5666
+ };
5667
+
5404
5668
  var CONFIRM_DIALOG_OPTIONS = {
5405
5669
  title: 'Whoops',
5406
5670
  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.",
@@ -5410,8 +5674,9 @@
5410
5674
  var TafLayout = function TafLayout(_a) {
5411
5675
  var _b = _a.tafList,
5412
5676
  tafList = _b === void 0 ? [] : _b,
5413
- _c = _a.onPostTaf,
5414
- onPostTaf = _c === void 0 ? function () {} : _c;
5677
+ _c = _a.onUpdateTaf,
5678
+ onUpdateTaf = _c === void 0 ? function () {} : _c,
5679
+ lastUpdateTime = _a.lastUpdateTime;
5415
5680
  var api$1 = api.useApiContext().api;
5416
5681
  var confirmDialog = shared.useConfirmationDialog();
5417
5682
 
@@ -5424,45 +5689,56 @@
5424
5689
  var _e = usePostTafRequest(api$1.postTaf),
5425
5690
  isLoading = _e.isLoading,
5426
5691
  postTafRequest = _e.doRequest,
5427
- error = _e.error,
5428
- setError = _e.setError;
5692
+ postError = _e.error;
5429
5693
 
5430
- var _f = useTafModuleContext(),
5431
- onValidateForm = _f.onValidateForm,
5432
- tafAction = _f.tafAction,
5433
- isFormDirty = _f.isFormDirty;
5694
+ var _f = usePostTafRequest(api$1.patchTaf),
5695
+ patchTafRequest = _f.doRequest,
5696
+ patchError = _f.error;
5434
5697
 
5435
- var _g = __read(React__default["default"].useState(sortTafTimeSlots(tafList)), 2),
5436
- _h = _g[0],
5437
- upcoming = _h.upcoming,
5438
- current = _h.current,
5439
- expired = _h.expired,
5440
- updateSortedTafs = _g[1];
5698
+ var _g = useTafModuleContext(),
5699
+ onValidateForm = _g.onValidateForm,
5700
+ tafAction = _g.tafAction,
5701
+ isFormDirty = _g.isFormDirty;
5441
5702
 
5442
- var _j = __read(current.slice(-1), 1),
5443
- lastCurrentTaf = _j[0];
5703
+ var _h = __read(React__default["default"].useState(sortTafTimeSlots(tafList)), 2),
5704
+ _j = _h[0],
5705
+ upcoming = _j.upcoming,
5706
+ current = _j.current,
5707
+ expired = _j.expired,
5708
+ updateSortedTafs = _h[1];
5444
5709
 
5445
- var _k = __read(React__default["default"].useState('UPCOMING'), 2),
5446
- timeSlot = _k[0],
5447
- setTimeSlot = _k[1];
5710
+ var _k = __read(current.slice(-1), 1),
5711
+ lastCurrentTaf = _k[0];
5448
5712
 
5449
- var _l = __read(React__default["default"].useState(upcoming), 2),
5450
- locations = _l[0],
5451
- setLocations = _l[1];
5713
+ var _l = __read(React__default["default"].useState('UPCOMING'), 2),
5714
+ timeSlot = _l[0],
5715
+ setTimeSlot = _l[1];
5452
5716
 
5453
- var _m = __read(React__default["default"].useState(0), 2),
5454
- activeTafIndex = _m[0],
5455
- setActiveTafIndex = _m[1];
5717
+ var _m = __read(React__default["default"].useState(upcoming), 2),
5718
+ locations = _m[0],
5719
+ setLocations = _m[1];
5456
5720
 
5457
- var _o = __read(React__default["default"].useState(false), 2),
5458
- isFormDisabled = _o[0],
5459
- setIsFormDisabled = _o[1];
5721
+ var _o = __read(React__default["default"].useState(0), 2),
5722
+ activeTafIndex = _o[0],
5723
+ setActiveTafIndex = _o[1];
5724
+
5725
+ var _p = __read(React__default["default"].useState(false), 2),
5726
+ isFormDisabled = _p[0],
5727
+ setIsFormDisabled = _p[1];
5728
+
5729
+ var _q = __read(React__default["default"].useState(), 2),
5730
+ error = _q[0],
5731
+ setError = _q[1];
5460
5732
 
5461
5733
  var postTaf = function postTaf(data) {
5462
5734
  return __awaiter(void 0, void 0, void 0, function () {
5735
+ var error_1;
5463
5736
  return __generator(this, function (_a) {
5464
5737
  switch (_a.label) {
5465
5738
  case 0:
5739
+ _a.trys.push([0, 2,, 3]);
5740
+
5741
+ setError(null);
5466
5742
  return [4
5467
5743
  /*yield*/
5468
5744
  , postTafRequest(data)];
@@ -5471,7 +5747,57 @@
5471
5747
  _a.sent(); // callback
5472
5748
 
5473
5749
 
5474
- onPostTaf();
5750
+ onUpdateTaf();
5751
+ return [3
5752
+ /*break*/
5753
+ , 3];
5754
+
5755
+ case 2:
5756
+ error_1 = _a.sent();
5757
+
5758
+ if (isWarning(error_1)) {
5759
+ onUpdateTaf();
5760
+ }
5761
+
5762
+ throw error_1;
5763
+
5764
+ case 3:
5765
+ return [2
5766
+ /*return*/
5767
+ ];
5768
+ }
5769
+ });
5770
+ });
5771
+ };
5772
+
5773
+ var patchTaf = function patchTaf(data) {
5774
+ return __awaiter(void 0, void 0, void 0, function () {
5775
+ return __generator(this, function (_a) {
5776
+ switch (_a.label) {
5777
+ case 0:
5778
+ _a.trys.push([0, 2,, 3]);
5779
+
5780
+ setError(null);
5781
+ return [4
5782
+ /*yield*/
5783
+ , patchTafRequest(data)];
5784
+
5785
+ case 1:
5786
+ _a.sent(); // callback
5787
+
5788
+
5789
+ onUpdateTaf();
5790
+ return [2
5791
+ /*return*/
5792
+ , true];
5793
+
5794
+ case 2:
5795
+ _a.sent();
5796
+ return [2
5797
+ /*return*/
5798
+ , false];
5799
+
5800
+ case 3:
5475
5801
  return [2
5476
5802
  /*return*/
5477
5803
  ];
@@ -5573,7 +5899,8 @@
5573
5899
  setActiveTafIndex(newIndex); // eslint-disable-next-line react-hooks/exhaustive-deps
5574
5900
  }, [tafList, setLocations]);
5575
5901
  React__default["default"].useEffect(function () {
5576
- var cancelErrorTimeout = error && error.type === 'CANCELLED' ? setTimeout(function () {
5902
+ setError(postError);
5903
+ var cancelErrorTimeout = postError && postError.type === 'CANCELLED' ? setTimeout(function () {
5577
5904
  setError(null);
5578
5905
  }, 10000) : null;
5579
5906
  return function () {
@@ -5581,7 +5908,10 @@
5581
5908
  clearTimeout(cancelErrorTimeout);
5582
5909
  }
5583
5910
  };
5584
- }, [error, setError]);
5911
+ }, [postError]);
5912
+ React__default["default"].useEffect(function () {
5913
+ setError(patchError);
5914
+ }, [patchError]);
5585
5915
 
5586
5916
  if (!tafList) {
5587
5917
  return null;
@@ -5627,6 +5957,13 @@
5627
5957
  tafFromBackend: lastCurrentTaf,
5628
5958
  timeSlot: timeSlot,
5629
5959
  onChangeTimeSlot: onChangeTimeSlot
5960
+ })), /*#__PURE__*/React__default["default"].createElement(material.Grid, {
5961
+ item: true,
5962
+ xs: 12,
5963
+ sm: 3
5964
+ }, lastUpdateTime && /*#__PURE__*/React__default["default"].createElement(LastUpdateTime, {
5965
+ lastUpdateTime: lastUpdateTime,
5966
+ onUpdateTaf: onUpdateTaf
5630
5967
  }))), /*#__PURE__*/React__default["default"].createElement(material.Grid, {
5631
5968
  container: true,
5632
5969
  flexGrow: 1,
@@ -5676,6 +6013,7 @@
5676
6013
  isFormDisabled: isFormDisabled,
5677
6014
  setIsFormDisabled: setIsFormDisabled,
5678
6015
  postTaf: postTaf,
6016
+ patchTaf: patchTaf,
5679
6017
  isLoading: isLoading,
5680
6018
  error: error
5681
6019
  });
@@ -5717,23 +6055,80 @@
5717
6055
  }, children)));
5718
6056
  };
5719
6057
 
6058
+ var getCurrentDate = function getCurrentDate() {
6059
+ return moment__default["default"].utc().format('HH:mm');
6060
+ };
6061
+
5720
6062
  var TafModule = function TafModule() {
5721
6063
  var api$1 = api.useApiContext().api;
5722
6064
 
5723
- var _a = api.useApi(api$1.getTafList),
5724
- getTafListError = _a.error,
5725
- isLoading = _a.isLoading,
5726
- tafList = _a.result,
5727
- fetchNewTafList = _a.fetchApiData;
6065
+ var _a = __read(React__namespace.useState([]), 2),
6066
+ tafList = _a[0],
6067
+ setTafList = _a[1];
5728
6068
 
5729
- shared.usePoller([tafList, getTafListError], function () {
5730
- return fetchNewTafList({});
5731
- });
6069
+ var _b = __read(React__namespace.useState(true), 2),
6070
+ isLoading = _b[0],
6071
+ setIsLoading = _b[1];
6072
+
6073
+ var _c = __read(React__namespace.useState(null), 2),
6074
+ getTafListError = _c[0],
6075
+ setError = _c[1];
5732
6076
 
5733
- var onPostTaf = function onPostTaf() {
5734
- fetchNewTafList({});
6077
+ var _d = __read(React__namespace.useState(), 2),
6078
+ lastUpdateTime = _d[0],
6079
+ setLastUpdateTime = _d[1];
6080
+
6081
+ var fetchNewTafList = function fetchNewTafList() {
6082
+ return __awaiter(void 0, void 0, void 0, function () {
6083
+ var result, error_1;
6084
+ return __generator(this, function (_a) {
6085
+ switch (_a.label) {
6086
+ case 0:
6087
+ setIsLoading(true);
6088
+ setError(null);
6089
+ _a.label = 1;
6090
+
6091
+ case 1:
6092
+ _a.trys.push([1, 3,, 4]);
6093
+
6094
+ return [4
6095
+ /*yield*/
6096
+ , api$1.getTafList()];
6097
+
6098
+ case 2:
6099
+ result = _a.sent();
6100
+ setTafList(result.data);
6101
+ setIsLoading(false);
6102
+ setLastUpdateTime(getCurrentDate());
6103
+ return [3
6104
+ /*break*/
6105
+ , 4];
6106
+
6107
+ case 3:
6108
+ error_1 = _a.sent();
6109
+ setError(error_1);
6110
+ setIsLoading(false);
6111
+ return [3
6112
+ /*break*/
6113
+ , 4];
6114
+
6115
+ case 4:
6116
+ return [2
6117
+ /*return*/
6118
+ ];
6119
+ }
6120
+ });
6121
+ });
5735
6122
  };
5736
6123
 
6124
+ var onUpdateTaf = function onUpdateTaf() {
6125
+ fetchNewTafList();
6126
+ };
6127
+
6128
+ React__namespace.useEffect(function () {
6129
+ fetchNewTafList(); // eslint-disable-next-line react-hooks/exhaustive-deps
6130
+ }, []);
6131
+ shared.usePoller([tafList, getTafListError], fetchNewTafList);
5737
6132
  var hasTafListError = getTafListError !== null;
5738
6133
  return /*#__PURE__*/React__namespace.createElement(material.Box, {
5739
6134
  component: "div",
@@ -5758,7 +6153,8 @@
5758
6153
  }
5759
6154
  }), /*#__PURE__*/React__namespace.createElement(TafLayout, {
5760
6155
  tafList: tafList,
5761
- onPostTaf: onPostTaf
6156
+ onUpdateTaf: onUpdateTaf,
6157
+ lastUpdateTime: lastUpdateTime
5762
6158
  }));
5763
6159
  };
5764
6160
 
@@ -5766,10 +6162,8 @@
5766
6162
  return /*#__PURE__*/React__namespace.createElement(TafWrapper, __assign({}, props), /*#__PURE__*/React__namespace.createElement(TafModule, null));
5767
6163
  };
5768
6164
 
5769
- var createApi$1 = function createApi(url, appUrl, auth, setAuth, authTokenUrl, authClientId) {
5770
- var axiosInstance = api.createApiInstance(url, appUrl, auth, setAuth, authTokenUrl, authClientId);
6165
+ var getApiRoutes$1 = function getApiRoutes(axiosInstance) {
5771
6166
  return {
5772
- // api data
5773
6167
  getTafList: function getTafList() {
5774
6168
  return axiosInstance.get('/taflist');
5775
6169
  },
@@ -5780,10 +6174,37 @@
5780
6174
  return axiosInstance.post.apply(axiosInstance, __spreadArray(['/taf2tac'], __read(__spreadArray([__assign({}, tafData)], __read(signal ? [{
5781
6175
  signal: signal
5782
6176
  }] : [])))));
6177
+ },
6178
+ patchTaf: function patchTaf(formData) {
6179
+ return axiosInstance.patch('/taf', __assign({}, formData));
5783
6180
  }
5784
6181
  };
5785
6182
  };
5786
6183
 
6184
+ var createApi$1 = function createApi(url, appUrl, auth, setAuth, authTokenUrl, authClientId) {
6185
+ var axiosInstance = api.createApiInstance(url, appUrl, auth, setAuth, authTokenUrl, authClientId);
6186
+ return getApiRoutes$1(axiosInstance);
6187
+ };
6188
+
6189
+ /* *
6190
+ * Licensed under the Apache License, Version 2.0 (the "License");
6191
+ * you may not use this file except in compliance with the License.
6192
+ * You may obtain a copy of the License at
6193
+ *
6194
+ * http://www.apache.org/licenses/LICENSE-2.0
6195
+ *
6196
+ * Unless required by applicable law or agreed to in writing, software
6197
+ * distributed under the License is distributed on an "AS IS" BASIS,
6198
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
6199
+ * See the License for the specific language governing permissions and
6200
+ * limitations under the License.
6201
+ *
6202
+ * Copyright 2022 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
6203
+ * Copyright 2022 - Finnish Meteorological Institute (FMI)
6204
+ * */
6205
+
6206
+ var MOCK_USERNAME = 'user.name';
6207
+
5787
6208
  var currentDate = moment__default["default"].utc().format('YYYY-MM-DD');
5788
6209
  var tomorrowDate = moment__default["default"].utc().add(1, 'day').format('YYYY-MM-DD');
5789
6210
  var airportPeriod = 6;
@@ -5819,6 +6240,7 @@
5819
6240
  var fakeTafList = [{
5820
6241
  creationDate: upcomingValidDateStart,
5821
6242
  canbe: ['DRAFTED', 'DISCARDED', 'PUBLISHED'],
6243
+ editor: MOCK_USERNAME,
5822
6244
  taf: {
5823
6245
  uuid: '5f9583fjdf0f337925',
5824
6246
  baseTime: upcomingValidDateStart,
@@ -5838,6 +6260,7 @@
5838
6260
  }, {
5839
6261
  creationDate: upcomingValidDateStart,
5840
6262
  canbe: ['DRAFTED', 'DISCARDED', 'PUBLISHED'],
6263
+ editor: null,
5841
6264
  taf: {
5842
6265
  uuid: '5f9583fjd111137925',
5843
6266
  baseTime: upcomingValidDateStart,
@@ -5863,6 +6286,7 @@
5863
6286
  }, {
5864
6287
  creationDate: upcomingValidDateStart,
5865
6288
  canbe: ['CANCELLED', 'AMENDED', 'DISCARDED'],
6289
+ editor: null,
5866
6290
  taf: {
5867
6291
  uuid: '754905485',
5868
6292
  baseTime: upcomingValidDateStart,
@@ -5920,6 +6344,7 @@
5920
6344
  }, {
5921
6345
  creationDate: upcomingValidDateStart,
5922
6346
  canbe: ['CANCELLED', 'AMENDED', 'CORRECTED'],
6347
+ editor: MOCK_USERNAME,
5923
6348
  taf: {
5924
6349
  uuid: '43545345345',
5925
6350
  issueDate: upcomingValidDateStart,
@@ -5990,6 +6415,7 @@
5990
6415
  }, {
5991
6416
  creationDate: upcomingValidDateStart,
5992
6417
  canbe: ['CANCELLED', 'AMENDED', 'CORRECTED'],
6418
+ editor: null,
5993
6419
  taf: {
5994
6420
  uuid: '5f9583fjdf45ff4330f337925',
5995
6421
  issueDate: upcomingValidDateStart,
@@ -6045,6 +6471,7 @@
6045
6471
  }, {
6046
6472
  creationDate: upcomingValidDateStart,
6047
6473
  canbe: ['AMENDED'],
6474
+ editor: null,
6048
6475
  taf: {
6049
6476
  uuid: '5464565464',
6050
6477
  previousId: '5445fghrfg3546456',
@@ -6086,6 +6513,7 @@
6086
6513
  }, {
6087
6514
  creationDate: upcomingValidDateStart,
6088
6515
  canbe: ['CANCELLED', 'AMENDED', 'CORRECTED'],
6516
+ editor: 'max.jansen',
6089
6517
  taf: {
6090
6518
  uuid: 'gh56734fghfgh',
6091
6519
  previousId: '8574jnf93475',
@@ -6127,6 +6555,7 @@
6127
6555
  }, {
6128
6556
  creationDate: currentValidDateStart,
6129
6557
  canbe: ['CANCELLED', 'AMENDED', 'CORRECTED'],
6558
+ editor: null,
6130
6559
  taf: {
6131
6560
  uuid: 'giskdj09845872039',
6132
6561
  issueDate: currentValidDateStart,
@@ -6166,6 +6595,7 @@
6166
6595
  }, {
6167
6596
  creationDate: currentValidDateStart,
6168
6597
  canbe: ['DRAFTED', 'DISCARDED', 'PUBLISHED'],
6598
+ editor: null,
6169
6599
  taf: {
6170
6600
  uuid: 'ghskdj09845872039',
6171
6601
  baseTime: currentValidDateStart,
@@ -6185,6 +6615,7 @@
6185
6615
  }, {
6186
6616
  creationDate: currentValidDateStart,
6187
6617
  canbe: ['DRAFTED', 'DISCARDED', 'PUBLISHED'],
6618
+ editor: null,
6188
6619
  taf: {
6189
6620
  uuid: 'ghskdj09845872040',
6190
6621
  issueDate: currentValidDateStart,
@@ -6205,6 +6636,7 @@
6205
6636
  }, {
6206
6637
  creationDate: currentDate + "T06:00:00Z",
6207
6638
  canbe: ['DRAFTED', 'DISCARDED', 'PUBLISHED'],
6639
+ editor: null,
6208
6640
  taf: {
6209
6641
  uuid: 'ghskdj09845872041',
6210
6642
  issueDate: currentValidDateStart,
@@ -6225,6 +6657,7 @@
6225
6657
  }, {
6226
6658
  creationDate: currentDate + "T06:00:00Z",
6227
6659
  canbe: ['DRAFTED', 'DISCARDED', 'PUBLISHED'],
6660
+ editor: null,
6228
6661
  taf: {
6229
6662
  uuid: 'ghskdj09845872042',
6230
6663
  issueDate: currentValidDateStart,
@@ -6245,6 +6678,7 @@
6245
6678
  }, {
6246
6679
  creationDate: currentDate + "T06:00:00Z",
6247
6680
  canbe: ['DRAFTED', 'DISCARDED', 'PUBLISHED'],
6681
+ editor: null,
6248
6682
  taf: {
6249
6683
  uuid: 'ghskdj09845872043',
6250
6684
  issueDate: currentValidDateStart,
@@ -6265,6 +6699,7 @@
6265
6699
  }, {
6266
6700
  creationDate: expiredValidDateStart,
6267
6701
  canbe: [],
6702
+ editor: null,
6268
6703
  taf: {
6269
6704
  uuid: 'sdkjhsdf90845890',
6270
6705
  issueDate: expiredValidDateStart,
@@ -6329,6 +6764,7 @@
6329
6764
  var fakeNewTaf = {
6330
6765
  creationDate: currentDate + "T12:00:00Z",
6331
6766
  canbe: ['DRAFTED', 'DISCARDED', 'PUBLISHED'],
6767
+ editor: null,
6332
6768
  taf: {
6333
6769
  type: 'NORMAL',
6334
6770
  messageType: 'ORG',
@@ -6349,6 +6785,7 @@
6349
6785
  ({
6350
6786
  creationDate: "2022-01-06T12:00:00Z",
6351
6787
  canbe: ['DRAFTED', 'DISCARDED', 'PUBLISHED'],
6788
+ editor: MOCK_USERNAME,
6352
6789
  taf: __assign(__assign({}, fakeNewTaf.taf), {
6353
6790
  baseTime: "2022-01-06T12:00:00Z",
6354
6791
  validDateStart: "2022-01-06T12:00:00Z",
@@ -6364,6 +6801,7 @@
6364
6801
  var fakePublishedTaf = {
6365
6802
  creationDate: currentDate + "T12:00:00Z",
6366
6803
  canbe: ['CANCELLED', 'AMENDED', 'CORRECTED'],
6804
+ editor: null,
6367
6805
  taf: {
6368
6806
  uuid: 'slsdkjg-023895',
6369
6807
  issueDate: currentDate + "T12:00:00Z",
@@ -6439,7 +6877,9 @@
6439
6877
  ({
6440
6878
  creationDate: "2022-01-06T12:00:00Z",
6441
6879
  canbe: ['CANCELLED', 'AMENDED', 'CORRECTED'],
6880
+ editor: MOCK_USERNAME,
6442
6881
  taf: __assign(__assign({}, fakePublishedTaf.taf), {
6882
+ uuid: 'sowi3u4o-lsdjflsk',
6443
6883
  location: 'EHGG',
6444
6884
  baseTime: "2022-01-06T12:00:00Z",
6445
6885
  issueDate: "2022-01-06T12:00:00Z",
@@ -6504,6 +6944,7 @@
6504
6944
  var fakeDraftTaf = {
6505
6945
  creationDate: currentDate + "T18:00:00Z",
6506
6946
  canbe: ['DRAFTED', 'DISCARDED', 'PUBLISHED'],
6947
+ editor: null,
6507
6948
  taf: {
6508
6949
  uuid: '5f9583fjdf0f337925',
6509
6950
  baseTime: currentDate + "T18:00:00Z",
@@ -6542,6 +6983,7 @@
6542
6983
  ({
6543
6984
  creationDate: "2022-01-06T18:00:00Z",
6544
6985
  canbe: ['DRAFTED', 'DISCARDED', 'PUBLISHED'],
6986
+ editor: MOCK_USERNAME,
6545
6987
  taf: __assign(__assign({}, fakeDraftTaf.taf), {
6546
6988
  baseTime: "2022-01-06T18:00:00Z",
6547
6989
  validDateStart: "2022-01-06T18:00:00Z",
@@ -6557,6 +6999,7 @@
6557
6999
  var fakeDraftAmendmentTaf = {
6558
7000
  creationDate: currentDate + "T14:00:00Z",
6559
7001
  canbe: ['DRAFTED', 'DISCARDED', 'PUBLISHED'],
7002
+ editor: null,
6560
7003
  taf: {
6561
7004
  uuid: '954905487',
6562
7005
  previousId: '5f9583fjdf45ff4330f337925',
@@ -6617,6 +7060,7 @@
6617
7060
  ({
6618
7061
  creationDate: "2022-01-06T14:00:00Z",
6619
7062
  canbe: ['DRAFTED', 'DISCARDED', 'PUBLISHED'],
7063
+ editor: null,
6620
7064
  taf: __assign(__assign({}, fakeDraftAmendmentTaf.taf), {
6621
7065
  location: 'EHRD',
6622
7066
  issueDate: "2022-01-06T14:00:00Z",
@@ -6637,6 +7081,7 @@
6637
7081
  var fakeAmendmentTaf = {
6638
7082
  creationDate: currentDate + "T14:00:00Z",
6639
7083
  canbe: ['CANCELLED', 'CORRECTED', 'AMENDED'],
7084
+ editor: null,
6640
7085
  taf: {
6641
7086
  uuid: '754905486',
6642
7087
  previousId: '5f9583fjdf45ff4330f337925',
@@ -6680,6 +7125,7 @@
6680
7125
  ({
6681
7126
  creationDate: "2022-01-06T14:00:00Z",
6682
7127
  canbe: ['CANCELLED', 'CORRECTED', 'AMENDED'],
7128
+ editor: MOCK_USERNAME,
6683
7129
  taf: __assign(__assign({}, fakeAmendmentTaf.taf), {
6684
7130
  uuid: '7549058980',
6685
7131
  issueDate: "2022-01-06T14:00:00Z",
@@ -6699,42 +7145,23 @@
6699
7145
 
6700
7146
  var fakeTafTac = 'TAF EHAM 0812/0918 20020G35KT 0500 SN BKN040\nBECMG 0814/0816 0700 BKN001=';
6701
7147
 
6702
- var fakePromise = function fakePromise(withRandomError, signal) {
6703
- if (signal === void 0) {
6704
- signal = null;
6705
- }
7148
+ var fakeUpdatedTafList = __spreadArray([], __read(fakeTafList));
6706
7149
 
6707
- return new Promise(function (resolve, reject) {
6708
- var timer = setTimeout(function () {
6709
- if (!withRandomError) return resolve();
6710
- var randomError = Math.floor(Math.random() * 4) + 1;
6711
- return randomError === 4 ? reject(new Error('something went wrong')) : resolve();
6712
- }, 300);
6713
- signal === null || signal === void 0 ? void 0 : signal.signal.addEventListener('abort', function () {
6714
- clearTimeout(timer);
6715
- reject(new Error('canceled'));
6716
- });
6717
- });
7150
+ var setFakeUpdatedList = function setFakeUpdatedList(newList) {
7151
+ fakeUpdatedTafList = newList;
6718
7152
  };
6719
-
6720
- var fakeAxiosInstance = {
6721
- // eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars, @typescript-eslint/explicit-module-boundary-types
6722
- get: function get(_url, _params) {
6723
- return fakePromise(false);
6724
- },
6725
- // eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars, @typescript-eslint/explicit-module-boundary-types
6726
- post: function post(_url, _params, _signal) {
6727
- return fakePromise(false, _signal);
6728
- }
7153
+ var getFakeUpdatedList = function getFakeUpdatedList() {
7154
+ return fakeUpdatedTafList;
6729
7155
  };
6730
- var createApi = function createApi() {
7156
+
7157
+ var getApiRoutes = function getApiRoutes(axiosInstance) {
6731
7158
  return {
6732
7159
  getTafList: function getTafList() {
6733
7160
  // eslint-disable-next-line no-console
6734
7161
  console.log('Retrieving new TAF list');
6735
- return fakeAxiosInstance.get('/taflist').then(function () {
7162
+ return axiosInstance.get('/taflist').then(function () {
6736
7163
  return {
6737
- data: __spreadArray([], __read(fakeTafList))
7164
+ data: getFakeUpdatedList()
6738
7165
  };
6739
7166
  });
6740
7167
  },
@@ -6743,20 +7170,40 @@
6743
7170
  console.log("The new status of the taf will be " + _postTaf.changeStatusTo); // eslint-disable-next-line no-console
6744
7171
 
6745
7172
  console.log('form has been posted with following values:', _postTaf.taf);
6746
- return fakeAxiosInstance.post('/taf', _postTaf);
7173
+ return axiosInstance.post('/taf', _postTaf);
6747
7174
  },
6748
- getTAC: function getTAC(tafData, signal) {
6749
- return fakeAxiosInstance.post.apply(fakeAxiosInstance, __spreadArray(['/taf2tac'], __read(__spreadArray([__assign({}, tafData)], __read(signal ? [{
7175
+ getTAC: function getTAC(taf, signal) {
7176
+ return axiosInstance.post.apply(axiosInstance, __spreadArray(['/taf2tac'], __read(__spreadArray([__assign({}, taf)], __read(signal ? [{
6750
7177
  signal: signal
6751
7178
  }] : []))))).then(function () {
6752
7179
  return {
6753
7180
  data: fakeTafTac
6754
7181
  };
6755
7182
  });
7183
+ },
7184
+ patchTaf: function patchTaf(_patchTaf) {
7185
+ var updatedList = getFakeUpdatedList().map(function (tafFromBackend) {
7186
+ if (tafFromBackend.taf.uuid === _patchTaf.taf.uuid) {
7187
+ return __assign(__assign({}, tafFromBackend), {
7188
+ editor: _patchTaf.editor
7189
+ });
7190
+ }
7191
+
7192
+ return tafFromBackend;
7193
+ });
7194
+ setFakeUpdatedList(updatedList); // eslint-disable-next-line no-console
7195
+
7196
+ console.log("The new editor of the taf will be " + (_patchTaf.editor || 'empty'));
7197
+ return axiosInstance.patch('/taf', _patchTaf);
6756
7198
  }
6757
7199
  };
6758
7200
  };
6759
7201
 
7202
+ var createApi = function createApi() {
7203
+ var instance = api.createFakeApiInstance();
7204
+ return getApiRoutes(instance);
7205
+ };
7206
+
6760
7207
  /* *
6761
7208
  * Licensed under the Apache License, Version 2.0 (the "License");
6762
7209
  * you may not use this file except in compliance with the License.