{"version":3,"sources":["api/errors/validation.ts","constants/OrderStatusLabel.ts","api/responseHandlers/parseValidationError.ts","store/ActionTypes.ts","entities/Announcement.ts","entities/Area.ts","utils/Api.ts","store/action-creators/HttpActionCreators.ts","store/action-creators/RemoteActionCreators.ts","store/action-creators/DataActionCreators.ts","store/action-creators/UserActionCreators.ts","store/selectors/DataSelectors.ts","components/MarkdownRenderer/index.tsx","components/Ui/AnnouncementPanel/index.tsx","components/Common/Col.tsx","components/Common/Grid.tsx","components/Common/Row.tsx","store/selectors/UserSelectors.ts","utils/Area.ts","hooks/useOpenLayersDrag.ts","hooks/useAnimationFrame.ts","hooks/useOlFeatureEditing.ts","constants/Constants.ts","entities/ValidationResult.ts","validation/Validators.ts","utils/Array.ts","utils/Format.ts","utils/IdGenerator.ts","components/Inputs/NumberInput/index.tsx","components/AreasEditor/AreaEditor/index.tsx","components/AreasEditor/index.tsx","hooks/useMapAttachedState.ts","components/Ui/PageTitle/index.tsx","components/Inputs/TextInput/index.tsx","containers/AreaLibraryPage/index.tsx","api/endpoints/Area.ts","api/endpoints/Country.ts","api/endpoints/Folder.ts","api/endpoints/OrderProduct.ts","api/endpoints/Parameter.ts","api/endpoints/Provider.ts","api/endpoints/ServiceCharge.ts","api/endpoints/ServicePackage.ts","api/endpoints/Set.ts","api/endpoints/Subset.ts","api/endpoints/SubsetOption.ts","api/endpoints/UserArea.ts","api/endpoints/VolumeBand.ts","utils/OrderHelpers/index.ts","hooks/useOrderCostingVersion/index.ts","utils/ErrorHelpers/index.ts","store/action-creators/orders.ts","components/Feedback/LoadingIndicator/index.tsx","components/Navigation/Links/ExternalLink/index.tsx","components/Footnotes/index.tsx","components/OrderName/index.tsx","components/Buttons/ButtonInverted/index.tsx","store/selectors/new/parameters.ts","entities/Resolution.ts","components/ProductFormatters/EnsembleMembers/index.tsx","components/ProductFormatters/Run/index.tsx","components/ProductFormatters/Steps/BcSteps/index.tsx","components/ProductFormatters/Steps/index.tsx","components/ProductFormatters/TimeStep/index.tsx","components/OrderPDF/RealtimeOrderPDF/RealtimeOrderPdfDetails/ProductDetails/ParamLevelistFormatter/index.tsx","components/OrderPDF/RealtimeOrderPDF/RealtimeOrderPdfDetails/ProductDetails/ParamQuantileFormatter/index.tsx","components/OrderPDF/RealtimeOrderPDF/RealtimeOrderPdfDetails/ProductDetails/index.tsx","utils/DataSet/index.tsx","components/OrderPDF/RealtimeOrderPDF/RealtimeOrderPdfDetails/index.tsx","policies/OrderPolicy.tsx","components/OrderPDF/LicenceDetails/LicenceItem/index.tsx","components/OrderPDF/LicenceDetails/index.tsx","components/OrderPDF/OrderDetailsPdf/index.tsx","utils/Cost/index.ts","components/OrderPDF/OrderCostSummaryPdf/OrderCostSummaryPdfV1/index.tsx","components/OrderPDF/OrderCostSummaryPdf/OrderCostSummaryPdfV2/LineItem/index.tsx","components/OrderPDF/OrderCostSummaryPdf/OrderCostSummaryPdfV2/VolumeSummary/index.tsx","components/OrderPDF/OrderCostSummaryPdf/OrderCostSummaryPdfV2/InformationCost/index.tsx","components/OrderPDF/OrderCostSummaryPdf/OrderCostSummaryPdfV2/ServiceChargeCost/index.tsx","components/OrderPDF/OrderCostSummaryPdf/OrderCostSummaryPdfV2/TotalCost/index.tsx","components/OrderPDF/OrderCostSummaryPdf/OrderCostSummaryPdfV2/CostingVersion/index.tsx","components/OrderPDF/OrderCostSummaryPdf/OrderCostSummaryPdfV2/index.tsx","components/OrderPDF/OrderCostSummaryPdf/OrderCostSummaryPdfV3/index.tsx","components/OrderPDF/OrderCostSummaryPdf/OrderCostSummaryPdfV4/index.tsx","components/OrderPDF/OrderCostSummaryPdf/OrderCostSummaryPdfV5/index.tsx","components/OrderPDF/OrderCostSummaryPdf/index.tsx","components/OrderPDF/RealtimeOrderPDF/index.tsx","components/OrderPDF/ArchiveOrderPDF/ArchiveOrderPdfDetails/index.tsx","components/OrderPDF/ArchiveOrderPDF/index.tsx","components/OrderPDF/WebOrderPDF/WebOrderPdfDetails/index.tsx","components/OrderPDF/WebOrderPDF/index.tsx","components/OrderPDF/EuCutoutOrderPDF/ProductCostSummary/index.tsx","utils/EuCutOutProductHelpers/index.ts","utils/SubsetTypes.ts","components/OrderPDF/EuCutoutOrderPDF/ProductDetails/index.tsx","components/OrderPDF/EuCutoutOrderPDF/index.tsx","components/OrderPDF/index.tsx","components/PdfProvider/index.tsx","components/OrderPDFButton/index.tsx","components/RealtimeProductConfigurator/FormError/index.tsx","components/RealtimeProductConfigurator/Footnote/index.tsx","components/Inputs/Radio/index.tsx","components/Inputs/SelectInput/index.tsx","components/OrderSubmissionForm/LicensorStep/index.tsx","components/OrderSubmissionForm/LocationStep/index.tsx","containers/Order/OrderCostSummary/OrderCostSummaryV2/InformationCost/index.tsx","containers/Order/OrderCostSummary/OrderCostSummaryV2/ServiceChargeCost/index.tsx","components/OrderSubmissionForm/ServicePackagePicker/OrderCostPreview/index.tsx","components/OrderSubmissionForm/ServicePackagePicker/ServicePackageItem/index.tsx","components/OrderSubmissionForm/ServicePackagePicker/index.tsx","components/OrderSubmissionForm/ServicePackageStep/index.tsx","components/OrderSubmissionForm/index.tsx","components/HelpTexts/index.tsx","components/Inputs/Checkbox/Checkbox.tsx","components/OrderBrowser/OrderForm/StartDateField/index.tsx","containers/Order/EditOrderForm/index.tsx","components/Buttons/ButtonWithIcon/index.tsx","hooks/useAppDispatch.ts","containers/Order/OrderCostSummary/OrderCostSummaryV2/VolumeSummary/index.tsx","containers/Order/OrderCostSummary/OrderCostSummaryV2/CostError/index.tsx","containers/Order/OrderCostSummary/OrderCostSummaryV2/CostingVersion/index.tsx","containers/Order/OrderCostSummary/OrderCostSummaryV2/TotalCost/index.tsx","containers/Order/OrderCostSummary/OrderCostSummaryV2/index.tsx","containers/Order/OrderCostSummary/OrderCostSummaryV3/index.tsx","components/OrderSubmissionFormCompatibility/CostVersion/index.tsx","components/OrderSubmissionFormCompatibility/index.tsx","components/Ui/Disclaimer/index.tsx","policies/DisseminationRequestPolicy.tsx","utils/DateTime/index.ts","containers/Order/ExpirationAlert/index.tsx","containers/Order/LicenceDetails/LicenceItem/index.tsx","containers/Order/LicenceDetails/index.tsx","containers/Order/MaxChargeWarning/index.tsx","containers/Order/OrderCostSummary/OrderCostSummaryV1/index.tsx","containers/Order/OrderCostSummary/OrderCostSummaryV4/index.tsx","containers/Order/OrderCostSummary/OrderCostSummaryV5/index.tsx","containers/Order/OrderCostSummary/index.tsx","containers/Order/OrderCostWithPackage/index.tsx","components/Buttons/IconButton/index.tsx","components/ProductFormatters/ParamQuantile/index.tsx","components/ProductFormatters/ParamLevelist/index.tsx","components/ProductDetails/index.tsx","containers/Order/OrderDetails/RealtimeOrderDetails/ProductDetaiils/index.tsx","containers/Order/OrderDetails/RealtimeOrderDetails/index.tsx","containers/Order/EditOrderButton/index.tsx","containers/Order/OrderHeader/index.tsx","containers/Order/RealtimeOrder/ChangeCostingVersionButton/index.tsx","containers/Order/RealtimeOrder/index.tsx","containers/Order/OrderDetails/ArchiveOrderDetails/index.tsx","containers/Order/ArchiveOrder/index.tsx","containers/Order/OrderDetails/WebOrderDetails/index.tsx","containers/Order/WebOrder/index.tsx","components/EuCutOutConfigurator/ParametersSelector/SelectedParametersList/SelectedParametersItem/index.tsx","components/EuCutOutConfigurator/ParametersSelector/SelectedParametersList/index.tsx","components/Ui/ReferenceNumber/index.tsx","containers/Order/EuCutOutOrder/EuCutOutProductCost/index.tsx","containers/Order/EuCutOutOrder/index.tsx","containers/Order/index.tsx","components/Feedback/BeforeUnload/index.tsx","components/Ui/CheckboxWrap/index.tsx","components/RealtimeProductConfigurator/SelectAllControl/index.tsx","components/RealtimeProductConfigurator/RunsSelector/index.tsx","components/RealtimeProductConfigurator/AreasSelector/index.tsx","components/RealtimeProductConfigurator/ProductForm/controls/AreasField/index.tsx","components/RealtimeProductConfigurator/EnsembleMembersSelector/index.tsx","components/RealtimeProductConfigurator/ProductForm/controls/EnsembleMembersField/index.tsx","components/RealtimeProductConfigurator/MonthsSelector/index.tsx","components/RealtimeProductConfigurator/ProductForm/controls/ForecastMonthsField/index.tsx","components/RealtimeProductConfigurator/ForecastStepsSelector/StepsByDayAndIncrementControl/index.tsx","entities/Steps.ts","utils/StepItem/index.ts","components/RealtimeProductConfigurator/ForecastStepsSelector/MandatoryStepsWarning/index.tsx","components/RealtimeProductConfigurator/ForecastStepsSelector/StepWithLegsControl/index.tsx","utils/ProductFormHelpers/valuesToProduct.ts","utils/ProductFormHelpers/productToValues.ts","utils/ProductFormHelpers/shouldApplyMandatorySteps.ts","components/RealtimeProductConfigurator/ForecastStepsSelector/StepOptionsControl/index.tsx","components/RealtimeProductConfigurator/ForecastStepsSelector/StepRangesControl/index.tsx","components/RealtimeProductConfigurator/ForecastStepsSelector/index.tsx","components/RealtimeProductConfigurator/ProductForm/controls/ForecastStepsField/index.tsx","components/Ui/MatrixEditor/index.tsx","components/RealtimeProductConfigurator/TimeStepSelector/index.tsx","components/RealtimeProductConfigurator/ProductForm/controls/ForecastTimeStepsField/index.tsx","components/RealtimeProductConfigurator/UseStepSelector/UseStepControl/index.tsx","components/RealtimeProductConfigurator/UseStepSelector/index.tsx","components/RealtimeProductConfigurator/ProductForm/controls/ForecastUseStepsField/index.tsx","components/RealtimeProductConfigurator/GridSelector/index.tsx","components/RealtimeProductConfigurator/ProductForm/controls/GridField/index.tsx","components/RealtimeProductConfigurator/HindcastSelector/index.tsx","components/RealtimeProductConfigurator/ProductForm/controls/HindcastField/index.tsx","components/RealtimeProductConfigurator/LocationSelector/index.tsx","components/RealtimeProductConfigurator/ProductForm/controls/LocationField/index.tsx","components/RealtimeProductConfigurator/ProductForm/controls/NameField/index.tsx","hooks/useGeneratedId.ts","components/Ui/Tooltip/index.tsx","components/ParamLabel.tsx","components/RealtimeProductConfigurator/ParamsSelector/index.tsx","components/RealtimeProductConfigurator/ProductForm/controls/ParametersField/index.tsx","components/Ui/ParameterLabel/index.tsx","components/RealtimeProductConfigurator/ParamLevelistSelector/index.tsx","components/RealtimeProductConfigurator/ProductForm/controls/ParametersLevelistField/index.tsx","components/RealtimeProductConfigurator/ParamsQuantileSelector/index.tsx","components/RealtimeProductConfigurator/ProductForm/controls/ParametersQuantileField/index.tsx","components/RealtimeProductConfigurator/ChannelsSelector/index.tsx","components/RealtimeProductConfigurator/ProductForm/controls/SatelliteChannelsField/index.tsx","components/RealtimeProductConfigurator/TimeSelector/index.tsx","components/RealtimeProductConfigurator/ProductForm/controls/TimeField/index.tsx","components/RealtimeProductConfigurator/ProductForm/validators/index.tsx","components/RealtimeProductConfigurator/ProductForm/index.tsx","store/action-creators/subset-options.ts","store/selectors/new/subsetOptions.ts","components/RealtimeProductConfigurator/SubsetOptionsSelect/index.tsx","components/RealtimeProductConfigurator/ConfigurationPreview/index.tsx","containers/RealtimeOrderProduct/index.tsx","components/Navigation/Links/Link/index.tsx","components/Ui/OrderStatusBadge/index.tsx","components/ConfrimDialog/index.tsx","components/OrderList/OrderRow/index.tsx","components/OrderList/OrderListContent/index.tsx","components/OrderList/index.tsx","components/Ui/LicenseCard/index.tsx","components/OrderTypeSelector/index.tsx","components/Navigation/Pagination/index.tsx","components/PaginatedOrderList/index.tsx","components/AddOrderButton/index.tsx","containers/Dashboard/AdminDashboard/index.tsx","store/action-creators/folders.ts","components/OrderBrowser/FolderForm/index.tsx","components/OrderBrowser/AddFolderControl/index.tsx","components/OrderBrowser/FolderList/index.tsx","components/OrderBrowser/OrderList/OrderListItem/index.tsx","components/OrderBrowser/OrderList/index.tsx","components/OrderBrowser/FolderBreadcrumbs/index.tsx","components/OrderBrowser/Browser/index.tsx","components/OrderBrowser/index.tsx","containers/Orders/index.tsx","containers/Dashboard/index.tsx","components/RealtimeProductConfigurator/SubsetSelect/ParamSearch/index.tsx","components/RealtimeProductConfigurator/SubsetSelect/SubsetPicker/Button/index.tsx","components/RealtimeProductConfigurator/SubsetSelect/SubsetPicker/SubsetButton/index.tsx","components/RealtimeProductConfigurator/SubsetSelect/SubsetPicker/index.tsx","components/RealtimeProductConfigurator/SubsetSelect/index.tsx","components/RealtimeProductConfigurator/index.tsx","containers/RealtimeOrderProductNew/index.tsx","components/OrderBrowser/OrderForm/index.tsx","components/CreateOrderButton/index.tsx","store/action-creators/basket.ts","containers/RealtimeProductNew/index.tsx","components/Feedback/Modal/ConfirmationModal/index.tsx","containers/WebOrderNew/index.tsx","containers/ArchiveOrderNew/index.tsx","containers/Basket/index.tsx","policies/BasketPolicy.ts","components/Ui/DisseminationRequest/index.tsx","utils/Clipboard/copy.tsx","components/NotFoundScreen/index.tsx","containers/OrderDisseminationRequest/index.tsx","containers/PendingOrders/index.tsx","containers/CcpOrders/index.tsx","policies/AreaLibraryPolicy.ts","containers/PublicOrders/index.tsx","store/action-creators/sets.ts","components/EuCutOutConfigurator/AreaSelector/eu-cut-out-area-boudaries-map.jpg","components/EuCutOutConfigurator/AreaSelector/index.tsx","components/EuCutOutConfigurator/ParametersSelector/ParameterSelection/index.tsx","components/EuCutOutConfigurator/ParametersSelector/index.tsx","components/EuCutOutConfigurator/HighFrequencyProductsSelector/index.tsx","components/EuCutOutConfigurator/index.tsx","components/CreateOrderButtonWithAuthCheck/index.tsx","containers/EuCutOutOrderNew/index.tsx","containers/EuCutOutOrderEdit/index.tsx","components/NotAuthenticatedScreen/index.tsx","router/index.tsx","components/NavMenu/index.tsx","store/action-creators/parameters.ts","components/App.tsx","hooks/useMountEffect.ts","components/Ui/ErrorBoundary/index.tsx","utils/Map.ts","utils/Serialiser.ts","store/reducers/DataReducer.ts","store/reducers/folders.ts","store/reducers/orders.ts","store/reducers/UserReducer.ts","store/reducers/ordersById.ts","store/reducers/basket.ts","store/reducers/parameters.ts","store/reducers/optionsBySubsetId.ts","store/reducers/sets.ts","store/reducers/RootReducer.ts","index.tsx","entities/User.ts","api/client.ts","components/OrderPDF/OrderPDFHeader/index.tsx","images/ecmwf-logo.png","config.ts","api/endpoints/Order.ts"],"names":["ValidationError","data","Object","keys","join","name","Error","OrderStatusLabel","Map","OrderStatus","ACCEPTED","COMPLETED","SUBMITTED","DRAFT","REJECTED","CANCELLED","parseValidationError","error","response","status","ActionType","makeAnnouncements","announcements","map","a","text","makeAreaObj","presetArea","id","area","north","parseFloat","west","south","east","makeApiUrl","url","token","query","tokenQuery","value","concat","endsWith","length","q","get","_dispatch","getState","user","fetch","cache","credentials","ok","statusText","json","getUserDetails","dispatch","config","apiUrl","fetchArea","fetchArchiveTerms","fetchAnnouncements","fetchUserAreas","getAllAreas","raw","c","type","SET_AREA","getArchiveTerms","terms","SET_ARCHIVE_TERMS","getAllAnnouncements","SET_ANNOUNCEMENTS","fetchData","undefined","state","loadedAt","Date","now","dataCacheTtlMs","Promise","all","DATA_LOADED","getUserAreas","_","presets","setUserPresetAreas","logIn","LOG_IN","silentLogin","makeUser","LOG_OUT","newPresets","SET_USER_PRESET_AREAS","areas","selectHasLoaded","store","selectArchiveTerms","archiveTerms","selectAnnouncements","MarkdownRenderer","props","source","components","Alert","Link","href","target","children","AnnouncementPanel","announcement","variant","className","Col","BootstrapContainer","Row","selectUser","isLoggedIn","createSelector","UserType","Unknown","Customer","MULTIPLIER","snapToGrid","resolution","strategy","val","res","roundFn","Math","ceil","floor","snapAreaToGrid","useOpenLayersDrag","options","React","mouse","setMouse","capturedPointer","activeTransitionTarget","transitionState","targetState","current","mouseNow","animate","callbackRef","isLooping","loop","requestAnimationFrame","callback","useAnimationFrame","onDragStart","onDragEnd","onDrag","onClick","pointerDownListener","e","originalEvent","button","downCoord","coordinate","viewportElement","getViewport","hasPointerCapture","releasePointerCapture","on","un","pointerMoveListener","browserEvent","setPointerCapture","pointerId","drift","lastScreenX","screenX","lastScreenY","screenY","document","body","onpointerup","coord","onpointerdown","abs","pixel","Proj","leftMost","rightMost","worldWidth","halfWorldWidth","constrain","min","max","constrainX","range","x","y","sameWorld","xCoord","xWorlds","numWholeWords","round","worldOffset","dragStateToCoordinates","dragState","fixedCoord","draggedCoord","xRange","minX","fixedY","maxX","draggedY","fixedX","minY","draggedX","maxY","leftTop","offsetX","offsetY","rightBottom","width","height","worldXPositions","coordsToArea","coords","coord1","coord2","useOlFeatureEditing","mapRef","editableLayer","addMode","activeFeature","onUpdateFeature","grid","setDragState","dragStartHandler","cursor","getPixelFromCoordinate","feature","getFeaturesAtPixel","hitTolerance","layerFilter","layer","find","hit","startCoord","extent","getGeometry","getExtent","Extent","leftCoordRaw","topCoord","rightCoordRaw","bottomCoord","leftCoord","rightCoord","numWorlds","centreXCoord","left","top","right","bottom","xMargin","yMargin","rightDistance","leftDistance","topDistance","bottomDistance","verticalEdges","distance","horizontalEdges","dragHandler","pixelX","pixelY","dragUpdate","newState","lastPixel","getView","getCenter","centreX","centreY","getCoordinateFromPixel","coordX","coordY","newX","newY","setCenter","dragEndHandler","centreXRaw","dragStateToCursor","rawCoords","rawArea","snappedArea","MANDATORY_STEPS","SHORT_RANGE_WARNING","DEFAULT_FACTORS","MAX_LOCATIONS","validResult","isValid","invalidResult","validateArea","isNaN","sortNumbers","arr","sort","b","firstPartitionIndex","sortedArr","index","diff","mapDayToString","day","makeNull","formatter","def","arg","formatResolution","formatRun","run","formatHindcastDay","formatRunRange","formatStepRange","formatBaseTime","time","toString","padStart","formatBaseTimes","slice","start","end","formatLeveledParam","param","level","formatArea","str","push","formatRounded","formatAreas","withDefault","func","formatMegaBytes","toLocaleString","minimumFractionDigits","maximumFractionDigits","formatDecimal","formatBinaryCapacityUnit","n","units","unitIndex","toFixed","formatVolumeBand","volumeBand","min_gb","max_gb","formatCurrency","precision","style","currency","dp","formatSubsetLabel","subset","title","formatParameterNameWithShortname","shortname","formatAggregatedSteps","steps","sortedArray","partitions","values","partitionIndex","items","partitionByDiff","partition","getID","NumberInput","input","onChange","num","focus","onBlur","call","this","activeElement","classes","ref","defaultValue","required","step","placeholder","readOnly","label","htmlFor","AreaEditor","firstInput","handleAreaChange","direction","selectedArea","needsFocus","acknowledgeFocusRequest","prevProps","readonly","v","maxArea","AREA_INDEX","INACTIVE_STYLE","colors","baseAreaStyle","Style","stroke","color","fill","activeAreaStyle","draggingAreaStyle","lineDash","areaIsComplete","areaToGeometry","x1","x2","Geom","showAreaInView","view","fit","padding","duration","maxZoom","getZoom","renderSnapLegend","legs","visibility","setVisibility","dummyId","size","layerBoxes","Array","from","legId","checked","AreasEditor","areaEntities","projectArea","validationProblemsRaw","validationProblems","handleAction","legsRaw","suggestArea","userPresetAreas","mapContainerRef","areasLayerRef","newAreaFeatureRef","activeAreaRaw","setActiveArea","setAddMode","initialize","setMap","prevSource","newMap","key","previousValue","setValue","set","useMapAttachedState","snapLayersVisible","setSnapLayerVisible","snappingLayers","setSnappingLayers","features","setFeatures","snappingFeatures","setSnappingFeatures","draftArea","setDraftArea","activeArea","areaGeometries","ol","layers","TileLayer","OsmSource","center","zoom","minZoom","interactions","Interaction","dragPan","controls","moveTolerance","once","updateSize","VectorLayer","VectorSource","zIndex","addLayer","datelineLayer","geometry","setTarget","colourIndex","newSnappingLayers","forEach","l","removeLayer","visible","setVisible","mapClickHandler","f","areaIndex","viewInitializedRef","newFeatures","g","i","setStyle","newStyle","clone","getStroke","setColor","modifyStyleInvalid","getStyle","areasSource","getSource","addFeatures","addFeature","clear","newFeatureMap","leg","featureUpdateHandler","snappingGrid","finest","filter","isFinite","findFinestGrid","featureEditState","setGeometry","targetFeature","generatingArea","featureSet","sheetElement","createElement","appendChild","createTextNode","head","sheet","colorToCss","r","colorCss","contrastCss","insertRule","removeChild","snapLegend","enableAddModeHandler","newAddMode","deleteAreaHandler","areaEditorChangeHandler","addDraftArea","result","alert","reactSelectStyles","container","p","margin","control","minHeight","getOptionLabel","option","controlShouldRenderValue","styles","isOptionSelected","action","newArea","loadOptions","DropdownIndicator","IndicatorSeparator","disabled","field","message","PageTitle","endComponent","classNames","TextInput","event","saveUserArea","preset","method","headers","JSON","stringify","reject","deleteUserArea","doNothing","AreaLibraryPage","useSelector","useDispatch","areaPresets","workingPresets","setWorkingPresets","setValidationProblems","hasChanges","setHasChanges","setWorkingPreset","matchesRemote","newHasChanges","pushPresetToRemote","updateValidationProblems","problems","newValidationProblems","presetObjToApiFormat","then","catch","validationResponse","k","m","reduce","xs","ys","convertValidationResponse","newPreset","splice","setName","savePreset","renderAdditionalField","md","list","client","endpointPath","create","params","post","update","put","remove","delete","orderId","productData","productId","duplicate","paramsSerializer","queryString","paramShortnames","subsetId","OrderHelpers","isExpired","order","costingVersions","some","costingVersion","version","cost","currentOrderVersion","useOrderCostingVersion","useState","orderCostingVersions","setOrderCostingVersions","currentOrderCostingVersion","setCurrentOrderCostingVersion","useEffect","Api","versions","currentCostingVersion","updated","ErrorHelpers","isError","ORDERS_FETCH_STARTED","ORDERS_FETCH_COMPLETED","ORDERS_FETCH_FAILED","fetchOrdersStarted","folderId","fetchOrdersCompleted","fetchOrdersFailed","fetchOrders","folder_id","orders","ORDERS_MOVE_COMPLETED","moveOrderStarted","srcFolderId","targetFolderId","moveOrderCompleted","moveOrderFailed","ORDER_CREATE_COMPLETED","createOrderCompleted","ORDER_DETAILS_FETCH_STARTED","ORDER_DETAILS_FETCH_COMPLETED","fetchOrderDetailsStarted","fetchOrderDetailsCompleted","fetchOrderDetails","silentUpdate","ORDER_UPDATE_COMPLETED","updateOrderCompleted","ORDER_REMOVE_COMPLETED","removeOrderCompleted","removeOrder","ORDER_SUBMIT_COMPLETED","submitOrderCompleted","duplicateOrder","createdOrder","ORDER_CANCEL_COMPLETED","cancelOrderCompleted","cancelOrder","cancel","cancelledOrder","ORDER_APPROVE_COMPLETED","approveOrderCompleted","approveOrder","approve","approvedOrder","ORDER_REJECT_COMPLETED","rejectOrderCompleted","rejectOrder","rejectedOrder","ORDER_RECALCULATE_COMPLETED","recalculateOrderCompleted","LoadingIndicator","ExternalLink","pdf","src","MailLink","email","NewLine","AdditionalChargesFootnote","ResearchAndSmallBusinessFootnote","LimitCapacityFootnote","EPUOldLicenseNotice","OrderName","ButtonInverted","small","preventDefault","selectParameters","parameters","makeResolution","formatEnsembleMembers","last","EnsembleMembers","Component","as","Run","grouped","groupBy","use","Number","CYCLE_49r1_UPDATE_DATE","BC_TIMES","BC_STEPS_06_18","timestamp","date","Set","getTime","BC_STEPS_06_18_ENS","BcSteps","times","runTimes_00_12","difference","runTimes_06_18","intersection","label_00_12","t","label_06_18","values_00_12","values_06_18","has","Boolean","Steps","selectedTimes","bcType","split","valuesAsNumbers","parseInt","timesAsNumbers","TimeStep","parsed","StyleSheet","root","group","marginBottom","header","marginRight","ParamLevelistFormatter","shortnameLowerCase","toLowerCase","matchedParam","orderBy","ParamQuantileFormatter","quantile","grey","paddingSm","itemRow","paddingBottom","fontFamily","colLeft","colRight","paddingLeft","flexRow","flexDirection","flexWrap","productWrap","lineHeight","infoLeft","borderRight","infoLeftNoCost","infoRight","nameHeader","nameHeaderNoCost","costHeader","productHeader","backgroundColor","alignItems","ProductAttribute","display","ProductDetails","dataSetName","product","compact","productName","Text","number","isEmpty","castArray","location","time_step","param_levelist","param_quantile","use_step","fcmonth","channel","hindcast","volume","deriveBcType","sets","foundSubset","subsets","subset_id","bc_type","deriveDataSetName","foundSet","description","paddingXs","productSummary","textAlign","productSummaryColumn","RealtimeOrderPdfDetails","products","per_product","total_cost","OrderPolicy","canSubmit","details","freeze","enabled","isSubmitFrozenForUser","canApprove","CCP","Admin","canReject","canCancel","canRemove","canEdit","canAddProduct","category","OrderCategory","REALTIME","canUpdateProduct","canRemoveProduct","canSetCostingVersion","canRequestSmallBusinessDiscount","ARCHIVE","canRequestResearchLicence","canViewCcpOrders","canViewPublicOrders","canViewPendingOrders","canViewInformationCostBreakdown","orderCategory","EU_CUTOUT","canViewEcQuoteVersion","canViewFullCostError","canViewServiceChargeEstimation","LicenceItem","isNull","sentence","listItem","bold","LicenceDetails","small_business","research","OrderDetailsPdf","provider","dataDeliverer","servicePackage","userType","OrderPDFHeader","flexStretch","alignTop","paddingBottomNormal","customer","status_note","reference","discount","normalizeEpu","epu","productDailyVolume","productCost","productDailyFields","field_count","productTotalEpu","hfInformationCostAfterV1","information_cost_hf","hfInformationCost","hf_information_cost","hfInformationCostV1","standardInformationCost","information_cost_standard","informationCost","information_cost","informationCostDiscount","information_cost_after_discount","serviceChargeCost","service_charge","serviceChargeCostDiscount","service_charge_after_discount","totalCost","handlingCost","handling_cost","OrderCostSummaryPdfV1","annualTotalCostFootnoteRef","footer","footerTitles","footerCosts","footerHighlight","LineItem","highlight","VolumeSummary","InformationCostVariant","InformationCost","isDiscounted","labelMapping","WEB","ServiceChargeCost","orderStatus","TotalCost","CostingVersion","ecquote_version","ecQuoteText","OrderCostSummaryPdfV2","OrderCostSummaryPdfV3","OrderCostSummaryPdfV4","OrderCostSummaryPdfV5","OrderCostSummaryPdf","RealtimeOrderPDF","availableParams","pageStyles","disclaimers","disclaimer","disclaimerContent","pdfOptions","allowedTags","allowedAttributes","selfClosing","exclusiveFilter","tag","ArchiveOrderPdfDetails","sanitize","line","ArchiveOrderPDF","paragraph","WebOrderPdfDetails","WebOrderPDF","ProductCostSummary","epuFootnoteRef","EuCutOutProductHelpers","deriveParameterSelection","selection","acc","parameter","deriveSetAndSubsetFromSetsCollection","parameterSelectionKey","SUBSET_TYPE_TO_NAME_MAP","fc","an","wp","tf","ssd","pf","cm","ep","efi","sot","em","es","fcmean","SubsetTypes","humanize","tableContainer","tableTitle","paddingVertical","tableHead","borderBottom","row","fontSize","paddingRight","paddingHorizontal","subsetType","highFrequencyWrapper","highFrequencyLabel","TableRow","item","high_frequency","EuCutoutOrderPDF","pending","accepted","paddingMd","paddingLg","fontBold","fontItalic","heading","section","marginTop","justifyContent","alignCenter","flexCenter","statusNote","mainLogo","paddingTop","borderColor","cancelled","textTransform","noMargin","marginVertical","supText","position","OrderPDF","commonProps","Document","loading","link","download","click","setDownloaded","loadPdf","blobProps","setLoadPdf","OrderPDFButton","orderProducts","PdfProvider","FormError","when","Form","Footnote","Radio","SelectSingleInput","select","colourStyles","dropdownIndicator","indicatorSeparator","selected","itemToOption","selectedItem","onFocus","noop","tabIndex","opacity","border","labelClasses","isClearable","isDisabled","isSearchable","inputId","menuPlacement","openMenuOnFocus","formatOptionLabel","SelectMultiInput","isArray","s","selectedOptions","selectedItems","o","isMulti","_nextProps","oldState","LicensorStep","formik","providers","ecmwfProvider","selectedProvider","onDataDelivererChange","onProviderSelect","Group","controlId","Label","errors","touched","is_data_deliverer","data_deliverer","LocationStep","countries","country","code","setFieldValue","Item","sm","component","preview","ListItemContent","ListGroup","OrderCostPreview","licensor","serviceCharge","orderCost","charge_in_eur","orderTotalCost","servicePackageFeatures","ServiceChargePrice","serviceChargePrice","volumeBandPrice","packagePrice","FEATURE_LIST_PER_VERSION_MAP","v1","v2","v3","v4","v5","ServicePackageItem","onSelect","isAvailable","allServicesLink","onSelectClick","useCallback","ServicePackagePicker","servicePackages","serviceCharges","sc","volume_band_id","service_package_id","SERVICE_CHARGE_DOCS_URL_MAP","ServicePackageStep","onServicePackageChange","orderServicePackage","sp","docs","stepsByOrderCategory","STEPS","StepperItem","active","completed","icon","faCheckCircle","Badge","OrderSubmissionForm","orderCostingVersion","onComplete","stepIds","progress","setProgress","activeStep","nextStep","is_ecmwf","indexOf","previousStep","resetStep","useSubmissionStep","confirmed","setConfirmed","setProviders","setServicePackages","setServiceCharges","volumeBands","setVolumeBands","isLastStep","isFirstStep","onSubmit","actions","submit","submittedOrder","submitOrder","ccp_organisation","note","data_deliverer_organisation_id","setTouched","setSubmitting","useFormik","initialValues","validate","pickBy","isUndefined","onSubmitComplete","onBack","onNoteChange","service_charge_model_id","supportedServicePackageIds","add","supportedServicePackages","order_category","country_code","defaultProvider","chosenProvider","orderVolumeBand","vb","chosenServicePackage","chosenServiceCharge","Container","handleSubmit","Control","rows","HelpTexts","smallBusinessDiscountInfo","researchLicenceInfo","Checkbox","textInput","indeterminate","faSquare","faMinusSquare","faCheckSquare","helpText","StartDateField","handleChange","handleBlur","start_date","dayjs","format","pattern","EditOrderForm","patch","updatedOrder","setErrors","onSmallBusinessChange","onResearchChange","isSubmitting","ButtonWithIcon","iconProps","otherProps","useAppDispatch","FullErrorContent","traceback","ContactSupportContent","CostError","detailsOpen","setDetailsOpen","Heading","isOpened","ecquoteVersion","OrderCostSummaryV2","additionalContent","OrderCostSummaryV3","STAGES","CostVersion","currentVersion","setLoading","stage","setStage","onRecalculateClick","recalculate","recalculateOrder","faSpinner","spin","OrderSubmissionFormCompatibility","costStageCompleted","setCostStageCompleted","currentEcquoteVersion","isCostCompatible","ecQuoteVersion","isOrderCostCompatible","isDataCompatible","isAfter","isOrderDataCompatible","Disclaimer","identifier","DisseminationRequestPolicy","canAccess","includes","isOrderValid","extend","utc","timezone","advancedFormat","DateTime","Format","dateLong","dateTimeWithTimezone","Utils","isAfterUTC","afterDate","OrderExpirationAlert","MaxChargeCostPerCostingVersion","basic","withHighFrequency","MaxChargeWarning","OrderCostSummaryV1","OrderCostSummaryV4","OrderCostSummaryV5","OrderCostSummary","OrderCostWithPackage","selectedPackage","setSelectedPackage","selectedCharge","setSelectedCharge","modalOpen","setModalOpen","onPackageSelect","span","offset","borderTop","Modal","show","onHide","Header","closeButton","Title","Body","IconButton","forwardRef","displayName","ParamQuantile","ParamLevelist","fluid","RealtimeProductDetails","datasetName","onProductRemove","onProductDuplicate","isDuplicating","setIsDuplicating","isRemoving","setIsRemoving","history","useHistory","onDuplicate","order_id","newProduct","finally","onProductEdit","paths","realtimeOrderProduct","onRemove","faClone","faEdit","faTrashAlt","RealtimeOrderDetails","productRefs","useRef","el","VOLUME_LIMIT_IN_MB","EditOrderButton","onSuccess","setShow","handleClose","statusClass","OrderHeader","statusClassName","ChangeCostingVersionButton","availableVersions","onVersionSelect","currentVersionTitle","DropdownButton","ButtonGroup","Dropdown","eventKey","pill","RealtimeOrder","chosenDataDeliverer","chosenVolumeBand","onSubmitClick","submissionDialogOpen","setSubmissionDialogOpen","onSubmissionComplete","onApprove","onReject","onCancel","setProducts","setError","hasCostError","isOrderExpired","setCostingVersion","Card","max_charge","to","realtimeOrderProductNew","orderDisseminationRequest","marginLeft","sanitizeOptions","defaults","disallowedTagsMode","ArchiveOrderDetails","html","dangerouslySetInnerHTML","__html","ArchiveOrder","WebOrderDetails","WebOrder","SelectedParametersItem","shouldRenderActions","onItemRemove","align","faTrash","computeIndexKey","SelectedParametersList","onParameterRemove","selectionCount","shouldRenderActionsColumn","Table","striped","bordered","hover","colSpan","ReferenceNumber","referenceNumber","EuCutOutProductCost","EuCutOutOrder","setProduct","euCutOutOrderEdit","Order","useParams","orderState","ordersById","setSets","setCountries","window","scrollTo","BeforeUnload","onUnload","returnValue","addEventListener","removeEventListener","CheckboxWrap","SelectAllControl","onClear","RunsSelector","spec","onStepCheckboxChange","AreasSelector","grids","presetAreas","resolve","startsWith","handleAreaAction","newAreas","productLegs","AreasField","footnote","EnsembleMembersSelector","selectedOption","onValueChange","deriveNumberValuesFromSubsetOption","by","EnsembleMembersField","MonthsSelector","uniq","flatMap","specToOptions","onCheckboxChange","ForecastMonthsField","minDiff","sorted","mem","StepsByDayAndIncrementControl","valuesPool","dayOptions","useMemo","days","match","d","minIncrement","increments","factor","nameSuffix","minSelectedIncrement","selectedIncrement","setSelectedIncrement","selectedDays","setSelectedDays","dayOption","increment","stepsWithIncrement","inter","addDayStepsSelected","onStateChange","newSelectedDays","newSelectedIncrement","stepsToChange","onIncrementChange","isIndeterminate","onDayCheckboxChange","deriveSteps","stepItem","MandatoryStepsWarning","filterValuesByLeg","castedValue","StepWithLegsControl","selectedSteps","setSelectedSteps","applyMandatorySteps","shouldApplyMandatorySteps","updatedValues","onDayOrIncrementChange","newValues","currentLegValues","otherLegsValues","valuesToUpdate","union","onSelectAll","legValuesPool","legValues","Tab","defaultActiveKey","transition","Nav","faCalendar","faThLarge","Content","Pane","isMandatory","valuesToProduct","subsetOptions","stepValue","list_of_choices","deriveStepsFromLeg","productToValues","DEFAULT_PRODUCT_FORM_VALUES","extractLegsFromProduct","flatten","StepOptionsControl","StepRangesControl","ForecastStepsSelector","stepsType","specToStepsType","ForecastStepsField","MatrixEditor","firstCheckbox","toggleColumn","moize","column","every","optionToColumn","cellIsSelected","optionToRow","setSelection","toggleRow","selectCell","isChecked","cellToOption","cellIsOption","extractRows","optionRow","extractColumns","columns","optionCol","columnButtonContainsFocusableElement","renderColumn","rowIndex","idx","columnLabel","rowLabel","TimeStepSelector","timeItem","stepRange","timeStepsToOptions","ForecastTimeStepsField","stepValueIndexKey","UseStepControl","columnHeaders","columnValues","isEqual","newOptions","uniqBy","week","allWeekOptions","intersectionBy","differenceBy","UseStepSelector","useItem","dayRange","useStepsToOptions","ForecastUseStepsField","GridSelector","onGridChange","GridField","HindcastSelector","onDayChange","HindcastField","onToggle","isSelected","decodeBoolean","LocationSelector","LocationField","NameField","useGeneratedId","prefix","showTooltip","setShowTooltip","showTooltipOverride","setShowTooltipOverride","awaitingShowTooltip","tooltip","Tooltip","onMouseEnter","onMouseLeave","ev","stopPropagation","setTimeout","Overlay","placement","short","labelOnly","ParamLabel","tooltipCallback","element","$","attr","paramToOption","meta","filterParamsByShortnames","shortnames","toUpperCase","ParamsSelector","showAll","setShowAll","paramList","setParamList","sortBy","selectedParams","ParametersField","ParameterLabel","OverlayTrigger","delay","hide","overlay","ParamLevelistSelector","levelist","levels","isPlainObject","paramLevelistToOptions","ParametersLevelistField","ParamsQuantileSelector","paramQuantileToOptions","ParametersQuantileField","ChannelsSelector","SatelliteChannelsField","TimeSelector","TimeField","ensureNonEmptyArray","validateProductArrayProperty","areaToPresetObj","getDefaultEnsembleMembers","getDefaultGrid","transformAreasToMatchGrids","minGrid","computeMinGrid","validateProductFormValues","includeLocation","hindcastSelected","isEmptyError","validateAreas","ProductForm","setPresetAreas","setHindcastSelected","onAreasChange","useLayoutEffect","querySelector","closest","scrollIntoView","behavior","submitCount","debounce","dirty","SUBSET_OPTION_FETCH_COMPLETED","fetchSubsetOptionsCompleted","selectSubsetOptions","subsetOptionsBySubsetId","SubsetOptionsSelect","queryParameters","parseQueryParams","search","useLocation","parse","useQuery","setSubset","fetchSubsetOptions","initialValuesWithInjectedParams","formikHelpers","PreviewItem","ConfigurationPreview","formatted","RealtimeOrderProduct","productFormValues","setProductFormValues","initialProductFormValues","setInitialProductFormValues","productSubset","setProductSubset","updatedData","updatedProduct","resetForm","OrderStatusBadge","ConfirmDialog","open","onClose","onConfirm","cancelText","confirmText","centered","Footer","defaultProps","OrderRow","onOrderChange","duplicateWarningDialogOpen","setDuplicateWarningDialogOpen","has_legs","onDuplicateConfirmation","Toggle","faEllipsisV","Menu","faMinusCircle","OrderListContent","OrderList","filteredOrders","filterByStatus","minWidth","LicenseCard","FORECAST_USER_GUIDE_URL","OrderTypeSelector","lg","xl","realtimeOrderNew","block","archiveOrderNew","webOrderNew","euCutOutOrderNew","PER_PAGE_OPTIONS","Pagination","onPageChange","total","perPage","currentPage","pageCount","onPerPageChange","forcePage","pageRangeDisplayed","marginPagesDisplayed","nextLabel","breakLabel","previousLabel","renderOnZeroPageCount","pageClassName","pageLinkClassName","previousClassName","previousLinkClassName","nextClassName","nextLinkClassName","breakClassName","breakLinkClassName","containerClassName","activeClassName","hrefAllControls","hrefBuilder","PaginatedOrderList","AddOrderButton","ORDER_ADD_PATH_MAPPING","archive","web","realtime","european_cutout","onOrderAdd","SELECTABLE_ORDER_STATUSES","SELECTABLE_ORDER_CATEGORIES","AdminDashboard","limit","setLimit","totalItemsCount","setTotalItemsCount","setCurrentPage","setOrders","ordersError","setOrdersError","selectedStatus","setSelectedStatus","selectedCategory","setSelectedCategory","searchTerm","setSearchTerm","results","count","onLimitChange","onStatusChange","onSearchTermChange","term","onCategoryChange","page","FOLDERS_FETCH_STARTED","FOLDERS_FETCH_COMPLETED","FOLDERS_FETCH_FAILED","FOLDERS_CREATE_COMPLETED","createFolderCompleted","folder","FolderForm","AddFolderControl","FolderList","folders","faFolder","ordersByFolder","fromNow","OrderListItem","availableFolders","currentFolderId","onMoveToFolder","moveToFolder","moveOrderToFolder","faFileAlt","faArrowsAlt","FolderBreadcrumbs","currentFolder","Breadcrumb","relativeTime","Browser","foldersState","shallowEqual","ordersState","foldersInFolder","parent_id","unshift","OrderBrowser","path","useRouteMatch","exact","ORDERS_COMPONENT_BY_USER_TYPE","Orders","DASHBOARD_BY_USERTYPE","Dashboard","DashboardComponent","getFilteredParams","castValue","ParamSearch","getOptionValue","inputValue","noOptionsMessage","Button","faChevronRight","SubsetButton","SubsetList","availableSubsetIds","onSubsetSelect","subsetsByType","ProductSelectPanels","setsByCategory","selectedSet","setSelectedSet","subsetsByParams","setSubsetsByParams","availableSetIds","set_id","setsInCategory","SubsetSelect","setSelectedParams","RealtimeProductConfigurator","currentUrl","currentSubset","setCurrentSubset","pathname","onSubsetChange","subsetOptionsFormUrl","onProductValuesChange","RealtimeOrderProductNew","newProductData","submitForm","OrderForm","orderProps","CreateOrderButton","BASKET_PRODUCT_ADD_COMPLETED","BASKET_PRODUCT_REMOVE_COMPLETED","BASKET_CLEAR_COMPLETED","RealtimeProductNew","isUserLoggedIn","onOrderSaved","onAddToBasket","validateForm","ConfirmationModal","WebOrderNew","userLoggedIn","showLoginPopup","setShowLoginPopup","onLoginClick","loginUrl","ArchiveOrderNew","BasketItem","onBasketItemRemove","Basket","productDataSet","basket","onOrderCreate","BasketPolicy","DissLine","isBlank","test","DisseminationRequest","lines","diss","copyToClipboard","$el","setAttribute","execCommand","NotFoundScreen","faExclamationTriangle","OrderDisseminationRequest","setDiss","dissError","setDissError","copyStatus","setCopyStatus","fetchDisseminationRequest","onCopyToClipboard","timeoutId","clearTimeout","faCopy","PendingOrders","CcpOrders","setSelectedProvider","listCCPOrders","organisation_id","onProviderChange","AreaLibraryPolicy","PublicOrders","listPublicOrders","SETS_FETCH_STARTED","SETS_FETCH_COMPLETED","SETS_FETCH_FAILED","fetchSetsCompleted","fetchSets","AreaSelector","mapImage","alt","ParameterSelection","selectedParam","setSelectedParam","subsetsToSelect","setSubsetsToSelect","selectedSubsetIds","setSelectedSubsetIds","setsById","selectedSubsetId","ParametersSelector","showParamSelection","setShowParamSelection","onParameterSelect","selectedMapping","omit","onAddParameterClick","onParameterSelectionHide","faPlusCircle","HighFrequencyProductsSelector","parameterSelection","formValuesToProducts","highFrequency","EuCutOutConfigurator","allParameters","isInitialValid","onParametersChange","onHighFrequencyChange","CreateOrderButtonWithAuthCheck","EuCutOutOrderNew","EuCutOutOrderEdit","onProductUpdate","productDataItems","NotAuthenticatedScreen","pendingOrders","ccpOrders","publicOrders","ProtectedRoute","routerProps","Router","NavLink","NavMenu","productCount","pendingOrdersCount","PARAMETERS_FETCH_COMPLETED","fetchParametersCompleted","App","effect","isMounted","setIsMounted","useMountEffect","hasLoaded","Grid","ErrorBoundary","hasError","_info","setState","serviceDeskEmail","entries","entry","mapFingerprint","initial","initialState","foldersReducer","parseOrder","created","addOrder","updateOrder","moveOrder","updateSubState","subState","updatedSubState","ordersReducer","initialItemState","ordersByIdReducer","newItemState","generateBasketProductId","random","substring","basketReducer","transformByShortname","parametersReducer","updateOptions","optionsBySubsetId","setsReducer","mapTransformer","createTransform","inboundState","_key","fingerprint","outboundState","serial","basketPersistConfig","storage","transforms","reducers","persistReducer","SET_USER_TOKEN","rootReducer","combineReducers","createStore","composeWithDevTools","applyMiddleware","thunk","persistor","persistStore","Root","ReactDOM","basename","mountPath","getElementById","getUserType","userName","user_name","phone","organisationId","organisationName","organisation_name","organisationAddress","registered_address","countryCode","ecmwfCanLicence","ecmwf_can_licence","ecmwfCanLicenceArchive","ecmwf_can_licence_archive","axios","baseURL","timeout","Accept","withCredentials","interceptors","request","clientConfig","tokensEnabled","tokens","imageToBuffer","image","base64result","Buffer","fromEntries","logo","fetchEnvSetting","setting","process","nodeEnv","tokenCustomer","tokenCCP","tokenAdmin","archiveTermsAndConditionsUrl","allowedParams","pick","convertNullToString","mapValues","reason"],"mappings":"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","file":"static/js/main.f9e7d924.chunk.js","sourcesContent":["class ValidationError extends Error {\n data: { [field: string]: Array };\n\n constructor(data: { [field: string]: Array }) {\n super(`Invalid parameters: ${Object.keys(data).join(', ')}`);\n\n this.name = 'ValidationError';\n this.data = data;\n }\n}\n\nexport default ValidationError;\n","import { OrderStatus } from \"../api/endpoints/Order\";\n\nconst OrderStatusLabel: Map = new Map([\n [OrderStatus.ACCEPTED, \"Quote accepted\"],\n [OrderStatus.COMPLETED, \"Pending\"],\n [OrderStatus.SUBMITTED, \"Pending\"],\n [OrderStatus.DRAFT, \"Draft\"],\n [OrderStatus.REJECTED, \"Quote rejected\"],\n [OrderStatus.CANCELLED, \"Quote cancelled\"]\n]);\n\nexport default OrderStatusLabel;\n","import { AxiosError } from 'axios';\nimport ValidationError from '../errors/validation';\n\nconst parseValidationError = (error: AxiosError) => {\n const { response } = error;\n\n if (response) {\n const { status, data } = response;\n\n if (status === 400) {\n throw new ValidationError(data);\n }\n }\n\n throw error;\n};\n\nexport default parseValidationError;\n","export enum ActionType {\n\tDATA_LOADED = \"DATA_LOADED\",\n\tLOG_IN = \"LOG_IN\",\n\tLOG_OUT = \"LOG_OUT\",\n\tSET_USER_TOKEN = \"SET_USER_TOKEN\",\n\tSET_USER_PRESET_AREAS = \"SET_USER_PRESET_AREAS\",\n\tSET_AREA = \"SET_AREA\",\n\tSET_ANNOUNCEMENTS = \"SET_ANNOUNCEMENTS\",\n\tSET_ARCHIVE_TERMS = \"SET_ARCHIVE_TERMS\"\n}\n","import { Announcement as ApiAnnouncement } from \"../api-entities/Announcement\";\n\nexport type Announcement = {\n\ttext: string;\n};\n\n// api specifies announcements are provided pre-sorted and pre-filtered\nexport const makeAnnouncements = (announcements: ApiAnnouncement[]): Announcement[] => {\n\treturn announcements.map(a => ({ text: a.text }));\n};\n","import { PresetArea, PresetObj } from \"../api-entities/PresetArea\";\n\n/**\n * A latitude/longitude quadrangle described by its four edges.\n */\nexport type Area = {\n\tnorth: number;\n\teast: number;\n\tsouth: number;\n\twest: number;\n};\n\nexport type AreaWorking = {\n\tnorth?: number;\n\teast?: number;\n\tsouth?: number;\n\twest?: number;\n};\n\n/**\n * Construct a new area object from its API representation.\n */\nexport const makeAreaObj = (presetArea: PresetArea): PresetObj => ({\n\tid: presetArea.id,\n\tname: presetArea.name,\n\tarea: {\n\t\tnorth: parseFloat(presetArea.north),\n\t\twest: parseFloat(presetArea.west),\n\t\tsouth: parseFloat(presetArea.south),\n\t\teast: parseFloat(presetArea.east)\n\t}\n});\n","export type UrlQuery = {\n\tname: string;\n\tvalue: string;\n};\n\n/**\n * Appends the user token and url queries to a url.\n */\nexport const makeApiUrl = (url: string, token?: string, query?: UrlQuery[]) => {\n\tif (token) {\n\t\tconst tokenQuery: UrlQuery = {\n\t\t\tname: \"token\",\n\t\t\tvalue: token\n\t\t};\n\t\tquery = (query ? query : []).concat([tokenQuery]);\n\t}\n\n\tif (!url.endsWith(\"/\")) {\n\t\turl += \"/\";\n\t}\n\n\tif (query && query.length > 0) {\n\t\turl += \"?\" + query.map(q => `${q.name}=${q.value}`).join(\"&\");\n\t}\n\n\treturn url;\n};\n","import { makeApiUrl, UrlQuery } from \"../../utils/Api\";\nimport { ReturningThunk } from \"../actions/All\";\n\n/**\n * A low-level action which GETs an HTTP resource.\n * This will automatically use the user token if necessary.\n * @param url The location.\n * @param query Any url queries to include.\n */\nexport const get = (url: string, query?: UrlQuery[]): ReturningThunk> => async (\n\t_dispatch,\n\tgetState\n) => {\n\turl = makeApiUrl(url, getState().user.token, query);\n\tconst response = await fetch(url, { cache: \"no-store\", credentials: \"include\" });\n\tif (!response.ok) {\n\t\tthrow new Error(response.statusText);\n\t}\n\treturn response.json();\n};\n\n/**\n * A low-level action which POSTs an HTTP resource.\n * This will automatically use the user token if necessary.\n * @param url The location.\n * @param query Any url queries to include.\n */\nexport const post = (\n\turl: string,\n\tpayload: any,\n\tquery?: UrlQuery[]\n): ReturningThunk> => async (_dispatch, getState) => {\n\turl = makeApiUrl(url, getState().user.token, query);\n\tconst response = await fetch(url, {\n\t\tmethod: \"POST\",\n\t\theaders: {\n\t\t\t\"Content-Type\": \"application/json\"\n\t\t},\n\t\tcredentials: \"include\",\n\t\tbody: JSON.stringify(payload)\n\t});\n\tif (!response.ok) {\n\t\tthrow new Error(response.statusText);\n\t}\n\treturn response.json();\n};\n\n/**\n * A low-level action which PUTs an HTTP resource.\n * This will automatically use the user token if necessary.\n * @param url The location.\n * @param query Any url queries to include.\n */\nexport const put = (\n\turl: string,\n\tpayload: any,\n\tquery?: UrlQuery[]\n): ReturningThunk> => async (_dispatch, getState) => {\n\turl = makeApiUrl(url, getState().user.token, query);\n\tconst response = await fetch(url, {\n\t\tmethod: \"PUT\",\n\t\theaders: {\n\t\t\t\"Content-Type\": \"application/json\"\n\t\t},\n\t\tcredentials: \"include\",\n\t\tbody: JSON.stringify(payload)\n\t});\n\tif (!response.ok) {\n\t\tthrow new Error(response.statusText);\n\t}\n\treturn response.json();\n};\n\n/**\n * A low-level action which DELETEs an HTTP resource.\n * This will automatically use the user token if necessary.\n * @param url The location.\n * @param query Any url queries to include.\n */\nexport const ddelete = (url: string, query?: UrlQuery[]): ReturningThunk> => async (\n\t_dispatch,\n\tgetState\n) => {\n\turl = makeApiUrl(url, getState().user.token, query);\n\tconst response = await fetch(url, {\n\t\tmethod: \"DELETE\",\n\t\tcredentials: \"include\"\n\t});\n\tif (!response.ok) {\n\t\tthrow new Error(response.statusText);\n\t}\n};\n","import { Announcement } from \"../../api-entities/Announcement\";\nimport { PresetArea } from \"../../api-entities/PresetArea\";\nimport { User } from \"../../api-entities/User\";\nimport { config } from \"../../config\";\nimport { ReturningAsyncThunk } from \"../actions/All\";\nimport { get } from \"./HttpActionCreators\";\n\nexport const getUserDetails: ReturningAsyncThunk = dispatch =>\n\tdispatch(get(`${config.apiUrl}whoami/`));\n\nexport const fetchArea: ReturningAsyncThunk = dispatch =>\n\tdispatch(get(`${config.apiUrl}area/`));\n\nexport const fetchArchiveTerms: ReturningAsyncThunk<{ text: string }> = dispatch =>\n\tdispatch(get<{ text: string }>(`${config.apiUrl}terms/`));\n\nexport const fetchAnnouncements: ReturningAsyncThunk = dispatch =>\n\tdispatch(get(`${config.apiUrl}announcement/`));\n\nexport const fetchUserAreas: ReturningAsyncThunk = dispatch =>\n\tdispatch(get(`${config.apiUrl}user-area/`));\n","import { config } from \"../../config\";\nimport { makeAnnouncements } from \"../../entities/Announcement\";\nimport { makeAreaObj } from \"../../entities/Area\";\nimport { Thunk } from \"../actions/All\";\nimport { ActionType } from \"../ActionTypes\";\nimport { DataState } from \"../reducers/DataReducer\";\nimport {\n fetchAnnouncements,\n fetchArchiveTerms,\n fetchArea,\n} from \"./RemoteActionCreators\";\n\n/**\n * Fetch all preset areas from the server and cache them.\n */\nconst getAllAreas: Thunk = async dispatch => {\n try {\n const raw = await dispatch(fetchArea);\n const area = raw.map(c => makeAreaObj(c));\n dispatch({ type: ActionType.SET_AREA, area });\n } catch {\n throw new Error(\"There was an error retrieving areas\");\n }\n};\n\n/**\n * Fetch archive terms and conditions from the server and cache them.\n */\nconst getArchiveTerms: Thunk = async dispatch => {\n try {\n const terms = await dispatch(fetchArchiveTerms);\n dispatch({ type: ActionType.SET_ARCHIVE_TERMS, terms: terms.text });\n } catch {\n throw new Error(\"There was an error retrieving terms and conditions\");\n }\n};\n\n/**\n * Fetch all announcements from the server and cache them.\n */\nconst getAllAnnouncements: Thunk = async dispatch => {\n try {\n const raw = await dispatch(fetchAnnouncements);\n const announcements = makeAnnouncements(raw);\n dispatch({ type: ActionType.SET_ANNOUNCEMENTS, announcements });\n } catch {\n throw new Error(\"There was an error retrieving announcements\");\n }\n};\n\nconst dataIsFresh = (state: DataState) =>\n state.loadedAt !== undefined && Date.now() - state.loadedAt < config.dataCacheTtlMs;\n\nexport const fetchData: Thunk = async (dispatch, getState) => {\n if (!dataIsFresh(getState().data)) {\n await Promise.all([\n dispatch(getAllAreas),\n dispatch(getArchiveTerms)\n ]);\n\n dispatch({ type: ActionType.DATA_LOADED, loadedAt: Date.now() });\n }\n\n dispatch(getAllAnnouncements);\n};\n","import { PresetObj } from \"../../api-entities/PresetArea\";\nimport { config } from \"../../config\";\nimport { makeAreaObj } from \"../../entities/Area\";\nimport { makeUser, User, UserType } from \"../../entities/User\";\nimport { Action, Thunk } from \"../actions/All\";\nimport { UserAction } from \"../actions/UserActions\";\nimport { ActionType } from \"../ActionTypes\";\nimport { fetchUserAreas, getUserDetails } from \"./RemoteActionCreators\";\n\nconst logOut = (): Action => ({\n\ttype: ActionType.LOG_OUT\n});\n\nexport const getUserAreas: Thunk = async (dispatch, _) => {\n\ttry {\n\t\tconst presets = await dispatch(fetchUserAreas);\n\t\tdispatch(setUserPresetAreas(presets.map(makeAreaObj)));\n\t} catch {\n\t\tthrow new Error(\"There was an error retrieving user areas\");\n\t}\n};\n\nconst logIn = (user: User): Thunk => dispatch => {\n\tdispatch({\n\t\ttype: ActionType.LOG_IN,\n\t\tuser\n\t});\n\n\t// Fetch user preset areas\n\tdispatch(getUserAreas);\n};\n\n/**\n * Logs the user in if possible. Otherwise won't do anything.\n */\nexport const silentLogin: Thunk = async dispatch => {\n\ttry {\n\t\tconst raw = await dispatch(getUserDetails);\n\t\tconst user = makeUser(raw);\n\t\tdispatch(logIn(user));\n\t} catch (error) {\n\t\tdispatch(logOut());\n\t}\n};\n\n/**\n * Tries to login as a particular type of user.\n * Should only be used in development.\n */\nexport const devLogin = (type: UserType): Thunk => dispatch => {\n\tconst token = config.tokens.get(type)!;\n\n\tdispatch({\n\t\ttype: ActionType.SET_USER_TOKEN,\n\t\ttoken\n\t});\n\n\tdispatch(silentLogin);\n};\n\nexport const setUserPresetAreas: (newPresets: PresetObj[]) => UserAction = newPresets => ({\n\ttype: ActionType.SET_USER_PRESET_AREAS,\n\tareas: newPresets\n});\n","import { TRootState } from \"../reducers/RootReducer\";\n\n/**\n * Gets whether the initial load has finished\n */\nexport const selectHasLoaded = (store: TRootState) => store.data.loadedAt !== undefined;\n\nexport const selectArchiveTerms = (state: TRootState) => state.data.archiveTerms;\n\nexport const selectAnnouncements = (state: TRootState) => state.data.announcements;\n","import React from 'react';\nimport { Alert } from 'react-bootstrap';\nimport ReactMarkdown from 'react-markdown';\n\ninterface Props {\n source: string;\n}\n\nconst MarkdownRenderer = (props: Props) => {\n const { source } = props;\n\n return (\n {props.children}\n }}\n >\n {source}\n \n );\n};\n\nexport default MarkdownRenderer;\n","import * as React from \"react\";\nimport { Announcement } from \"../../../entities/Announcement\";\nimport Alert from \"react-bootstrap/Alert\";\nimport MarkdownRenderer from \"../../MarkdownRenderer\";\n\ntype Props = {\n\tannouncement: Announcement;\n};\n\nconst AnnouncementPanel = (props: Props) => {\n\tconst { announcement } = props;\n\n\treturn (\n\t\t\n\t\t\t\n\t\t\n\t)\n}\n\nexport default AnnouncementPanel;\n","import * as React from \"react\";\nimport { Col } from \"react-bootstrap\";\n\nexport default Col;\n","import * as React from \"react\";\nimport { Container as BootstrapContainer } from \"react-bootstrap\";\n\nexport default BootstrapContainer;\n","import * as React from \"react\";\nimport { Row } from \"react-bootstrap\";\n\nexport default Row;\n","import { createSelector } from \"reselect\";\nimport { UserType } from \"../../entities/User\";\nimport { TRootState } from \"../reducers/RootReducer\";\n\nexport const selectUser = (store: TRootState) => store.user.user;\n\nexport const isLoggedIn = createSelector(\n\tselectUser,\n\tuser => user.type !== UserType.Unknown\n);\n\n/**\n * Gets the type of the current user.\n * Throws an exception if no one is logged in.\n */\nexport const selectUserType = createSelector(\n\tselectUser,\n\tuser => user.type\n);\n\n/**\n * Returns true iff user is a customer without company details.\n */\nexport const customerDetailsRequired = createSelector(\n\tselectUser,\n\tuser => user.type === UserType.Customer && false\n\t// \t(data.user.organisationAddress == null ||\n\t// \t\tdata.user.organisationId == null ||\n\t// \t\tdata.user.organisationName == null)\n);\n","import { Area } from \"../entities/Area\";\nimport { ProductLeg } from \"../entities/ProductLeg\";\n\nconst MULTIPLIER = 1000;\n\nconst snapToGrid = (value: number, resolution: number, strategy: 'round-up' | 'round-down' = 'round-down') => {\n\tconst val = value * MULTIPLIER;\n\tconst res = resolution * MULTIPLIER;\n\tconst roundFn = strategy === 'round-up' ? Math.ceil : Math.floor;\n\n\treturn (roundFn(val/res) * res) / MULTIPLIER;\n}\n\nexport const snapAreaToGrid = (a: Area, resolution: number): Area => {\n\treturn {\n\t\tnorth: snapToGrid(a.north, resolution),\n\t\tsouth: snapToGrid(a.south, resolution, 'round-up'),\n\t\teast: snapToGrid(a.east, resolution),\n\t\twest: snapToGrid(a.west, resolution, 'round-up')\n\t};\n};\n\nexport const findFinestGrid = (legs: Map) => {\n\tconst finest = Math.min(\n\t\t...Array.from(legs.values())\n\t\t\t.filter(l => l.grid?.value !== undefined)\n\t\t\t.map(l => l.grid!.value!)\n\t);\n\n\treturn isFinite(finest) ? finest : undefined;\n};\n","import * as ol from \"ol\";\nimport * as React from \"react\";\nimport { useAnimationFrame } from \"./useAnimationFrame\";\n\nexport const MOUSE_DRAG_THRESHOLD = 5;\ntype Coordinate = [number, number];\n\n/**\n * Applied to an openlayers map element, produces drag start, drag animation, drag end, and click events\n */\ntype MouseState =\n\t| { type: \"none\" }\n\t| { type: \"down\"; downCoord: Coordinate }\n\t| {\n\t\t\ttype: \"moved\";\n\t\t\tdownCoord: Coordinate;\n\t\t\tdrift: number;\n\t\t\tlastScreenX: number;\n\t\t\tlastScreenY: number;\n\t }\n\t| { type: \"dragging\" }\n\t| { type: \"click\"; coord: Coordinate }\n\t| { type: \"dragEnd\" };\n\nexport const useOpenLayersDrag = (options: {\n\ttarget: React.MutableRefObject;\n\tonDragStart: (projX: number, projY: number) => void;\n\tonDrag: (projX: number, projY: number, pixelX: number, pixelY: number) => void;\n\tonDragEnd: () => void;\n\tonClick?: (projX: number, projY: number) => void;\n}) => {\n\tconst [mouse, setMouse] = React.useState({ type: \"none\" });\n\tconst capturedPointer = React.useRef(undefined);\n\n\tconst activeTransitionTarget = React.useRef();\n\n\tconst transitionState = React.useCallback(\n\t\t(targetState: MouseState) => {\n\t\t\tactiveTransitionTarget.current = targetState.type;\n\n\t\t\tsetMouse(mouseNow => {\n\t\t\t\tif (mouseNow === mouse) {\n\t\t\t\t\treturn targetState;\n\t\t\t\t} else {\n\t\t\t\t\treturn mouseNow;\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t\t[mouse, setMouse]\n\t);\n\n\tconst animate = useAnimationFrame();\n\n\tconst { onDragStart, onDragEnd, onDrag, onClick, target } = options;\n\n\tReact.useEffect(() => {\n\t\tif (activeTransitionTarget.current === mouse.type) {\n\t\t\tactiveTransitionTarget.current = undefined;\n\t\t}\n\n\t\t// capture target.current else it may change before the callback functions run\n\t\tconst current = target.current;\n\n\t\tswitch (mouse.type) {\n\t\t\tcase \"none\": {\n\t\t\t\tconst pointerDownListener = (e: ol.MapBrowserPointerEvent) => {\n\t\t\t\t\tconst browserEvent = e.originalEvent as PointerEvent;\n\n\t\t\t\t\tif (browserEvent.button !== 0) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tsetMouse({\n\t\t\t\t\t\ttype: \"down\",\n\t\t\t\t\t\tdownCoord: e.coordinate as Coordinate\n\t\t\t\t\t});\n\t\t\t\t};\n\n\t\t\t\tconst viewportElement = current!.getViewport();\n\n\t\t\t\tif (\n\t\t\t\t\tcapturedPointer.current !== undefined &&\n\t\t\t\t\t(viewportElement.hasPointerCapture === undefined ||\n\t\t\t\t\t\tviewportElement.hasPointerCapture(capturedPointer.current))\n\t\t\t\t) {\n\t\t\t\t\tviewportElement.releasePointerCapture(capturedPointer.current);\n\t\t\t\t\tcapturedPointer.current = undefined;\n\t\t\t\t}\n\n\t\t\t\tcurrent!.on(\"pointerdown\", pointerDownListener as any);\n\t\t\t\treturn () => {\n\t\t\t\t\tcurrent!.un(\"pointerdown\", pointerDownListener as any);\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tcase \"down\": {\n\t\t\t\tconst pointerMoveListener = (e: ol.MapBrowserPointerEvent) => {\n\t\t\t\t\tconst browserEvent = e.originalEvent as PointerEvent;\n\t\t\t\t\tcurrent!.getViewport().setPointerCapture(browserEvent.pointerId);\n\t\t\t\t\tcapturedPointer.current = browserEvent.pointerId;\n\n\t\t\t\t\ttransitionState({\n\t\t\t\t\t\ttype: \"moved\",\n\t\t\t\t\t\tdownCoord: mouse.downCoord,\n\t\t\t\t\t\tdrift: 0,\n\t\t\t\t\t\tlastScreenX: browserEvent.screenX,\n\t\t\t\t\t\tlastScreenY: browserEvent.screenY\n\t\t\t\t\t});\n\t\t\t\t};\n\n\t\t\t\tcurrent!.on(\"pointermove\", pointerMoveListener as any);\n\n\t\t\t\tdocument.body.onpointerup = () => setMouse({ type: \"click\", coord: mouse.downCoord });\n\t\t\t\tdocument.body.onpointerdown = () => transitionState({ type: \"none\" });\n\n\t\t\t\treturn () => {\n\t\t\t\t\tcurrent!.un(\"pointermove\", pointerMoveListener as any);\n\t\t\t\t\tdocument.body.onpointerup = null;\n\t\t\t\t\tdocument.body.onpointerdown = null;\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tcase \"moved\": {\n\t\t\t\tconst pointerMoveListener = (e: ol.MapBrowserPointerEvent) => {\n\t\t\t\t\tconst browserEvent = e.originalEvent as PointerEvent;\n\n\t\t\t\t\tif (activeTransitionTarget.current) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (mouse.drift > MOUSE_DRAG_THRESHOLD) {\n\t\t\t\t\t\tif (onDragStart) {\n\t\t\t\t\t\t\tonDragStart(...mouse.downCoord);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttransitionState({\n\t\t\t\t\t\t\ttype: \"dragging\"\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttransitionState({\n\t\t\t\t\t\t\ttype: \"moved\",\n\t\t\t\t\t\t\tdownCoord: mouse.downCoord,\n\t\t\t\t\t\t\tdrift:\n\t\t\t\t\t\t\t\tmouse.drift +\n\t\t\t\t\t\t\t\tMath.abs(browserEvent.screenX - mouse.lastScreenX) +\n\t\t\t\t\t\t\t\tMath.abs(browserEvent.screenY - mouse.lastScreenY),\n\t\t\t\t\t\t\tlastScreenX: browserEvent.screenX,\n\t\t\t\t\t\t\tlastScreenY: browserEvent.screenY\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\tcurrent!.on(\"pointermove\", pointerMoveListener as any);\n\n\t\t\t\tdocument.body.onpointerup = () => {\n\t\t\t\t\tsetMouse(mouseNow => {\n\t\t\t\t\t\tif (mouseNow.type === \"moved\") {\n\t\t\t\t\t\t\treturn { type: \"click\", coord: mouse.downCoord };\n\t\t\t\t\t\t} else if (mouseNow.type === \"dragging\") {\n\t\t\t\t\t\t\treturn { type: \"dragEnd\" };\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn { type: \"none\" };\n\t\t\t\t\t});\n\t\t\t\t};\n\t\t\t\tdocument.body.onpointerdown = () => transitionState({ type: \"none\" });\n\n\t\t\t\treturn () => {\n\t\t\t\t\tcurrent!.un(\"pointermove\", pointerMoveListener as any);\n\n\t\t\t\t\tdocument.body.onpointerup = null;\n\t\t\t\t\tdocument.body.onpointerdown = null;\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tcase \"dragging\": {\n\t\t\t\tconst pointerMoveListener = (e: ol.MapBrowserPointerEvent) => {\n\t\t\t\t\tanimate(() => onDrag(e.coordinate[0], e.coordinate[1], e.pixel[0], e.pixel[1]));\n\t\t\t\t};\n\n\t\t\t\tcurrent!.on(\"pointermove\", pointerMoveListener as any);\n\t\t\t\tdocument.body.onpointerup = () => setMouse({ type: \"dragEnd\" });\n\t\t\t\tdocument.body.onpointerdown = () => transitionState({ type: \"none\" });\n\n\t\t\t\treturn () => {\n\t\t\t\t\tcurrent!.un(\"pointermove\", pointerMoveListener as any);\n\t\t\t\t\tdocument.body.onpointerup = null;\n\t\t\t\t\tdocument.body.onpointerdown = null;\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tcase \"click\":\n\t\t\t\tif (onClick) {\n\t\t\t\t\tonClick(...mouse.coord);\n\t\t\t\t}\n\t\t\t\tsetMouse({ type: \"none\" });\n\t\t\t\tbreak;\n\n\t\t\tcase \"dragEnd\":\n\t\t\t\tif (onDragEnd) {\n\t\t\t\t\tonDragEnd();\n\t\t\t\t}\n\n\t\t\t\tsetMouse({ type: \"none\" });\n\t\t\t\tbreak;\n\t\t}\n\t}, [\n\t\tonDragStart,\n\t\tonDragEnd,\n\t\tonDrag,\n\t\tonClick,\n\t\tmouse,\n\t\tsetMouse,\n\t\tcapturedPointer,\n\t\ttransitionState,\n\t\tanimate,\n\t\ttarget\n\t]);\n};\n","import * as React from \"react\";\n\n/**\n * Rate limits a callback function to the animation frame rate\n */\n\ntype Callback = () => void;\n\nexport const useAnimationFrame = () => {\n\tconst callbackRef = React.useRef();\n\tconst isLooping = React.useRef(false);\n\n\tconst loop = () => {\n\t\tif (callbackRef.current) {\n\t\t\tisLooping.current = true;\n\t\t\tcallbackRef.current();\n\t\t\tcallbackRef.current = undefined;\n\t\t\trequestAnimationFrame(loop);\n\t\t} else {\n\t\t\tisLooping.current = false;\n\t\t}\n\t};\n\n\treturn (callback: Callback) => {\n\t\tcallbackRef.current = callback;\n\t\tif (!isLooping.current) {\n\t\t\trequestAnimationFrame(loop);\n\t\t}\n\t};\n};\n","import * as ol from \"ol\";\nimport * as Extent from \"ol/extent\";\nimport VectorLayer from \"ol/layer/Vector\";\nimport * as Proj from \"ol/proj\";\nimport * as React from \"react\";\nimport { Area } from \"../entities/Area\";\nimport { snapAreaToGrid } from \"../utils/Area\";\nimport { useOpenLayersDrag } from \"./useOpenLayersDrag\";\n\ntype Coordinate = [number, number];\nconst [leftMost, , rightMost] = [...Proj.fromLonLat([-180, 90]), ...Proj.fromLonLat([180, -90])];\nconst worldWidth = rightMost - leftMost;\nconst halfWorldWidth = worldWidth / 2;\n\ntype DragState =\n\t| { type: \"none\" }\n\t| {\n\t\t\ttype: \"dragEdgeVertical\";\n\t\t\tmaxY: number;\n\t\t\tminY: number;\n\t\t\tfixedX: number;\n\t\t\tdraggedX: number;\n\t\t\txRange: [number, number];\n\t }\n\t| {\n\t\t\ttype: \"dragEdgeHorizontal\";\n\t\t\tmaxX: number;\n\t\t\tminX: number;\n\t\t\tfixedY: number;\n\t\t\tdraggedY: number;\n\t }\n\t| {\n\t\t\ttype: \"dragVertex\";\n\t\t\tfixedCoord: Coordinate;\n\t\t\tdraggedCoord: Coordinate;\n\t\t\tcursor: string;\n\t\t\txRange: [number, number];\n\t }\n\t| {\n\t\t\ttype: \"dragBulk\";\n\t\t\toffsetX: number;\n\t\t\toffsetY: number;\n\t\t\twidth: number;\n\t\t\theight: number;\n\t\t\tdraggedCoord: Coordinate;\n\t\t\t// xRange: [number, number];\n\t }\n\t| {\n\t\t\ttype: \"dragMap\";\n\t\t\tstartCoord: Coordinate;\n\t\t\tlastPixel?: Coordinate;\n\t };\n\nconst constrain = (value: number, [min, max]: [number, number]) => {\n\tif (value < min) {\n\t\treturn min;\n\t}\n\tif (value > max) {\n\t\treturn max;\n\t}\n\treturn value;\n};\n\nconst constrainX: ([x, y]: Coordinate, range: [number, number]) => Coordinate = ([x, y], range) => [\n\tconstrain(x, range),\n\ty\n];\n\nconst sameWorld: (xCoord: number) => [number, number] = xCoord => {\n\tconst xWorlds = xCoord / worldWidth;\n\n\t// A little complexity since JavaScript Math.round does NOT round away from zero\n\tconst numWholeWords = Math.round(Math.abs(xWorlds));\n\tconst worldOffset = xWorlds < 0 ? -numWholeWords : numWholeWords;\n\n\treturn [leftMost + worldOffset * worldWidth, rightMost + worldOffset * worldWidth];\n};\n\nconst dragStateToCursor: (dragState: DragState) => string = (dragState: DragState) => {\n\tswitch (dragState.type) {\n\t\tcase \"none\":\n\t\t\treturn \"default\";\n\t\tcase \"dragBulk\":\n\t\t\treturn \"move\";\n\t\tcase \"dragEdgeHorizontal\":\n\t\t\treturn \"ns-resize\";\n\t\tcase \"dragEdgeVertical\":\n\t\t\treturn \"ew-resize\";\n\t\tcase \"dragMap\":\n\t\t\treturn \"grab\";\n\t\tcase \"dragVertex\":\n\t\t\treturn dragState.cursor;\n\t}\n};\n\nconst dragStateToCoordinates: (dragState: DragState) => [Coordinate, Coordinate] | null = (\n\tdragState: DragState\n) => {\n\tswitch (dragState.type) {\n\t\tcase \"dragVertex\":\n\t\t\treturn [dragState.fixedCoord, constrainX(dragState.draggedCoord, dragState.xRange)];\n\t\tcase \"dragEdgeHorizontal\":\n\t\t\treturn [\n\t\t\t\t[dragState.minX, dragState.fixedY],\n\t\t\t\t[dragState.maxX, dragState.draggedY]\n\t\t\t];\n\t\tcase \"dragEdgeVertical\":\n\t\t\treturn [\n\t\t\t\t[dragState.fixedX, dragState.minY],\n\t\t\t\t[constrain(dragState.draggedX, dragState.xRange), dragState.maxY]\n\t\t\t];\n\t\tcase \"dragBulk\":\n\t\t\tconst leftTop: Coordinate = [\n\t\t\t\tdragState.draggedCoord[0] - dragState.offsetX,\n\t\t\t\tdragState.draggedCoord[1] - dragState.offsetY\n\t\t\t];\n\t\t\tconst rightBottom: Coordinate = [leftTop[0] + dragState.width, leftTop[1] + dragState.height];\n\n\t\t\tconst worldXPositions = [\n\t\t\t\tMath.abs(leftTop[0]) % worldWidth,\n\t\t\t\tMath.abs(rightBottom[0]) % worldWidth\n\t\t\t];\n\t\t\tif (\n\t\t\t\tMath.min(...worldXPositions) < halfWorldWidth &&\n\t\t\t\tMath.max(...worldXPositions) > halfWorldWidth\n\t\t\t) {\n\t\t\t\t// Area straddles the dateline, snap to the nearest side of it\n\t\t\t\tif (\n\t\t\t\t\tMath.abs(worldXPositions[0] - halfWorldWidth) <\n\t\t\t\t\tMath.abs(worldXPositions[1] - halfWorldWidth)\n\t\t\t\t) {\n\t\t\t\t\tleftTop[0] += Math.abs(worldXPositions[0] - halfWorldWidth);\n\t\t\t\t\trightBottom[0] += Math.abs(worldXPositions[0] - halfWorldWidth);\n\t\t\t\t} else {\n\t\t\t\t\tleftTop[0] -= Math.abs(worldXPositions[1] - halfWorldWidth);\n\t\t\t\t\trightBottom[0] -= Math.abs(worldXPositions[1] - halfWorldWidth);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn [leftTop, rightBottom];\n\n\t\tcase \"dragMap\":\n\t\tcase \"none\":\n\t\t\treturn null;\n\t}\n};\n\nconst coordsToArea = (coords: [Coordinate, Coordinate]) => {\n\tconst [coord1, coord2] = coords;\n\n\t// Ordering coordinates before projecting allows for areas that span\n\t// the international date-line and for which west > east\n\t// NB This is currently forbidden since openlayers doesn't properly\n\t// support such features and ECMWF validation rejects them anyway\n\tconst minX = Math.min(coord1[0], coord2[0]);\n\tconst maxX = Math.max(coord1[0], coord2[0]);\n\tconst minY = Math.min(coord1[1], coord2[1]);\n\tconst maxY = Math.max(coord1[1], coord2[1]);\n\n\t// Round to 2dp and handle the -180,180 ambiguity for longitude\n\tconst [west, north] = Proj.toLonLat([minX, maxY]).map(c => Math.round(c * 100) / 100);\n\tconst [east, south] = Proj.toLonLat([maxX, minY]).map(c => Math.round(c * 100) / 100);\n\n\treturn {\n\t\tnorth,\n\t\teast: east === -180 ? 180 : east,\n\t\tsouth,\n\t\twest: west === 180 ? -180 : west\n\t};\n};\n\nconst areaToCoords = (area: Area): [Coordinate, Coordinate] => {\n\treturn [\n\t\tProj.fromLonLat([area.west, area.north]) as Coordinate,\n\t\tProj.fromLonLat([area.east, area.south]) as Coordinate\n\t];\n};\n\nexport const useOlFeatureEditing = ({\n\tmapRef,\n\teditableLayer,\n\taddMode,\n\tactiveFeature,\n\tonUpdateFeature,\n\tgrid\n}: {\n\tmapRef: React.MutableRefObject;\n\teditableLayer: React.MutableRefObject;\n\taddMode: boolean;\n\tactiveFeature: ol.Feature | undefined;\n\tonUpdateFeature: (area: Area, feature?: ol.Feature) => void;\n\tgrid?: number;\n}): { cursor: string; coords?: [Coordinate, Coordinate]; area?: Area } => {\n\tconst [dragState, setDragState] = React.useState({ type: \"none\" });\n\n\tconst dragStartHandler = React.useCallback(\n\t\t(x, y) => {\n\t\t\tif (dragState.type !== \"none\") {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (addMode) {\n\t\t\t\t// All drags in add mode draw a new areas\n\t\t\t\tsetDragState({\n\t\t\t\t\ttype: \"dragVertex\",\n\t\t\t\t\tfixedCoord: [x, y],\n\t\t\t\t\tdraggedCoord: [x, y],\n\t\t\t\t\tcursor: \"crosshair\",\n\t\t\t\t\txRange: sameWorld(x)\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst pixel = mapRef.current!.getPixelFromCoordinate([x, y]);\n\t\t\tconst hitFeatures = mapRef.current!.getFeaturesAtPixel(pixel, {\n\t\t\t\thitTolerance: 20,\n\t\t\t\tlayerFilter: layer => layer === editableLayer.current\n\t\t\t});\n\n\t\t\t// Currently only the active areas responds to drags. We could abandon the concept\n\t\t\t// of an active area and have the drag affect whichever area it hits.\n\t\t\tconst feature = (hitFeatures || []).find(hit => hit === activeFeature);\n\n\t\t\tif (feature === undefined) {\n\t\t\t\tsetDragState({ type: \"dragMap\", startCoord: [x, y] });\n\t\t\t} else {\n\t\t\t\tconst extent = feature.getGeometry()!.getExtent();\n\n\t\t\t\tconst [leftCoordRaw, topCoord] = Extent.getTopLeft(extent);\n\t\t\t\tconst [rightCoordRaw, bottomCoord] = Extent.getBottomRight(extent);\n\n\t\t\t\t// For wide zoom levels, the world map and all the features may be drawn multiple times\n\t\t\t\t// so we translate the extent to match the copy that was actually hit by the pointer event\n\t\t\t\tlet [leftCoord, rightCoord] = [leftCoordRaw, rightCoordRaw];\n\n\t\t\t\tif (x < leftCoordRaw) {\n\t\t\t\t\tconst numWorlds = Math.floor((rightCoordRaw - x) / worldWidth);\n\t\t\t\t\t[leftCoord, rightCoord] = [\n\t\t\t\t\t\tleftCoordRaw - numWorlds * worldWidth,\n\t\t\t\t\t\trightCoordRaw - numWorlds * worldWidth\n\t\t\t\t\t];\n\t\t\t\t} else if (x > rightCoordRaw) {\n\t\t\t\t\tconst numWorlds = Math.floor((x - leftCoordRaw) / worldWidth);\n\t\t\t\t\t[leftCoord, rightCoord] = [\n\t\t\t\t\t\tleftCoordRaw + numWorlds * worldWidth,\n\t\t\t\t\t\trightCoordRaw + numWorlds * worldWidth\n\t\t\t\t\t];\n\t\t\t\t}\n\n\t\t\t\tconst centreXCoord = (leftCoord + rightCoord) / 2;\n\n\t\t\t\tconst [left, top] = mapRef.current!.getPixelFromCoordinate([leftCoord, topCoord]);\n\t\t\t\tconst [right, bottom] = mapRef.current!.getPixelFromCoordinate([rightCoord, bottomCoord]);\n\n\t\t\t\tconst xMargin = Math.max(5, (right - left) / 8);\n\t\t\t\tconst yMargin = Math.max(5, (bottom - top) / 8);\n\n\t\t\t\tconst rightDistance = right - pixel[0];\n\t\t\t\tconst leftDistance = pixel[0] - left;\n\t\t\t\tconst topDistance = pixel[1] - top;\n\t\t\t\tconst bottomDistance = bottom - pixel[1];\n\n\t\t\t\tconst verticalEdges =\n\t\t\t\t\tleftDistance < rightDistance\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\tfixedX: rightCoord,\n\t\t\t\t\t\t\t\tdistance: leftDistance\n\t\t\t\t\t\t }\n\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t\tfixedX: leftCoord,\n\t\t\t\t\t\t\t\tdistance: rightDistance\n\t\t\t\t\t\t };\n\n\t\t\t\tconst horizontalEdges =\n\t\t\t\t\ttopDistance < bottomDistance\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\tfixedY: bottomCoord,\n\t\t\t\t\t\t\t\tdistance: topDistance\n\t\t\t\t\t\t }\n\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t\tfixedY: topCoord,\n\t\t\t\t\t\t\t\tdistance: bottomDistance\n\t\t\t\t\t\t };\n\n\t\t\t\t// Allow a double margin for drag vertex as it can accomplish all the same changes\n\t\t\t\t// as drag edge and therefore it is strictly more useful\n\t\t\t\tif (verticalEdges.distance < xMargin * 2 && horizontalEdges.distance < yMargin * 2) {\n\t\t\t\t\tsetDragState({\n\t\t\t\t\t\ttype: \"dragVertex\",\n\t\t\t\t\t\tfixedCoord: [verticalEdges.fixedX, horizontalEdges.fixedY],\n\t\t\t\t\t\tdraggedCoord: [x, y],\n\t\t\t\t\t\tcursor:\n\t\t\t\t\t\t\t(x - verticalEdges.fixedX) * (y - horizontalEdges.fixedY) < 0\n\t\t\t\t\t\t\t\t? \"nwse-resize\"\n\t\t\t\t\t\t\t\t: \"nesw-resize\",\n\t\t\t\t\t\txRange: sameWorld(centreXCoord)\n\t\t\t\t\t});\n\t\t\t\t} else if (verticalEdges.distance < xMargin) {\n\t\t\t\t\tsetDragState({\n\t\t\t\t\t\ttype: \"dragEdgeVertical\",\n\t\t\t\t\t\tminY: topCoord,\n\t\t\t\t\t\tmaxY: bottomCoord,\n\t\t\t\t\t\tfixedX: verticalEdges.fixedX,\n\t\t\t\t\t\tdraggedX: x,\n\t\t\t\t\t\txRange: sameWorld(centreXCoord)\n\t\t\t\t\t});\n\t\t\t\t} else if (horizontalEdges.distance < yMargin) {\n\t\t\t\t\tsetDragState({\n\t\t\t\t\t\ttype: \"dragEdgeHorizontal\",\n\t\t\t\t\t\tminX: leftCoord,\n\t\t\t\t\t\tmaxX: rightCoord,\n\t\t\t\t\t\tfixedY: horizontalEdges.fixedY,\n\t\t\t\t\t\tdraggedY: y\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tsetDragState({\n\t\t\t\t\t\ttype: \"dragBulk\",\n\t\t\t\t\t\tdraggedCoord: [x, y],\n\t\t\t\t\t\toffsetX: x - leftCoord,\n\t\t\t\t\t\toffsetY: y - topCoord,\n\t\t\t\t\t\theight: bottomCoord - topCoord,\n\t\t\t\t\t\twidth: rightCoord - leftCoord\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t[addMode, setDragState, dragState.type, activeFeature, mapRef, editableLayer]\n\t);\n\n\tconst dragHandler = React.useCallback(\n\t\t(x, y, pixelX, pixelY) => {\n\t\t\tconst dragUpdate = (newState: DragState) => {\n\t\t\t\tsetDragState((state: DragState) => {\n\t\t\t\t\tif (state.type === \"none\") {\n\t\t\t\t\t\treturn state;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn newState;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t};\n\t\t\tswitch (dragState.type) {\n\t\t\t\tcase \"dragVertex\":\n\t\t\t\t\tdragUpdate({ ...dragState, draggedCoord: [x, y] });\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"dragEdgeHorizontal\":\n\t\t\t\t\tdragUpdate({ ...dragState, draggedY: y });\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"dragEdgeVertical\":\n\t\t\t\t\tdragUpdate({ ...dragState, draggedX: x });\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"dragBulk\":\n\t\t\t\t\tdragUpdate({ ...dragState, draggedCoord: [x, y] });\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"dragMap\":\n\t\t\t\t\tif (\n\t\t\t\t\t\tdragState.lastPixel === undefined ||\n\t\t\t\t\t\tMath.abs(dragState.lastPixel[0] - pixelX) > 1 ||\n\t\t\t\t\t\tMath.abs(dragState.lastPixel[1] - pixelY) > 1\n\t\t\t\t\t) {\n\t\t\t\t\t\t// We re-centre the map based on drag event pixel coordinates: using map coordinates\n\t\t\t\t\t\t// is unstable because calling setCentre() changes the pixel-to-map correspondence\n\t\t\t\t\t\tconst [centreX, centreY] = mapRef.current!.getView().getCenter()!;\n\t\t\t\t\t\tconst [coordX, coordY] = mapRef.current!.getCoordinateFromPixel([pixelX, pixelY]);\n\t\t\t\t\t\tconst [newX, newY] = [\n\t\t\t\t\t\t\tcentreX - coordX + dragState.startCoord[0],\n\t\t\t\t\t\t\tcentreY - coordY + dragState.startCoord[1]\n\t\t\t\t\t\t];\n\n\t\t\t\t\t\tmapRef.current!.getView().setCenter([newX, newY]);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t},\n\t\t[dragState, setDragState, mapRef]\n\t);\n\n\tconst dragEndHandler = React.useCallback(() => {\n\t\tsetDragState({ type: \"none\" });\n\n\t\tif (dragState.type === \"dragMap\") {\n\t\t\t// Where multiple copies of the world are shown at distant zoom levels,\n\t\t\t// re-normalize map to ensure centreX is in the primary world\n\t\t\tconst [centreXRaw, centreY] = mapRef.current!.getView().getCenter()!;\n\t\t\tlet centreX = centreXRaw;\n\n\t\t\twhile (centreX < leftMost) {\n\t\t\t\tcentreX += worldWidth;\n\t\t\t}\n\n\t\t\twhile (centreX > rightMost) {\n\t\t\t\tcentreX -= worldWidth;\n\t\t\t}\n\n\t\t\tmapRef.current!.getView().setCenter([centreX, centreY]);\n\t\t\treturn;\n\t\t}\n\n\t\tconst coords = dragStateToCoordinates(dragState);\n\t\tif (coords !== null) {\n\t\t\tonUpdateFeature(coordsToArea(coords), addMode ? undefined : activeFeature);\n\t\t}\n\t}, [dragState, setDragState, activeFeature, addMode, mapRef, onUpdateFeature]);\n\n\t// Wire up drag and click events\n\tuseOpenLayersDrag({\n\t\ttarget: mapRef,\n\t\tonDragStart: dragStartHandler,\n\t\tonDrag: dragHandler,\n\t\tonDragEnd: dragEndHandler\n\t});\n\n\treturn React.useMemo(() => {\n\t\tconst cursor = dragStateToCursor(dragState);\n\t\tconst rawCoords = dragStateToCoordinates(dragState);\n\n\t\tif (rawCoords === null) {\n\t\t\treturn { cursor };\n\t\t} else {\n\t\t\tconst rawArea = coordsToArea(rawCoords);\n\t\t\tconst snappedArea = grid ? snapAreaToGrid(rawArea, grid) : rawArea;\n\t\t\tconst snappedCoords = areaToCoords(snappedArea);\n\t\t\treturn {\n\t\t\t\tcoords: snappedCoords,\n\t\t\t\tarea: snappedArea,\n\t\t\t\tcursor\n\t\t\t};\n\t\t}\n\t}, [dragState, grid]);\n};\n","/**\n * ID of the ECMWF CCP.\n */\nexport const ECMWF_CCP = 889;\n\n/**\n * Default time steps.\n */\nexport const BASIC_SET = [72, 96, 120, 144, 168];\nexport const MANDATORY_STEPS = [72, 96, 120, 144, 168];\n\n/**\n * Earliest time step which is considered \"mid-range\".\n */\nexport const MID_RANGE_START = 67;\n\n/**\n * UI warning.\n */\nexport const SHORT_RANGE_WARNING =\n\t\"You have selected steps that create a short-range forecast. To meet our requirements, we have autoselected several steps to create a mid-range forecast. You can only unselect these steps if you select a range that goes beyond 12-66.\";\n\n/**\n * UI warning.\n */\nexport const NO_STEPS_WARNING =\n\t\"You have not selected any steps. To meet our requirements, we have autoselected several steps to create a mid-range forecast. You can only unselect these steps if you select a range that goes beyond 12-66.\";\n\n/**\n * The set of allowed time-step factors in the UI's time-steps editor.\n */\nexport const DEFAULT_FACTORS = [1, 3, 6, 12, 24];\n\nexport const DYNAMIC_PAGE_MATCHER = \"zaEZwRmwTV3f7ML\";\n\n/** Maximum number of points for a parameter time series product */\nexport const MAX_LOCATIONS = 500;\n\nexport const VOLUME_LIMIT_IN_MB = 100_000;\nexport const VOLUME_LIMIT = VOLUME_LIMIT_IN_MB * 1_000_000;\n","export type ValidationResult = {\n\tisValid: boolean;\n\terror?: string;\n};\n\nexport const validResult: ValidationResult = {\n\tisValid: true\n};\n\nexport const invalidResult = (error: string): ValidationResult => ({\n\tisValid: false,\n\terror\n});\n","import { MAX_LOCATIONS } from \"../constants/Constants\";\nimport { Area } from \"../entities/Area\";\nimport { invalidResult, validResult } from \"../entities/ValidationResult\";\n\n/**\n * Checks a string exists and is non-empty.\n */\nexport const validateRequiredString = (str?: string) =>\n\tstr == null || str.trim().length === 0 ? invalidResult(\"This field is required\") : validResult;\n\n/**\n * Checks an object exists.\n */\nexport const validateRequiredObject = (obj?: any) =>\n\tobj == null ? invalidResult(\"This field is required\") : validResult;\n\n/**\n * Checks an array has at least one element.\n */\nexport const validateRequiredEntry = (array?: any[]) =>\n\tarray && array.length === 0 ? invalidResult(\"At least one option must be selected\") : validResult;\n\n/**\n * Checks that an area is valid.\n */\nexport const validateArea = (area?: Area) => {\n\tif (\n\t\t!area ||\n\t\tarea.north == null ||\n\t\tarea.west == null ||\n\t\tarea.south == null ||\n\t\tarea.east == null ||\n\t\tisNaN(area.north) ||\n\t\tisNaN(area.south) ||\n\t\tisNaN(area.west) ||\n\t\tisNaN(area.east)\n\t) {\n\t\treturn invalidResult(\"All values must be provided\");\n\t}\n\n\tif (area.north > 90 || area.north < -90) {\n\t\treturn invalidResult(\"North must be between 90 and -90\");\n\t}\n\n\tif (area.south > 90 || area.south < -90) {\n\t\treturn invalidResult(\"South must be between 90 and -90\");\n\t}\n\n\tif (area.east > 180 || area.east < -180) {\n\t\treturn invalidResult(\"East must be between 180 and -180\");\n\t}\n\n\tif (area.west > 180 || area.west < -180) {\n\t\treturn invalidResult(\"West must be between 180 and -180\");\n\t}\n\n\tif (area.north < area.south) {\n\t\treturn invalidResult(\"North must be greater than south\");\n\t}\n\n\tif (area.east < area.west) {\n\t\treturn invalidResult(\"East must be greater than west\");\n\t}\n\n\tconst a = (area.north - area.south) * (area.east - area.west);\n\tif (a < 6) {\n\t\treturn invalidResult(\"Area must be at least 6 degree squares\");\n\t}\n\n\treturn validResult;\n};\n\n/* Validate number of locations is assigned a value between 1 and 500 */\nexport const validateNumLocations = (num?: number | null) =>\n\tnum === null || num === undefined || num < 1 || num > MAX_LOCATIONS || !Number.isInteger(num)\n\t\t? invalidResult(`Enter a whole number between 1 and ${MAX_LOCATIONS}`)\n\t\t: validResult;\n","export const sortNumbers = (arr: Array) => {\n return [...arr].sort((a, b) => a - b);\n};\n\nexport const sortNumericStrings = (arr: Array) => {\n return [...arr].sort((a, b) => parseInt(a, 10) - parseInt(b, 10));\n}\n\nconst firstPartitionIndex = (sortedArr: Array) => {\n let index = 0;\n const diff = sortedArr[1] - sortedArr[0];\n\n while (diff === sortedArr[index + 1] - sortedArr[index]) {\n index++;\n }\n\n return index;\n}\n\nexport const partitionByDiff = (sortedArray: Array): Array<{\n diff: number,\n items: Array\n}> => {\n const partitions = [];\n let values = [...sortedArray];\n\n while (values.length !== 0) {\n const diff = values[1] - values[0];\n let partitionIndex = firstPartitionIndex(values);\n\n partitions.push({\n diff: diff,\n items: values.slice(0, partitionIndex + 1)\n });\n\n values = values.slice(partitionIndex + 1);\n partitionIndex = 0;\n }\n\n return partitions;\n}\n","import { TApiSubset } from '../api/endpoints/Subset';\nimport { Area } from '../entities/Area';\nimport { Day } from '../entities/Day';\nimport { DayStepRange } from '../entities/DayStepRange';\nimport { LeveledParam } from '../entities/LeveledParam';\nimport { Quantile } from '../entities/Quantile';\nimport { QuantiledParam } from '../entities/QuantiledParam';\nimport { Resolution } from '../entities/Resolution';\nimport { StepRange } from '../entities/StepRange';\nimport { TParamLevelistValue } from \"../components/RealtimeProductConfigurator/ParamLevelistSelector\";\nimport { partitionByDiff } from \"./Array\";\nimport { TApiParameter } from \"../api/endpoints/Parameter\";\nimport { TApiVolumeBand } from \"../api/endpoints/VolumeBand\";\n\n\nconst mapDayToString = (day: Day | number) => {\n switch (day) {\n case 0:\n return 'Monday';\n case 1:\n return 'Tuesday';\n case 2:\n return 'Wednesday';\n case 3:\n return 'Thursday';\n case 4:\n return 'Friday';\n case 5:\n return 'Saturday';\n case 6:\n return 'Sunday';\n default:\n return 'N/A'\n }\n}\n/**\n * Create a formatter which accepts an undefined param.\n */\nconst makeNull = (formatter: (arg: T) => O1, def: O2) => (arg?: T) =>\n arg == null ? def : formatter(arg);\n\nconst orderNumbers = (arr: number[]) => arr.slice().sort((a, b) => a - b);\n\nexport const formatResolution = (res?: Resolution) => (res ? res.name : 'None');\n\nexport const formatRun = (run: Day | number): string => {\n return mapDayToString(run);\n};\n\nexport const formatHindcastDay = (day: Day | number): string => {\n return mapDayToString(day);\n}\n\nexport const formatRunRange = (value: DayStepRange): string =>\n `${formatRun(value.day)}/${formatStepRange(value.range)}`;\n\nexport const formatDayStepRanges = makeNull(\n (value: DayStepRange[]) => value.map(formatRunRange),\n 'None'\n);\n\nexport const formatBaseTime = (time: number | string) => time.toString().padStart(2, '0');\n\nexport const formatBaseTimes = makeNull(\n (value: number[]) => orderNumbers(value).map(formatBaseTime),\n ['None']\n);\n\nexport const formatStepRange = (range: StepRange) => `${range.start}-${range.end}`;\n\nexport const formatLeveledParam = (param: LeveledParam | TParamLevelistValue) => `${param.param}/${param.level}`;\n\nexport const formatLeveledParams = makeNull(\n (value: LeveledParam[]) => value.map(formatLeveledParam),\n 'None'\n);\n\nexport const formatArea = makeNull((area: Area) => {\n const str: string[] = [];\n\n if (area.north != null) {\n str.push(`N: ${formatRounded(area.north, 3)}`);\n }\n\n if (area.west != null) {\n str.push(`W: ${formatRounded(area.west, 3)}`);\n }\n\n if (area.south != null) {\n str.push(`S: ${formatRounded(area.south, 3)}`);\n }\n\n if (area.east != null) {\n str.push(`E: ${formatRounded(area.east, 3)}`);\n }\n\n return str.join(' ');\n}, 'Empty');\n\nexport const formatAreas = makeNull((areas: Area[]) => areas.map(a => formatArea(a)), 'Empty');\n\nexport const withDefault = (value: T | undefined, func: (t: T) => string, def: string): string =>\n makeNull(func, def)(value);\n\nexport const formatInteger = (value: number): string =>\n value.toLocaleString('en-GB', {\n maximumFractionDigits: 0\n });\n\nexport const formatDecimal = (value: number): string =>\n value.toLocaleString('en-GB', {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2\n });\n\nexport const formatMegaBytes = (value: number): string => formatDecimal(value) + ' MB';\n\nexport const formatBinaryCapacityUnit = (n: number, precision: number = 2) => {\n const units = [\"\", \"KiB\", \"MiB\", \"GiB\", \"TiB\", \"PiB\", \"EiB\", \"ZiB\", \"YiB\"];\n\n let unitIndex = 0;\n\n while(n >= 1024) {\n n = n / 1024;\n unitIndex += 1;\n }\n\n return [n.toFixed(2), units[unitIndex]].join(' ');\n}\n\nexport const formatVolumeBand = (volumeBand: TApiVolumeBand) => {\n if (volumeBand.min_gb === 0) {\n return `<${volumeBand.max_gb} GiB`;\n }\n\n return `${volumeBand.min_gb} - ${volumeBand.max_gb} GiB`;\n}\n\nexport const formatCurrency = (value: number, precision: number = 2): string =>\n value.toLocaleString('en-GB', {\n style: 'currency',\n currency: 'EUR',\n minimumFractionDigits: precision\n });\n\n// JavaScript requires a song and a dance to get fixed DP without trailing zeroes\nexport const formatRounded = (value: number, dp: number): string => {\n return parseFloat(value.toFixed(dp)).toString();\n};\n\nexport const formatSubsetLabel = (subset: TApiSubset) => {\n return `${subset.name}: ${subset.title}`;\n};\n\nexport const formatParameterNameWithShortname = (param: TApiParameter) => {\n return `${param.name} (${param.shortname})`;\n}\n\nexport const formatAggregatedSteps = (steps: Array) => {\n const partitions = partitionByDiff(steps);\n\n return partitions.map(partition => {\n if (partition.items.length <= 3) {\n return partition.items.join(', ');\n } else {\n return `${partition.items[0]} to ${partition.items[partition.items.length - 1]} by ${partition.diff}`\n }\n }).join(', ');\n};\n\nexport const formatBoolean = (value: boolean) => value ? 'Yes' : 'No';\n","let id = 100;\n\n/**\n * Generate a string unique across this session.\n */\nexport const getID = () => {\n\tid++;\n\treturn id.toString();\n};\n","import * as React from \"react\";\nimport { formatRounded } from \"../../../utils/Format\";\nimport { getID } from \"../../../utils/IdGenerator\";\n\ntype Props = {\n\tlabel?: string;\n\trequired?: boolean;\n\tclasses?: string;\n\tvalue?: number | null;\n\tonChange: (value: number | null) => void;\n\tmin?: number;\n\tmax?: number;\n\tstep?: number;\n\tdp?: number;\n\tplaceholder?: string;\n\treadOnly?: boolean;\n\tonBlur?: () => void;\n};\n\ntype State = {\n\tid: string;\n};\n\n/**\n * Input for numbers. Uncontrolled to allow leading \"-\" and \"+\" characters .\n */\nclass NumberInput extends React.Component {\n\tprivate readonly input: React.RefObject;\n\tconstructor(props: Props) {\n\t\tsuper(props);\n\t\tthis.input = React.createRef();\n\t\tthis.state = {\n\t\t\tid: getID()\n\t\t};\n\t}\n\n\tpublic componentDidUpdate() {\n\t\t// Walkie-talkie (half-duplex) binding - don't take new values from React while the\n\t\t// field has the focus (otherwise snapping/rounding make it hard to type)\n\t\tif (this.input.current !== document.activeElement) {\n\t\t\tthis.input.current!.value = this.toString(this.props.value);\n\t\t}\n\t}\n\n\tpublic onChange = () => {\n\t\tconst num = parseFloat(this.input.current!.value);\n\t\tthis.props.onChange(isNaN(num) ? null : num);\n\t};\n\n\tpublic focus = () => this.input.current!.focus();\n\n\tpublic render() {\n\t\treturn (\n\t\t\t\n\t\t\t\t\n\t\t\t\t{this.props.label && (\n\t\t\t\t\t\n\t\t\t\t)}\n\t\t\t\n\t\t);\n\t}\n\n\tprivate readonly onBlur = () => {\n\t\t// Now we can take the latest value from React (which may be snapped etc)\n\t\tthis.input.current!.value = this.toString(this.props.value);\n\t\tthis.props.onBlur?.call(this.props);\n\t};\n\n\tprivate readonly toString = (num?: number | null) =>\n\t\tnum == null ? \"\" : formatRounded(num, this.props.dp ?? 2);\n}\n\nexport default NumberInput;\n","import * as React from \"react\";\nimport { Area, AreaWorking } from \"../../../entities/Area\";\nimport NumberInput from \"../../Inputs/NumberInput\";\n\ntype Props = {\n\tmaxArea: Area;\n\tselectedArea: AreaWorking;\n\tonChange: (area: AreaWorking) => void;\n\tonBlur: () => void;\n\tneedsFocus: boolean;\n\tacknowledgeFocusRequest: () => void;\n\ttitle: string;\n\tgrid?: number;\n\treadonly?: boolean;\n};\n\n/**\n * A control for editing an area.\n */\nexport class AreaEditor extends React.PureComponent {\n\tprivate readonly firstInput: React.RefObject;\n\tconstructor(props: Props) {\n\t\tsuper(props);\n\t\tthis.firstInput = React.createRef();\n\t}\n\n\tpublic componentDidMount() {\n\t\tif (this.props.needsFocus) {\n\t\t\tthis.firstInput.current!.focus();\n\t\t\tthis.props.acknowledgeFocusRequest();\n\t\t}\n\t}\n\n\tpublic componentDidUpdate(prevProps: Props) {\n\t\tif (!prevProps.needsFocus && this.props.needsFocus) {\n\t\t\tthis.firstInput.current!.focus();\n\t\t\tthis.props.acknowledgeFocusRequest();\n\t\t}\n\t}\n\n\tpublic handleAreaChange = (\n\t\tvalue: number | null,\n\t\tdirection: \"north\" | \"south\" | \"west\" | \"east\"\n\t) => {\n\t\tconst area: AreaWorking = {\n\t\t\t...this.props.selectedArea,\n\t\t\t[direction]: value ?? undefined\n\t\t};\n\n\t\tthis.props.onChange(area);\n\t};\n\n\tpublic render() {\n\t\tconst { readonly } = this.props;\n\n\t\treturn (\n\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\t\t{this.props.title}\n\t\t\t\t\t\n\t\t\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t this.handleAreaChange(v, \"north\")}\n\t\t\t\t\t\t\t\tmin={this.props.maxArea.south}\n\t\t\t\t\t\t\t\tmax={this.props.maxArea.north}\n\t\t\t\t\t\t\t\tstep={this.props.grid ?? 0.01}\n\t\t\t\t\t\t\t\tonBlur={this.props.onBlur}\n\t\t\t\t\t\t\t\tref={this.firstInput}\n\t\t\t\t\t\t\t\tdp={3}\n\t\t\t\t\t\t\t\treadOnly={readonly}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t this.handleAreaChange(v, \"west\")}\n\t\t\t\t\t\t\t\t\tmin={this.props.maxArea.west}\n\t\t\t\t\t\t\t\t\tmax={this.props.maxArea.east}\n\t\t\t\t\t\t\t\t\tstep={this.props.grid ?? 0.01}\n\t\t\t\t\t\t\t\t\tonBlur={this.props.onBlur}\n\t\t\t\t\t\t\t\t\tdp={3}\n\t\t\t\t\t\t\t\t\treadOnly={readonly}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t this.handleAreaChange(v, \"east\")}\n\t\t\t\t\t\t\t\t\tmin={this.props.maxArea.west}\n\t\t\t\t\t\t\t\t\tmax={this.props.maxArea.east}\n\t\t\t\t\t\t\t\t\tstep={this.props.grid ?? 0.01}\n\t\t\t\t\t\t\t\t\tonBlur={this.props.onBlur}\n\t\t\t\t\t\t\t\t\tdp={3}\n\t\t\t\t\t\t\t\t\treadOnly={readonly}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t this.handleAreaChange(v, \"south\")}\n\t\t\t\t\t\t\t\tmin={this.props.maxArea.south}\n\t\t\t\t\t\t\t\tmax={this.props.maxArea.north}\n\t\t\t\t\t\t\t\tstep={this.props.grid ?? 0.01}\n\t\t\t\t\t\t\t\tonBlur={this.props.onBlur}\n\t\t\t\t\t\t\t\tdp={3}\n\t\t\t\t\t\t\t\treadOnly={readonly}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t
\n\t\t);\n\t}\n}\n","import * as ol from \"ol\";\nimport * as Extent from \"ol/extent\";\nimport * as Geom from \"ol/geom\";\nimport * as Interaction from \"ol/interaction\";\nimport { Tile as TileLayer, Vector as VectorLayer } from \"ol/layer\";\nimport \"ol/ol.css\";\nimport * as Proj from \"ol/proj\";\nimport { OSM as OsmSource, Vector as VectorSource } from \"ol/source\";\nimport * as Style from \"ol/style\";\n\nimport * as React from \"react\";\nimport { Async as AsyncSelect, default as Select } from \"react-select\";\n\nimport { Area, AreaWorking } from \"../../entities/Area\";\n\nimport { Styles } from \"react-select/lib/styles\";\nimport { ActionMeta, ValueType } from \"react-select/lib/types\";\nimport { PresetObj } from \"../../api-entities/PresetArea\";\nimport { useMapAttachedState } from \"../../hooks/useMapAttachedState\";\nimport { useOlFeatureEditing } from \"../../hooks/useOlFeatureEditing\";\nimport { findFinestGrid, snapAreaToGrid } from \"../../utils/Area\";\nimport { validateArea } from \"../../validation/Validators\";\nimport { AreaEditor } from \"./AreaEditor\";\nimport { ProductLeg } from \"../../entities/ProductLeg\";\n\n\nconst maxArea = { north: 90, south: -90, west: -180, east: 180 };\n\nconst AREA_INDEX = \"areaIndex\";\nconst INACTIVE_STYLE = \"inactiveStyle\";\n\nconst colors: Array<[number, number, number]> = [\n [255, 200, 0],\n [255, 0, 200],\n [0, 220, 210],\n [100, 230, 100],\n [255, 60, 70],\n [70, 90, 255]\n];\n\nconst baseAreaStyle = new Style.Style({\n stroke: new Style.Stroke({ color: \"blue\", width: 2 }),\n fill: new Style.Fill({ color: [0, 0, 0, 0] })\n});\n\nconst modifyStyleInvalid = (style: Style.Style) => {\n const newStyle = style.clone();\n newStyle.getStroke().setColor(\"red\");\n return newStyle;\n};\n\nconst activeAreaStyle = new Style.Style({\n stroke: new Style.Stroke({ color: \"green\", width: 3 }),\n fill: new Style.Fill({ color: [0, 0, 0, 0] })\n});\n\nconst draggingAreaStyle = new Style.Style({\n stroke: new Style.Stroke({ color: \"green\", width: 3, lineDash: [18, 6] }),\n fill: new Style.Fill({ color: [0, 0, 0, 0] })\n});\n\nconst [leftMost, , rightMost] = [...Proj.fromLonLat([-180, 90]), ...Proj.fromLonLat([180, -90])];\n\nfunction areaIsComplete(area: AreaWorking): area is Area {\n return (\n area.east !== undefined &&\n area.west !== undefined &&\n area.north !== undefined &&\n area.south !== undefined\n );\n}\n\n// Convert an Area to a corresponding OpenLayers Polygon, respecting areas that cross\n// the date-line (i.e. west > east)\nconst areaToGeometry = (a: Area) => {\n const [x1, top] = Proj.fromLonLat([a.west, a.north]);\n const [x2, bottom] = Proj.fromLonLat([a.east, a.south]);\n\n const [left, right] = x1 < x2 ? [x1, x2] : [x1, x2 + rightMost - leftMost];\n\n return new Geom.Polygon([\n [\n [left, top],\n [right, top],\n [right, bottom],\n [left, bottom]\n ]\n ]);\n};\n\nexport type AreaAction =\n | { type: \"create\"; area: Area }\n | { type: \"update\"; area: Area; index: number }\n | { type: \"delete\"; index: number };\n\nexport type AreaValidationProblem = {\n field: string;\n message: string;\n};\n\ntype OwnProps = {\n readonly?: boolean;\n // The collection of entities on which the editor operates. Each contains a single geographic region\n areaEntities: T[];\n // Function to project each entity to its geographic region\n projectArea: (entity: T) => Area;\n // A set of current validation problems with the fields of each entity\n validationProblems?: AreaValidationProblem[][];\n // Event handler for user actions to create/update/delete on the geographic portion of the entities\n handleAction: (action: AreaAction) => void;\n // The product legs, when in the context of a product configuration (used for snapping to grids)\n legs?: Map;\n // A function to give a set of geographic area suggestions matching a user text input\n suggestArea?: (input: string) => Promise;\n // Event handler to fire when the coordinate fields lose focus\n onBlur: () => void;\n // A library of frequently used areas the user has defined for their convenience\n userPresetAreas?: PresetObj[];\n // When true, a validation problem requires that the first input field should take the focus\n needsFocus: boolean;\n // Called after needsFocus caused a field to gain focus\n acknowledgeFocusRequest: () => void;\n // An editor supplied by the parent component for the non-area fields of the entity type.\n children?: (activeIndex: number | null) => React.ReactNode;\n};\n\nconst showAreaInView = (view: ol.View, area: Area) => {\n view.fit(areaToGeometry(area).getExtent(), {\n padding: [20, 20, 20, 20],\n duration: 500,\n maxZoom: view.getZoom()\n });\n};\n\nconst AreasEditor = (props: OwnProps) => {\n const {\n areaEntities,\n projectArea,\n validationProblems: validationProblemsRaw,\n handleAction,\n legs: legsRaw,\n suggestArea,\n onBlur,\n userPresetAreas,\n needsFocus,\n acknowledgeFocusRequest,\n readonly,\n children\n } = props;\n\n const validationProblems = React.useMemo(() => validationProblemsRaw || [], [\n validationProblemsRaw\n ]);\n const legs = React.useMemo(() => legsRaw || new Map(), [legsRaw]);\n\n const areas = React.useMemo(() => areaEntities.map(projectArea), [areaEntities, projectArea]);\n\n const mapContainerRef = React.useRef(null);\n const mapRef = React.useRef(null);\n const areasLayerRef = React.useRef(null);\n const newAreaFeatureRef = React.useRef();\n\n const [activeAreaRaw, setActiveArea] = React.useState(null);\n const [addMode, setAddMode] = React.useState(false);\n\n const [snapLayersVisible, setSnapLayerVisible] = useMapAttachedState(legs, () => true);\n\n const [snappingLayers, setSnappingLayers] = React.useState(new Map());\n const [features, setFeatures] = React.useState();\n const [snappingFeatures, setSnappingFeatures] = React.useState(new Map());\n\n const [draftArea, setDraftArea] = React.useState({});\n\n // activeAreaRaw may fall outside the range after areas are deleted\n const activeArea = React.useMemo(() => {\n if (activeAreaRaw === null || areas.length === 0) {\n return null;\n } else {\n return Math.min(areas.length - 1, activeAreaRaw);\n }\n }, [areas, activeAreaRaw]);\n\n // Pre-calculate the polygon representation of the areas\n const areaGeometries = React.useMemo(() => {\n return areas.map(areaToGeometry);\n }, [areas]);\n\n // Create the map element, controls, and vector layer\n React.useLayoutEffect(() => {\n mapRef.current = new ol.Map({\n target: mapContainerRef.current!,\n layers: [\n new TileLayer({\n source: new OsmSource()\n })\n ],\n view: new ol.View({\n center: [0, 0],\n zoom: 1,\n minZoom: 1\n }),\n interactions: Interaction.defaults({\n dragPan: false // Disabled: the Feature Editing hook handles dragging instead\n }),\n controls: [],\n moveTolerance: 5\n });\n\n const map = mapRef.current;\n\n // The map's concept of its own size is often wrong without this\n map.once(\"rendercomplete\", () => {\n map.updateSize();\n });\n\n areasLayerRef.current = new VectorLayer({\n source: new VectorSource({\n features: []\n }),\n style: baseAreaStyle,\n zIndex: 1\n });\n\n map.addLayer(areasLayerRef.current);\n\n const datelineLayer = new VectorLayer({\n source: new VectorSource({\n features: [\n new ol.Feature({\n geometry: new Geom.LineString([Proj.fromLonLat([180, 90]), Proj.fromLonLat([180, -90])])\n })\n ]\n }),\n style: new Style.Style({\n stroke: new Style.Stroke({ color: \"gray\", width: 1, lineDash: [6, 2] })\n })\n });\n map.addLayer(datelineLayer);\n\n return () => {\n map.setTarget(\"\");\n };\n }, []);\n\n // Create additional layers for the snapped areas\n React.useLayoutEffect(() => {\n let colourIndex = 0;\n const newSnappingLayers = new Map();\n\n for (const [legId] of legs) {\n const layer = new VectorLayer({\n source: new VectorSource({\n features: []\n }),\n style: new Style.Style({\n stroke: new Style.Stroke({ color: [0, 0, 0, 0], width: 0 }),\n fill: new Style.Fill({ color: [...colors[colourIndex], 0.3] })\n })\n });\n\n newSnappingLayers.set(legId, layer);\n mapRef.current!.addLayer(layer);\n colourIndex++;\n }\n\n setSnappingLayers(newSnappingLayers);\n\n return () => {\n newSnappingLayers.forEach(l => mapRef.current!.removeLayer(l));\n };\n }, [legs]);\n\n // Show or hide snapping layers\n React.useLayoutEffect(() => {\n snapLayersVisible.forEach((visible, legId) => {\n const layer = snappingLayers.get(legId);\n if (layer) {\n layer.setVisible(visible);\n }\n });\n }, [snapLayersVisible, snappingLayers]);\n\n // Clicking on an inactive feature makes the corresponding area the active one (the one\n // that can be edited)\n const mapClickHandler = React.useCallback(\n (e: ol.MapBrowserEvent) => {\n const feature = (\n mapRef.current!.getFeaturesAtPixel(e.pixel, {\n hitTolerance: 5,\n layerFilter: l => l === areasLayerRef.current\n }) || []\n ).find(f => f.get(AREA_INDEX) !== activeArea);\n\n if (feature) {\n const areaIndex = feature.get(AREA_INDEX);\n setActiveArea(areaIndex);\n setAddMode(false);\n } else {\n setActiveArea(null);\n }\n },\n [activeArea, setActiveArea, setAddMode]\n );\n\n React.useEffect(() => {\n mapRef.current!.on(\"click\", mapClickHandler);\n return () => mapRef.current!.un(\"click\", mapClickHandler);\n }, [mapClickHandler]);\n\n // Convert areas to features and add an as-yet undrawn feature for use when drawing new areas\n const viewInitializedRef = React.useRef(false);\n React.useEffect(() => {\n const newFeatures = areaGeometries.map((g, i) => {\n const feature = new ol.Feature({\n geometry: g\n });\n if (validationProblems.length > i && validationProblems[i].length > 0) {\n feature.setStyle(modifyStyleInvalid(baseAreaStyle));\n }\n feature.set(AREA_INDEX, i);\n feature.set(INACTIVE_STYLE, feature.getStyle());\n return feature;\n });\n\n const areasSource = areasLayerRef.current!.getSource();\n\n areasSource.addFeatures(newFeatures);\n setFeatures(newFeatures);\n\n newAreaFeatureRef.current = new ol.Feature();\n areasSource.addFeature(newAreaFeatureRef.current);\n\n // When the component mounts, zoom the map to fit the existing areas\n if (!viewInitializedRef.current) {\n if (areaGeometries.length > 0) {\n mapRef.current!.once(\"rendercomplete\", () => {\n let extent = Extent.createEmpty();\n areaGeometries.forEach(g => {\n extent = Extent.extend(extent, g.getExtent());\n });\n mapRef.current!.getView().fit(extent, { padding: [20, 20, 20, 20], duration: 500 });\n });\n }\n viewInitializedRef.current = true;\n }\n\n return () => areasSource.clear();\n }, [areaGeometries, validationProblems]);\n\n // Draw the snapped areas (but omit the active feature and save refs)\n React.useEffect(() => {\n const newFeatureMap = new Map();\n\n if (snappingLayers.size === 0) {\n return;\n }\n\n for (const [legId, leg] of legs) {\n const newFeatures = areas.map(a => {\n const snappedArea = leg.grid && leg.grid.value ? snapAreaToGrid(a, leg.grid.value) : a;\n\n const feature = new ol.Feature({\n geometry: areaToGeometry(snappedArea)\n });\n\n return feature;\n });\n\n const featureSource = snappingLayers.get(legId)!.getSource();\n featureSource.addFeatures(newFeatures);\n newFeatureMap.set(legId, newFeatures);\n }\n\n setSnappingFeatures(newFeatureMap);\n\n return () => {\n for (const layer of snappingLayers.values()) {\n layer.getSource().clear();\n }\n };\n }, [areas, legs, snappingLayers]);\n\n // Handles the end-of-drag events for the useOlFeatureEditing hook\n const featureUpdateHandler = React.useCallback(\n (area: Area, feature?: ol.Feature) => {\n if (feature === undefined) {\n handleAction({ type: \"create\", area });\n setActiveArea(areas.length);\n setAddMode(false);\n } else {\n handleAction({ type: \"update\", area, index: feature.get(AREA_INDEX) });\n }\n },\n [areas, handleAction, setActiveArea, setAddMode]\n );\n\n const activeFeature = React.useMemo(\n () => (features && activeArea !== null ? features[activeArea] : undefined),\n [features, activeArea]\n );\n\n const snappingGrid = React.useMemo(() => findFinestGrid(legs), [legs]);\n\n const featureEditState = useOlFeatureEditing({\n mapRef,\n editableLayer: areasLayerRef,\n addMode,\n activeFeature,\n onUpdateFeature: featureUpdateHandler,\n grid: snappingGrid\n });\n\n // Draw the active feature, either being dragged or simply highlighted\n React.useEffect(() => {\n if (featureEditState.coords === undefined) {\n if (activeArea !== null && activeFeature) {\n activeFeature.setGeometry(areaGeometries[activeArea]);\n activeFeature.setStyle(activeAreaStyle);\n }\n } else {\n const coords = featureEditState.coords;\n const [coord1, coord2] = coords;\n\n const targetFeature = activeFeature || newAreaFeatureRef.current!;\n\n targetFeature.setGeometry(\n new Geom.Polygon([[coord1, [coord1[0], coord2[1]], coord2, [coord2[0], coord1[1]]]])\n );\n\n targetFeature.setStyle(draggingAreaStyle);\n }\n\n return activeFeature\n ? () => {\n activeFeature.setStyle(activeFeature.get(INACTIVE_STYLE));\n }\n : () => newAreaFeatureRef.current!.setGeometry(undefined);\n }, [areaGeometries, activeArea, featureEditState, activeFeature]);\n\n // Draw the snapped areas for the active feature\n React.useEffect(() => {\n let generatingArea: Area | undefined;\n\n if (featureEditState.area !== null) {\n generatingArea = featureEditState.area;\n } else {\n if (activeArea !== null) {\n generatingArea = areas[activeArea];\n }\n }\n\n if (generatingArea !== undefined && activeArea !== null) {\n for (const [legId, leg] of legs) {\n const snappedArea =\n leg.grid && leg.grid.value && leg.grid.value !== snappingGrid\n ? snapAreaToGrid(generatingArea, leg.grid.value)\n : generatingArea;\n const featureSet = snappingFeatures.get(legId);\n if (featureSet && featureSet.length > activeArea) {\n featureSet[activeArea].setGeometry(areaToGeometry(snappedArea));\n }\n }\n }\n }, [areas, activeArea, featureEditState, legs, snappingFeatures, snappingGrid]);\n\n // Style snap selection legend with a dynamically created stylesheet\n React.useEffect(() => {\n if (legs.size > 1) {\n const sheetElement = document.createElement(\"style\");\n sheetElement.appendChild(document.createTextNode(\"\"));\n document.head.appendChild(sheetElement);\n const sheet = sheetElement.sheet as CSSStyleSheet;\n\n const colorToCss = (r: number, g: number, b: number) => `rgba(${r}, ${g}, ${b}, 1)`;\n\n let index = 0;\n legs.forEach(() => {\n const color = colors[index++];\n const colorCss = colorToCss(...color);\n const contrastCss = color[0] + color[1] > 255 ? \"black\" : \"white\";\n\n sheet.insertRule(\n `.map__legend .checkbox__multiple-choice:nth-of-type(${index}) input[type=\"checkbox\"] + label:before { content: ''; background-color: ${colorCss} !important; border-color: ${colorCss} !important; }`\n );\n sheet.insertRule(\n `.map__legend .checkbox__multiple-choice:nth-of-type(${index}) input[type=\"checkbox\"] + label:after { content: ''; border-left-color: ${contrastCss}; border-bottom-color: ${contrastCss}; }`\n );\n });\n\n return () => {\n document.head.removeChild(sheetElement);\n };\n }\n }, [legs]);\n\n // Render, where applicable, check boxes to show the snapped areas\n const snapLegend = React.useMemo(\n () =>\n renderSnapLegend(legs, snapLayersVisible, (legId, visible) =>\n setSnapLayerVisible(legId, visible)\n ),\n [legs, snapLayersVisible, setSnapLayerVisible]\n );\n\n const enableAddModeHandler = React.useCallback(() => {\n const newAddMode = !addMode;\n if (newAddMode) {\n setActiveArea(null);\n }\n setAddMode(newAddMode);\n }, [addMode, setAddMode]);\n\n const deleteAreaHandler = React.useCallback(() => {\n if (activeArea !== null) {\n handleAction({ type: \"delete\", index: activeArea });\n }\n }, [handleAction, activeArea]);\n\n const areaEditorChangeHandler = React.useCallback(\n (area: AreaWorking) => {\n if (activeArea === null) {\n setDraftArea(area);\n return;\n }\n if (areaIsComplete(area)) {\n handleAction({ type: \"update\", area, index: activeArea });\n }\n },\n [activeArea, handleAction]\n );\n\n const addDraftArea = React.useCallback(() => {\n if (areaIsComplete(draftArea)) {\n const result = validateArea(draftArea);\n if (result.isValid) {\n handleAction({ type: \"create\", area: draftArea });\n setDraftArea({});\n showAreaInView(mapRef.current!.getView(), draftArea);\n } else {\n alert(result.error);\n }\n }\n }, [draftArea, setDraftArea, handleAction]);\n\n const reactSelectStyles: Partial = {\n container: p => ({ ...p, margin: \"0.4rem\" }),\n control: p => ({ ...p, minHeight: \"32px\" })\n };\n\n return (\n
\n
\n
\n {\n !readonly &&\n
\n {userPresetAreas && userPresetAreas.length > 0 && (\n \n getOptionLabel={option => option.name}\n options={userPresetAreas}\n controlShouldRenderValue={false}\n styles={reactSelectStyles}\n isOptionSelected={() => false}\n onChange={(value: ValueType, action: ActionMeta) => {\n if (action.action === \"select-option\") {\n if (value) {\n const newArea = (value as PresetObj).area;\n handleAction({ type: \"create\", area: newArea });\n showAreaInView(mapRef.current!.getView(), newArea);\n }\n }\n }}\n placeholder=\"Add preset area\"\n />\n )}\n\n {suggestArea && (\n \n loadOptions={suggestArea}\n styles={reactSelectStyles}\n getOptionLabel={option => option.name}\n controlShouldRenderValue={false}\n isOptionSelected={() => false}\n onChange={(value, action) => {\n if (action.action === \"select-option\") {\n if (value) {\n const newArea = (value as PresetObj).area;\n handleAction({ type: \"create\", area: newArea });\n showAreaInView(mapRef.current!.getView(), newArea);\n }\n }\n }}\n placeholder=\"Search and add...\"\n components={{\n DropdownIndicator: () => null,\n IndicatorSeparator: () => null\n }}\n />\n )}\n \n Draw new area\n \n \n Delete area\n \n
\n }\n {snapLegend}\n {children &&
{children(activeArea)}
}\n
\n \n
\n {featureEditState.area == null && activeArea == null && (\n \n Add to map\n \n )}\n\n {activeArea !== null &&\n validationProblems.length > activeArea &&\n validationProblems[activeArea].map((p, i) => (\n \n ))}\n
\n \n );\n};\n\nconst renderSnapLegend = (\n legs: Map,\n visibility: Map,\n setVisibility: (legId: number, newVisibility: boolean) => void\n) => {\n let dummyId = 0;\n const nextId = (prefix: string) => `${prefix}-${dummyId++}`;\n // Render snap selection legend\n\n if (legs.size > 1) {\n const layerBoxes = Array.from(legs, ([legId]) => {\n const id = nextId(\"snap-layer-box\");\n return (\n
\n {\n setVisibility(legId, e.target.checked);\n }}\n />\n \n
\n );\n });\n return (\n
\n
\n \n Show snapping\n \n {layerBoxes}\n
\n
\n );\n }\n};\n\nexport default AreasEditor;\n","import * as React from \"react\";\n\nexport const useMapAttachedState = (\n\tsource: Map,\n\tinitialize: (value: V1, key: K) => V2\n) => {\n\tconst [map, setMap] = React.useState(() => {\n\t\treturn new Map();\n\t});\n\n\tconst prevSource = React.useRef>();\n\n\tReact.useEffect(() => {\n\t\tif (prevSource.current !== source) {\n\t\t\tconst newMap = new Map(\n\t\t\t\tArray.from(source, ([key, value]) => {\n\t\t\t\t\tconst previousValue = map.get(key);\n\t\t\t\t\treturn [key, previousValue === undefined ? initialize(value, key) : previousValue];\n\t\t\t\t})\n\t\t\t);\n\t\t\tsetMap(newMap);\n\t\t\tprevSource.current = source;\n\t\t}\n\t}, [source, initialize, map, setMap]);\n\n\tconst setValue = React.useCallback(\n\t\t(key: K, value: V2) => {\n\t\t\tconst newMap = new Map(map);\n\t\t\tnewMap.set(key, value);\n\t\t\tsetMap(newMap);\n\t\t},\n\t\t[map, setMap]\n\t);\n\n\treturn [map, setValue] as [Map, (key: K, value: V2) => void];\n};\n","import * as React from \"react\";\nimport { classNames } from \"react-select/lib/utils\";\nimport { ReactNode } from \"react\";\n\ninterface IProps {\n title: string;\n endComponent?: ReactNode;\n className?: string;\n}\n\nconst PageTitle = (props: IProps) => {\n const { title, endComponent, className } = props;\n\n return (\n

\n {title}\n {endComponent}\n

\n );\n};\nexport default PageTitle;\n","import * as React from \"react\";\nimport { getID } from \"../../../utils/IdGenerator\";\nimport classNames from \"classnames\";\n\ntype Props = {\n\tlabel?: string;\n\trequired?: boolean;\n\tclasses?: string;\n\tvalue?: string | number;\n\tonChange: (value: string) => void;\n\ttype?: string;\n\tplaceholder?: string;\n\treadOnly?: boolean;\n\tonBlur?: (event: React.FocusEvent) => void;\n\tclassName?: string;\n};\n\ntype State = {\n\tid: string;\n};\n\nclass TextInput extends React.Component {\n\tprivate readonly input: React.RefObject;\n\tconstructor(props: Props) {\n\t\tsuper(props);\n\t\tthis.input = React.createRef();\n\t\tthis.state = {\n\t\t\tid: getID()\n\t\t};\n\t}\n\n\tpublic focus = () => this.input.current!.focus();\n\n\tpublic render() {\n\t\tconst { className } = this.props;\n\t\t\n\t\treturn (\n\t\t\t\n\t\t\t\t\n\t\t\t\t{this.props.label && (\n\t\t\t\t\t\n\t\t\t\t)}\n\t\t\t\n\t\t);\n\t}\n\n\tprivate readonly onChange = (event: React.ChangeEvent) =>\n\t\tthis.props.onChange(event.target.value);\n}\n\nexport default TextInput;\n","import * as React from \"react\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { PresetArea, PresetObj } from \"../../api-entities/PresetArea\";\nimport { config } from \"../../config\";\nimport { makeAreaObj } from \"../../entities/Area\";\nimport { getUserAreas } from \"../../store/action-creators/UserActionCreators\";\nimport { ThunkDispatcher } from \"../../store/actions/All\";\nimport { makeApiUrl } from \"../../utils/Api\";\nimport AreasEditor, { AreaAction, AreaValidationProblem } from \"../../components/AreasEditor\";\nimport Col from \"../../components/Common/Col\";\nimport Row from \"../../components/Common/Row\";\nimport PageTitle from \"../../components/Ui/PageTitle\";\nimport TextInput from \"../../components/Inputs/TextInput\";\nimport { TRootState } from \"../../store/reducers/RootReducer\";\n\ntype UserAreaValidationResponse = {\n\t[P in keyof PresetObj]?: string[];\n} &\n\t{ [P in keyof PresetObj[\"area\"]]?: string[] } & { non_field_errors?: string[] } & {\n\t\t[key: string]: string[];\n\t};\n\nconst saveUserArea = async (preset: PresetArea, token?: string): Promise => {\n\tconst method = preset.id ? \"PUT\" : \"POST\";\n\tconst url = makeApiUrl(`${config.apiUrl}user-area/${preset.id || \"\"}`, token);\n\tconst response = await fetch(url, {\n\t\tmethod,\n\t\theaders: {\n\t\t\t\"Content-Type\": \"application/json\"\n\t\t},\n\t\tcredentials: \"include\",\n\t\tbody: JSON.stringify(preset)\n\t});\n\n\tif (response.ok) {\n\t\treturn response.json();\n\t} else {\n\t\tif (response.status === 400) {\n\t\t\treturn Promise.reject(await response.json());\n\t\t} else {\n\t\t\tthrow new Error(`Save area failed with status ${response.status}`);\n\t\t}\n\t}\n};\n\nconst deleteUserArea = async (id: number | undefined, token?: string): Promise => {\n\tif (id === undefined) {\n\t\treturn;\n\t}\n\n\tconst url = makeApiUrl(`${config.apiUrl}user-area/${id}`, token);\n\tconst response = await fetch(url, {\n\t\tmethod: \"DELETE\",\n\t\tcredentials: \"include\",\n\t});\n\n\tif (response.ok) {\n\t\treturn;\n\t} else {\n\t\tthrow new Error(`Delete area failed with status ${response.status}`);\n\t}\n};\n\nconst presetObjToApiFormat = (preset: PresetObj) => ({\n\tid: preset.id,\n\tname: preset.name,\n\tnorth: preset.area.north.toString(),\n\twest: preset.area.west.toString(),\n\tsouth: preset.area.south.toString(),\n\teast: preset.area.east.toString()\n});\n\nconst convertValidationResponse = (validationResponse: UserAreaValidationResponse) =>\n\tObject.keys(validationResponse)\n\t\t.map(k =>\n\t\t\tvalidationResponse[k].map(\n\t\t\t\tm =>\n\t\t\t\t\t({\n\t\t\t\t\t\tfield: k,\n\t\t\t\t\t\tmessage: m\n\t\t\t\t\t} as AreaValidationProblem)\n\t\t\t)\n\t\t)\n\t\t.reduce((xs, ys) => [...xs, ...ys], []);\n\nconst projectArea = (p: PresetObj) => p.area;\nconst doNothing = () => { };\n\n/**\n * A gatekeeper for the areas library page which ensures that\n * the user is logged in\n */\nconst AreaLibraryPage = () => {\n\tconst token = useSelector(state => state.user.token);\n\n\tconst dispatch: ThunkDispatcher = useDispatch();\n\tconst presets = useSelector(state => state.user.areaPresets);\n\n\tconst [workingPresets, setWorkingPresets] = React.useState();\n\tconst [validationProblems, setValidationProblems] = React.useState();\n\tconst [hasChanges, setHasChanges] = React.useState();\n\n\tconst setWorkingPreset = React.useCallback(\n\t\t(index: number, preset: PresetObj, matchesRemote: boolean) => {\n\t\t\tif (!workingPresets || !hasChanges) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst newPresets = workingPresets.slice();\n\t\t\tnewPresets[index] = preset;\n\t\t\tsetWorkingPresets(newPresets);\n\n\t\t\tconst newHasChanges = hasChanges.slice();\n\t\t\tnewHasChanges[index] = !matchesRemote;\n\t\t\tsetHasChanges(newHasChanges);\n\t\t},\n\t\t[setWorkingPresets, workingPresets, hasChanges, setHasChanges]\n\t);\n\n\t// Create working copy from store if one doesn't already exist\n\tReact.useEffect(() => {\n\t\tif (workingPresets !== undefined) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (presets === undefined) {\n\t\t\tdispatch(getUserAreas);\n\t\t\treturn;\n\t\t}\n\n\t\tsetWorkingPresets(presets);\n\t\tsetValidationProblems(presets.map(_ => []));\n\t\tsetHasChanges(presets.map(_ => false));\n\t}, [\n\t\tpresets,\n\t\tworkingPresets,\n\t\tsetWorkingPresets,\n\t\tsetValidationProblems,\n\t\tsetHasChanges,\n\t\tdispatch\n\t]);\n\n\t// Unmount effect, refresh store from server\n\tReact.useEffect(() => {\n\t\treturn () => {\n\t\t\tdispatch(getUserAreas);\n\t\t};\n\t}, [dispatch]);\n\n\tconst pushPresetToRemote = React.useCallback(\n\t\t(preset: PresetObj, index: number) => {\n\t\t\tif (!validationProblems) {\n\t\t\t\tthrow new Error(\"Call to push presets while component not loaded\");\n\t\t\t}\n\n\t\t\tconst updateValidationProblems = (problems: AreaValidationProblem[]) => {\n\t\t\t\tconst newValidationProblems = validationProblems.slice();\n\t\t\t\tnewValidationProblems[index] = problems;\n\t\t\t\tsetValidationProblems(newValidationProblems);\n\t\t\t};\n\n\t\t\tsaveUserArea(presetObjToApiFormat(preset), token)\n\t\t\t\t.then(response => {\n\t\t\t\t\tsetWorkingPreset(index, makeAreaObj(response), true);\n\t\t\t\t\tupdateValidationProblems([]);\n\t\t\t\t})\n\t\t\t\t.catch((validationResponse: UserAreaValidationResponse) => {\n\t\t\t\t\t// tslint:disable-next-line: no-console\n\t\t\t\t\tupdateValidationProblems(convertValidationResponse(validationResponse));\n\t\t\t\t});\n\t\t},\n\t\t[validationProblems, setValidationProblems, setWorkingPreset, token]\n\t);\n\n\tconst handleAction = React.useCallback(\n\t\tasync (action: AreaAction) => {\n\t\t\tif (\n\t\t\t\tworkingPresets === undefined ||\n\t\t\t\tvalidationProblems === undefined ||\n\t\t\t\thasChanges === undefined\n\t\t\t) {\n\t\t\t\tthrow new Error(\"Action handled while component not loaded\");\n\t\t\t}\n\n\t\t\tswitch (action.type) {\n\t\t\t\tcase \"create\": {\n\t\t\t\t\tconst newPreset = { name: \"\", area: action.area };\n\t\t\t\t\tsetWorkingPresets([...workingPresets, newPreset]);\n\t\t\t\t\tsetValidationProblems([...validationProblems, []]);\n\t\t\t\t\tsetHasChanges([...hasChanges, true]);\n\t\t\t\t\tpushPresetToRemote(newPreset, workingPresets.length);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"update\": {\n\t\t\t\t\tconst newPreset = { ...workingPresets[action.index], area: action.area };\n\t\t\t\t\tsetWorkingPreset(action.index, newPreset, false);\n\t\t\t\t\tpushPresetToRemote(newPreset, action.index);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"delete\": {\n\t\t\t\t\tdeleteUserArea(workingPresets[action.index].id, token)\n\t\t\t\t\t\t.then(() => {\n\t\t\t\t\t\t\tconst newPresets = workingPresets.slice();\n\t\t\t\t\t\t\tnewPresets.splice(action.index, 1);\n\t\t\t\t\t\t\tsetWorkingPresets(newPresets);\n\t\t\t\t\t\t\tconst newValidationProblems = validationProblems.slice();\n\t\t\t\t\t\t\tnewValidationProblems.splice(action.index, 1);\n\t\t\t\t\t\t\tsetValidationProblems(newValidationProblems);\n\t\t\t\t\t\t\tconst newHasChanges = hasChanges.slice();\n\t\t\t\t\t\t\tnewHasChanges.splice(action.index, 1);\n\t\t\t\t\t\t\tsetHasChanges(newHasChanges);\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.catch(() => {\n\t\t\t\t\t\t\tthrow new Error(\"Delete area failed\");\n\t\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t[\n\t\t\tsetWorkingPresets,\n\t\t\tworkingPresets,\n\t\t\tvalidationProblems,\n\t\t\tsetValidationProblems,\n\t\t\tpushPresetToRemote,\n\t\t\ttoken,\n\t\t\tsetWorkingPreset,\n\t\t\thasChanges,\n\t\t\tsetHasChanges\n\t\t]\n\t);\n\n\tconst setName = React.useCallback(\n\t\t(index: number, name: string) => {\n\t\t\tif (workingPresets === undefined) {\n\t\t\t\tthrow new Error(\"Name updated while component not loaded\");\n\t\t\t}\n\n\t\t\tconst newPreset = { ...workingPresets[index], name };\n\t\t\tsetWorkingPreset(index, newPreset, false);\n\t\t},\n\t\t[workingPresets, setWorkingPreset]\n\t);\n\n\tconst savePreset = React.useCallback(\n\t\t(index: number) => {\n\t\t\tif (workingPresets === undefined) {\n\t\t\t\tthrow new Error(\"Name updated while component not loaded\");\n\t\t\t}\n\n\t\t\tpushPresetToRemote(workingPresets[index], index);\n\t\t},\n\t\t[workingPresets, pushPresetToRemote]\n\t);\n\n\tconst renderAdditionalField = React.useCallback(\n\t\t(index: number | null) => {\n\t\t\tif (workingPresets === undefined || validationProblems === undefined) {\n\t\t\t\tthrow new Error(\"Additional fields rendered while component not loaded\");\n\t\t\t}\n\n\t\t\treturn (\n\t\t\t\tindex !== null && (\n\t\t\t\t\t
\n\t\t\t\t\t\t setName(index, value)}\n\t\t\t\t\t\t\tonBlur={() => savePreset(index)}\n\t\t\t\t\t\t>\n\t\t\t\t\t
\n\t\t\t\t)\n\t\t\t);\n\t\t},\n\t\t[workingPresets, setName, savePreset, validationProblems]\n\t);\n\n\treturn workingPresets ? (\n\t\t<>\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t

\n\t\t\t\t\t\tYou can use the tool below to draw and save areas that you wish to apply to multiple\n\t\t\t\t\t\treal-time product configurations.\n\t\t\t\t\t\t

\n\n\t\t\t\t\t

\n\t\t\t\t\t\tOnce you have drawn an area and named it, this will be saved and available to you when\n\t\t\t\t\t\tconfiguring products.\n\t\t\t\t\t\t

\n\n\t\t\t\t\t

\n\t\t\t\t\t\tWhen configuring real-time products, the area you have saved here will snap to the\n\t\t\t\t\t\tchosen resolution of that configuration (it will expand if a coarser resolution is\n\t\t\t\t\t\tselected).\n\t\t\t\t\t\t

\n\t\t\t\t\n\t\t\t
\n\t\t\t\n\t\t\t\t{...{\n\t\t\t\t\tareaEntities: workingPresets,\n\t\t\t\t\tprojectArea,\n\t\t\t\t\thandleAction,\n\t\t\t\t\tvalidationProblems\n\t\t\t\t}}\n\t\t\t\tonBlur={doNothing}\n\t\t\t\tneedsFocus={false}\n\t\t\t\tacknowledgeFocusRequest={doNothing}\n\t\t\t>\n\t\t\t\t{renderAdditionalField}\n\t\t\t\n\t\t\n\t) : null;\n};\n\nexport default AreaLibraryPage;\n","import client from '../client';\n\nexport type TApiArea = {\n id: number;\n name: string;\n value: Array;\n north: string;\n west: string;\n south: string;\n east: string\n}\n\nconst list = (): Promise> =>\n client.get('/area/').then(response => response.data);\n\nexport {\n list\n};\n","import client from '../client';\n\nexport type TApiCountry = {\n code: string;\n title: string;\n}\n\nconst list = (): Promise> =>\n client.get('/country/').then(response => response.data);\n\nexport {\n list\n};\n","import client from \"../client\"\nimport { parseValidationError } from '../responseHandlers';\n\nexport type TApiFolder = {\n id: number;\n parent_id: number;\n name: string;\n created: string;\n updated: string;\n}\n\nexport type TApiFolderParams = {\n name: string;\n}\n\nconst endpointPath = (id?: TApiFolder['id']) => {\n const path = id ?? '';\n\n return '/folder/' + path;\n}\n\nconst list = (): Promise> => client.get('/folder/').then(response => response.data);\n\nconst create = (params: TApiFolderParams): Promise =>\n client.post(endpointPath(), params).then(response => response.data).catch(parseValidationError);\n\nconst update = (id: TApiFolder['id'], params: TApiFolderParams): Promise> =>\n client.put(endpointPath(id), params).then(response => response.data);\n\nconst remove = (id: TApiFolder['id']): Promise> =>\n client.delete(endpointPath(id)).then(response => response.data);\n\nexport {\n create,\n list,\n update,\n remove\n}\n","import { StepRange } from \"../../entities/StepRange\";\nimport { Area } from \"../../entities/Area\";\nimport { LeveledParam } from \"../../entities/LeveledParam\";\nimport { QuantiledParam } from \"../../entities/QuantiledParam\";\nimport { OrderCategory, QuoteProductLeg } from \"./Order\";\nimport client from \"../client\";\nimport { Nullable } from \"../../../types/utils\";\nimport { TimeStep } from \"../../entities/TimeStep\";\n\nexport interface IRealtimeOrderProductData {\n name: string;\n subset_id: number;\n legs?: Array;\n use_step?: Array<{\n use: number;\n step: string;\n }>;\n use?: Array;\n hindcast?: Nullable>;\n number?: Array;\n area?: Array;\n param?: Array;\n grid?: string;\n step?: Array;\n param_levelist?: Array;\n param_quantile?: Array;\n time?: Array;\n time_step?: Array;\n fcmonth?: Array;\n channel?: Array;\n location?: number;\n}\n\nexport interface IEuCutOutProductData {\n param: Array<{\n value: string;\n subset_id: number;\n }>,\n high_frequency: boolean;\n}\n\nexport type TOrderProductData = T extends OrderCategory.REALTIME ?\n IRealtimeOrderProductData\n : T extends OrderCategory.EU_CUTOUT ? IEuCutOutProductData : never\n\nexport type TOrderProduct = {\n id: number;\n order_id: number;\n data: TOrderProductData\n}\n\nconst list = (orderId: number): Promise>> =>\n client.get(`/order/${orderId}/product/`).then(response => response.data);\n\nconst create = (\n orderId: number,\n productData: TOrderProductData\n): Promise> =>\n client.post(`/order/${orderId}/product/`, { data: productData }).then(response => response.data);\n\nconst update = (\n orderId: number,\n productId: number,\n productData: TOrderProductData\n): Promise> =>\n client.put(`/order/${orderId}/product/${productId}/`, { data: productData }).then(response => response.data);\n\nconst fetch = (\n orderId: number | string,\n productId: number | string\n): Promise> =>\n client.get(`/order/${orderId}/product/${productId}/`).then(response => response.data);\n\nconst duplicate = (\n orderId: number | string,\n productId: number | string\n): Promise> =>\n client.put(`/order/${orderId}/product/${productId}/duplicate/`).then(response => response.data);\n\nconst remove = (\n orderId: number | string,\n productId: number | string\n): Promise> =>\n client.delete(`/order/${orderId}/product/${productId}/`).then(response => response.data);\n\nexport {\n list,\n fetch,\n create,\n update,\n duplicate,\n remove\n}\n","import client from \"../client\"\n\nexport type TApiParameter = {\n id: number;\n shortname: string;\n name: string;\n description: string;\n}\n\nconst list = (): Promise> => client.get('/param/').then(response => response.data);\n\nexport {\n list\n}\n","import client from '../client';\nimport { toInteger } from 'lodash';\n\nexport type TApiProvider = {\n id: number;\n name: string;\n logo: string;\n default: boolean;\n is_data_deliverer: boolean;\n is_ecmwf: boolean;\n}\n\nexport type TProviderListParams = {\n country_code?: string;\n order_category: string;\n}\n\nconst list = (params?: TProviderListParams): Promise> =>\n client.get('/ccp/', {\n params\n }).then(response => response.data);\n\nexport {\n list\n};\n","import client from '../client';\nimport { toInteger } from 'lodash';\n\nexport type TApiServiceCharge = {\n id: number;\n volume_band_id: number;\n service_package_id: number;\n charge_in_eur: number;\n}\n\ninterface ServiceChargeListParams {\n volume_band_id?: number;\n service_package_id?: number;\n service_charge_model_id?: number;\n}\n\nconst list = (params?: ServiceChargeListParams): Promise> =>\n client.get('/service-charge/', { params }).then(response => response.data);\n\nexport {\n list\n};\n","import client from '../client';\nimport { toInteger } from 'lodash';\nimport { OrderCategory } from './Order';\n\nexport type TApiServicePackage = {\n id: number;\n code: string;\n title: string;\n features: Array;\n volume_band_ids: Array;\n order_categories: Array;\n}\n\nconst list = (): Promise> =>\n client.get('/service-package/').then(response => response.data);\n\nexport {\n list\n};\n","import client from '../client';\nimport { TApiSubset } from './Subset';\nimport queryString from \"query-string\";\n\nexport type TApiSet = {\n id: number;\n url: string;\n name: string;\n category: string;\n description: string;\n subsets: Array;\n}\n\ntype TApiSetListParams = {\n param?: Array\n}\n\n\nconst list = (params?: TApiSetListParams): Promise> => {\n return client.get('/set/', {\n params: {\n ...(params?.param && { param: params.param })\n },\n paramsSerializer: params => queryString.stringify(params)\n }).then(response => response.data);\n};\n\nexport {\n list\n}\n","import client from '../client';\nimport queryString from 'query-string';\n\nexport type TBcType = 'hres' | 'ens' | null;\n\nexport type TApiSubset = {\n id: number;\n set_id: number;\n url: string;\n set: string;\n name: string;\n title: string;\n tooltip: string;\n type: string;\n list_of_choices: Array;\n options: string;\n bc_type: TBcType;\n hindcast: boolean;\n}\n\ntype TApiSubsetListParams = {\n paramShortnames: Array\n}\n\nconst list = (params: TApiSubsetListParams): Promise> =>\n client.get('/subset/', {\n params: {\n param: params.paramShortnames\n },\n paramsSerializer: params => queryString.stringify(params)\n }).then(response => response.data);\n\nconst fetch = (id: string | number): Promise =>\n client.get(`/subset/${id}/`).then(response => response.data);\n\nexport {\n fetch,\n list\n}\n","import { AreaOption } from '../../decoders/AreaOption';\nimport client from '../client';\nimport { TApiSubset } from './Subset';\n\nexport type TSubsetOptionItem = {\n subset: string;\n footnote: string | null;\n value: T\n}\n\nexport type TTimeOption = TSubsetOptionItem<{\n time: Array\n}>\n\nexport type TStepItem = {\n to: string;\n from: string;\n by: string;\n}\n\nexport type TStepsOption = TSubsetOptionItem<{\n step: Array\n}>\n\nexport type TStepLegsOption = TSubsetOptionItem<{\n legs: Array\n}>\n\nexport type TStepRangesOption = TSubsetOptionItem<{\n step: Array\n}>\n\nexport type TGridLegsOption = TSubsetOptionItem<{\n legs: Array>;\n}>\n\nexport type TGridOption = TSubsetOptionItem<{\n grid: Array\n}>\n\nexport type TRunOption = TSubsetOptionItem<{\n use: Array\n}>\n\nexport type TMonthOption = TSubsetOptionItem<{\n fcmonth: Array<{\n from: string;\n to: string;\n }>\n}>\n\nexport type TParamOption = TSubsetOptionItem<{\n param: Array\n}>\n\nexport type TParamLevelistOption = TSubsetOptionItem<{\n levelist: Array | Array | { from: string, to: string }>,\n param: Array\n}>\n\nexport type TParamQuantileOption = TSubsetOptionItem<{\n quantile: Array | Array>,\n param: Array\n}>\n\nexport type TChannelOption = TSubsetOptionItem<{\n channel: Array\n}>\n\nexport type TTimeStepOption = TSubsetOptionItem<{\n step: Array>;\n time: Array\n}>\n\nexport type TUseStepOption = TSubsetOptionItem<{\n step: Array>;\n use: Array\n}>\n\nexport type TNumberOption = TSubsetOptionItem<{\n number: Array<{\n from: string;\n to: string;\n by: string;\n }>\n}>\n\nexport type THindcastOption = TSubsetOptionItem<{\n hindcast: Array;\n}>\n\n\nexport type TApiSubsetOptions = {\n step?: TStepLegsOption | TStepsOption | TStepRangesOption;\n time?: TTimeOption;\n number?: TNumberOption;\n grid?: TGridLegsOption | TGridOption;\n param?: TParamOption;\n area?: AreaOption;\n use?: TRunOption;\n param_levelist?: TParamLevelistOption;\n param_quantile?: TParamQuantileOption;\n fcmonth?: TMonthOption;\n channel?: TChannelOption;\n time_step?: TTimeStepOption;\n use_step?: TUseStepOption;\n hindcast?: THindcastOption;\n};\n\nconst fetch = (subsetId: TApiSubset['id']): Promise =>\n client.get(`/subset/${subsetId}/option/`).then(response => response.data);\n\nexport {\n fetch\n}\n","import client from '../client';\n\nexport type TApiUserArea = {\n id: number;\n name: string;\n value: Array;\n north: string;\n west: string;\n south: string;\n east: string\n}\n\nconst list = (): Promise> =>\n client.get('/user-area/').then(response => response.data);\n\nexport {\n list\n};\n","import client from '../client';\n\nexport type TApiVolumeBand = {\n id: number;\n min_gb: number;\n max_gb: number;\n charge_in_eur: number;\n}\n\nconst list = (): Promise> =>\n client.get('/volume-band/').then(response => response.data);\n\nexport {\n list\n};\n","import { OrderCategory, OrderCostingVersion, TApiOrderDetails } from \"../../api/endpoints/Order\";\n\nconst isExpired = (order: TApiOrderDetails, costingVersions: Array) => {\n return !costingVersions.some(\n costingVersion => costingVersion.version === order.cost.version\n );\n};\n\nconst currentOrderVersion = (\n order: TApiOrderDetails,\n costingVersions: Array\n): OrderCostingVersion | undefined => {\n return costingVersions.find(\n costingVersion => costingVersion.version === order.cost.version\n );\n}\n\nconst OrderHelpers = {\n isExpired,\n currentOrderVersion\n}\n\nexport default OrderHelpers;\n","import { useEffect, useState } from \"react\";\nimport { Nullable } from \"../../../types/utils\";\nimport * as Api from \"../../api\";\nimport { OrderCostingVersion, TApiOrderDetails } from \"../../api/endpoints/Order\";\nimport OrderHelpers from \"../../utils/OrderHelpers\";\n\nconst useOrderCostingVersion = (order?: Nullable) => {\n const [orderCostingVersions, setOrderCostingVersions] = useState>>(null);\n const [currentOrderCostingVersion, setCurrentOrderCostingVersion] = useState>(null);\n\n useEffect(() => {\n if (!order) {\n return;\n }\n\n Api.Order.costingVersions(order.id).then(versions => {\n setOrderCostingVersions(versions);\n\n const currentCostingVersion = OrderHelpers.currentOrderVersion(order, versions);\n\n setCurrentOrderCostingVersion(currentCostingVersion ?? null);\n }).catch(() => {\n setOrderCostingVersions([]);\n setCurrentOrderCostingVersion( null);\n });\n }, [order?.id, order?.updated]);\n\n return {\n orderCostingVersions,\n currentOrderCostingVersion\n }\n}\n\nexport default useOrderCostingVersion;\n","const isError = (error: unknown): error is Error => {\n return error instanceof Error;\n}\n\nconst ErrorHelpers = {\n isError\n}\n\nexport default ErrorHelpers\n","import { AxiosError } from 'axios';\nimport { Action } from 'redux';\nimport { ThunkDispatch } from 'redux-thunk';\nimport * as Api from '../../api';\nimport { TApiFolder } from '../../api/endpoints/Folder';\nimport {\n TApiOrder,\n TApiOrderDetails,\n TOrderCreateParams,\n TOrderSubmitParams,\n TOrderUpdateParams\n} from '../../api/endpoints/Order';\nimport { TRootState } from '../reducers/RootReducer';\nimport { Nullable } from \"../../../types/utils\";\nimport ErrorHelpers from \"../../utils/ErrorHelpers\";\n\nexport const ORDERS_FETCH_STARTED = 'ORDERS_FETCH_STARTED';\nexport const ORDERS_FETCH_COMPLETED = 'ORDERS_FETCH_COMPLETED';\nexport const ORDERS_FETCH_FAILED = 'ORDERS_FETCH_FAILED';\n\nexport interface IFetchOrdersStartedAction {\n type: typeof ORDERS_FETCH_STARTED;\n folderId: TApiFolder['id'] | null;\n}\n\nconst fetchOrdersStarted = (folderId?: IFetchOrdersStartedAction['folderId']): IFetchOrdersStartedAction => ({\n type: ORDERS_FETCH_STARTED,\n folderId: folderId ?? null\n});\n\nexport interface IFetchOrdersCompletedAction {\n type: typeof ORDERS_FETCH_COMPLETED,\n data: Array,\n folderId: TApiFolder['id'] | null;\n}\n\nconst fetchOrdersCompleted = (\n data: Array,\n folderId?: IFetchOrdersCompletedAction['folderId']\n): IFetchOrdersCompletedAction => ({\n type: ORDERS_FETCH_COMPLETED,\n data,\n folderId: folderId ?? null\n});\n\nexport interface IFetchOrdersFailedAction {\n type: typeof ORDERS_FETCH_FAILED,\n error: Error;\n folderId: TApiFolder['id'] | null;\n}\n\nconst fetchOrdersFailed = (\n error: Error,\n folderId?: IFetchOrdersFailedAction['folderId']\n): IFetchOrdersFailedAction => ({\n type: ORDERS_FETCH_FAILED,\n error,\n folderId: folderId ?? null\n});\n\nconst fetchOrders = (params?: { folder_id?: number | null }) => {\n return async (dispatch: ThunkDispatch): Promise> => {\n const folderId = params?.folder_id ?? null;\n\n try {\n dispatch(fetchOrdersStarted(folderId));\n\n const orders = await Api.Order.list(params);\n\n dispatch(fetchOrdersCompleted(orders, folderId));\n\n return orders;\n } catch (error) {\n if (ErrorHelpers.isError(error)) {\n dispatch(fetchOrdersFailed(error, folderId));\n }\n\n throw error;\n }\n };\n};\n\n\nexport const ORDERS_MOVE_STARTED = 'ORDERS_MOVE_STARTED';\nexport const ORDERS_MOVE_COMPLETED = 'ORDERS_MOVE_COMPLETED';\nexport const ORDERS_MOVE_FAILED = 'ORDERS_MOVE_FAILED';\n\nconst moveOrderStarted = (\n order: TApiOrder,\n srcFolderId: TApiFolder['id'] | null,\n targetFolderId: TApiFolder['id'] | null\n) => ({\n type: ORDERS_MOVE_STARTED,\n order,\n srcFolderId,\n targetFolderId\n});\n\nexport interface IMoveOrderRoFolderCompletedAction {\n type: typeof ORDERS_MOVE_COMPLETED,\n order: TApiOrder,\n srcFolderId: number | null;\n targetFolderId: number | null;\n}\n\nconst moveOrderCompleted = (order: TApiOrder, srcFolderId: number | null, targetFolderId: number | null): IMoveOrderRoFolderCompletedAction => ({\n type: ORDERS_MOVE_COMPLETED,\n order,\n srcFolderId,\n targetFolderId\n});\n\nconst moveOrderFailed = (error: Error, order: TApiOrder) => ({\n type: ORDERS_MOVE_FAILED,\n error,\n order\n});\n\nconst moveOrderToFolder = (order: TApiOrder, srcFolderId: TApiFolder['id'] | null, targetFolderId: TApiFolder['id'] | null) => {\n return async (dispatch: ThunkDispatch): Promise => {\n try {\n dispatch(moveOrderStarted(order, srcFolderId, targetFolderId));\n\n const updatedOrder = await Api.Order.moveToFolder(order.id, targetFolderId);\n\n dispatch(moveOrderCompleted(order, srcFolderId, targetFolderId));\n\n return updatedOrder;\n } catch (error) {\n if (ErrorHelpers.isError(error)) {\n dispatch(moveOrderFailed(error, order));\n }\n\n throw error;\n }\n };\n};\n\nexport const ORDER_CREATE_STARTED = 'ORDER_CREATE_STARTED';\nexport const ORDER_CREATE_COMPLETED = 'ORDER_CREATE_COMPLETED';\nexport const ORDER_CREATE_FAILED = 'ORDER_CREATE_FAILED';\n\nexport interface ICreateOrderCompletedAction {\n type: typeof ORDER_CREATE_COMPLETED,\n order: TApiOrderDetails,\n folderId?: Nullable;\n}\n\nconst createOrderCompleted = (order: TApiOrderDetails, folderId?: Nullable): ICreateOrderCompletedAction => ({\n type: ORDER_CREATE_COMPLETED,\n order,\n folderId\n});\n\nconst createOrder = (params: TOrderCreateParams) => {\n return async (dispatch: ThunkDispatch): Promise => {\n try {\n const createdOrder = await Api.Order.create(params);\n\n dispatch(createOrderCompleted(createdOrder, params.folder_id))\n\n return createdOrder;\n } catch (error) {\n throw error;\n }\n };\n};\n\n\nexport const ORDER_DETAILS_FETCH_STARTED = 'ORDER_DETAILS_FETCH_STARTED';\nexport const ORDER_DETAILS_FETCH_COMPLETED = 'ORDER_DETAILS_FETCH_COMPLETED';\nexport const ORDER_DETAILS_FETCH_FAILED = 'ORDER_DETAILS_FETCH_FAILED';\n\ninterface IFetchOrderDetailsStartedActionOptions {\n silentUpdate: boolean\n}\n\nexport interface IFetchOrderDetailsStartedAction {\n type: typeof ORDER_DETAILS_FETCH_STARTED,\n id: string | number,\n options: IFetchOrderDetailsStartedActionOptions\n}\n\nconst fetchOrderDetailsStarted = (\n id: string | number,\n options: IFetchOrderDetailsStartedActionOptions\n): IFetchOrderDetailsStartedAction => ({\n type: ORDER_DETAILS_FETCH_STARTED,\n id,\n options\n});\n\nexport interface IFetchOrderDetailsCompletedAction {\n type: typeof ORDER_DETAILS_FETCH_COMPLETED,\n data: TApiOrderDetails\n}\n\nconst fetchOrderDetailsCompleted = (data: TApiOrderDetails): IFetchOrderDetailsCompletedAction => ({\n type: ORDER_DETAILS_FETCH_COMPLETED,\n data\n});\n\nexport interface IFetchOrderDetailsFailedAction {\n type: typeof ORDER_DETAILS_FETCH_FAILED,\n error: AxiosError;\n}\n\n\nconst fetchOrderDetails = (id: number | string, silentUpdate = false) => {\n return async (dispatch: ThunkDispatch): Promise => {\n try {\n dispatch(fetchOrderDetailsStarted(id, { silentUpdate }));\n\n const order = await Api.Order.fetch(id);\n\n dispatch(fetchOrderDetailsCompleted(order));\n\n return order;\n } catch (error) {\n if (ErrorHelpers.isError(error)) {\n dispatch(fetchOrdersFailed(error));\n }\n\n throw error;\n }\n };\n}\n\n\nexport const ORDER_UPDATE_STARTED = 'ORDER_UPDATE_STARTED';\nexport const ORDER_UPDATE_COMPLETED = 'ORDER_UPDATE_COMPLETED';\nexport const ORDER_UPDATE_FAILED = 'ORDER_UPDATE_FAILED';\n\nexport interface IUpdateOrderCompletedAction {\n type: typeof ORDER_UPDATE_COMPLETED;\n order: TApiOrderDetails;\n folderId?: Nullable;\n}\n\nconst updateOrderCompleted = (order: TApiOrderDetails, folderId?: Nullable): IUpdateOrderCompletedAction => ({\n type: ORDER_UPDATE_COMPLETED,\n order,\n folderId\n});\n\n\nconst updateOrder = (id: number | string, params: TOrderCreateParams) => {\n return async (dispatch: ThunkDispatch): Promise => {\n try {\n const updatedOrder = await Api.Order.update(id, params);\n\n dispatch(updateOrderCompleted(updatedOrder, params.folder_id));\n\n return updatedOrder;\n } catch (error) {\n throw error;\n }\n }\n}\n\nconst partialUpdateOrder = (id: number | string, params: TOrderUpdateParams) => {\n return async (dispatch: ThunkDispatch): Promise => {\n try {\n const updatedOrder = await Api.Order.patch(id, params);\n\n dispatch(updateOrderCompleted(updatedOrder, params.folder_id));\n\n return updatedOrder;\n } catch (error) {\n throw error;\n }\n }\n}\n\nexport const ORDER_REMOVE_STARTED = 'ORDER_REMOVE_STARTED';\nexport const ORDER_REMOVE_COMPLETED = 'ORDER_REMOVE_COMPLETED';\nexport const ORDER_REMOVE_FAILED = 'ORDER_REMOVE_FAILED';\n\nexport interface IRemoveOrderCompletedAction {\n type: typeof ORDER_REMOVE_COMPLETED;\n orderId: number | string;\n folderId?: Nullable;\n}\n\nconst removeOrderCompleted = (orderId: number | string, folderId?: Nullable): IRemoveOrderCompletedAction => ({\n type: ORDER_REMOVE_COMPLETED,\n orderId,\n folderId\n})\n\nconst removeOrder = (id: number | string, folderId?: Nullable) => {\n return async (dispatch: ThunkDispatch): Promise => {\n try {\n await Api.Order.remove(id);\n\n dispatch(removeOrderCompleted(id, folderId));\n } catch (error) {\n throw error;\n }\n }\n}\n\nexport const ORDER_SUBMIT_COMPLETED: 'ORDER_SUBMIT_COMPLETED' = 'ORDER_SUBMIT_COMPLETED';\n\nexport interface ISubmitOrderCompletedAction {\n type: typeof ORDER_SUBMIT_COMPLETED;\n order: TApiOrderDetails;\n folderId?: Nullable;\n}\n\nconst submitOrderCompleted = (order: TApiOrderDetails, folderId?: Nullable) => ({\n type: ORDER_SUBMIT_COMPLETED,\n order,\n folderId\n})\n\nconst submitOrder = (order: TApiOrderDetails, params: TOrderSubmitParams, folderId?: Nullable) => {\n return async (dispatch: ThunkDispatch): Promise => {\n try {\n const submittedOrder = await Api.Order.submit(order.id, params);\n\n dispatch(submitOrderCompleted(submittedOrder, folderId));\n\n return submittedOrder;\n } catch (error) {\n throw error;\n }\n }\n}\n\nconst duplicateOrder = (order: TApiOrder, folderId?: Nullable) => {\n return async (dispatch: ThunkDispatch): Promise => {\n try {\n const createdOrder = await Api.Order.duplicate(order.id, folderId);\n\n dispatch(createOrderCompleted(createdOrder, folderId));\n\n return createdOrder;\n } catch (error) {\n throw new Error('Could not duplicate the order.');\n }\n }\n}\n\nexport const ORDER_CANCEL_COMPLETED: 'ORDER_CANCEL_COMPLETED' = 'ORDER_CANCEL_COMPLETED';\n\nexport interface ICancelOrderCompletedAction {\n type: typeof ORDER_CANCEL_COMPLETED;\n order: TApiOrderDetails;\n folderId?: Nullable;\n}\n\nconst cancelOrderCompleted = (order: TApiOrderDetails, folderId?: Nullable) => ({\n type: ORDER_CANCEL_COMPLETED,\n order,\n folderId\n})\n\nconst cancelOrder = (order: TApiOrder, folderId?: Nullable) => {\n return async (dispatch: ThunkDispatch): Promise => {\n try {\n const cancelledOrder = await Api.Order.cancel(order.id);\n\n dispatch(cancelOrderCompleted(cancelledOrder, folderId));\n\n return cancelledOrder;\n } catch (error) {\n throw error;\n }\n }\n}\n\nexport const ORDER_APPROVE_COMPLETED: 'ORDER_APPROVE_COMPLETED' = 'ORDER_APPROVE_COMPLETED';\n\nexport interface IApproveOrderCompletedAction {\n type: typeof ORDER_APPROVE_COMPLETED;\n order: TApiOrderDetails;\n folderId?: Nullable;\n}\n\nconst approveOrderCompleted = (order: TApiOrderDetails, folderId?: Nullable) => ({\n type: ORDER_APPROVE_COMPLETED,\n order,\n folderId\n})\n\nconst approveOrder = (order: TApiOrder, folderId?: Nullable) => {\n return async (dispatch: ThunkDispatch): Promise => {\n try {\n const approvedOrder = await Api.Order.approve(order.id);\n\n dispatch(approveOrderCompleted(approvedOrder, folderId));\n\n return approvedOrder;\n } catch (error) {\n throw error;\n }\n }\n}\n\nexport const ORDER_REJECT_COMPLETED: 'ORDER_REJECT_COMPLETED' = 'ORDER_REJECT_COMPLETED';\n\nexport interface IRejectOrderCompletedAction {\n type: typeof ORDER_REJECT_COMPLETED;\n order: TApiOrderDetails;\n folderId?: Nullable;\n}\n\nconst rejectOrderCompleted = (order: TApiOrderDetails, folderId?: Nullable) => ({\n type: ORDER_REJECT_COMPLETED,\n order,\n folderId\n})\n\nconst rejectOrder = (order: TApiOrder, folderId?: Nullable) => {\n return async (dispatch: ThunkDispatch): Promise => {\n try {\n const rejectedOrder = await Api.Order.reject(order.id, '');\n\n dispatch(rejectOrderCompleted(rejectedOrder, folderId));\n\n return rejectedOrder;\n } catch (error) {\n throw error;\n }\n }\n}\n\nexport const ORDER_RECALCULATE_COMPLETED = 'ORDER_RECALCULATE_COMPLETED' as const;\n\nexport interface IRecalculateOrderCompletedAction {\n type: typeof ORDER_RECALCULATE_COMPLETED;\n order: TApiOrderDetails;\n}\n\nconst recalculateOrderCompleted = (order: TApiOrderDetails) => ({\n type: ORDER_RECALCULATE_COMPLETED,\n order\n})\n\nconst recalculateOrder = (order: TApiOrder) => {\n return async (dispatch: ThunkDispatch): Promise => {\n try {\n const updatedOrder = await Api.Order.recalculate(order.id);\n\n dispatch(recalculateOrderCompleted(updatedOrder));\n\n return updatedOrder\n } catch (error) {\n throw error;\n }\n }\n}\n\nexport {\n createOrder,\n updateOrder,\n partialUpdateOrder,\n moveOrderToFolder,\n fetchOrders,\n fetchOrderDetails,\n removeOrder,\n submitOrder,\n cancelOrder,\n approveOrder,\n rejectOrder,\n recalculateOrder,\n duplicateOrder\n};\n","import React from \"react\";\n\nconst LoadingIndicator = () => {\n return (\n
\n
\n
\n
\n
\n
\n
\n
\n )\n}\n\nexport default LoadingIndicator;\n","import * as React from \"react\";\nimport classNames from \"classnames\";\nimport { Link } from \"@react-pdf/renderer\";\n\ntype Props = {\n url: string;\n pdf?: boolean;\n className?: string;\n};\n\nconst ExternalLink: React.FC = props => {\n if (props.pdf) {\n return {props.children};\n }\n\n return (\n \n {props.children}\n \n );\n};\n\nexport default ExternalLink;\n\ntype EmailProps = {\n email: string;\n className?: string;\n};\n\nexport const MailLink: React.FC = props => {\n const url = `mailto:${props.email}`;\n\n return (\n {props.email}\n );\n};\n","import React, { Fragment } from 'react';\nimport ExternalLink from '../Navigation/Links/ExternalLink';\n\ninterface IProps {\n pdf?: boolean;\n}\n\nconst NewLine = (props: IProps) => {\n const { pdf } = props;\n return (\n \n {\n pdf ? '\\n' :
\n }\n
\n );\n}\n\nconst EPUDefinitionFootnote = (props: IProps) => {\n return (\n \n EPU (ECOMET Product Unit) is the unit of information used to cost ECMWF Products. For more details,\n please consult the\n  \n \n ECMWF rules of the Information Cost calculation\n \n .\n \n );\n};\n\nconst AdditionalChargesFootnote = (props: IProps) => {\n return (\n \n Please note that additional volume charges, services charges (in case ECMWF is selected as the data deliverer) or\n handling charges (in case you pick a data deliverer other than ECMWF) will apply.\n \n );\n};\n\nconst ResearchAndSmallBusinessFootnote = (props: IProps) => {\n return (\n \n Please note that discounts are only applied if all requirements are fulfilled. For more details,\n please consult the page on\n  \n \n ECMWF Data Pricing\n \n .\n \n );\n};\n\nconst LimitCapacityFootnote = (props: IProps) => {\n return (\n \n Please note that it is not possible to receive more than 3 TiB/day before 01/07/2024 and 4 TiB/day after\n 01/07/2024.\n \n )\n}\n\nconst EPUOldLicenseNotice = (props: IProps) => {\n return (\n \n Please note if your licence pre-dates 01/07/2024, you will not benefit from the pricing and Service Model\n changes introduced on 01/07/2024.\n If you wish to avail of these changes and your licence pre-dates 01/07/2024 you can terminate your current\n licence with your Licensor and request a new one.\n \n You can compare prices for your data order by using the 'version' button available on the web\n interface. Please note between costing versions, that the Information Cost, Volume Bands and Service packages\n all change. The PDF download will contain the 'version' which was applied on the web interface at the time of\n download.\n \n )\n}\n\nexport {\n EPUDefinitionFootnote,\n AdditionalChargesFootnote,\n ResearchAndSmallBusinessFootnote,\n LimitCapacityFootnote,\n EPUOldLicenseNotice\n};\n","import { TApiOrder } from \"../../api/endpoints/Order\";\nimport React from \"react\";\n\ninterface IProps {\n order: TApiOrder\n}\n\nconst OrderName = (props: IProps) => {\n const { order: { name } } = props;\n\n return (\n \n {\n name ? name : (no name)\n }\n \n )\n};\n\nexport default OrderName;\n","import * as React from \"react\";\nimport classNames from \"classnames\";\n\ntype Props = {\n\ttype?: \"submit\" | \"reset\" | \"button\";\n\tonClick: () => void;\n\ttext: string;\n\tsmall?: boolean;\n\tdisabled?: boolean;\n};\n\nclass ButtonInverted extends React.PureComponent {\n\tpublic render() {\n\t\treturn (\n\t\t\t {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tthis.props.onClick();\n\t\t\t\t}}\n\t\t\t\tdisabled={this.props.disabled}\n\t\t\t>\n\t\t\t\t{this.props.text}\n\t\t\t\n\t\t);\n\t}\n}\n\nexport default ButtonInverted;\n","import { TRootState } from \"../../reducers/RootReducer\";\n\nconst selectParameters = (store: TRootState) => store.parameters.data;\n\nexport {\n selectParameters\n}\n","/**\n * A grid resolution. Not always a number hence the optional value property.\n */\nexport type Resolution = {\n\tname: string;\n\tvalue?: number;\n};\n\nexport const makeResolution = (name: string): Resolution => {\n\tconst f = parseFloat(name);\n\treturn {\n\t\tname,\n\t\tvalue: isNaN(f) ? undefined : f\n\t};\n};\n","import { OrderCategory } from \"../../../api/endpoints/Order\";\nimport { last } from \"lodash\";\nimport React, { ElementType, Fragment } from \"react\";\nimport { TOrderProductData } from \"../../../api/endpoints/OrderProduct\";\n\nconst formatEnsembleMembers = (values: Array) => {\n return last(values.filter(v => v === 50 || v === 100));\n}\n\nconst EnsembleMembers = (props: {\n values: NonNullable['number']>\n as: ElementType\n}) => {\n const { values, as: Component } = props;\n\n return (\n \n \n {formatEnsembleMembers(values)}\n \n \n );\n};\n\nexport default EnsembleMembers;\n","import { OrderCategory } from \"../../../api/endpoints/Order\";\nimport { groupBy, map } from \"lodash\";\nimport { formatRun } from \"../../../utils/Format\";\nimport React, { ElementType, Fragment } from \"react\";\nimport { TOrderProductData } from \"../../../api/endpoints/OrderProduct\";\nimport { StepRange } from \"../../../entities/StepRange\";\n\nconst formatSteps = (steps: Array) => {\n return steps.join('/');\n}\n\nconst Run = (props: {\n values: TOrderProductData['use_step']\n as: ElementType\n}) => {\n const { values, as: Component } = props;\n\n const grouped = groupBy(values, (value ) => value.use);\n\n return (\n \n {\n map(grouped, (values, use) => {\n return (\n \n {formatRun(Number(use))}:\n  \n {formatSteps(values.map(value => value.step))}\n \n );\n })\n }\n \n );\n};\n\nexport default Run;\n","import { difference, intersection, range } from \"lodash\";\nimport React, { ElementType, Fragment } from \"react\";\nimport { formatAggregatedSteps, formatBaseTime } from \"../../../../utils/Format\";\n\nconst CYCLE_49r1_UPDATE_DATE = new Date('2024-11-12T00:00:00Z');\n\nconst BC_TIMES = [6, 18];\nconst BC_STEPS_06_18 = (timestamp?: string) => {\n const date = timestamp ? new Date(timestamp) : new Date();\n\n return new Set([\n ...range(0, 91),\n ...(CYCLE_49r1_UPDATE_DATE.getTime() < date.getTime() ? range(93, 147, 3) : [])\n ]);\n}\nconst BC_STEPS_06_18_ENS = BC_STEPS_06_18;\n\nconst BcSteps = (props: {\n steps: Array;\n times: Array;\n type: 'hres' | 'ens';\n as: ElementType;\n timestamp?: string;\n}) => {\n const { times, steps, type, as } = props;\n const Component = as;\n\n const runTimes_00_12 = difference(times, BC_TIMES);\n const runTimes_06_18 = intersection(times, BC_TIMES);\n\n const label_00_12 = runTimes_00_12.length ?\n runTimes_00_12.map(formatBaseTime) :\n runTimes_06_18.map(t => formatBaseTime(t - 6));\n\n const label_06_18 = runTimes_06_18.map(formatBaseTime);\n\n const values_00_12 = formatAggregatedSteps(runTimes_00_12.length ? steps : []);\n const values_06_18 = formatAggregatedSteps(steps.filter(v => (type === 'hres' ? BC_STEPS_06_18() : BC_STEPS_06_18_ENS()).has(v)))\n\n return (\n \n \n [{label_00_12.join(', ')}]: {values_00_12}\n \n\n {\n Boolean(runTimes_06_18.length) &&\n \n [{label_06_18.join(', ')}]: {values_06_18}\n \n }\n \n )\n}\n\nexport default BcSteps;\n","import { ElementType } from \"react\";\nimport React from \"react\";\nimport { formatAggregatedSteps } from \"../../../utils/Format\";\nimport BcSteps from \"./BcSteps\";\n\ninterface IProps {\n values: Array;\n selectedTimes?: Array;\n bcType: 'hres' | 'ens' | null;\n timestamp?: string;\n as?: ElementType;\n}\n\nconst Steps = (props: IProps) => {\n const { values, selectedTimes, bcType, timestamp, as = 'div' } = props;\n const Component = as;\n\n if (!values.length) {\n return No steps selected.\n }\n\n const isRange = values[0].split('-').length > 1;\n\n if (isRange) {\n return {values.join(', ')}\n } else {\n const valuesAsNumbers = values.map(value => parseInt(value, 10));\n\n if (bcType && selectedTimes) {\n const timesAsNumbers = selectedTimes.map((t: string | number) => parseInt(t.toString(), 10));\n\n return (\n \n )\n }\n\n return (\n \n {formatAggregatedSteps(valuesAsNumbers)}\n \n )\n }\n}\n\nexport default Steps;\n","import { OrderCategory } from \"../../../api/endpoints/Order\";\nimport { map, padStart } from \"lodash\";\nimport React, { Fragment } from \"react\";\nimport { TOrderProductData } from \"../../../api/endpoints/OrderProduct\";\n\nconst TimeStep = (props: {\n values: TOrderProductData['time_step']\n}) => {\n const { values } = props;\n const parsed = map(values,\n value => `${value.step}h (${padStart(value.time.toString(), 2, '0')})`\n );\n\n return (\n \n {\n parsed.join(', ')\n }\n \n );\n};\n\nexport default TimeStep;\n","import { TApiParameter } from '../../../../../../api/endpoints/Parameter';\nimport { groupBy, map, orderBy } from 'lodash';\nimport { StyleSheet, Text, View } from '@react-pdf/renderer';\nimport * as React from 'react';\nimport { LeveledParam } from '../../../../../../entities/LeveledParam';\n\nconst styles = StyleSheet.create({\n root: {\n },\n group: {\n marginBottom: '2mm',\n },\n header: {\n marginRight: '1mm',\n },\n values: {\n }\n})\n\nconst ParamLevelistFormatter = (props: {\n value: Array;\n params: {\n [shortname: string]: TApiParameter\n };\n}) => {\n const { value, params } = props;\n\n const grouped = groupBy(value, 'param');\n\n return (\n \n {\n map(grouped, (group, shortname) => {\n const shortnameLowerCase = shortname.toLowerCase()\n const matchedParam = params[shortnameLowerCase];\n\n return (\n \n \n {\n matchedParam ?\n `${matchedParam.name} (${shortnameLowerCase}):`\n : `${shortnameLowerCase}:`\n }\n \n \n {\n orderBy(group, param => param.level)\n .map(param => param.level).join(', ')\n }\n \n \n )\n })}\n \n )\n}\n\nexport default ParamLevelistFormatter;\n","import { QuantiledParam } from \"../../../../../../entities/QuantiledParam\";\nimport { TApiParameter } from \"../../../../../../api/endpoints/Parameter\";\nimport { groupBy, map, orderBy } from \"lodash\";\nimport { StyleSheet, Text, View } from \"@react-pdf/renderer\";\nimport * as React from \"react\";\n\nconst styles = StyleSheet.create({\n root: {\n },\n group: {\n marginBottom: '2mm',\n },\n header: {\n marginRight: '1mm',\n },\n values: {\n }\n})\n\nconst ParamQuantileFormatter = (props: {\n value: Array;\n params: {\n [shortname: string]: TApiParameter\n };\n}) => {\n const { value, params } = props;\n\n const grouped = groupBy(value, 'param');\n\n return (\n \n {\n map(grouped, (group, shortname) => {\n const shortnameLowerCase = shortname.toLowerCase()\n const matchedParam = params[shortnameLowerCase];\n\n return (\n \n \n {\n matchedParam ?\n `${matchedParam.name} (${shortnameLowerCase}):`\n : `${shortnameLowerCase}:`\n }\n \n \n {\n orderBy(group, param => param.quantile.split(':')[0])\n .map(param => param.quantile).join(', ')\n }\n \n \n )\n })}\n \n )\n}\n\nexport default ParamQuantileFormatter;\n","import { StyleSheet, Text, View } from '@react-pdf/renderer';\nimport { castArray, compact, isEmpty } from 'lodash';\nimport * as React from 'react';\nimport { Fragment, ReactNode } from 'react';\nimport { OrderCategory, TProductCost } from '../../../../../api/endpoints/Order';\nimport { TOrderProduct } from '../../../../../api/endpoints/OrderProduct';\nimport { TApiParameter } from '../../../../../api/endpoints/Parameter';\nimport { TBcType } from \"../../../../../api/endpoints/Subset\";\nimport { makeResolution } from '../../../../../entities/Resolution';\nimport {\n formatAreas,\n formatBaseTimes,\n formatBinaryCapacityUnit,\n formatHindcastDay,\n formatResolution,\n formatRun\n} from '../../../../../utils/Format';\nimport EnsembleMembers from \"../../../../ProductFormatters/EnsembleMembers\";\nimport Run from '../../../../ProductFormatters/Run';\nimport Steps from '../../../../ProductFormatters/Steps';\nimport TimeStep from '../../../../ProductFormatters/TimeStep';\nimport ParamLevelistFormatter from './ParamLevelistFormatter';\nimport ParamQuantileFormatter from './ParamQuantileFormatter';\n\ninterface IProps {\n dataSetName: string;\n bcType: TBcType;\n params: {\n [shortname: string]: TApiParameter\n };\n product: TOrderProduct;\n cost?: TProductCost;\n timestamp?: string;\n epuFootnoteRef?: string;\n}\n\nconst grey = \"#f0f0f0\";\nconst paddingXs = \"2mm\";\nconst paddingSm = \"3mm\";\nconst fontItalic = \"Helvetica-Oblique\";\n\nconst styles = StyleSheet.create({\n itemRow: {\n paddingBottom: paddingXs\n },\n title: {\n fontFamily: fontItalic\n },\n colLeft: {\n width: \"30%\"\n },\n colRight: {\n width: \"70%\",\n paddingLeft: paddingXs\n },\n flexRow: {\n flexDirection: \"row\"\n },\n flexWrap: {\n flexWrap: \"wrap\"\n },\n productWrap: {\n flexDirection: \"column\",\n lineHeight: 1.5\n },\n infoLeft: {\n width: \"70%\",\n padding: paddingSm,\n borderRight: `1pt solid ${grey}`\n },\n infoLeftNoCost: {\n width: '100%',\n borderRight: 'none'\n },\n infoRight: {\n width: \"30%\",\n padding: paddingSm\n },\n nameHeader: {\n width: \"70%\",\n borderRight: \"1pt solid white\",\n padding: paddingSm,\n lineHeight: 1.5\n },\n nameHeaderNoCost: {\n width: '100%'\n },\n costHeader: {\n width: \"30%\",\n paddingLeft: paddingSm\n },\n productHeader: {\n backgroundColor: grey,\n alignItems: \"center\"\n }\n});\n\nconst ProductAttribute = (props: {\n children: ReactNode;\n label: string;\n}) => {\n const { children, label } = props;\n\n return (\n \n \n \n {label}:\n \n \n\n \n {children}\n \n \n );\n};\n\n\nconst ProductDetails = (props: IProps) => {\n const { dataSetName, product, cost, params, bcType, timestamp } = props;\n const productData = product.data;\n\n const set = {\n name: dataSetName\n };\n const legs = productData.legs ?? [];\n\n\n return (\n \n \n \n \n {productData.name}\n \n\n \n {set.name}\n \n \n {\n cost &&\n \n Cost\n \n }\n \n\n \n \n {\n productData.time &&\n \n {formatBaseTimes(productData.time).join(', ')}\n \n }\n\n {\n legs.map((leg, index) => {\n return (\n \n {\n legs.length > 1 &&\n Leg {index + 1}\n }\n\n {\n leg.grid &&\n \n {formatResolution(makeResolution(leg.grid))}\n \n }\n\n {\n leg.step &&\n \n \n \n }\n \n );\n })\n }\n\n {\n productData.grid &&\n \n {formatResolution(makeResolution(productData.grid))}\n \n }\n\n {\n productData.step &&\n \n \n \n }\n\n {\n productData.number &&\n \n \n \n }\n\n {\n !isEmpty(productData.area) &&\n \n {\n castArray(formatAreas(productData.area)).map(area => {area})\n }\n \n }\n\n {\n productData.location &&\n \n {productData.location}\n \n }\n\n {\n productData.time_step &&\n \n \n \n }\n\n {\n productData.param &&\n \n {productData.param.join(' ')}\n \n }\n\n {\n productData.param_levelist &&\n \n \n \n }\n\n {\n productData.param_quantile &&\n \n \n \n }\n\n {\n productData.use &&\n \n \n {\n productData.use.map(formatRun).join(', ')\n }\n \n \n }\n\n {\n productData.use_step &&\n \n \n \n }\n\n {\n productData.fcmonth &&\n \n {productData.fcmonth.join(' ')}\n \n }\n\n {\n productData.channel &&\n \n {productData.channel.join(' ')}\n \n }\n\n {\n productData.hindcast && productData.hindcast.length &&\n \n {productData.hindcast.map(formatHindcastDay).join(', ')}\n \n }\n \n\n {\n cost &&\n \n \n \n \n Volume daily\n \n\n \n \n {formatBinaryCapacityUnit(cost.volume)}\n \n \n \n \n \n }\n \n \n )\n}\n\nexport default ProductDetails;\n","import { OrderCategory } from \"../../api/endpoints/Order\";\nimport { TApiSet } from \"../../api/endpoints/Set\";\nimport { TApiSubset, TBcType } from \"../../api/endpoints/Subset\";\nimport { TOrderProductData } from \"../../api/endpoints/OrderProduct\";\n\nconst deriveBcType = (product: TOrderProductData, sets: Array): TBcType => {\n let foundSubset: TApiSubset | undefined;\n\n sets.forEach(set => {\n set.subsets.forEach(subset => {\n const subsetId = subset.id;\n const productSubsetId = product.subset_id;\n\n if (subsetId === productSubsetId) {\n foundSubset = subset;\n }\n })\n });\n\n if (!foundSubset) {\n return null;\n }\n\n return foundSubset.bc_type;\n}\n\nconst deriveDataSetName = (productData: TOrderProductData, sets: Array): string => {\n let foundSet: TApiSet | undefined;\n let foundSubset: TApiSubset | undefined;\n\n sets.forEach(set => {\n set.subsets.forEach(subset => {\n const subsetId = subset.id;\n const productSubsetId = productData.subset_id;\n\n if (subsetId === productSubsetId) {\n foundSet = set;\n foundSubset = subset;\n }\n })\n });\n\n if (!foundSet || !foundSubset) {\n return '';\n }\n\n return `${foundSubset.name}: ${foundSet.description} - ${foundSubset.title}`;\n}\n\nexport {\n deriveDataSetName,\n deriveBcType\n}\n","import { OrderCategory, TApiOrderDetails } from \"../../../../api/endpoints/Order\";\nimport { StyleSheet, Text, View } from \"@react-pdf/renderer\";\nimport { formatDecimal, formatMegaBytes, withDefault } from \"../../../../utils/Format\";\nimport * as React from \"react\";\nimport { totalEpu } from \"../../../../utils/Cost\";\nimport ProductDetails from \"./ProductDetails\";\nimport { TApiSet } from \"../../../../api/endpoints/Set\";\nimport { deriveBcType, deriveDataSetName } from \"../../../../utils/DataSet\";\nimport { Fragment } from \"react\";\nimport { TApiParameter } from \"../../../../api/endpoints/Parameter\";\nimport { TOrderProduct } from \"../../../../api/endpoints/OrderProduct\";\n\ninterface IProps {\n order: TApiOrderDetails;\n products: Array>;\n sets: Array;\n params: {\n [shortname: string]: TApiParameter\n };\n epuFootnoteRef?: string;\n}\n\nconst grey = \"#f0f0f0\";\nconst paddingXs = \"2mm\";\nconst paddingSm = \"3mm\";\nconst fontItalic = \"Helvetica-Oblique\";\n\nconst styles = StyleSheet.create({\n itemRow: {\n paddingBottom: paddingXs\n },\n title: {\n fontFamily: fontItalic\n },\n colLeft: {\n width: \"30%\"\n },\n colRight: {\n width: \"70%\",\n paddingLeft: paddingXs\n },\n flexRow: {\n flexDirection: \"row\"\n },\n flexWrap: {\n flexWrap: \"wrap\"\n },\n productName: {\n paddingBottom: paddingXs\n },\n productWrap: {\n flexDirection: \"column\"\n },\n infoLeft: {\n width: \"70%\",\n padding: paddingSm,\n borderRight: `1pt solid ${grey}`\n },\n infoRight: {\n width: \"30%\",\n padding: paddingSm\n },\n nameHeader: {\n width: \"70%\",\n borderRight: \"1pt solid white\",\n padding: paddingSm\n },\n costHeader: {\n width: \"30%\",\n paddingLeft: paddingSm\n },\n productHeader: {\n backgroundColor: grey,\n alignItems: \"center\"\n },\n productSummary: {\n backgroundColor: grey,\n display: 'flex',\n flexDirection: 'row',\n textAlign: 'right',\n alignItems: 'center'\n },\n productSummaryColumn: {\n padding: paddingSm\n }\n});\n\nconst RealtimeOrderPdfDetails = (props: IProps) => {\n const { order, sets, params, products } = props;\n\n return (\n \n {\n products.map((product, index) => {\n const dataSetName = deriveDataSetName(product.data, sets);\n const bcType = deriveBcType(product.data, sets);\n\n return ;\n })\n }\n\n {\n products.length <= 0 &&\n You have no products in your order.\n }\n\n {\n order.cost.version === 'v1' && order.cost.data.total_cost &&\n \n \n \n Total daily volume\n \n \n \n {\n withDefault(\n order.cost.data.total_cost.volume ? (order.cost.data.total_cost.volume * 0.000001) : undefined,\n formatMegaBytes,\n \"--\"\n )\n }\n \n \n \n \n }\n \n )\n}\n\nexport default RealtimeOrderPdfDetails;\n","import { OrderCategory, OrderCostingVersion, OrderStatus, TApiOrder, TApiOrderDetails } from \"../api/endpoints/Order\";\nimport { User, UserType } from \"../entities/User\";\nimport OrderHelpers from \"../utils/OrderHelpers\";\n\nexport const isOrderValid = (order: TApiOrderDetails) => {\n const { version } = order.cost;\n\n return !(order.category === OrderCategory.REALTIME && ['v1', 'v2'].includes(version));\n}\n\nconst isSubmitFrozenForUser = (user: User): boolean => {\n return user.type === UserType.Customer &&\n user.details.freeze.enabled;\n}\n\nconst OrderPolicy = {\n canSubmit(user: User, order: TApiOrderDetails, costingVersions: Array) {\n return !OrderHelpers.isExpired(order, costingVersions) &&\n user.type === UserType.Customer &&\n !isSubmitFrozenForUser(user) &&\n order.status === OrderStatus.DRAFT;\n },\n\n canApprove(user: User, order: TApiOrder) {\n return (user.type === UserType.CCP || user.type === UserType.Admin) &&\n order.status === OrderStatus.SUBMITTED\n },\n\n canReject(user: User, order: TApiOrder) {\n return (user.type === UserType.CCP || user.type === UserType.Admin) &&\n order.status === OrderStatus.SUBMITTED\n },\n\n canCancel(user: User, order: TApiOrder) {\n return user.type === UserType.Customer &&\n order.status === OrderStatus.SUBMITTED\n },\n\n canRemove(user: User, order: TApiOrder) {\n return user.type !== UserType.Unknown &&\n order.status === OrderStatus.DRAFT\n },\n\n canEdit(user: User, order: TApiOrderDetails, costingVersions: Array) {\n return !OrderHelpers.isExpired(order, costingVersions) &&\n user.type !== UserType.Unknown &&\n order.status === OrderStatus.DRAFT\n },\n\n canAddProduct(user: User, order: TApiOrderDetails, costingVersions: Array) {\n return !OrderHelpers.isExpired(order, costingVersions) &&\n user.type !== UserType.Unknown &&\n order.category === OrderCategory.REALTIME &&\n order.status === OrderStatus.DRAFT\n },\n\n canUpdateProduct(user: User, order: TApiOrderDetails, costingVersions: Array) {\n return this.canAddProduct(user, order, costingVersions);\n },\n\n canRemoveProduct(user: User, order: TApiOrderDetails, costingVersions: Array) {\n return this.canAddProduct(user, order, costingVersions);\n },\n\n canSetCostingVersion(user: User, order: TApiOrderDetails) {\n return order.status === OrderStatus.DRAFT;\n },\n\n canRequestSmallBusinessDiscount(user: User, order: TApiOrder | { category: OrderCategory }) {\n return order.category === OrderCategory.REALTIME ||\n order.category === OrderCategory.ARCHIVE;\n },\n\n canRequestResearchLicence(user: User, order: TApiOrder | { category: OrderCategory }) {\n return order.category === OrderCategory.REALTIME ||\n order.category === OrderCategory.ARCHIVE;\n },\n\n canViewCcpOrders(user: User) {\n return user.type === UserType.Admin;\n },\n\n canViewPublicOrders(user: User) {\n return user.type === UserType.Admin;\n },\n\n canViewPendingOrders(user: User) {\n return user.type === UserType.CCP;\n },\n\n canViewInformationCostBreakdown(user: User, orderCategory: OrderCategory) {\n return (user.type === UserType.Admin || user.type === UserType.CCP) &&\n (orderCategory === OrderCategory.REALTIME || orderCategory === OrderCategory.EU_CUTOUT);\n },\n\n canViewEcQuoteVersion(user: User) {\n return true;\n },\n\n canViewFullCostError(user: User) {\n return user.type === UserType.Admin;\n },\n\n canViewServiceChargeEstimation(user: User, order: TApiOrder) {\n return (user.type === UserType.Admin || user.type === UserType.CCP) && order.status === OrderStatus.DRAFT;\n }\n}\n\nexport default OrderPolicy;\n","import ReactPDF, { Text, View } from \"@react-pdf/renderer\";\nimport { isNull } from \"lodash\";\nimport * as React from \"react\";\n\ninterface IProps {\n title: string;\n value: boolean | null,\n styles: ReactPDF.Styles\n}\n\nconst LicenceItem = (props: IProps) => {\n const { title, value, styles } = props;\n\n if (isNull(value)) {\n return null;\n }\n\n return (\n \n {title}:  \n {value ? 'Yes' : 'No'}\n \n )\n}\n\nexport default LicenceItem;\n","import ReactPDF from \"@react-pdf/renderer\";\nimport * as React from \"react\";\nimport { TApiOrderDetails } from \"../../../api/endpoints/Order\";\nimport { User } from \"../../../entities/User\";\nimport { Fragment } from \"react\";\nimport OrderPolicy from \"../../../policies/OrderPolicy\";\nimport LicenceItem from \"./LicenceItem\";\n\ninterface IProps {\n order: TApiOrderDetails;\n user: User;\n styles: ReactPDF.Styles\n}\n\nconst LicenceDetails = (props: IProps) => {\n const { order, user, styles } = props;\n\n return (\n \n {\n OrderPolicy.canRequestSmallBusinessDiscount(user, order) &&\n \n }\n\n {\n OrderPolicy.canRequestResearchLicence(user, order) &&\n \n }\n \n )\n}\n\nexport default LicenceDetails;\n","import * as React from \"react\";\nimport { Fragment } from \"react\";\nimport OrderPDFHeader from \"../OrderPDFHeader\";\nimport { Text, View } from \"@react-pdf/renderer\";\nimport { UserType } from \"../../../entities/User\";\nimport LicenceDetails from \"../LicenceDetails\";\nimport { OrderStatus, TApiOrderDetails, OrderCategory } from \"../../../api/endpoints/Order\";\nimport { OrderPdfProps } from \"../types\";\nimport { formatVolumeBand } from \"../../../utils/Format\";\n\ninterface IProps extends OrderPdfProps {\n order: TApiOrderDetails;\n}\n\nconst OrderDetailsPdf = (props: IProps) => {\n const { user, order, provider, dataDeliverer, servicePackage, volumeBand, styles } = props;\n const userType = user.type;\n\n return (\n \n \n\n \n \n Order details\n\n {\n order.category === OrderCategory.EU_CUTOUT &&\n \n Order type:  \n European cut-out\n \n }\n\n {\n provider &&\n \n Licensor:  \n {provider.name}\n \n }\n\n {\n dataDeliverer &&\n \n Data deliverer:  \n {dataDeliverer.name}\n \n }\n\n {\n servicePackage &&\n \n Service Package:  \n {servicePackage.title}\n \n }\n\n {\n volumeBand && (order.category === OrderCategory.REALTIME || order.category === OrderCategory.EU_CUTOUT) &&\n \n Volume Band:  \n {`${formatVolumeBand(volumeBand)} per day`}\n \n }\n\n {\n userType !== UserType.Customer &&\n \n Customer:  \n {order.customer}\n \n }\n\n \n\n\n {\n Boolean(order.status_note) && (order.status === OrderStatus.REJECTED) &&\n \n Rejection reason:  \n {order.status_note}\n \n }\n \n\n \n \n Reference:  \n {order.id}\n \n \n \n \n )\n}\n\nexport default OrderDetailsPdf;\n","import {\n TOrderCost,\n TOrderCostV1,\n TOrderCostV2,\n TOrderCostV3,\n TOrderCostV4, TOrderCostV5,\n TProductCost\n} from \"../../api/endpoints/Order\";\nimport { formatInteger, formatMegaBytes } from \"../Format\";\n\nconst discount = (value: number) => {\n return -1 * value;\n}\n\nconst normalizeEpu = (epu: number) => {\n return Number((epu * 0.01).toFixed(2));\n}\n\nconst productDailyVolume = (productCost: TProductCost) => {\n return formatMegaBytes(productCost.volume * 0.000001);\n}\n\nconst productDailyFields = (productCost: TProductCost) => {\n return formatInteger(productCost.field_count);\n}\n\nconst productTotalEpu = (productCost: TProductCost) => {\n return normalizeEpu(productCost.epu);\n}\n\nconst hfInformationCostV1 = (cost: TOrderCostV1) => {\n return (cost.data.total_cost?.hf_information_cost ?? 0) * 0.01;\n}\n\nconst hfInformationCostAfterV1 = (cost: TOrderCostV2 | TOrderCostV3 | TOrderCostV4 | TOrderCostV5) => {\n return (cost.data.total_cost?.information_cost_hf ?? 0) * 0.01;\n}\n\nconst hfInformationCost = (cost: TOrderCost) => {\n const { version } = cost;\n\n switch (version) {\n case 'v1':\n return hfInformationCostV1(cost);\n case 'v2':\n return hfInformationCostAfterV1(cost);\n case 'v3':\n return hfInformationCostAfterV1(cost);\n case 'v4':\n return hfInformationCostAfterV1(cost);\n case 'v5':\n return hfInformationCostAfterV1(cost);\n }\n};\n\nconst standardInformationCost = (cost: TOrderCostV2 | TOrderCostV3 | TOrderCostV4 | TOrderCostV5) => {\n return (cost.data.total_cost?.information_cost_standard ?? 0) * 0.01;\n}\n\nconst informationCost = (cost: TOrderCost) => {\n return (cost.data.total_cost?.information_cost ?? 0) * 0.01;\n};\n\nconst informationCostDiscount = (cost: TOrderCostV2 | TOrderCostV3 | TOrderCostV4 | TOrderCostV5) => {\n const { total_cost } = cost.data;\n\n if (!total_cost) { return 0; }\n\n const { information_cost, information_cost_after_discount } = total_cost;\n\n return discount(information_cost - information_cost_after_discount) * 0.01;\n};\n\nconst serviceChargeCost = (cost: TOrderCostV2 | TOrderCostV3 | TOrderCostV4 | TOrderCostV5) => {\n return (cost.data.total_cost?.service_charge ?? 0) * 0.01;\n};\n\nconst serviceChargeCostDiscount = (cost: TOrderCostV2 | TOrderCostV3 | TOrderCostV4 | TOrderCostV5) => {\n const { total_cost } = cost.data;\n\n if (!total_cost) { return 0; }\n\n const { service_charge, service_charge_after_discount } = total_cost;\n\n return discount(service_charge - service_charge_after_discount) * 0.01;\n}\n\nconst totalCost = (cost: TOrderCost) => {\n return (cost.data.total_cost?.total_cost ?? 0) * 0.01;\n};\n\nconst handlingCost = (cost: TOrderCostV1) => {\n return (cost.data.total_cost?.handling_cost ?? 0) * 0.01;\n};\n\nconst totalEpu = (cost: TOrderCost) => {\n const epu = cost.data.total_cost?.epu;\n\n return epu ? normalizeEpu(epu) : 0;\n};\n\nexport {\n productDailyVolume,\n productDailyFields,\n productTotalEpu,\n hfInformationCost,\n standardInformationCost,\n informationCost,\n informationCostDiscount,\n serviceChargeCost,\n serviceChargeCostDiscount,\n totalCost,\n handlingCost,\n totalEpu\n}\n","import ReactPDF, { Text, View } from \"@react-pdf/renderer\";\nimport { formatCurrency } from \"../../../../utils/Format\";\nimport { handlingCost, hfInformationCost, informationCost, totalCost } from \"../../../../utils/Cost\";\nimport * as React from \"react\";\nimport { OrderCategory, TOrderCostV1 } from \"../../../../api/endpoints/Order\";\n\ninterface IProps {\n styles: ReactPDF.Styles;\n cost: TOrderCostV1;\n orderCategory: OrderCategory;\n annualTotalCostFootnoteRef?: string;\n}\n\nconst OrderCostSummaryPdfV1 = (props: IProps) => {\n const { cost, orderCategory, styles, annualTotalCostFootnoteRef = '' } = props;\n\n if (!cost.data.total_cost) {\n return null;\n }\n\n return (\n \n {\n orderCategory !== 'archive' &&\n \n \n Annual Information Cost\n \n\n \n \n {\n formatCurrency(informationCost(cost))\n }\n \n \n \n }\n\n {\n (orderCategory === OrderCategory.REALTIME || orderCategory === OrderCategory.EU_CUTOUT) &&\n \n \n Annual High Frequency Products Information Cost\n \n\n \n \n {\n formatCurrency(hfInformationCost(cost))\n }\n \n \n \n }\n\n \n \n Annual ECMWF handling charge\n \n\n \n \n {\n formatCurrency(handlingCost(cost))\n }\n \n \n \n\n \n \n Annual total cost{annualTotalCostFootnoteRef}\n \n\n \n \n {formatCurrency(totalCost(cost))}\n \n \n \n \n )\n}\n\nexport default OrderCostSummaryPdfV1;\n","import { OrderCostSummaryV2PdfProps } from \"../index\";\nimport React, { ReactNode } from \"react\";\nimport { Text, View } from \"@react-pdf/renderer\";\n\ninterface Props {\n styles: OrderCostSummaryV2PdfProps['styles'];\n label: string;\n value: string | number;\n highlight?: boolean;\n}\n\nconst LineItem = (props: Props) => {\n const { styles, label, value, highlight = false } = props;\n\n return (\n \n \n {label}\n \n\n \n {value}\n \n \n )\n}\n\nexport default LineItem;\n","import React, { Fragment } from \"react\"\nimport { OrderCostSummaryV2PdfProps } from \"../index\";\nimport { formatBinaryCapacityUnit, formatInteger } from \"../../../../../utils/Format\";\nimport LineItem from \"../LineItem\";\nimport { totalEpu } from \"../../../../../utils/Cost\";\n\nconst VolumeSummary = (props: OrderCostSummaryV2PdfProps) => {\n const { cost, styles } = props;\n const { total_cost } = cost.data;\n\n if (!total_cost) {\n return null;\n }\n\n return (\n \n \n \n )\n}\n\nexport default VolumeSummary;\n","import React, { Fragment } from \"react\";\nimport { formatCurrency } from \"../../../../../utils/Format\";\nimport { OrderCostSummaryV2PdfProps } from \"../index\";\nimport LineItem from \"../LineItem\";\nimport {\n hfInformationCost,\n informationCost,\n informationCostDiscount,\n standardInformationCost\n} from \"../../../../../utils/Cost\";\nimport OrderPolicy from \"../../../../../policies/OrderPolicy\";\n\nconst InformationCostVariant = (props: OrderCostSummaryV2PdfProps) => {\n const { user, cost, orderCategory, styles } = props;\n\n if (!OrderPolicy.canViewInformationCostBreakdown(user, orderCategory)) {\n return \n }\n\n return (\n \n {\n \n }\n\n {\n \n }\n \n )\n}\n\nconst InformationCost = (props: OrderCostSummaryV2PdfProps) => {\n const { cost, styles } = props;\n const { total_cost } = cost.data;\n\n if (!total_cost) {\n return null;\n }\n\n const isDiscounted = total_cost.information_cost !== total_cost.information_cost_after_discount;\n\n\n return (\n \n \n\n {\n isDiscounted &&\n \n }\n \n )\n}\n\nexport default InformationCost;\n","import { OrderCategory, OrderStatus } from \"../../../../../api/endpoints/Order\";\nimport React, { Fragment } from \"react\";\nimport { formatCurrency } from \"../../../../../utils/Format\";\nimport { serviceChargeCost, serviceChargeCostDiscount } from \"../../../../../utils/Cost\";\nimport LineItem from \"../LineItem\";\nimport { OrderCostSummaryV2PdfProps } from \"../index\";\n\nconst labelMapping = {\n [OrderCategory.REALTIME]: 'Service Charge (Volume and Service Package)',\n [OrderCategory.EU_CUTOUT]: 'Service Charge (Volume and Service Package)',\n [OrderCategory.ARCHIVE]: 'Annual ECMWF handling charge',\n [OrderCategory.WEB]: 'Annual ECMWF handling charge',\n}\n\nconst ServiceChargeCost = (props: OrderCostSummaryV2PdfProps) => {\n const { cost, orderCategory, orderStatus, styles } = props;\n const { total_cost } = cost.data;\n\n if ((orderCategory === OrderCategory.REALTIME || orderCategory === OrderCategory.EU_CUTOUT) && orderStatus === OrderStatus.DRAFT) {\n return null;\n }\n\n if (!total_cost) {\n return null;\n }\n\n const isDiscounted = total_cost.service_charge !== total_cost.service_charge_after_discount;\n\n return (\n \n \n\n {\n isDiscounted &&\n \n }\n \n )\n}\n\nexport default ServiceChargeCost;\n","import React from \"react\";\nimport { formatCurrency } from \"../../../../../utils/Format\";\nimport { totalCost } from \"../../../../../utils/Cost\";\nimport { OrderCostSummaryV2PdfProps } from \"../index\";\nimport LineItem from \"../LineItem\";\nimport { OrderCategory, OrderStatus } from \"../../../../../api/endpoints/Order\";\n\nconst TotalCost = (props: OrderCostSummaryV2PdfProps) => {\n const { styles, cost, orderStatus, orderCategory, annualTotalCostFootnoteRef = '' } = props;\n const { total_cost } = cost.data;\n\n if (!total_cost) {\n return null;\n }\n\n let label = 'Annual total cost';\n\n if (\n orderStatus === OrderStatus.DRAFT &&\n (orderCategory === OrderCategory.REALTIME || orderCategory === OrderCategory.EU_CUTOUT)\n ) {\n label = 'Total Annual Information Cost';\n }\n\n return (\n \n )\n}\n\nexport default TotalCost;\n","import { OrderCostSummaryV2PdfProps } from \"../index\";\nimport React from \"react\";\nimport { Text, View } from \"@react-pdf/renderer\";\nimport OrderPolicy from \"../../../../../policies/OrderPolicy\";\n\nconst CostingVersion = (props: OrderCostSummaryV2PdfProps) => {\n const { styles, cost, currentCostingVersion, user } = props;\n const { ecquote_version } = cost.data;\n\n if (!ecquote_version || !OrderPolicy.canViewEcQuoteVersion(user)) {\n return null;\n }\n\n return (\n \n \n \n {\n currentCostingVersion &&\n \n Costing version: {currentCostingVersion.title}, \n \n }\n\n Ecquote version: {ecquote_version}\n \n \n \n )\n}\n\nexport default CostingVersion;\n","import ReactPDF, { View } from \"@react-pdf/renderer\";\nimport * as React from \"react\";\nimport { Nullable } from \"../../../../../types/utils\";\nimport { User } from \"../../../../entities/User\";\nimport {\n OrderCategory,\n OrderCostingVersion,\n OrderStatus,\n TOrderCostV2,\n TOrderCostV3,\n TOrderCostV4, TOrderCostV5\n} from \"../../../../api/endpoints/Order\";\nimport VolumeSummary from \"././VolumeSummary\";\nimport InformationCost from \"./InformationCost\";\nimport ServiceChargeCost from \"./ServiceChargeCost\";\nimport TotalCost from \"./TotalCost\";\nimport CostingVersion from \"././CostingVersion\";\n\ninterface IProps {\n user: User;\n styles: ReactPDF.Styles;\n cost: TOrderCostV2 | TOrderCostV3 | TOrderCostV4 | TOrderCostV5;\n currentCostingVersion?: Nullable;\n orderCategory: OrderCategory;\n orderStatus: OrderStatus;\n annualTotalCostFootnoteRef?: string;\n}\n\nexport interface OrderCostSummaryV2PdfProps extends IProps {\n}\n\nconst OrderCostSummaryPdfV2 = (props: IProps) => {\n const { cost, orderCategory } = props;\n const { total_cost } = cost.data;\n\n if (!total_cost) {\n return null;\n }\n\n return (\n \n\n {\n (orderCategory === OrderCategory.REALTIME || orderCategory === OrderCategory.EU_CUTOUT) &&\n \n }\n\n {\n orderCategory !== OrderCategory.ARCHIVE &&\n \n }\n\n \n\n \n\n \n \n )\n}\n\nexport default OrderCostSummaryPdfV2;\n","import OrderCostSummaryPdfV2 from \"../OrderCostSummaryPdfV2\";\n\nconst OrderCostSummaryPdfV3 = OrderCostSummaryPdfV2;\n\nexport default OrderCostSummaryPdfV3;\n","import OrderCostSummaryPdfV3 from \"../OrderCostSummaryPdfV3\";\n\nconst OrderCostSummaryPdfV4 = OrderCostSummaryPdfV3;\n\nexport default OrderCostSummaryPdfV4;\n","import OrderCostSummaryPdfV4 from \"../OrderCostSummaryPdfV4\";\n\nconst OrderCostSummaryPdfV5 = OrderCostSummaryPdfV4;\n\nexport default OrderCostSummaryPdfV5;\n","import React, { Fragment } from \"react\";\nimport { Nullable } from \"../../../../types/utils\";\nimport { OrderCostingVersion, TApiOrderDetails } from \"../../../api/endpoints/Order\";\nimport OrderCostSummaryPdfV1 from \"./OrderCostSummaryPdfV1\";\nimport OrderCostSummaryPdfV2 from \"./OrderCostSummaryPdfV2\";\nimport ReactPDF from \"@react-pdf/renderer\";\nimport { User } from \"../../../entities/User\";\nimport OrderCostSummaryPdfV3 from \"./OrderCostSummaryPdfV3\";\nimport OrderCostSummaryPdfV4 from \"./OrderCostSummaryPdfV4\";\nimport OrderCostSummaryPdfV5 from \"./OrderCostSummaryPdfV5\";\n\ninterface IProps {\n user: User;\n order: TApiOrderDetails;\n currentCostingVersion: Nullable;\n styles: ReactPDF.Styles;\n annualTotalCostFootnoteRef?: string;\n}\n\nconst OrderCostSummaryPdf = (props: IProps) => {\n const {\n user,\n order,\n currentCostingVersion,\n styles,\n annualTotalCostFootnoteRef\n } = props;\n const { version } = order.cost;\n\n return (\n \n {\n version === 'v1' &&\n \n }\n\n {\n version === 'v2' &&\n \n }\n\n {\n version === 'v3' &&\n \n }\n\n {\n version === 'v4' &&\n \n }\n\n {\n version === 'v5' &&\n \n }\n \n )\n}\n\nexport default OrderCostSummaryPdf;\n","import { Document, Page, Text, View } from \"@react-pdf/renderer\";\nimport * as React from \"react\";\nimport { Nullable } from \"../../../../types/utils\";\nimport { OrderCategory, OrderCostingVersion, TApiOrderDetails } from \"../../../api/endpoints/Order\";\nimport RealtimeOrderPdfDetails from \"./RealtimeOrderPdfDetails\";\nimport {\n AdditionalChargesFootnote,\n EPUDefinitionFootnote, EPUOldLicenseNotice,\n LimitCapacityFootnote,\n ResearchAndSmallBusinessFootnote\n} from '../../Footnotes';\nimport { OrderPdfProps } from \"../types\";\nimport OrderDetailsPdf from \"../OrderDetailsPdf\";\nimport { TOrderProduct } from \"../../../api/endpoints/OrderProduct\";\nimport OrderCostSummaryPdf from \"../OrderCostSummaryPdf\";\n\ninterface IProps extends OrderPdfProps {\n order: TApiOrderDetails;\n products: Array>;\n}\n\nconst RealtimeOrderPDF = (props: IProps) => {\n const {\n user,\n order,\n currentCostingVersion,\n products,\n sets,\n availableParams,\n styles\n } = props;\n\n return (\n \n \n \n\n \n \n \n\n \n\n \n \n \n \n *\n \n \n\n \n \n \n \n\n \n \n \n\n \n \n \n\n \n \n \n \n \n \n \n \n );\n}\n\nexport default RealtimeOrderPDF;\n","import sanitize from \"sanitize-html\";\nimport { useSelector } from \"react-redux\";\nimport { selectArchiveTerms } from \"../../../../store/selectors/DataSelectors\";\nimport { Text } from \"@react-pdf/renderer\";\nimport * as React from \"react\";\nimport { Fragment } from \"react\";\n\nconst pdfOptions: sanitize.IOptions = {\n allowedTags: [\"head\", \"br\"], // allow break so it will always sanitize to
\n allowedAttributes: {},\n selfClosing: [\"br\"],\n exclusiveFilter: f => f.tag === \"head\"\n};\n\nconst ArchiveOrderPdfDetails = () => {\n const terms = useSelector(selectArchiveTerms);\n\n return (\n \n {\n sanitize(terms, pdfOptions).split(\"
\").map((line, i) =>\n {line}\n )\n }\n
\n );\n}\n\nexport default ArchiveOrderPdfDetails;\n","import { Document, Page, Text, View } from \"@react-pdf/renderer\";\nimport * as React from \"react\";\nimport ArchiveOrderPdfDetails from \"./ArchiveOrderPdfDetails\";\nimport { OrderPdfProps } from \"../types\";\nimport OrderDetailsPdf from \"../OrderDetailsPdf\";\nimport OrderCostSummaryPdf from \"../OrderCostSummaryPdf\";\nimport { ResearchAndSmallBusinessFootnote } from \"../../Footnotes\";\n\n/**\n * Shows a pdf summary of a single order.\n */\nconst ArchiveOrderPDF = (props: OrderPdfProps) => {\n const { user, order, currentCostingVersion, styles } = props;\n\n return (\n \n \n \n\n \n \n \n\n \n\n \n \n \n \n *\n \n \n\n \n \n \n \n \n \n \n \n \n );\n}\n\nexport default ArchiveOrderPDF;\n","import * as React from \"react\";\nimport { StyleSheet, Text, View } from \"@react-pdf/renderer\";\n\nexport const styles = StyleSheet.create({\n paragraph: {\n marginBottom: '7.5mm'\n }\n})\n\nconst WebOrderPdfDetails = () => {\n return (\n \n \n This licence provides access to ecCharts, which is ECMWF's interactive interface for visualising ECMWF real-time\n data (note: no raw data is accessible from this interface). Users may request a one-month trial of ecCharts to\n evaluate its functionality. Trials are granted at Licensor discretion.\n \n \n Please note that access to all web products is provided on an ‘as is’ basis. The product range is adjusted in\n the light of experience and in response to the evolution of the forecasting system; newly developed products are\n added, but others may be discontinued, at the discretion of ECMWF.\n \n \n )\n}\n\nexport default WebOrderPdfDetails;\n","import { Document, Page, View } from \"@react-pdf/renderer\";\nimport * as React from \"react\";\nimport WebOrderPdfDetails from \"./WebOrderPdfDetails\";\nimport { OrderPdfProps } from \"../types\";\nimport OrderDetailsPdf from \"../OrderDetailsPdf\";\nimport OrderCostSummaryPdf from \"../OrderCostSummaryPdf\";\n\nconst WebOrderPDF = (props: OrderPdfProps) => {\n const { user, order, currentCostingVersion, styles } = props;\n\n return (\n \n \n \n\n \n \n \n\n \n \n \n );\n}\n\nexport default WebOrderPDF;\n","import { StyleSheet, Text, View } from \"@react-pdf/renderer\";\nimport { OrderCategory, TApiOrderDetails } from \"../../../../api/endpoints/Order\";\nimport { Fragment } from \"react\";\nimport { productDailyFields, productDailyVolume, productTotalEpu } from \"../../../../utils/Cost\";\nimport * as React from \"react\";\n\nconst grey = \"#f0f0f0\";\nconst paddingSm = \"3mm\";\nconst styles = StyleSheet.create({\n productSummary: {\n backgroundColor: grey,\n display: 'flex',\n flexDirection: 'row',\n textAlign: 'right',\n alignItems: 'center'\n },\n productSummaryColumn: {\n padding: paddingSm\n }\n});\n\ninterface IProps {\n order: TApiOrderDetails;\n epuFootnoteRef?: string;\n}\n\nconst ProductCostSummary = (props: IProps) => {\n const { order, epuFootnoteRef } = props;\n const productCost = order.cost.data.per_product?.[0];\n\n if (!productCost) {\n return null;\n }\n\n return (\n \n \n \n Total daily volume\n \n \n \n {productDailyVolume(productCost)}\n \n \n \n\n \n \n Total daily fields\n \n \n \n {productDailyFields(productCost)}\n \n \n \n\n \n \n \n Total EPUs\n {epuFootnoteRef}\n \n \n\n \n \n {productTotalEpu(productCost)}\n \n \n \n \n );\n}\n\nexport default ProductCostSummary;\n","import { TApiSet } from \"../../api/endpoints/Set\";\nimport { Nullable } from \"../../../types/utils\";\nimport { TApiSubset } from \"../../api/endpoints/Subset\";\nimport { SelectionState, TParameterSelection } from \"../../components/EuCutOutConfigurator\";\nimport { OrderCategory, TApiOrderDetails } from \"../../api/endpoints/Order\";\nimport { TApiParameter } from \"../../api/endpoints/Parameter\";\nimport { TOrderProduct } from \"../../api/endpoints/OrderProduct\";\n\nconst parameterSelectionKey = (selection: TParameterSelection): string => {\n return [selection.parameter.shortname, selection.subset.id].join('::');\n}\n\nconst deriveSetAndSubsetFromSetsCollection = (sets: Array, subsetId: number): Nullable<{ set: TApiSet, subset: TApiSubset }> => {\n let result: Nullable<{ set: TApiSet, subset: TApiSubset }> = null;\n\n sets.forEach(set => {\n const subset = set.subsets.find(subset => subset.id === subsetId);\n\n if (subset) {\n result = {\n set,\n subset\n }\n }\n });\n\n return result;\n}\n\nconst deriveParameterSelection = (\n product: Nullable>,\n sets: Array,\n params: Record\n) => {\n\n if (!product) {\n return {};\n }\n\n const selection = product.data.param.reduce((acc, product) => {\n const { value: shortname, subset_id } = product;\n const indexKey = [shortname, subset_id].join('::');\n\n acc[indexKey] = {\n parameter: params[shortname],\n ...deriveSetAndSubsetFromSetsCollection(sets, subset_id)!\n };\n\n return acc;\n }, {} as SelectionState);\n\n return selection;\n}\n\nconst EuCutOutProductHelpers = {\n deriveParameterSelection,\n parameterSelectionKey\n}\n\nexport default EuCutOutProductHelpers;\n","const SUBSET_TYPE_TO_NAME_MAP: Record = {\n fc: 'Forecast',\n an: 'Analysis',\n wp: 'Weather parameters',\n tf: 'Trajectory forecast',\n ssd: 'Simulated satellite data',\n pf: 'Forecast',\n cm: 'Cluster means',\n ep: 'Event probabilities',\n efi: 'Extreme forecast index',\n sot: 'Shift of tails',\n em: 'Ensemble means',\n es: 'Ensemble standard deviations',\n fcmean: 'Forecast mean'\n}\n\nconst humanize = (type: string): string => {\n return SUBSET_TYPE_TO_NAME_MAP[type] ?? 'Other';\n};\n\nconst SubsetTypes = {\n humanize\n}\n\nexport default SubsetTypes;\n","import { StyleSheet, Text, View } from \"@react-pdf/renderer\";\nimport { OrderCategory, TApiOrderDetails } from \"../../../../api/endpoints/Order\";\nimport { OrderPdfProps } from \"../../types\";\nimport EuCutOutProductHelpers from \"../../../../utils/EuCutOutProductHelpers\";\nimport React from \"react\";\nimport { map } from \"lodash\";\nimport { TParameterSelection } from \"../../../EuCutOutConfigurator\";\nimport SubsetTypes from \"../../../../utils/SubsetTypes\";\nimport { formatSubsetLabel } from \"../../../../utils/Format\";\nimport { TOrderProduct } from \"../../../../api/endpoints/OrderProduct\";\n\ninterface IProps extends OrderPdfProps {\n product: TOrderProduct;\n}\n\nconst styles = StyleSheet.create({\n root: {\n marginBottom: '15mm'\n },\n tableContainer: {\n flexDirection: \"row\",\n flexWrap: \"wrap\",\n marginBottom: '10mm',\n width: '100%'\n },\n tableTitle: {\n marginBottom: '3mm',\n paddingVertical: '1.5mm',\n fontFamily: 'Helvetica-Bold'\n },\n tableHead: {\n borderBottom: '1pt solid #f0f0f0',\n marginBottom: '3mm',\n paddingVertical: '1.5mm',\n },\n row: {\n flexDirection: \"row\",\n alignItems: \"center\",\n marginBottom: '3mm',\n fontSize: \"8pt\"\n },\n shortname: {\n width: '25%',\n paddingRight: '3mm'\n },\n subset: {\n width: '50%',\n lineHeight: '30px',\n paddingHorizontal: '3mm'\n },\n subsetType: {\n width: '25%',\n paddingLeft: '3mm'\n },\n highFrequencyWrapper: {\n display: 'flex',\n flexDirection: 'row'\n },\n highFrequencyLabel: {\n fontFamily: 'Helvetica-Bold',\n marginRight: '3mm'\n }\n});\n\ninterface TableRowProps {\n item: TParameterSelection\n}\n\nconst TableRow = (props: TableRowProps) => {\n const { item } = props;\n\n return (\n \n {item.parameter.name} ({item.parameter.shortname})\n {formatSubsetLabel(item.subset)}\n {SubsetTypes.humanize(item.subset.type)}\n \n )\n};\n\n\nconst ProductDetails = (props: IProps) => {\n const { product, sets, availableParams } = props;\n\n const selection = EuCutOutProductHelpers.deriveParameterSelection(product, sets, availableParams);\n\n return (\n \n \n Parameters:\n \n\n \n \n Parameter\n Subset name\n Subset type\n \n {\n map(selection, item => )\n }\n \n\n \n High frequency products:\n { product.data.high_frequency ? 'Yes' : 'No' }\n \n \n );\n}\n\nexport default ProductDetails;\n","import { Document, Page, Text, View } from \"@react-pdf/renderer\";\nimport * as React from \"react\";\nimport { OrderPdfProps } from \"../types\";\nimport { OrderCategory, TApiOrderDetails } from \"../../../api/endpoints/Order\";\nimport OrderDetailsPdf from \"../OrderDetailsPdf\";\nimport {\n AdditionalChargesFootnote,\n EPUDefinitionFootnote,\n LimitCapacityFootnote,\n ResearchAndSmallBusinessFootnote\n} from \"../../Footnotes\";\nimport ProductCostSummary from \"./ProductCostSummary\";\nimport ProductDetails from \"./ProductDetails\";\nimport { TOrderProduct } from \"../../../api/endpoints/OrderProduct\";\nimport OrderCostSummaryPdf from \"../OrderCostSummaryPdf\";\n\ninterface IProps extends OrderPdfProps {\n order: TApiOrderDetails;\n product?: TOrderProduct;\n}\n\nconst EuCutoutOrderPDF = (props: IProps) => {\n const { user, order, currentCostingVersion, styles, product } = props;\n\n return (\n \n \n \n\n {\n product &&\n \n }\n\n {\n order.cost.version === 'v1' &&\n \n }\n\n \n\n \n \n \n \n *\n \n \n\n \n \n \n \n\n \n \n \n\n \n \n \n \n \n \n \n \n )\n}\n\nexport default EuCutoutOrderPDF;\n","import { StyleSheet } from \"@react-pdf/renderer\";\nimport * as React from \"react\";\nimport { useSelector } from \"react-redux\";\nimport { Nullable } from \"../../../types/utils\";\nimport { OrderCategory, OrderCostingVersion, TApiOrderDetails } from \"../../api/endpoints/Order\";\nimport { selectUser } from \"../../store/selectors/UserSelectors\";\nimport { TApiSet } from \"../../api/endpoints/Set\";\nimport { selectParameters } from \"../../store/selectors/new/parameters\";\nimport { TApiProvider } from \"../../api/endpoints/Provider\";\nimport RealtimeOrderPDF from \"./RealtimeOrderPDF\";\nimport ArchiveOrderPDF from \"./ArchiveOrderPDF\";\nimport WebOrderPDF from \"./WebOrderPDF\";\nimport EuCutoutOrderPDF from \"./EuCutoutOrderPDF\";\nimport { TOrderProduct } from \"../../api/endpoints/OrderProduct\";\nimport { TApiServicePackage } from \"../../api/endpoints/ServicePackage\";\nimport { TApiVolumeBand } from \"../../api/endpoints/VolumeBand\";\n\ninterface IProps {\n order: TApiOrderDetails;\n currentCostingVersion: Nullable;\n sets: Array;\n provider?: TApiProvider;\n dataDeliverer?: TApiProvider;\n servicePackage?: TApiServicePackage;\n volumeBand?: TApiVolumeBand;\n products?: Array;\n}\n\nconst pending = \"#ff7c00\";\nconst accepted = \"green\";\nconst cancelled = \"red\";\n\nconst paddingXs = \"2mm\";\nconst paddingSm = \"3mm\";\nconst paddingMd = \"5mm\";\nconst paddingLg = \"15mm\";\n\nconst mainFontSize = \"10pt\";\nconst fontRegular = \"Helvetica\";\nconst fontBold = \"Helvetica-Bold\";\nconst fontItalic = \"Helvetica-Oblique\";\n\nconst lightFontColor = '#a7a7a7';\nconst grey = \"#f0f0f0\";\n\nexport const styles = StyleSheet.create({\n title: {\n fontFamily: fontBold,\n fontSize: \"18pt\",\n marginBottom: paddingSm\n },\n pageStyles: {\n fontFamily: fontRegular,\n fontSize: mainFontSize,\n padding: paddingLg\n },\n heading: {\n marginBottom: '10mm'\n },\n section: {\n marginTop: paddingLg\n },\n flexRow: {\n flexDirection: \"row\"\n },\n flexStretch: {\n justifyContent: \"space-between\"\n },\n alignCenter: {\n alignItems: \"center\"\n },\n alignTop: {\n alignItems: \"flex-start\"\n },\n flexCenter: {\n justifyContent: \"center\"\n },\n paddingBottomNormal: {\n paddingBottom: \"8mm\"\n },\n provider: {\n paddingRight: paddingMd,\n width: \"50%\"\n },\n statusNote: {\n width: \"50%\"\n },\n mainLogo: {\n width: \"40mm\"\n },\n footer: {\n flexDirection: \"row\",\n justifyContent: \"flex-end\"\n },\n footerTitles: {\n fontFamily: fontItalic,\n textAlign: \"right\",\n padding: paddingSm,\n width: \"70%\"\n },\n footerCosts: {\n width: \"30%\",\n textAlign: \"right\",\n padding: paddingSm\n },\n footerHighlight: {\n backgroundColor: grey,\n flexDirection: \"row\",\n justifyContent: \"flex-end\"\n },\n reference: {\n backgroundColor: grey,\n paddingTop: paddingSm,\n paddingBottom: paddingXs,\n paddingHorizontal: paddingMd\n },\n bold: {\n fontFamily: fontBold\n },\n sentence: {\n flexDirection: \"row\",\n alignItems: \"center\"\n },\n listItem: {\n marginBottom: paddingSm\n },\n pending: {\n borderColor: pending,\n color: pending\n },\n accepted: {\n borderColor: accepted,\n color: accepted\n },\n cancelled: {\n borderColor: cancelled,\n color: cancelled\n },\n status: {\n fontSize: '16pt',\n textTransform: 'uppercase'\n },\n noMargin: {\n marginVertical: 0,\n paddingVertical: 0\n },\n disclaimers: {\n paddingTop: paddingMd,\n paddingBottom: paddingMd,\n fontSize: \"10pt\"\n },\n disclaimer: {\n marginBottom: paddingMd\n },\n disclaimerContent: {\n paddingLeft: paddingXs\n },\n supText: {\n position: \"relative\",\n top: \"-4pt\",\n fontSize: \"8pt\",\n marginRight: \"2pt\"\n },\n ecQuoteText: {\n fontFamily: fontItalic,\n fontSize: \"8pt\",\n textAlign: \"left\",\n padding: paddingSm,\n paddingTop: paddingXs,\n width: '100%',\n color: lightFontColor\n }\n});\n\n/**\n * Shows a pdf summary of a single order.\n */\nconst OrderPDF = (props: IProps) => {\n const { order, currentCostingVersion, sets, provider, dataDeliverer, servicePackage, volumeBand, products } = props;\n const user = useSelector(selectUser);\n const availableParams = useSelector(selectParameters);\n\n const commonProps = {\n user,\n currentCostingVersion,\n sets,\n provider,\n dataDeliverer,\n servicePackage,\n volumeBand,\n availableParams,\n styles\n }\n\n if (order.category === OrderCategory.REALTIME) {\n return }\n products={products as Array>}\n {...commonProps}\n />;\n } else if (order.category === OrderCategory.ARCHIVE) {\n return } {...commonProps} />;\n } else if (order.category === OrderCategory.WEB) {\n return } {...commonProps} />;\n } else if (order.category === OrderCategory.EU_CUTOUT) {\n return }\n product={products?.[0] as TOrderProduct}\n {...commonProps}\n />;\n } else {\n return null;\n }\n}\n\nexport default OrderPDF;\n","import { BlobProvider } from \"@react-pdf/renderer\";\nimport * as React from \"react\";\nimport { Provider } from \"react-redux\";\nimport { store } from \"../../index\";\n\ntype DocProps = {\n loading: boolean;\n url: string;\n name: string;\n setDownloaded: () => void;\n};\n\n/**\n * Control for downloading a pdf from html\n */\nclass Document extends React.Component {\n public componentDidUpdate(prevProps: DocProps) {\n if (!this.props.loading && prevProps.loading) {\n const link = document.createElement(\"a\");\n link.download = this.props.name;\n link.href = this.props.url;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n this.props.setDownloaded();\n }\n }\n public render() {\n return
;\n }\n}\n\ntype Props = {\n loadPdf: boolean\n setLoadPdf: (value: boolean) => void\n name: string\n children: React.ReactNode\n};\n\nexport default (props => <>\n {props.loadPdf && (\n // This renders the PDF blob provider which kicks off the download once the PDF is ready.\n // We conditionally render like this for performance.\n \n {props.children}\n \n }\n >\n {blobProps => (\n props.setLoadPdf(false)}\n />\n )}\n \n )}\n) as React.FC;\n","import * as React from \"react\";\nimport { Nullable } from \"../../../types/utils\";\nimport ButtonInverted from \"../Buttons/ButtonInverted\";\nimport OrderPDF from \"../OrderPDF\";\nimport PdfProvider from \"../PdfProvider\";\nimport { OrderCostingVersion, TApiOrderDetails } from \"../../api/endpoints/Order\";\nimport { TApiSet } from \"../../api/endpoints/Set\";\nimport { TApiProvider } from \"../../api/endpoints/Provider\";\nimport { TOrderProduct } from \"../../api/endpoints/OrderProduct\";\nimport { TApiServicePackage } from \"../../api/endpoints/ServicePackage\";\nimport { TApiVolumeBand } from \"../../api/endpoints/VolumeBand\";\n\ninterface IProps {\n order: TApiOrderDetails;\n currentCostingVersion: Nullable;\n sets: Array;\n provider?: TApiProvider;\n dataDeliverer?: TApiProvider;\n servicePackage?: TApiServicePackage;\n volumeBand?: TApiVolumeBand;\n orderProducts?: Array;\n disabled?: boolean;\n}\n\n/**\n * A button which downloads a PDF of an order.\n */\nconst OrderPDFButton = (props: IProps) => {\n const {\n order,\n currentCostingVersion,\n sets,\n provider,\n dataDeliverer,\n servicePackage,\n volumeBand,\n orderProducts = [],\n disabled\n } = props;\n const [loadPdf, setLoadPdf] = React.useState(false);\n\n return (\n <>\n \n \n \n setLoadPdf(true)}\n text=\"Download PDF\"\n disabled={disabled}\n />\n \n );\n};\n\nexport default OrderPDFButton;\n","import React from \"react\";\nimport { Form } from \"react-bootstrap\";\n\ninterface IProps {\n message?: string;\n when?: boolean;\n}\n\nconst FormError = (props: IProps) => {\n const { message, when } = props;\n\n if (!when) {\n return null;\n }\n\n return (\n \n {message}\n \n )\n}\n\nexport default FormError;\n","import { Alert } from \"react-bootstrap\";\nimport React, { ReactNode } from \"react\";\n\nconst Footnote = (props: {\n text?: ReactNode | null\n}) => {\n const { text } = props;\n\n if (!text) {\n return null;\n }\n\n return (\n {text}\n )\n}\n\nexport default Footnote;\n","import * as React from \"react\";\nimport { getID } from \"../../../utils/IdGenerator\";\n\nexport type Props = {\n\t/**\n\t * Radio buttons with the same name are treated as belonging to the same group.\n\t * Only one button in a group can be selected at once.\n\t */\n\tname: string;\n\tvalue: string | number;\n\tchecked: boolean;\n\tonChange: (value: string) => void;\n\trequired?: boolean;\n\tdisabled?: boolean;\n\tlabel: string;\n};\n\ntype State = {\n\tid: string;\n};\n\n/**\n * A radio button.\n */\nexport class Radio extends React.PureComponent {\n\tconstructor(props: Props) {\n\t\tsuper(props);\n\t\tthis.state = {\n\t\t\tid: getID()\n\t\t};\n\t}\n\n\tpublic render() {\n\t\treturn (\n\t\t\t
\n\t\t\t\t this.props.onChange(e.target.value)}\n\t\t\t\t\trequired={this.props.required}\n\t\t\t\t\tdisabled={this.props.disabled}\n\t\t\t\t/>\n\t\t\t\t\n\t\t\t
\n\t\t);\n\t}\n}\n","import * as React from \"react\";\nimport Select from \"react-select\";\nimport { Styles } from \"react-select/lib/styles\";\nimport { MenuPlacement, ValueType } from \"react-select/lib/types\";\nimport { getID } from \"../../../utils/IdGenerator\";\nimport { noop } from \"lodash\";\n\nexport type SelectOption = {\n\tvalue: string;\n\tlabel: string;\n};\n\ntype SelectProps = {\n\t/**\n\t * The visible title of the dropdown.\n\t */\n\tlabel?: string;\n\n\t/**\n\t * Function mapping each item to its display name.\n\t */\n\titemToOption: (item: T) => S;\n\n\t/**\n\t * All the items.\n\t */\n\titems: T[];\n\tisSearchable?: boolean;\n\tname: string;\n\tlabelClasses?: string;\n\tmenuPlacement?: MenuPlacement;\n\tariaLabel?: string;\n\trequired?: boolean;\n\tdisabled?: boolean;\n\tonBlur?: () => void;\n\tformatOptionLabel?: (option: S) => React.ReactNode;\n\tplaceholder?: string;\n\tisClearable?: boolean;\n};\n\ntype SelectState = {\n\tid: string;\n};\n\ntype SingleProps = SelectProps & {\n\tonChange: (item: T | undefined) => void;\n\tselectedItem?: T;\n};\n\n/**\n * A dropdown control for selecting one item from a generic collection.\n */\nexport class SelectSingleInput extends React.PureComponent<\n\tSingleProps,\n\tSelectState\n> {\n\tprivate select!: Select;\n\n\tprivate readonly colourStyles: Partial = {\n\t\tcontrol: styles => ({ ...styles, backgroundColor: \"white\", borderColor: \"#d6d6d6\" }),\n\t\tdropdownIndicator: styles => ({ ...styles, color: \"black\" }),\n\t\tindicatorSeparator: styles => ({ ...styles, backgroundColor: \"transparent\" })\n\t};\n\tconstructor(props: SingleProps) {\n\t\tsuper(props);\n\t\tthis.state = {\n\t\t\tid: getID()\n\t\t};\n\t}\n\n\tpublic focus = () => this.select.focus();\n\n\tpublic render() {\n\t\treturn (\n\t\t\t
\n\t\t\t\t\n\t\t\t\t{this.props.label && (\n\t\t\t\t\t\n\t\t\t\t)}\n\t\t\t\t) => {\n\t\t\t\t\t\tthis.select = ref;\n\t\t\t\t\t}}\n\t\t\t\t\tformatOptionLabel={this.props.formatOptionLabel}\n\t\t\t\t/>\n\t\t\t\t{this.props.required && !this.props.selectedItem && (\n\t\t\t\t\t
\n\t\t\t\t\t\t\n\t\t\t\t\t
\n\t\t\t\t)}\n\t\t\t
\n\t\t);\n\t}\n\n\tprivate readonly onChange = (selected?: ValueType) => {\n\t\tif (selected === null || selected === undefined) {\n\t\t\tthis.props.onChange(undefined);\n\t\t\treturn;\n\t\t}\n\n\t\tconst item = this.props.items.find(\n\t\t\ti => this.props.itemToOption(i).value === (selected as S).value\n\t\t);\n\t\tif (!item) {\n\t\t\tthrow new Error(\"Unknown option selected\");\n\t\t}\n\t\tthis.props.onChange(item);\n\t};\n}\n\ntype MultiProps = SelectProps & {\n\tonChange: (items: T[]) => void;\n\tselectedItems: T[];\n};\n\n/**\n * A dropdown control for selecting multiple items from a collection.\n */\nexport class SelectMultiInput extends React.PureComponent<\n\tMultiProps,\n\tSelectState\n> {\n\tpublic static getDerivedStateFromProps(\n\t\t_nextProps: MultiProps,\n\t\toldState: SelectState\n\t): SelectState {\n\t\treturn {\n\t\t\t...oldState\n\t\t};\n\t}\n\n\tprivate readonly select: React.RefObject>;\n\n\tprivate readonly colourStyles: Partial = {\n\t\tcontrol: styles => ({ ...styles, backgroundColor: \"white\", borderColor: \"#d6d6d6\" }),\n\t\tdropdownIndicator: styles => ({ ...styles, color: \"black\" }),\n\t\tindicatorSeparator: styles => ({ ...styles, backgroundColor: \"transparent\" })\n\t};\n\n\tconstructor(props: MultiProps) {\n\t\tsuper(props);\n\t\tthis.select = React.createRef();\n\t\tthis.state = {\n\t\t\tid: getID()\n\t\t};\n\t}\n\n\tpublic focus = () => this.select.current!.focus();\n\n\tpublic render() {\n\t\tconst selectedOptions = this.props.selectedItems.map(this.props.itemToOption);\n\n\t\treturn (\n\t\t\t
\n\t\t\t\t o.value) : undefined}\n\t\t\t\t\tid={this.state.id}\n\t\t\t\t\tonFocus={() => this.select.current!.focus()}\n\t\t\t\t\ttabIndex={2}\n\t\t\t\t\tstyle={{ opacity: 0, height: \"0px\" }}\n\t\t\t\t/>\n\t\t\t\t{this.props.label && (\n\t\t\t\t\t\n\t\t\t\t)}\n\t\t\t\t\n\t\t\t\t{this.props.required &&\n\t\t\t\t\t(!this.props.selectedItems || this.props.selectedItems.length === 0) && (\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
\n\t\t\t\t\t)}\n\t\t\t
\n\t\t);\n\t}\n\n\tprivate readonly onChange = (selected?: ValueType) => {\n\t\tif (!selected) {\n\t\t\tthis.props.onChange([]);\n\t\t\treturn;\n\t\t}\n\n\t\tif (Array.isArray(selected)) {\n\t\t\tconst items = this.props.items.filter(i => {\n\t\t\t\tconst value = this.props.itemToOption(i).value;\n\t\t\t\treturn selected.some(s => s.value === value);\n\t\t\t});\n\t\t\tthis.props.onChange(items);\n\t\t\treturn;\n\t\t}\n\n\t\tconst items = this.props.items.filter(i => {\n\t\t\tconst value = this.props.itemToOption(i).value;\n\t\t\treturn (selected as SelectOption).value === value;\n\t\t});\n\t\tthis.props.onChange(items);\n\t};\n}\n","import { FormikValues } from \"formik/dist/types\";\nimport React, { Fragment } from \"react\";\nimport { Form } from \"react-bootstrap\";\nimport { OrderCategory, TApiOrderDetails } from \"../../../api/endpoints/Order\";\nimport { TApiProvider } from \"../../../api/endpoints/Provider\";\nimport { Radio } from \"../../Inputs/Radio\";\nimport { SelectSingleInput } from \"../../Inputs/SelectInput\";\nimport Footnote from \"../../RealtimeProductConfigurator/Footnote\";\nimport FormError from \"../../RealtimeProductConfigurator/FormError\";\n\ninterface Props {\n formik: FormikValues;\n order: TApiOrderDetails;\n providers: Array;\n ecmwfProvider?: TApiProvider;\n selectedProvider?: TApiProvider;\n onDataDelivererChange: (value: string | string[]) => void;\n onProviderSelect: (value: TApiProvider['id'] | undefined) => void;\n}\n\nconst LicensorStep = (props: Props) => {\n const {\n formik,\n order,\n providers,\n ecmwfProvider,\n selectedProvider,\n onDataDelivererChange,\n onProviderSelect\n } = props;\n\n return (\n \n \n Select your prospective Licensor\n\n ({\n value: provider.id.toString(),\n label: provider.name\n })}\n onChange={value => {\n onProviderSelect(value?.id);\n }}\n selectedItem={selectedProvider}\n name=\"provider-select\"\n />\n \n \n\n \n

\n Note that your name, email and data order will be shared with the chosen Licensor.\n

\n

\n The response time of each Member State may vary.\n

\n
\n }\n />\n\n {\n (order.category === OrderCategory.REALTIME || order.category === OrderCategory.EU_CUTOUT) &&\n \n \n Select your data deliverer\n\n {\n selectedProvider && selectedProvider.is_data_deliverer &&\n \n }\n\n {\n ecmwfProvider && ecmwfProvider.id !== selectedProvider?.id &&\n \n }\n\n \n \n\n \n Please note that depending on your licensor, you may not have options for your data\n deliverer.\n
\n In that case, the box above shows your default data deliverer.\n\n
\n }\n />\n \n }\n \n );\n}\n\nexport default LicensorStep;\n","import { FormikValues } from \"formik/dist/types\";\nimport { find } from \"lodash\";\nimport React, { Fragment } from \"react\";\nimport { Form } from \"react-bootstrap\";\nimport { TApiCountry } from \"../../../api/endpoints/Country\";\nimport { OrderCategory, TApiOrderDetails } from \"../../../api/endpoints/Order\";\nimport { SelectSingleInput } from \"../../Inputs/SelectInput\";\nimport ExternalLink from \"../../Navigation/Links/ExternalLink\";\nimport Footnote from \"../../RealtimeProductConfigurator/Footnote\";\nimport FormError from \"../../RealtimeProductConfigurator/FormError\";\n\ninterface Props {\n countries: Array;\n order: TApiOrderDetails;\n formik: FormikValues\n}\n\nconst LocationStep = (props: Props) => {\n const { countries, formik, order } = props;\n\n return (\n \n \n Where is your organisation based?\n ({\n value: country.code,\n label: country.title\n })}\n onChange={value => {\n formik.setFieldValue('country', value?.code);\n }}\n selectedItem={find(countries, (c) => c.code === formik.values.country)}\n name=\"country-select\"\n />\n \n \n\n
\n {\n (order.category === OrderCategory.REALTIME || order.category === OrderCategory.WEB) &&\n \n

\n Select the location (country) of the organisation that will be signing the ECMWF\n Standard Licence Agreement.\n

\n \n }\n />\n }\n\n {\n order.category === OrderCategory.ARCHIVE &&\n \n

\n Please note that national meteorological services of\n  \n \n ECMWF Member and Co-operating States\n \n  \n and their authorised users (such as research institutes and universities) can be\n granted\n full access to ECMWF Archive Products via their\n  \n \n computing representative\n .\n

\n

\n All other users (commercial organisations and service providers) need an archive\n licence\n to gain access to the Catalogue of ECMWF Archive Products via the ECMWF web API\n service.\n

\n \n }\n />\n }\n
\n
\n )\n}\n\nexport default LocationStep;\n","import React, { ComponentType, Fragment } from \"react\";\nimport Row from \"../../../../../components/Common/Row\";\nimport Col from \"../../../../../components/Common/Col\";\nimport { formatCurrency } from \"../../../../../utils/Format\";\nimport {\n hfInformationCost,\n informationCost,\n informationCostDiscount,\n standardInformationCost\n} from \"../../../../../utils/Cost\";\nimport { OrderCostSummaryV2Props } from \"../index\";\nimport OrderPolicy from \"../../../../../policies/OrderPolicy\";\nimport { selectUser } from \"../../../../../store/selectors/UserSelectors\";\nimport { useSelector } from \"react-redux\";\n\ninterface Props extends OrderCostSummaryV2Props {\n component?: ComponentType<{ label: string, value: string }>;\n}\n\nconst Item = (props: { label: string, value: string }) => {\n const { label, value } = props;\n return (\n \n \n {label}\n \n \n {value}\n \n \n )\n}\n\nconst InformationCostVariant = (props: Props) => {\n const { cost, orderCategory, component } = props;\n const user = useSelector(selectUser);\n\n const Component = component ? component : Item;\n\n if (!OrderPolicy.canViewInformationCostBreakdown(user, orderCategory)) {\n return ;\n }\n\n return (\n \n \n \n \n )\n}\n\nconst InformationCost = (props: Props) => {\n const { cost, component } = props;\n const { total_cost } = cost.data;\n\n if (!total_cost) {\n return null;\n }\n\n const isDiscounted = total_cost.information_cost !== total_cost.information_cost_after_discount;\n const Component = component ? component : Item;\n\n return (\n \n \n\n {\n isDiscounted &&\n \n }\n \n )\n}\n\nexport default InformationCost;\n","import { OrderCostSummaryV2Props } from \"../index\";\nimport React, { ComponentType, Fragment } from \"react\";\nimport Row from \"../../../../../components/Common/Row\";\nimport Col from \"../../../../../components/Common/Col\";\nimport { formatCurrency } from \"../../../../../utils/Format\";\nimport { serviceChargeCost, serviceChargeCostDiscount } from \"../../../../../utils/Cost\";\nimport { OrderCategory, OrderStatus, TOrderCostV2 } from \"../../../../../api/endpoints/Order\";\n\nconst labelMapping = {\n [OrderCategory.REALTIME]: 'Service Charge (Volume and Service Package)',\n [OrderCategory.EU_CUTOUT]: 'Service Charge (Volume and Service Package)',\n [OrderCategory.ARCHIVE]: 'Annual ECMWF handling charge',\n [OrderCategory.WEB]: 'Annual ECMWF handling charge',\n}\n\ninterface Props extends OrderCostSummaryV2Props {\n component?: ComponentType<{ label: string, value: string }>;\n preview?: boolean;\n}\n\nconst Item = (props: { label: string, value: string }) => {\n const { label, value } = props;\n return (\n \n \n {label}\n \n \n {value}\n \n \n )\n}\n\nconst ServiceChargeCost = (props: Props) => {\n const { cost, orderCategory, orderStatus, component, preview } = props;\n const { total_cost } = cost.data;\n\n if (!preview && (orderCategory === OrderCategory.REALTIME || orderCategory === OrderCategory.EU_CUTOUT) && orderStatus === OrderStatus.DRAFT) {\n return null;\n }\n\n if (!total_cost) {\n return null;\n }\n\n const isDiscounted = total_cost.service_charge !== total_cost.service_charge_after_discount;\n const Component = component ? component : Item;\n\n return (\n \n \n\n {\n isDiscounted &&\n \n }\n \n )\n}\n\nexport default ServiceChargeCost;\n","import { formatBinaryCapacityUnit, formatCurrency, formatVolumeBand } from \"../../../../utils/Format\";\nimport { OrderCategory, TApiOrderDetails, TOrderCostV2 } from \"../../../../api/endpoints/Order\";\nimport React, { ReactNode } from \"react\";\nimport { TApiProvider } from \"../../../../api/endpoints/Provider\";\nimport { TApiServicePackage } from \"../../../../api/endpoints/ServicePackage\";\nimport InformationCost from \"../../../../containers/Order/OrderCostSummary/OrderCostSummaryV2/InformationCost\";\nimport { ListGroup } from \"react-bootstrap\";\nimport { TApiServiceCharge } from \"../../../../api/endpoints/ServiceCharge\";\nimport ServiceChargeCost from \"../../../../containers/Order/OrderCostSummary/OrderCostSummaryV2/ServiceChargeCost\";\nimport classNames from \"classnames\";\nimport { TApiVolumeBand } from \"../../../../api/endpoints/VolumeBand\";\nimport { Nullable } from \"../../../../../types/utils\";\n\ninterface Props {\n order: TApiOrderDetails;\n licensor: TApiProvider;\n dataDeliverer?: Nullable;\n serviceCharge?: TApiServiceCharge;\n servicePackage?: TApiServicePackage;\n volumeBand?: TApiVolumeBand;\n}\n\nconst ListItemContent = (props: { label: string, value: ReactNode; highlight?: boolean }) => {\n const { label, value, highlight = false } = props;\n return (\n \n {label}\n {value}\n \n )\n}\n\nconst OrderCostPreview = (props: Props) => {\n const { order, licensor, dataDeliverer, servicePackage, serviceCharge, volumeBand } = props;\n\n const orderCost = { ...(order.cost as TOrderCostV2) };\n if (serviceCharge) {\n orderCost.data.total_cost!.service_charge = serviceCharge.charge_in_eur;\n orderCost.data.total_cost!.service_charge_after_discount = orderCost.data.total_cost!.service_charge;\n }\n\n const orderTotalCost = orderCost.data.total_cost!;\n\n const totalCost = 0.01 * (\n orderTotalCost.information_cost_after_discount + orderTotalCost.service_charge_after_discount\n );\n\n return (\n
\n

Order preview

\n\n \n \n {\n dataDeliverer &&\n \n }\n\n {\n order.category === OrderCategory.REALTIME || order.category === OrderCategory.EU_CUTOUT &&\n \n }\n\n {\n servicePackage &&\n \n }\n\n {\n (order.category === OrderCategory.REALTIME || order.category === OrderCategory.EU_CUTOUT) && volumeBand &&\n \n }\n \n\n

Cost

\n \n \n \n \n \n\n
\n Please check all the details of your order before submitting it.\n
\n
\n )\n}\n\nexport default OrderCostPreview;\n","import { Nullable } from \"../../../../../types/utils\";\nimport { TApiOrderDetails } from \"../../../../api/endpoints/Order\";\nimport { TApiServicePackage } from \"../../../../api/endpoints/ServicePackage\";\nimport { TApiServiceCharge } from \"../../../../api/endpoints/ServiceCharge\";\nimport React, { Fragment, useCallback } from \"react\";\nimport { Button, ListGroup } from \"react-bootstrap\";\nimport classNames from \"classnames\";\nimport { TApiVolumeBand } from \"../../../../api/endpoints/VolumeBand\";\nimport { formatCurrency } from \"../../../../utils/Format\";\nimport ExternalLink from \"../../../Navigation/Links/ExternalLink\";\n\nconst servicePackageFeatures = (servicePackage: TApiServicePackage): Array => {\n try {\n return servicePackage.features;\n } catch (error) {\n return [];\n }\n}\n\nconst ServiceChargePrice = (props: {\n serviceCharge: TApiServiceCharge;\n volumeBand: TApiVolumeBand;\n}) => {\n const { serviceCharge, volumeBand } = props;\n const serviceChargePrice = serviceCharge.charge_in_eur / 100;\n const volumeBandPrice = volumeBand.charge_in_eur / 100;\n const packagePrice = serviceChargePrice - volumeBandPrice;\n\n return (\n
\n
\n {formatCurrency(serviceChargePrice, 0)}\n
\n
\n ({formatCurrency(packagePrice, 0)} + {formatCurrency(volumeBandPrice, 0)} Volume Charge)\n
\n
\n )\n}\n\nconst FEATURE_LIST_PER_VERSION_MAP: Record> = {\n v1: null,\n v2: null,\n v3: 'https://confluence.ecmwf.int/display/DAC/Service+Charges%3A+01+July+2022+-+01+July+2024',\n v4: 'https://confluence.ecmwf.int/display/DAC/Service+Charges%3A+From+01+July+2024',\n v5: null\n}\n\n\nconst ServicePackageItem = (props: {\n order: TApiOrderDetails;\n servicePackage: TApiServicePackage;\n volumeBand: TApiVolumeBand;\n onSelect: (servicePackage: TApiServicePackage) => void;\n selected: boolean;\n serviceCharge?: TApiServiceCharge;\n}) => {\n const {\n order,\n servicePackage,\n serviceCharge,\n volumeBand,\n onSelect,\n selected\n } = props;\n const isAvailable = Boolean(serviceCharge);\n const allServicesLink = FEATURE_LIST_PER_VERSION_MAP[order.cost.version];\n\n const onSelectClick = useCallback(() => {\n onSelect(servicePackage);\n }, [onSelect, servicePackage]);\n\n return (\n \n
\n {servicePackage.title}\n
\n\n
\n {\n serviceCharge ?\n \n : N/A\n }\n
\n\n
\n \n {\n servicePackageFeatures(servicePackage).map(item => {item})\n }\n {\n allServicesLink &&\n \n \n Complete list of available services\n \n \n }\n \n
\n\n
\n \n
\n
\n )\n}\n\nexport default ServicePackageItem;\n","import { find } from \"lodash\";\nimport React from \"react\";\nimport { TApiOrderDetails } from \"../../../api/endpoints/Order\";\nimport { TApiServiceCharge } from \"../../../api/endpoints/ServiceCharge\";\nimport { TApiServicePackage } from \"../../../api/endpoints/ServicePackage\";\nimport { TApiVolumeBand } from \"../../../api/endpoints/VolumeBand\";\nimport ServicePackageItem from \"./ServicePackageItem\";\n\ninterface IProps {\n order: TApiOrderDetails;\n volumeBand: TApiVolumeBand;\n servicePackages: Array;\n serviceCharges: Array;\n onChange: (servicePackage: TApiServicePackage) => void;\n value?: TApiServicePackage;\n}\n\nconst ServicePackagePicker = (props: IProps) => {\n const {\n order,\n servicePackages,\n onChange,\n value,\n volumeBand,\n serviceCharges\n } = props;\n\n return (\n
\n
\n {\n servicePackages.map(servicePackage => {\n const serviceCharge = find(\n serviceCharges,\n sc => sc.volume_band_id === volumeBand.id &&\n sc.service_package_id === servicePackage.id\n );\n\n return (\n \n )\n })\n }\n
\n
\n )\n}\n\nexport default ServicePackagePicker;\n","import { FormikValues } from \"formik/dist/types\";\nimport { find } from \"lodash\";\nimport React from \"react\";\nimport { OrderCostingVersion, TApiOrderDetails } from \"../../../api/endpoints/Order\";\nimport { TApiServiceCharge } from \"../../../api/endpoints/ServiceCharge\";\nimport { TApiServicePackage } from \"../../../api/endpoints/ServicePackage\";\nimport { TApiVolumeBand } from \"../../../api/endpoints/VolumeBand\";\nimport ExternalLink from \"../../Navigation/Links/ExternalLink\";\nimport FormError from \"../../RealtimeProductConfigurator/FormError\";\nimport ServicePackagePicker from \"../ServicePackagePicker\";\n\ninterface Props {\n formik: FormikValues;\n order: TApiOrderDetails;\n volumeBand: TApiVolumeBand;\n serviceCharges: Array;\n servicePackages: Array;\n onServicePackageChange: (servicePackage: TApiServicePackage) => void;\n}\n\nconst SERVICE_CHARGE_DOCS_URL_MAP = {\n v1: null,\n v2: null,\n v3: {\n title: 'July 2022 - July 2024',\n url: 'https://confluence.ecmwf.int/display/DAC/Service+Charges%3A+01+July+2022+-+01+July+2024'\n },\n v4: {\n title: 'July 2024 onwards',\n url: 'https://confluence.ecmwf.int/display/DAC/Service+Charges%3A+From+01+July+2024'\n },\n v5: null\n}\n\nconst ServicePackageStep = (props: Props) => {\n const { formik,\n order,\n volumeBand,\n serviceCharges,\n servicePackages,\n onServicePackageChange\n } = props;\n\n const orderServicePackage = find(servicePackages, sp => sp.id === formik.values.service_package_id);\n const docs = SERVICE_CHARGE_DOCS_URL_MAP[order.cost.version];\n\n return (\n
\n

\n Volume Charge and Service Package\n

\n\n
\n Please note that you can only pick the silver package if you receive more than 3,650 GiB per year.\n Similarly, you can only pick the gold package if you receive more than 18,250 GiB per year.\n
\n\n
\n \n \n
\n\n {\n docs &&\n
\n For more information about the service packages and the services included, please refer to our page\n  \n \n ECMWF service charge model for real-time data: {docs.title}\n .\n
\n }\n
\n )\n}\n\nexport default ServicePackageStep;\n","import React, { ChangeEvent, Fragment, MouseEvent, useCallback, useEffect, useState } from \"react\";\nimport { TApiCountry } from \"../../api/endpoints/Country\";\nimport { TApiProvider } from \"../../api/endpoints/Provider\";\nimport { find, indexOf, isUndefined, pickBy } from \"lodash\";\nimport { useFormik } from \"formik\";\nimport { Badge, Button, Col, Container, Form, Row } from \"react-bootstrap\";\nimport { SelectSingleInput } from \"../Inputs/SelectInput\";\nimport FormError from \"../RealtimeProductConfigurator/FormError\";\nimport { OrderCategory, OrderCostingVersion, TApiOrder, TApiOrderDetails } from \"../../api/endpoints/Order\";\nimport classNames from \"classnames\";\nimport { faCheckCircle } from \"@fortawesome/free-solid-svg-icons\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport * as Api from '../../api';\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { submitOrder } from \"../../store/action-creators/orders\";\nimport ExternalLink from \"../Navigation/Links/ExternalLink\";\nimport Footnote from \"../RealtimeProductConfigurator/Footnote\";\nimport { selectUser } from \"../../store/selectors/UserSelectors\";\nimport { Nullable } from \"../../../types/utils\";\nimport { Radio } from \"../Inputs/Radio\";\nimport { TApiServicePackage } from \"../../api/endpoints/ServicePackage\";\nimport { TApiVolumeBand } from \"../../api/endpoints/VolumeBand\";\nimport LicensorStep from \"./LicensorStep\";\nimport LocationStep from \"./LocationStep\";\nimport ServicePackagePicker from \"./ServicePackagePicker\";\nimport { TApiServiceCharge } from \"../../api/endpoints/ServiceCharge\";\nimport OrderCostPreview from \"./ServicePackagePicker/OrderCostPreview\";\nimport ServicePackageStep from \"./ServicePackageStep\";\n\ninterface BaseProps {\n // order: TApiOrderDetails;\n providers: Array;\n countries: Array;\n orderCostingVersion: OrderCostingVersion;\n onComplete?: () => void;\n}\n\ntype Props = BaseProps & ({\n order: TApiOrderDetails;\n} | {\n order: TApiOrderDetails;\n})\n\ninterface IOrderSubmissionFormValues {\n country: Nullable;\n provider: Nullable;\n note: Nullable;\n small_business: boolean;\n research: boolean;\n data_deliverer: Nullable;\n service_package_id: Nullable;\n}\n\ntype TFormErrorMessage = string | undefined;\n\ntype TOrderSubmissionFormErrors = {\n [key in keyof IOrderSubmissionFormValues]?: TFormErrorMessage\n}\n\ntype TOrderSubmissionStep = {\n id: 'location' | 'licensor' | 'service-package' | 'note' | 'preview';\n title: string;\n enabled: boolean;\n}\n\nconst STEPS = (order: TApiOrder): Array => {\n return [\n {\n id: 'location',\n title: 'Select location',\n enabled: true\n },\n {\n id: 'licensor',\n title: 'Select prospective licensor and data deliverer',\n enabled: true\n },\n {\n id: 'service-package',\n title: 'Select Service Package',\n enabled: order.category === OrderCategory.REALTIME || order.category === OrderCategory.EU_CUTOUT\n },\n {\n id: 'note',\n title: 'Add note',\n enabled: true\n },\n {\n id: 'preview',\n title: 'Preview',\n enabled: true\n }\n ]\n}\n\nconst stepsByOrderCategory = (order: TApiOrder): Array => {\n return STEPS(order).filter(item => item.enabled);\n}\n\nconst useSubmissionStep = (order: TApiOrderDetails) => {\n const steps = stepsByOrderCategory(order);\n const stepIds = steps.map(step => step.id);\n\n const [progress, setProgress] = useState>([stepIds[0]]);\n const activeStep = progress[progress.length - 1];\n\n const nextStep = (values: IOrderSubmissionFormValues) => {\n if (\n (order.category === OrderCategory.REALTIME || order.category === OrderCategory.EU_CUTOUT) &&\n values.data_deliverer && !values.data_deliverer.is_ecmwf &&\n activeStep === 'licensor'\n ) {\n setProgress([...progress, 'note'])\n return;\n }\n\n setProgress([...progress, stepIds[indexOf(stepIds, activeStep) + 1]])\n }\n\n const previousStep = () => {\n setProgress(progress.slice(0, progress.length - 1))\n }\n\n const resetStep = () => {\n setProgress([stepIds[0]]);\n }\n\n return { activeStep, nextStep, previousStep, resetStep }\n}\n\nconst OrderSubmissionForm = (props: Props) => {\n const {\n order,\n countries,\n orderCostingVersion,\n onComplete\n } = props;\n const dispatch = useDispatch();\n const steps = stepsByOrderCategory(order);\n const stepIds = steps.map(step => step.id);\n const { activeStep, nextStep, previousStep, resetStep } = useSubmissionStep(order);\n const [confirmed, setConfirmed] = useState(false);\n const [providers, setProviders] = useState>([]);\n const [servicePackages, setServicePackages] = useState>([]);\n const [serviceCharges, setServiceCharges] = useState>([]);\n const [volumeBands, setVolumeBands] = useState>([]);\n const isLastStep = activeStep === steps[steps.length - 1].id;\n const isFirstStep = activeStep === steps[0].id;\n\n const validateForm = (values: IOrderSubmissionFormValues) => {\n const errors: TOrderSubmissionFormErrors = {};\n\n if (activeStep === 'location') {\n errors.country = values.country ? undefined : 'Cannot be blank.'\n }\n\n if (activeStep === 'licensor') {\n errors.provider = values.provider ? undefined : 'Cannot be blank.';\n\n if (order.category === OrderCategory.REALTIME || order.category === OrderCategory.EU_CUTOUT) {\n errors.data_deliverer = values.data_deliverer ? undefined : 'Cannot be blank.';\n }\n }\n\n if (activeStep === 'service-package') {\n errors.service_package_id = values.service_package_id ? undefined : 'Please, select a service package.'\n }\n\n return pickBy(errors, v => !isUndefined(v));\n }\n\n const onSubmit = useCallback((values, actions) => {\n if (isLastStep) {\n dispatch(\n submitOrder(order, {\n ccp_organisation: values.provider,\n status_note: values.note,\n small_business: values.small_business,\n research: values.research,\n ...((order.category === OrderCategory.REALTIME || order.category === OrderCategory.EU_CUTOUT) && { data_deliverer_organisation_id: values.data_deliverer.id }),\n ...( values.service_package_id && { service_package_id: values.service_package_id }),\n // @ts-ignore\n })).then(() => {\n setConfirmed(true);\n }\n );\n } else {\n nextStep(values);\n actions.setTouched({});\n actions.setSubmitting(false);\n }\n }, [nextStep, dispatch, isLastStep, order]);\n\n const formik = useFormik({\n initialValues: {\n country: null,\n provider: null,\n note: '',\n small_business: false,\n research: false,\n data_deliverer: null,\n service_package_id: null\n },\n validate: validateForm,\n onSubmit\n });\n\n const onSubmitComplete = useCallback((event: MouseEvent) => {\n event.preventDefault();\n\n onComplete && onComplete();\n }, [onComplete])\n\n const onBack = useCallback((event: MouseEvent) => {\n event.preventDefault();\n\n previousStep();\n }, [activeStep]);\n\n const onProviderSelect = useCallback((value: TApiProvider['id'] | undefined) => {\n formik.setFieldValue('provider', value);\n }, [formik]);\n\n const onDataDelivererChange = useCallback((value: string | string[]) => {\n const dataDeliverer = find(providers, p => p.id === Number(value as string));\n\n formik.setFieldValue('data_deliverer', dataDeliverer);\n }, [formik]);\n\n const onServicePackageChange = useCallback((value: TApiServicePackage) => {\n formik.setFieldValue('service_package_id', value.id);\n }, [formik]);\n\n const onNoteChange = useCallback((event: ChangeEvent) => {\n formik.setFieldValue('note', event.target.value);\n }, [formik]);\n\n useEffect(() => {\n resetStep();\n Api.VolumeBand.list().then(setVolumeBands);\n Api.ServiceCharge.list({ service_charge_model_id: orderCostingVersion?.service_charge_model_id })\n .then(serviceCharges => {\n setServiceCharges(serviceCharges);\n\n Api.ServicePackage.list().then(servicePackages => {\n const supportedServicePackageIds = serviceCharges.reduce((acc, sc) => {\n acc.add(sc.service_package_id);\n\n return acc;\n }, new Set());\n\n const supportedServicePackages = servicePackages.filter(sp => supportedServicePackageIds.has(sp.id));\n setServicePackages(supportedServicePackages);\n });\n });\n }, [orderCostingVersion]);\n\n useEffect(() => {\n if (formik.values.country) {\n Api.Provider.list({\n order_category: order.category,\n country_code: formik.values.country\n }).then((providers) => {\n setProviders(providers);\n\n const defaultProvider = find(providers, 'default');\n formik.setFieldValue('provider', defaultProvider?.id || null);\n });\n }\n }, [formik.values.country]);\n\n useEffect(() => {\n formik.setFieldValue('data_deliverer_organisation_id', null);\n }, [formik.values.provider]);\n\n const selectedProvider = find(providers, p => p.id === formik.values?.provider);\n const chosenProvider = find(providers, provider => provider.id === order.ccp_organisation);\n const ecmwfProvider = find(providers, provider => provider.is_ecmwf);\n const orderVolumeBand = find(volumeBands, vb => vb.id === order.volume_band_id);\n const chosenServicePackage = find(servicePackages, sp => sp.id === formik.values.service_package_id);\n const chosenServiceCharge = find(serviceCharges, sc => sc.volume_band_id === order.volume_band_id && sc.service_package_id === chosenServicePackage?.id);\n\n return (\n \n {\n confirmed &&\n
\n
\n
\n \n
\n\n
\n Your order (ref: {order.id}) has been submitted successfully to\n  \n {\n chosenProvider ? chosenProvider.name : 'chosen licensor'\n }\n !\n
\n\n
\n \n What happens next?\n \n
\n
\n\n
\n \n
\n
\n }\n {\n !confirmed &&\n \n \n \n
\n
\n {\n activeStep === 'location' &&\n \n }\n\n {\n activeStep === 'licensor' &&\n \n }\n\n {\n activeStep === 'service-package' && orderVolumeBand &&\n \n }\n\n {\n activeStep === 'note' &&\n \n \n Add message to licensor\n \n \n \n\n {\n (order.category === OrderCategory.REALTIME || order.category === OrderCategory.WEB) &&\n \n

\n Please add any additional comments to your order, such as the number of an associated\n support ticket or if this amends an existing licence.\n

\n

\n If you request a research licence, please use the message box to indicate the project\n description, length and participants.\n

\n
\n }\n />\n }\n\n {\n (order.category === OrderCategory.ARCHIVE) &&\n \n

\n If you request a research licence, please use the message box to indicate the project\n description, length and participants.\n

\n \n }\n />\n }\n \n }\n\n {\n activeStep === 'preview' &&\n \n }\n
\n\n
\n {\n !isFirstStep &&\n \n }\n\n \n
\n
\n \n\n \n
\n {\n steps.map((step, index) =>\n index}\n active={activeStep === step.id}\n number={index + 1}\n />\n )\n }\n
\n \n
\n
\n }\n
\n )\n}\n\nconst StepperItem = (props: {\n number: number;\n active: boolean;\n completed: boolean;\n title: string;\n}) => {\n const { active, completed, number, title } = props;\n const className = classNames(\n 'stepper-item',\n active && 'active',\n completed && 'completed'\n );\n const badgeVariant = active ? 'primary' : 'primary';\n\n return (\n
\n
\n {\n completed ?\n \n : {number}\n\n }\n
\n\n {title}\n
\n\n )\n}\n\nexport default OrderSubmissionForm;\n","import React, { Fragment } from \"react\";\n\nconst smallBusinessDiscountInfo = () => {\n return (\n \n ECMWF applies a 50% discount to companies with less than 10 staff headcount, and an annual turnover or balance\n sheet of no more than 2 million euros. Please tick the box if you wish to apply for this discount. Note that you\n will need to provide self-certification declaring your business status and are obliged to notify the licensor of\n any changes in its status.\n \n )\n}\n\nconst researchLicenceInfo = () => {\n return (\n \n Any project organised for non-commercial research purposes only. A necessary condition for the recognition of\n non-commercial purposes is that all the results obtained are openly available at delivery costs only, without any\n delay linked to commercial objectives, and that the research itself is submitted for open publication. Please note\n that the licence is subject to management approval.\n \n )\n}\n\nconst HelpTexts = {\n smallBusinessDiscountInfo,\n researchLicenceInfo\n};\n\nexport default HelpTexts;\n","import * as React from \"react\";\nimport { getID } from \"../../../utils/IdGenerator\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { faCheckSquare, faMinusSquare, faSquare } from '@fortawesome/free-regular-svg-icons';\n\ntype Props = {\n\tname: string;\n\tvalue: string | number;\n\tchecked: boolean;\n\tonChange: (checked: boolean) => void;\n\trequired?: boolean;\n\tindeterminate?: boolean;\n\tlabel: string | JSX.Element;\n\tdisabled?: boolean;\n};\n\ntype State = {\n\tid: string;\n};\n\n/**\n * A checkbox which supports an indeterminate state.\n */\nclass Checkbox extends React.PureComponent {\n\tprivate readonly textInput: React.RefObject = React.createRef();\n\tconstructor(props: Props) {\n\t\tsuper(props);\n\t\tthis.state = {\n\t\t\tid: getID()\n\t\t};\n\t\tthis.textInput = React.createRef();\n\t}\n\n\tpublic componentDidMount() {\n\t\tthis.textInput.current!.indeterminate = !!this.props.indeterminate;\n\t}\n\n\tpublic componentDidUpdate(prevProps: Props) {\n\t\tconst b = !!this.props.indeterminate;\n\t\tif (prevProps.indeterminate !== b) {\n\t\t\tthis.textInput.current!.indeterminate = b;\n\t\t}\n\t}\n\n\tpublic focus = () => this.textInput.current!.focus();\n\n\tpublic render() {\n\t\treturn (\n\t\t\t
\n\t\t\t\t this.props.onChange(e.target.checked)}\n\t\t\t\t\trequired={this.props.required}\n\t\t\t\t\tdisabled={this.props.disabled}\n\t\t\t\t\tref={this.textInput}\n\t\t\t\t/>\n\t\t\t\t\n\t\t\t
\n\t\t);\n\t}\n}\n\nexport default Checkbox;\n","import { Form } from \"react-bootstrap\";\nimport dayjs from \"dayjs\";\nimport FormError from \"../../../RealtimeProductConfigurator/FormError\";\nimport Footnote from \"../../../RealtimeProductConfigurator/Footnote\";\nimport React from \"react\";\nimport { FormikContextType, FormikErrors } from \"formik/dist/types\";\nimport { OrderCategory } from \"../../../../api/endpoints/Order\";\n\ninterface Props {\n formik: FormikContextType;\n orderCategory: OrderCategory;\n}\n\nconst helpText = (orderCategory: OrderCategory) => {\n switch (orderCategory) {\n case OrderCategory.ARCHIVE:\n return 'Please note that it can take up to a week to set up your access to MARS. Note that the start date will be the selected date starting from 00.00 UTC.';\n case OrderCategory.WEB:\n return 'Please note that it can take up to a week to set up your access to ecCharts. Note that the start date will be the selected date starting from 00.00 UTC.';\n default:\n return 'Please note that it takes up to 10 working days to set up the connection. The start date will be the selected date starting from 00.00 UTC.'\n }\n}\n\nconst StartDateField = (props: Props) => {\n const { formik, orderCategory } = props;\n const errors = formik.errors as FormikErrors<{start_date: string}>;\n\n return (\n \n Start date\n\n \n\n \n\n \n \n )\n}\n\nexport default StartDateField;\n","import { useFormik } from 'formik';\nimport React, { Fragment, useCallback } from 'react';\nimport { Button, Form } from 'react-bootstrap';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { Action } from 'redux';\nimport { ThunkDispatch } from 'redux-thunk';\nimport * as Api from '../../../api';\nimport HelpTexts from \"../../../components/HelpTexts\";\nimport { TRootState } from '../../../store/reducers/RootReducer';\nimport { TApiOrderDetails } from \"../../../api/endpoints/Order\";\nimport { partialUpdateOrder } from \"../../../store/action-creators/orders\";\nimport FormError from \"../../../components/RealtimeProductConfigurator/FormError\";\nimport Footnote from \"../../../components/RealtimeProductConfigurator/Footnote\";\nimport OrderPolicy from \"../../../policies/OrderPolicy\";\nimport Checkbox from \"../../../components/Inputs/Checkbox/Checkbox\";\nimport InfoTooltip from \"../../../components/Ui/InfoTooltip\";\nimport ExternalLink from \"../../../components/Navigation/Links/ExternalLink\";\nimport { selectUser } from \"../../../store/selectors/UserSelectors\";\nimport StartDateField from \"../../../components/OrderBrowser/OrderForm/StartDateField\";\n\ninterface IOrderFormProps {\n onSubmit?: (order: TApiOrderDetails) => void;\n order: TApiOrderDetails\n}\n\ninterface IOrderEditFormValues {\n name: string;\n start_date: string;\n small_business: boolean;\n research: boolean;\n}\n\nconst EditOrderForm = (props: IOrderFormProps) => {\n const { order, onSubmit } = props;\n const dispatch = useDispatch>();\n const user = useSelector(selectUser);\n\n const handleSubmit = useCallback((values) => {\n const { name, small_business, research, start_date } = values;\n\n return dispatch(partialUpdateOrder(order.id, {\n name,\n start_date,\n ...(OrderPolicy.canRequestSmallBusinessDiscount(user, order) && { small_business }),\n ...(OrderPolicy.canRequestResearchLicence(user, order) && { research })\n })).then((order) => onSubmit?.(order));\n }, [dispatch, order, user, onSubmit]);\n\n const formik = useFormik({\n initialValues: {\n name: order.name,\n start_date: order.start_date || '',\n small_business: order.small_business || false,\n research: order.research || false\n },\n onSubmit: (values, { setSubmitting, setErrors }) => {\n handleSubmit(values).then(() => {\n setSubmitting(false);\n }).catch(error => {\n setSubmitting(false);\n\n if (error instanceof Api.ValidationError) {\n const errors = error.data;\n setErrors(errors);\n }\n });\n }\n });\n\n const onSmallBusinessChange = useCallback((checked: boolean) => {\n formik.setFieldValue('small_business', checked);\n\n if (checked) {\n formik.setFieldValue('research', false);\n }\n }, [formik]);\n\n const onResearchChange = useCallback((checked: boolean) => {\n formik.setFieldValue('research', checked);\n\n if (checked) {\n formik.setFieldValue('small_business', false);\n }\n }, [formik]);\n\n return (\n
\n \n Order Name\n \n \n \n\n \n\n {\n OrderPolicy.canRequestSmallBusinessDiscount(user, order) &&\n \n \n\n \n \n }\n\n {\n OrderPolicy.canRequestResearchLicence(user, order) &&\n \n \n\n \n \n }\n\n \n \n );\n};\n\nexport default EditOrderForm;\n","import { Button, ButtonProps } from 'react-bootstrap';\nimport { FontAwesomeIcon, FontAwesomeIconProps } from '@fortawesome/react-fontawesome';\nimport React from 'react';\n\ninterface IProps extends ButtonProps {\n icon?: FontAwesomeIconProps['icon'];\n onClick?: () => void;\n iconProps?: Omit\n}\n\nconst ButtonWithIcon = (props: IProps) => {\n const { children, icon, iconProps, ...otherProps } = props;\n\n return (\n \n )\n}\n\nexport default ButtonWithIcon;\n","import { ThunkDispatch } from \"redux-thunk\";\nimport { AnyAction } from \"redux\";\nimport { TRootState } from \"../store/reducers/RootReducer\";\nimport { useDispatch } from \"react-redux\";\n\nexport type AppDispatch = ThunkDispatch\n\nconst useAppDispatch = () => useDispatch()\n\nexport default useAppDispatch;\n","import { OrderCostSummaryV2Props } from \"../index\";\nimport Row from \"../../../../../components/Common/Row\";\nimport Col from \"../../../../../components/Common/Col\";\nimport { formatBinaryCapacityUnit, formatInteger } from \"../../../../../utils/Format\";\nimport { totalEpu } from \"../../../../../utils/Cost\";\nimport React, { Fragment } from \"react\";\n\nconst VolumeSummary = (props: OrderCostSummaryV2Props) => {\n const { cost } = props;\n const { total_cost } = cost.data;\n\n if (!total_cost) {\n return null;\n }\n\n return (\n \n \n \n Estimated annual volume\n \n \n {\n formatBinaryCapacityUnit(total_cost.volume)\n }\n \n \n \n )\n}\n\nexport default VolumeSummary;\n","import { TOrderCostError } from \"../../../../../api/endpoints/Order\";\nimport { useSelector } from \"react-redux\";\nimport { selectUser } from \"../../../../../store/selectors/UserSelectors\";\nimport OrderPolicy from \"../../../../../policies/OrderPolicy\";\nimport { Alert, Button } from \"react-bootstrap\";\nimport ExternalLink from \"../../../../../components/Navigation/Links/ExternalLink\";\nimport React, { Fragment, useState } from \"react\";\nimport { Collapse } from \"react-collapse\";\n\ninterface Props {\n error: TOrderCostError;\n}\n\nconst FullErrorContent = (props: Props) => {\n const { error } = props;\n\n return (\n \n

\n {error.message}\n

\n

\n {error.traceback}\n

\n
\n )\n}\n\nconst ContactSupportContent = () => {\n return (\n \n An error occurred in the costing of your data. We are very sorry about this. Please\n contact Data Support via our \n support portal.\n \n )\n}\n\nconst CostError = (props: { error: TOrderCostError }) => {\n const { error } = props;\n const user = useSelector(selectUser);\n const [detailsOpen, setDetailsOpen] = useState(false);\n\n\n const content = OrderPolicy.canViewFullCostError(user) ?\n \n : ;\n\n return (\n \n Error\n\n
\n \n
\n\n {\n OrderPolicy.canViewFullCostError(user) &&\n
\n
\n setDetailsOpen(!detailsOpen)}\n >\n See more details\n \n
\n\n \n
\n \n
\n
\n
\n }\n
\n )\n}\n\nexport default CostError;\n","import React from \"react\";\nimport { useSelector } from \"react-redux\";\nimport { Nullable } from \"../../../../../../types/utils\";\nimport { OrderCostingVersion } from \"../../../../../api/endpoints/Order\";\nimport Col from \"../../../../../components/Common/Col\";\nimport Row from \"../../../../../components/Common/Row\";\nimport OrderPolicy from \"../../../../../policies/OrderPolicy\";\nimport { selectUser } from \"../../../../../store/selectors/UserSelectors\";\n\ninterface Props {\n ecquoteVersion: string;\n version?: Nullable;\n}\n\nconst CostingVersion = (props: Props) => {\n const { ecquoteVersion, version } = props;\n const user = useSelector(selectUser);\n\n if (!OrderPolicy.canViewEcQuoteVersion(user)) {\n return null;\n }\n\n return (\n \n \n \n {\n version &&\n \n Costing version: {version.title}, \n \n }\n\n Ecquote version: {ecquoteVersion}\n \n\n \n \n )\n}\n\nexport default CostingVersion;\n","import React, { Fragment } from \"react\";\nimport { OrderCostSummaryV2Props } from \"../index\";\nimport Col from \"../../../../../components/Common/Col\";\nimport { formatCurrency } from \"../../../../../utils/Format\";\nimport { totalCost } from \"../../../../../utils/Cost\";\nimport Row from \"../../../../../components/Common/Row\";\nimport { OrderCategory, OrderStatus } from \"../../../../../api/endpoints/Order\";\n\nconst TotalCost = (props: OrderCostSummaryV2Props) => {\n const { cost, orderStatus, orderCategory, annualTotalCostFootnoteRef } = props;\n const { total_cost } = cost.data;\n\n if (!total_cost) {\n return null;\n }\n\n let label = 'Annual total cost';\n\n if (\n orderStatus === OrderStatus.DRAFT &&\n (orderCategory === OrderCategory.REALTIME || orderCategory === OrderCategory.EU_CUTOUT)\n ) {\n label = 'Total Annual Information Cost';\n }\n\n return (\n \n \n \n {label}\n {annualTotalCostFootnoteRef && {annualTotalCostFootnoteRef}}\n \n \n {\n formatCurrency(totalCost(cost))\n }\n \n \n \n )\n}\n\nexport default TotalCost;\n","import React, { Fragment, ReactNode } from \"react\";\nimport { Nullable } from \"../../../../../types/utils\";\nimport {\n OrderCategory,\n OrderCostingVersion,\n OrderStatus,\n TOrderCostV2,\n TOrderCostV3,\n TOrderCostV4, TOrderCostV5\n} from \"../../../../api/endpoints/Order\";\nimport VolumeSummary from \"././VolumeSummary\";\nimport CostError from \"./CostError\";\nimport CostingVersion from \"././CostingVersion\";\nimport InformationCost from \"./InformationCost\";\nimport ServiceChargeCost from \"./ServiceChargeCost\";\nimport TotalCost from \"./TotalCost\";\n\ninterface IProps {\n cost: TOrderCostV2 | TOrderCostV3 | TOrderCostV4 | TOrderCostV5;\n currentCostingVersion?: Nullable;\n orderCategory: OrderCategory;\n orderStatus: OrderStatus;\n annualTotalCostFootnoteRef?: string;\n}\n\nexport interface OrderCostSummaryV2Props extends IProps {\n additionalContent?: ReactNode;\n}\n\nconst OrderCostSummaryV2 = (props: OrderCostSummaryV2Props) => {\n const { additionalContent, cost, orderCategory, currentCostingVersion } = props;\n const { total_cost, error } = cost.data;\n\n if (error) {\n return \n }\n\n if (!total_cost) {\n return null;\n }\n\n return (\n \n {\n (orderCategory === OrderCategory.REALTIME || orderCategory === OrderCategory.EU_CUTOUT) &&\n \n }\n\n {\n orderCategory !== OrderCategory.ARCHIVE &&\n \n }\n\n \n\n \n\n {\n additionalContent\n }\n\n {\n cost.data.ecquote_version &&\n \n }\n \n )\n}\n\nexport default OrderCostSummaryV2;\n","import OrderCostSummaryV2 from \"../OrderCostSummaryV2\";\n\nconst OrderCostSummaryV3 = OrderCostSummaryV2;\n\nexport default OrderCostSummaryV3;\n","import React, { Fragment, useCallback, useEffect, useState } from \"react\";\nimport { Nullable } from \"../../../../types/utils\";\nimport { TApiOrderDetails, TOrderCostV3, TOrderCostV4 } from \"../../../api/endpoints/Order\";\nimport { Button } from \"react-bootstrap\";\nimport ButtonWithIcon from \"../../Buttons/ButtonWithIcon\";\nimport { faSpinner } from \"@fortawesome/free-solid-svg-icons\";\nimport { recalculateOrder } from \"../../../store/action-creators/orders\";\nimport useAppDispatch from \"../../../hooks/useAppDispatch\";\nimport OrderCostSummaryV3 from \"../../../containers/Order/OrderCostSummary/OrderCostSummaryV3\";\n\ntype Stage = 'prompt' | 'summary';\nconst STAGES: Array = ['prompt', 'summary'];\n\n\ninterface Props {\n order: TApiOrderDetails;\n currentVersion?: Nullable;\n onComplete: () => void;\n}\n\nconst CostVersion = (props: Props) => {\n const { order, currentVersion, onComplete } = props;\n const [loading, setLoading] = useState(false);\n const [stage, setStage] = useState(STAGES[0]);\n const dispatch = useAppDispatch();\n\n const onRecalculateClick = useCallback(() => {\n setLoading(true);\n\n dispatch(recalculateOrder(order)).then((order) => {\n setLoading(false);\n setStage('summary');\n })\n }, [dispatch, setLoading, order]);\n\n useEffect(() => {\n if ((order.cost as TOrderCostV3 | TOrderCostV4).data.ecquote_version === currentVersion) {\n setStage('summary');\n }\n }, [order]);\n\n return (\n
\n {\n stage === 'prompt' &&\n \n
\n We have updated our costing algorithm that might affect the costs of your order.\n
\n\n
\n Press the button below to recalculate the costs.\n
\n\n
\n \n Recalculate\n \n
\n
\n }\n\n {\n stage === 'summary' &&\n \n

\n Summary of updated costs\n

\n\n
\n \n
\n\n
\n \n
\n
\n }\n
\n )\n}\n\nexport default CostVersion;\n","import dayjs from \"dayjs\";\nimport { find } from \"lodash\";\nimport React, { Fragment, useEffect, useState } from \"react\";\nimport { Alert } from \"react-bootstrap\";\nimport { Nullable } from \"../../../types/utils\";\nimport { OrderCostingVersion, TApiOrderDetails } from \"../../api/endpoints/Order\";\nimport EditOrderForm from \"../../containers/Order/EditOrderForm\";\nimport CostVersion from \"./CostVersion\";\n\ninterface Props {\n order: TApiOrderDetails;\n orderCostingVersions: Array;\n currentOrderCostingVersion: Nullable;\n children: JSX.Element | null;\n}\n\nconst ecQuoteVersion = (cost: TApiOrderDetails['cost']) => {\n if (cost.version === 'v1' || cost.version === 'v2') {\n return null;\n }\n\n return cost.data.ecquote_version;\n}\n\nconst isOrderCostCompatible = (\n order: TApiOrderDetails,\n orderCostingVersions: Array\n) => {\n const { cost } = order;\n\n return orderCostingVersions.some(costingVersion => {\n return costingVersion.version === order.cost.version &&\n ecQuoteVersion(cost) === costingVersion.ecquote_version;\n }\n );\n}\n\nconst isOrderDataCompatible = (order: TApiOrderDetails) => {\n const isStartDateCompatible = order.start_date && dayjs(order.start_date).isAfter(new Date());\n\n return isStartDateCompatible;\n}\n\nconst OrderSubmissionFormCompatibility = (props: Props) => {\n const { order, orderCostingVersions, currentOrderCostingVersion, children } = props;\n const [costStageCompleted, setCostStageCompleted] = useState(false);\n const currentEcquoteVersion = find(orderCostingVersions, { version: order.cost.version })?.ecquote_version;\n\n useEffect(() => {\n const isCostCompatible = isOrderCostCompatible(order, orderCostingVersions);\n\n setCostStageCompleted(isCostCompatible);\n }, [order, orderCostingVersions]);\n\n const isDataCompatible = isOrderDataCompatible(order);\n const isOrderCompatible = isDataCompatible && costStageCompleted;\n\n if (isOrderCompatible) {\n return children;\n }\n\n if (!costStageCompleted) {\n return (\n setCostStageCompleted(true)}\n />\n )\n }\n\n return (\n \n \n It seems that this draft is out of date. We require some more information from you. Please update the\n information below.\n \n\n \n \n )\n}\n\nexport default OrderSubmissionFormCompatibility;\n","import * as React from \"react\";\n\ninterface IProps {\n identifier: number | string;\n children: React.ReactNode;\n}\n\nconst Disclaimer = (props: IProps) => {\n const { identifier, children } = props;\n\n return (\n
\n {identifier}\n
\n {children}\n
\n
\n );\n};\n\nexport default Disclaimer;\n","import { User, UserType } from \"../entities/User\";\nimport { TApiOrderDetails } from \"../api/endpoints/Order\";\nimport { isOrderValid } from \"./OrderPolicy\";\n\nconst DisseminationRequestPolicy = {\n canAccess(user: User, order: TApiOrderDetails) {\n return isOrderValid(order) &&\n user.type === UserType.Admin || user.type === UserType.CCP;\n }\n}\n\nexport default DisseminationRequestPolicy;\n","import dayjs from \"dayjs\";\nimport advancedFormat from 'dayjs/plugin/advancedFormat';\nimport utc from 'dayjs/plugin/utc';\nimport timezone from 'dayjs/plugin/timezone';\n\ndayjs.extend(utc);\ndayjs.extend(timezone);\ndayjs.extend(advancedFormat);\n\nconst dateLong = (date: dayjs.ConfigType) => {\n return dayjs(date).format('MMMM D, YYYY');\n}\n\nconst dateTimeWithTimezone = (date: dayjs.ConfigType) => {\n return dayjs(date).format('DD/MM/YYYY HH:mm (z)');\n}\n\nconst isAfterUTC = (date: dayjs.ConfigType, afterDate: dayjs.ConfigType) => {\n return dayjs(date).utc().isAfter(dayjs(afterDate).utc(true));\n}\n\nconst Format = {\n dateLong,\n dateTimeWithTimezone\n}\n\nconst Utils = {\n isAfterUTC\n}\n\nconst DateTime = {\n Format,\n Utils\n}\n\nexport default DateTime;\n","import React from \"react\";\nimport { Alert } from \"react-bootstrap\";\n\nconst OrderExpirationAlert = () => {\n\n return (\n \n This quote has expired, as our pricing has changed since. Please create a new quote.\n If you wish to use this quote as a starting point, you can duplicate this quote and the new pricing will be shown.\n \n )\n}\n\nexport default OrderExpirationAlert;\n","import { isNull } from \"lodash\";\nimport Row from \"../../../../components/Common/Row\";\nimport Col from \"../../../../components/Common/Col\";\nimport React from \"react\";\n\ninterface IProps {\n title: string;\n value: boolean | null\n}\n\nconst LicenceItem = (props: IProps) => {\n const { title, value } = props;\n\n if (isNull(value)) {\n return null;\n }\n\n return (\n \n \n {title}: {value ? 'Yes' : 'No'}\n \n \n )\n}\n\nexport default LicenceItem\n","import React, { Fragment } from \"react\";\nimport { TApiOrderDetails } from \"../../../api/endpoints/Order\";\nimport OrderPolicy from \"../../../policies/OrderPolicy\";\nimport { User } from \"../../../entities/User\";\nimport LicenceItem from \"./LicenceItem\";\n\ninterface IProps {\n order: TApiOrderDetails;\n user: User;\n}\n\nconst LicenceDetails = (props: IProps) => {\n const { order, user } = props;\n\n return (\n \n {\n OrderPolicy.canRequestSmallBusinessDiscount(user, order) &&\n \n }\n\n {\n OrderPolicy.canRequestResearchLicence(user, order) &&\n \n }\n \n )\n}\n\nexport default LicenceDetails;\n","import React from 'react';\nimport { TApiOrderDetails } from \"../../../api/endpoints/Order\";\n\ninterface Props {\n order: TApiOrderDetails;\n}\n\nconst MaxChargeCostPerCostingVersion = {\n v1: null,\n v2: null,\n v3: {\n basic: '€70,000',\n withHighFrequency: '€78,000'\n },\n v4: {\n basic: '€47,500',\n withHighFrequency: '€55,500'\n },\n v5: null\n}\n\nconst MaxChargeWarning = (props: Props) => {\n const { order } = props;\n\n const cost = MaxChargeCostPerCostingVersion[order.cost.version];\n\n if (!cost) {\n return null;\n }\n\n return (\n
\n

\n This data configuration would require a Maximum Charge licence agreement,\n which is not subject to discounts.\n

\n\n

\n The Information Cost of the Maximum Charge Licence without High Frequency Products\n (hourly data and 06/18 forecast runs) is: {cost.basic} per year.\n

\n\n

\n The Information Cost of the Maximum Charge Licence with High Frequency Products\n (hourly data and 06/18 forecast runs) is {cost.withHighFrequency} per year.\n

\n
\n )\n}\n\nexport default MaxChargeWarning;\n","import Row from \"../../../../components/Common/Row\";\nimport Col from \"../../../../components/Common/Col\";\nimport { formatCurrency } from \"../../../../utils/Format\";\nimport { handlingCost, hfInformationCost, informationCost, totalCost } from \"../../../../utils/Cost\";\nimport { OrderCategory, TApiOrderDetails, TOrderCostV1 } from \"../../../../api/endpoints/Order\";\nimport React, { Fragment } from \"react\";\n\ninterface IProps {\n cost: TOrderCostV1;\n orderCategory: OrderCategory;\n annualTotalCostFootnoteRef?: string;\n}\n\nconst OrderCostSummaryV1 = (props: IProps) => {\n const { orderCategory, cost, annualTotalCostFootnoteRef } = props;\n\n return (\n \n {\n orderCategory !== 'archive' &&\n \n \n Annual Information Cost\n \n \n {\n formatCurrency(informationCost(cost))\n }\n \n \n }\n\n {\n (orderCategory === OrderCategory.REALTIME || orderCategory === OrderCategory.EU_CUTOUT) &&\n \n \n Annual High Frequency Products Information Cost\n \n \n {\n formatCurrency(hfInformationCost(cost))\n }\n \n \n }\n\n \n \n Annual ECMWF handling charge\n \n \n {\n formatCurrency(handlingCost(cost))\n }\n \n \n\n \n \n Annual total cost\n {annualTotalCostFootnoteRef && {annualTotalCostFootnoteRef}}\n \n \n \n {\n formatCurrency(totalCost(cost))\n }\n \n \n \n \n )\n}\n\nexport default OrderCostSummaryV1;\n","import OrderCostSummaryV3 from \"../OrderCostSummaryV3\";\n\nconst OrderCostSummaryV4 = OrderCostSummaryV3;\n\nexport default OrderCostSummaryV4;\n","import OrderCostSummaryV4 from \"../OrderCostSummaryV4\";\n\nconst OrderCostSummaryV5 = OrderCostSummaryV4;\n\nexport default OrderCostSummaryV5;\n","import React, { ReactNode, useEffect } from \"react\";\nimport { Nullable } from \"../../../../types/utils\";\nimport { OrderCostingVersion, TApiOrderDetails } from \"../../../api/endpoints/Order\";\nimport OrderCostSummaryV1 from \"./OrderCostSummaryV1\";\nimport OrderCostSummaryV2 from \"./OrderCostSummaryV2\";\nimport classNames from \"classnames\";\nimport OrderCostSummaryV3 from \"./OrderCostSummaryV3\";\nimport OrderCostSummaryV4 from \"./OrderCostSummaryV4\";\nimport OrderCostSummaryV5 from \"./OrderCostSummaryV5\";\n\ninterface IProps {\n order: TApiOrderDetails;\n currentCostingVersion?: Nullable;\n annualTotalCostFootnoteRef?: string;\n additionalContent?: ReactNode;\n}\n\nconst OrderCostSummary = (props: IProps) => {\n const { order, currentCostingVersion, annualTotalCostFootnoteRef, additionalContent } = props;\n const { version } = order.cost;\n\n return (\n
\n {\n version === 'v1' &&\n \n }\n\n {\n version === 'v2' &&\n \n }\n\n {\n version === 'v3' &&\n \n }\n\n {\n version === 'v4' &&\n \n }\n\n {\n version === 'v5' &&\n \n }\n
\n )\n}\n\nexport default OrderCostSummary;\n","import { TApiOrderDetails } from \"../../../api/endpoints/Order\";\nimport React, { Fragment, useCallback, useEffect, useState } from \"react\";\nimport { TApiVolumeBand } from \"../../../api/endpoints/VolumeBand\";\nimport { TApiServicePackage } from \"../../../api/endpoints/ServicePackage\";\nimport { TApiServiceCharge } from \"../../../api/endpoints/ServiceCharge\";\nimport ServicePackagePicker from \"../../../components/OrderSubmissionForm/ServicePackagePicker\";\nimport { Nullable } from \"../../../../types/utils\";\nimport { Button, Modal } from \"react-bootstrap\";\nimport { find } from \"lodash\";\nimport { formatCurrency } from \"../../../utils/Format\";\nimport Col from \"../../../components/Common/Col\";\nimport Row from \"../../../components/Common/Row\";\nimport { totalCost } from \"../../../utils/Cost\";\n\ninterface IProps {\n serviceCharges: Array;\n servicePackages: Array;\n order: TApiOrderDetails;\n volumeBand: TApiVolumeBand;\n}\n\nconst OrderCostWithPackage = (props: IProps) => {\n const { order, volumeBand, servicePackages, serviceCharges } = props;\n\n const [selectedPackage, setSelectedPackage] = useState>(null);\n const [selectedCharge, setSelectedCharge] = useState>(null);\n const [modalOpen, setModalOpen] = useState(false);\n\n const onPackageSelect = useCallback((value: TApiServicePackage) => {\n setSelectedPackage(value);\n setModalOpen(false);\n }, []);\n\n useEffect(() => {\n if (selectedPackage) {\n setSelectedCharge(\n find(serviceCharges, (sc => sc.volume_band_id === volumeBand.id && sc.service_package_id === selectedPackage.id)) ?? null\n )\n }\n }, [selectedPackage, volumeBand, serviceCharges]);\n\n return (\n
\n {\n selectedCharge && selectedPackage &&\n \n \n \n ECMWF Service Charge cost estimation\n \n \n\n \n \n ECMWF volume charge\n \n \n {\n formatCurrency(volumeBand.charge_in_eur / 100, 2)\n }\n \n \n\n \n \n ECMWF package charge ({selectedPackage.title})\n \n \n {\n formatCurrency((selectedCharge.charge_in_eur - volumeBand.charge_in_eur) / 100, 2)\n }\n \n \n\n \n \n Total cost with ECMWF service charges\n \n \n {\n formatCurrency((selectedCharge.charge_in_eur + totalCost(order.cost) * 100) / 100, 2)\n }\n \n \n \n }\n\n\n \n \n \n \n \n\n setModalOpen(false)} size=\"lg\">\n \n Select Service Package\n \n \n \n \n \n
\n )\n}\n\nexport default OrderCostWithPackage;\n","import { FontAwesomeIcon, FontAwesomeIconProps } from \"@fortawesome/react-fontawesome\";\nimport React, { forwardRef } from \"react\";\nimport classNames from \"classnames\";\nimport { faSpinner } from \"@fortawesome/free-solid-svg-icons\";\n\nexport interface IProps {\n icon: FontAwesomeIconProps['icon'];\n title?: string;\n variant?: 'primary' | 'danger';\n onClick?: () => void;\n disabled?: boolean;\n className?: string;\n loading?: boolean;\n iconProps?: Omit\n}\n\nconst IconButton = forwardRef((props, ref) => {\n const { title, icon, iconProps, onClick, disabled, className, variant = 'primary', loading } = props;\n\n return (\n \n \n {\n loading ?\n \n : \n }\n \n )\n});\n\nIconButton.displayName = 'IconButton';\n\nexport default IconButton;\n","import { groupBy, map, orderBy } from \"lodash\";\nimport React from \"react\";\nimport { TApiParameter } from \"../../../api/endpoints/Parameter\";\nimport { QuantiledParam } from \"../../../entities/QuantiledParam\";\n\ninterface IProps {\n value: Array;\n params: {\n [shortname: string]: TApiParameter\n };\n}\n\nconst ParamQuantile = (props: IProps) => {\n const { value, params } = props;\n\n const grouped = groupBy(value, 'param');\n\n return (\n
\n {\n map(grouped, (group, shortname) => {\n const shortnameLowerCase = shortname.toLowerCase();\n const matchedParam = params[shortnameLowerCase];\n\n return (\n
\n
\n {\n matchedParam ?\n `${matchedParam.name} (${shortnameLowerCase}):`\n : `${shortnameLowerCase}:`\n }\n
\n
\n {\n orderBy(group, param => param.quantile.split(':')[0])\n .map(param => param.quantile).join(', ')\n }\n
\n
\n )\n })}\n
\n )\n}\n\nexport default ParamQuantile;\n","import { groupBy, map, orderBy } from \"lodash\";\nimport React from \"react\";\nimport { TApiParameter } from \"../../../api/endpoints/Parameter\";\nimport { LeveledParam } from \"../../../entities/LeveledParam\";\n\ninterface IProps {\n value: Array;\n params: {\n [shortname: string]: TApiParameter\n }\n}\n\nconst ParamLevelist = (props: IProps) => {\n const { value, params } = props;\n\n const grouped = groupBy(value, 'param');\n\n return (\n
\n {\n map(grouped, (group, shortname) => {\n const shortnameLowerCase = shortname.toLowerCase();\n const matchedParam = params[shortnameLowerCase];\n\n return (\n
\n
\n {\n matchedParam ?\n `${matchedParam.name} (${shortnameLowerCase}):`\n : `${shortnameLowerCase}:`\n }\n
\n
\n {\n orderBy(group, param => param.level).map(param => param.level).join(', ')\n }\n
\n
\n )\n })}\n
\n )\n}\n\nexport default ParamLevelist;\n","import React, { Fragment, ReactNode } from \"react\";\nimport {\n formatAreas,\n formatBaseTime,\n formatBoolean,\n formatHindcastDay,\n formatResolution,\n formatRun\n} from \"../../utils/Format\";\nimport { makeResolution } from \"../../entities/Resolution\";\nimport { castArray, isEmpty } from \"lodash\";\nimport TimeStep from \"../ProductFormatters/TimeStep\";\nimport Run from \"../ProductFormatters/Run\";\nimport { Col, Container, Row } from \"react-bootstrap\";\nimport ParamQuantile from \"../ProductFormatters/ParamQuantile\";\nimport { selectParameters } from \"../../store/selectors/new/parameters\";\nimport { useSelector } from \"react-redux\";\nimport ParamLevelist from \"../ProductFormatters/ParamLevelist\";\nimport Steps from \"../ProductFormatters/Steps\";\nimport { TBcType } from \"../../api/endpoints/Subset\";\nimport { IRealtimeOrderProductData } from \"../../api/endpoints/OrderProduct\";\nimport EnsembleMembers from \"../ProductFormatters/EnsembleMembers\";\n\ninterface IProps {\n productData: IRealtimeOrderProductData;\n set: {\n name: string;\n };\n bcType: TBcType;\n timestamp?: string;\n actions?: ReactNode;\n}\n\nconst ProductAttribute = (props: {\n children: ReactNode;\n label: string;\n}) => {\n const { children, label } = props;\n\n return (\n \n \n {label}\n \n \n {children}\n \n \n );\n};\n\nconst ProductDetails = (props: IProps) => {\n const { productData, actions, set, bcType, timestamp } = props;\n const legs = productData.legs ?? [];\n const availableParams = useSelector(selectParameters);\n\n return (\n \n \n \n
{productData.name ? productData.name : (no name)}
\n
{set.name}
\n \n\n {\n actions &&\n \n {actions}\n \n }\n
\n\n
\n {\n productData.time &&\n \n {productData.time.map(formatBaseTime).join(' ')}\n \n }\n\n {\n legs.map((leg, index) => {\n return (\n \n {\n legs.length > 1 &&\n Leg {index + 1}\n }\n\n {\n leg.grid &&\n \n {formatResolution(makeResolution(leg.grid))}\n \n }\n\n {\n leg.step &&\n \n \n \n }\n \n );\n })\n }\n\n {\n productData.grid &&\n \n {formatResolution(makeResolution(productData.grid))}\n \n }\n\n {\n productData.step &&\n \n \n \n }\n\n {\n productData.number &&\n \n \n \n }\n\n {\n !isEmpty(productData.area) &&\n \n {\n castArray(formatAreas(productData.area)).map(area =>
{area}
)\n }\n
\n }\n\n {\n productData.location &&\n \n {\n productData.location\n }\n \n }\n\n {\n productData.time_step &&\n \n \n \n }\n\n {\n productData.param &&\n \n {productData.param.join(', ')}\n \n }\n\n {\n productData.param_levelist &&\n \n \n \n }\n\n {\n productData.param_quantile &&\n \n \n \n }\n\n {\n productData.use &&\n \n {\n productData.use.map(formatRun).join(', ')\n }\n \n }\n\n {\n productData.hindcast && productData.hindcast.length &&\n \n {productData.hindcast.map(formatHindcastDay).join(', ')}\n \n }\n\n {\n productData.use_step &&\n \n \n \n }\n\n {\n productData.fcmonth &&\n \n {productData.fcmonth.join(' ')}\n \n }\n\n {\n productData.channel &&\n \n {productData.channel.join(' ')}\n \n }\n
\n
\n )\n}\n\nexport default ProductDetails;\n","import { faClone, faEdit, faTrashAlt } from \"@fortawesome/free-regular-svg-icons\";\nimport React, { Fragment, useCallback, useState } from 'react';\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { useHistory } from 'react-router-dom';\nimport * as Api from \"../../../../../api\";\nimport { OrderCategory, OrderCostingVersion, TApiOrderDetails, TProductCost } from '../../../../../api/endpoints/Order';\nimport { TOrderProduct } from '../../../../../api/endpoints/OrderProduct';\nimport { TBcType } from '../../../../../api/endpoints/Subset';\nimport IconButton from '../../../../../components/Buttons/IconButton';\nimport Col from '../../../../../components/Common/Col';\nimport Row from '../../../../../components/Common/Row';\nimport ProductDetails from \"../../../../../components/ProductDetails\";\nimport OrderPolicy from \"../../../../../policies/OrderPolicy\";\nimport { paths } from '../../../../../router';\nimport { selectUser } from \"../../../../../store/selectors/UserSelectors\";\nimport { formatBinaryCapacityUnit } from \"../../../../../utils/Format\";\n\ninterface IProps {\n datasetName: string;\n order: TApiOrderDetails;\n orderCostingVersions: Array;\n product: TOrderProduct;\n cost?: TProductCost;\n bcType: TBcType;\n onProductRemove: (product: TOrderProduct) => void;\n onProductDuplicate: (product: TOrderProduct) => void;\n}\n\nconst RealtimeProductDetails = React.forwardRef((props, ref) => {\n const { order,\n orderCostingVersions,\n product,\n cost,\n datasetName,\n bcType,\n onProductRemove,\n onProductDuplicate\n } = props;\n\n const set = {\n name: datasetName\n };\n\n const [isDuplicating, setIsDuplicating] = useState(false);\n const [isRemoving, setIsRemoving] = useState(false);\n\n const user = useSelector(selectUser);\n const history = useHistory();\n const dispatch = useDispatch();\n\n const onDuplicate = useCallback(() => {\n setIsDuplicating(true);\n\n Api.OrderProduct.duplicate(product.order_id, product.id).then((newProduct) => {\n onProductDuplicate(newProduct);\n }).finally(() => {\n setIsDuplicating(false);\n })\n }, [onProductDuplicate, product]);\n\n const onProductEdit = useCallback(() => {\n history.push(paths.realtimeOrderProduct(order.id, product.id));\n }, [history, order, product.id])\n\n const onRemove = useCallback(() => {\n setIsRemoving(true);\n\n Api.OrderProduct.remove(product.order_id, product.id).then(() => {\n onProductRemove(product);\n }).finally(() => {\n setIsRemoving(false);\n });\n }, [dispatch, order, product.id]);\n\n return (\n \n \n \n {\n OrderPolicy.canAddProduct(user, order, orderCostingVersions) &&\n \n }\n {\n OrderPolicy.canUpdateProduct(user, order, orderCostingVersions) &&\n \n }\n {\n OrderPolicy.canRemoveProduct(user, order, orderCostingVersions) &&\n \n }\n \n }\n />\n \n\n {\n cost &&\n \n \n Cost\n \n\n
\n \n \n
Volume daily
\n \n\n \n {\n formatBinaryCapacityUnit(cost.volume)\n }\n \n
\n
\n \n }\n
\n );\n});\n\nRealtimeProductDetails.displayName = \"RealtimeProductDetails\";\n\nexport default RealtimeProductDetails;\n","import React, { Fragment, useRef } from \"react\";\nimport { OrderCategory, OrderCostingVersion, TApiOrderDetails } from \"../../../../api/endpoints/Order\";\nimport { TOrderProduct } from \"../../../../api/endpoints/OrderProduct\";\nimport { TApiSet } from \"../../../../api/endpoints/Set\";\nimport Col from \"../../../../components/Common/Col\";\nimport Row from \"../../../../components/Common/Row\";\nimport { VOLUME_LIMIT } from \"../../../../constants/Constants\";\nimport { deriveBcType, deriveDataSetName } from \"../../../../utils/DataSet\"\nimport { formatMegaBytes, withDefault } from \"../../../../utils/Format\";\nimport RealtimeProductDetails from \"./ProductDetaiils\";\n\ninterface IProps {\n order: TApiOrderDetails;\n orderCostingVersions: Array;\n products: Array>;\n sets: Array;\n onProductRemove: (product: TOrderProduct) => void;\n onProductDuplicate: (product: TOrderProduct) => void;\n}\n\nconst RealtimeOrderDetails = (props: IProps) => {\n const {\n order,\n orderCostingVersions,\n sets,\n products,\n onProductRemove,\n onProductDuplicate\n } = props;\n const productRefs = useRef>({});\n\n return (\n \n {\n products.map((product, index) => {\n const productData = product.data;\n const datasetName = deriveDataSetName(productData, sets);\n const bcType = deriveBcType(productData, sets);\n\n return productRefs.current[product.id] = el}\n datasetName={datasetName}\n bcType={bcType}\n key={product.id}\n order={order}\n orderCostingVersions={orderCostingVersions}\n product={product}\n cost={order.cost?.data.per_product && order.cost?.data.per_product[index]}\n onProductRemove={onProductRemove}\n onProductDuplicate={onProductDuplicate}\n />;\n })\n }\n\n {\n order.cost.version === 'v1' && order.cost.data.total_cost &&\n \n \n \n

Total daily volume

\n {\n order.cost.data.total_cost.volume && (order.cost.data.total_cost.volume > VOLUME_LIMIT) &&\n \n Please note that for data deliveries via ECMWF, volume charges will apply once you have exceeded\n 100GB per day. ECMWF volume charges are: 2000 EUR per 10GB/day over 100GB/day.\n \n }\n \n\n \n

\n {\n withDefault(\n order.cost.data.total_cost.volume ? (order.cost.data.total_cost.volume * 0.000001) : undefined,\n formatMegaBytes,\n \"--\"\n )\n }\n

\n \n
\n
\n }\n \n );\n}\n\nexport default RealtimeOrderDetails;\n\n","import React, { Fragment, useState } from \"react\";\nimport { Modal } from \"react-bootstrap\";\nimport EditOrderForm from \"../EditOrderForm\";\nimport { TApiOrderDetails } from \"../../../api/endpoints/Order\";\nimport IconButton from \"../../../components/Buttons/IconButton\";\nimport { faEdit } from \"@fortawesome/free-regular-svg-icons\";\n\ninterface IProps {\n order: TApiOrderDetails;\n onSuccess?: (order: TApiOrderDetails) => void;\n disabled?: boolean;\n}\n\nconst EditOrderButton = (props: IProps) => {\n const { order, onSuccess, disabled } = props;\n const [show, setShow] = useState(false);\n\n const handleClose = () => setShow(false);\n const handleClick = () => {\n setShow(true);\n }\n\n const onSubmit = (order: TApiOrderDetails) => {\n handleClose();\n onSuccess && onSuccess(order);\n }\n\n return (\n \n \n\n \n \n Edit order\n \n \n \n \n \n \n );\n}\n\nexport default EditOrderButton;\n","import React from \"react\";\nimport { useSelector } from \"react-redux\";\nimport { OrderCostingVersion, OrderStatus, TApiOrderDetails } from \"../../../api/endpoints/Order\";\nimport Col from \"../../../components/Common/Col\";\nimport Row from \"../../../components/Common/Row\";\nimport PageTitle from \"../../../components/Ui/PageTitle\";\nimport OrderStatusLabel from \"../../../constants/OrderStatusLabel\";\nimport OrderPolicy from \"../../../policies/OrderPolicy\";\nimport { selectUser } from \"../../../store/selectors/UserSelectors\";\nimport EditOrderButton from \"../EditOrderButton\";\n\nconst statusClass = new Map([\n [OrderStatus.ACCEPTED, \"active\"],\n [OrderStatus.COMPLETED, \"active\"],\n [OrderStatus.SUBMITTED, \"pending\"],\n [OrderStatus.DRAFT, \"draft\"],\n [OrderStatus.REJECTED, \"cancelled\"],\n [OrderStatus.CANCELLED, \"cancelled\"]\n]);\n\ninterface IProps {\n order: TApiOrderDetails;\n orderCostingVersions: Array;\n}\n\nconst OrderHeader = (props: IProps) => {\n const { order, orderCostingVersions } = props;\n const statusClassName = statusClass.get(order.status);\n const statusText = OrderStatusLabel.get(order.status);\n const user = useSelector(selectUser);\n\n return (\n \n \n }\n />\n \n\n \n \n {statusText}\n \n \n \n );\n};\n\nexport default OrderHeader;\n","import { find } from \"lodash\";\nimport React from \"react\";\nimport { Badge, ButtonGroup, Dropdown, DropdownButton } from \"react-bootstrap\";\nimport { OrderCostingVersion, TApiOrderDetails } from \"../../../../api/endpoints/Order\";\n\ninterface Props {\n order: TApiOrderDetails;\n availableVersions: Array;\n onVersionSelect: (version: OrderCostingVersion['version']) => void;\n}\n\nconst ChangeCostingVersionButton = (props: Props) => {\n const { order, availableVersions, onVersionSelect } = props;\n const currentVersion = order.cost.version;\n\n const currentVersionTitle = find(availableVersions, { version: currentVersion })?.title;\n\n return (\n
\n \n Select costing version:\n \n \n {\n availableVersions.map((costingVersion) => (\n onVersionSelect(costingVersion.version)}\n disabled={costingVersion.version === currentVersion}\n >\n
\n
\n \n {costingVersion.title}\n \n\n {\n costingVersion.version === currentVersion &&\n current\n }\n
\n\n
\n {costingVersion.description}\n
\n
\n \n ))\n }\n \n
\n );\n}\n\nexport default ChangeCostingVersionButton;\n","import { isEmpty } from 'lodash';\nimport React, { Fragment, useCallback, useEffect, useState } from 'react';\nimport { Button, Card, Modal } from 'react-bootstrap';\nimport { useDispatch } from \"react-redux\";\nimport { Link } from 'react-router-dom';\nimport { Nullable } from \"../../../../types/utils\";\nimport * as Api from \"../../../api\";\nimport { OrderCategory, OrderCostingVersion, TApiOrderDetails } from '../../../api/endpoints/Order';\nimport { TOrderProduct } from \"../../../api/endpoints/OrderProduct\";\nimport Col from '../../../components/Common/Col';\nimport Row from '../../../components/Common/Row';\nimport LoadingIndicator from \"../../../components/Feedback/LoadingIndicator\";\nimport {\n AdditionalChargesFootnote,\n EPUOldLicenseNotice,\n LimitCapacityFootnote,\n ResearchAndSmallBusinessFootnote\n} from '../../../components/Footnotes';\nimport ExternalLink, { MailLink } from '../../../components/Navigation/Links/ExternalLink';\nimport OrderName from \"../../../components/OrderName\";\nimport OrderPDFButton from \"../../../components/OrderPDFButton\";\nimport OrderSubmissionForm from \"../../../components/OrderSubmissionForm\";\nimport OrderSubmissionFormCompatibility from \"../../../components/OrderSubmissionFormCompatibility\";\nimport Disclaimer from \"../../../components/Ui/Disclaimer\";\nimport { UserType } from '../../../entities/User';\nimport useOrderCostingVersion from \"../../../hooks/useOrderCostingVersion\";\nimport DisseminationRequestPolicy from \"../../../policies/DisseminationRequestPolicy\";\nimport OrderPolicy from '../../../policies/OrderPolicy';\nimport { paths } from \"../../../router\";\nimport { fetchOrderDetails } from \"../../../store/action-creators/orders\";\nimport DateTime from \"../../../utils/DateTime\";\nimport { formatVolumeBand } from \"../../../utils/Format\";\nimport OrderHelpers from \"../../../utils/OrderHelpers\";\nimport OrderExpirationAlert from \"../ExpirationAlert\";\nimport LicenceDetails from \"../LicenceDetails\";\nimport MaxChargeWarning from \"../MaxChargeWarning\";\nimport OrderCostSummary from \"../OrderCostSummary\";\nimport OrderCostWithPackage from \"../OrderCostWithPackage\";\nimport RealtimeOrderDetails from \"../OrderDetails/RealtimeOrderDetails\";\nimport OrderHeader from '../OrderHeader';\nimport { OrderProps } from '../types';\nimport ChangeCostingVersionButton from \"./ChangeCostingVersionButton\";\n\ntype Props = OrderProps & {\n order: TApiOrderDetails;\n}\n\nconst RealtimeOrder = (props: Props) => {\n const {\n user,\n order,\n sets,\n countries,\n providers,\n servicePackages,\n serviceCharges,\n chosenProvider,\n chosenDataDeliverer,\n chosenServicePackage,\n chosenVolumeBand,\n onSubmitClick,\n submissionDialogOpen,\n setSubmissionDialogOpen,\n onSubmissionComplete,\n onApprove,\n onReject,\n onCancel\n } = props;\n\n const [products, setProducts] = useState>>([]);\n const [error, setError] = useState>(null)\n const dispatch = useDispatch();\n const hasCostError = Boolean(order.cost.data && order.cost.data.error);\n const { orderCostingVersions, currentOrderCostingVersion } = useOrderCostingVersion(order);\n const isOrderExpired = OrderHelpers.isExpired(order, orderCostingVersions ?? []);\n\n useEffect(() => {\n Api.OrderProduct.list(order.id)\n .then(setProducts)\n .catch(() => setError('Sorry! We were unable to fetch products.'));\n }, [order.id, order.updated]);\n\n const onProductDuplicate = useCallback((newProduct) => {\n Api.OrderProduct.list(order.id)\n .then(products => {\n setProducts(products);\n dispatch(fetchOrderDetails(order.id.toString(), true));\n })\n .catch(() => setError('Sorry! We were unable to fetch products.'));\n }, [dispatch, order.id]);\n\n const onProductRemove = useCallback((product) => {\n Api.OrderProduct.list(order.id)\n .then(products => {\n setProducts(products);\n dispatch(fetchOrderDetails(order.id, true));\n })\n .catch(() => setError('Sorry! We were unable to fetch products.'));\n }, [dispatch, order.id]);\n\n const onCostVersionChange = (version: OrderCostingVersion['version']) => {\n Api.Order.setCostingVersion(order.id, version).then(() => {\n dispatch(fetchOrderDetails(order.id, true));\n });\n }\n\n if (!orderCostingVersions) {\n return ;\n }\n\n return (\n \n {\n isOrderExpired &&\n \n }\n\n \n\n \n \n Order name: \n \n \n\n {\n user.type === UserType.Customer &&\n \n\n \n Click on the following link to read about\n {' '}\n \n data pricing and discounts\n \n .\n \n \n }\n\n {\n user.type !== UserType.Customer &&\n \n \n Customer: {order.customer}\n  ()\n \n \n }\n\n {\n order.start_date &&\n \n \n Start date: {DateTime.Format.dateLong(order.start_date)}\n \n \n }\n\n {\n chosenProvider &&\n \n \n Licensor: {chosenProvider.name}\n \n \n }\n\n {\n chosenDataDeliverer &&\n \n \n Data deliverer: {chosenDataDeliverer.name}\n \n \n }\n\n {\n chosenServicePackage &&\n \n \n Service Package: {chosenServicePackage.title}\n \n \n }\n\n {\n chosenVolumeBand &&\n \n \n Volume Band: {formatVolumeBand(chosenVolumeBand)} per day\n \n \n }\n\n \n\n\n
\n {\n OrderPolicy.canSetCostingVersion(user, order) &&\n !isOrderExpired &&\n orderCostingVersions.length > 1 &&\n \n }\n
\n\n \n \n \n\n {\n !isEmpty(order.cost) &&\n \n }\n />\n }\n\n\n \n \n\n {\n order.cost.data.total_cost?.max_charge &&\n
\n \n
\n }\n\n \n \n
\n {\n OrderPolicy.canApprove(user, order) &&\n \n \n Approve order\n \n \n }\n\n {\n OrderPolicy.canReject(user, order) &&\n \n \n Reject order\n \n \n }\n\n {\n OrderPolicy.canCancel(user, order) &&\n \n \n Cancel order\n \n \n }\n\n {\n OrderPolicy.canSubmit(user, order, orderCostingVersions) &&\n \n \n Submit order\n \n \n }\n\n setSubmissionDialogOpen(false)}>\n \n Submit order\n \n\n \n \n {\n currentOrderCostingVersion &&\n \n }\n \n \n \n\n\n {\n OrderPolicy.canAddProduct(user, order, orderCostingVersions) &&\n \n Add another product\n \n }\n\n \n\n {\n DisseminationRequestPolicy.canAccess(user, order) && !hasCostError &&\n \n Dissemination Request\n \n }\n
\n \n
\n\n
\n \n

\n \n

\n\n

\n \n

\n\n

\n \n

\n\n

\n \n

\n
\n
\n
\n );\n}\n\nexport default RealtimeOrder;\n","\nimport sanitize from \"sanitize-html\";\nimport { useSelector } from \"react-redux\";\nimport { selectArchiveTerms } from \"../../../../store/selectors/DataSelectors\";\nimport * as React from \"react\";\n\ninterface IProps {\n}\n\nconst sanitizeOptions: sanitize.IOptions = {\n ...sanitize.defaults,\n allowedTags: [...sanitize.defaults.allowedTags, \"head\"], // allow head tag...\n exclusiveFilter: f => f.tag === \"head\", // so that filter can remove tag AND contents,\n disallowedTagsMode: 'discard'\n};\n\nfunction safeParseHtml(html: string): { __html: string } {\n return {\n __html: sanitize(html, sanitizeOptions)\n };\n}\n\nconst ArchiveOrderDetails = (props: IProps) => {\n const terms = useSelector(selectArchiveTerms);\n\n return
\n}\n\nexport default ArchiveOrderDetails;\n","import { isEmpty } from 'lodash';\nimport React, { Fragment, useEffect, useState } from 'react';\nimport { Button, Card, Modal } from 'react-bootstrap';\nimport { Nullable } from \"../../../../types/utils\";\nimport * as Api from \"../../../api\";\nimport { costingVersions, OrderCategory, OrderCostingVersion, TApiOrderDetails } from \"../../../api/endpoints/Order\";\nimport Col from '../../../components/Common/Col';\nimport Row from '../../../components/Common/Row';\nimport LoadingIndicator from \"../../../components/Feedback/LoadingIndicator\";\nimport { ResearchAndSmallBusinessFootnote } from \"../../../components/Footnotes\";\nimport { MailLink } from '../../../components/Navigation/Links/ExternalLink';\nimport OrderName from \"../../../components/OrderName\";\nimport OrderPDFButton from \"../../../components/OrderPDFButton\";\nimport OrderSubmissionForm from \"../../../components/OrderSubmissionForm\";\nimport OrderSubmissionFormCompatibility from \"../../../components/OrderSubmissionFormCompatibility\";\nimport Disclaimer from \"../../../components/Ui/Disclaimer\";\nimport { UserType } from '../../../entities/User';\nimport useOrderCostingVersion from \"../../../hooks/useOrderCostingVersion\";\nimport OrderPolicy from '../../../policies/OrderPolicy';\nimport DateTime from \"../../../utils/DateTime\";\nimport OrderHelpers from \"../../../utils/OrderHelpers\";\nimport OrderExpirationAlert from \"../ExpirationAlert\";\nimport LicenceDetails from \"../LicenceDetails\";\nimport OrderCostSummary from \"../OrderCostSummary\";\nimport ArchiveOrderDetails from '../OrderDetails/ArchiveOrderDetails';\nimport OrderHeader from '../OrderHeader';\nimport { OrderProps } from '../types';\n\ntype Props = OrderProps & {\n order: TApiOrderDetails;\n}\n\nconst ArchiveOrder = (props: Props) => {\n const {\n user,\n order,\n sets,\n countries,\n providers,\n chosenProvider,\n onSubmitClick,\n submissionDialogOpen,\n setSubmissionDialogOpen,\n onSubmissionComplete,\n onApprove,\n onReject,\n onCancel\n } = props;\n const { orderCostingVersions, currentOrderCostingVersion } = useOrderCostingVersion(order);\n const isOrderExpired = OrderHelpers.isExpired(order, orderCostingVersions ?? []);\n\n const hasCostError = Boolean(order.cost.data && order.cost.data.error);\n\n if (!orderCostingVersions) {\n return ;\n }\n\n return (\n \n {\n isOrderExpired &&\n \n }\n\n \n\n \n \n Order name: \n \n \n\n {\n user.type !== UserType.Customer &&\n \n\n \n Customer: {order.customer}\n  ()\n \n \n }\n\n {\n order.start_date &&\n \n \n Start date: {DateTime.Format.dateLong(order.start_date)}\n \n \n }\n\n {\n chosenProvider &&\n \n \n Licensor: {chosenProvider.name}\n \n \n }\n\n \n\n \n \n \n\n {\n !isEmpty(order.cost) &&\n \n }\n \n \n\n \n \n
\n {\n OrderPolicy.canApprove(user, order) &&\n \n \n Approve order\n \n \n }\n\n {\n OrderPolicy.canReject(user, order) &&\n \n \n Reject order\n \n \n }\n\n {\n OrderPolicy.canCancel(user, order) &&\n \n \n Cancel order\n \n \n }\n\n {\n OrderPolicy.canSubmit(user, order, orderCostingVersions) &&\n \n \n Submit order\n \n \n }\n\n setSubmissionDialogOpen(false)}>\n \n Submit order\n \n\n \n \n {\n currentOrderCostingVersion &&\n \n }\n \n \n \n\n \n
\n \n
\n\n
\n \n

\n \n

\n
\n
\n
\n );\n}\n\nexport default ArchiveOrder;\n","import * as React from 'react';\n\nconst WebOrderDetails = () => {\n return (\n
\n

\n This licence provides access to ecCharts, which is ECMWF's interactive interface for visualising ECMWF real-time\n data (note: no raw data is accessible from this interface). Users may request a one-month trial of ecCharts to\n evaluate its functionality. Trials are granted at Licensor discretion.\n

\n\n

\n Please note that access to all web products is provided on an ‘as is’ basis. The product range is adjusted in\n the light of experience and in response to the evolution of the forecasting system; newly developed products are\n added, but others may be discontinued, at the discretion of ECMWF.\n

\n
\n )\n}\n\nexport default WebOrderDetails;\n","import { isEmpty } from 'lodash';\nimport React, { Fragment } from 'react';\nimport { Button, Card, Modal } from 'react-bootstrap';\nimport { OrderCategory } from \"../../../api/endpoints/Order\";\nimport Col from '../../../components/Common/Col';\nimport Row from '../../../components/Common/Row';\nimport LoadingIndicator from \"../../../components/Feedback/LoadingIndicator\";\nimport { MailLink } from '../../../components/Navigation/Links/ExternalLink';\nimport OrderName from \"../../../components/OrderName\";\nimport OrderPDFButton from \"../../../components/OrderPDFButton\";\nimport OrderSubmissionForm from \"../../../components/OrderSubmissionForm\";\nimport OrderSubmissionFormCompatibility from \"../../../components/OrderSubmissionFormCompatibility\";\nimport { UserType } from '../../../entities/User';\nimport useOrderCostingVersion from \"../../../hooks/useOrderCostingVersion\";\nimport OrderPolicy from '../../../policies/OrderPolicy';\nimport DateTime from \"../../../utils/DateTime\";\nimport OrderHelpers from \"../../../utils/OrderHelpers\";\nimport OrderExpirationAlert from \"../ExpirationAlert\";\nimport LicenceDetails from \"../LicenceDetails\";\nimport OrderCostSummary from \"../OrderCostSummary\";\nimport WebOrderDetails from '../OrderDetails/WebOrderDetails';\nimport OrderHeader from '../OrderHeader';\nimport { OrderProps } from '../types';\n\nconst WebOrder = (props: OrderProps) => {\n const {\n user,\n order,\n sets,\n countries,\n providers,\n chosenProvider,\n onSubmitClick,\n submissionDialogOpen,\n setSubmissionDialogOpen,\n onSubmissionComplete,\n onApprove,\n onReject,\n onCancel\n } = props;\n const { orderCostingVersions, currentOrderCostingVersion } = useOrderCostingVersion(order);\n const isOrderExpired = OrderHelpers.isExpired(order, orderCostingVersions ?? []);\n\n const hasCostError = Boolean(order.cost.data && order.cost.data.error);\n\n if (!orderCostingVersions) {\n return ;\n }\n\n return (\n \n {\n isOrderExpired &&\n \n }\n\n \n\n \n \n Order name: \n \n \n\n {\n user.type !== UserType.Customer &&\n \n \n Customer: {order.customer}\n  ()\n \n \n }\n\n {\n order.start_date &&\n \n \n Start date: {DateTime.Format.dateLong(order.start_date)}\n \n \n }\n\n {\n chosenProvider &&\n \n \n Licensor: {chosenProvider.name}\n \n \n }\n\n \n\n \n \n \n\n {\n !isEmpty(order.cost) &&\n \n }\n \n \n\n \n \n
\n {\n OrderPolicy.canApprove(user, order) &&\n \n \n Approve order\n \n \n }\n\n {\n OrderPolicy.canReject(user, order) &&\n \n \n Reject order\n \n \n }\n\n {\n OrderPolicy.canCancel(user, order) &&\n \n \n Cancel order\n \n \n }\n\n {\n OrderPolicy.canSubmit(user, order, orderCostingVersions) &&\n \n \n Submit order\n \n \n }\n\n setSubmissionDialogOpen(false)}>\n \n Submit order\n \n\n \n \n {\n currentOrderCostingVersion &&\n \n }\n \n \n \n\n \n
\n \n
\n
\n );\n}\n\nexport default WebOrder;\n","import React, { useCallback } from \"react\";\nimport { formatParameterNameWithShortname, formatSubsetLabel } from \"../../../../../utils/Format\";\nimport SubsetTypes from \"../../../../../utils/SubsetTypes\";\nimport IconButton from \"../../../../Buttons/IconButton\";\nimport { faTrash } from \"@fortawesome/free-solid-svg-icons\";\nimport { TParameterSelection } from \"../../../index\";\n\ninterface Props {\n item: TParameterSelection;\n onRemove?: (item: TParameterSelection) => void;\n}\n\nconst computeIndexKey = (item: TParameterSelection) => {\n return `${item.parameter.id}-${item.subset.id}`;\n}\n\nconst SelectedParametersItem = (props: Props) => {\n const { item, onRemove } = props;\n const shouldRenderActions = Boolean(onRemove);\n\n const onItemRemove = useCallback(() => {\n onRemove?.(item);\n }, [item, onRemove]);\n\n return (\n \n {formatParameterNameWithShortname(item.parameter)}\n {formatSubsetLabel(item.subset)}\n {SubsetTypes.humanize(item.subset.type)}\n {\n shouldRenderActions &&\n \n {\n onRemove &&\n \n }\n \n }\n \n )\n}\n\nexport default SelectedParametersItem;\n","import { Table } from \"react-bootstrap\";\nimport { map } from \"lodash\";\nimport React from \"react\";\nimport { SelectionState, TParameterSelection } from \"../../index\";\nimport SelectedParametersItem from \"./SelectedParametersItem\";\n\ninterface Props {\n selection: SelectionState;\n onParameterRemove?: (item: TParameterSelection) => void;\n}\n\nconst SelectedParametersList = (props: Props) => {\n const { selection, onParameterRemove } = props;\n const selectionCount = Object.keys(selection).length;\n const shouldRenderActionsColumn = Boolean(onParameterRemove);\n\n return (\n \n \n \n \n \n \n {\n shouldRenderActionsColumn &&\n \n }\n \n \n \n {\n selectionCount === 0 &&\n \n \n \n }\n {\n map(\n selection,\n (s =>\n \n )\n )\n }\n \n
ParameterSubset nameSubset type
\n You have no selected parameters. Please, select up to 15 parameters.\n
\n )\n}\n\nexport default SelectedParametersList;\n","import * as React from \"react\";\nimport { UserType } from \"../../../entities/User\";\n\ntype Props = {\n userType?: UserType;\n referenceNumber: number;\n};\n\n/**\n * Control for displaying an order reference.\n */\nconst ReferenceNumber = (props: Props) => (\n
\n Reference number: {props.referenceNumber}\n
\n);\n\nexport default ReferenceNumber;\n","import React from \"react\"\nimport { OrderCategory, TApiOrderDetails } from \"../../../../api/endpoints/Order\";\nimport Row from \"react-bootstrap/Row\";\nimport Col from \"react-bootstrap/Col\";\nimport { productDailyFields, productDailyVolume, productTotalEpu } from \"../../../../utils/Cost\";\n\ninterface IProps {\n order: TApiOrderDetails;\n epuFootnoteRef?: string;\n}\n\nconst EuCutOutProductCost = (props: IProps) => {\n const { order, epuFootnoteRef } = props;\n\n const productCost = order.cost.data.per_product?.[0]; // there's max one product\n\n if (!productCost) {\n return null;\n }\n\n return (\n
\n \n \n Total daily volume\n \n \n \n {productDailyVolume(productCost)}\n \n \n \n
\n )\n}\n\nexport default EuCutOutProductCost;\n\n","import { isEmpty } from \"lodash\";\nimport React, { Fragment, useEffect, useState } from \"react\";\nimport { Button, Card, Modal } from \"react-bootstrap\";\nimport { useSelector } from \"react-redux\";\nimport { Link } from 'react-router-dom';\nimport { Nullable } from \"../../../../types/utils\";\nimport * as Api from \"../../../api\";\nimport { OrderCategory, TApiOrderDetails } from \"../../../api/endpoints/Order\";\nimport { TOrderProduct } from \"../../../api/endpoints/OrderProduct\";\nimport Col from \"../../../components/Common/Col\";\nimport Row from \"../../../components/Common/Row\";\nimport SelectedParametersList from \"../../../components/EuCutOutConfigurator/ParametersSelector/SelectedParametersList\";\nimport LoadingIndicator from \"../../../components/Feedback/LoadingIndicator\";\nimport {\n AdditionalChargesFootnote,\n LimitCapacityFootnote,\n ResearchAndSmallBusinessFootnote\n} from \"../../../components/Footnotes\";\nimport { MailLink } from \"../../../components/Navigation/Links/ExternalLink\";\nimport OrderName from \"../../../components/OrderName\";\nimport OrderPDFButton from \"../../../components/OrderPDFButton\";\nimport OrderSubmissionForm from \"../../../components/OrderSubmissionForm\";\nimport OrderSubmissionFormCompatibility from \"../../../components/OrderSubmissionFormCompatibility\";\nimport Disclaimer from \"../../../components/Ui/Disclaimer\";\nimport ReferenceNumber from \"../../../components/Ui/ReferenceNumber\";\nimport { UserType } from \"../../../entities/User\";\nimport useOrderCostingVersion from \"../../../hooks/useOrderCostingVersion\";\nimport DisseminationRequestPolicy from \"../../../policies/DisseminationRequestPolicy\";\nimport OrderPolicy from \"../../../policies/OrderPolicy\";\nimport { paths } from \"../../../router\";\nimport { selectParameters } from \"../../../store/selectors/new/parameters\";\nimport DateTime from \"../../../utils/DateTime\";\nimport EuCutOutProductHelpers from \"../../../utils/EuCutOutProductHelpers\";\nimport { formatVolumeBand } from \"../../../utils/Format\";\nimport OrderHelpers from \"../../../utils/OrderHelpers\";\nimport OrderExpirationAlert from \"../ExpirationAlert\";\nimport LicenceDetails from \"../LicenceDetails\";\nimport OrderCostSummary from \"../OrderCostSummary\";\nimport OrderCostWithPackage from \"../OrderCostWithPackage\";\nimport OrderHeader from \"../OrderHeader\";\nimport { OrderProps } from \"../types\";\nimport EuCutOutProductCost from \"./EuCutOutProductCost\";\n\ntype Props = OrderProps & {\n order: TApiOrderDetails;\n}\n\n\nconst EuCutOutOrder = (props: Props) => {\n const {\n user,\n order,\n sets,\n countries,\n providers,\n servicePackages,\n serviceCharges,\n chosenProvider,\n chosenDataDeliverer,\n chosenServicePackage,\n chosenVolumeBand,\n onSubmitClick,\n submissionDialogOpen,\n setSubmissionDialogOpen,\n onSubmissionComplete,\n onApprove,\n onReject,\n onCancel\n } = props;\n\n const availableParams = useSelector(selectParameters);\n const [product, setProduct] = useState>>(null);\n const [error, setError] = useState>(null);\n const hasCostError = Boolean(order.cost.data && order.cost.data.error);\n const { orderCostingVersions, currentOrderCostingVersion } = useOrderCostingVersion(order);\n const isOrderExpired = OrderHelpers.isExpired(order, orderCostingVersions ?? []);\n\n useEffect(() => {\n Api.OrderProduct.list(order.id)\n .then((products) => setProduct(products[0]))\n .catch(() => setError('Sorry! We were unable to fetch products.'));\n }, []);\n\n\n if (!product || !orderCostingVersions || isEmpty(availableParams)) {\n return ;\n }\n\n const selection = EuCutOutProductHelpers.deriveParameterSelection(product, sets, availableParams);\n\n return (\n \n {\n isOrderExpired &&\n \n }\n\n \n\n \n \n Order name: \n \n \n\n {\n user.type !== UserType.Customer &&\n \n \n Customer: {order.customer}\n  ()\n \n \n }\n\n {\n order.start_date &&\n \n \n Start date: {DateTime.Format.dateLong(order.start_date)}\n \n \n }\n\n {\n chosenProvider &&\n \n \n Licensor: {chosenProvider.name}\n \n \n }\n\n {\n chosenDataDeliverer &&\n \n \n Data deliverer: {chosenDataDeliverer.name}\n \n \n }\n\n {\n chosenServicePackage &&\n \n \n Service Package: {chosenServicePackage.title}\n \n \n }\n\n {\n chosenVolumeBand &&\n \n \n Volume Band: {formatVolumeBand(chosenVolumeBand)} per day\n \n \n }\n\n \n\n \n \n \n \n \n\n \n {\n product &&\n \n
\n
\n Parameters:\n
\n \n
\n\n
\n High frequency products:\n  {product.data.high_frequency ? 'Yes' : 'No'}\n
\n\n {\n order.cost.version === 'v1' &&\n \n }\n\n {\n !isEmpty(order.cost) &&\n \n }\n />\n }\n
\n }\n
\n\n \n \n
\n {\n OrderPolicy.canApprove(user, order) &&\n \n \n Approve order\n \n \n }\n\n {\n OrderPolicy.canReject(user, order) &&\n \n \n Reject order\n \n \n }\n\n {\n OrderPolicy.canCancel(user, order) &&\n \n \n Cancel order\n \n \n }\n\n {\n OrderPolicy.canSubmit(user, order, orderCostingVersions) &&\n \n \n Submit order\n \n \n }\n\n {\n OrderPolicy.canEdit(user, order, orderCostingVersions) &&\n \n \n Edit order\n \n \n }\n\n\n setSubmissionDialogOpen(false)}>\n \n Submit order\n \n\n \n \n {\n currentOrderCostingVersion &&\n \n }\n \n \n \n\n \n\n {\n DisseminationRequestPolicy.canAccess(user, order) && !hasCostError &&\n \n Dissemination Request\n \n }\n
\n \n
\n\n
\n \n

\n \n

\n\n

\n \n

\n\n

\n \n

\n
\n
\n
\n )\n}\n\nexport default EuCutOutOrder;\n","import React, { MouseEvent, useCallback, useEffect, useState } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { useParams } from 'react-router-dom';\nimport useOrderCostingVersion from \"../../hooks/useOrderCostingVersion\";\nimport { selectUser } from '../../store/selectors/UserSelectors';\nimport { approveOrder, cancelOrder, fetchOrderDetails, rejectOrder } from \"../../store/action-creators/orders\";\nimport { TRootState } from \"../../store/reducers/RootReducer\";\nimport { TOrdersByIdState } from \"../../store/reducers/ordersById\";\nimport { TApiSet } from \"../../api/endpoints/Set\";\nimport * as Api from \"../../api\";\nimport { find } from 'lodash';\nimport { TApiCountry } from \"../../api/endpoints/Country\";\nimport { TApiProvider } from \"../../api/endpoints/Provider\";\nimport RealtimeOrder from './RealtimeOrder';\nimport ArchiveOrder from './ArchiveOrder';\nimport WebOrder from './WebOrder';\nimport LoadingIndicator from \"../../components/Feedback/LoadingIndicator\";\nimport { OrderCategory, TApiOrderDetails } from \"../../api/endpoints/Order\";\nimport EuCutOutOrder from \"./EuCutOutOrder\";\nimport { TApiServicePackage } from \"../../api/endpoints/ServicePackage\";\nimport { TApiVolumeBand } from \"../../api/endpoints/VolumeBand\";\nimport { TApiServiceCharge } from \"../../api/endpoints/ServiceCharge\";\n\ninterface IRouteParams {\n id: string;\n}\n\nconst Order = () => {\n const params = useParams();\n const dispatch = useDispatch();\n\n const user = useSelector(selectUser);\n\n const orderState = useSelector(store => store.ordersById[params.id])\n const order = orderState?.data;\n\n const [submissionDialogOpen, setSubmissionDialogOpen] = useState(false);\n const [sets, setSets] = useState | null>(null);\n const [countries, setCountries] = useState | null>(null);\n const [providers, setProviders] = useState | null>(null);\n const [servicePackages, setServicePackages] = useState | null>(null);\n const [volumeBands, setVolumeBands] = useState | null>(null);\n const [serviceCharges, setServiceCharges] = useState | null>(null);\n const { orderCostingVersions, currentOrderCostingVersion } = useOrderCostingVersion(order);\n\n const onSubmitClick = useCallback((event: MouseEvent) => {\n setSubmissionDialogOpen(true);\n }, []);\n\n const onApprove = useCallback((event: MouseEvent) => {\n event.preventDefault();\n order && dispatch(approveOrder(order));\n }, [dispatch, order]);\n\n const onReject = useCallback((event: MouseEvent) => {\n event.preventDefault();\n order && dispatch(rejectOrder(order));\n }, [dispatch, order]);\n\n const onCancel = useCallback((event: MouseEvent) => {\n event.preventDefault();\n order && dispatch(cancelOrder(order));\n }, [dispatch, order]);\n\n const onSubmissionComplete = useCallback(() => {\n setSubmissionDialogOpen(false);\n window.scrollTo({ top: 0 });\n }, []);\n\n useEffect(() => {\n dispatch(fetchOrderDetails(params.id));\n }, [dispatch, params.id])\n\n useEffect(() => {\n Api.Set.list().then(setSets);\n Api.Provider.list().then(setProviders);\n Api.Country.list().then(setCountries);\n }, []);\n\n useEffect(() => {\n Api.VolumeBand.list().then(setVolumeBands);\n Api.ServiceCharge.list({ service_charge_model_id: currentOrderCostingVersion?.service_charge_model_id })\n .then(serviceCharges => {\n setServiceCharges(serviceCharges);\n\n Api.ServicePackage.list().then(servicePackages => {\n const supportedServicePackageIds = serviceCharges.reduce((acc, sc) => {\n acc.add(sc.service_package_id);\n\n return acc;\n }, new Set());\n\n const supportedServicePackages = servicePackages.filter(sp => supportedServicePackageIds.has(sp.id));\n setServicePackages(supportedServicePackages);\n });\n });\n }, [currentOrderCostingVersion]);\n\n if (!order || orderState?.loading || !sets || !providers || !countries || !servicePackages || !volumeBands || !serviceCharges) {\n return ;\n }\n\n const chosenProvider = find(providers, provider => provider.id === order.ccp_organisation);\n const chosenDataDeliverer = find(providers, provider => provider.id === order.data_deliverer_organisation_id);\n const chosenServicePackage = find(servicePackages, (sp) => sp.id === order.service_package_id);\n const chosenVolumeBand = find(volumeBands, vb => vb.id === order.volume_band_id);\n\n const commonProps = {\n user,\n sets,\n countries,\n providers,\n servicePackages,\n serviceCharges,\n chosenProvider,\n chosenDataDeliverer,\n chosenServicePackage,\n chosenVolumeBand,\n onSubmitClick,\n submissionDialogOpen,\n setSubmissionDialogOpen,\n onSubmissionComplete,\n onApprove,\n onReject,\n onCancel\n }\n\n if (order.category === OrderCategory.REALTIME) {\n return } {...commonProps} />;\n } else if (order.category === OrderCategory.ARCHIVE) {\n return } {...commonProps} />;\n } else if (order.category === OrderCategory.WEB) {\n return } {...commonProps} />;\n } else if (order.category === OrderCategory.EU_CUTOUT) {\n return } {...commonProps} />;\n } else {\n return null;\n }\n}\n\nexport default Order;\n","import React, { Fragment, ReactNode, useEffect, useCallback } from 'react';\nimport { Prompt } from 'react-router';\n\ninterface IProps {\n enabled: boolean;\n children: ReactNode\n}\n\nconst BeforeUnload = (props: IProps) => {\n const { enabled, children } = props;\n\n const onUnload = useCallback((event: BeforeUnloadEvent) => {\n if (!enabled) {\n return null;\n }\n\n event.preventDefault();\n event.returnValue = 'You have unsaved changes. Please save them before leaving this page.';\n }, [enabled])\n\n useEffect(() => {\n window.addEventListener('beforeunload', onUnload);\n\n return () => {\n window.removeEventListener('beforeunload', onUnload);\n }\n }, [onUnload, enabled])\n\n return (\n \n \n {\n children\n }\n \n )\n}\n\nexport default BeforeUnload;\n","import * as React from \"react\";\n\nclass CheckboxWrap extends React.Component {\n\tpublic render() {\n\t\treturn (\n\t\t\t
\n\t\t\t\t
{this.props.children}
\n\t\t\t
\n\t\t);\n\t}\n}\n\nexport default CheckboxWrap;\n","import React, { MouseEvent, useCallback } from 'react';\nimport classNames from 'classnames';\n\ninterface IProps {\n values: Array;\n onChange: (values: Array) => void;\n className?: string;\n}\n\nconst SelectAllControl = (props: IProps) => {\n const { values, onChange, className } = props;\n\n const onSelect = useCallback((event: MouseEvent) => {\n event.preventDefault();\n onChange(values);\n }, [onChange, values]);\n\n const onClear = useCallback((event: MouseEvent) => {\n event.preventDefault();\n onChange([]);\n }, [onChange]);\n\n return (\n
\n \n \n
\n )\n}\n\nexport default SelectAllControl;\n","import React, { Fragment } from 'react';\nimport { TRunOption } from '../../../api/endpoints/SubsetOption';\nimport { Day } from '../../../entities/Day';\nimport { formatRun } from '../../../utils/Format';\nimport Checkbox from '../../Inputs/Checkbox/Checkbox';\nimport CheckboxWrap from '../../Ui/CheckboxWrap';\nimport SelectAllControl from \"../SelectAllControl\";\n\nconst RunsSelector = (props: {\n values: Array;\n spec: TRunOption;\n onChange: (values: Array) => void;\n}) => {\n const { spec, values, onChange } = props;\n\n const options = spec.value.use;\n\n const onStepCheckboxChange = (value: string, checked: boolean) => {\n onChange(checked ? [...values, value] : values.filter(v => v !== value));\n };\n\n return (\n \n \n\n \n {\n options.map(option =>\n onStepCheckboxChange(option, checked)}\n />)\n }\n \n \n );\n};\n\nexport default RunsSelector;\n","import React from 'react';\nimport { Area } from '../../../entities/Area';\nimport { ProductLeg } from '../../../entities/ProductLeg';\nimport { makeResolution } from '../../../entities/Resolution';\nimport AreasEditor, { AreaAction } from '../../AreasEditor';\nimport { PresetObj } from '../../../api-entities/PresetArea';\n\ninterface IProps {\n values: Array;\n grids: Array;\n presetAreas: Array;\n userPresetAreas: Array;\n onChange: (areas: Array) => void;\n readonly?: boolean;\n}\n\nconst AreasSelector = (props: IProps) => {\n const { values, grids, onChange, presetAreas, userPresetAreas, readonly } = props;\n\n const suggestArea = React.useCallback(\n input =>\n Promise.resolve(\n presetAreas.filter(x => x.name.toLowerCase().startsWith(input.toLowerCase()))\n ),\n [presetAreas]\n );\n\n const handleAreaAction = React.useCallback(\n (action: AreaAction) => {\n switch (action.type) {\n case 'create':\n onChange([...values, action.area]);\n break;\n\n case 'update': {\n const newAreas = values.slice();\n newAreas[action.index] = action.area;\n onChange(newAreas);\n break;\n }\n\n case 'delete': {\n const newAreas = values.slice();\n newAreas.splice(action.index, 1);\n onChange(newAreas);\n break;\n }\n }\n },\n [values, onChange]\n );\n\n const productLegs: Map = new Map(grids.map((grid, index) => {\n return [index, {\n grid: makeResolution(grid)\n }]\n }));\n\n return (\n \n areaEntities={values}\n projectArea={area => area}\n handleAction={handleAreaAction}\n legs={productLegs}\n suggestArea={suggestArea}\n needsFocus={false}\n onBlur={() => undefined}\n acknowledgeFocusRequest={() => undefined}\n userPresetAreas={userPresetAreas}\n readonly={readonly}\n />\n )\n}\n\nexport default AreasSelector;\n","import React from \"react\";\nimport { Form } from \"react-bootstrap\";\nimport { PresetObj } from \"../../../../../api-entities/PresetArea\";\nimport { AreaOption } from \"../../../../../decoders/AreaOption\";\nimport { Area } from \"../../../../../entities/Area\";\nimport AreasSelector from \"../../../AreasSelector\";\nimport Footnote from \"../../../Footnote\";\nimport FormError from \"../../../FormError\";\nimport { FormikProductFormField, TFormErrorMessage } from \"../../index\";\n\ninterface Props extends FormikProductFormField {\n spec: AreaOption;\n presetAreas: Array;\n userPresetAreas: Array;\n onChange: (areas: Array) => void;\n}\n\nconst AreasField = (props: Props) => {\n const { formik, spec, presetAreas, userPresetAreas, onChange } = props;\n\n return (\n \n Areas\n\n \n\n \n\n \n \n )\n}\n\nexport default AreasField;\n","import React from \"react\";\nimport { last } from \"lodash\";\nimport { Radio } from \"../../Inputs/Radio\";\n\ninterface Props {\n values: Array;\n spec: Array;\n onChange: (values: Array) => void\n}\n\nconst EnsembleMembersSelector = (props: Props) => {\n const { spec, values, onChange } = props;\n const options = spec.filter(v => v === 50 || v === 100);\n const selectedOption = last(values.filter(v => v === 50 || v === 100))\n\n const onValueChange = (value: string | Array) => {\n if (value) {\n onChange(spec.filter(i => i <= Number(value)));\n } else {\n onChange([]);\n }\n }\n\n return (\n
\n {\n options.map(option => {\n return \n })\n }\n
\n\n )\n}\n\nexport default EnsembleMembersSelector;\n","import { range } from \"lodash\";\nimport React from \"react\";\nimport { Form } from \"react-bootstrap\";\nimport { TApiSubsetOptions, TNumberOption } from \"../../../../../api/endpoints/SubsetOption\";\nimport EnsembleMembersSelector from \"../../../EnsembleMembersSelector\";\nimport Footnote from \"../../../Footnote\";\nimport FormError from \"../../../FormError\";\nimport { FormikProductFormField, TFormErrorMessage } from \"../../index\";\n\ninterface Props extends FormikProductFormField {\n spec: TNumberOption;\n}\n\nexport const deriveNumberValuesFromSubsetOption = (number: NonNullable) => {\n const value = number.value.number[0];\n\n return range(Number(value.from), Number(value.to) + 1, Number(value.by));\n}\n\nconst EnsembleMembersField = (props: Props) => {\n const { formik, spec } = props;\n\n return (\n \n Ensemble members\n formik.setFieldValue('number', values)}\n />\n\n \n\n \n \n )\n}\n\nexport default EnsembleMembersField;\n","import React, { useCallback } from 'react';\nimport { TMonthOption } from '../../../api/endpoints/SubsetOption';\nimport Checkbox from '../../Inputs/Checkbox/Checkbox';\nimport Index from '../../Ui/CheckboxWrap';\nimport { flatMap, range, uniq } from 'lodash';\nimport SelectAllControl from \"../SelectAllControl\";\n\nconst specToOptions = (spec: TMonthOption): Array => {\n return uniq(\n flatMap(spec.value.fcmonth, item => {\n return range(\n parseInt(item.from, 10),\n parseInt(item.to, 10) + 1,\n 1\n );\n })\n );\n};\n\nconst MonthsSelector = (props: {\n values: Array;\n spec: TMonthOption;\n onChange: (values: Array) => void;\n}) => {\n const { values, spec, onChange } = props;\n const options = specToOptions(spec);\n\n const onCheckboxChange = useCallback((value: number, checked: boolean) => {\n onChange(checked ? [...values, value] : values.filter(v => v !== value));\n }, [onChange, values]);\n\n return (\n
\n \n\n \n {\n options.map(option =>\n onCheckboxChange(option, checked)}\n />)\n }\n \n
\n );\n};\n\nexport default MonthsSelector;\n","import React from \"react\";\nimport { Form } from \"react-bootstrap\";\nimport { TMonthOption } from \"../../../../../api/endpoints/SubsetOption\";\nimport Footnote from \"../../../Footnote\";\nimport FormError from \"../../../FormError\";\nimport MonthsSelector from \"../../../MonthsSelector\";\nimport { FormikProductFormField, TFormErrorMessage } from \"../../index\";\n\ninterface Props extends FormikProductFormField {\n spec: TMonthOption;\n}\n\nconst ForecastMonthsField = (props: Props) => {\n const { formik, spec } = props;\n\n return (\n \n Forecast months\n formik.setFieldValue('fcmonth', values)}\n />\n\n \n\n \n \n )\n}\n\nexport default ForecastMonthsField;\n","import { intersection, difference } from 'lodash';\nimport React, { useEffect, useMemo, useState, useCallback } from 'react';\nimport { DEFAULT_FACTORS } from '../../../../constants/Constants';\nimport { DaySteps } from '../../../../entities/Day';\nimport { stepsToDays } from '../../../../entities/Steps';\nimport { sortNumbers } from '../../../../utils/Array';\nimport Checkbox from '../../../Inputs/Checkbox/Checkbox';\nimport Index from '../../../Ui/CheckboxWrap';\nimport { Radio } from '../../../Inputs/Radio';\nimport { Row, Col } from 'react-bootstrap';\n\nconst minDiff = (values: Array): number => {\n let sorted = sortNumbers(values);\n\n return sorted.reduce((mem, value, index) => {\n const nextValue = sorted[index + 1];\n\n if (!nextValue) {\n return mem;\n }\n\n const diff = sorted[index + 1] - value;\n\n if (diff < mem || mem === 0) {\n mem = diff;\n }\n\n return mem;\n }, 0);\n};\n\nconst addDayStepsSelected = (values: Array, dayOption: DaySteps, increment: number) => {\n const stepsWithIncrement = dayOption.steps.filter(step => step % increment === 0);\n const inter = intersection(values, stepsWithIncrement);\n\n return inter.length > 0 && inter.length === stepsWithIncrement.length;\n}\n\nconst StepsByDayAndIncrementControl = (props: {\n values: Array;\n valuesPool: Array;\n onChange: (values: Array, strategy: 'add' | 'remove' | 'overwrite') => void;\n}) => {\n const { values, valuesPool, onChange } = props;\n const dayOptions = useMemo(() => stepsToDays(valuesPool), [valuesPool]);\n const minIncrement = useMemo(() => minDiff(valuesPool), [valuesPool]);\n const increments = DEFAULT_FACTORS.filter(factor => factor >= minIncrement);\n const nameSuffix = valuesPool[0];\n const minSelectedIncrement = useMemo(() => minDiff(values), [values]);\n\n const [selectedIncrement, setSelectedIncrement] = useState(minSelectedIncrement || minIncrement);\n const [selectedDays, setSelectedDays] = useState>([]);\n\n useEffect(() => {\n const days = dayOptions.reduce((acc: Array, dayOption) => {\n if (addDayStepsSelected(values, dayOption, selectedIncrement)) {\n acc.push(dayOption.day);\n }\n\n\n return acc;\n }, []);\n\n setSelectedDays(days);\n }, [dayOptions, values, selectedIncrement])\n\n const onStateChange = useCallback((newSelectedDays, newSelectedIncrement) => {\n let strategy: 'add' | 'remove' | 'overwrite';\n let options: Array;\n\n if (selectedIncrement !== newSelectedIncrement) {\n if (newSelectedDays.length === 0) {\n return;\n }\n\n strategy = 'overwrite';\n options = dayOptions.filter(option => selectedDays.includes(option.day));\n } else if (newSelectedDays.length > selectedDays.length) {\n strategy = 'add';\n options = dayOptions.filter(option => newSelectedDays.includes(option.day));\n } else {\n strategy = 'remove';\n options = dayOptions.filter(option => difference(selectedDays, newSelectedDays).includes(option.day));\n }\n\n const stepsToChange = options.reduce((mem: Array, option) => {\n mem = mem.concat(\n strategy === 'remove' ?\n [...option.steps]\n : option.steps.filter(step => step % newSelectedIncrement === 0)\n );\n\n return mem;\n }, []);\n\n onChange(stepsToChange, strategy);\n }, [dayOptions, onChange, selectedDays, selectedIncrement]);\n\n const onDayCheckboxChange = (dayOption: DaySteps, checked: boolean) => {\n const selected = checked ? selectedDays.concat(dayOption.day) : selectedDays.filter(d => d !== dayOption.day);\n onStateChange(selected, selectedIncrement);\n };\n\n const onIncrementChange = (increment: string | Array) => {\n onStateChange(selectedDays, parseInt(increment as string, 10));\n setSelectedIncrement(parseInt(increment as string, 10));\n };\n\n return (\n
\n \n \n \n {\n dayOptions.map(dayOption => {\n const stepsWithIncrement = dayOption.steps.filter(step => step % selectedIncrement === 0);\n const inter = intersection(values, stepsWithIncrement);\n const isIndeterminate = inter.length > 0 && inter.length < stepsWithIncrement.length;\n\n const checked = selectedDays.includes(dayOption.day) && !isIndeterminate;\n\n return onDayCheckboxChange(dayOption, checked)}\n />;\n })\n }\n \n \n\n \n {\n increments.map(increment => (\n )\n )\n }\n \n\n \n
\n );\n};\n\nexport default StepsByDayAndIncrementControl;\n","import {\n\tBASIC_SET,\n\tMID_RANGE_START,\n\tNO_STEPS_WARNING,\n\tSHORT_RANGE_WARNING\n} from \"../constants/Constants\";\nimport { DaySteps } from \"./Day\";\nimport { intersection } from \"lodash\";\n\n/**\n * Time steps for a forecast, both mandatory and optional.\n * There are expected to sometimes be overlaps between both categories (i.e. it's not a partition).\n */\nexport type Steps = {\n\tmandatory: number[];\n\toptional: number[];\n};\n\n/**\n * Converts a flattened steps back into a Steps object.\n */\nexport const restructureSteps = (steps: number[]): Steps => ({\n\tmandatory: [],\n\toptional: steps\n});\n\n/**\n * Groups time steps into days.\n */\nexport const stepsToDays = (steps: number[]) =>\n\tsteps.reduce(\n\t\t(days, step) => {\n\t\t\tconst day = step === 0 ? 1 : Math.ceil(step / 24);\n\t\t\tconst match = days.find(d => d.day === day);\n\t\t\tif (match == null) {\n\t\t\t\tdays.push({\n\t\t\t\t\tday,\n\t\t\t\t\tsteps: [step]\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tmatch.steps.push(step);\n\t\t\t}\n\t\t\treturn days;\n\t\t},\n\t\t[] as DaySteps[]\n\t);\n\n/**\n * Gets the mandatory steps given an array of optional steps.\n */\nexport const getMandatorySteps = (steps: number[], options: number[]): number[] => {\n\tconst mandatory = intersection(BASIC_SET, options);\n\n\tif (steps.some(s => s >= MID_RANGE_START && !mandatory.includes(s))) {\n\t\treturn [];\n\t}\n\n\treturn mandatory;\n};\n\n/**\n * Returns a string warning if necessary given some steps.\n */\nexport const getStepsWarning = (steps: Steps): string | undefined => {\n\tif (steps.mandatory.length === 0) {\n\t\treturn;\n\t}\n\n\treturn steps.optional.length === 0 ? NO_STEPS_WARNING : SHORT_RANGE_WARNING;\n};\n","import { range } from 'lodash';\nimport { TStepItem } from '../../api/endpoints/SubsetOption';\n\nconst deriveSteps = (stepItem: TStepItem) => {\n const start = parseInt(stepItem.from, 10);\n const end = parseInt(stepItem.to, 10)\n const step = parseInt(stepItem.by, 10);\n\n return range(\n start,\n end + step,\n step\n );\n};\n\nexport {\n deriveSteps\n}\n","import { SHORT_RANGE_WARNING } from \"../../../../constants/Constants\";\nimport { Alert } from \"react-bootstrap\";\nimport React from \"react\";\n\nconst MandatoryStepsWarning = () => {\n return (\n {SHORT_RANGE_WARNING}\n )\n}\n\nexport default MandatoryStepsWarning;\n","import { faCalendar } from '@fortawesome/free-regular-svg-icons';\nimport { faThLarge } from '@fortawesome/free-solid-svg-icons';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { difference, partition, union, uniq } from 'lodash';\nimport React, { Fragment, useEffect, useState } from 'react';\nimport { Nav, Tab } from 'react-bootstrap';\nimport { TStepItem, TStepLegsOption } from '../../../../api/endpoints/SubsetOption';\nimport { MANDATORY_STEPS } from '../../../../constants/Constants';\nimport { sortNumbers } from '../../../../utils/Array';\nimport { shouldApplyMandatorySteps } from \"../../../../utils/ProductFormHelpers\";\nimport { deriveSteps } from '../../../../utils/StepItem';\nimport Col from '../../../Common/Col';\nimport Row from '../../../Common/Row';\nimport Checkbox from '../../../Inputs/Checkbox/Checkbox';\nimport CheckboxWrap from \"../../../Ui/CheckboxWrap\";\nimport SelectAllControl from \"../../SelectAllControl\";\nimport MandatoryStepsWarning from '../MandatoryStepsWarning';\nimport StepsByDayAndIncrementControl from '../StepsByDayAndIncrementControl';\n\nexport const filterValuesByLeg = (leg: TStepItem, values: Array) => {\n const from = parseInt(leg.from, 10);\n const to = parseInt(leg.to, 10);\n\n return values.filter((value: string | number) => {\n const castedValue = parseInt(value.toString(), 10);\n\n return castedValue >= from && castedValue <= to;\n });\n};\n\nconst StepWithLegsControl = (props: {\n spec: TStepLegsOption,\n values: Array,\n onChange: (values: Array) => void;\n}) => {\n const { spec, values, onChange } = props;\n\n const [selectedSteps, setSelectedSteps] = useState>(values.map(v => parseInt(v, 10)));\n\n const applyMandatorySteps = shouldApplyMandatorySteps(selectedSteps);\n\n useEffect(() => {\n const updatedValues = sortNumbers(applyMandatorySteps ? uniq([...selectedSteps, ...MANDATORY_STEPS]) : selectedSteps);\n\n onChange(sortNumbers(updatedValues).map(v => v.toString()));\n }, [selectedSteps])\n\n const onDayOrIncrementChange = (leg: TStepItem) => (\n newValues: Array,\n strategy: 'add' | 'remove' | 'overwrite'\n ) => {\n const [currentLegValues, otherLegsValues] = partition(\n selectedSteps,\n (v) => v >= parseInt(leg.from, 10) && v <= parseInt(leg.to, 10)\n );\n let valuesToUpdate = [];\n\n switch (strategy) {\n case 'add':\n valuesToUpdate = union(currentLegValues, newValues);\n break;\n case 'remove':\n valuesToUpdate = difference(currentLegValues, newValues);\n break;\n case 'overwrite':\n valuesToUpdate = newValues;\n break;\n }\n\n setSelectedSteps(union(valuesToUpdate, otherLegsValues));\n }\n\n const onStepCheckboxChange = (value: number, checked: boolean) => {\n setSelectedSteps(checked ? [...selectedSteps, value] : selectedSteps.filter(v => v !== value));\n };\n\n const onSelectAll = (leg: TStepItem) => (values: Array) => {\n onDayOrIncrementChange(leg)(deriveSteps(leg), values.length === 0 ? 'remove' : 'add');\n }\n\n return (\n \n {\n spec.value.legs.map((leg, index) => {\n const legValuesPool = deriveSteps(leg);\n const legValues = filterValuesByLeg(leg, selectedSteps).map(v => parseInt(v.toString(), 10));\n\n return (\n
\n \n \n \n
Leg {index + 1}
\n \n \n \n \n \n
\n\n \n \n \n \n \n \n\n \n \n {\n legValuesPool.map(option => {\n const isMandatory = applyMandatorySteps && MANDATORY_STEPS.includes(option);\n\n return onStepCheckboxChange(option, checked)}\n disabled={isMandatory}\n />;\n })\n }\n \n \n \n \n \n \n
\n );\n })\n }\n {\n applyMandatorySteps &&\n \n }\n
\n\n );\n};\n\nexport default StepWithLegsControl;\n","import { TApiSubset } from \"../../api/endpoints/Subset\";\nimport { TApiSubsetOptions } from \"../../api/endpoints/SubsetOption\";\nimport { IProductFormValues } from \"../../components/RealtimeProductConfigurator/ProductForm\";\nimport { OrderCategory } from \"../../api/endpoints/Order\";\nimport {\n filterValuesByLeg\n} from \"../../components/RealtimeProductConfigurator/ForecastStepsSelector/StepWithLegsControl\";\nimport { map } from \"lodash\";\nimport { TOrderProductData } from \"../../api/endpoints/OrderProduct\";\n\nconst valuesToProduct = (\n subset: TApiSubset,\n subsetOptions: TApiSubsetOptions,\n values: IProductFormValues\n): TOrderProductData => {\n const product: TOrderProductData = {\n name: values.name,\n subset_id: subset.id,\n };\n\n if (subsetOptions.area) {\n product.area = values.areas;\n }\n\n if (subsetOptions.step) {\n const stepValue = subsetOptions.step.value;\n\n if ('legs' in stepValue) {\n product.legs = stepValue.legs.map((leg, index) => {\n const letSteps = filterValuesByLeg(leg, (values.steps as Array));\n\n return {\n step: letSteps.map(v => v.toString()),\n grid: values.grid[index]\n };\n });\n } else {\n product.step = values.steps.map(v => v.toString());\n product.grid = values.grid[0];\n }\n } else {\n if (values.grid.length) {\n product.grid = values.grid[0];\n }\n }\n\n if (subsetOptions.use_step) {\n product.use_step = values.use_step;\n }\n\n if (subsetOptions.use) {\n product.use = values.use.map(v => parseInt(v, 10));\n }\n\n if (subsetOptions.hindcast) {\n product.hindcast = values.hindcast === null ? null : values.hindcast.map(v => Number(v));\n }\n\n if (subsetOptions.number) {\n product.number = values.number;\n }\n\n if (subsetOptions.param) {\n product.param = values.param;\n }\n\n if (subsetOptions.param_levelist) {\n product.param_levelist = map(values.param_levelist, v => ({ param: v.param, level: parseInt(v.level, 10) }));\n }\n\n if (subsetOptions.param_quantile) {\n product.param_quantile = values.param_quantile;\n }\n\n if (subsetOptions.time) {\n product.time = values.time.map(v => parseInt(v, 10));\n }\n\n if (subsetOptions.time_step) {\n product.time_step = values.time_step;\n }\n\n if (subsetOptions.fcmonth) {\n product.fcmonth = values.fcmonth;\n }\n\n if (subsetOptions.channel) {\n product.channel = values.channel;\n }\n\n if (subset.list_of_choices.includes('location') && values.location) {\n product.location = values.location;\n }\n\n return product;\n};\n\nexport default valuesToProduct;\n","import { OrderCategory, QuoteProductLeg } from \"../../api/endpoints/Order\";\nimport {\n DEFAULT_PRODUCT_FORM_VALUES,\n IProductFormValues\n} from \"../../components/RealtimeProductConfigurator/ProductForm\";\nimport { compact, flatten, isUndefined } from \"lodash\";\nimport { formatBaseTime } from \"../Format\";\nimport { sortNumericStrings } from \"../Array\";\nimport { TOrderProductData } from \"../../api/endpoints/OrderProduct\";\n\nconst deriveStepsFromLeg = (leg: QuoteProductLeg): Array => {\n const step = leg.step;\n\n return step ? sortNumericStrings(step) : [];\n}\n\nconst extractLegsFromProduct = (product: TOrderProductData): Array => {\n const { legs } = product;\n\n return legs ?? [];\n}\n\nconst productToValues = (product: TOrderProductData | null): IProductFormValues => {\n const values: IProductFormValues = { ...DEFAULT_PRODUCT_FORM_VALUES };\n\n if (product) {\n const legs: Array = extractLegsFromProduct(product);\n\n values.name = product.name;\n\n if (legs.length) {\n values.steps = flatten(legs.map(deriveStepsFromLeg));\n values.grid = compact(legs.map(l => l.grid));\n }\n\n if (product.grid) {\n values.grid = [product.grid];\n }\n\n if (product.step) {\n values.steps = product.step;\n }\n\n if (product.number) {\n values.number = product.number;\n }\n\n if (product.area) {\n values.areas = product.area;\n }\n\n if (product.use) {\n values.use = product.use.map(v => v.toString());\n }\n\n if (product.hindcast) {\n values.hindcast = product.hindcast.map(v => v.toString());\n }\n\n if (product.fcmonth) {\n values.fcmonth = product.fcmonth;\n }\n\n if (product.param) {\n values.param = product.param;\n }\n\n if (product.param_levelist) {\n values.param_levelist = product.param_levelist.map(p => ({\n param: p.param,\n level: p.level.toString()\n }));\n }\n\n if (product.param_quantile) {\n values.param_quantile = product.param_quantile;\n }\n\n if (product.time) {\n values.time = product.time.map(formatBaseTime);\n }\n\n if (product.time_step) {\n values.time_step = product.time_step;\n }\n\n if (product.use_step) {\n values.use_step = product.use_step;\n }\n\n if (product.location) {\n values.location = product.location;\n }\n\n if (product.channel) {\n values.channel = product.channel\n }\n }\n\n return values;\n}\n\nexport default productToValues;\n","const shouldApplyMandatorySteps = (steps: Array) => {\n return Boolean(steps.find(step => step >= 12 && step <= 66));\n};\n\nexport default shouldApplyMandatorySteps\n","import { faCalendar } from '@fortawesome/free-regular-svg-icons';\nimport { faThLarge } from '@fortawesome/free-solid-svg-icons';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { flatMap, union, difference, uniq } from 'lodash';\nimport React, { useEffect, useState, useMemo } from 'react';\nimport { Nav, Tab } from 'react-bootstrap';\nimport { TStepsOption } from '../../../../api/endpoints/SubsetOption';\nimport { MANDATORY_STEPS } from '../../../../constants/Constants';\nimport { sortNumbers } from '../../../../utils/Array';\nimport Checkbox from '../../../Inputs/Checkbox/Checkbox';\nimport Index from '../../../Ui/CheckboxWrap';\nimport Col from '../../../Common/Col';\nimport Row from '../../../Common/Row';\nimport StepsByDayAndIncrementControl from '../StepsByDayAndIncrementControl';\nimport { deriveSteps } from '../../../../utils/StepItem';\nimport MandatoryStepsWarning from '../MandatoryStepsWarning';\nimport { shouldApplyMandatorySteps } from '../../../../utils/ProductFormHelpers';\nimport SelectAllControl from \"../../SelectAllControl\";\n\nconst StepOptionsControl = (props: {\n spec: TStepsOption;\n values: Array;\n onChange: (values: Array) => void;\n}) => {\n const { spec, values, onChange } = props;\n\n const [selectedSteps, setSelectedSteps] = useState>(values.map(v => parseInt(v, 10)));\n\n const options = useMemo(\n () => flatMap(spec.value.step, stepItem => deriveSteps(stepItem)),\n [spec.value.step]\n );\n\n const applyMandatorySteps = shouldApplyMandatorySteps(selectedSteps)\n\n useEffect(() => {\n const updatedValues = sortNumbers(applyMandatorySteps ? uniq([...selectedSteps, ...MANDATORY_STEPS]) : selectedSteps);\n\n onChange(updatedValues.map(v => v.toString()));\n }, [applyMandatorySteps, selectedSteps])\n\n const onDayOrIncrementChange = (newValues: Array, strategy: 'add' | 'remove' | 'overwrite') => {\n switch (strategy) {\n case 'add':\n setSelectedSteps(union(selectedSteps, newValues));\n return;\n case 'remove':\n setSelectedSteps(difference(selectedSteps, newValues));\n return;\n case 'overwrite':\n setSelectedSteps(newValues)\n return;\n }\n }\n\n const onStepCheckboxChange = (value: number, checked: boolean) => {\n setSelectedSteps(checked ? [...selectedSteps, value] : selectedSteps.filter(v => v !== value));\n };\n\n return (\n
\n \n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \n\n \n \n {\n options.map(option => {\n const isMandatory = applyMandatorySteps && MANDATORY_STEPS.includes(option);\n\n return onStepCheckboxChange(option, checked)}\n disabled={isMandatory}\n />;\n })\n }\n \n \n \n \n \n \n {\n applyMandatorySteps &&\n \n }\n
\n\n );\n};\n\nexport default StepOptionsControl;\n","import React, { useCallback } from 'react';\nimport { TStepRangesOption } from '../../../../api/endpoints/SubsetOption';\nimport Checkbox from '../../../Inputs/Checkbox/Checkbox';\nimport Index from '../../../Ui/CheckboxWrap';\nimport SelectAllControl from \"../../SelectAllControl\";\n\nconst StepRangesControl = (props: {\n spec: TStepRangesOption,\n values: Array;\n onChange: (values: Array) => void;\n}) => {\n const { spec, values, onChange } = props;\n const options = spec.value.step;\n\n const onCheckboxChange = useCallback((value: string, checked: boolean) => {\n onChange(checked ? [...values, value] : values.filter(v => v !== value));\n }, [onChange, values]);\n\n return (\n
\n \n \n {\n options.map(option =>\n onCheckboxChange(option, checked)}\n />)\n }\n \n
\n );\n};\n\nexport default StepRangesControl;\n","import React from 'react';\nimport { TStepLegsOption, TStepRangesOption, TStepsOption } from '../../../api/endpoints/SubsetOption';\nimport StepOptionsControl from './StepOptionsControl';\nimport StepWithLegsControl from './StepWithLegsControl';\nimport StepRangesControl from './StepRangesControl';\n\nexport const specToStepsType = (spec: TStepLegsOption | TStepsOption | TStepRangesOption) => {\n if ('legs' in spec.value) {\n return 'legs';\n }\n\n if ('step' in spec.value) {\n if (typeof spec.value.step[0] === 'string') {\n return 'ranges';\n }\n\n return 'options';\n }\n\n return 'unknown';\n};\n\nconst ForecastStepsSelector = (props: {\n values: Array;\n spec: TStepLegsOption | TStepsOption | TStepRangesOption;\n onChange: (values: Array) => void;\n}) => {\n const { spec, values, onChange } = props;\n\n const stepsType = specToStepsType(spec);\n\n switch (stepsType) {\n case 'legs':\n return ;\n case 'ranges':\n return ;\n case 'options':\n return ;\n default:\n return null;\n }\n};\n\nexport default ForecastStepsSelector;\n","import React from \"react\";\nimport { Form } from \"react-bootstrap\";\nimport { TStepLegsOption, TStepRangesOption, TStepsOption } from \"../../../../../api/endpoints/SubsetOption\";\nimport Footnote from \"../../../Footnote\";\nimport ForecastStepsSelector from \"../../../ForecastStepsSelector\";\nimport FormError from \"../../../FormError\";\nimport { FormikProductFormField, TFormErrorMessage } from \"../../index\";\n\ninterface Props extends FormikProductFormField {\n spec: TStepLegsOption | TStepsOption | TStepRangesOption;\n}\n\nconst ForecastStepsField = (props: Props) => {\n const { formik, spec } = props;\n\n return (\n \n Forecast time steps\n\n ) => formik.setFieldValue('steps', values)}\n />\n\n \n\n \n \n )\n}\n\nexport default ForecastStepsField;\n","import moize from \"moize\";\nimport * as React from \"react\";\nimport Checkbox from \"../../Inputs/Checkbox/Checkbox\";\n\ntype Props = {\n\t/**\n\t * All of the possible matrix cells.\n\t */\n\toptions: T[];\n\n\t/**\n\t * The cells which are currently selected.\n\t * These do not need to have object-equality with the options -\n\t * two cells are considered equal if their mapped column and row\n\t * values are the same.\n\t */\n\tselection: T[];\n\n\t/**\n\t * Callback for notifying a change in cell selection.\n\t */\n\tsetSelection: (options: T[]) => void;\n\n\t/**\n\t * A function mapping a cell to a string representing its column.\n\t */\n\toptionToColumn: (option: T) => string;\n\n\t/**\n\t * A function mapping a cell to a string representing its row.\n\t */\n\toptionToRow: (option: T) => string;\n\n\trenderColumn: (columnName: string) => JSX.Element;\n\n\tonBlur?: () => void;\n\n\tneedsFocus: boolean;\n\tacknowledgeFocusRequest: () => void;\n\tcolumnButtonContainsFocusableElement?: true;\n};\n\n/**\n * A view for editing a generic two dimensional array.\n */\nexport class MatrixEditor extends React.PureComponent> {\n\tprivate readonly firstCheckbox: React.RefObject;\n\n\t/**\n\t * Toggle whether every cell in the column is selected.\n\t * Memoized for performance.\n\t */\n\tprivate readonly toggleColumn = moize((column: string) => () => {\n\t\tlet selection: T[];\n\n\t\tif (\n\t\t\tthis.props.options.every(\n\t\t\t\to =>\n\t\t\t\t\tthis.props.optionToColumn(o) !== column ||\n\t\t\t\t\tthis.cellIsSelected(this.props.optionToColumn(o), this.props.optionToRow(o))\n\t\t\t)\n\t\t) {\n\t\t\t// Every cell in the column is already selected\n\t\t\tselection = this.props.selection.filter(o => this.props.optionToColumn(o) !== column);\n\t\t} else {\n\t\t\tselection = this.props.options.filter(\n\t\t\t\to =>\n\t\t\t\t\tthis.cellIsSelected(this.props.optionToColumn(o), this.props.optionToRow(o)) ||\n\t\t\t\t\tthis.props.optionToColumn(o) === column\n\t\t\t);\n\t\t}\n\n\t\tthis.props.setSelection(selection);\n\t});\n\n\t/**\n\t * Toggle whether every cell in the row is selected.\n\t * Memoized for performance.\n\t */\n\tprivate readonly toggleRow = moize((row: string) => () => {\n\t\tlet selection: T[];\n\n\t\tif (\n\t\t\tthis.props.options.every(\n\t\t\t\to =>\n\t\t\t\t\tthis.props.optionToRow(o) !== row ||\n\t\t\t\t\tthis.cellIsSelected(this.props.optionToColumn(o), this.props.optionToRow(o))\n\t\t\t)\n\t\t) {\n\t\t\t// Every cell in the row is already selected\n\t\t\tselection = this.props.selection.filter(o => this.props.optionToRow(o) !== row);\n\t\t} else {\n\t\t\tselection = this.props.options.filter(\n\t\t\t\to =>\n\t\t\t\t\tthis.cellIsSelected(this.props.optionToColumn(o), this.props.optionToRow(o)) ||\n\t\t\t\t\tthis.props.optionToRow(o) === row\n\t\t\t);\n\t\t}\n\n\t\tthis.props.setSelection(selection);\n\t});\n\n\tprivate readonly selectCell = moize((column: string, row: string) => (isChecked: boolean) => {\n\t\tlet selection = this.props.selection;\n\n\t\tif (isChecked) {\n\t\t\tselection = selection.concat([this.cellToOption(column, row)]);\n\t\t} else {\n\t\t\tselection = selection.filter(o => !this.cellIsOption(o, column, row));\n\t\t}\n\t\tthis.props.setSelection(selection);\n\n\t\tif (this.props.onBlur) {\n\t\t\tthis.props.onBlur();\n\t\t}\n\t});\n\tconstructor(props: Props) {\n\t\tsuper(props);\n\t\tthis.firstCheckbox = React.createRef();\n\t}\n\n\tpublic componentDidMount() {\n\t\tif (this.props.needsFocus && this.firstCheckbox.current) {\n\t\t\tthis.firstCheckbox.current.focus();\n\t\t\tthis.props.acknowledgeFocusRequest();\n\t\t}\n\t}\n\n\tpublic componentDidUpdate(prevProps: Props) {\n\t\tif (!prevProps.needsFocus && this.props.needsFocus && this.firstCheckbox.current) {\n\t\t\tthis.firstCheckbox.current.focus();\n\t\t\tthis.props.acknowledgeFocusRequest();\n\t\t}\n\t}\n\n\tpublic render() {\n\t\tconst rows = this.extractRows(this.props.options);\n\t\tconst columns = this.extractColumns(this.props.options);\n\n\t\treturn (\n\t\t\t
\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t{rows.map((row, rowIndex) => (\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t{columns.map((column, idx) => (\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t))}\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t\t\t\t\t{columns.map((column, i) => {\n\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t{this.props.renderColumn(column)}\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t{row}\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t{this.props.options.some(o => this.cellIsOption(o, column, row)) && (\n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
\n\t\t\t
\n\t\t);\n\t}\n\n\tprivate readonly extractRows = (options: T[]) =>\n\t\toptions.reduce(\n\t\t\t(rows, option) => {\n\t\t\t\tconst optionRow = this.props.optionToRow(option);\n\t\t\t\treturn rows.some(r => r === optionRow) ? rows : rows.concat(optionRow);\n\t\t\t},\n\t\t\t[] as string[]\n\t\t);\n\n\tprivate readonly extractColumns = (options: T[]) =>\n\t\toptions.reduce(\n\t\t\t(columns, option) => {\n\t\t\t\tconst optionCol = this.props.optionToColumn(option);\n\t\t\t\treturn columns.some(c => c === optionCol) ? columns : columns.concat(optionCol);\n\t\t\t},\n\t\t\t[] as string[]\n\t\t);\n\n\tprivate readonly cellIsOption = (option: T, column: string, row: string) =>\n\t\tthis.props.optionToColumn(option) === column && this.props.optionToRow(option) === row;\n\n\tprivate readonly cellIsSelected = (column: string, row: string) =>\n\t\tthis.props.selection.some(o => this.cellIsOption(o, column, row));\n\n\tprivate readonly cellToOption = (column: string, row: string) => {\n\t\tconst option = this.props.options.find(o => this.cellIsOption(o, column, row));\n\t\tif (option == null) {\n\t\t\tthrow new Error(\"Could not find option for cell\");\n\t\t}\n\t\treturn option;\n\t};\n}\n","import { flatMap } from 'lodash';\nimport React from 'react';\nimport { TTimeStepOption } from '../../../api/endpoints/SubsetOption';\nimport { MatrixEditor } from '../../Ui/MatrixEditor';\nimport SelectAllControl from \"../SelectAllControl\";\n\nexport type TTimeStepValue = {\n step: string;\n time: number;\n}\n\nconst timeStepsToOptions = (spec: TTimeStepOption): Array => {\n const { step, time } = spec.value;\n\n return flatMap(time, (timeItem, index) => {\n const stepRanges = step[index];\n\n return stepRanges.map(stepRange => {\n const [start, end] = stepRange.split('-').map(v => parseInt(v, 10))\n\n return ({\n time: parseInt(timeItem, 10),\n step: [start, end].join('-')\n });\n });\n });\n}\n\nconst columnLabel = (option: TTimeStepValue) => option.time.toString();\nconst rowLabel = (option: TTimeStepValue) => option.step;\n\nconst TimeStepSelector = (props: {\n values: Array;\n spec: TTimeStepOption;\n onChange: (values: Array) => void;\n}) => {\n const { spec, values, onChange } = props;\n\n const options = timeStepsToOptions(spec);\n\n return (\n
\n \n\n {c}}\n needsFocus={false}\n acknowledgeFocusRequest={() => undefined}\n />\n
\n );\n};\n\nexport default TimeStepSelector;\n","import React from \"react\";\nimport { Form } from \"react-bootstrap\";\nimport { TTimeStepOption } from \"../../../../../api/endpoints/SubsetOption\";\nimport Footnote from \"../../../Footnote\";\nimport FormError from \"../../../FormError\";\nimport TimeStepSelector from \"../../../TimeStepSelector\";\nimport { FormikProductFormField, TFormErrorMessage } from \"../../index\";\n\ninterface Props extends FormikProductFormField {\n spec: TTimeStepOption;\n}\n\nconst ForecastTimeStepsField = (props: Props) => {\n const { formik, spec } = props;\n return (\n \n Forecast time steps\n formik.setFieldValue('time_step', values)}\n />\n\n \n\n \n \n )\n}\n\nexport default ForecastTimeStepsField;\n","import { compact, difference, differenceBy, intersectionBy, isEmpty, isEqual, times, uniq, uniqBy } from \"lodash\";\nimport React from \"react\";\nimport Checkbox from \"../../../Inputs/Checkbox/Checkbox\";\nimport { TUseStepValue } from \"../index\";\nimport { formatRun } from \"../../../../utils/Format\";\nimport { Day } from \"../../../../entities/Day\";\n\ninterface Props {\n options: Array;\n selection: Array;\n onChange: (options: Array) => void;\n}\n\nconst isChecked = (selection: Array, option: TUseStepValue) => {\n return selection.some(selectedOption => isEqual(selectedOption, option));\n};\n\nconst stepValueIndexKey = (option: TUseStepValue) => {\n return [option.use, option.step, option.step].join(\"-\");\n}\n\nconst UseStepControl = (props: Props) => {\n const { options, selection, onChange } = props;\n\n const columnHeaders = uniq(options.map(option => option.use));\n\n const columnValues = options.reduce((acc, option) => {\n if (!acc[option.use]) {\n acc[option.use] = [];\n }\n\n acc[option.use].push(option);\n\n return acc;\n }, [] as Array>);\n\n const toggleColumn = (column: number) => {\n const selected = selection.filter(option => option.use === column);\n\n const allSelected = selected.length === columnValues[column].length;\n\n const newOptions = allSelected\n ? selection.filter(option => option.use !== column)\n : selection.concat(columnValues[column]);\n\n const options = uniqBy(newOptions, stepValueIndexKey);\n\n onChange(options);\n };\n\n const toggleRow = (week: number) => {\n const allWeekOptions = compact(columnValues.map(values => values[week]));\n\n const selected = intersectionBy(allWeekOptions, selection, stepValueIndexKey);\n\n const allSelected = selected.length === allWeekOptions.length;\n\n const newOptions = allSelected\n ? differenceBy(selection, allWeekOptions, stepValueIndexKey)\n : selection.concat(allWeekOptions);\n\n onChange(newOptions);\n };\n\n const onCheckboxChange = (option: TUseStepValue, isChecked: boolean) => {\n if (isChecked) {\n onChange(selection.concat(option));\n } else {\n onChange(selection.filter(selectedOption => !isEqual(selectedOption, option)));\n }\n };\n\n return (\n
\n \n \n \n \n ))}\n \n \n\n \n {times(6, week => (\n \n \n\n {columnValues.map((values, column) => {\n if (isEmpty(values)) {\n return null;\n }\n\n const option = values[week];\n const label = option && option.step;\n const checked = isChecked(selection, option);\n\n return (\n \n );\n })}\n \n ))}\n \n
\n {columnHeaders.map(header => (\n \n toggleColumn(header)}\n >\n {formatRun(header as Day)}\n \n
\n toggleRow(week)}\n >\n Week {week + 1}\n \n \n {option && (\n \n onCheckboxChange(option, checked)}\n />\n \n )}\n
\n
\n );\n};\n\nexport default UseStepControl;\n","import { flatMap } from \"lodash\";\nimport React from \"react\";\nimport { TUseStepOption } from \"../../../api/endpoints/SubsetOption\";\nimport SelectAllControl from \"../SelectAllControl\";\nimport UseStepControl from \"././UseStepControl\";\n\nexport type TUseStepValue = {\n step: string;\n use: number;\n};\n\nconst useStepsToOptions = (spec: TUseStepOption): Array => {\n const { step, use } = spec.value;\n\n return flatMap(use, (useItem, index) => {\n const dayRanges = step[index];\n\n return dayRanges.map(dayRange => {\n const use = parseInt(useItem, 10);\n\n return {\n use,\n step: dayRange\n };\n });\n });\n};\n\nconst UseStepSelector = (props: {\n values: Array;\n spec: TUseStepOption;\n onChange: (values: Array) => void;\n}) => {\n const { spec, values, onChange } = props;\n\n const options = useStepsToOptions(spec);\n\n return (\n
\n \n \n
\n );\n};\n\nexport default UseStepSelector;\n","import React from \"react\";\nimport { Form } from \"react-bootstrap\";\nimport { TUseStepOption } from \"../../../../../api/endpoints/SubsetOption\";\nimport Footnote from \"../../../Footnote\";\nimport FormError from \"../../../FormError\";\nimport UseStepSelector from \"../../../UseStepSelector\";\nimport { FormikProductFormField, TFormErrorMessage } from \"../../index\";\n\ninterface Props extends FormikProductFormField {\n spec: TUseStepOption;\n}\n\nconst ForecastUseStepsField = (props: Props) => {\n const { formik, spec } = props;\n\n return (\n \n Forecast time steps\n\n formik.setFieldValue('use_step', values)}\n />\n\n \n\n \n \n )\n}\n\nexport default ForecastUseStepsField\n","import React from 'react';\nimport { TGridLegsOption, TGridOption } from '../../../api/endpoints/SubsetOption';\nimport { SelectSingleInput } from '../../Inputs/SelectInput';\n\nconst GridSelector = (props: {\n values: Array;\n spec: TGridLegsOption | TGridOption,\n onChange: (values: Array) => void;\n}) => {\n const { spec, values, onChange } = props;\n\n const onGridChange = (leg: number) => (value: string) => {\n const newValues = [...values];\n newValues[leg] = value;\n\n onChange(newValues);\n };\n\n if ('grid' in spec.value) {\n return (\n ({\n value: grid,\n label: grid\n })}\n onChange={\n value => value && onGridChange(0)(value)\n }\n selectedItem={values[0]}\n name=\"grid\"\n />\n );\n }\n\n if ('legs' in spec.value) {\n return (\n
\n {\n spec.value.legs.map((leg, index) => {\n return
\n
\n Leg {index + 1}:\n
\n ({\n value: grid,\n label: grid\n })}\n onChange={value => {\n value && onGridChange(index)(value);\n }}\n selectedItem={values[index]}\n name={`grid-leg-${index + 1}`}\n />\n
\n })\n }\n
\n );\n }\n\n return null;\n};\n\nexport default GridSelector;\n","import React from \"react\";\nimport { Form } from \"react-bootstrap\";\nimport { TGridLegsOption, TGridOption } from \"../../../../../api/endpoints/SubsetOption\";\nimport Footnote from \"../../../Footnote\";\nimport FormError from \"../../../FormError\";\nimport GridSelector from \"../../../GridSelector\";\nimport { FormikProductFormField, TFormErrorMessage } from \"../../index\";\n\ninterface Props extends FormikProductFormField {\n spec: TGridLegsOption | TGridOption;\n}\n\nconst GridField = (props: Props) => {\n const { formik, spec } = props;\n\n return (\n \n Resolution\n formik.setFieldValue('grid', values)}\n />\n\n \n\n \n \n );\n}\n\nexport default GridField;\n","import React, { Fragment } from \"react\";\nimport { THindcastOption } from \"../../../api/endpoints/SubsetOption\";\nimport { formatHindcastDay } from \"../../../utils/Format\";\nimport Checkbox from \"../../Inputs/Checkbox/Checkbox\";\nimport CheckboxWrap from \"../../Ui/CheckboxWrap\";\nimport SelectAllControl from \"../SelectAllControl\";\n\ninterface Props {\n values: Array;\n spec: THindcastOption;\n onChange: (values: THindcastOption['value']['hindcast']) => void;\n}\n\nconst HindcastSelector = (props: Props) => {\n const { spec, values, onChange } = props;\n\n const options = spec.value.hindcast;\n\n const onDayChange = (value: string, checked: boolean) => {\n onChange(checked ? [...values, value] : values.filter(v => v !== value));\n };\n\n return (\n \n \n\n \n {\n options.map(option =>\n onDayChange(option, checked)}\n />)\n }\n \n \n );\n}\n\nexport default HindcastSelector;\n","import React, { Fragment } from \"react\";\nimport { Badge, Form } from \"react-bootstrap\";\nimport { THindcastOption } from \"../../../../../api/endpoints/SubsetOption\";\nimport { formatBoolean } from \"../../../../../utils/Format\";\nimport { Radio } from \"../../../../Inputs/Radio\";\nimport ExternalLink from \"../../../../Navigation/Links/ExternalLink\";\nimport Footnote from \"../../../Footnote\";\nimport FormError from \"../../../FormError\";\nimport HindcastSelector from \"../../../HindcastSelector\";\nimport { FormikProductFormField, TFormErrorMessage } from \"../../index\";\n\nconst decodeBoolean = (value: string) => value === 'true';\n\ninterface Props extends FormikProductFormField {\n spec: THindcastOption;\n isSelected: boolean;\n onToggle: (selected: boolean) => void;\n}\n\nconst HindcastField = (props: Props) => {\n const { formik, spec, onToggle, isSelected } = props;\n\n return (\n \n Hindcast\n\n
\n {\n [true, false].map(option => {\n return onToggle(decodeBoolean(value))}\n checked={option === isSelected}\n />\n })}\n
\n\n \n Hindcasts/re-forecasts can be used for calibration.\n See this page for more information.\n \n }\n />\n\n {\n isSelected &&\n \n formik.setFieldValue('hindcast', value)}\n />\n\n \n\n \n \n }\n
\n );\n}\n\nexport default HindcastField;\n","import * as React from 'react';\nimport NumberInput from '../../Inputs/NumberInput';\n\nconst MIN_VALUE = 1;\nconst MAX_VALUE = 500;\nconst VALUE_STEP = 1;\n\nconst LocationSelector = (props: {\n value: number | null;\n onChange: (value: number | null) => void\n}) => {\n const { value, onChange } = props;\n\n return (\n \n );\n};\n\nexport default LocationSelector;\n","import React from \"react\";\nimport { Form } from \"react-bootstrap\";\nimport FormError from \"../../../FormError\";\nimport LocationSelector from \"../../../LocationSelector\";\nimport { FormikProductFormField, TFormErrorMessage } from \"../../index\";\n\ninterface Props extends FormikProductFormField {\n}\n\nconst LocationField = (props: Props) => {\n const { formik } = props;\n\n return (\n \n Number of points (locations)\n\n formik.setFieldValue('location', value)}\n />\n\n \n \n );\n}\n\nexport default LocationField;\n","import React from \"react\";\nimport { Form } from \"react-bootstrap\";\nimport FormError from \"../../../FormError\";\nimport { FormikProductFormField } from \"../../index\";\n\nconst NameField = (props: FormikProductFormField) => {\n const { formik } = props;\n\n return (\n \n Name\n \n\n \n \n )\n}\n\nexport default NameField;\n","import * as React from \"react\";\n\nlet i = 0;\n\n/**\n * Generate a unique id, with an optional prefix\n * @param prefix\n */\nconst useGeneratedId = (prefix?: string): string => {\n const [id] = React.useState(() => {\n const result = (prefix ? prefix + \"-\" : \"\") + i;\n i++;\n return result;\n });\n\n return id;\n};\n\nexport default useGeneratedId;\n","import * as React from \"react\";\nimport { Overlay, Tooltip } from \"react-bootstrap\";\nimport useGeneratedId from \"../../../hooks/useGeneratedId\";\nimport { ReactNode } from \"react\";\nimport classNames from \"classnames\";\n\ntype Props = {\n\tclassName?: string;\n\tlabel?: ReactNode\n\tplacement?: \"top\" | \"left\" | \"bottom\" | \"right\"\n};\n\nexport default (props => {\n\tconst { className } = props;\n\tconst [showTooltip, setShowTooltip] = React.useState(false);\n\tconst [showTooltipOverride, setShowTooltipOverride] = React.useState(false);\n\n\tconst id = useGeneratedId(\"tooltip\");\n\n\t// NOT STATE! This should update without refresh\n\tlet awaitingShowTooltip = false;\n\n\tconst tooltip = (\n\t\t setShowTooltipOverride(true)}\n\t\t\tonMouseLeave={() => setShowTooltipOverride(false)}\n\t\t>\n\t\t\t\n\t\t\t
{props.children}
\n\t\t\n\t);\n\n\tconst ref = React.useRef(null);\n\n\treturn (\n\t\t<>\n\t\t\t { } : ev => ev.stopPropagation()}\n\t\t\t\tonMouseEnter={() => {\n\t\t\t\t\tawaitingShowTooltip = true;\n\t\t\t\t\tsetTimeout(() => setShowTooltip(awaitingShowTooltip), 200);\n\t\t\t\t}}\n\t\t\t\tonFocus={props.label ? () => {\n\t\t\t\t\tawaitingShowTooltip = true;\n\t\t\t\t\tsetTimeout(() => setShowTooltip(awaitingShowTooltip), 200);\n\t\t\t\t} : () => { }}\n\t\t\t\tonMouseLeave={() => {\n\t\t\t\t\tawaitingShowTooltip = false;\n\t\t\t\t\tsetShowTooltip(false);\n\t\t\t\t}}\n\t\t\t\tonBlur={props.label ? () => {\n\t\t\t\t\tawaitingShowTooltip = false;\n\t\t\t\t\tsetShowTooltip(false);\n\t\t\t\t} : () => { }}\n\t\t\t>\n\t\t\t\t{props.label ? props.label : <>ℹ /* information symbol */}\n\t\t\t\n\n\t\t\t setShowTooltip(false)}\n\t\t\t\tplacement={props.placement ?? \"right\"}\n\t\t\t\ttarget={ref.current}\n\t\t\t>\n\t\t\t\t{tooltip}\n\t\t\t\n\t\t\n\t);\n}) as React.FC;\n","import * as React from \"react\";\nimport Tooltip from \"./Ui/Tooltip\";\nimport $ from 'jquery';\nimport { TApiParameter } from \"../api/endpoints/Parameter\";\n\ntype Props = {\n\tshort?: true;\n\tlabelOnly?: true;\n\tparam: TApiParameter;\n\tplacement?: \"top\" | \"left\" | \"bottom\" | \"right\"\n};\n\nexport default (props => (\n\t\n)) as React.FC;\n\ntype ShortLabelProps = {\n\tshortname: string;\n};\n\nexport const ShortParamLabel: React.FC = props => (\n\t\n);\n\ntype LabelProps = {\n\tshortname: string;\n\tshort?: true;\n\tlabelOnly?: true;\n\tname?: string;\n\tdescription?: string;\n\tplacement?: \"top\" | \"left\" | \"bottom\" | \"right\";\n};\n\nconst ParamLabel: React.FC = props => {\n\tconst label = props.name && !props.short ? `${props.name} (${props.shortname})` : props.shortname;\n\tconst header = props.name ? `${props.name} (${props.shortname})` : props.shortname;\n\n\tconst tooltipCallback = React.useCallback(element => {\n\t\t$(\"a\", $(element)).attr(\"target\", \"_blank\");\n\t}, []);\n\n\tconst button = (\n\t\t<>\n\t\t\t\n\t\t\t\t
\n\t\t\t\t\t

{header}

\n\t\t\t\t\t{props.description ? (\n\t\t\t\t\t\t

\n\t\t\t\t\t) : (\n\t\t\t\t\t\t\t

Parameter description not found

\n\t\t\t\t\t\t)}\n\t\t\t\t
\n\t\t\t
\n\t\t\n\t);\n\n\treturn props.labelOnly\n\t\t? button\n\t\t: (\n\t\t\t\n\t\t\t\t{label}{button}\n\t\t\t\n\t\t);\n};\n","import React, { useEffect, useState } from 'react';\nimport { TApiParameter } from '../../../api/endpoints/Parameter';\nimport { TParamOption } from '../../../api/endpoints/SubsetOption';\nimport Checkbox from '../../Inputs/Checkbox/Checkbox';\nimport CheckboxWrap from '../../Ui/CheckboxWrap';\nimport ParamLabel from '../../ParamLabel';\nimport { SelectMultiInput } from '../../Inputs/SelectInput';\nimport * as Api from '../../../api';\nimport { sortBy } from 'lodash';\nimport SelectAllControl from \"../SelectAllControl\";\n\nconst paramToOption = (param: TApiParameter) => {\n return {\n value: param.shortname,\n label: param.name,\n meta: param\n };\n};\n\nconst filterParamsByShortnames = (params: Array, shortnames: Array): Array => {\n return params.filter(param => shortnames.includes(param.shortname.toUpperCase()))\n}\n\nconst ParamsSelector = (props: {\n values: Array;\n spec: TParamOption;\n onChange: (values: Array) => void\n}) => {\n const { spec, values, onChange } = props;\n const options = spec.value.param;\n\n const [showAll, setShowAll] = useState(false);\n const [paramList, setParamList] = useState>([]);\n\n useEffect(() => {\n Api.Parameter.list().then(params => {\n const availableParams = sortBy(filterParamsByShortnames(params, options), param => param.name)\n setParamList(availableParams);\n });\n }, [options]);\n\n const selectedParams = filterParamsByShortnames(paramList, values);\n\n const onSelectChange = (options: Array) => {\n const shortnames = options.map(option => option.shortname.toUpperCase());\n onChange(shortnames);\n }\n\n const onCheckboxChange = (value: string, checked: boolean) => {\n onChange(checked ? [...values, value] : values.filter(v => v !== value));\n };\n\n return (\n
\n \n\n
\n }\n />\n
\n\n
\n \n
\n\n {showAll && (\n
\n \n {\n paramList.map(param =>\n }\n value={param.shortname}\n checked={values.includes(param.shortname.toUpperCase())}\n name=\"step-ranges\"\n onChange={(checked) => onCheckboxChange(param.shortname.toUpperCase(), checked)}\n />)\n }\n \n
\n )}\n
\n );\n};\n\nexport default ParamsSelector;\n","import React from \"react\";\nimport { Form } from \"react-bootstrap\";\nimport { TParamOption } from \"../../../../../api/endpoints/SubsetOption\";\nimport Footnote from \"../../../Footnote\";\nimport FormError from \"../../../FormError\";\nimport ParamsSelector from \"../../../ParamsSelector\";\nimport { FormikProductFormField, TFormErrorMessage } from \"../../index\";\n\ninterface Props extends FormikProductFormField {\n spec: TParamOption;\n}\n\nconst ParametersField = (props: Props) => {\n const { formik, spec } = props;\n\n return (\n \n Parameters\n formik.setFieldValue('param', values)}\n />\n\n \n\n \n \n );\n}\n\nexport default ParametersField;\n","import { TApiParameter } from '../../../api/endpoints/Parameter';\nimport { OverlayTrigger, Tooltip } from 'react-bootstrap';\nimport React, { ReactNode } from 'react';\n\ninterface IProps {\n label: string;\n param?: TApiParameter;\n}\n\nconst Label = (props: {\n children: ReactNode;\n}) => {\n return {props.children}\n}\n\nconst ParameterLabel = (props: IProps) => {\n const { label, param } = props;\n\n if (!param) {\n return ;\n }\n\n return (\n \n
\n

{param.name}

\n\n {\n param.description &&\n
\n }\n
\n \n }\n >\n \n \n )\n}\n\nexport default ParameterLabel;\n","import React from 'react';\nimport { TParamLevelistOption } from '../../../api/endpoints/SubsetOption';\nimport { flatMap, range, isPlainObject } from 'lodash';\nimport { MatrixEditor } from '../../Ui/MatrixEditor';\nimport SelectAllControl from \"../SelectAllControl\";\nimport { TApiParameter } from \"../../../api/endpoints/Parameter\";\nimport ParameterLabel from \"../../Ui/ParameterLabel\";\n\ntype TParamLevelistOptionRange = {\n from: string;\n to: string;\n}\n\nconst paramLevelistToOptions = (spec: TParamLevelistOption): Array => {\n const { param, levelist } = spec.value;\n\n return flatMap(param, (param, index) => {\n let levels;\n\n if (typeof levelist[0] === 'string') {\n levels = levelist as Array;\n } else {\n levels = levelist[index] as Array | TParamLevelistOptionRange\n\n if (isPlainObject(levelist[index])) {\n const { from, to } = levelist[index] as TParamLevelistOptionRange\n\n levels = range(parseInt(from, 10), parseInt(to, 10) + 1).map(v => v.toString()) as Array\n } else {\n levels = levelist[index] as Array\n }\n }\n\n return levels.map(level => ({\n param,\n level\n }));\n });\n};\n\nexport type TParamLevelistValue = {\n param: string,\n level: string\n}\n\nconst columnLabel = (option: TParamLevelistValue) => option.param;\nconst rowLabel = (option: TParamLevelistValue) => option.level;\n\nconst ParamLevelistSelector = (props: {\n spec: TParamLevelistOption;\n values: Array;\n params: { [shortname: string]: TApiParameter };\n onChange: (values: Array) => void\n}) => {\n const { spec, values, params, onChange } = props;\n const options = paramLevelistToOptions(spec);\n\n return (\n
\n \n\n }\n needsFocus={false}\n acknowledgeFocusRequest={() => undefined}\n columnButtonContainsFocusableElement\n />\n
\n );\n};\n\nexport default ParamLevelistSelector;\n","import React from \"react\";\nimport { Form } from \"react-bootstrap\";\nimport { TApiParameter } from \"../../../../../api/endpoints/Parameter\";\nimport { TParamLevelistOption } from \"../../../../../api/endpoints/SubsetOption\";\nimport Footnote from \"../../../Footnote\";\nimport FormError from \"../../../FormError\";\nimport ParamLevelistSelector from \"../../../ParamLevelistSelector\";\nimport { FormikProductFormField, TFormErrorMessage } from \"../../index\";\n\ninterface Props extends FormikProductFormField {\n spec: TParamLevelistOption;\n options: { [shortname: string]: TApiParameter }\n}\n\nconst ParametersLevelistField = (props: Props) => {\n const { formik, spec, options } = props;\n\n return (\n \n Parameters\n formik.setFieldValue('param_levelist', values)}\n />\n\n \n\n \n \n )\n}\n\nexport default ParametersLevelistField;\n","import React from 'react';\nimport { TParamQuantileOption } from '../../../api/endpoints/SubsetOption';\nimport { flatMap } from 'lodash';\nimport { MatrixEditor } from '../../Ui/MatrixEditor';\nimport SelectAllControl from \"../SelectAllControl\";\nimport { TApiParameter } from \"../../../api/endpoints/Parameter\";\nimport ParameterLabel from \"../../Ui/ParameterLabel\";\n\nconst paramQuantileToOptions = (spec: TParamQuantileOption): Array => {\n const { param, quantile } = spec.value;\n\n return flatMap(param, (param, index) => {\n let quantiles;\n\n if (typeof quantile[0] === 'string') {\n quantiles = quantile as Array;\n } else {\n quantiles = quantile[index] as Array;\n }\n\n return quantiles.map(quantile => {\n return ({\n param,\n quantile\n });\n });\n });\n};\n\nexport type TParamQuantileValue = {\n param: string,\n quantile: string;\n}\n\nconst columnLabel = (option: TParamQuantileValue) => option.param;\nconst rowLabel = (option: TParamQuantileValue) => option.quantile;\n\nconst ParamsQuantileSelector = (props: {\n spec: TParamQuantileOption;\n values: Array;\n params: { [shortname: string]: TApiParameter };\n onChange: (values: Array) => void\n}) => {\n const { spec, values, params, onChange } = props;\n const options = paramQuantileToOptions(spec);\n\n return (\n
\n \n\n }\n needsFocus={false}\n acknowledgeFocusRequest={() => undefined}\n columnButtonContainsFocusableElement\n />\n
\n );\n};\n\nexport default ParamsQuantileSelector;\n","import React from \"react\";\nimport { Form } from \"react-bootstrap\";\nimport { TApiParameter } from \"../../../../../api/endpoints/Parameter\";\nimport { TParamQuantileOption } from \"../../../../../api/endpoints/SubsetOption\";\nimport Footnote from \"../../../Footnote\";\nimport FormError from \"../../../FormError\";\nimport ParamsQuantileSelector from \"../../../ParamsQuantileSelector\";\nimport { FormikProductFormField, TFormErrorMessage } from \"../../index\";\n\ninterface Props extends FormikProductFormField {\n spec: TParamQuantileOption;\n options: { [shortname: string]: TApiParameter }\n}\nconst ParametersQuantileField = (props: Props ) => {\n const { formik, spec, options } = props;\n\n return (\n \n Parameters\n formik.setFieldValue('param_quantile', values)}\n />\n\n \n\n \n \n )\n}\n\nexport default ParametersQuantileField;\n","import React, { useCallback } from 'react';\nimport { TChannelOption } from '../../../api/endpoints/SubsetOption';\nimport Checkbox from '../../Inputs/Checkbox/Checkbox';\nimport Index from '../../Ui/CheckboxWrap';\nimport SelectAllControl from \"../SelectAllControl\";\n\nconst ChannelsSelector = (props: {\n values: Array;\n spec: TChannelOption;\n onChange: (values: Array) => void;\n}) => {\n const { spec, values, onChange } = props;\n\n const options = spec.value.channel.map(channel => parseInt(channel, 10));\n\n const onStepCheckboxChange = useCallback((value: number, checked: boolean) => {\n onChange(checked ? [...values, value] : values.filter(v => v !== value));\n }, [onChange, values]);\n\n return (\n
\n \n\n \n {\n options.map(option =>\n onStepCheckboxChange(option, checked)}\n />)\n }\n \n
\n );\n};\n\nexport default ChannelsSelector;\n","import React from \"react\";\nimport { Form } from \"react-bootstrap\";\nimport { TChannelOption } from \"../../../../../api/endpoints/SubsetOption\";\nimport ChannelsSelector from \"../../../ChannelsSelector\";\nimport Footnote from \"../../../Footnote\";\nimport FormError from \"../../../FormError\";\nimport { FormikProductFormField, TFormErrorMessage } from \"../../index\";\n\ninterface Props extends FormikProductFormField {\n spec: TChannelOption;\n}\n\nconst SatelliteChannelsField = (props: Props) => {\n const { formik, spec } = props;\n\n return (\n \n Satellite channels\n formik.setFieldValue('channel', values)}\n />\n\n \n\n \n \n );\n}\n\nexport default SatelliteChannelsField;\n","import React from 'react';\nimport { TTimeOption } from '../../../api/endpoints/SubsetOption';\nimport Checkbox from '../../Inputs/Checkbox/Checkbox';\nimport CheckboxWrap from '../../Ui/CheckboxWrap';\nimport SelectAllControl from \"../SelectAllControl\";\n\nconst TimeSelector = (props: {\n values: Array;\n spec: TTimeOption;\n onChange: (values: Array) => void;\n}) => {\n const { values, spec, onChange } = props;\n const options = spec.value.time;\n\n const onCheckboxChange = (value: string, checked: boolean) => {\n onChange(checked ? [...values, value] : values.filter(v => v !== value));\n };\n\n return (\n
\n \n\n \n {\n options.map(option =>\n onCheckboxChange(option, checked)}\n />)\n }\n \n
\n );\n};\n\nexport default TimeSelector;\n","import React from \"react\";\nimport { Form } from \"react-bootstrap\";\nimport { TTimeOption } from \"../../../../../api/endpoints/SubsetOption\";\nimport Footnote from \"../../../Footnote\";\nimport FormError from \"../../../FormError\";\nimport TimeSelector from \"../../../TimeSelector\";\nimport { FormikProductFormField, TFormErrorMessage } from \"../../index\";\n\ninterface Props extends FormikProductFormField {\n spec: TTimeOption;\n}\n\nconst TimeField = (props: Props) => {\n const { formik, spec } = props;\n\n return (\n \n Forecast runs\n formik.setFieldValue('time', values.sort())}\n />\n\n \n\n \n \n )\n}\n\nexport default TimeField;\n","import { IProductFormValues } from \"../index\";\nimport { MAX_LOCATIONS } from \"../../../../constants/Constants\";\nimport { validateArea } from \"../../../../validation/Validators\";\nimport { Area } from \"../../../../entities/Area\";\nimport { compact } from \"lodash\";\nimport { Nullable } from \"../../../../../types/utils\";\n\nconst ensureNonEmptyArray = (\n value: Nullable>,\n message: string = 'At least one value is required.'\n): string | undefined => {\n return !value || value.length <= 0 ? message : undefined;\n}\n\nconst validateLocation = (value: IProductFormValues['location']) => {\n if (!value) {\n return 'Required.'\n }\n\n if (value < 1 && value > MAX_LOCATIONS) {\n return `Required a number between 1 and ${MAX_LOCATIONS}`\n }\n\n return;\n}\n\nconst validateAreas = (areas: Array): string | undefined => {\n const errors = [];\n const isEmptyError = ensureNonEmptyArray(areas);\n\n if (isEmptyError) {\n errors.push(isEmptyError);\n }\n\n errors.push(\n ...compact(areas.map(area => validateArea(area).error))\n );\n\n return errors[0];\n}\n\ntype TArrayProperties = 'steps'\n | 'areas'\n | 'grid'\n | 'use'\n | 'hindcast'\n | 'fcmonth'\n | 'param'\n | 'param_levelist'\n | 'param_quantile'\n | 'time'\n | 'time_step'\n | 'use_step';\n\nconst validateProductArrayProperty = (\n value: IProductFormValues[T]\n) => ensureNonEmptyArray(value)\n\n// const validateHindcast = (value: Nullable>) => {\n// if (value.length === 0) {\n// return 'Value is required.'\n// }\n//\n// return;\n// }\n\nexport {\n // validateHindcast,\n validateLocation,\n validateAreas,\n validateProductArrayProperty\n}\n","import { FormikConfig, FormikHelpers, FormikProps, useFormik } from 'formik';\nimport { compact, debounce, isUndefined, pickBy } from 'lodash';\nimport React, { ReactNode, useCallback, useEffect, useLayoutEffect, useState } from 'react';\nimport { Button, Form } from 'react-bootstrap';\nimport { useSelector } from \"react-redux\";\nimport { Nullable } from \"../../../../types/utils\";\nimport * as Api from '../../../api';\nimport { PresetObj } from '../../../api-entities/PresetArea';\nimport { TApiArea } from '../../../api/endpoints/Area';\nimport { TApiSubset } from '../../../api/endpoints/Subset';\nimport { TApiSubsetOptions } from '../../../api/endpoints/SubsetOption';\nimport { Area } from '../../../entities/Area';\nimport { selectParameters } from \"../../../store/selectors/new/parameters\";\nimport { snapAreaToGrid } from \"../../../utils/Area\";\nimport { formatSubsetLabel } from '../../../utils/Format';\nimport BeforeUnload from '../../Feedback/BeforeUnload';\nimport Footnote from '../Footnote';\nimport FormError from '../FormError';\nimport { TParamLevelistValue } from '../ParamLevelistSelector';\nimport { TParamQuantileValue } from '../ParamsQuantileSelector';\nimport RunsSelector from '../RunsSelector';\nimport { TTimeStepValue } from '../TimeStepSelector';\nimport { TUseStepValue } from '../UseStepSelector';\nimport AreasField from \"./controls/AreasField\";\nimport EnsembleMembersField, { deriveNumberValuesFromSubsetOption } from \"./controls/EnsembleMembersField\";\nimport ForecastMonthsField from \"./controls/ForecastMonthsField\";\nimport ForecastStepsField from \"./controls/ForecastStepsField\";\nimport ForecastTimeStepsField from \"./controls/ForecastTimeStepsField\";\nimport ForecastUseStepsField from \"./controls/ForecastUseStepsField\";\nimport GridField from \"./controls/GridField\";\nimport HindcastField from \"./controls/HindcastField\";\nimport LocationField from \"./controls/LocationField\";\nimport NameField from \"./controls/NameField\";\nimport ParametersField from \"./controls/ParametersField\";\nimport ParametersLevelistField from \"./controls/ParametersLevelistField\";\nimport ParametersQuantileField from \"./controls/ParametersQuantileField\";\nimport SatelliteChannelsField from \"./controls/SatelliteChannelsField\";\nimport TimeField from \"./controls/TimeField\";\nimport { validateAreas, validateLocation, validateProductArrayProperty } from './validators';\n\nconst areaToPresetObj = (area: TApiArea): PresetObj => {\n return {\n name: area.name,\n area: {\n north: parseFloat(area.north),\n west: parseFloat(area.west),\n south: parseFloat(area.south),\n east: parseFloat(area.east)\n }\n };\n};\n\n\nexport interface IProductFormValues {\n name: string;\n hindcast: Nullable>;\n steps: Array;\n number: Array;\n areas: Array;\n grid: Array;\n use: Array;\n fcmonth: Array;\n param: Array;\n param_levelist: Array;\n param_quantile: Array;\n time: Array;\n time_step: Array;\n use_step: Array;\n location: Nullable;\n channel: Array;\n}\n\nexport type FormikProductFormProps = FormikConfig;\nexport type FormikProductFormField = {\n formik: FormikProps;\n}\n\nexport const DEFAULT_PRODUCT_FORM_VALUES: Readonly = {\n name: '',\n hindcast: null,\n steps: [],\n number: [],\n areas: [],\n grid: [],\n use: [],\n fcmonth: [],\n param: [],\n param_levelist: [],\n param_quantile: [],\n time: [],\n time_step: [],\n use_step: [],\n location: null,\n channel: []\n}\n\n\nconst getDefaultEnsembleMembers = (subsetOptions: TApiSubsetOptions) => {\n const { number } = subsetOptions;\n\n if (!number) {\n return [];\n }\n\n\n return deriveNumberValuesFromSubsetOption(number).filter(v => v <= 100);\n}\n\nconst getDefaultGrid = (subsetOptions: TApiSubsetOptions) => {\n const { grid } = subsetOptions;\n\n if (!grid) {\n return [];\n }\n\n if ('legs' in grid.value) {\n return grid.value.legs.map(leg => leg[0]);\n }\n\n return [grid.value.grid[0]];\n}\n\nconst computeMinGrid = (grids: IProductFormValues['grid']) => {\n return Math.min(...compact(grids.map(parseFloat)));\n}\n\nconst transformAreasToMatchGrids = (areas: IProductFormValues['areas'], grids: IProductFormValues['grid']) => {\n const minGrid = computeMinGrid(grids);\n\n return isFinite(minGrid) ? areas.map(area => snapAreaToGrid(area, minGrid)) : areas;\n}\n\nexport type TFormErrorMessage = string | undefined;\n\nexport type TProductFormErrors = {\n [key in keyof IProductFormValues]?: TFormErrorMessage\n}\nconst validateProductFormValues = (\n subsetOptions: TApiSubsetOptions,\n includeLocation: boolean | void,\n hindcastSelected: boolean\n) => (values: IProductFormValues): TProductFormErrors => {\n const errors: TProductFormErrors = {};\n\n errors.steps = subsetOptions.step && validateProductArrayProperty(values.steps);\n errors.number = subsetOptions.number && validateProductArrayProperty(values.number);\n errors.areas = subsetOptions.area && validateAreas(values.areas);\n errors.grid = subsetOptions.grid && validateProductArrayProperty(values.grid);\n errors.use = subsetOptions.use && validateProductArrayProperty(values.use);\n errors.hindcast = (subsetOptions.hindcast && hindcastSelected) ? validateProductArrayProperty(values.hindcast) : undefined;\n errors.fcmonth = subsetOptions.fcmonth && validateProductArrayProperty(values.fcmonth);\n errors.param = subsetOptions.param && validateProductArrayProperty(values.param);\n errors.param_levelist = subsetOptions.param_levelist && validateProductArrayProperty(values.param_levelist);\n errors.param_quantile = subsetOptions.param_quantile && validateProductArrayProperty(values.param_quantile);\n errors.time = subsetOptions.time && validateProductArrayProperty(values.time);\n errors.time_step = subsetOptions.time_step && validateProductArrayProperty(values.time_step);\n errors.use_step = subsetOptions.use_step && validateProductArrayProperty(values.use_step);\n errors.location = includeLocation ? validateLocation(values.location) : undefined;\n errors.channel = subsetOptions.channel && validateProductArrayProperty(values.channel);\n\n return pickBy(errors, v => !isUndefined(v));\n}\n\nconst ProductForm = (props: {\n subset: TApiSubset;\n initialValues?: Partial;\n subsetOptions: TApiSubsetOptions;\n actions?: (\n subset: TApiSubset,\n subsetOptions: TApiSubsetOptions,\n formik: FormikProps\n ) => ReactNode;\n onSubmit: (values: IProductFormValues, formik: FormikHelpers) => void;\n onChange?: (values: IProductFormValues) => void;\n includeLocation?: boolean;\n}) => {\n const {\n subsetOptions,\n initialValues,\n includeLocation,\n subset,\n actions,\n onChange,\n onSubmit\n } = props;\n const [presetAreas, setPresetAreas] = useState>([]);\n const [userPresetAreas, setUserPresetAreas] = useState>([]);\n const [hindcastSelected, setHindcastSelected] = useState(Boolean(initialValues?.hindcast?.length));\n\n const availableParams = useSelector(selectParameters);\n\n const formik = useFormik({\n initialValues: {\n ...DEFAULT_PRODUCT_FORM_VALUES,\n number: getDefaultEnsembleMembers(subsetOptions),\n grid: getDefaultGrid(subsetOptions),\n ...initialValues\n },\n validate: validateProductFormValues(subsetOptions, includeLocation, hindcastSelected),\n onSubmit\n });\n\n const onAreasChange = useCallback((values: IProductFormValues['areas']) => {\n const { grid } = formik.values;\n\n formik.setFieldValue('areas', transformAreasToMatchGrids(values, grid));\n }, [formik.values.areas])\n\n useEffect(() => {\n Api.Area.list().then(areas => {\n setPresetAreas(areas.map(areaToPresetObj));\n });\n\n Api.UserArea.list().then(areas => {\n setUserPresetAreas(areas.map(areaToPresetObj));\n });\n }, []);\n\n useLayoutEffect(() => {\n if (Object.keys(formik.errors).length !== 0) {\n document.querySelector('.form-error')?.closest('.form-group')?.scrollIntoView({ behavior: 'smooth' });\n }\n }, [formik.submitCount]);\n\n useEffect(debounce(() => {\n onChange && onChange(formik.values);\n }, 16), [formik.values]);\n\n useEffect(() => {\n const { areas, grid } = formik.values;\n\n formik.setFieldValue('areas', transformAreasToMatchGrids(areas, grid));\n }, [formik.values.grid]);\n\n useEffect(() => {\n formik.setFieldValue('hindcast', hindcastSelected ? formik.values.hindcast : null);\n }, [hindcastSelected]);\n\n return (\n \n
\n \n Set\n
{formatSubsetLabel(subset)}
\n
\n\n \n\n {\n subsetOptions.time &&\n \n }\n\n {\n subsetOptions.step &&\n \n }\n\n {\n subsetOptions.time_step &&\n \n }\n\n {\n subsetOptions.use_step &&\n \n }\n\n {\n subsetOptions.number &&\n \n }\n\n {\n subsetOptions.area &&\n \n }\n\n {\n subsetOptions.grid &&\n \n }\n\n {\n includeLocation &&\n \n }\n\n {\n subsetOptions.use &&\n \n Runs\n formik.setFieldValue('use', values)}\n />\n\n \n\n \n \n }\n\n {\n subsetOptions.hindcast &&\n \n }\n\n {\n subsetOptions.fcmonth &&\n \n }\n\n {\n subsetOptions.channel &&\n \n }\n\n {\n subsetOptions.param &&\n \n }\n\n {\n subsetOptions.param_levelist &&\n \n }\n\n {\n subsetOptions.param_quantile &&\n \n }\n\n
\n {\n actions ?\n actions(subset, subsetOptions, formik)\n : \n }\n
\n \n
\n );\n};\n\nexport default ProductForm;\n","import * as Api from \"../../api\";\nimport { ThunkDispatch } from \"redux-thunk\";\nimport { TRootState } from \"../reducers/RootReducer\";\nimport { Action } from \"redux\";\nimport { TApiSubsetOptions } from \"../../api/endpoints/SubsetOption\";\n\nexport const SUBSET_OPTION_FETCH_COMPLETED = 'SUBSET_OPTION_FETCH_COMPLETED';\n\nexport interface IFetchSubsetOptionsCompletedAction {\n type: typeof SUBSET_OPTION_FETCH_COMPLETED;\n subsetId: number,\n options: TApiSubsetOptions\n}\n\nconst fetchSubsetOptionsCompleted = (subsetId: number, options: TApiSubsetOptions) => ({\n type: SUBSET_OPTION_FETCH_COMPLETED,\n subsetId,\n options\n})\n\nconst fetchSubsetOptions = (subsetId: number) => {\n return async (dispatch: ThunkDispatch): Promise => {\n try {\n const options = await Api.SubsetOption.fetch(subsetId);\n\n dispatch(fetchSubsetOptionsCompleted(subsetId, options));\n\n return options;\n } catch (error) {\n throw error;\n }\n }\n}\n\nexport {\n fetchSubsetOptions\n}\n","import { TRootState } from \"../../reducers/RootReducer\";\n\nconst selectSubsetOptions = (subsetId?: number) => (store: TRootState) => {\n if (!subsetId) {\n return null;\n }\n\n return store.subsetOptionsBySubsetId[subsetId]?.data\n}\n\nexport {\n selectSubsetOptions\n}\n","import React, { useEffect, useState, ReactNode } from 'react';\nimport { Card } from 'react-bootstrap';\nimport { useParams, useLocation } from 'react-router';\nimport * as Api from '../../../api';\nimport { TApiSubset } from '../../../api/endpoints/Subset';\nimport { TApiSubsetOptions } from '../../../api/endpoints/SubsetOption';\nimport ProductForm, { IProductFormValues } from '../ProductForm';\nimport { FormikProps, FormikHelpers } from 'formik';\nimport queryString, { ParsedQuery } from 'query-string'\nimport { fetchSubsetOptions } from '../../../store/action-creators/subset-options';\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { selectSubsetOptions } from \"../../../store/selectors/new/subsetOptions\";\nimport LoadingIndicator from \"../../Feedback/LoadingIndicator\";\n\ninterface IProps {\n subsetId?: number;\n initialValues?: IProductFormValues;\n actions?: (subset: TApiSubset, subsetOptions: TApiSubsetOptions, formik: FormikProps) => ReactNode;\n onChange?: (values: IProductFormValues) => void;\n onSubmit?: (\n subset: TApiSubset,\n subsetOptions: TApiSubsetOptions,\n values: IProductFormValues,\n formikHelpers: FormikHelpers) => void;\n}\n\nconst useQuery = () => {\n const { search } = useLocation();\n\n return queryString.parse(search);\n}\n\nconst parseQueryParams = (query: ParsedQuery | null | undefined): Array => {\n const params = query?.params;\n\n if (!params) {\n return [];\n }\n\n return (Array.isArray(params) ? params : [params]).map(p => p.toUpperCase());\n}\n\nconst SubsetOptionsSelect = (props: IProps) => {\n const { subsetId, initialValues, actions, onChange, onSubmit } = props;\n const dispatch = useDispatch();\n const params = useParams<{ subsetId: string }>();\n const query = useQuery();\n const queryParameters = parseQueryParams(query);\n\n const id = subsetId ?? params.subsetId;\n\n const [subset, setSubset] = useState(null);\n const subsetOptions = useSelector(selectSubsetOptions(parseInt(id.toString(), 10)));\n\n useEffect(() => {\n Api.Subset.fetch(id).then(subset => {\n setSubset(subset);\n });\n }, [id]);\n\n useEffect(() => {\n if (subset) {\n dispatch(fetchSubsetOptions(subset.id));\n } else {\n setSubset(null);\n }\n }, [dispatch, subset]);\n\n const onProductSubmit = (values: IProductFormValues, formikHelpers: FormikHelpers) => {\n onSubmit && subset && subsetOptions && onSubmit(subset, subsetOptions, values, formikHelpers);\n }\n\n if (!subset || !subsetOptions) {\n return \n }\n\n const initialValuesWithInjectedParams = {\n ...initialValues,\n ...(queryParameters.length && { param: queryParameters })\n }\n\n return (\n \n \n {\n \n }\n \n \n );\n};\n\nexport default SubsetOptionsSelect;\n","import React, { ReactNode, useEffect, useState } from \"react\";\nimport { IProductFormValues } from \"../ProductForm\";\nimport {\n formatArea,\n formatBaseTime, formatBoolean, formatHindcastDay,\n formatRun,\n} from \"../../../utils/Format\";\nimport { isEmpty, every, isUndefined, } from \"lodash\";\nimport Run from \"../../ProductFormatters/Run\";\nimport TimeStep from \"../../ProductFormatters/TimeStep\";\nimport { useSelector } from \"react-redux\";\nimport { selectParameters } from \"../../../store/selectors/new/parameters\";\nimport ParamQuantile from \"../../ProductFormatters/ParamQuantile\";\nimport ParamLevelist from \"../../ProductFormatters/ParamLevelist\";\nimport Steps from \"../../ProductFormatters/Steps\";\nimport { TApiSubset } from \"../../../api/endpoints/Subset\";\nimport { selectSubsetOptions } from \"../../../store/selectors/new/subsetOptions\";\nimport * as Api from \"../../../api\";\nimport { useParams } from \"react-router\";\nimport EnsembleMembers from \"../../ProductFormatters/EnsembleMembers\";\n\ninterface IProps {\n values: IProductFormValues | null;\n subset?: TApiSubset | null;\n}\n\nconst PreviewItem = (props: {\n title: string;\n children: ReactNode;\n}) => {\n const { title, children } = props;\n\n return (\n
\n
{title}
\n
\n {children}\n
\n
\n )\n}\n\nconst ConfigurationPreview = (props: IProps) => {\n const { values } = props;\n const availableParams = useSelector(selectParameters);\n const [subset, setSubset] = useState(props.subset ?? null);\n const params = useParams<{ subsetId: string }>();\n const subsetOptions = useSelector(selectSubsetOptions(subset?.id));\n\n useEffect(() => {\n if (params.subsetId) {\n Api.Subset.fetch(params.subsetId).then(subset => {\n setSubset(subset);\n });\n }\n }, [params.subsetId])\n\n\n if (!values || !subset || !subsetOptions) {\n return null;\n }\n\n return (\n
\n

Selected Configuration

\n\n {\n every(Object.values(values), isEmpty) &&\n
Nothing selected yet.
\n }\n\n {\n Boolean(values.name) &&\n \n {values.name}\n \n }\n\n {\n Boolean(values.time.length) &&\n \n {values.time.map(formatBaseTime).join(', ')}\n \n }\n\n {\n Boolean(values.steps.length) &&\n \n \n \n }\n\n {\n Boolean(values.time_step.length) &&\n \n \n \n }\n\n {\n Boolean(values.use_step.length) &&\n \n \n \n }\n\n {\n Boolean(values.number.length) &&\n \n \n \n }\n\n {\n Boolean(values.areas.length) &&\n \n {\n values.areas.map(v => {\n const formatted = formatArea(v);\n\n return
{formatted}
\n })\n }\n
\n }\n\n {\n Boolean(values.grid.length) &&\n \n {values.grid.join(', ')}\n \n }\n\n {\n Boolean(values.location) &&\n \n {values.location!.toString()}\n \n }\n\n {\n Boolean(values.use.length) &&\n \n {values.use.sort().map(v => formatRun(Number(v))).join(', ')}\n \n }\n\n {\n values.hindcast && values.hindcast.length &&\n \n {values.hindcast.sort().map(v => formatHindcastDay(Number(v))).join(', ')}\n \n }\n\n {\n Boolean(values.fcmonth.length) &&\n \n {values.fcmonth.join(', ')}\n \n }\n\n {\n Boolean(values.channel.length) &&\n \n {values.channel.join(', ')}\n \n }\n\n {\n Boolean(values.param.length) &&\n \n {values.param.join(', ')}\n \n }\n\n {\n Boolean(values.param_levelist.length) &&\n \n ({ ...param, level: parseInt(param.level, 10) }))}\n params={availableParams}\n />\n \n }\n\n {\n Boolean(values.param_quantile.length) &&\n \n \n \n }\n
\n )\n}\n\nexport default ConfigurationPreview;\n","import React, { Fragment, useEffect, useState } from \"react\";\nimport { Card, Col, Row } from \"react-bootstrap\";\nimport SubsetOptionsSelect from \"../../components/RealtimeProductConfigurator/SubsetOptionsSelect\";\nimport Button from \"react-bootstrap/Button\";\nimport ConfigurationPreview from \"../../components/RealtimeProductConfigurator/ConfigurationPreview\";\nimport { IProductFormValues } from \"../../components/RealtimeProductConfigurator/ProductForm\";\nimport { useParams } from \"react-router-dom\";\nimport { OrderCategory } from \"../../api/endpoints/Order\";\nimport * as Api from \"../../api\";\nimport PageTitle from \"../../components/Ui/PageTitle\";\nimport { TApiSubset } from \"../../api/endpoints/Subset\";\nimport { TApiSubsetOptions } from \"../../api/endpoints/SubsetOption\";\nimport { productToValues, valuesToProduct } from \"../../utils/ProductFormHelpers\";\nimport { paths } from \"../../router\";\nimport { useHistory } from \"react-router\";\nimport { FormikHelpers } from \"formik\";\nimport LoadingIndicator from \"../../components/Feedback/LoadingIndicator\";\nimport { Nullable } from \"../../../types/utils\";\nimport { TOrderProduct, TOrderProductData } from \"../../api/endpoints/OrderProduct\";\n\ninterface IProps {\n}\n\ninterface IRouteParams {\n orderId: string;\n productId: string;\n}\n\nconst RealtimeOrderProduct = (props: IProps) => {\n const history = useHistory();\n const params = useParams();\n const [productFormValues, setProductFormValues] = useState(null);\n const [initialProductFormValues, setInitialProductFormValues] = useState(null);\n\n const [product, setProduct] = useState | null>(null);\n const [productSubset, setProductSubset] = useState(null);\n const [error, setError] = useState>(null);\n\n useEffect(() => {\n Api.OrderProduct.fetch(params.orderId, params.productId).then(product => {\n setProduct(product)\n }).catch(() => {\n setError('Page not found.');\n });\n }, [params.orderId, params.productId]);\n\n useEffect(() => {\n if (product) {\n setInitialProductFormValues(productToValues(product.data));\n\n const subsetId = product.data.subset_id;\n\n Api.Subset.fetch(subsetId).then(setProductSubset);\n }\n }, [product]);\n\n const onSubmit = async (\n subset: TApiSubset,\n subsetOptions: TApiSubsetOptions,\n values: IProductFormValues,\n formikHelpers: FormikHelpers\n ) => {\n if (!product) {\n return;\n }\n\n const updatedData = valuesToProduct(subset, subsetOptions, values);\n\n try {\n const updatedProduct = await Api.OrderProduct.update(product.order_id, product.id, updatedData);\n\n formikHelpers.setSubmitting(false);\n formikHelpers.resetForm({ values });\n\n history.push(paths.order(updatedProduct.order_id));\n } catch (error) {\n formikHelpers.setSubmitting(false);\n }\n };\n\n const onProductValuesChange = (values: IProductFormValues) => {\n setProductFormValues(values)\n };\n\n if (!product || !productSubset) {\n return ;\n }\n\n if (error) {\n return
Page not found.
\n }\n\n return (\n \n \n \n \n \n \n\n \n \n (\n \n {formik.isSubmitting ? 'Updating...' : 'Update'}\n \n )\n }\n onSubmit={onSubmit}\n onChange={onProductValuesChange}\n />\n \n\n \n \n \n {\n \n }\n \n \n \n \n \n )\n}\n\nexport default RealtimeOrderProduct;\n","import { CSSProperties } from 'react';\nimport * as React from \"react\";\nimport { Link as RouterLink, LinkProps } from 'react-router-dom';\n\ninterface IProps extends LinkProps {\n\tclassName?: string;\n}\n\nconst Link = (props: IProps) => {\n\tconst { to, className } = props;\n\n\tconst style: CSSProperties = {}\n\tif (to === '#') {\n\t\tstyle.color = 'red';\n\t}\n\n\treturn (\n\t\t\n\t\t\t{props.children}\n\t\t\n\t);\n};\n\nexport default Link;\n","import { OrderStatus } from \"../../../api/endpoints/Order\";\nimport React from \"react\";\nimport classNames from \"classnames\";\n\nconst OrderStatusBadge = (props: { status: OrderStatus }) => {\n const { status } = props;\n\n return {status}\n}\n\nexport default OrderStatusBadge;\n","import React from 'react';\nimport { Button, Modal } from \"react-bootstrap\";\n\ninterface Props {\n open: boolean;\n message?: string;\n cancelText?: string;\n confirmText?: string;\n onConfirm: () => void;\n onClose: () => void;\n}\n\nconst ConfirmDialog = (props: Props) => {\n const { open, onClose, onConfirm, message, cancelText, confirmText } = props;\n\n return (\n \n \n Confirm\n \n\n \n
\n {message}\n
\n
\n\n \n \n \n \n
\n )\n}\n\nConfirmDialog.defaultProps = {\n message: 'Are you sure?',\n cancelText: 'No',\n confirmText: 'Yes'\n};\n\nexport default ConfirmDialog;\n","import { useDispatch, useSelector } from \"react-redux\";\nimport { selectUser } from \"../../../store/selectors/UserSelectors\";\nimport React, { useCallback, useState } from \"react\";\nimport { TApiOrder } from \"../../../api/endpoints/Order\";\nimport {\n approveOrder,\n cancelOrder,\n duplicateOrder,\n rejectOrder,\n removeOrder\n} from \"../../../store/action-creators/orders\";\nimport Link from \"../../Navigation/Links/Link\";\nimport { paths } from \"../../../router\";\nimport { Badge, Dropdown } from \"react-bootstrap\";\nimport OrderStatusBadge from \"../../Ui/OrderStatusBadge\";\nimport IconButton from \"../../Buttons/IconButton\";\nimport { faEllipsisV, faMinusCircle } from \"@fortawesome/free-solid-svg-icons\";\nimport OrderPolicy from \"../../../policies/OrderPolicy\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { faCheckCircle, faClone, faTrashAlt } from \"@fortawesome/free-regular-svg-icons\";\nimport { useHistory } from \"react-router\";\nimport { Nullable } from \"../../../../types/utils\";\nimport OrderName from \"../../OrderName\";\nimport DateTime from \"../../../utils/DateTime\";\nimport ConfirmDialog from \"../../ConfrimDialog\";\n\ninterface IProps {\n order: TApiOrder;\n onOrderChange?: (order: Nullable) => void;\n}\n\nconst OrderRow = (props: IProps) => {\n const { order, onOrderChange } = props;\n const dispatch = useDispatch();\n const history = useHistory();\n const user = useSelector(selectUser);\n const [duplicateWarningDialogOpen, setDuplicateWarningDialogOpen] = useState(false);\n\n const onRemove = useCallback((order: TApiOrder) => () => {\n // @ts-ignore\n dispatch(removeOrder(order.id)).then(() => {\n onOrderChange?.(null);\n });\n }, [dispatch, onOrderChange]);\n\n const onDuplicate = useCallback((order: TApiOrder) => () => {\n if (order.has_legs) {\n setDuplicateWarningDialogOpen(true);\n } else {\n // @ts-ignore\n dispatch(duplicateOrder(order)).then(order => {\n history.push(paths.order(order.id));\n });\n }\n }, [dispatch, history]);\n\n const onDuplicateConfirmation = useCallback((order: TApiOrder) => () => {\n // @ts-ignore\n dispatch(duplicateOrder(order)).then(order => {\n history.push(paths.order(order.id));\n });\n }, [dispatch, history]);\n\n const onCancel = useCallback((order: TApiOrder) => () => {\n // @ts-ignore\n dispatch(cancelOrder(order)).then((result) => {\n onOrderChange?.(result);\n });\n }, [dispatch, onOrderChange]);\n\n const onApprove = useCallback((order: TApiOrder) => () => {\n // @ts-ignore\n dispatch(approveOrder(order)).then((result) => {\n onOrderChange?.(result);\n });\n }, [dispatch, onOrderChange]);\n\n const onReject = useCallback((order: TApiOrder) => () => {\n // @ts-ignore\n dispatch(rejectOrder(order)).then((result) => {\n onOrderChange?.(result);\n });\n }, [dispatch, onOrderChange]);\n\n return (\n \n {order.id}\n \n {order.customer}\n {order.category}\n \n {DateTime.Format.dateTimeWithTimezone(order.updated)}\n \n \n \n\n \n {\n OrderPolicy.canApprove(user, order) &&\n \n \n Approve order\n \n }\n\n {\n OrderPolicy.canReject(user, order) &&\n \n \n Reject order\n \n }\n\n \n \n Duplicate order\n \n\n {\n OrderPolicy.canRemove(user, order) &&\n \n \n Remove order\n \n }\n\n {\n OrderPolicy.canCancel(user, order) &&\n \n \n Cancel order\n \n }\n \n \n\n setDuplicateWarningDialogOpen(false)}\n onConfirm={onDuplicateConfirmation(order)}\n cancelText=\"Cancel\"\n confirmText=\"Proceed\"\n message=\"Please be aware that the quote you want to duplicate contains products using Legs (ENS extended products used to have Leg 1 and Leg 2 time steps), which are no longer available in the new 48r1 cycle. Previous quotes with Legs will be automatically updated to match the new 48r1 cycle requirements.\"\n />\n \n \n )\n}\n\nexport default OrderRow;\n","import React, { Fragment } from \"react\";\nimport { TApiOrder } from \"../../../api/endpoints/Order\";\nimport OrderRow from \"../OrderRow\";\nimport LoadingIndicator from \"../../Feedback/LoadingIndicator\";\nimport { Nullable } from \"../../../../types/utils\";\n\ninterface IProps {\n loading: boolean;\n error: boolean;\n orders: Array;\n onOrderChange?: (order?: Nullable) => void;\n}\n\nconst OrderListContent = (props: IProps) => {\n const { orders, loading, error, onOrderChange } = props;\n\n if (error) {\n return \n Sorry! It seems data is currently unavailable.\n ;\n }\n\n if (loading) {\n return \n \n \n \n ;\n }\n\n return (\n \n\n {\n orders.length ?\n orders.map(order => )\n :\n \n No orders found.\n \n }\n \n )\n}\n\nexport default OrderListContent;\n","import React from \"react\";\nimport { OrderStatus, TApiOrder } from \"../../api/endpoints/Order\";\nimport { Table } from \"react-bootstrap\";\nimport '../../scss/components/_order-list.scss';\nimport OrderListContent from \"./OrderListContent\";\nimport { Nullable } from \"../../../types/utils\";\n\nexport interface IProps {\n status?: OrderStatus;\n loading: boolean;\n error: boolean;\n orders: Array;\n onOrderChange?: (order?: Nullable) => void;\n}\n\nconst filterByStatus = (orders: Array, status: OrderStatus) => {\n return orders.filter(order => order.status === status);\n}\n\nconst OrderList = (props: IProps) => {\n const { status, loading, error, orders, onOrderChange } = props;\n\n const filteredOrders = status ? filterByStatus(orders, status) : orders\n\n return (\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
Ref no.NameCustomerTypeStatusLast updated
\n
\n )\n}\n\nexport default OrderList;\n","import React, { ReactNode } from 'react';\nimport { Card } from 'react-bootstrap';\n\nconst LicenseCard = (props: {\n title: string;\n children: ReactNode;\n action: ReactNode;\n}) => {\n const { title, children, action } = props;\n\n return (\n \n \n {title}\n\n \n {children}\n \n\n {\n action\n }\n \n \n )\n}\n\nexport default LicenseCard;\n","import React from \"react\";\nimport { Button, Col, Row } from \"react-bootstrap\";\nimport { paths } from \"../../router\";\nimport ExternalLink from \"../Navigation/Links/ExternalLink\";\nimport Link from \"../Navigation/Links/Link\";\nimport LicenseCard from \"../Ui/LicenseCard\";\n\nconst FORECAST_USER_GUIDE_URL = 'https://confluence.ecmwf.int/display/FUG/1+Introduction';\n\nconst OrderTypeSelector = () => {\n return (\n \n \n \n Configure\n \n }\n >\n

\n Browse the catalogue of ECMWF real-time products. ECMWF real-time products show how the weather is most\n likely to evolve.\n The Catalogue outlines the real-time meteorological and oceanographic products available from the ECMWF\n forecasting system for use by licence holders.\n

\n\n

\n Users are expected to have a background knowledge of atmospheric or oceanographic sciences,\n and are encouraged to consult the ECMWF Forecast User Guide.\n

\n\n

\n The majority of the data are delivered in GRIB1 or GRIB2 format, unless otherwise specified.\n

\n \n \n\n \n \n Order\n \n }\n >\n

\n Our Meteorological Archival and Retrieval System (MARS) enables you to list and retrieve meteorological data\n in GRIB/NetCDF via the Web API service (supported Python client software) and web interfaces where you can\n explore the parts of the archive available to you and get the MARS request syntax/scripts to download data\n via the web API. Members and licence holders can also check availability of the data and estimate the\n download size.\n

\n\n

\n If you are a (future) user from within a Member or Co-operating State and are conducting non-commercial\n research, please contact a \n Computing Representative from your country. All other users can order an\n Archive licence with ECMWF via the button below.\n

\n \n \n\n \n \n Order\n \n }\n >\n

\n This licence provides access to ecCharts, which is ECMWF's interactive interface for visualising ECMWF\n real-time data (note: no raw data is accessible from this interface).\n Users may request a one-month trial of ecCharts to evaluate its functionality.\n Trials are granted at Licensor discretion.\n

\n\n

\n Please note that access to all web products is provided on an ‘as is’ basis.\n The product range is adjusted in the light of experience and in response to the evolution\n of the forecasting system; newly developed products are added,\n but others may be discontinued, at the discretion of ECMWF.\n

\n \n \n\n \n \n Configure\n \n }\n >\n

\n The European cut-out package is a pre-defined package of real-time products. The package includes up to 15\n parameters from the real-time catalogue for the area 25°N-84°N, 74°W-45°E. You will receive these parameters\n with the highest spatial and temporal resolution. You can choose to include high-frequency products.\n

\n

\n Note that it is not possible to add additional data or change the selected parameters during the duration of\n the contract. The package does not include access to the Meteorological Archival and Retrieval System (MARS)\n nor ecCharts.\n

\n

\n Users are expected to have a background knowledge of atmospheric or oceanographic sciences, and are\n encouraged to consult ECMWF Forecast User Guide.\n

\n

\n The majority of the data are delivered in GRIB1 or GRIB2 format, unless otherwise specified.\n

\n \n \n
\n )\n}\n\nexport default OrderTypeSelector;\n","import React from \"react\";\nimport ReactPaginate from 'react-paginate';\nimport { SelectSingleInput } from \"../../Inputs/SelectInput\";\n\nexport interface IProps {\n total: number;\n perPage: number;\n currentPage: number;\n onPageChange: (page: number) => void;\n onPerPageChange: (perPage: number) => void;\n}\n\nconst PER_PAGE_OPTIONS = [10, 25, 50];\n\nconst Pagination = (props: IProps) => {\n const { onPageChange, total, perPage, currentPage } = props;\n\n const pageCount = Math.ceil(total / perPage);\n\n const onPerPageChange = (perPage: number | undefined) => {\n props.onPerPageChange(perPage ?? PER_PAGE_OPTIONS[0]);\n };\n\n return (\n
\n
\n \n per page:\n \n\n ({\n value: perPage.toString(),\n label: perPage.toString()\n })}\n items={PER_PAGE_OPTIONS}\n name=\"category\"\n onChange={onPerPageChange}\n selectedItem={perPage}\n placeholder=\"Filter by category\"\n />\n
\n\n onPageChange(selectedItem.selected))}\n pageRangeDisplayed={3}\n marginPagesDisplayed={2}\n nextLabel=\"Next\"\n breakLabel=\"...\"\n previousLabel=\"Previous\"\n renderOnZeroPageCount={undefined}\n pageClassName=\"page-item\"\n pageLinkClassName=\"page-link\"\n previousClassName=\"page-item\"\n previousLinkClassName=\"page-link\"\n nextClassName=\"page-item\"\n nextLinkClassName=\"page-link\"\n breakClassName=\"page-item\"\n breakLinkClassName=\"page-link\"\n containerClassName=\"pagination\"\n activeClassName=\"active\"\n hrefAllControls\n hrefBuilder={() => '#'}\n />\n
\n )\n};\n\nexport default Pagination;\n","import OrderList, { IProps as OrderListProps } from \"../OrderList\";\nimport Pagination, { IProps as PaginationProps } from \"../Navigation/Pagination\";\nimport React from \"react\";\n\ninterface IProps extends OrderListProps, PaginationProps {}\n\nconst PaginatedOrderList = (props: IProps) => {\n const { loading, error, orders, onPageChange, onPerPageChange, total, perPage, currentPage, onOrderChange } = props;\n\n return (\n
\n \n {\n total > 0 &&\n \n }\n
\n )\n\n}\n\nexport default PaginatedOrderList;\n","import { ButtonGroup, Dropdown, DropdownButton } from \"react-bootstrap\";\nimport React from \"react\";\nimport { paths } from \"../../router\";\nimport { OrderCategory, TApiOrder } from \"../../api/endpoints/Order\";\nimport { useHistory } from \"react-router-dom\";\n\nconst AddOrderButton = () => {\n const history = useHistory();\n\n const ORDER_ADD_PATH_MAPPING = {\n archive: paths.archiveOrderNew,\n web: paths.webOrderNew,\n realtime: paths.realtimeOrderNew,\n european_cutout: paths.euCutOutOrderNew\n }\n\n const onOrderAdd = (category: TApiOrder['category']) => () => {\n history.push(ORDER_ADD_PATH_MAPPING[category]);\n }\n\n return (\n \n Realtime\n Archive\n Web\n European cut-out\n \n )\n}\n\nexport default AddOrderButton;\n","import { OrderCategory, OrderStatus, TApiOrder } from \"../../../api/endpoints/Order\";\nimport React, { useCallback, useEffect, useState } from \"react\";\nimport { Col, Row } from \"react-bootstrap\";\nimport PageTitle from \"../../../components/Ui/PageTitle\";\nimport * as Api from \"../../../api\";\nimport { SelectSingleInput } from \"../../../components/Inputs/SelectInput\";\nimport TextInput from \"../../../components/Inputs/TextInput\";\nimport PaginatedOrderList from \"../../../components/PaginatedOrderList\";\nimport AddOrderButton from \"../../../components/AddOrderButton\";\nimport { Nullable } from \"../../../../types/utils\";\n\nconst SELECTABLE_ORDER_STATUSES = [\n OrderStatus.DRAFT,\n OrderStatus.SUBMITTED,\n OrderStatus.ACCEPTED,\n OrderStatus.REJECTED,\n OrderStatus.CANCELLED\n];\n\nconst SELECTABLE_ORDER_CATEGORIES = Object.values(OrderCategory);\n\nconst AdminDashboard = () => {\n const [limit, setLimit] = useState(10);\n const [totalItemsCount, setTotalItemsCount] = useState(0);\n const [currentPage, setCurrentPage] = useState(0);\n const [orders, setOrders] = useState | null>(null);\n const [ordersError, setOrdersError] = useState(false);\n const [selectedStatus, setSelectedStatus] = useState(undefined);\n const [selectedCategory, setSelectedCategory] = useState(undefined);\n const [searchTerm, setSearchTerm] = useState('');\n\n const fetchOrders = () => {\n return Api.Order.list({\n status: selectedStatus,\n search: searchTerm,\n category: selectedCategory,\n limit,\n offset: currentPage * limit\n })\n .then((response => {\n setOrders(response.results);\n setTotalItemsCount(response.count)\n }))\n .catch(() => setOrdersError(true))\n }\n\n useEffect(() => {\n setOrdersError(false);\n fetchOrders();\n }, [limit, searchTerm, selectedCategory, selectedStatus, currentPage]);\n\n const onOrderChange = (order?: Nullable) => {\n if (order) {\n setCurrentPage(0)\n } else {\n fetchOrders();\n }\n }\n\n const onLimitChange = useCallback((limit) => {\n setLimit(limit);\n setCurrentPage(0);\n }, []);\n\n const onStatusChange = useCallback((status) => {\n setSelectedStatus(status);\n setCurrentPage(0);\n }, []);\n\n const onSearchTermChange = useCallback((term) => {\n setSearchTerm(term);\n setCurrentPage(0)\n }, []);\n\n const onCategoryChange = useCallback((category) => {\n setSelectedCategory(category);\n setCurrentPage(0);\n }, []);\n\n return (\n
\n \n \n \n \n \n \n \n
\n \n\n ({\n value: category,\n label: category.toUpperCase()\n })}\n items={SELECTABLE_ORDER_CATEGORIES}\n name=\"category\"\n onChange={onCategoryChange}\n selectedItem={selectedCategory}\n placeholder=\"Filter by category\"\n />\n\n ({\n value: status,\n label: status.toUpperCase()\n })}\n items={SELECTABLE_ORDER_STATUSES}\n name=\"provider\"\n onChange={onStatusChange}\n selectedItem={selectedStatus}\n placeholder=\"Filter by status\"\n />\n
\n\n
\n \n
\n \n
\n \n \n setCurrentPage(page)}\n onPerPageChange={onLimitChange}\n />\n \n \n
\n )\n}\n\nexport default AdminDashboard;\n","import { Action } from 'redux';\nimport { ThunkAction, ThunkDispatch } from 'redux-thunk';\nimport * as Api from '../../api';\nimport { TApiFolder } from '../../api/endpoints/Folder';\nimport { TRootState } from '../reducers/RootReducer';\nimport ErrorHelpers from \"../../utils/ErrorHelpers\";\n\nexport const FOLDERS_FETCH_STARTED = 'FOLDERS_FETCH_STARTED';\nexport const FOLDERS_FETCH_COMPLETED = 'FOLDERS_FETCH_COMPLETED';\nexport const FOLDERS_FETCH_FAILED = 'FOLDERS_FETCH_FAILED';\n\nexport interface IFetchFoldersStartedAction {\n type: typeof FOLDERS_FETCH_STARTED\n}\n\nconst fetchFoldersStarted = (): IFetchFoldersStartedAction => ({\n type: FOLDERS_FETCH_STARTED\n});\n\nexport interface IFetchFoldersCompletedAction {\n type: typeof FOLDERS_FETCH_COMPLETED,\n data: Array\n}\n\nconst fetchFoldersCompleted = (data: Array): IFetchFoldersCompletedAction => ({\n type: FOLDERS_FETCH_COMPLETED,\n data\n});\n\nexport interface IFetchFoldersFailedAction {\n type: typeof FOLDERS_FETCH_FAILED,\n error: Error;\n}\n\nconst fetchFoldersFailed = (error: Error): IFetchFoldersFailedAction => ({\n type: FOLDERS_FETCH_FAILED,\n error\n});\n\nconst fetchFolders = () => {\n return async (dispatch: ThunkDispatch): Promise> => {\n try {\n dispatch(fetchFoldersStarted());\n\n const folders = await Api.Folder.list();\n\n dispatch(fetchFoldersCompleted(folders));\n\n return folders;\n } catch (error) {\n if (ErrorHelpers.isError(error)) {\n dispatch(fetchFoldersFailed(error));\n }\n\n throw error;\n }\n };\n};\n\nexport const FOLDERS_CREATE_STARTED = 'FOLDERS_CREATE_STARTED';\nexport const FOLDERS_CREATE_COMPLETED = 'FOLDERS_CREATE_COMPLETED';\nexport const FOLDERS_CREATE_FAILED = 'FOLDERS_CREATE_FAILED';\n\nconst createFolderStarted = () => ({\n type: FOLDERS_CREATE_STARTED\n});\n\nexport interface ICreateFoldersCompletedAction {\n type: typeof FOLDERS_CREATE_COMPLETED,\n data: TApiFolder\n}\n\nconst createFolderCompleted = (folder: TApiFolder): ICreateFoldersCompletedAction => ({\n type: FOLDERS_CREATE_COMPLETED,\n data: folder\n});\n\nconst createFolderFailed = (error: Error) => ({\n type: FOLDERS_CREATE_FAILED,\n error\n});\n\nconst createFolder = (params: { name: string; }): ThunkAction, TRootState, void, Action> => {\n return async (dispatch: ThunkDispatch<{}, void, Action>): Promise => {\n try {\n dispatch(createFolderStarted());\n\n const folder = await Api.Folder.create(params);\n\n dispatch(createFolderCompleted(folder));\n\n return folder;\n } catch (error) {\n if (ErrorHelpers.isError(error)) {\n dispatch(createFolderFailed(error));\n }\n\n throw error;\n }\n }\n}\n\nexport {\n createFolder,\n fetchFolders\n};\n","import { useFormik } from 'formik';\nimport React, { useCallback } from 'react';\nimport { Button, Form } from 'react-bootstrap';\nimport { useDispatch } from 'react-redux';\nimport { Action } from 'redux';\nimport { ThunkDispatch } from 'redux-thunk';\nimport * as Api from '../../../api';\nimport { createFolder } from '../../../store/action-creators/folders';\nimport { TRootState } from '../../../store/reducers/RootReducer';\n\ninterface IFolderFormProps {\n onSubmit: () => void;\n}\n\nconst FolderForm = (props: IFolderFormProps) => {\n const { onSubmit } = props;\n const dispatch = useDispatch>();\n\n const handleSubmit = useCallback((values) => {\n return dispatch(createFolder(values)).then(() => onSubmit());\n }, [dispatch, onSubmit]);\n\n const formik = useFormik({\n initialValues: { name: '' },\n onSubmit: (values, { setSubmitting, setErrors }) => {\n handleSubmit(values).then(() => {\n setSubmitting(false);\n }).catch(error => {\n setSubmitting(false);\n\n if (error instanceof Api.ValidationError) {\n const errors = error.data;\n setErrors(errors);\n }\n });\n }\n });\n\n return (\n
\n \n Folder Name\n \n {formik.touched.name && formik.errors.name ? {formik.errors.name} : null}\n \n\n \n
\n );\n};\n\nexport default FolderForm;\n","import React, { Fragment, useState } from 'react';\nimport { Button, Modal } from 'react-bootstrap';\nimport FolderForm from '../FolderForm';\n\nconst AddFolderControl = () => {\n const [show, setShow] = useState(false);\n\n const handleClose = () => setShow(false);\n const handleShow = () => setShow(true);\n\n return (\n \n \n\n \n \n Create new folder\n \n \n \n \n \n \n );\n};\n\nexport default AddFolderControl;\n","import { TApiFolder } from \"../../../api/endpoints/Folder\";\nimport React, { Fragment } from \"react\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { faFolder } from \"@fortawesome/free-solid-svg-icons\";\nimport Link from \"../../Navigation/Links/Link\";\nimport { paths } from \"../../../router\";\nimport dayjs from \"dayjs\";\n\nconst FolderList = (props: { folders: Array }) => {\n const { folders } = props;\n\n return (\n \n {\n folders.map(item => (\n \n \n \n \n {item.name}\n \n \n \n \n \n \n {dayjs(item.updated).fromNow()}\n \n \n ))\n }\n \n );\n};\n\nexport default FolderList;\n","import { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { faClone, faFileAlt, faTrashAlt } from \"@fortawesome/free-regular-svg-icons\";\nimport OrderName from \"../../../OrderName\";\nimport { Link } from \"react-router-dom\";\nimport { Badge, Dropdown } from \"react-bootstrap\";\nimport OrderStatusBadge from \"../../../Ui/OrderStatusBadge\";\nimport dayjs from \"dayjs\";\nimport IconButton from \"../../../Buttons/IconButton\";\nimport { faArrowsAlt } from \"@fortawesome/free-solid-svg-icons\";\nimport React, { useCallback, useState } from \"react\";\nimport { TApiOrder } from \"../../../../api/endpoints/Order\";\nimport { IFolder } from \"../index\";\nimport { useDispatch } from \"react-redux\";\nimport { duplicateOrder, moveOrderToFolder, removeOrder } from \"../../../../store/action-creators/orders\";\nimport ConfirmDialog from \"../../../ConfrimDialog\";\nimport { Nullable } from \"../../../../../types/utils\";\n\ninterface Props {\n order: TApiOrder;\n currentFolderId: Nullable;\n availableFolders: Array;\n}\n\nconst OrderListItem = (props: Props) => {\n const { order, availableFolders, currentFolderId } = props;\n const dispatch = useDispatch();\n const [duplicateWarningDialogOpen, setDuplicateWarningDialogOpen] = useState(false);\n\n const onMoveToFolder = useCallback((order: TApiOrder, targetFolderId: IFolder['id']) => () => {\n dispatch(moveOrderToFolder(order, currentFolderId, targetFolderId));\n }, [dispatch, currentFolderId]);\n\n const onRemove = useCallback((order: TApiOrder) => () => {\n dispatch(removeOrder(order.id));\n }, [dispatch]);\n\n const onDuplicateConfirmation = useCallback((order: TApiOrder) => () => {\n // @ts-ignore\n dispatch(duplicateOrder(order)).then(() => {\n setDuplicateWarningDialogOpen(false);\n });\n }, [dispatch]);\n\n const onDuplicate = useCallback((order: TApiOrder) => () => {\n if (order.has_legs) {\n setDuplicateWarningDialogOpen(true);\n } else {\n dispatch(duplicateOrder(order));\n }\n }, [dispatch]);\n\n return (\n \n \n\n \n \n \n\n \n \n ref: {order.id}\n \n \n\n \n {order.category}\n \n\n \n \n \n\n {order.customer}\n\n {dayjs(order.updated).fromNow()}\n\n \n \n \n\n \n {\n availableFolders.map(folder =>\n \n {folder.name}\n \n )\n }\n \n \n\n \n \n \n\n setDuplicateWarningDialogOpen(false)}\n onConfirm={onDuplicateConfirmation(order)}\n cancelText=\"Cancel\"\n confirmText=\"Proceed\"\n message=\"Please be aware that the quote you want to duplicate contains products using Legs (ENS extended products used to have Leg 1 and Leg 2 time steps), which are no longer available in the new 48r1 cycle. Previous quotes with Legs will be automatically updated to match the new 48r1 cycle requirements.\"\n />\n \n )\n}\n\nexport default OrderListItem;\n","import { TApiOrder } from \"../../../api/endpoints/Order\";\nimport React, { Fragment } from \"react\";\nimport OrderListItem from \"./OrderListItem\";\n\nexport interface IFolder {\n id: number | null;\n name: string\n}\n\ninterface IProps {\n currentFolderId: number | null;\n orders: Array;\n availableFolders: Array;\n}\n\nconst OrderList = (props: IProps) => {\n const { orders, availableFolders, currentFolderId } = props;\n\n return (\n \n {\n orders.map(item =>\n \n )\n }\n \n );\n};\n\nexport default OrderList;\n","import { TApiFolder } from \"../../../api/endpoints/Folder\";\nimport React, { Fragment } from \"react\";\nimport { paths } from \"../../../router\";\nimport Link from \"../../Navigation/Links/Link\";\nimport { Breadcrumb } from \"react-bootstrap\";\nimport { faFolder } from \"@fortawesome/free-solid-svg-icons\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\n\nconst FolderBreadcrumbs = (props: { currentFolder: TApiFolder | null }) => {\n const { currentFolder } = props;\n\n return (\n
\n \n \n {\n currentFolder ?\n \n All orders\n {currentFolder.name}\n \n :\n All orders\n }\n \n
\n )\n}\n\nexport default FolderBreadcrumbs;\n","import { useParams } from \"react-router-dom\";\nimport { shallowEqual, useDispatch, useSelector } from \"react-redux\";\nimport React, { Fragment, useEffect } from \"react\";\nimport { fetchFolders } from \"../../../store/action-creators/folders\";\nimport { fetchOrders } from \"../../../store/action-creators/orders\";\nimport { find, isEmpty } from \"lodash\";\nimport { TRootState } from \"../../../store/reducers/RootReducer\";\nimport { TFoldersState } from \"../../../store/reducers/folders\";\nimport { TOrdersSubState } from \"../../../store/reducers/orders\";\nimport AddFolderControl from \"../AddFolderControl\";\nimport { Card, Table } from \"react-bootstrap\";\nimport Link from \"../../Navigation/Links/Link\";\nimport { paths } from \"../../../router\";\nimport FolderList from \"../FolderList\";\nimport OrderList, { IFolder } from \"../OrderList\";\nimport dayjs from \"dayjs\";\nimport relativeTime from \"dayjs/plugin/relativeTime\";\nimport AddOrderButton from \"../../AddOrderButton\";\nimport LoadingIndicator from \"../../Feedback/LoadingIndicator\";\nimport FolderBreadcrumbs from \"../FolderBreadcrumbs\";\n\ndayjs.extend(relativeTime);\n\ninterface IRouteParams {\n folderId?: string\n}\n\nconst Browser = () => {\n const params = useParams();\n const dispatch = useDispatch();\n const { folderId } = params;\n const id = (folderId && parseInt(folderId, 10)) || null;\n\n useEffect(() => {\n dispatch(fetchFolders())\n }, []);\n\n useEffect(() => {\n dispatch(fetchOrders({ folder_id: id }));\n }, [id]);\n\n const foldersState = useSelector(state => state.folders, shallowEqual);\n const ordersState = useSelector(state => state.orders[id || -1], shallowEqual);\n\n if (!ordersState) {\n return ;\n }\n\n if (foldersState.error || ordersState.error) {\n return
Sorry! It seems data is currently unavailable.
;\n }\n\n if (!foldersState.loadedAt) {\n return ;\n }\n\n const folders = foldersState.data;\n const orders = ordersState.data;\n\n const currentFolder = (id && find(folders, { id: id })) || null;\n\n if (folderId && !currentFolder) {\n return
Sorry! It seems folder could not be found.
\n }\n\n const foldersInFolder = folders.filter(folder => folder.parent_id === id);\n const availableFolders: Array = folders.filter(folder => folder.id !== id);\n if (id !== null) {\n availableFolders.unshift({\n id: null,\n name: 'Root folder'\n });\n }\n\n return (\n \n
\n \n\n
\n \n\n \n
\n
\n\n \n \n \n {\n currentFolder &&\n \n \n \n \n }\n\n \n\n {\n ordersState.loading ? (\n \n \n \n ) : \n }\n\n {\n isEmpty(foldersInFolder) && isEmpty(orders) && ordersState.loadedAt &&\n \n \n \n }\n \n
\n \n . .\n \n
\n \n
You have no orders.
\n
\n
\n );\n};\n\nexport default Browser;\n","import React from 'react';\nimport { Switch, Route, useRouteMatch } from 'react-router-dom';\nimport Browser from './Browser';\n\nconst OrderBrowser = () => {\n const { path } = useRouteMatch();\n\n return (\n
\n \n \n \n \n \n \n \n \n
\n );\n\n};\n\nexport default OrderBrowser;\n","import { Col, Row } from \"react-bootstrap\";\nimport PageTitle from \"../../components/Ui/PageTitle\";\nimport React, { Fragment, useEffect } from \"react\";\nimport { selectUser } from \"../../store/selectors/UserSelectors\";\nimport { shallowEqual, useDispatch, useSelector } from \"react-redux\";\nimport { UserType } from \"../../entities/User\";\nimport OrderList from \"../../components/OrderList/index\";\nimport OrderBrowser from \"../../components/OrderBrowser\";\nimport { TRootState } from \"../../store/reducers/RootReducer\";\nimport { fetchOrders } from \"../../store/action-creators/orders\";\nimport { TOrdersSubState } from \"../../store/reducers/orders\";\n\nconst CustomerOrders = () => {\n const dispatch = useDispatch();\n const ordersState = useSelector(state => state.orders[-1], shallowEqual);\n\n useEffect(() => {\n dispatch(fetchOrders());\n }, []);\n\n if (!ordersState) {\n return null;\n }\n\n return \n}\n\nconst ORDERS_COMPONENT_BY_USER_TYPE = {\n [UserType.Unknown]: null,\n [UserType.Customer]: CustomerOrders,\n [UserType.CCP]: OrderBrowser,\n [UserType.Admin]: OrderBrowser\n}\n\nconst Orders = () => {\n const user = useSelector(selectUser);\n const Component = ORDERS_COMPONENT_BY_USER_TYPE[user.type];\n\n if (!Component) {\n return null;\n }\n\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n )\n}\n\nexport default Orders;\n","import React, { useEffect } from \"react\";\nimport { shallowEqual, useDispatch, useSelector } from \"react-redux\";\nimport { selectUser } from \"../../store/selectors/UserSelectors\";\nimport { UserType } from \"../../entities/User\";\nimport { Col, Row } from \"react-bootstrap\";\nimport PageTitle from \"../../components/Ui/PageTitle\";\nimport OrderList from \"../../components/OrderList\";\nimport OrderTypeSelector from \"../../components/OrderTypeSelector\";\nimport { OrderStatus } from \"../../api/endpoints/Order\";\nimport { fetchOrders } from \"../../store/action-creators/orders\";\nimport { TRootState } from \"../../store/reducers/RootReducer\";\nimport { TOrdersSubState } from \"../../store/reducers/orders\";\nimport AdminDashboard from \"./AdminDashboard\";\nimport Orders from \"../Orders\";\n\nconst AnonymousUserDashboard = () => {\n return (\n \n \n \n \n \n \n \n\n \n \n \n );\n}\n\nconst CCPUserDashboard = () => {\n return (\n \n );\n}\n\nconst CustomerDashboard = () => {\n const dispatch = useDispatch();\n const ordersState = useSelector(state => state.orders[-1], shallowEqual);\n\n useEffect(() => {\n dispatch(fetchOrders());\n }, []);\n\n return (\n
\n

Pending orders

\n {\n ordersState &&\n \n }\n\n

Start new order

\n \n
\n );\n}\n\nconst DASHBOARD_BY_USERTYPE = {\n [UserType.Unknown]: AnonymousUserDashboard,\n [UserType.Customer]: CustomerDashboard,\n [UserType.CCP]: CCPUserDashboard,\n [UserType.Admin]: AdminDashboard,\n}\n\nconst Dashboard = () => {\n const user = useSelector(selectUser);\n const DashboardComponent = DASHBOARD_BY_USERTYPE[user.type];\n\n return (\n \n )\n}\n\nexport default Dashboard;\n","import * as _ from 'lodash';\nimport * as React from 'react';\nimport AsyncSelect from 'react-select/lib/Async';\nimport { Styles } from 'react-select/lib/styles';\nimport { Param } from '../../../../api-entities/Param';\nimport { TApiParameter } from '../../../../api/endpoints/Parameter';\nimport ParamLabel from '../../../ParamLabel';\nimport { ValueType } from \"react-select/lib/types\";\n\nconst colourStyles: Partial = {\n control: styles => ({ ...styles, backgroundColor: 'white', borderColor: '#d6d6d6' }),\n dropdownIndicator: styles => ({ ...styles, color: 'black' }),\n indicatorSeparator: styles => ({ ...styles, backgroundColor: 'transparent' })\n};\n\nconst getFilteredParams = _.debounce(\n (resolve: (value: TApiParameter[]) => void, text: string, options: Param[]) => {\n text = text.toLowerCase();\n resolve(\n options.filter(\n p =>\n p.id.toString().includes(text) ||\n p.name.toLowerCase().includes(text) ||\n p.shortname.toLowerCase().includes(text)\n )\n );\n },\n 250\n);\n\nconst isArray = (value: ValueType): value is ReadonlyArray => {\n return Array.isArray(value);\n}\n\nconst castValue = (value: ValueType): Array => {\n if (isArray(value)) {\n return [...value];\n } else if (!value) {\n return [];\n } else {\n return [value];\n }\n}\n\ntype TProps = {\n params: Array;\n value: Array;\n onChange: (params: Array) => void;\n isMulti?: boolean;\n}\n\n/**\n * A control for selecting parameters to filter the set of available subsets.\n */\nconst ParamSearch = (props: TProps) => {\n const { params, value, onChange, isMulti } = props;\n\n const promiseOptions = (inputValue: string) =>\n new Promise(resolve => getFilteredParams(resolve, inputValue, params));\n\n const onSelectChange = (value: ValueType) => {\n const castedValue = castValue(value);\n\n onChange(castedValue);\n }\n\n return (\n
\n \n\n \n isMulti={isMulti}\n isClearable\n formatOptionLabel={p => }\n getOptionValue={p => p.shortname}\n value={value}\n loadOptions={promiseOptions}\n placeholder=\"Enter a search query\"\n noOptionsMessage={() => 'No options match your query.'}\n onChange={onSelectChange}\n styles={colourStyles}\n />\n
\n );\n};\n\nexport default ParamSearch;\n","import * as React from \"react\";\nimport { TApiSet } from '../../../../../api/endpoints/Set';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faChevronRight } from '@fortawesome/free-solid-svg-icons';\n\ntype OwnProps = {\n set: TApiSet;\n isAvailable: boolean;\n isSelected: boolean;\n onClick: () => void;\n};\n\n/**\n * A button representing a set.\n */\nconst Button = (props: OwnProps) => {\n const { isAvailable, set } = props;\n\n return (\n \n Set {set.name}: {set.description}{\" \"}\n \n \n );\n};\n\nexport default Button;\n","import * as React from 'react';\nimport { TApiSubset } from '../../../../../api/endpoints/Subset';\nimport Tooltip from '../../../../Ui/Tooltip';\nimport { formatSubsetLabel } from '../../../../../utils/Format';\n\ninterface IProps {\n subset: TApiSubset;\n isAvailable: boolean;\n onClick: () => void;\n}\n\n/**\n * A button representing a subset.\n */\nconst SubsetButton = (props: IProps) => {\n const { subset, isAvailable, onClick } = props;\n\n const label = formatSubsetLabel(subset);\n\n return (\n \n );\n};\n\nexport default SubsetButton;\n","import * as React from 'react';\nimport * as Api from '../../../../api';\nimport { TApiParameter } from '../../../../api/endpoints/Parameter';\nimport { TApiSet } from '../../../../api/endpoints/Set';\nimport { groupBy, map, uniq } from 'lodash';\nimport { TApiSubset } from '../../../../api/endpoints/Subset';\nimport Button from './Button';\nimport { useState, Fragment, useEffect } from 'react';\nimport SubsetButton from './SubsetButton';\nimport SubsetTypes from \"../../../../utils/SubsetTypes\";\n\ninterface ISubsetListProps {\n set: TApiSet;\n availableSubsetIds: Array;\n onSubsetSelect: (subset: TApiSubset) => void;\n}\n\nconst SubsetList = (props: ISubsetListProps) => {\n const { set, availableSubsetIds, onSubsetSelect } = props;\n\n const subsetsByType = groupBy(set.subsets, subset => subset.type);\n\n return (\n \n {/**/}\n\n

Set {set.name}: {set.description}

\n\n {\n map(subsetsByType, (subsets, type) => {\n return (\n
\n

{SubsetTypes.humanize(type)}

\n {\n subsets.map(subset => (\n onSubsetSelect(subset)}\n />\n ))\n }\n
\n );\n })\n }\n
\n );\n};\n\ninterface IProps {\n sets: Array,\n params: Array,\n onSubsetSelect: (subset: TApiSubset) => void\n}\n\n/**\n * Displays all sets grouped by category.\n */\nconst ProductSelectPanels = (props: IProps) => {\n const { sets, params, onSubsetSelect } = props;\n const setsByCategory = groupBy(sets, set => set.category);\n const [selectedSet, setSelectedSet] = useState(null);\n const [subsetsByParams, setSubsetsByParams] = useState>([]);\n\n const paramShortnames = params.map(param => param.shortname);\n useEffect(() => {\n Api.Subset.list({\n paramShortnames\n }).then(setSubsetsByParams);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [paramShortnames.join(',')]);\n\n const availableSetIds = uniq(subsetsByParams.map(subset => subset.set_id));\n const availableSubsetIds = subsetsByParams.map(subset => subset.id);\n\n return (\n
\n
\n {\n map(setsByCategory, (setsInCategory, category) => (\n
\n

{category}

\n {\n setsInCategory.map(set => (\n setSelectedSet(set)}\n />\n ))\n }\n
\n ))\n }\n
\n
\n {\n selectedSet &&\n \n }\n
\n
\n );\n};\n\nexport default ProductSelectPanels;\n","import React, { useEffect, useState } from 'react';\nimport { TApiParameter } from '../../../api/endpoints/Parameter';\nimport { TApiSubset } from '../../../api/endpoints/Subset';\nimport ParamSearch from './ParamSearch';\nimport * as Api from '../../../api';\nimport { TApiSet } from '../../../api/endpoints/Set';\nimport ProductSelectPanels from './SubsetPicker';\nimport { Card, Alert } from 'react-bootstrap';\nimport { selectParameters } from \"../../../store/selectors/new/parameters\";\nimport { useSelector } from \"react-redux\";\n\ninterface IProps {\n onChange: (subset: TApiSubset, params: Array) => void;\n}\n\nconst SubsetSelect = (props: IProps) => {\n const { onChange } = props;\n const params = Object.values(useSelector(selectParameters));\n const [sets, setSets] = useState>([]);\n const [selectedParams, setSelectedParams] = useState>([]);\n\n const onSubsetChange = (subset: TApiSubset) => {\n onChange(subset, selectedParams);\n }\n\n useEffect(() => {\n Api.Set.list().then(setSets);\n }, []);\n\n return (\n \n \n
\n \n\n {selectedParams.length > 0 && (\n
\n \n The sets and subsets that do not meet any of the search parameters you specified are now\n greyed out, but are still clickable if you wish to select them.\n \n
\n )}\n
\n\n \n
\n
\n );\n};\n\nexport default SubsetSelect;\n","import React, { ReactNode, useCallback, useEffect, useState } from 'react';\nimport { TApiSubset } from '../../api/endpoints/Subset';\nimport { TApiSubsetOptions } from '../../api/endpoints/SubsetOption';\nimport { Switch, Route, useHistory, useRouteMatch, useLocation } from 'react-router';\nimport SubsetOptionsSelect from './SubsetOptionsSelect';\nimport SubsetSelect from './SubsetSelect';\nimport { IProductFormValues } from './ProductForm';\nimport { Card, Col, Row } from \"react-bootstrap\";\nimport ConfigurationPreview from \"./ConfigurationPreview\";\nimport { FormikProps } from \"formik\";\nimport { TApiParameter } from \"../../api/endpoints/Parameter\";\nimport queryString from 'query-string'\n\ninterface IProps {\n actions?: (subset: TApiSubset, subsetOptions: TApiSubsetOptions, formik: FormikProps) => ReactNode;\n}\n\nconst subsetOptionsFormUrl = (currentUrl: string, subset: TApiSubset, params: Array) => {\n const query = queryString.stringify({\n params: params.map(p => p.shortname)\n })\n\n return [`${currentUrl}/subset/${subset.id}`, query].join('?');\n}\n\nconst RealtimeProductConfigurator = (props: IProps) => {\n const { actions } = props;\n const history = useHistory();\n const location = useLocation();\n const match = useRouteMatch();\n\n const currentUrl = match.url;\n\n const [productFormValues, setProductFormValues] = useState(null);\n const [currentSubset, setCurrentSubset] = useState(null);\n\n useEffect(() => {\n setProductFormValues(null);\n }, [location.pathname])\n\n const onSubsetChange = useCallback((subset: TApiSubset, params: Array) => {\n history.push(subsetOptionsFormUrl(currentUrl, subset, params));\n setCurrentSubset(subset);\n }, [history, currentUrl]);\n\n const onProductValuesChange = useCallback((values: IProductFormValues) => {\n setProductFormValues(values)\n }, []);\n\n return (\n
\n \n \n \n \n\n \n \n \n \n \n\n \n \n \n {\n \n }\n \n \n \n \n \n \n
\n );\n};\n\nexport default RealtimeProductConfigurator;\n","import React, { Fragment, useEffect } from \"react\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { useParams } from \"react-router-dom\";\nimport { TRootState } from \"../../store/reducers/RootReducer\";\nimport { TOrdersByIdState } from \"../../store/reducers/ordersById\";\nimport { fetchOrderDetails, updateOrder } from \"../../store/action-creators/orders\";\nimport { Button } from \"react-bootstrap\";\nimport RealtimeProductConfigurator from \"../../components/RealtimeProductConfigurator\";\nimport { valuesToProduct } from \"../../utils/ProductFormHelpers\";\nimport { paths } from \"../../router\";\nimport { useHistory } from \"react-router\";\nimport { TApiSubset } from \"../../api/endpoints/Subset\";\nimport { TApiSubsetOptions } from \"../../api/endpoints/SubsetOption\";\nimport { IProductFormValues } from \"../../components/RealtimeProductConfigurator/ProductForm\";\nimport { FormikProps } from \"formik\";\nimport LoadingIndicator from \"../../components/Feedback/LoadingIndicator\";\nimport { OrderCategory, TApiOrderDetails } from \"../../api/endpoints/Order\";\nimport * as Api from \"../../api\";\n\ninterface IRouteParams {\n orderId: string;\n}\n\nconst RealtimeOrderProductNew = () => {\n const history = useHistory();\n const dispatch = useDispatch();\n const params = useParams();\n\n const orderState = useSelector(store => store.ordersById[params.orderId])\n const order = orderState?.data;\n\n useEffect(() => {\n dispatch(fetchOrderDetails(params.orderId));\n }, [params.orderId])\n\n if (!order || orderState?.loading) {\n return ;\n }\n\n if (order.category !== OrderCategory.REALTIME) {\n return
Page not found.
\n }\n\n const onSubmit = (\n subset: TApiSubset,\n subsetOptions: TApiSubsetOptions,\n formik: FormikProps\n ) => () => {\n const newProductData = valuesToProduct(subset, subsetOptions, formik.values)\n\n formik.setSubmitting(true);\n\n formik.submitForm().then(() => {\n if (!formik.isValid) {\n return;\n }\n\n Api.OrderProduct.create(order.id, newProductData)\n .then(() => {\n formik.setSubmitting(false);\n formik.resetForm({ values: formik.values });\n\n history.push(paths.order(order.id));\n })\n .catch(() => {\n formik.setSubmitting(false);\n });\n })\n };\n\n return (\n \n {\n return (\n \n {formik.isSubmitting ? 'Adding to order...' : 'Add to order'}\n \n )\n }\n }\n />\n \n )\n}\n\nexport default RealtimeOrderProductNew;\n","import { useFormik } from 'formik';\nimport React, { Fragment, useCallback } from 'react';\nimport { Button, Form } from 'react-bootstrap';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { Action } from 'redux';\nimport { ThunkDispatch } from 'redux-thunk';\nimport * as Api from '../../../api';\nimport { TRootState } from '../../../store/reducers/RootReducer';\nimport { TApiOrderDetails, TOrderCreateParams } from \"../../../api/endpoints/Order\";\nimport { createOrder } from \"../../../store/action-creators/orders\";\nimport HelpTexts from \"../../HelpTexts\";\nimport FormError from \"../../RealtimeProductConfigurator/FormError\";\nimport { DistributiveOmit } from \"../../../../types/utils\";\nimport OrderPolicy from \"../../../policies/OrderPolicy\";\nimport Checkbox from \"../../Inputs/Checkbox/Checkbox\";\nimport InfoTooltip from \"../../Ui/InfoTooltip\";\nimport ExternalLink from \"../../Navigation/Links/ExternalLink\";\nimport { selectUser } from \"../../../store/selectors/UserSelectors\";\nimport Footnote from \"../../RealtimeProductConfigurator/Footnote\";\nimport dayjs from \"dayjs\";\nimport StartDateField from \"./StartDateField\";\n\nexport interface IOrderFormProps {\n onSubmit: (order: TApiOrderDetails) => void;\n orderProps: DistributiveOmit\n}\n\ninterface IOrderCreationFormValues {\n name: string;\n start_date: string;\n small_business: boolean;\n research: boolean;\n}\n\nconst OrderForm = (props: IOrderFormProps) => {\n const { orderProps, onSubmit } = props;\n const dispatch = useDispatch>();\n const user = useSelector(selectUser);\n\n const handleSubmit = useCallback((values: IOrderCreationFormValues) => {\n const { name, small_business, research, start_date } = values;\n\n return dispatch(createOrder({\n ...orderProps,\n name,\n start_date,\n ...(OrderPolicy.canRequestSmallBusinessDiscount(user, orderProps) && { small_business }),\n ...(OrderPolicy.canRequestResearchLicence(user, orderProps) && { research })\n })).then((order) => onSubmit(order));\n }, [orderProps, onSubmit, dispatch]);\n\n const formik = useFormik({\n initialValues: {\n name: '',\n start_date: '',\n small_business: false,\n research: false\n },\n onSubmit: (values, { setSubmitting, setErrors }) => {\n handleSubmit(values).then(() => {\n setSubmitting(false);\n }).catch(error => {\n setSubmitting(false);\n\n if (error instanceof Api.ValidationError) {\n const errors = error.data;\n setErrors(errors);\n }\n });\n }\n });\n\n const onSmallBusinessChange = useCallback((checked: boolean) => {\n formik.setFieldValue('small_business', checked);\n\n if (checked) {\n formik.setFieldValue('research', false);\n }\n }, [formik]);\n\n const onResearchChange = useCallback((checked: boolean) => {\n formik.setFieldValue('research', checked);\n\n if (checked) {\n formik.setFieldValue('small_business', false);\n }\n }, [formik]);\n\n return (\n
\n \n Order Name\n \n \n \n\n \n\n {\n OrderPolicy.canRequestSmallBusinessDiscount(user, orderProps) &&\n \n \n \n \n }\n\n {\n OrderPolicy.canRequestResearchLicence(user, orderProps) &&\n \n \n\n \n \n }\n\n \n \n );\n};\n\nexport default OrderForm;\n","import React, { Fragment, useState } from \"react\";\nimport { Button, Modal } from \"react-bootstrap\";\nimport OrderForm, { IOrderFormProps } from \"../OrderBrowser/OrderForm\";\nimport { TApiOrderDetails } from \"../../api/endpoints/Order\";\nimport { FormikProps } from \"formik\";\nimport { noop } from \"lodash\";\n\ninterface IProps {\n formik?: FormikProps;\n orderProps: IOrderFormProps['orderProps'];\n onSuccess?: (order: TApiOrderDetails) => void;\n disabled?: boolean;\n}\n\nexport interface ICreateOrderButtonProps extends IProps {\n}\n\nconst CreateOrderButton = (props: IProps) => {\n const { formik, orderProps, onSuccess, disabled } = props;\n const [show, setShow] = useState(false);\n\n const handleClose = () => setShow(false);\n const handleClick = () => {\n if (formik) {\n formik.submitForm().then(() => {\n if (formik.isValid) {\n setShow(true);\n }\n }).catch(noop);\n } else {\n setShow(true);\n }\n }\n\n const onSubmit = (order: TApiOrderDetails) => {\n handleClose();\n onSuccess && onSuccess(order);\n }\n\n return (\n \n \n\n \n \n Create new order\n \n \n \n \n \n \n );\n}\n\nexport default CreateOrderButton;\n","import { OrderCategory } from \"../../api/endpoints/Order\";\nimport { TOrderProductData } from \"../../api/endpoints/OrderProduct\";\n\nexport const BASKET_PRODUCT_ADD_COMPLETED = 'BASKET_PRODUCT_ADD_COMPLETED';\n\nexport interface IBasketProductAddCompletedAction {\n type: typeof BASKET_PRODUCT_ADD_COMPLETED,\n product: TOrderProductData\n}\n\nconst addProductToBasket = (product: TOrderProductData): IBasketProductAddCompletedAction => {\n return {\n type: BASKET_PRODUCT_ADD_COMPLETED,\n product\n }\n}\n\nexport const BASKET_PRODUCT_REMOVE_COMPLETED = 'BASKET_PRODUCT_REMOVE_COMPLETED';\n\nexport interface IBasketProductRemoveCompletedAction {\n type: typeof BASKET_PRODUCT_REMOVE_COMPLETED,\n productId: string\n}\n\nconst removeProductFromBasket = (productId: string): IBasketProductRemoveCompletedAction => {\n return {\n type: BASKET_PRODUCT_REMOVE_COMPLETED,\n productId\n }\n}\n\nexport const BASKET_CLEAR_COMPLETED = 'BASKET_CLEAR_COMPLETED';\n\nexport interface IBasketClearCompletedAction {\n type: typeof BASKET_CLEAR_COMPLETED\n}\n\nconst clearBasket = (): IBasketClearCompletedAction => {\n return {\n type: BASKET_CLEAR_COMPLETED\n }\n}\n\nexport {\n addProductToBasket,\n removeProductFromBasket,\n clearBasket\n}\n","import React, { Fragment } from \"react\";\nimport { FormikProps } from \"formik\";\nimport { isEmpty, noop } from \"lodash\";\nimport { useHistory } from \"react-router\";\nimport PageTitle from \"../../components/Ui/PageTitle\";\nimport { Button, Col, Row } from \"react-bootstrap\";\nimport ProductConfigurator from \"../../components/RealtimeProductConfigurator\";\nimport CreateOrderButton from \"../../components/CreateOrderButton\";\nimport { valuesToProduct } from \"../../utils/ProductFormHelpers\";\nimport { OrderCategory, TApiOrderDetails } from \"../../api/endpoints/Order\";\nimport { paths } from \"../../router\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { addProductToBasket } from \"../../store/action-creators/basket\";\nimport { TApiSubset } from \"../../api/endpoints/Subset\";\nimport { TApiSubsetOptions } from \"../../api/endpoints/SubsetOption\";\nimport { IProductFormValues } from \"../../components/RealtimeProductConfigurator/ProductForm\";\n\nimport { isLoggedIn } from \"../../store/selectors/UserSelectors\";\n\nconst RealtimeProductNew = () => {\n const history = useHistory();\n const dispatch = useDispatch();\n const isUserLoggedIn = useSelector(isLoggedIn);\n\n const onOrderSaved = (order: TApiOrderDetails) => {\n history.push(paths.order(order.id))\n };\n\n const onAddToBasket = (\n subset: TApiSubset,\n subsetOptions: TApiSubsetOptions,\n formik: FormikProps\n ) => {\n formik.submitForm().then(() => {\n // Workaround for for a bug in formik where submitForm method does not reject the promise when validation fails\n // See: https://github.com/formium/formik/issues/1580\n formik.validateForm(formik.values).then(errors => {\n if (isEmpty(errors)) {\n dispatch(addProductToBasket(valuesToProduct(subset, subsetOptions, formik.values)));\n history.push(paths.root);\n }\n }).catch(noop);\n }).catch(noop)\n }\n\n return (\n \n \n \n \n \n \n\n {\n return (\n \n {\n isUserLoggedIn &&\n \n }\n \n \n )\n }\n }\n />\n \n )\n}\n\nexport default RealtimeProductNew;\n","import React, { ReactNode } from \"react\";\nimport { Modal } from \"react-bootstrap\";\n\ninterface IProps {\n show: boolean;\n onClose: () => void;\n actions?: ReactNode\n}\n\nconst ConfirmationModal = (props: IProps) => {\n const { actions, show, onClose } = props;\n\n return (\n \n \n Log-in required\n \n\n \n

You must be signed in in order to save an order.

\n
\n\n \n {\n actions\n }\n \n
\n )\n}\n\nexport default ConfirmationModal;\n","import React, { Fragment, useCallback, useState } from \"react\";\nimport { useSelector } from \"react-redux\";\nimport { Button, Card } from \"react-bootstrap\";\nimport { useHistory } from \"react-router\";\nimport PageTitle from \"../../components/Ui/PageTitle\";\nimport WebOrderDetails from \"../Order/OrderDetails/WebOrderDetails\";\nimport { isLoggedIn } from \"../../store/selectors/UserSelectors\";\nimport { config } from \"../../config\";\nimport ConfirmationModal from \"../../components/Feedback/Modal/ConfirmationModal\";\nimport CreateOrderButton from \"../../components/CreateOrderButton\";\nimport { paths } from \"../../router\";\nimport { OrderCategory, TApiOrderDetails } from \"../../api/endpoints/Order\";\n\nconst WebOrderNew = () => {\n const history = useHistory();\n const userLoggedIn = useSelector(isLoggedIn);\n const [showLoginPopup, setShowLoginPopup] = useState(false);\n\n const onLoginClick = useCallback(() => {\n window.location.href = config.loginUrl;\n }, []);\n\n const onOrderSaved = (order: TApiOrderDetails) => {\n history.push(paths.order(order.id));\n }\n\n const onNotLoggedInSave = () => {\n setShowLoginPopup(true);\n }\n\n return (\n \n \n\n \n \n \n \n \n\n {\n userLoggedIn ?\n \n : \n }\n\n setShowLoginPopup(false)}\n actions={\n \n \n \n \n }\n />\n \n )\n}\n\nexport default WebOrderNew;\n","import React, { Fragment, useCallback, useState } from \"react\";\nimport PageTitle from \"../../components/Ui/PageTitle\";\nimport { Button, Card } from \"react-bootstrap\";\nimport { useSelector } from \"react-redux\";\nimport { isLoggedIn } from \"../../store/selectors/UserSelectors\";\nimport { config } from \"../../config\";\nimport ConfirmationModal from \"../../components/Feedback/Modal/ConfirmationModal\";\nimport ArchiveOrderDetails from \"../Order/OrderDetails/ArchiveOrderDetails\";\nimport { useHistory } from \"react-router\";\nimport { paths } from \"../../router\";\nimport CreateOrderButton from \"../../components/CreateOrderButton\";\nimport { OrderCategory, TApiOrderDetails } from \"../../api/endpoints/Order\";\n\nconst ArchiveOrderNew = () => {\n const history = useHistory();\n const userLoggedIn = useSelector(isLoggedIn);\n const [showLoginPopup, setShowLoginPopup] = useState(false);\n\n const onLoginClick = useCallback(() => {\n window.location.href = config.loginUrl;\n }, []);\n\n const onOrderSaved = (order: TApiOrderDetails) => {\n history.push(paths.order(order.id));\n }\n\n const onNotLoggedInSave = () => {\n setShowLoginPopup(true);\n }\n\n return (\n \n \n\n \n \n \n \n \n\n {\n userLoggedIn ?\n \n : \n }\n\n setShowLoginPopup(false)}\n actions={\n \n \n \n \n }\n />\n \n )\n}\n\nexport default ArchiveOrderNew;\n","import React, { Fragment, useCallback, useEffect, useState } from \"react\";\nimport { isEmpty, map } from \"lodash\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { Card, Col, Row } from \"react-bootstrap\";\nimport { useHistory } from \"react-router\";\nimport PageTitle from \"../../components/Ui/PageTitle\";\nimport { TRootState } from \"../../store/reducers/RootReducer\";\nimport ProductDetails from \"../../components/ProductDetails\";\nimport { OrderCategory, TApiOrderDetails } from \"../../api/endpoints/Order\";\nimport { faTrashAlt } from \"@fortawesome/free-regular-svg-icons\";\nimport IconButton from \"../../components/Buttons/IconButton\";\nimport { clearBasket, removeProductFromBasket } from \"../../store/action-creators/basket\";\nimport CreateOrderButton from \"../../components/CreateOrderButton\";\nimport { paths } from \"../../router\";\nimport { isLoggedIn } from \"../../store/selectors/UserSelectors\";\nimport { TApiSet } from \"../../api/endpoints/Set\";\nimport * as Api from \"../../api\";\nimport { deriveBcType, deriveDataSetName } from \"../../utils/DataSet\";\nimport LoadingIndicator from \"../../components/Feedback/LoadingIndicator\";\nimport { TOrderProductData } from \"../../api/endpoints/OrderProduct\";\n\ninterface IProps {\n item: TOrderProductData;\n id: string;\n sets: Array\n}\n\nconst BasketItem = (props: IProps) => {\n const { id, item, sets } = props;\n const dispatch = useDispatch();\n const set = {\n name: deriveDataSetName(item, sets)\n }\n const bcType = deriveBcType(item, sets);\n\n const onBasketItemRemove = useCallback(() => {\n dispatch(removeProductFromBasket(id))\n }, [id, dispatch]);\n\n return (\n \n \n \n \n \n }\n />\n \n \n )\n}\n\nconst Basket = () => {\n const history = useHistory();\n const dispatch = useDispatch();\n const isUserLoggedIn = useSelector(isLoggedIn);\n const productDataSet = useSelector(state => state.basket.data);\n\n const [sets, setSets] = useState | null>(null);\n\n useEffect(() => {\n Api.Set.list().then(setSets);\n }, []);\n\n const onOrderCreate = useCallback((order: TApiOrderDetails) => {\n dispatch(clearBasket());\n history.push(paths.order(order.id));\n }, [dispatch, history])\n\n if (!sets) {\n return \n }\n\n return (\n
\n \n \n \n \n \n\n \n \n {\n map(productDataSet, (product, id) =>\n )\n }\n {\n isEmpty(productDataSet) &&\n
\n There is currently no products in your basket.\n
\n }\n \n
\n\n \n \n {\n !isEmpty(productDataSet) &&\n \n \n {\n !isUserLoggedIn &&\n Please log in to create an order.\n }\n \n }\n \n \n
\n )\n}\n\nexport default Basket;\n","import { User } from \"../entities/User\";\n\nconst BasketPolicy = {\n canAccess(user: User) {\n return true;\n }\n}\n\nexport default BasketPolicy;\n","import classNames from \"classnames\";\nimport React from \"react\";\n\nconst DissLine = (props: { line: string }) => {\n const { line } = props;\n const isBlank = (!line || /^\\s*$/.test(line));\n\n return
{line}
;\n}\n\nconst DisseminationRequest = (props: {\n diss: string\n}) => {\n const { diss } = props;\n const lines = diss.split('\\n');\n\n return (\n
\n {\n lines.map((line, index) => )\n }\n
\n )\n}\n\nexport default DisseminationRequest;\n","const copyToClipboard = (value: string) => {\n const $el = document.createElement('textarea');\n\n $el.value = value;\n $el.setAttribute('readonly', '');\n $el.setAttribute('style', 'position: absolute; left: -9999px');\n\n document.body.appendChild($el);\n\n $el.select();\n\n document.execCommand('copy');\n document.body.removeChild($el);\n};\n\nexport default copyToClipboard;\n","import React from \"react\";\nimport { faExclamationTriangle } from \"@fortawesome/free-solid-svg-icons\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\n\nconst NotFoundScreen = () => {\n return (\n
\n \n
Sorry, it seems page does not exist.
\n
\n )\n}\n\nexport default NotFoundScreen;\n","import React, { useEffect, useState, Fragment, useCallback } from 'react';\nimport * as Api from \"../../api\";\nimport { useParams } from \"react-router-dom\";\nimport { Card, Col } from 'react-bootstrap';\nimport DisseminationRequest from \"../../components/Ui/DisseminationRequest\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { TRootState } from \"../../store/reducers/RootReducer\";\nimport { TOrdersByIdState } from \"../../store/reducers/ordersById\";\nimport { fetchOrderDetails } from \"../../store/action-creators/orders\";\nimport Row from \"../../components/Common/Row\";\nimport { copyToClipboard } from '../../utils/Clipboard';\nimport { faCopy, faCheckCircle } from \"@fortawesome/free-regular-svg-icons\";\nimport ButtonWithIcon from '../../components/Buttons/ButtonWithIcon';\nimport LoadingIndicator from \"../../components/Feedback/LoadingIndicator\";\nimport DisseminationRequestPolicy from \"../../policies/DisseminationRequestPolicy\";\nimport { selectUser } from \"../../store/selectors/UserSelectors\";\nimport NotFoundScreen from \"../../components/NotFoundScreen\";\n\ninterface IRouteParams {\n orderId: string;\n}\n\nconst OrderDisseminationRequest = () => {\n const params = useParams();\n const dispatch = useDispatch();\n const user = useSelector(selectUser);\n\n const [diss, setDiss] = useState(null);\n const [dissError, setDissError] = useState(null);\n const [copyStatus, setCopyStatus] = useState(null);\n\n useEffect(() => {\n dispatch(fetchOrderDetails(params.orderId));\n Api.Order.fetchDisseminationRequest(params.orderId)\n .then(setDiss)\n .catch(() => {\n setDissError('Unable to fetch dissemination request.');\n });\n }, [dispatch, params.orderId]);\n\n const onCopyToClipboard = useCallback(() => {\n copyToClipboard(diss ?? '');\n setCopyStatus('copied');\n }, [diss]);\n\n useEffect(() => {\n const timeoutId = setTimeout(() => {\n setCopyStatus(null);\n }, 2000);\n\n return () => clearTimeout(timeoutId);\n }, [copyStatus])\n\n const orderState = useSelector(\n store => store.ordersById[params.orderId]\n )\n\n if (dissError) {\n return
{dissError}
;\n }\n\n if (!orderState?.loadedAt || !diss) {\n return ;\n }\n\n if (orderState.data && !DisseminationRequestPolicy.canAccess(user, orderState.data)) {\n return ;\n }\n\n return (\n \n \n {/**/}\n \n

\n Dissemination request\n\n \n Copy to clipboard\n \n

\n \n
\n\n \n \n \n \n \n
\n\n )\n}\n\nexport default OrderDisseminationRequest;\n","import React, { Fragment, useEffect, useState } from \"react\";\nimport { Col, Row } from \"react-bootstrap\";\nimport PageTitle from \"../../components/Ui/PageTitle\";\nimport { OrderStatus, TApiOrder } from \"../../api/endpoints/Order\";\nimport OrderList from \"../../components/OrderList/index\";\nimport * as Api from \"../../api\";\n\nconst PendingOrders = () => {\n const [orders, setOrders] = useState | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState(false);\n\n useEffect(() => {\n setLoading(true);\n\n Api.Order.list({ status: OrderStatus.SUBMITTED })\n .then(orders => {\n setOrders(orders);\n setLoading(false);\n setError(false);\n })\n .catch(() => {\n setError(true);\n });\n }, []);\n\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n )\n}\n\nexport default PendingOrders;\n","import React, { useCallback, useEffect, useState } from \"react\";\nimport PageTitle from \"../../components/Ui/PageTitle\";\nimport { Col, Row } from \"react-bootstrap\";\nimport { TApiProvider } from \"../../api/endpoints/Provider\";\nimport { SelectSingleInput } from \"../../components/Inputs/SelectInput\";\nimport * as Api from '../../api';\nimport { OrderCategory, OrderStatus, TApiOrder } from \"../../api/endpoints/Order\";\nimport PaginatedOrderList from \"../../components/PaginatedOrderList\";\nimport LoadingIndicator from \"../../components/Feedback/LoadingIndicator\";\nimport TextInput from \"../../components/Inputs/TextInput\";\n\nconst SELECTABLE_ORDER_STATUSES = [\n OrderStatus.DRAFT,\n OrderStatus.SUBMITTED,\n OrderStatus.ACCEPTED,\n OrderStatus.REJECTED,\n OrderStatus.CANCELLED\n]\n\nconst SELECTABLE_ORDER_CATEGORIES = Object.values(OrderCategory);\n\n\nconst CcpOrders = () => {\n const [limit, setLimit] = useState(10);\n const [totalItemsCount, setTotalItemsCount] = useState(0);\n const [currentPage, setCurrentPage] = useState(0);\n const [providers, setProviders] = useState | null>(null)\n const [selectedProvider, setSelectedProvider] = useState(undefined);\n const [orders, setOrders] = useState | null>(null);\n const [ordersError, setOrdersError] = useState(false);\n const [selectedStatus, setSelectedStatus] = useState(undefined);\n const [selectedCategory, setSelectedCategory] = useState(undefined);\n const [searchTerm, setSearchTerm] = useState('');\n\n useEffect(() => {\n Api.Provider.list().then(setProviders)\n }, []);\n\n useEffect(() => {\n setOrdersError(false);\n\n Api.Order.listCCPOrders({\n organisation_id: selectedProvider?.id,\n search: searchTerm,\n status: selectedStatus,\n category: selectedCategory,\n limit,\n offset: currentPage * limit\n })\n .then((response => {\n setOrders(response.results);\n setTotalItemsCount(response.count)\n }))\n .catch(() => setOrdersError(true))\n }, [selectedProvider, searchTerm, selectedCategory, selectedStatus, currentPage, limit]);\n\n const onProviderChange = useCallback((provider: TApiProvider | undefined) => {\n setSelectedProvider(provider);\n setCurrentPage(0);\n }, []);\n\n const onLimitChange = useCallback((limit) => {\n setLimit(limit);\n setCurrentPage(0);\n }, []);\n\n const onStatusChange = useCallback((status) => {\n setSelectedStatus(status);\n setCurrentPage(0);\n }, []);\n\n const onCategoryChange = useCallback((category) => {\n setSelectedCategory(category);\n setCurrentPage(0);\n }, []);\n\n const onSearchTermChange = useCallback((term) => {\n setSearchTerm(term);\n setCurrentPage(0)\n }, []);\n\n if (!providers) {\n return ;\n }\n\n return (\n
\n \n \n \n \n \n \n \n \n\n ({\n value: provider.id.toString(),\n label: provider.name\n })}\n items={providers}\n name=\"provider\"\n onChange={onProviderChange}\n selectedItem={selectedProvider}\n placeholder=\"Filter by ccp...\"\n />\n\n ({\n value: category,\n label: category.toUpperCase()\n })}\n items={SELECTABLE_ORDER_CATEGORIES}\n name=\"category\"\n onChange={onCategoryChange}\n selectedItem={selectedCategory}\n placeholder=\"Filter by category\"\n />\n\n ({\n value: status,\n label: status.toUpperCase()\n })}\n items={SELECTABLE_ORDER_STATUSES}\n name=\"provider\"\n onChange={onStatusChange}\n selectedItem={selectedStatus}\n placeholder=\"Filter by status\"\n />\n \n \n\n \n \n setCurrentPage(page)}\n onPerPageChange={onLimitChange}\n />\n \n \n
\n )\n}\n\nexport default CcpOrders;\n","import { User, UserType } from \"../entities/User\";\n\nconst AreaLibraryPolicy = {\n canAccess(user: User) {\n return user.type !== UserType.Unknown;\n }\n}\n\nexport default AreaLibraryPolicy;\n","import React, { useCallback, useEffect, useState } from \"react\";\nimport PageTitle from \"../../components/Ui/PageTitle\";\nimport { Col, Row } from \"react-bootstrap\";\nimport { SelectSingleInput } from \"../../components/Inputs/SelectInput\";\nimport * as Api from '../../api';\nimport { OrderCategory, OrderStatus, TApiOrder } from \"../../api/endpoints/Order\";\nimport TextInput from \"../../components/Inputs/TextInput\";\nimport PaginatedOrderList from \"../../components/PaginatedOrderList\";\n\nconst SELECTABLE_ORDER_STATUSES = [\n OrderStatus.DRAFT,\n OrderStatus.SUBMITTED,\n OrderStatus.ACCEPTED,\n OrderStatus.REJECTED,\n OrderStatus.CANCELLED\n]\n\nconst SELECTABLE_ORDER_CATEGORIES = Object.values(OrderCategory);\n\n\nconst PublicOrders = () => {\n const [limit, setLimit] = useState(10);\n const [totalItemsCount, setTotalItemsCount] = useState(0);\n const [currentPage, setCurrentPage] = useState(0);\n const [orders, setOrders] = useState | null>(null);\n const [ordersError, setOrdersError] = useState(false);\n const [selectedStatus, setSelectedStatus] = useState(undefined);\n const [selectedCategory, setSelectedCategory] = useState(undefined);\n const [searchTerm, setSearchTerm] = useState('');\n\n useEffect(() => {\n setOrdersError(false);\n\n Api.Order.listPublicOrders({\n status: selectedStatus,\n category: selectedCategory,\n search: searchTerm,\n limit,\n offset: currentPage * limit\n })\n .then((response => {\n setOrders(response.results);\n setTotalItemsCount(response.count)\n }))\n .catch(() => setOrdersError(true))\n }, [limit, searchTerm, selectedCategory, selectedStatus, currentPage]);\n\n const onLimitChange = useCallback((limit) => {\n setLimit(limit);\n setCurrentPage(0);\n }, []);\n\n const onStatusChange = useCallback((status) => {\n setSelectedStatus(status);\n setCurrentPage(0);\n }, []);\n\n const onSearchTermChange = useCallback((term) => {\n setSearchTerm(term);\n setCurrentPage(0)\n }, []);\n\n const onCategoryChange = useCallback((category) => {\n setSelectedCategory(category);\n setCurrentPage(0);\n }, []);\n\n return (\n
\n \n \n \n \n \n \n \n \n\n ({\n value: category,\n label: category.toUpperCase()\n })}\n items={SELECTABLE_ORDER_CATEGORIES}\n name=\"category\"\n onChange={onCategoryChange}\n selectedItem={selectedCategory}\n placeholder=\"Filter by category\"\n />\n\n ({\n value: status,\n label: status.toUpperCase()\n })}\n items={SELECTABLE_ORDER_STATUSES}\n name=\"provider\"\n onChange={onStatusChange}\n selectedItem={selectedStatus}\n placeholder=\"Filter by status\"\n />\n \n \n\n \n \n setCurrentPage(page)}\n onPerPageChange={onLimitChange}\n />\n \n \n
\n )\n}\n\nexport default PublicOrders;\n","import { TApiSet } from \"../../api/endpoints/Set\";\nimport { ThunkDispatch } from \"redux-thunk\";\nimport { TRootState } from \"../reducers/RootReducer\";\nimport { Action } from \"redux\";\nimport * as Api from '../../api';\nimport ErrorHelpers from \"../../utils/ErrorHelpers\";\n\nexport const SETS_FETCH_STARTED = 'SETS_FETCH_STARTED';\nexport const SETS_FETCH_COMPLETED = 'SETS_FETCH_COMPLETED';\nexport const SETS_FETCH_FAILED = 'SETS_FETCH_FAILED';\n\nexport interface IFetchSetsStartedAction extends Action {\n}\n\nconst fetchSetsStarted = (): IFetchSetsStartedAction => ({\n type: SETS_FETCH_STARTED\n});\n\nexport interface IFetchSetsCompletedAction extends Action {\n data: Array;\n}\n\nconst fetchSetsCompleted = (sets: Array): IFetchSetsCompletedAction => ({\n type: SETS_FETCH_COMPLETED,\n data: sets\n});\n\nexport interface IFetchSetsFailedAction extends Action {\n error: Error;\n}\n\nconst fetchSetsFailed = (error: Error): IFetchSetsFailedAction => ({\n type: SETS_FETCH_FAILED,\n error\n});\n\nconst fetchSets = () => {\n return async (dispatch: ThunkDispatch): Promise> => {\n try {\n dispatch(fetchSetsStarted());\n\n const sets = await Api.Set.list();\n\n dispatch(fetchSetsCompleted(sets));\n\n return sets;\n } catch (error) {\n if (ErrorHelpers.isError(error)) {\n dispatch(fetchSetsFailed(error));\n }\n\n throw error;\n }\n }\n}\n\nexport {\n fetchSets\n}\n","export default __webpack_public_path__ + \"static/media/eu-cut-out-area-boudaries-map.eb5967b7.jpg\";","import React from \"react\";\nimport mapImage from './eu-cut-out-area-boudaries-map.jpg';\n\nconst AreaSelector = () => {\n return (\n
\n
\n \"European\n
\n
\n

\n The area of the data is 25°N-84°N, 74°W-45°E.\n

\n

\n Subsetting is not allowed.\n

\n
\n
\n )\n}\n\nexport default AreaSelector;\n","import { useSelector } from \"react-redux\";\nimport { selectParameters } from \"../../../../store/selectors/new/parameters\";\nimport React, { useCallback, useEffect, useState } from \"react\";\nimport { TApiParameter } from \"../../../../api/endpoints/Parameter\";\nimport { TApiSubset } from \"../../../../api/endpoints/Subset\";\nimport { TRootState } from \"../../../../store/reducers/RootReducer\";\nimport { TApiSet } from \"../../../../api/endpoints/Set\";\nimport * as Api from \"../../../../api\";\nimport { find } from \"lodash\";\nimport { Button, Table } from \"react-bootstrap\";\nimport Checkbox from \"../../../Inputs/Checkbox/Checkbox\";\nimport { formatParameterNameWithShortname, formatSubsetLabel } from \"../../../../utils/Format\";\nimport SubsetTypes from \"../../../../utils/SubsetTypes\";\nimport { TParameterSelection } from \"../../index\";\nimport Select from \"react-select\";\nimport { ValueType } from \"react-select/lib/types\";\nimport { Nullable } from \"../../../../../types/utils\";\n\ninterface ParameterSelectionProps {\n onSelect: (selection: Array) => void;\n}\n\nconst ParameterSelection = (props: ParameterSelectionProps) => {\n const { onSelect } = props;\n const params = Object.values(useSelector(selectParameters));\n const [selectedParam, setSelectedParam] = useState>(null);\n const [subsetsToSelect, setSubsetsToSelect] = useState>([]);\n const [selectedSubsetIds, setSelectedSubsetIds] = useState>([]);\n const setsById = useSelector>(state => state.sets.data.reduce((acc, item) => {\n acc[item.id] = item;\n return acc;\n }, {} as Record));\n\n useEffect(() => {\n if (selectedParam !== null) {\n Api.Subset.list({\n paramShortnames: [selectedParam.shortname]\n }).then((subsets => {\n setSubsetsToSelect(subsets)\n }));\n }\n }, [selectedParam]);\n\n const onParamSearchChange = (param: ValueType) => {\n const typedParam = param as Nullable;\n\n if (!typedParam) {\n setSelectedParam(null);\n setSubsetsToSelect([]);\n setSelectedSubsetIds([]);\n } else {\n setSelectedParam(typedParam);\n }\n }\n\n const onCheckboxChange = useCallback((subsetId: number) => (checked: boolean) => {\n if (checked) {\n setSelectedSubsetIds([...selectedSubsetIds, subsetId]);\n } else {\n setSelectedSubsetIds(selectedSubsetIds.filter(id => id !== subsetId))\n }\n }, [selectedSubsetIds]);\n\n const onCancel = useCallback(() => {\n onSelect([]);\n }, [onSelect]);\n\n const onConfirm = () => {\n if (!selectedParam) {\n return;\n }\n\n const param = selectedParam;\n\n const results = selectedSubsetIds.map(selectedSubsetId => {\n const subset = find(subsetsToSelect, { id: selectedSubsetId })!;\n return {\n parameter: param,\n subset: find(subsetsToSelect, { id: selectedSubsetId })!,\n set: setsById[subset.set_id]\n }\n })\n\n onSelect(results);\n }\n\n return (\n
\n
\n \n\n \n name=\"params\"\n options={params}\n getOptionLabel={(param) => param.name}\n getOptionValue={(param) => param.shortname}\n formatOptionLabel={formatParameterNameWithShortname}\n value={selectedParam}\n onChange={onParamSearchChange}\n isSearchable\n isClearable\n />\n
\n\n {\n subsetsToSelect.length > 0 &&\n
\n \n\n
\n \n \n {\n subsetsToSelect.map(subset => {\n return (\n \n \n \n \n \n )\n })\n }\n \n
\n \n \n {\n formatSubsetLabel(subset)\n }\n
\n {setsById[subset.set_id]?.description}\n
\n
\n {SubsetTypes.humanize(subset.type)}\n
\n
\n
\n }\n\n\n
\n \n \n
\n
\n )\n}\n\nexport default ParameterSelection;\n","import SelectedParametersList from \"./SelectedParametersList\";\nimport ButtonWithIcon from \"../../Buttons/ButtonWithIcon\";\nimport { faPlusCircle } from \"@fortawesome/free-solid-svg-icons\";\nimport classNames from \"classnames\";\nimport React, { useCallback, useState } from \"react\";\nimport { SelectionState, TParameterSelection } from \"../index\";\nimport { Modal } from \"react-bootstrap\";\nimport ParameterSelection from \"./ParameterSelection\";\nimport { omit } from \"lodash\";\nimport EuCutOutProductHelpers from \"../../../utils/EuCutOutProductHelpers\";\n\ninterface IProps {\n values: SelectionState;\n limit: number;\n onChange: (values: SelectionState) => void;\n}\n\nconst parameterSelectionToSelectionState = (selection: Array): SelectionState => {\n return selection.reduce((acc, item) => {\n acc[EuCutOutProductHelpers.parameterSelectionKey(item)] = item;\n\n return acc;\n }, {} as SelectionState);\n}\n\nconst ParametersSelector = (props: IProps) => {\n const { values, limit, onChange } = props;\n const [showParamSelection, setShowParamSelection] = useState(false);\n const selectionCount = Object.keys(values).length;\n\n const onParameterSelect = useCallback((selected: Array) => {\n const selectedMapping = parameterSelectionToSelectionState(selected);\n\n onChange({\n ...values,\n ...selectedMapping\n });\n\n setShowParamSelection(false);\n }, [onChange, values]);\n\n const onParameterRemove = useCallback((item: TParameterSelection) => {\n onChange(\n omit(values, EuCutOutProductHelpers.parameterSelectionKey(item))\n )\n }, [onChange, values]);\n\n const onAddParameterClick = useCallback(() => {\n setShowParamSelection(true);\n }, []);\n\n const onParameterSelectionHide = useCallback(() => {\n setShowParamSelection(false);\n }, []);\n\n return (\n
\n \n\n
\n Add parameters\n
\n Selected parameters: limit && 'exceeded')}>\n {`${selectionCount}/${limit}`}\n \n
\n
\n\n \n \n \n \n \n
\n )\n}\n\nexport default ParametersSelector;\n","import { SelectSingleInput } from \"../../Inputs/SelectInput\";\nimport React from \"react\";\n\ninterface IProps {\n value: boolean;\n onChange: (value: boolean) => void;\n}\n\nconst HighFrequencyProductsSelector = (props: IProps) => {\n const { value, onChange } = props;\n\n return (\n ({\n value: value,\n label: value === '1' ? 'Yes' : 'No'\n })}\n onChange={value => {\n onChange(value === '1')\n }}\n selectedItem={value ? '1' : '0'}\n name=\"high-frequency-products\"\n isSearchable={false}\n isClearable={false}\n />\n )\n}\n\nexport default HighFrequencyProductsSelector;\n","import React, { Fragment, ReactNode, useCallback, useEffect } from \"react\";\nimport { TApiParameter } from \"../../api/endpoints/Parameter\";\nimport { TApiSubset } from \"../../api/endpoints/Subset\";\nimport { TApiSet } from \"../../api/endpoints/Set\";\nimport { isEmpty } from \"lodash\";\nimport { Form } from \"react-bootstrap\";\nimport AreaSelector from \"./AreaSelector\";\nimport Footnote from \"../RealtimeProductConfigurator/Footnote\";\nimport Link from \"../Navigation/Links/Link\";\nimport { paths } from \"../../router\";\nimport { OrderCategory } from \"../../api/endpoints/Order\";\nimport { useSelector } from \"react-redux\";\nimport { selectParameters } from \"../../store/selectors/new/parameters\";\nimport { TRootState } from \"../../store/reducers/RootReducer\";\nimport LoadingIndicator from \"../Feedback/LoadingIndicator\";\nimport EuCutOutProductHelpers from \"../../utils/EuCutOutProductHelpers\";\nimport { FormikHelpers, FormikProps, useFormik } from \"formik\";\nimport FormError from \"../RealtimeProductConfigurator/FormError\";\nimport ParametersSelector from \"./ParametersSelector\";\nimport HighFrequencyProductsSelector from \"./HighFrequencyProductsSelector\";\nimport BeforeUnload from \"../Feedback/BeforeUnload\";\nimport { IEuCutOutProductData, TOrderProduct } from \"../../api/endpoints/OrderProduct\";\n\nexport type TParameterSelection = {\n parameter: TApiParameter;\n subset: TApiSubset;\n set: TApiSet;\n}\n\nexport type SelectionState = Record;\n\nconst PARAMETER_LIMIT = 15;\n\ninterface IFormValues {\n parameterSelection: SelectionState;\n highFrequency: boolean;\n}\n\ntype TFormErrors = {\n [key in keyof IFormValues]?: string | undefined;\n}\n\nconst validate = (values: IFormValues): TFormErrors => {\n const errors: TFormErrors = {};\n\n if (Object.keys(values.parameterSelection).length === 0) {\n errors.parameterSelection = 'At least one parameter is required.';\n }\n\n if (Object.keys(values.parameterSelection).length > PARAMETER_LIMIT) {\n errors.parameterSelection = 'Too many selected parameters.';\n }\n\n return errors;\n}\n\nconst formValuesToProducts = (values: IFormValues) => {\n return [\n {\n param: Object.values(values.parameterSelection).map(item => ({\n value: item.parameter.shortname,\n subset_id: item.subset.id\n })),\n high_frequency: values.highFrequency\n }\n ]\n}\n\ninterface IProps {\n product?: TOrderProduct;\n actions?: (products: Array, formik: FormikProps) => ReactNode;\n onSubmit?: (values: Array, formik: FormikHelpers) => void;\n}\n\nconst EuCutOutConfigurator = (props: IProps) => {\n const { product, actions, onSubmit } = props;\n\n const allParameters = useSelector(selectParameters);\n const sets = useSelector>(state => state.sets.data);\n\n const formik = useFormik({\n initialValues: {\n parameterSelection: {},\n highFrequency: product?.data.high_frequency ?? false\n },\n isInitialValid: false,\n validate,\n onSubmit: (values, formikHelpers) => {\n onSubmit && onSubmit(formValuesToProducts(values), formikHelpers);\n }\n });\n\n useEffect(() => {\n if (product && !isEmpty(allParameters) && !isEmpty(sets)) {\n formik.setFieldValue(\n 'parameterSelection',\n EuCutOutProductHelpers.deriveParameterSelection(product, sets, allParameters)\n )\n }\n }, [product, allParameters, sets]);\n\n const onParametersChange = useCallback((selection: SelectionState) => {\n formik.setFieldValue('parameterSelection', selection);\n }, [formik]);\n\n const onHighFrequencyChange = useCallback((value) => {\n formik.setFieldValue('highFrequency', value);\n }, [formik]);\n\n if (isEmpty(sets) && isEmpty(allParameters)) {\n return ;\n }\n\n return (\n \n
\n \n Parameters\n\n
\n \n\n \n\n \n If you want to configure more than 15 parameters, please configure a quote for a standard-commercial\n licence or maximum charge licence, \n here.\n \n }\n />\n
\n
\n\n\n \n Areas\n\n \n\n \n If you want to configure data outside of the area 25°N-84°N, 74°W-45°E, please configure a quote for a\n standard-commercial licence or maximum charge licence, \n here.\n \n }\n />\n \n\n \n High frequency products\n\n
\n \n
\n\n \n
\n\n
\n {\n actions &&\n actions(formValuesToProducts(formik.values), formik)\n }\n
\n
\n
\n )\n}\n\nexport default EuCutOutConfigurator;\n","import CreateOrderButton, { ICreateOrderButtonProps } from \"../CreateOrderButton\";\nimport { Button } from \"react-bootstrap\";\nimport ConfirmationModal from \"../Feedback/Modal/ConfirmationModal\";\nimport React, { Fragment, useCallback, useState } from \"react\";\nimport { useSelector } from \"react-redux\";\nimport { isLoggedIn } from \"../../store/selectors/UserSelectors\";\nimport { config } from \"../../config\";\n\ninterface IProps extends ICreateOrderButtonProps {\n}\n\nconst CreateOrderButtonWithAuthCheck = (props: IProps) => {\n const userLoggedIn = useSelector(isLoggedIn);\n const [showLoginPopup, setShowLoginPopup] = useState(false);\n const onLoginClick = useCallback(() => {\n window.location.href = config.loginUrl;\n }, []);\n\n const onNotLoggedInSave = () => {\n setShowLoginPopup(true);\n }\n\n return (\n \n {\n userLoggedIn ?\n \n : \n }\n\n setShowLoginPopup(false)}\n actions={\n \n \n \n \n }\n />\n \n )\n}\n\nexport default CreateOrderButtonWithAuthCheck;\n","import React, { Fragment, useCallback, useEffect } from \"react\";\nimport { useDispatch } from \"react-redux\";\nimport { Card, Col, Row } from \"react-bootstrap\";\nimport PageTitle from \"../../components/Ui/PageTitle\";\nimport { fetchSets } from \"../../store/action-creators/sets\";\nimport EuCutOutConfigurator from \"../../components/EuCutOutConfigurator\";\nimport { OrderCategory, TApiOrderDetails } from \"../../api/endpoints/Order\";\nimport { paths } from \"../../router\";\nimport { useHistory } from \"react-router\";\nimport CreateOrderButtonWithAuthCheck from \"../../components/CreateOrderButtonWithAuthCheck\";\n\nconst EuCutOutOrderNew = () => {\n const history = useHistory();\n const dispatch = useDispatch();\n\n const onOrderSaved = useCallback((order: TApiOrderDetails) => {\n history.push(paths.order(order.id));\n }, [history]);\n\n useEffect(() => {\n dispatch(fetchSets());\n }, []);\n\n return (\n \n \n \n \n \n \n\n \n \n {\n return (\n \n )\n }\n }\n />\n \n \n \n )\n}\n\nexport default EuCutOutOrderNew;\n","import React, { Fragment, useCallback, useEffect, useState } from \"react\";\nimport { useHistory, useParams } from \"react-router\";\nimport { useSelector } from \"react-redux\";\nimport { IEuCutOutProduct, OrderCategory, TApiOrderDetails } from \"../../api/endpoints/Order\";\nimport { paths } from \"../../router\";\nimport { fetchSets } from \"../../store/action-creators/sets\";\nimport { Button, Card, Col, Row } from \"react-bootstrap\";\nimport PageTitle from \"../../components/Ui/PageTitle\";\nimport EuCutOutConfigurator from \"../../components/EuCutOutConfigurator\";\nimport { fetchOrderDetails, updateOrder } from \"../../store/action-creators/orders\";\nimport { TRootState } from \"../../store/reducers/RootReducer\";\nimport { TOrdersByIdState } from \"../../store/reducers/ordersById\";\nimport LoadingIndicator from \"../../components/Feedback/LoadingIndicator\";\nimport useAppDispatch from \"../../hooks/useAppDispatch\";\nimport ButtonInverted from \"../../components/Buttons/ButtonInverted\";\nimport { IEuCutOutProductData, TOrderProduct } from \"../../api/endpoints/OrderProduct\";\nimport { Nullable } from \"../../../types/utils\";\nimport * as Api from \"../../api\";\n\nconst EuCutOutOrderEdit = () => {\n const history = useHistory();\n const dispatch = useAppDispatch();\n const { orderId } = useParams<{ orderId: string }>();\n\n const orderState = useSelector(store => store.ordersById[orderId])\n const order = orderState?.data;\n\n const [product, setProduct] = useState>>(null);\n const [error, setError] = useState>(null)\n\n useEffect(() => {\n dispatch(fetchOrderDetails(orderId));\n dispatch(fetchSets());\n }, []);\n\n useEffect(() => {\n if (order) {\n Api.OrderProduct.list(order.id)\n .then(products => setProduct(products[0]))\n .catch(() => setError('Sorry! We were unable to fetch products.'));\n }\n }, [order]);\n\n const onProductUpdate = useCallback((productDataItems: Array) => {\n if (!product) {\n return;\n }\n\n Api.OrderProduct.update(product.order_id, product.id, productDataItems[0]).then(() => {\n history.push(paths.order(product.order_id));\n }).catch();\n }, [dispatch, history, product]);\n\n const onCancel = useCallback(() => {\n if (order) {\n history.push(paths.order(order.id));\n }\n }, [history, order])\n\n if (!order || orderState?.loading || !product) {\n return ;\n }\n\n if (order.category !== OrderCategory.EU_CUTOUT) {\n return
Not found.
\n }\n\n return (\n \n \n \n \n \n \n\n \n \n , formik) => (\n \n \n {formik.isSubmitting ? 'Updating...' : 'Update'}\n \n\n \n \n )\n }\n />\n \n \n \n )\n}\n\nexport default EuCutOutOrderEdit;\n","import React from \"react\";\nimport { faExclamationTriangle } from \"@fortawesome/free-solid-svg-icons\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\n\nconst NotAuthenticatedScreen = () => {\n return (\n
\n \n
You must be logged in to access this page.
\n
\n )\n}\n\nexport default NotAuthenticatedScreen;\n","import React from 'react';\nimport { Route, RouteProps, Switch } from 'react-router';\nimport AreaLibraryPage from '../containers/AreaLibraryPage';\nimport Order from '../containers/Order';\nimport RealtimeOrderProduct from '../containers/RealtimeOrderProduct';\nimport Dashboard from '../containers/Dashboard';\nimport RealtimeOrderProductNew from \"../containers/RealtimeOrderProductNew\";\nimport RealtimeProductNew from \"../containers/RealtimeProductNew\";\nimport WebOrderNew from \"../containers/WebOrderNew\";\nimport ArchiveOrderNew from '../containers/ArchiveOrderNew';\nimport Orders from \"../containers/Orders\";\nimport Basket from \"../containers/Basket\";\nimport { useSelector } from \"react-redux\";\nimport { selectUser } from \"../store/selectors/UserSelectors\";\nimport BasketPolicy from \"../policies/BasketPolicy\";\nimport OrderDisseminationRequest from \"../containers/OrderDisseminationRequest\";\nimport PendingOrders from \"../containers/PendingOrders\";\nimport CcpOrders from \"../containers/CcpOrders\";\nimport OrderPolicy from \"../policies/OrderPolicy\";\nimport AreaLibraryPolicy from '../policies/AreaLibraryPolicy';\nimport PublicOrders from '../containers/PublicOrders';\nimport EuCutOutOrderNew from '../containers/EuCutOutOrderNew';\nimport EuCutOutOrderEdit from \"../containers/EuCutOutOrderEdit\";\nimport { User, UserType } from \"../entities/User\";\nimport NotAuthenticatedScreen from \"../components/NotAuthenticatedScreen\";\n\ntype ResourcePathId = number | string;\n\nexport const paths = {\n root: '/',\n basket: '/basket',\n areas: '/areas',\n orders: '/orders',\n pendingOrders: '/pending-orders',\n order: (id: ResourcePathId) => `/orders/${id}`,\n realtimeOrderProduct: (orderId: ResourcePathId, productId: ResourcePathId) => `/orders/${orderId}/products/${productId}`,\n realtimeOrderProductNew: (orderId: ResourcePathId) => `/orders/${orderId}/products/new`,\n euCutOutOrderEdit: (orderId: ResourcePathId) => `/orders/${orderId}/edit`,\n ordersByFolder: (folderId: ResourcePathId) => `/orders/folders/${folderId}`,\n orderDisseminationRequest: (orderId: ResourcePathId) => `/orders/${orderId}/diss`,\n realtimeOrderNew: '/orders/new',\n webOrderNew: '/web-orders/new',\n archiveOrderNew: '/archive-orders/new',\n euCutOutOrderNew: '/eu-cut-out-orders/new',\n ccpOrders: '/ccp-orders',\n publicOrders: '/public-orders'\n};\n\nconst ProtectedRoute = (props: { user: User } & RouteProps) => {\n const { user, ...routerProps } = props;\n const isUserLoggedIn = user.type !== UserType.Unknown;\n\n return (\n \n )\n}\n\nconst Router = () => {\n const user = useSelector(selectUser);\n\n return (\n \n \n {\n BasketPolicy.canAccess(user) &&\n \n }\n \n \n \n \n \n \n \n \n\n {\n \n }\n \n\n {\n OrderPolicy.canViewPendingOrders(user) &&\n \n }\n\n {\n AreaLibraryPolicy.canAccess(user) &&\n \n }\n\n {\n OrderPolicy.canViewCcpOrders(user) &&\n \n }\n\n {\n OrderPolicy.canViewPublicOrders(user) &&\n \n }\n \n );\n};\n\nexport default Router;\n","import * as React from 'react';\nimport { ReactNode, useEffect, useState } from 'react';\nimport { useSelector } from 'react-redux';\nimport { selectUser } from '../../store/selectors/UserSelectors';\nimport { paths } from '../../router';\nimport { Badge } from 'react-bootstrap';\nimport classNames from 'classnames';\nimport { TRootState } from \"../../store/reducers/RootReducer\";\nimport BasketPolicy from '../../policies/BasketPolicy';\nimport { UserType } from \"../../entities/User\";\nimport { OrderStatus, TApiOrder } from \"../../api/endpoints/Order\";\nimport OrderPolicy from \"../../policies/OrderPolicy\";\nimport * as Api from \"../../api\";\nimport { NavLink as RouterNavLink } from 'react-router-dom';\n\n/**\n * Control for nav links\n */\nconst NavMenu: React.FC = () => {\n const user = useSelector(selectUser);\n const productCount = useSelector(state => Object.keys(state.basket.data).length);\n const [orders, setOrders] = useState | null>(null);\n const pendingOrdersCount = orders?.length ?? 0;\n\n useEffect(() => {\n if (OrderPolicy.canViewPendingOrders(user)) {\n Api.Order.list({ status: OrderStatus.SUBMITTED })\n .then(orders => {\n setOrders(orders);\n });\n }\n }, [user]);\n\n return (\n
\n \n\n {\n BasketPolicy.canAccess(user) &&\n \n }\n\n {\n user.type === UserType.Customer &&\n \n }\n\n {\n OrderPolicy.canViewPendingOrders(user) &&\n \n }\n\n {\n OrderPolicy.canViewCcpOrders(user) &&\n \n }\n\n {\n OrderPolicy.canViewPublicOrders(user) &&\n \n }\n\n {\n user.type !== UserType.Unknown &&\n \n }\n
\n );\n};\n\ntype INavLinkProps = {\n text: ReactNode;\n to: string;\n count?: number;\n className?: string;\n};\n\nconst NavLink = (props: INavLinkProps) => {\n const { className, text, to, count } = props;\n\n return (\n \n {text}\n {\n Boolean(count) &&\n {count}\n }\n \n );\n};\n\nexport default NavMenu;\n","import { ThunkDispatch } from \"redux-thunk\";\nimport { TApiParameter } from \"../../api/endpoints/Parameter\";\nimport * as Api from \"../../api\";\n\nexport const PARAMETERS_FETCH_COMPLETED = 'PARAMETERS_FETCH_COMPLETED';\n\nexport interface IFetchParametersCompletedAction {\n type: typeof PARAMETERS_FETCH_COMPLETED,\n data: Array\n}\n\nconst fetchParametersCompleted = (parameters: Array): IFetchParametersCompletedAction => ({\n type: PARAMETERS_FETCH_COMPLETED,\n data: parameters\n});\n\n\nconst fetchParameters = () => {\n return async (dispatch: ThunkDispatch<{}, {}, IFetchParametersCompletedAction>): Promise> => {\n try {\n const parameters = await Api.Parameter.list();\n\n dispatch(fetchParametersCompleted(parameters))\n\n return parameters;\n } catch (error) {\n throw error;\n }\n }\n}\n\nexport {\n fetchParameters\n};\n","import * as React from \"react\";\nimport \"../scss/styles.scss\";\nimport \"font-awesome/css/font-awesome.min.css\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { useMountEffect } from \"../hooks/useMountEffect\";\nimport { fetchData } from \"../store/action-creators/DataActionCreators\";\nimport { silentLogin } from \"../store/action-creators/UserActionCreators\";\nimport { ThunkDispatcher } from \"../store/actions/All\";\nimport { selectAnnouncements, selectHasLoaded } from \"../store/selectors/DataSelectors\";\nimport AnnouncementPanel from \"./Ui/AnnouncementPanel\";\nimport Col from \"./Common/Col\";\nimport Grid from \"./Common/Grid\";\nimport Row from \"./Common/Row\";\nimport Index from \"./NavMenu\";\nimport Router from \"../router\";\nimport { fetchParameters } from \"../store/action-creators/parameters\";\nimport LoadingIndicator from \"./Feedback/LoadingIndicator\";\n\nconst App = () => {\n useMountEffect(() => {\n dispatch(silentLogin);\n dispatch(fetchParameters());\n dispatch(fetchData);\n });\n\n const dispatch: ThunkDispatcher = useDispatch();\n\n const hasLoaded = useSelector(selectHasLoaded);\n\n const announcements = useSelector(selectAnnouncements);\n\n return <>\n
\n \n \n
\n {hasLoaded ? (\n <>\n
\n {\n announcements.map((a, i) => (\n \n \n \n \n \n ))\n }\n
\n \n \n ) : (\n \n )}\n
\n
\n
\n ;\n};\n\nexport default App;\n","import * as React from \"react\";\n\nexport const useMountEffect = (effect: React.EffectCallback) => {\n\tconst [isMounted, setIsMounted] = React.useState(false);\n\n\tReact.useEffect(() => {\n\t\tif (!isMounted) {\n\t\t\tsetIsMounted(true);\n\t\t\treturn effect();\n\t\t}\n\t}, [isMounted, effect]);\n};\n","import * as React from \"react\";\nimport { config } from \"../../../config\";\nimport Col from \"../../Common/Col\";\nimport Row from \"../../Common/Row\";\nimport PageTitle from \"../PageTitle\";\nimport { paths } from \"../../../router\";\nimport Alert from \"react-bootstrap/Alert\";\nimport Link from \"../../Navigation/Links/Link\";\nimport { MailLink } from \"../../Navigation/Links/ExternalLink\";\n\ntype State = {\n hasError: boolean;\n error?: any;\n};\n\n/**\n * This is an error boundary which shows errors thrown synchronously by React.\n */\nexport default class ErrorBoundary extends React.Component<{}, State> {\n constructor(props: {}) {\n super(props);\n this.state = { hasError: false };\n }\n\n public componentDidCatch(error: any, _info?: any) {\n this.setState({\n hasError: true,\n error\n });\n }\n\n public render() {\n if (this.state.hasError) {\n return (\n \n \n \n \n

Oh no! Something went wrong!

\n

\n {this.state.error.message} Please go to the home screen and try again, or contact\n ECMWF Service Desk for assistance.\n

\n \n this.setState({ hasError: false })}\n >\n Go home\n
\n \n \n \n \n );\n }\n\n return this.props.children;\n }\n}\n","/**\n * Extracts all the map entries as an array.\n */\nexport const entries = (map: Map) => {\n\tconst e: Array<[T, U]> = [];\n\tfor (const entry of map.entries()) {\n\t\te.push(entry);\n\t}\n\treturn e;\n};\n","import { entries } from \"./Map\";\n\n// A random string that shouldn't collide with anything else...\nconst mapFingerprint = \"OhC4K6m8lHkizASp3edl\";\n\n/**\n * Serialises a JS object into a custom format which preserves Maps.\n */\nexport const serialise = (data: any) =>\n\tJSON.stringify(data, (_key: string, value: any): any => {\n\t\tif (value instanceof Map) {\n\t\t\treturn {\n\t\t\t\tfingerprint: mapFingerprint,\n\t\t\t\tentries: entries(value)\n\t\t\t};\n\t\t}\n\t\treturn value;\n\t});\n\n/**\n * Deserialises a string from a custom serialisation format which preserves Maps.\n */\nexport const deserialise = (serial: string) =>\n\tJSON.parse(serial, (_key: string, value: any): any => {\n\t\tif (value && typeof value === \"object\" && value.fingerprint === mapFingerprint) {\n\t\t\treturn new Map(value.entries);\n\t\t}\n\t\treturn value;\n\t});\n\nexport const escape = (str: string, char: string, escapeChar: string): string => {\n\treturn str\n\t\t.replace(new RegExp(`\\\\${escapeChar}`, \"g\"), `${escapeChar}${escapeChar}`)\n\t\t.replace(new RegExp(`\\\\${char}`, \"g\"), `${escapeChar}${char}`);\n};\n\nexport const unescape = (str: string, char: string, escapeChar: string): string => {\n\treturn str\n\t\t.replace(new RegExp(`\\\\${escapeChar}\\\\${char}`, \"g\"), char)\n\t\t.replace(new RegExp(`\\\\${escapeChar}\\\\${escapeChar}`, \"g\"), escapeChar);\n};\n","import { PresetObj } from \"../../api-entities/PresetArea\";\nimport { Action } from \"../actions/All\";\nimport { ActionType } from \"../ActionTypes\";\nimport { Announcement } from \"../../entities/Announcement\";\n\nexport interface DataState {\n\tloadedAt?: number;\n\n\t/**\n\t * All preset areas, keyed by their name.\n\t */\n\tpresetArea: Map;\n\n\t/**\n\t * Short form terms and conditions for archive orders, in raw html.\n\t */\n\tarchiveTerms: string;\n\n\t/**\n\t * All current announcements. Refreshed more frequently than other state objects.\n\t */\n\tannouncements: Announcement[];\n}\n\n/**\n * The state of the data store on app start up.\n */\nexport const initial: DataState = {\n\tpresetArea: new Map(),\n\tarchiveTerms: \"\",\n\tannouncements: []\n};\n\n\nexport const dataReducer = (state: DataState = initial, action: Action): DataState => {\n\tswitch (action.type) {\n\t\tcase ActionType.SET_AREA: {\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tpresetArea: new Map(action.area.map(a => [a.name, a] as [string, PresetObj]))\n\t\t\t};\n\t\t}\n\n\n\t\tcase ActionType.SET_ARCHIVE_TERMS: {\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tarchiveTerms: action.terms\n\t\t\t};\n\t\t}\n\n\t\tcase ActionType.SET_ANNOUNCEMENTS: {\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tannouncements: action.announcements\n\t\t\t};\n\t\t}\n\n\t\tcase ActionType.DATA_LOADED: {\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tloadedAt: action.loadedAt\n\t\t\t};\n\t\t}\n\n\t\tdefault:\n\t\t\treturn state;\n\t}\n};\n","import { TApiFolder } from '../../api/endpoints/Folder';\nimport {\n FOLDERS_CREATE_COMPLETED,\n FOLDERS_FETCH_COMPLETED,\n FOLDERS_FETCH_FAILED,\n FOLDERS_FETCH_STARTED,\n ICreateFoldersCompletedAction,\n IFetchFoldersCompletedAction,\n IFetchFoldersFailedAction,\n IFetchFoldersStartedAction\n} from '../action-creators/folders';\n\nexport type TFoldersState = {\n loading: boolean;\n loadedAt: null | number;\n error: null | Error;\n data: Array\n};\n\nconst initialState = {\n loading: false,\n loadedAt: null,\n error: null,\n data: []\n};\n\ntype TAllowedActions =\n IFetchFoldersStartedAction |\n IFetchFoldersCompletedAction |\n IFetchFoldersFailedAction |\n ICreateFoldersCompletedAction\n\n\nconst foldersReducer = (state: TFoldersState = initialState, action: TAllowedActions): TFoldersState => {\n switch (action.type) {\n case FOLDERS_FETCH_STARTED:\n return {\n ...state,\n loading: true,\n error: null\n };\n\n case FOLDERS_FETCH_COMPLETED:\n return {\n ...state,\n loadedAt: Date.now(),\n loading: false,\n error: null,\n data: action.data\n };\n\n case FOLDERS_FETCH_FAILED:\n return {\n ...state,\n loading: false,\n error: action.error\n };\n\n case FOLDERS_CREATE_COMPLETED:\n return {\n ...state,\n data: [...state.data, action.data]\n }\n\n default:\n return state;\n }\n};\n\nexport default foldersReducer;\n","import { TApiOrder, TApiOrderDetails } from '../../api/endpoints/Order';\nimport {\n IApproveOrderCompletedAction,\n ICancelOrderCompletedAction,\n ICreateOrderCompletedAction,\n IFetchOrdersCompletedAction,\n IFetchOrdersFailedAction,\n IFetchOrdersStartedAction,\n IMoveOrderRoFolderCompletedAction,\n IRejectOrderCompletedAction,\n IRemoveOrderCompletedAction,\n ISubmitOrderCompletedAction,\n IUpdateOrderCompletedAction,\n ORDER_APPROVE_COMPLETED,\n ORDER_CANCEL_COMPLETED,\n ORDER_CREATE_COMPLETED,\n ORDER_REJECT_COMPLETED,\n ORDER_REMOVE_COMPLETED,\n ORDER_SUBMIT_COMPLETED,\n ORDER_UPDATE_COMPLETED,\n ORDERS_FETCH_COMPLETED,\n ORDERS_FETCH_FAILED,\n ORDERS_FETCH_STARTED,\n ORDERS_MOVE_COMPLETED\n} from '../action-creators/orders';\nimport { orderBy } from 'lodash';\nimport { Nullable } from '../../../types/utils';\n\nexport type TOrdersState = Record;\n\nexport type TOrdersSubState = {\n loading: boolean;\n loadedAt: null | number;\n error: null | Error;\n data: Array\n};\n\nconst initialState: TOrdersState = {\n};\n\nconst initialSubState = () => ({\n loading: false,\n loadedAt: null,\n error: null,\n data: []\n})\n\n\ntype TAllowedActions =\n ICreateOrderCompletedAction |\n IUpdateOrderCompletedAction |\n IFetchOrdersStartedAction |\n IFetchOrdersCompletedAction |\n IFetchOrdersFailedAction |\n ISubmitOrderCompletedAction |\n ICancelOrderCompletedAction |\n IApproveOrderCompletedAction |\n IRejectOrderCompletedAction |\n IMoveOrderRoFolderCompletedAction |\n IRemoveOrderCompletedAction\n\n\nconst parseOrder = (order: TApiOrder | TApiOrderDetails): TApiOrder => {\n return {\n id: order.id,\n ccp_organisation: order.ccp_organisation,\n organisation_id: order.organisation_id,\n category: order.category,\n status: order.status,\n customer: order.customer,\n name: order.name,\n description: order.description,\n has_legs: order.has_legs,\n created: order.created,\n updated: order.updated\n };\n}\n\nconst sortOrders = (orders: Array): Array => {\n return orderBy(\n orders,\n [order => new Date(order.updated).getTime()],\n ['desc']\n );\n}\n\nconst addOrder = (data: TOrdersSubState['data'], order: TApiOrder | TApiOrderDetails): Array => {\n return sortOrders([...data, parseOrder(order)]);\n}\n\nconst updateOrder = (data: TOrdersSubState['data'], order: TApiOrder | TApiOrderDetails) => {\n return data.map(item => {\n if (item.id === order.id) {\n return parseOrder(order);\n }\n\n return item;\n });\n};\n\nconst removeOrder = (data: TOrdersSubState['data'], orderId: number) => {\n return data.filter(item => item.id !== orderId);\n}\n\nconst moveOrder = (\n state: TOrdersState,\n order: TApiOrder,\n srcFolderId: Nullable,\n targetFolderId: Nullable\n) => {\n let newState = updateSubState(state, srcFolderId, subState => ({\n ...subState,\n data: removeOrder(subState.data, order.id)\n }));\n\n newState = updateSubState(newState, targetFolderId, subState => ({\n ...subState,\n data: addOrder(subState.data, order)\n }))\n\n return newState;\n}\n\nconst updateSubState = (state: TOrdersState, folderId: Nullable | undefined, callback: (subState: TOrdersSubState) => TOrdersSubState) => {\n const key = folderId ? folderId : -1;\n const currentSubState = state[key] || initialSubState();\n\n const updatedSubState = callback(currentSubState);\n\n return {\n ...state,\n [key]: updatedSubState\n };\n}\n\nconst ordersReducer = (state: TOrdersState = initialState, action: TAllowedActions): TOrdersState => {\n switch (action.type) {\n case ORDERS_FETCH_STARTED:\n return updateSubState(state, action.folderId, (subState) => ({\n ...subState,\n loading: true,\n error: null\n }));\n\n case ORDERS_FETCH_COMPLETED:\n return updateSubState(state, action.folderId, (subState) => ({\n ...subState,\n loadedAt: Date.now(),\n loading: false,\n error: null,\n data: action.data\n }));\n\n case ORDERS_FETCH_FAILED:\n return updateSubState(state, action.folderId, (subState) => ({\n ...subState,\n loading: false,\n error: action.error\n }));\n\n case ORDER_CREATE_COMPLETED:\n return updateSubState(state, action.folderId, (subState) => ({\n ...subState,\n data: addOrder(subState.data, action.order)\n }));\n\n case ORDER_UPDATE_COMPLETED:\n return updateSubState(state, action.folderId, (subState) => ({\n ...subState,\n data: updateOrder(subState.data, action.order)\n }));\n\n case ORDER_SUBMIT_COMPLETED:\n return updateSubState(state, action.folderId, (subState) => ({\n ...subState,\n data: updateOrder(subState.data, action.order)\n }));\n\n case ORDER_CANCEL_COMPLETED:\n return updateSubState(state, action.folderId, (subState) => ({\n ...subState,\n data: updateOrder(subState.data, action.order)\n }));\n\n case ORDER_APPROVE_COMPLETED:\n return updateSubState(state, action.folderId, (subState) => ({\n ...subState,\n data: updateOrder(subState.data, action.order)\n }));\n\n case ORDER_REJECT_COMPLETED:\n return updateSubState(state, action.folderId, (subState) => ({\n ...subState,\n data: updateOrder(subState.data, action.order)\n }));\n\n case ORDERS_MOVE_COMPLETED:\n return moveOrder(state, action.order, action.srcFolderId, action.targetFolderId);\n\n case ORDER_REMOVE_COMPLETED:\n return updateSubState(state, action.folderId, (subState) => ({\n ...subState,\n data: removeOrder(\n subState.data,\n typeof action.orderId === 'number' ? action.orderId : parseInt(action.orderId, 10))\n }))\n\n default:\n return state;\n }\n};\n\nexport default ordersReducer;\n","import { User, UserType } from \"../../entities/User\";\nimport { Action } from \"../actions/All\";\nimport { ActionType } from \"../ActionTypes\";\nimport { PresetObj } from \"../../api-entities/PresetArea\";\n\nexport interface UserStore {\n\t/**\n\t * The current user.\n\t */\n\tuser: User;\n\n\t/**\n\t * The current user's area presets.\n\t */\n\tareaPresets?: PresetObj[];\n\n\t/**\n\t * In dev mode all requests are sent with a token in the url query for authentication.\n\t * This isn't need for live where cookies are used instead.\n\t */\n\ttoken?: string;\n}\n\n/**\n * The state of the user store on app start up.\n */\nexport const initial: UserStore = {\n\tuser: {\n\t\ttype: UserType.Unknown\n\t}\n};\n\n\nexport const userReducer = (state: UserStore = initial, action: Action): UserStore => {\n\tswitch (action.type) {\n\t\tcase ActionType.LOG_OUT: {\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tuser: {\n\t\t\t\t\ttype: UserType.Unknown\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\n\t\tcase ActionType.LOG_IN: {\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tuser: action.user\n\t\t\t};\n\t\t}\n\n\t\tcase ActionType.SET_USER_TOKEN: {\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\ttoken: action.token\n\t\t\t};\n\t\t}\n\n\t\tcase ActionType.SET_USER_PRESET_AREAS: {\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tareaPresets: action.areas\n\t\t\t};\n\t\t}\n\n\t\tdefault:\n\t\t\treturn state;\n\t}\n};\n","import {\n ICreateOrderCompletedAction,\n IFetchOrderDetailsCompletedAction,\n IFetchOrderDetailsFailedAction,\n IFetchOrderDetailsStartedAction,\n IMoveOrderRoFolderCompletedAction,\n IUpdateOrderCompletedAction,\n ORDER_DETAILS_FETCH_STARTED,\n ORDER_DETAILS_FETCH_COMPLETED,\n ORDER_CREATE_COMPLETED,\n ORDER_UPDATE_COMPLETED,\n ORDER_REMOVE_COMPLETED,\n IRemoveOrderCompletedAction,\n ORDER_SUBMIT_COMPLETED,\n ISubmitOrderCompletedAction,\n ORDER_CANCEL_COMPLETED,\n ICancelOrderCompletedAction,\n ORDER_APPROVE_COMPLETED,\n IApproveOrderCompletedAction,\n ORDER_REJECT_COMPLETED,\n IRejectOrderCompletedAction, ORDER_RECALCULATE_COMPLETED, IRecalculateOrderCompletedAction\n} from \"../action-creators/orders\";\nimport { TApiOrderDetails } from \"../../api/endpoints/Order\";\n\nconst initialItemState = {\n loading: false,\n loadedAt: null,\n error: null,\n data: null\n};\n\nexport type TOrdersByIdState = {\n [id: string]: {\n loading: boolean;\n loadedAt: null | number;\n error: null | Error;\n data: TApiOrderDetails | null\n }\n};\n\ntype TAllowedActions =\n ICreateOrderCompletedAction |\n IUpdateOrderCompletedAction |\n IMoveOrderRoFolderCompletedAction |\n IFetchOrderDetailsStartedAction |\n IFetchOrderDetailsCompletedAction |\n IFetchOrderDetailsFailedAction |\n ISubmitOrderCompletedAction |\n ICancelOrderCompletedAction |\n IApproveOrderCompletedAction |\n IRejectOrderCompletedAction |\n IRemoveOrderCompletedAction |\n IRecalculateOrderCompletedAction\n\n\nconst updateOrder = (state: TOrdersByIdState, order: TApiOrderDetails): TOrdersByIdState => {\n return {\n ...state,\n [order.id]: {\n ...state[order.id],\n data: order,\n loading: false,\n loadedAt: Date.now(),\n error: null\n }\n };\n}\n\nconst removeOrder = (state: TOrdersByIdState, orderId: string | number): TOrdersByIdState => {\n return {\n ...state,\n [orderId]: { ...initialItemState }\n };\n}\n\n\nconst ordersByIdReducer = (state: TOrdersByIdState = {}, action: TAllowedActions): TOrdersByIdState => {\n switch (action.type) {\n case ORDER_DETAILS_FETCH_STARTED: {\n const newItemState = state[action.id] || { ...initialItemState }\n const silentUpdate = action.options;\n\n return {\n ...state,\n [action.id]: { ...newItemState, loading: !silentUpdate }\n }\n }\n\n case ORDER_DETAILS_FETCH_COMPLETED: {\n return updateOrder(state, action.data);\n }\n\n case ORDER_CREATE_COMPLETED: {\n return updateOrder(state, action.order);\n }\n\n case ORDER_UPDATE_COMPLETED: {\n return updateOrder(state, action.order);\n }\n\n case ORDER_SUBMIT_COMPLETED: {\n return updateOrder(state, action.order);\n }\n\n case ORDER_CANCEL_COMPLETED: {\n return updateOrder(state, action.order);\n }\n\n case ORDER_APPROVE_COMPLETED: {\n return updateOrder(state, action.order);\n }\n\n case ORDER_REJECT_COMPLETED: {\n return updateOrder(state, action.order);\n }\n\n case ORDER_REMOVE_COMPLETED: {\n return removeOrder(state, action.orderId);\n }\n\n case ORDER_RECALCULATE_COMPLETED: {\n return updateOrder(state, action.order);\n }\n\n default:\n return state;\n }\n}\n\nexport default ordersByIdReducer;\n","import { OrderCategory } from \"../../api/endpoints/Order\";\nimport {\n BASKET_CLEAR_COMPLETED,\n BASKET_PRODUCT_ADD_COMPLETED,\n BASKET_PRODUCT_REMOVE_COMPLETED,\n IBasketClearCompletedAction,\n IBasketProductAddCompletedAction,\n IBasketProductRemoveCompletedAction\n} from \"../action-creators/basket\";\nimport { omit } from \"lodash\";\nimport { TOrderProductData } from \"../../api/endpoints/OrderProduct\";\n\ntype TBasketState = {\n data: {\n [id: string]: TOrderProductData\n }\n};\n\ntype TAllowedActions =\n IBasketProductAddCompletedAction |\n IBasketProductRemoveCompletedAction |\n IBasketClearCompletedAction\n\nconst generateBasketProductId = () => Math.random().toString(36).substring(2);\n\nconst initialState = (): TBasketState => ({\n data: {}\n});\n\nconst basketReducer = (state: TBasketState = initialState(), action: TAllowedActions) => {\n switch (action.type) {\n case BASKET_PRODUCT_ADD_COMPLETED:\n return {\n ...state,\n data: {\n ...state.data,\n [generateBasketProductId()]: action.product\n }\n };\n\n case BASKET_PRODUCT_REMOVE_COMPLETED:\n return {\n ...state,\n data: omit(state.data, action.productId)\n };\n\n case BASKET_CLEAR_COMPLETED:\n return initialState();\n\n default:\n return state;\n }\n}\n\nexport default basketReducer;\n","import { TApiParameter } from \"../../api/endpoints/Parameter\";\nimport { IFetchParametersCompletedAction, PARAMETERS_FETCH_COMPLETED } from \"../action-creators/parameters\";\n\ntype TParametersState = {\n loading: boolean;\n loadedAt: null | number;\n error: null | Error;\n data: {\n [shortname: string]: TApiParameter\n }\n}\n\nconst initialState = {\n loading: false,\n loadedAt: null,\n error: null,\n data: {}\n};\n\ntype TAllowedActions = IFetchParametersCompletedAction;\n\nconst transformByShortname = (params: Array): TParametersState['data'] => {\n return params.reduce((acc, param) => {\n acc[param.shortname] = param;\n\n return acc;\n }, {} as TParametersState['data'])\n}\n\nconst parametersReducer = (state: TParametersState = initialState, action: TAllowedActions) => {\n switch (action.type) {\n case PARAMETERS_FETCH_COMPLETED:\n return {\n ...state,\n loading: false,\n loadedAt: Date.now(),\n error: null,\n data: transformByShortname(action.data)\n }\n\n\n default:\n return state;\n }\n}\n\nexport default parametersReducer;\n","import { IFetchSubsetOptionsCompletedAction, SUBSET_OPTION_FETCH_COMPLETED } from \"../action-creators/subset-options\";\nimport { TApiSubsetOptions } from \"../../api/endpoints/SubsetOption\";\n\n// const initialItemState = {\n// loading: false,\n// loadedAt: null,\n// error: null,\n// data: null\n// };\n\nexport type TOptionsBySubsetIdState = {\n [id: string]: {\n loading: boolean;\n loadedAt: null | number;\n error: null | Error;\n data: TApiSubsetOptions | null\n }\n};\n\ntype TAllowedActions = IFetchSubsetOptionsCompletedAction;\n\nconst updateOptions = (state: TOptionsBySubsetIdState, subsetId: number, options: TApiSubsetOptions) => {\n return {\n ...state,\n [subsetId]: {\n ...state[subsetId],\n data: options,\n loading: false,\n loadedAt: Date.now(),\n error: null\n }\n }\n}\n\nconst optionsBySubsetId = (state: TOptionsBySubsetIdState = {}, action: TAllowedActions) => {\n switch (action.type) {\n case SUBSET_OPTION_FETCH_COMPLETED:\n return updateOptions(state, action.subsetId, action.options);\n\n default:\n return state;\n }\n}\n\nexport default optionsBySubsetId;\n","import { TApiSet } from \"../../api/endpoints/Set\";\nimport {\n IFetchSetsCompletedAction,\n IFetchSetsFailedAction,\n IFetchSetsStartedAction,\n SETS_FETCH_COMPLETED,\n SETS_FETCH_FAILED,\n SETS_FETCH_STARTED\n} from \"../action-creators/sets\";\n\nexport type TSetsState = {\n loading: boolean;\n loadedAt: null | number;\n error: null | Error;\n data: Array\n};\n\nconst initialSubState = () => ({\n loading: false,\n loadedAt: null,\n error: null,\n data: []\n});\n\ntype TAllowedActions = IFetchSetsStartedAction | IFetchSetsCompletedAction | IFetchSetsFailedAction;\n\nconst setsReducer = (state: TSetsState = initialSubState(), action: TAllowedActions) => {\n switch (action.type) {\n case SETS_FETCH_STARTED:\n return {\n ...state,\n loading: true,\n error: null\n };\n\n case SETS_FETCH_COMPLETED:\n return {\n ...state,\n loadedAt: Date.now(),\n loading: false,\n error: null,\n data: action.data\n };\n\n case SETS_FETCH_FAILED:\n return {\n ...state,\n loadedAt: Date.now(),\n loading: false,\n error: action.error,\n };\n\n default:\n return state;\n }\n}\n\nexport default setsReducer;\n","import { combineReducers } from 'redux';\nimport { createTransform, PersistConfig, persistReducer } from 'redux-persist';\nimport storage from 'redux-persist/lib/storage';\nimport { deserialise, serialise } from '../../utils/Serialiser';\nimport { dataReducer } from './DataReducer';\nimport foldersReducer from './folders';\nimport ordersReducer from './orders';\nimport { userReducer } from './UserReducer';\nimport ordersByIdReducer from \"./ordersById\";\nimport basketReducer from \"./basket\";\nimport parametersReducer from \"./parameters\";\nimport optionsBySubsetId from './optionsBySubsetId';\nimport setsReducer from \"./sets\";\n\n/**\n * redux-persist serialises the store with JSON, which doesn't support maps.\n * Hence we use custom serialisation here which supports basic maps\n * (i.e. those without object keys)\n */\nconst mapTransformer = createTransform(\n inboundState => serialise(inboundState),\n outboundState => deserialise(outboundState),\n {}\n);\n\nconst basketPersistConfig: PersistConfig = {\n key: 'shopping-cart::basket',\n storage,\n transforms: [mapTransformer]\n}\n\nconst reducers = {\n basket: persistReducer(basketPersistConfig, basketReducer),\n folders: foldersReducer,\n orders: ordersReducer,\n ordersById: ordersByIdReducer,\n parameters: parametersReducer,\n sets: setsReducer,\n subsetOptionsBySubsetId: optionsBySubsetId,\n data: dataReducer,\n user: userReducer\n};\n\n/**\n * The root reducer for the whole store.\n * It is configured to be used with redux-persist.\n */\nexport const rootReducer = combineReducers(reducers);\nexport type TRootState = ReturnType;\n","import * as React from 'react';\nimport * as ReactDOM from 'react-dom';\nimport thunk from 'redux-thunk'\nimport { Provider } from 'react-redux';\nimport { applyMiddleware, createStore } from 'redux';\nimport { persistStore } from 'redux-persist';\nimport { PersistGate } from 'redux-persist/integration/react';\nimport App from './components/App';\nimport ErrorBoundary from './components/Ui/ErrorBoundary';\nimport { rootReducer } from './store/reducers/RootReducer';\nimport { BrowserRouter } from 'react-router-dom';\nimport { composeWithDevTools } from 'redux-devtools-extension';\nimport { config } from './config';\n\n\nexport const store = createStore(\n rootReducer,\n composeWithDevTools(\n applyMiddleware(thunk)\n )\n);\n\nconst persistor = persistStore(store);\n\nconst Root = () => {\n return (\n \n \n \n );\n};\n\nReactDOM.render(\n \n \n \n \n \n \n ,\n document.getElementById('root')\n);\n","import { Nullable } from \"../../types/utils\";\nimport { User as User_API } from \"../api-entities/User\";\n\nexport type User = {\n type: UserType.Customer;\n details: UserDetails;\n} | {\n type: UserType.Admin;\n details: UserDetails;\n} | {\n type: UserType.CCP;\n details: UserDetails;\n} | {\n type: UserType.Unknown;\n};\n\nexport type UserDetails = {\n name: string;\n userName: string;\n email: string;\n phone?: string;\n ccp?: number;\n organisationId?: number;\n organisationName?: string;\n organisationAddress?: string;\n countryCode: string;\n ecmwfCanLicence: boolean;\n ecmwfCanLicenceArchive: boolean;\n freeze: {\n message: Nullable;\n enabled: boolean;\n }\n};\n\nexport type UserWithDetails = User & { details: UserDetails };\n\n/**\n * Construct a new user from its APi representation.\n */\nexport const makeUser = (user: User_API): User => {\n const type = getUserType(user.type);\n\n return {\n type,\n details: {\n name: user.name,\n userName: user.user_name,\n email: user.email,\n phone: user.phone,\n type: getUserType(user.type),\n organisationId: user.organisation_id,\n organisationName: user.organisation_name,\n organisationAddress: user.registered_address,\n countryCode: user.country_code,\n ecmwfCanLicence: user.ecmwf_can_licence,\n ecmwfCanLicenceArchive: user.ecmwf_can_licence_archive,\n freeze: user.freeze\n }\n } as User;\n};\n\nexport enum UserType {\n Admin = 1,\n Customer = 2,\n CCP = 3,\n Unknown = 4\n}\n\nexport const getUserType = (type: string) => {\n switch (type.toLowerCase()) {\n case \"public\":\n return UserType.Customer;\n case \"admin\":\n return UserType.Admin;\n case \"ccp\":\n return UserType.CCP;\n }\n\n throw new Error(\"We couldn't identify what type of user you are\");\n};\n\nexport const userHasCcpRole = (user: User): user is UserWithDetails =>\n user.type === UserType.CCP || user.type === UserType.Admin;\n\nexport const userHasAdminRole = (user: User): user is UserWithDetails =>\n user.type === UserType.Admin;\n","import axios from 'axios';\nimport { config } from '../config';\nimport { store } from '../index';\n\nconst DEFAULT_TIMEOUT = 60 * 1000;\n\nconst client = axios.create({\n baseURL: config.apiUrl,\n timeout: DEFAULT_TIMEOUT,\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json'\n },\n withCredentials: true,\n});\n\nconst getUserType = () => {\n return store.getState().user.user.type;\n}\n\nclient.interceptors.request.use((clientConfig) => {\n if (config.tokensEnabled) {\n clientConfig.params = clientConfig.params || {};\n clientConfig.params['token'] = config.tokens.get(getUserType());\n }\n\n return clientConfig;\n}, (error: Error) => {\n return Promise.reject(error);\n})\n\nexport default client;\n","import ReactPDF, { Image, Text, View } from \"@react-pdf/renderer\";\nimport React from \"react\";\nimport { OrderStatus, TApiOrderDetails } from \"../../../api/endpoints/Order\";\nimport OrderStatusLabel from \"../../../constants/OrderStatusLabel\";\nimport logo from '../../../images/ecmwf-logo.png'\n\ninterface IProps {\n order: TApiOrderDetails;\n styles: ReactPDF.Styles;\n}\n\nconst imageToBuffer = (image: string) => {\n const base64result = image.split(',')[1];\n\n return Buffer.from(base64result, 'base64');\n}\n\nconst OrderPDFHeader = (props: IProps) => {\n const { order, styles } = props;\n\n const statusText = OrderStatusLabel.get(order.status);\n\n const statusClass = Object.fromEntries([\n [OrderStatus.ACCEPTED, styles.accepted],\n [OrderStatus.COMPLETED, styles.accepted],\n [OrderStatus.SUBMITTED, styles.pending],\n [OrderStatus.DRAFT, styles.pending],\n [OrderStatus.REJECTED, styles.cancelled],\n [OrderStatus.CANCELLED, styles.cancelled]\n ]);\n\n return (\n \n \n \n \n\n \n {statusText}\n \n \n );\n};\n\nexport default OrderPDFHeader;\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAAUCAYAAABcbhl9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAACrgAAAq4BbewyGgAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAoJSURBVGiB7Zp5bFzVFcZ/577nJHY8Y8ch7EsRVQUtlM3MGGOSmLVFUFEQFFS1pUAhIWNjSoFClzSBtoDaYjxmVaERqkiAErpEAlEgK8EzcVnKUnYIKZAASewZxzjxvHv6xyx+Hr/npQmqKvFJI717z7nnfPfde889974RVaUccu5DTnT9xm8DDQqHAYcCCnwA2mVEHkTMJ556x6JyrEAjEAVeAJ4HWZ1JJf48wvDn+Mwh5QNaHes40YjcCnxlJ22vNcjlPalEd5hCbbzzQE9sfEJWnUlPZZ+e85G/SpoXuDUDu33VWu8ogaMV2U9V3wR5TY1d2td1+aZyM9Wx5ElidLdhldZ5MZue93KY62j8ttNVvOphdHKyDpeDPLQOQNQMBE3m6sbOw8Ta0jvt69u6VF+av8OvU9WQ3NdBm4plD1njWo5Uo1ND30cZXH+hJt5xhxGZM97GY6DRoumaeMfC3lTrL4IUrOosQf4wEaNqc81AaUAjx7YfErXT77fYI0AoTk8RKTQwv4k2dHRMqXR/+dHyy/qK7YzIDSjDJpOKfRw4Nchvdez2PY3Yv4iK8dd7jswVa2Mi8v2CFY3Gb5uRSc3b7Nczni4EObPEe2rdTGC1X8dR/Z4gNxTLFaJfUpGkqBww1nsp+Sk5iHX+TNllg1mEKDI/Gu+8aBfbBSAaS/5ArPMPRY8IJQBVqPz4037vYWle4IbpFXRPiByVnBEoE3smvvc1XGaeGGbG6HHD5QsMMMtfpzq8XNA83ldY39vV+sZofIPgAtTEk+eLsHCijccPvSMS73wnm0o8NYbi6yBbR1NwkAxAzTHJGIa7ACkJhTTKGoF3VOUwRL8DVOZFnFLdP/13QOso5l0q5GzgzpFdsGchMrIF4In3pFGjJS5Wm4C/FuVV9XWHA9P8bYxhFlBajXLuQ04kn4sU8fcAVwMgL4zCH1cEicT41Sg6g8Bq0H6Qk4HJZXILPA1sBk4CqhmJCkFvAo4ZjQzINeNNptRwC/7BVLk2k0rc6NepjbXfZHFWI+wNIOglM5pu/snHa67OhjJQ/RZlA1rTeEudiNsc1qav6/JN0VjyJYTDClXDVqgjnFDexiqNUn93hXZfMghQs+Gjwy1ESt1RDRrQ9ZlUoiGMB4CJxJJNwBeChILeWSHslkm1nJhJtZ7hepP3QPQ6n8pdVp19MqmWmZlUyzez27ZMV5gDjEydoT5ybPsho5EZLyKx5FkMn833ZtLDBxOgJ932NqIJX9XkgcGqrwWY/LT0JMycWt++l1+oOfcbDOUbvYGkZNiKqpfmRVN8shGTQaAq4gzWl3yo+sOtFXGeDPQzBgzw3RCCj2YO2CuxuaslU6za0n1Jb6ar9dfAvcDabNWWRF/6so0lUi/N35FNtdylys8DTaoJ9jVRiMz2F616yTDVrDdlmYqeX/qhrweorWRooIxrnHOG++MsX+nhQEpW/PvopEh/9hjIh1JgZlGg8HhJS7W0j6q1/gF9rjypGi9cPPmt6458IdYx22o3vL/fjKabN5eHqKyTS1RCnS6fnwsymk233DDtyPZOW6lGvUmCNyA6eapxjA6ORkbROdF4MmgFFWCWZVLzlhnRQ3ynrY/70m3Ph9rMh7Qlo/kFtqO6lEKmqsJ5QAfAjKabI1B5SomBmCVW7YXlBip3DKzqnzJ5EKgAQLQJWB3d8EG9YgqhVN42Yv+oKqfk/ehsIB9ZxJcQSWC4BaQ6Gu88M1CidqA33fqYi6Mrcmr2GKGRA3DI2aq5lO0puvaKT4H3g53msfW5tp7R5IGkQo4MQ3JvI7BMlYN91e9N1E8QjHEWW7WFowcNdfUd+2/pbn1vYEfVaSJazBveku2D65jkjGi/8YUfbYvGO58Bza9GNU0A6jnNSGH2ia4atO4KV7xCfzhOmhe4kb7agzBm96ItVRMyoLoP8EigRGQTsGdgGv5/gKjvuX9XGOzdf/enGDrfSs7lXAAjerZP7YHRbKjiC7vaKIIodighsqzsT1+2AXinUFMd7as7CjO0OhX6+7bo0/9tP1w8me263qRygXXMNrGe5zo7RsRyabylshLq+tdeEbpKpx3ZXhsUcntWzw09loiyEPSZcLbum3lFXkWJFWr3H6V/44Y+eI5XE0s+pMK8fIWcJ82LOiNwWlHHOrJk5Nocgog8AVo8/tXWxDuO8lRKGa/BW1XgvxLlQAA1zAI5tGQDVukbLdtDXPQQOqm0F8DF0Stzai4eIfd4NLv/Pmfog+d45aKI53YCB0vzgllB+2gklvypTHKuxwOw4ExCcoNY0RuBa0PIoiLPZVItj4XJfXgFSgO679T69r22dbd9GKQYOe7O3SU3+DKFvU1VF2XTrW2B/lUWIzqvUDw6si07D6F47fZK39rEi9OObK8NI5U9YPd0ZP3GDIUI4ik/FKgqiP/dk257u+BoBcgFhfpZwJd9LELCLQCbMqmWUS9/DHBfoET5enT9h53TG5Kl8FZXf3dNtKHjWuBCoDHSX9dZHbt9z6JcDl0wKRJPXhp2SaFig31NEKL6rK/ouMYJ7aTkBi8GdgNqgBojJh2mm+1OrAXWDzUeOviryliJFYXJv3youZxXkuUz6TxhY1f6mp0I+dUKYJ2w/XN8MNl0yxrg3UCCyJxB5ZNoPPlkNN7xt5yzfRMq/kuIS41470fjyVXRePKRyNS6zZJPoIKuVLqzz7T9a2fIFlHtTblHYEOJp3BlbUPylHI9aV40RfLn4hJyFawIs6uKgvpDWuksaYwdc0ABBP8+OnRVKKKris9bn2l7V4eSuSk+/Y19axMvjsdPGFxVtCbOdQr3h+hUACcEj1GJ9PFhwgIGFblmbDr2okisY/boOvJItrtlZSTWeZWIFl/yVKssizQk70BljQPvqHJwRLhOYb9iS4XObWsSH4zKQO1iI87V/jpVns2kxnevqp48gRNwr+Kpf1UisILyOwDRJ9hJuAC9qZbFkVjnF0X0M7rPlbnjuMcF5PSQ69IhDeFdYGU2nXggGu84GaR48V8hSitoq4Wg+fdSX1XkqrEY9KXbno82JF/FdzQSGfMcW0KmO/FqNN75fuGIUcSmzLrLXxveEVaiwwdUVHYq3IIvJGTTiesFHXkpvXNQQRdkUol7drFdADKp1otV9Hzy2V8oRHjAq5BTdfkFA+Oxq7DYX3Q9HfW4EoBhK01gVbmCybGyvC5XIbtmhRbRm2qdWx3r+NOu/cDdEvqBW5RXLHrrRIyqynP+crardUlVQ3KNYzlDkCMwegTK3sDrCq8gujTT1bq83I6ILrFWu/LPZti+5Yp3X86a/Adrw6Yt3a2ly4ueSt1enRviLOg/R3bM/l7t0CSzyLJylZ7ulreiDR03qs1/DULM1qDtQIV7sVriEvpiiq4n8BeUzaKyDiGtYtehjif5fxs0aP5DcYTP/4LyP8d/AN1M8YQpNxiAAAAAAElFTkSuQmCC\"","import { UserType } from \"./entities/User\";\n\nconst fetchEnvSetting = (setting: string, required: boolean = false): string | undefined => {\n const value = process.env[setting];\n\n if (required && !value) {\n throw new Error(`Missing config variable: ${setting}`);\n }\n\n return value;\n}\n\nconst nodeEnv = fetchEnvSetting('NODE_ENV', true)!;\nconst apiUrl = fetchEnvSetting('REACT_APP_API_URL', true)!;\nconst loginUrl = fetchEnvSetting('REACT_APP_LOGIN_URL', true)!;\nconst mountPath = fetchEnvSetting('REACT_APP_MOUNT_PATH', true)!;\nconst tokensEnabled = fetchEnvSetting('REACT_APP_TOKENS_ENABLED') !== 'false';\nconst archiveTermsAndConditionsUrl = 'https://www.ecmwf.int/sites/default/files/licence_agreement_for_ECMWF%20archive_products.pdf';\nconst dataCacheTtlMs = 60 * 60 * 1000; // 1 hour caching for global data\nconst serviceDeskEmail = 'servicedesk@ecmwf.int';\n\nconst tokenCustomer = fetchEnvSetting('REACT_APP_TOKEN_CUSTOMER');\nconst tokenCCP = fetchEnvSetting('REACT_APP_TOKEN_CCP');\nconst tokenAdmin = fetchEnvSetting('REACT_APP_TOKEN_ADMIN');\n\nconst tokens = new Map([\n [UserType.Customer, tokenCustomer],\n [UserType.Admin, tokenAdmin],\n [UserType.CCP, tokenCCP]\n])\n\nexport const config = Object.freeze({\n nodeEnv,\n apiUrl,\n loginUrl,\n mountPath,\n archiveTermsAndConditionsUrl,\n dataCacheTtlMs,\n serviceDeskEmail,\n tokensEnabled,\n tokens\n});\n","import { mapValues, pick } from 'lodash';\nimport { Nullable } from \"../../../types/utils\";\nimport client from \"../client\"\nimport { TPaginatedCollectionResponse, TParamsWithPagination } from '../helpers/types';\nimport { parseValidationError } from '../responseHandlers';\nimport { TOrderProductData } from \"./OrderProduct\";\n\nexport enum OrderStatus {\n DRAFT = \"draft\",\n SUBMITTED = \"submitted\",\n ACCEPTED = \"accepted\",\n REJECTED = \"rejected\",\n COMPLETED = \"completed\",\n CANCELLED = \"cancelled\"\n}\n\nexport enum OrderCategory {\n WEB = 'web',\n REALTIME = 'realtime',\n ARCHIVE = 'archive',\n EU_CUTOUT = 'european_cutout'\n}\n\nexport type TApiOrder = {\n id: number;\n ccp_organisation: number | null;\n organisation_id: number | null;\n category: C;\n status: OrderStatus,\n customer: string;\n name: string;\n description: string;\n has_legs: boolean;\n created: string;\n updated: string;\n}\n\nexport type QuoteProductLeg = {\n step?: Array;\n grid?: string;\n};\n\nexport type TProductCost = {\n volume: number;\n mars_requests: Array;\n epu: number;\n field_count: number\n}\n\nexport interface IEuCutOutProduct {\n param: Array<{\n value: string;\n subset_id: number;\n }>,\n high_frequency: boolean;\n}\n\nexport interface TOrderCostV1 {\n version: 'v1';\n data: {\n total_cost?: {\n hf_information_cost: Nullable,\n handling_cost: number;\n total_cost: number;\n epu: Nullable;\n volume: Nullable;\n discount_epu: Nullable;\n information_cost: Nullable;\n max_charge: boolean;\n },\n per_product?: Array;\n error?: TOrderCostError;\n }\n}\n\nexport type TOrderCostError = {\n message: string;\n traceback: string;\n type: string;\n}\n\nexport interface TOrderCostV2 {\n version: 'v2';\n data: {\n ecquote_version: Nullable;\n total_cost?: {\n epu: number;\n field_count: number;\n volume: number;\n information_cost: number;\n information_cost_after_discount: number;\n information_cost_hf?: number;\n information_cost_standard?: number;\n service_charge: number;\n service_charge_after_discount: number;\n total_cost: number;\n max_charge: boolean;\n },\n per_product?: Array;\n error?: TOrderCostError;\n }\n}\n\nexport interface TOrderCostV3 extends Omit {\n version: 'v3'\n}\n\nexport interface TOrderCostV4 extends Omit {\n version: 'v4'\n}\n\nexport interface TOrderCostV5 extends Omit {\n version: 'v5'\n}\n\nexport type TOrderCost = TOrderCostV1 | TOrderCostV2 | TOrderCostV3 | TOrderCostV4 | TOrderCostV5;\n\nexport type TApiOrderDetails = TApiOrder & {\n email: string;\n status_note: string;\n start_date: Nullable;\n small_business: Nullable;\n research: Nullable;\n volume_band_id: Nullable;\n service_package_id: Nullable;\n data_deliverer_organisation_id: Nullable;\n cost: TOrderCost,\n}\n\nexport interface OrderCostingVersion {\n version: TOrderCost['version'];\n title: string;\n description: string;\n epu: number;\n service_charge_model_id: number;\n latest: boolean;\n supported: boolean;\n ecquote_version: Nullable;\n}\n\nexport type TOrderCreateParams = {\n name: string;\n description?: string;\n category: OrderCategory.WEB;\n folder_id?: Nullable;\n small_business?: Nullable;\n research?: Nullable;\n start_date: string;\n} | {\n name: string;\n description?: string;\n category: OrderCategory.ARCHIVE\n folder_id?: Nullable;\n small_business?: Nullable;\n research?: Nullable;\n start_date: string;\n} | {\n name: string;\n description?: string;\n category: OrderCategory.REALTIME;\n products: Array>;\n folder_id?: Nullable;\n small_business?: Nullable;\n research?: Nullable;\n start_date: string;\n} | {\n name: string;\n description?: string;\n category: OrderCategory.EU_CUTOUT,\n products: Array>;\n folder_id?: Nullable;\n small_business?: Nullable;\n research?: Nullable;\n start_date: string;\n}\n\nexport type TOrderSubmitParams = {\n status_note: string;\n ccp_organisation: number;\n small_business: boolean;\n research: boolean;\n service_package_id?: number;\n data_deliverer_organisation_id: number;\n}\n\nexport interface TOrderListParams {\n organisation_id?: number;\n status?: string;\n category?: string;\n search?: string\n folder_id?: Nullable;\n}\n\nexport type TOrderUpdateParams = Partial;\n\ntype TOrderIdParam = string | number;\n\nconst allowedParams = (params: TOrderUpdateParams): TOrderUpdateParams => {\n return pick(\n params,\n 'name', 'description', 'category', 'products', 'folder_id', 'small_business', 'start_date', 'research'\n );\n}\n\nconst convertNullToString = (value: any) => {\n if (value === null) {\n return 'null';\n }\n\n return value;\n}\n\nconst create = (params: TOrderCreateParams): Promise =>\n client.post('/order/', allowedParams(params)).then(response => response.data);\n\nconst update = (id: TOrderIdParam, params: TOrderCreateParams): Promise =>\n client.put(`/order/${id}/`, allowedParams(params)).then(response => response.data);\n\nconst patch = (id: TOrderIdParam, params: TOrderUpdateParams): Promise =>\n client.patch(`/order/${id}/`, allowedParams(params))\n .then(response => response.data)\n .catch(parseValidationError);\n\nconst list = >(params?: T):\n Promise> =>\n client.get('/order/', { params: mapValues(params, convertNullToString) }).then(response => response.data);\n\nconst listCCPOrders = >(params?: T):\n Promise> =>\n client.get('/ccp-order/', { params }).then(response => response.data);\n\nconst listPublicOrders = >(params?: T):\n Promise> =>\n client.get('/public-order/', { params }).then(response => response.data);\n\nconst fetch = (id: TOrderIdParam): Promise =>\n client.get(`/order/${id}/`).then(response => response.data);\n\nconst remove = (id: TOrderIdParam) => client.delete(`order/${id}/`);\n\nconst submit = (id: TOrderIdParam, params: TOrderSubmitParams): Promise =>\n client.post(`order/${id}/submit/`, params).then(response => response.data);\n\nconst cancel = (id: TOrderIdParam): Promise =>\n client.post(`order/${id}/cancel/`).then(response => response.data);\n\nconst approve = (id: TOrderIdParam): Promise =>\n client.post(`order/${id}/accept/`).then(response => response.data);\n\nconst reject = (id: TOrderIdParam, reason: string): Promise =>\n client.post(`order/${id}/reject/`).then(response => response.data);\n\nconst recalculate = (id: TOrderIdParam): Promise =>\n client.put(`order/${id}/recalculate/`).then(response => response.data).then(order => {\n return order;\n });\n\nconst setCostingVersion = (id: TOrderIdParam, version: TOrderCost['version']): Promise =>\n client.put(`order/${id}/set-costing-version/`, { version }).then(response => response.data);\n\nconst costingVersions = (id: TOrderIdParam): Promise> => {\n return client.get(`order/${id}/costing-versions/`).then(response => response.data);\n}\n\nconst moveToFolder = (id: TOrderIdParam, folderId: number | null): Promise =>\n client.put(`/order/${id}/move/`, {\n folder_id: folderId\n }).then(response => response.data);\n\nconst duplicate = (id: TOrderIdParam, folderId?: Nullable): Promise =>\n client.put(`/order/${id}/duplicate/`, {\n folder_id: folderId\n }).then(response => response.data);\n\nconst fetchDisseminationRequest = (id: TOrderIdParam) =>\n client.get(`order/${id}/diss/`, {\n headers: {\n 'Content-Type': 'text/plain'\n }\n }).then(response => response.data)\n\nexport {\n create,\n update,\n patch,\n fetch,\n remove,\n cancel,\n approve,\n reject,\n recalculate,\n costingVersions,\n setCostingVersion,\n moveToFolder,\n duplicate,\n list,\n listCCPOrders,\n listPublicOrders,\n submit,\n fetchDisseminationRequest\n}\n"],"sourceRoot":""}