@opengeoweb/taf 9.5.0 → 9.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/index.esm.js +133 -120
- package/package.json +24 -1
- package/src/lib/components/TafForm/TafFormRow/validations/validField.d.ts +1 -2
- package/src/lib/components/TafLayout/TafPanel/TafPanel.stories.d.ts +1 -0
- package/src/lib/components/TafLayout/TopTabs/TopTabs.d.ts +1 -2
- package/src/lib/components/TafLayout/utils.d.ts +2 -3
- package/src/lib/utils/dateFormats.d.ts +3 -0
- package/src/lib/components/TafLayout/LastUpdateTime/LastUpdateTime.d.ts +0 -8
- package/src/lib/components/TafLayout/LastUpdateTime/LastUpdateTime.spec.d.ts +0 -1
- package/src/lib/components/TafLayout/LastUpdateTime/LastUpdateTime.stories.d.ts +0 -13
- package/src/lib/components/TafLayout/LastUpdateTime/index.d.ts +0 -1
package/index.esm.js
CHANGED
|
@@ -7,11 +7,10 @@ import { ReactSortable } from 'react-sortablejs';
|
|
|
7
7
|
import Sortable from 'sortablejs';
|
|
8
8
|
import { useAuthenticationContext } from '@opengeoweb/authentication';
|
|
9
9
|
import { HIDDEN_INPUT_HELPER_IS_DRAFT, getDeepProperty, useDraftFormHelpers, ReactHookFormHiddenInput, ReactHookFormProvider } from '@opengeoweb/form-fields';
|
|
10
|
-
import { dateUtils, useIsMounted, CustomIconButton, CustomTooltip, ToolContainerDraggable, Avatar, getInitials, ToggleMenu, useConfirmationDialog, usePreventBrowserClose, SwitchButton, ToolHeader, AlertBanner, getErrorMessage as getErrorMessage$1, getWarningMessage, usePoller, ErrorBoundary } from '@opengeoweb/shared';
|
|
10
|
+
import { dateUtils, useIsMounted, CustomIconButton, CustomTooltip, ToolContainerDraggable, Avatar, getInitials, ToggleMenu, useConfirmationDialog, usePreventBrowserClose, SwitchButton, ToolHeader, AlertBanner, getErrorMessage as getErrorMessage$1, getWarningMessage, LastUpdateTime, usePoller, ErrorBoundary } from '@opengeoweb/shared';
|
|
11
11
|
import { snackbarActions } from '@opengeoweb/snackbar';
|
|
12
|
-
import moment from 'moment';
|
|
13
12
|
import { isEqual } from 'lodash';
|
|
14
|
-
import { DragHandle as DragHandle$1, ThumbsUp, Add, Delete, Close, Clock, Cancel, Success, Edit, Export, ListItem
|
|
13
|
+
import { DragHandle as DragHandle$1, ThumbsUp, Add, Delete, Close, Clock, Cancel, Success, Edit, Export, ListItem } from '@opengeoweb/theme';
|
|
15
14
|
import ReactDOM from 'react-dom';
|
|
16
15
|
import { useTheme } from '@emotion/react';
|
|
17
16
|
import { useApiContext, createApiInstance, createFakeApiInstance, ApiProvider } from '@opengeoweb/api';
|
|
@@ -649,14 +648,18 @@ var getFieldValue = function getFieldValue(fieldValue) {
|
|
|
649
648
|
* Copyright 2023 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
|
|
650
649
|
* Copyright 2023 - Finnish Meteorological Institute (FMI)
|
|
651
650
|
* */
|
|
652
|
-
var FORMAT_DAYS_HOURS = '
|
|
653
|
-
var FORMAT_DAYS_HOURS_MINUTES = '
|
|
651
|
+
var FORMAT_DAYS_HOURS = 'ddHH';
|
|
652
|
+
var FORMAT_DAYS_HOURS_MINUTES = 'ddHHmm';
|
|
653
|
+
var lengthFM = 6;
|
|
654
|
+
var lengthBECMGTEMPO = 9;
|
|
654
655
|
// formatters
|
|
655
656
|
var formatValidToString = function formatValidToString(valid) {
|
|
656
657
|
// Ensure end of valid period if midnight is shown as 24 and not 00
|
|
657
|
-
var endHours =
|
|
658
|
-
var endDate = endHours === '24' ?
|
|
659
|
-
|
|
658
|
+
var endHours = dateUtils.dateToString(dateUtils.utc(valid.end), 'kk');
|
|
659
|
+
var endDate = endHours === '24' ? dateUtils.dateToString(dateUtils.sub(dateUtils.utc(valid.end), {
|
|
660
|
+
days: 1
|
|
661
|
+
}), 'dd') : dateUtils.dateToString(dateUtils.utc(valid.end), 'dd');
|
|
662
|
+
return valid.end ? "".concat(dateUtils.dateToString(dateUtils.utc(valid.start), FORMAT_DAYS_HOURS), "/").concat(endDate).concat(endHours) : dateUtils.dateToString(dateUtils.utc(valid.start), FORMAT_DAYS_HOURS_MINUTES);
|
|
660
663
|
};
|
|
661
664
|
var getSections = function getSections(value, format) {
|
|
662
665
|
return {
|
|
@@ -666,19 +669,31 @@ var getSections = function getSections(value, format) {
|
|
|
666
669
|
};
|
|
667
670
|
};
|
|
668
671
|
var getValidityTimeStamp = function getValidityTimeStamp(sectionType, sections, startTaf, endTaf) {
|
|
669
|
-
var
|
|
670
|
-
|
|
672
|
+
var clonedStartTafDate = dateUtils.set(startTaf, {
|
|
673
|
+
date: sections.day,
|
|
674
|
+
hours: sections.hour,
|
|
675
|
+
minutes: sections.min,
|
|
676
|
+
seconds: 0,
|
|
677
|
+
milliseconds: 0
|
|
678
|
+
});
|
|
671
679
|
// if start and hour is the same but minutes != 00 for the startTaf - set the minutes to account for AMENDED tafs which do not start on the hour
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
680
|
+
var shouldUpdateMinutesSeconds = sectionType === 'start' && startTaf.getDate() === clonedStartTafDate.getDate() && startTaf.getUTCHours() === clonedStartTafDate.getUTCHours() && startTaf.getMinutes() !== clonedStartTafDate.getMinutes();
|
|
681
|
+
var updatedStartTafDate = shouldUpdateMinutesSeconds ? dateUtils.set(clonedStartTafDate, {
|
|
682
|
+
minutes: startTaf.getMinutes(),
|
|
683
|
+
seconds: startTaf.getSeconds()
|
|
684
|
+
}) : clonedStartTafDate;
|
|
685
|
+
// Only proceed if has not bubbled dates overflow to months and not bubbled hours overflow to days
|
|
686
|
+
var isSameTime = updatedStartTafDate.getDate() === sections.day && updatedStartTafDate.getUTCHours() === sections.hour && updatedStartTafDate.getMinutes() === sections.min;
|
|
687
|
+
var isOverflowing = updatedStartTafDate.getDate() === sections.day + 1 && sections.hour === 24 && sections.min === 0;
|
|
688
|
+
if (isSameTime || isOverflowing) {
|
|
689
|
+
var isHalfInMonth = endTaf.getMonth() !== startTaf.getMonth() && sections.day < 15;
|
|
690
|
+
if (isHalfInMonth) {
|
|
691
|
+
return dateUtils.add(updatedStartTafDate, {
|
|
692
|
+
months: 1
|
|
693
|
+
});
|
|
679
694
|
}
|
|
680
695
|
}
|
|
681
|
-
return
|
|
696
|
+
return updatedStartTafDate;
|
|
682
697
|
};
|
|
683
698
|
// parsers
|
|
684
699
|
var parseValidToObject = function parseValidToObject(value, tafStart, tafEnd) {
|
|
@@ -687,23 +702,25 @@ var parseValidToObject = function parseValidToObject(value, tafStart, tafEnd) {
|
|
|
687
702
|
}
|
|
688
703
|
// Create valid object from passed string
|
|
689
704
|
var trimmedValue = value.trim();
|
|
690
|
-
var
|
|
691
|
-
var
|
|
705
|
+
var tafStartDate = dateUtils.utc(tafStart);
|
|
706
|
+
var tafEndDate = dateUtils.utc(tafEnd);
|
|
692
707
|
var startEnd = trimmedValue.split('/');
|
|
693
708
|
var format = trimmedValue.indexOf('/') === -1 ? FORMAT_DAYS_HOURS_MINUTES : FORMAT_DAYS_HOURS;
|
|
694
709
|
var startSections = getSections(startEnd[0], format);
|
|
695
|
-
var
|
|
710
|
+
var startDate = getValidityTimeStamp('start', startSections, tafStartDate, tafEndDate);
|
|
711
|
+
var startString = dateUtils.dateToString(startDate);
|
|
696
712
|
// If we only have start value - return that otherwise, also get end time
|
|
697
713
|
if (startEnd.length < 2) {
|
|
698
714
|
return {
|
|
699
|
-
start:
|
|
715
|
+
start: startString
|
|
700
716
|
};
|
|
701
717
|
}
|
|
702
718
|
var endSections = getSections(startEnd[1], FORMAT_DAYS_HOURS);
|
|
703
|
-
var
|
|
719
|
+
var endDate = getValidityTimeStamp('end', endSections, tafStartDate, tafEndDate);
|
|
720
|
+
var endString = dateUtils.dateToString(endDate);
|
|
704
721
|
return {
|
|
705
|
-
start:
|
|
706
|
-
end:
|
|
722
|
+
start: startString,
|
|
723
|
+
end: endString
|
|
707
724
|
};
|
|
708
725
|
};
|
|
709
726
|
// messages
|
|
@@ -732,8 +749,8 @@ var validateValidSections = function validateValidSections(sections, isStartEnd)
|
|
|
732
749
|
};
|
|
733
750
|
// Validate to ensure valid dates are passed
|
|
734
751
|
var validateIsValidDates = function validateIsValidDates(value, tafStart, tafEnd) {
|
|
735
|
-
var
|
|
736
|
-
var
|
|
752
|
+
var tafStartDate = dateUtils.utc(tafStart);
|
|
753
|
+
var tafEndDate = dateUtils.utc(tafEnd);
|
|
737
754
|
var startEnd = value.split('/');
|
|
738
755
|
var format = value.indexOf('/') === -1 ? FORMAT_DAYS_HOURS_MINUTES : FORMAT_DAYS_HOURS;
|
|
739
756
|
var validateMsg = [];
|
|
@@ -745,9 +762,9 @@ var validateIsValidDates = function validateIsValidDates(value, tafStart, tafEnd
|
|
|
745
762
|
if (sectionValidationStart.length) {
|
|
746
763
|
return sectionValidationStart;
|
|
747
764
|
}
|
|
748
|
-
var startTimestamp = getValidityTimeStamp('start', startSections,
|
|
765
|
+
var startTimestamp = getValidityTimeStamp('start', startSections, tafStartDate, tafEndDate);
|
|
749
766
|
// Validate start is within the taf validity bounds
|
|
750
|
-
if (startTimestamp <
|
|
767
|
+
if (startTimestamp < tafStartDate || startTimestamp > tafEndDate) {
|
|
751
768
|
validateMsg.push(invalidValidityStartTimeMessage);
|
|
752
769
|
}
|
|
753
770
|
// Validate end time
|
|
@@ -759,13 +776,13 @@ var validateIsValidDates = function validateIsValidDates(value, tafStart, tafEnd
|
|
|
759
776
|
if (sectionValidationEnd.length) {
|
|
760
777
|
return sectionValidationEnd;
|
|
761
778
|
}
|
|
762
|
-
var endTimestamp = getValidityTimeStamp('end', endSections,
|
|
779
|
+
var endTimestamp = getValidityTimeStamp('end', endSections, tafStartDate, tafEndDate);
|
|
763
780
|
// Validate end is not before start
|
|
764
781
|
if (endTimestamp < startTimestamp) {
|
|
765
782
|
validateMsg.push(invalidValidityPeriodMessage);
|
|
766
783
|
}
|
|
767
784
|
// Validate end is within the taf validity bounds
|
|
768
|
-
if (endTimestamp <
|
|
785
|
+
if (endTimestamp < tafStartDate || endTimestamp > tafEndDate) {
|
|
769
786
|
validateMsg.push(invalidValidityEndTimeMessage);
|
|
770
787
|
}
|
|
771
788
|
}
|
|
@@ -778,7 +795,9 @@ var validateValidField = function validateValidField(value, tafStart, tafEnd) {
|
|
|
778
795
|
return true;
|
|
779
796
|
}
|
|
780
797
|
// Validate length and ensure it doesn't contain any other characters than numbers and / and has either XXXX/XXXX or XXXXXX format
|
|
781
|
-
if (trimmedValue.length <
|
|
798
|
+
if (trimmedValue.length < lengthFM || trimmedValue.length > lengthBECMGTEMPO || !(trimmedValue.match(/^[0-9]{4}\/[0-9]{4}$/) || trimmedValue.match(/^[0-9]{6}$/)) ||
|
|
799
|
+
// only allow dates with / fully typed
|
|
800
|
+
(tafStart === null || tafStart === void 0 ? void 0 : tafStart.indexOf('/')) > -1 && trimmedValue.length !== lengthBECMGTEMPO || (tafEnd === null || tafEnd === void 0 ? void 0 : tafEnd.indexOf('/')) > -1 && trimmedValue.length !== lengthBECMGTEMPO) {
|
|
782
801
|
return invalidChangeValidInterFieldMessage;
|
|
783
802
|
}
|
|
784
803
|
// Ensure valid date(s) can be made
|
|
@@ -809,28 +828,28 @@ var validateValidChangeGroupInterField = function validateValidChangeGroupInterF
|
|
|
809
828
|
}
|
|
810
829
|
if (
|
|
811
830
|
// Ensure format for FM changegroups is correct DDHHmm
|
|
812
|
-
trimmedValue.length >
|
|
831
|
+
trimmedValue.length > lengthFM && trimmedValueChange === 'FM' ||
|
|
813
832
|
// Ensure format for BECMG and TEMPO changegroups is correct DDHH/DDHH
|
|
814
|
-
trimmedValue.length <
|
|
833
|
+
trimmedValue.length < lengthBECMGTEMPO && trimmedValueChange !== 'FM') {
|
|
815
834
|
return invalidChangeValidInterFieldMessage;
|
|
816
835
|
}
|
|
817
836
|
// Ensure BECMG changegroup has duration of 1,2,3,4 hours
|
|
818
837
|
if (trimmedValueChange === 'BECMG') {
|
|
819
|
-
var
|
|
820
|
-
var
|
|
838
|
+
var tafStartDate = dateUtils.utc(tafStart);
|
|
839
|
+
var tafEndDate = dateUtils.utc(tafEnd);
|
|
821
840
|
var startEnd = trimmedValue.split('/');
|
|
822
841
|
var format = trimmedValue.indexOf('/') === -1 ? FORMAT_DAYS_HOURS_MINUTES : FORMAT_DAYS_HOURS;
|
|
823
842
|
// Validate start time
|
|
824
843
|
var startSections = getSections(startEnd[0], format);
|
|
825
|
-
var startTimestamp = getValidityTimeStamp('start', startSections,
|
|
844
|
+
var startTimestamp = getValidityTimeStamp('start', startSections, tafStartDate, tafEndDate);
|
|
826
845
|
var endSections = getSections(startEnd[1], FORMAT_DAYS_HOURS);
|
|
827
|
-
var endTimestamp = getValidityTimeStamp('end', endSections,
|
|
828
|
-
var timeDifference =
|
|
846
|
+
var endTimestamp = getValidityTimeStamp('end', endSections, tafStartDate, tafEndDate);
|
|
847
|
+
var timeDifference = dateUtils.differenceInHours(endTimestamp, startTimestamp, 'ceil');
|
|
829
848
|
if (
|
|
830
849
|
// For non-amendments we only accept 1 to 4 hours
|
|
831
850
|
timeDifference >= 1 && ![1, 2, 3, 4].includes(Math.ceil(timeDifference)) ||
|
|
832
851
|
// For amendments the time difference can be below one hour, accept this unless the minute difference is zero
|
|
833
|
-
timeDifference < 1 &&
|
|
852
|
+
timeDifference < 1 && dateUtils.differenceInMinutes(endTimestamp, startTimestamp) === 0) {
|
|
834
853
|
return invalidBECMGDurationValidInterFieldMessage;
|
|
835
854
|
}
|
|
836
855
|
}
|
|
@@ -856,13 +875,13 @@ var validatePreviousChangeGroup = function validatePreviousChangeGroup(currentCh
|
|
|
856
875
|
return true;
|
|
857
876
|
}
|
|
858
877
|
// validate is valid time before
|
|
859
|
-
var currentStartTime =
|
|
860
|
-
var previousRowStartTime =
|
|
861
|
-
if (
|
|
878
|
+
var currentStartTime = dateUtils.utc(validValue.start);
|
|
879
|
+
var previousRowStartTime = dateUtils.utc(previousValidValue.start);
|
|
880
|
+
if (dateUtils.isBefore(currentStartTime, previousRowStartTime)) {
|
|
862
881
|
return invalidPreviousChangeGroupIsBeforeMessage;
|
|
863
882
|
}
|
|
864
883
|
// validate same valid time
|
|
865
|
-
if (
|
|
884
|
+
if (dateUtils.isEqual(currentStartTime, previousRowStartTime)) {
|
|
866
885
|
// validate change/probability order
|
|
867
886
|
var currentProbChangeValue = "".concat(probability, " ").concat(change).trim();
|
|
868
887
|
var previousProbChangeValue = "".concat(previousProbability, " ").concat(previousChange).trim();
|
|
@@ -882,15 +901,18 @@ var validateOverlapWithFM = function validateOverlapWithFM(currentChangeGroup, n
|
|
|
882
901
|
if (!valid || !nextChangeGroups.length) {
|
|
883
902
|
return true;
|
|
884
903
|
}
|
|
904
|
+
if (valid.length < lengthFM || valid.length > lengthBECMGTEMPO || !(valid.match(/^[0-9]{4}\/[0-9]{4}$/) || valid.match(/^[0-9]{6}$/))) {
|
|
905
|
+
return false;
|
|
906
|
+
}
|
|
885
907
|
var validValue = parseValidToObject(valid, tafStart, tafEnd);
|
|
886
|
-
var currentRowEndTime =
|
|
908
|
+
var currentRowEndTime = dateUtils.utc(validValue.end);
|
|
887
909
|
var firstFMChangeGroup = nextChangeGroups.find(function (nextChangeGroup) {
|
|
888
910
|
return getFieldValue(nextChangeGroup.change) === 'FM';
|
|
889
911
|
});
|
|
890
912
|
if (firstFMChangeGroup && firstFMChangeGroup.valid) {
|
|
891
913
|
var FMValidValue = parseValidToObject(firstFMChangeGroup.valid, tafStart, tafEnd);
|
|
892
|
-
var FMStartTime =
|
|
893
|
-
if (
|
|
914
|
+
var FMStartTime = dateUtils.utc(FMValidValue.start);
|
|
915
|
+
if (dateUtils.isAfter(currentRowEndTime, FMStartTime)) {
|
|
894
916
|
return invalidChangeGroupOverlapsWithFM;
|
|
895
917
|
}
|
|
896
918
|
}
|
|
@@ -2293,6 +2315,9 @@ var validateFourthCloud = function validateFourthCloud(firstCloudValue, secondCl
|
|
|
2293
2315
|
var DATE_FORMAT_YEAR = "yyyy-MM-dd'";
|
|
2294
2316
|
var DATE_FORMAT_ISSUE_TIME = "ddHHmm'Z";
|
|
2295
2317
|
var DATE_FORMAT_FULL = "yyyy-MM-dd'T'HH:mm:ss'";
|
|
2318
|
+
var DATE_FORMAT_HOURS = 'HH:mm';
|
|
2319
|
+
var DATE_FORMAT_FULL_TIMEZONE = "yyyy-MM-dd'T'HH:mm:ss'Z";
|
|
2320
|
+
var DATE_FORMAT_BASE_TIME = 'HH:mm dd MMM';
|
|
2296
2321
|
|
|
2297
2322
|
var emptyBaseForecast = {
|
|
2298
2323
|
wind: '',
|
|
@@ -2780,16 +2805,18 @@ var getAmendedCorrectedTafTimes = function getAmendedCorrectedTafTimes(taf, tafA
|
|
|
2780
2805
|
var previousValidDateEnd = taf.previousValidDateEnd && tafAction !== 'AMEND' ? taf.previousValidDateEnd : taf.validDateEnd;
|
|
2781
2806
|
// For amendment change valid start time to current time
|
|
2782
2807
|
// only do this if we're already within the validity period
|
|
2783
|
-
|
|
2784
|
-
|
|
2808
|
+
var now = dateUtils.utc();
|
|
2809
|
+
var validDateStart = dateUtils.utc(taf.validDateStart);
|
|
2810
|
+
if ((tafAction === 'AMEND' || tafAction === 'DRAFT_AMEND') && now.getTime() >= validDateStart.getTime()) {
|
|
2811
|
+
var _now = dateUtils.dateToString(dateUtils.utc(), DATE_FORMAT_FULL_TIMEZONE);
|
|
2785
2812
|
var validObj = {
|
|
2786
|
-
start:
|
|
2813
|
+
start: _now,
|
|
2787
2814
|
end: taf.baseForecast.valid.end
|
|
2788
2815
|
};
|
|
2789
2816
|
return Object.assign(Object.assign({}, taf), {
|
|
2790
2817
|
previousValidDateStart: previousValidDateStart,
|
|
2791
2818
|
previousValidDateEnd: previousValidDateEnd,
|
|
2792
|
-
validDateStart:
|
|
2819
|
+
validDateStart: _now,
|
|
2793
2820
|
baseForecast: Object.assign(Object.assign({}, taf.baseForecast), {
|
|
2794
2821
|
valid: validObj
|
|
2795
2822
|
})
|
|
@@ -3703,6 +3730,11 @@ var TafFormRow = /*#__PURE__*/React__default.forwardRef(function (_a, ref) {
|
|
|
3703
3730
|
changeGroups = _getValues.changeGroups;
|
|
3704
3731
|
var currentChangeGroup = changeGroups[index];
|
|
3705
3732
|
var previousChangeGroup = changeGroups[index - 1];
|
|
3733
|
+
var isvalidPrevious = validateValidField(currentChangeGroup.valid, getValues('validDateStart'), getValues('validDateEnd')) === true;
|
|
3734
|
+
var isvalidNext = validateValidField(previousChangeGroup.valid, getValues('validDateStart'), getValues('validDateEnd')) === true;
|
|
3735
|
+
if (isvalidPrevious !== true || isvalidNext !== true) {
|
|
3736
|
+
return true;
|
|
3737
|
+
}
|
|
3706
3738
|
return validatePreviousChangeGroup(currentChangeGroup, previousChangeGroup, validDateStart, validDateEnd);
|
|
3707
3739
|
}
|
|
3708
3740
|
return true;
|
|
@@ -4121,7 +4153,7 @@ var TafForm = /*#__PURE__*/React__default.memo(function (_ref) {
|
|
|
4121
4153
|
formState = _useFormContext.formState,
|
|
4122
4154
|
getValues = _useFormContext.getValues,
|
|
4123
4155
|
setValue = _useFormContext.setValue,
|
|
4124
|
-
|
|
4156
|
+
resetField = _useFormContext.resetField;
|
|
4125
4157
|
var _useDragOrder = useDragOrder(trigger, move),
|
|
4126
4158
|
onChangeOrder = _useDragOrder.onChangeOrder,
|
|
4127
4159
|
onStartDrag = _useDragOrder.onStartDrag,
|
|
@@ -4152,10 +4184,18 @@ var TafForm = /*#__PURE__*/React__default.memo(function (_ref) {
|
|
|
4152
4184
|
};
|
|
4153
4185
|
var resetFormValues = function resetFormValues(formData) {
|
|
4154
4186
|
var keepDirty = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
|
|
4155
|
-
|
|
4156
|
-
keepDirty
|
|
4187
|
+
Object.keys(formData).forEach(function (key) {
|
|
4188
|
+
if (!keepDirty) {
|
|
4189
|
+
resetField(key, {
|
|
4190
|
+
keepDirty: keepDirty,
|
|
4191
|
+
defaultValue: formData[key]
|
|
4192
|
+
});
|
|
4193
|
+
}
|
|
4194
|
+
setValue(key, formData[key], {
|
|
4195
|
+
shouldDirty: keepDirty
|
|
4196
|
+
});
|
|
4197
|
+
replace(formData.changeGroups);
|
|
4157
4198
|
});
|
|
4158
|
-
replace(formData.changeGroups);
|
|
4159
4199
|
};
|
|
4160
4200
|
var resetFormState = function resetFormState(resetDisabled) {
|
|
4161
4201
|
var action = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined;
|
|
@@ -4715,23 +4755,25 @@ var sortTafsOnIssueDate = function sortTafsOnIssueDate() {
|
|
|
4715
4755
|
});
|
|
4716
4756
|
};
|
|
4717
4757
|
var getBaseTime = function getBaseTime(baseTime, location) {
|
|
4718
|
-
var currentBaseTime =
|
|
4758
|
+
var currentBaseTime = dateUtils.utc(baseTime);
|
|
4719
4759
|
var activityPeriod = getLocationSetting(location).activity_period;
|
|
4720
|
-
var nextBaseTime =
|
|
4760
|
+
var nextBaseTime = dateUtils.add(dateUtils.utc(baseTime), {
|
|
4761
|
+
hours: activityPeriod
|
|
4762
|
+
});
|
|
4721
4763
|
return {
|
|
4722
4764
|
currentBaseTime: currentBaseTime,
|
|
4723
4765
|
nextBaseTime: nextBaseTime
|
|
4724
4766
|
};
|
|
4725
4767
|
};
|
|
4726
4768
|
var getTafTimeSlot = function getTafTimeSlot(baseTime, location, status) {
|
|
4727
|
-
var now =
|
|
4769
|
+
var now = dateUtils.utc();
|
|
4728
4770
|
var _getBaseTime = getBaseTime(baseTime, location),
|
|
4729
4771
|
currentBaseTime = _getBaseTime.currentBaseTime,
|
|
4730
4772
|
nextBaseTime = _getBaseTime.nextBaseTime;
|
|
4731
4773
|
if (status === 'EXPIRED') {
|
|
4732
4774
|
return 'EXPIRED';
|
|
4733
4775
|
}
|
|
4734
|
-
if (currentBaseTime < now && nextBaseTime > now) {
|
|
4776
|
+
if (currentBaseTime.getTime() < now.getTime() && nextBaseTime.getTime() > now.getTime()) {
|
|
4735
4777
|
return 'ACTIVE';
|
|
4736
4778
|
}
|
|
4737
4779
|
return 'UPCOMING';
|
|
@@ -4994,7 +5036,8 @@ var TacContainer = function TacContainer(_ref) {
|
|
|
4994
5036
|
var _useFormContext = useFormContext(),
|
|
4995
5037
|
getValues = _useFormContext.getValues,
|
|
4996
5038
|
trigger = _useFormContext.trigger,
|
|
4997
|
-
reset = _useFormContext.reset
|
|
5039
|
+
reset = _useFormContext.reset,
|
|
5040
|
+
setValue = _useFormContext.setValue;
|
|
4998
5041
|
var _useTafModuleContext = useTafModuleContext(),
|
|
4999
5042
|
useFieldArrayMethods = _useTafModuleContext.useFieldArrayMethods;
|
|
5000
5043
|
var replace = useFieldArrayMethods.replace;
|
|
@@ -5007,7 +5050,17 @@ var TacContainer = function TacContainer(_ref) {
|
|
|
5007
5050
|
var currentTaf = getValues();
|
|
5008
5051
|
var newTaf = prepareTafExportValues(taf, currentTaf);
|
|
5009
5052
|
reset(newTaf, {
|
|
5010
|
-
|
|
5053
|
+
keepDefaultValues: true,
|
|
5054
|
+
keepValues: false,
|
|
5055
|
+
keepDirty: false,
|
|
5056
|
+
keepErrors: false,
|
|
5057
|
+
keepIsValid: false,
|
|
5058
|
+
keepDirtyValues: false
|
|
5059
|
+
});
|
|
5060
|
+
Object.keys(newTaf).forEach(function (key) {
|
|
5061
|
+
setValue(key, newTaf[key], {
|
|
5062
|
+
shouldValidate: true
|
|
5063
|
+
});
|
|
5011
5064
|
});
|
|
5012
5065
|
replace(newTaf.changeGroups);
|
|
5013
5066
|
setTimeout(function () {
|
|
@@ -5288,7 +5341,7 @@ var TacOverviewMobile = function TacOverviewMobile(_ref) {
|
|
|
5288
5341
|
* Copyright 2022 - Finnish Meteorological Institute (FMI)
|
|
5289
5342
|
* */
|
|
5290
5343
|
var formatBaseTime = function formatBaseTime(time) {
|
|
5291
|
-
return
|
|
5344
|
+
return dateUtils.dateToString(time, DATE_FORMAT_BASE_TIME);
|
|
5292
5345
|
};
|
|
5293
5346
|
var TopTabs = function TopTabs(_ref) {
|
|
5294
5347
|
var timeSlot = _ref.timeSlot,
|
|
@@ -5691,59 +5744,6 @@ var IssuesPaneWrapper = function IssuesPaneWrapper(props) {
|
|
|
5691
5744
|
}, props));
|
|
5692
5745
|
};
|
|
5693
5746
|
|
|
5694
|
-
/* *
|
|
5695
|
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5696
|
-
* you may not use this file except in compliance with the License.
|
|
5697
|
-
* You may obtain a copy of the License at
|
|
5698
|
-
*
|
|
5699
|
-
* http://www.apache.org/licenses/LICENSE-2.0
|
|
5700
|
-
*
|
|
5701
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
5702
|
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
5703
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
5704
|
-
* See the License for the specific language governing permissions and
|
|
5705
|
-
* limitations under the License.
|
|
5706
|
-
*
|
|
5707
|
-
* Copyright 2023 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
|
|
5708
|
-
* Copyright 2023 - Finnish Meteorological Institute (FMI)
|
|
5709
|
-
* */
|
|
5710
|
-
var getLastUpdateTitle = function getLastUpdateTitle(time) {
|
|
5711
|
-
return "Last updated ".concat(time);
|
|
5712
|
-
};
|
|
5713
|
-
var LastUpdateTime = function LastUpdateTime(_ref) {
|
|
5714
|
-
var _ref$onUpdateTaf = _ref.onUpdateTaf,
|
|
5715
|
-
onUpdateTaf = _ref$onUpdateTaf === void 0 ? function () {} : _ref$onUpdateTaf,
|
|
5716
|
-
lastUpdateTime = _ref.lastUpdateTime;
|
|
5717
|
-
return /*#__PURE__*/React__default.createElement(Box, {
|
|
5718
|
-
sx: {
|
|
5719
|
-
display: 'flex',
|
|
5720
|
-
alignItems: 'center',
|
|
5721
|
-
height: '100%',
|
|
5722
|
-
justifyContent: 'flex-end'
|
|
5723
|
-
}
|
|
5724
|
-
}, /*#__PURE__*/React__default.createElement(Typography, {
|
|
5725
|
-
sx: {
|
|
5726
|
-
color: 'geowebColors.captions.captionStatus.rgba',
|
|
5727
|
-
fontSize: '10px',
|
|
5728
|
-
lineHeight: '1.6',
|
|
5729
|
-
letterSpacing: '0.33px'
|
|
5730
|
-
},
|
|
5731
|
-
"data-testid": "lastupdated-time"
|
|
5732
|
-
}, getLastUpdateTitle(lastUpdateTime)), /*#__PURE__*/React__default.createElement(CustomIconButton, {
|
|
5733
|
-
"data-testid": "updateTafBtn",
|
|
5734
|
-
onClick: onUpdateTaf,
|
|
5735
|
-
sx: {
|
|
5736
|
-
marginRight: {
|
|
5737
|
-
xs: 2,
|
|
5738
|
-
sm: 1
|
|
5739
|
-
},
|
|
5740
|
-
marginLeft: 1
|
|
5741
|
-
},
|
|
5742
|
-
tooltipTitle: "Click to refresh",
|
|
5743
|
-
variant: "tool"
|
|
5744
|
-
}, /*#__PURE__*/React__default.createElement(Cached, null)));
|
|
5745
|
-
};
|
|
5746
|
-
|
|
5747
5747
|
var CONFIRM_DIALOG_OPTIONS = {
|
|
5748
5748
|
title: 'Whoops',
|
|
5749
5749
|
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.",
|
|
@@ -5753,7 +5753,7 @@ var getTafMessagePrefix = function getTafMessagePrefix(_ref, newStatus) {
|
|
|
5753
5753
|
var location = _ref.location,
|
|
5754
5754
|
validDateStart = _ref.validDateStart,
|
|
5755
5755
|
messageType = _ref.messageType;
|
|
5756
|
-
var formattedDate = formatBaseTime(
|
|
5756
|
+
var formattedDate = formatBaseTime(dateUtils.utc(validDateStart));
|
|
5757
5757
|
return "TAF ".concat(location, " ").concat(formattedDate, " ").concat(messageType, " was ").concat(newStatus, " successfully");
|
|
5758
5758
|
};
|
|
5759
5759
|
var getSnackbarMessage = function getSnackbarMessage(tafFromFrontEnd) {
|
|
@@ -6028,7 +6028,8 @@ var TafLayout = function TafLayout(_ref2) {
|
|
|
6028
6028
|
sm: 3
|
|
6029
6029
|
}, lastUpdateTime && ( /*#__PURE__*/React__default.createElement(LastUpdateTime, {
|
|
6030
6030
|
lastUpdateTime: lastUpdateTime,
|
|
6031
|
-
|
|
6031
|
+
onPressRefresh: onUpdateTaf,
|
|
6032
|
+
dataTestId: "lastupdated-time"
|
|
6032
6033
|
})))), /*#__PURE__*/React__default.createElement(Grid, {
|
|
6033
6034
|
container: true,
|
|
6034
6035
|
flexGrow: 1,
|
|
@@ -6118,17 +6119,29 @@ var TafWrapper = function TafWrapper(_a) {
|
|
|
6118
6119
|
options: {
|
|
6119
6120
|
mode: 'onTouched',
|
|
6120
6121
|
reValidateMode: 'onChange',
|
|
6121
|
-
criteriaMode: '
|
|
6122
|
+
criteriaMode: 'firstError',
|
|
6122
6123
|
defaultValues: {
|
|
6123
6124
|
baseForecast: emptyBaseForecast,
|
|
6124
|
-
changeGroups: [emptyChangegroup, emptyChangegroup, emptyChangegroup, emptyChangegroup, emptyChangegroup]
|
|
6125
|
+
changeGroups: [emptyChangegroup, emptyChangegroup, emptyChangegroup, emptyChangegroup, emptyChangegroup],
|
|
6126
|
+
validDateStart: '',
|
|
6127
|
+
validDateEnd: '',
|
|
6128
|
+
baseTime: '',
|
|
6129
|
+
previousId: '',
|
|
6130
|
+
previousValidDateStart: '',
|
|
6131
|
+
previousValidDateEnd: '',
|
|
6132
|
+
location: '',
|
|
6133
|
+
messageType: '',
|
|
6134
|
+
uuid: '',
|
|
6135
|
+
issueDate: '',
|
|
6136
|
+
status: '',
|
|
6137
|
+
IS_DRAFT: false
|
|
6125
6138
|
}
|
|
6126
6139
|
}
|
|
6127
6140
|
}, /*#__PURE__*/React.createElement(TafModuleProvider, Object.assign({}, props), children));
|
|
6128
6141
|
};
|
|
6129
6142
|
|
|
6130
6143
|
var getCurrentDate = function getCurrentDate() {
|
|
6131
|
-
return
|
|
6144
|
+
return dateUtils.dateToString(dateUtils.utc(), DATE_FORMAT_HOURS);
|
|
6132
6145
|
};
|
|
6133
6146
|
var TafModule = function TafModule() {
|
|
6134
6147
|
var _useApiContext = useApiContext(),
|
package/package.json
CHANGED
|
@@ -1,12 +1,35 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@opengeoweb/taf",
|
|
3
|
-
"version": "9.
|
|
3
|
+
"version": "9.7.0",
|
|
4
4
|
"description": "GeoWeb TAF library for the opengeoweb project",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
|
8
8
|
"url": "git@gitlab.com:opengeoweb/opengeoweb.git"
|
|
9
9
|
},
|
|
10
|
+
"dependencies": {
|
|
11
|
+
"@opengeoweb/api": "*",
|
|
12
|
+
"@redux-eggs/redux-toolkit": "^2.2.0",
|
|
13
|
+
"@opengeoweb/shared": "*",
|
|
14
|
+
"react-hook-form": "7.47.0",
|
|
15
|
+
"@mui/material": "5.12.0",
|
|
16
|
+
"@opengeoweb/theme": "*",
|
|
17
|
+
"@redux-eggs/saga-extension": "^2.2.0",
|
|
18
|
+
"@opengeoweb/form-fields": "*",
|
|
19
|
+
"@opengeoweb/authentication": "*",
|
|
20
|
+
"@reduxjs/toolkit": "^1.9.7",
|
|
21
|
+
"react-redux": "^8.1.3",
|
|
22
|
+
"@opengeoweb/snackbar": "*",
|
|
23
|
+
"react-sortablejs": "^6.1.4",
|
|
24
|
+
"sortablejs": "^1.15.1",
|
|
25
|
+
"@emotion/react": "^11.11.1",
|
|
26
|
+
"lodash": "^4.17.21",
|
|
27
|
+
"axios": "1.5.0"
|
|
28
|
+
},
|
|
29
|
+
"peerDependencies": {
|
|
30
|
+
"react": "18",
|
|
31
|
+
"react-dom": "18"
|
|
32
|
+
},
|
|
10
33
|
"module": "./index.esm.js",
|
|
11
34
|
"type": "module",
|
|
12
35
|
"main": "./index.esm.js"
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { ChangeGroupFormData, Valid } from '../../../../types';
|
|
2
|
-
export declare const
|
|
3
|
-
export declare const FORMAT_DAYS_HOURS_MINUTES = "DDHHmm";
|
|
2
|
+
export declare const FORMAT_DAYS_HOURS_MINUTES = "ddHHmm";
|
|
4
3
|
export declare const formatValidToString: (valid: Valid) => string;
|
|
5
4
|
export declare const parseValidToObject: (value: string, tafStart: string, tafEnd: string) => Valid;
|
|
6
5
|
export declare const invalidValidityDaysHoursStartMessage = "Invalid validity start period, expected a date value between 00 and 31 and an hour value between 00 and 23";
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { Moment } from 'moment';
|
|
2
1
|
import React from 'react';
|
|
3
2
|
import { TafFromBackend, TimeSlot } from '../../../types';
|
|
4
3
|
interface TopTabsProps {
|
|
@@ -6,6 +5,6 @@ interface TopTabsProps {
|
|
|
6
5
|
tafFromBackend: TafFromBackend;
|
|
7
6
|
onChangeTimeSlot?: (timeSlot: TimeSlot, isFormDirty: boolean) => void;
|
|
8
7
|
}
|
|
9
|
-
export declare const formatBaseTime: (time:
|
|
8
|
+
export declare const formatBaseTime: (time: Date) => string;
|
|
10
9
|
declare const TopTabs: React.FC<TopTabsProps>;
|
|
11
10
|
export default TopTabs;
|
|
@@ -1,11 +1,10 @@
|
|
|
1
|
-
import { Moment } from 'moment';
|
|
2
1
|
import { Taf, TafConfigLocation, TafConfigLocations, TafFormData, TafFromBackend, TafStatus, TimeSlot } from '../../types';
|
|
3
2
|
export declare const getLocationSetting: (location: string, locationSettings?: TafConfigLocations) => TafConfigLocation;
|
|
4
3
|
export declare const sortTafsOnLocation: (tafList?: TafFromBackend[], locationOrder?: string[]) => TafFromBackend[];
|
|
5
4
|
export declare const sortTafsOnIssueDate: (tafList?: TafFromBackend[]) => TafFromBackend[];
|
|
6
5
|
export declare const getBaseTime: (baseTime: string, location: string) => {
|
|
7
|
-
currentBaseTime:
|
|
8
|
-
nextBaseTime:
|
|
6
|
+
currentBaseTime: Date;
|
|
7
|
+
nextBaseTime: Date;
|
|
9
8
|
};
|
|
10
9
|
export declare const getTafTimeSlot: (baseTime: string, location: string, status: TafStatus) => TimeSlot;
|
|
11
10
|
type TafTimeSlots = {
|
|
@@ -1,3 +1,6 @@
|
|
|
1
1
|
export declare const DATE_FORMAT_YEAR = "yyyy-MM-dd'";
|
|
2
2
|
export declare const DATE_FORMAT_ISSUE_TIME = "ddHHmm'Z";
|
|
3
3
|
export declare const DATE_FORMAT_FULL = "yyyy-MM-dd'T'HH:mm:ss'";
|
|
4
|
+
export declare const DATE_FORMAT_HOURS = "HH:mm";
|
|
5
|
+
export declare const DATE_FORMAT_FULL_TIMEZONE = "yyyy-MM-dd'T'HH:mm:ss'Z";
|
|
6
|
+
export declare const DATE_FORMAT_BASE_TIME = "HH:mm dd MMM";
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
export declare const getLastUpdateTitle: (time: string) => string;
|
|
3
|
-
interface LastUpdateTimeProps {
|
|
4
|
-
onUpdateTaf: () => void;
|
|
5
|
-
lastUpdateTime?: string;
|
|
6
|
-
}
|
|
7
|
-
declare const LastUpdateTime: React.FC<LastUpdateTimeProps>;
|
|
8
|
-
export default LastUpdateTime;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import * as React from 'react';
|
|
2
|
-
declare const _default: {
|
|
3
|
-
title: string;
|
|
4
|
-
};
|
|
5
|
-
export default _default;
|
|
6
|
-
export declare const LastUpdateTimeLightTheme: {
|
|
7
|
-
(): React.ReactElement;
|
|
8
|
-
storyName: string;
|
|
9
|
-
};
|
|
10
|
-
export declare const LastUpdateTimeDarkTheme: {
|
|
11
|
-
(): React.ReactElement;
|
|
12
|
-
storyName: string;
|
|
13
|
-
};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export { default as LastUpdateTime } from './LastUpdateTime';
|